diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 000000000..ddd04a7d3 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,28 @@ +# Coverage.py configuration +# https://coverage.readthedocs.io/en/latest/config.html + +[run] +data_file = .coverage-data +disable_warnings = + module-not-imported + no-data-collected +parallel = True + +[report] +exclude_lines = + @overload + def __repr__ + if __name__ == .__main__.: + if TYPE_CHECKING: + pragma: no cover + raise AssertionError + raise NotImplementedError +omit = + */tests/* + test_*.py + *_test.py +skip_empty = True +show_missing = True + +[xml] +output = coverage.xml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..469e871fd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +# Exclude large and unnecessary files from the Docker build context. +# Used when building Orin/Thor/Spark images with the repo root as build context. +checkpoints/ +demo_data/ +*.safetensors +*.bin +*.onnx +*.trt +.git/ +.venv/ +__pycache__/ +*.pyc +*.egg-info/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +logs/ +dist/ +gr00t_trt_deployment/ diff --git a/.gitattributes b/.gitattributes index 113adb84a..31c9a5681 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,8 @@ media/*.gif filter=lfs diff=lfs merge=lfs -text demo_data/**/*.mp4 filter=lfs diff=lfs merge=lfs -text demo_data/**/*.parquet filter=lfs diff=lfs merge=lfs -text +examples/GR00TWholeBodyControl/media/**/*.mp4 filter=lfs diff=lfs merge=lfs -text +scripts/deployment/dgpu/wheels/*.whl filter=lfs diff=lfs merge=lfs -text +scripts/deployment/spark/wheels/*.whl filter=lfs diff=lfs merge=lfs -text +scripts/deployment/jetson/wheels/*.whl filter=lfs diff=lfs merge=lfs -text +examples/RoboLab/media/**/*.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml deleted file mode 100644 index 079a30421..000000000 --- a/.github/workflows/docker-build.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Build and Push Gr00t Images - -on: - push: - branches: - - main-positronic - -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Free disk space - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /usr/local/lib/android - sudo rm -rf /opt/ghc - sudo rm -rf "${AGENT_TOOLSDIRECTORY:-/opt/hostedtoolcache}/CodeQL" - sudo rm -rf "${AGENT_TOOLSDIRECTORY:-/opt/hostedtoolcache}/node" - sudo rm -rf "${AGENT_TOOLSDIRECTORY:-/opt/hostedtoolcache}/go" - sudo rm -rf /usr/lib/jvm - sudo docker system prune -af || true - df -h - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and Push - working-directory: docker - run: | - make push diff --git a/.gitignore b/.gitignore index 64c7ce9f9..af484b145 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Test debug artifacts +/debug_video_decoding/ + # Finetune datasets /examples/GR00T-WholeBodyControl/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim/ /examples/LIBERO/libero_10_no_noops_1.0.0_lerobot/ @@ -101,7 +104,6 @@ __pypackages__/ .cursor/ .cursor* .claude/ -CLAUDE.md # Sphinx docs docs/_build/ @@ -156,9 +158,9 @@ third_parties/ dump.rdb # Docker -.dockerignore +# Note: docker/.dockerignore is tracked — it controls the Docker build context -# SysID / robotics experiment data +/examples/GR00TWholeBodyControl/media/ sysid_data/ isaac_data/ offline_open_loop_eval_plots/ diff --git a/.gitmodules b/.gitmodules index 7a97b548c..30c6ff65f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,6 +10,3 @@ [submodule "external_dependencies/robocasa"] path = external_dependencies/robocasa url = https://github.com/squarefk/robocasa -[submodule "external_dependencies/GR00T-WholeBodyControl"] - path = external_dependencies/GR00T-WholeBodyControl - url = https://github.com/NVlabs/GR00T-WholeBodyControl.git \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..edec75f93 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,25 @@ +exclude: ^(external_dependencies/) +repos: + # Ruff: lint + autofix + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.12.7 + hooks: + - id: ruff + args: [--fix] + - id: ruff-format + + # Catch cross-platform pyproject pin drift (dGPU/Orin/Spark/Thor) at commit + # time; a missed mirror otherwise only surfaces at install on the unsynced + # platform. tomli is the 3.10 backport of stdlib tomllib (3.11+). + - repo: local + hooks: + - id: check-manifest-alignment + name: cross-platform pyproject manifest alignment + entry: python tools/check_manifest_alignment.py + language: python + additional_dependencies: ["tomli; python_version < '3.11'"] + # Mirrors MANIFESTS in tools/check_manifest_alignment.py; keep in sync when + # adding a platform. A miss only drops the local trigger — the unit-test + # live gate reads MANIFESTS directly and still fails CI on drift. + files: ^(pyproject\.toml|scripts/deployment/(orin|spark|thor)/pyproject\.toml|tools/(check_manifest_alignment\.py|manifest_alignment\.toml))$ + pass_filenames: false diff --git a/AGENTS.md b/AGENTS.md new file mode 120000 index 000000000..681311eb9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1 @@ +CLAUDE.md \ No newline at end of file diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md new file mode 100644 index 000000000..00ebc5710 --- /dev/null +++ b/ATTRIBUTIONS.md @@ -0,0 +1,17905 @@ +GitPython +3.1.50 +BSD-3-Clause +https://github.com/gitpython-developers/GitPython +Copyright (C) 2008, 2009 Michael Trier and contributors +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 the GitPython project 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. + + +albumentations +1.4.18 +MIT License +https://albumentations.ai +MIT License + +Copyright (c) 2017 Vladimir Iglovikov, Alexander Buslaev, Alexander Parinov, + +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. + + +click +8.1.8 +BSD License +https://github.com/pallets/click/ +Copyright 2014 Pallets + +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. Neither the name of the copyright holder 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 +HOLDER 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. + + +cryptography +48.0.0 +Apache-2.0 OR BSD-3-Clause +https://github.com/pyca/cryptography +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made +under the terms of *both* these licenses. + + +datasets +3.6.0 +Apache Software License +https://github.com/huggingface/datasets + + 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. + + +deepspeed +0.17.6 +Apache Software License 2.0 +http://deepspeed.ai + 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. + + +diffusers +0.35.1 +Apache Software License +https://github.com/huggingface/diffusers + 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. + + +dm-tree +0.1.9 +Apache Software License +https://github.com/deepmind/tree + + 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. + + +einops +0.8.1 +MIT License +https://github.com/arogozhnikov/einops +MIT License + +Copyright (c) 2018 Alex Rogozhnikov + +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. + + +flash_attn +2.8.3 +BSD License +https://github.com/Dao-AILab/flash-attention +BSD 3-Clause License + +Copyright (c) 2022, the respective contributors, as shown by the AUTHORS file. +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 the copyright holder 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 HOLDER 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. + + +gymnasium +1.2.2 +MIT License +https://farama.org +The MIT License + +Copyright (c) 2016 OpenAI +Copyright (c) 2022 Farama Foundation + +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. + + +huggingface_hub +0.36.2 +Apache Software License +https://github.com/huggingface/huggingface_hub + 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. + + +jsonlines +4.0.0 +BSD License +https://github.com/wbolster/jsonlines +*(This is the OSI approved 3-clause "New BSD License".)* + +Copyright © 2016, wouter bolsterlee + +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 the author nor the names of the 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 HOLDER 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. + + +lmdb +1.7.5 +OLDAP-2.8 +http://github.com/jnwatson/py-lmdb/ +The OpenLDAP Public License + Version 2.8, 17 August 2003 + +Redistribution and use of this software and associated documentation +("Software"), with or without modification, are permitted provided +that the following conditions are met: + +1. Redistributions in source form must retain copyright statements + and notices, + +2. Redistributions in binary form must reproduce applicable copyright + statements and notices, this list of conditions, and the following + disclaimer in the documentation and/or other materials provided + with the distribution, and + +3. Redistributions must contain a verbatim copy of this document. + +The OpenLDAP Foundation may revise this license from time to time. +Each revision is distinguished by a version number. You may use +this Software under terms of this license revision or under the +terms of any subsequent revision of the license. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND ITS +CONTRIBUTORS ``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 OPENLDAP FOUNDATION, ITS CONTRIBUTORS, OR THE AUTHOR(S) +OR OWNER(S) OF THE SOFTWARE 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 names of the authors and copyright holders must not be used in +advertising or otherwise to promote the sale, use or other dealing +in this Software without specific, written prior permission. Title +to copyright in this Software shall at all times remain with copyright +holders. + +OpenLDAP is a registered trademark of the OpenLDAP Foundation. + +Copyright 1999-2003 The OpenLDAP Foundation, Redwood City, +California, USA. All Rights Reserved. Permission to copy and +distribute verbatim copies of this document is granted. + + +matplotlib +3.10.1 +Python Software Foundation License +https://matplotlib.org +License agreement for matplotlib versions 1.3.0 and later +========================================================= + +1. This LICENSE AGREEMENT is between the Matplotlib Development Team +("MDT"), and the Individual or Organization ("Licensee") accessing and +otherwise using matplotlib software in source or binary form and its +associated documentation. + +2. Subject to the terms and conditions of this License Agreement, MDT +hereby grants Licensee a nonexclusive, royalty-free, world-wide license +to reproduce, analyze, test, perform and/or display publicly, prepare +derivative works, distribute, and otherwise use matplotlib +alone or in any derivative version, provided, however, that MDT's +License Agreement and MDT's notice of copyright, i.e., "Copyright (c) +2012- Matplotlib Development Team; All Rights Reserved" are retained in +matplotlib alone or in any derivative version prepared by +Licensee. + +3. In the event Licensee prepares a derivative work that is based on or +incorporates matplotlib or any part thereof, and wants to +make the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to matplotlib . + +4. MDT is making matplotlib available to Licensee on an "AS +IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB +WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR +LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING +MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF +THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between MDT and +Licensee. This License Agreement does not grant permission to use MDT +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using matplotlib , +Licensee agrees to be bound by the terms and conditions of this License +Agreement. + +License agreement for matplotlib versions prior to 1.3.0 +======================================================== + +1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the +Individual or Organization ("Licensee") accessing and otherwise using +matplotlib software in source or binary form and its associated +documentation. + +2. Subject to the terms and conditions of this License Agreement, JDH +hereby grants Licensee a nonexclusive, royalty-free, world-wide license +to reproduce, analyze, test, perform and/or display publicly, prepare +derivative works, distribute, and otherwise use matplotlib +alone or in any derivative version, provided, however, that JDH's +License Agreement and JDH's notice of copyright, i.e., "Copyright (c) +2002-2011 John D. Hunter; All Rights Reserved" are retained in +matplotlib alone or in any derivative version prepared by +Licensee. + +3. In the event Licensee prepares a derivative work that is based on or +incorporates matplotlib or any part thereof, and wants to +make the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to matplotlib. + +4. JDH is making matplotlib available to Licensee on an "AS +IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB +WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR +LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING +MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF +THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between JDH and +Licensee. This License Agreement does not grant permission to use JDH +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using matplotlib, +Licensee agrees to be bound by the terms and conditions of this License +Agreement. + +msgpack +1.1.0 +Apache Software License +https://msgpack.org/ +Copyright (C) 2008-2011 INADA Naoki + + 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. + + + +msgpack-numpy +0.4.8 +BSD License +https://github.com/lebedov/msgpack-numpy + +License +======= + +Copyright (c) 2013-2022, Lev E. Givon. +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 Lev E. Givon nor the names of any + 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. + + +numpy +1.26.4 +BSD License +https://numpy.org +Copyright (c) 2005-2023, NumPy Developers. +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 the NumPy Developers nor the names of any + 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. + +---- + +The NumPy repository and source distributions bundle several libraries that are +compatibly licensed. We list these here. + +Name: lapack-lite +Files: numpy/linalg/lapack_lite/* +License: BSD-3-Clause + For details, see numpy/linalg/lapack_lite/LICENSE.txt + +Name: tempita +Files: tools/npy_tempita/* +License: MIT + For details, see tools/npy_tempita/license.txt + +Name: dragon4 +Files: numpy/core/src/multiarray/dragon4.c +License: MIT + For license text, see numpy/core/src/multiarray/dragon4.c + +Name: libdivide +Files: numpy/core/include/numpy/libdivide/* +License: Zlib + For license text, see numpy/core/include/numpy/libdivide/LICENSE.txt + + +Note that the following files are vendored in the repository and sdist but not +installed in built numpy packages: + +Name: Meson +Files: vendored-meson/meson/* +License: Apache 2.0 + For license text, see vendored-meson/meson/COPYING + +Name: spin +Files: .spin/cmds.py +License: BSD-3 + For license text, see .spin/LICENSE + +---- + +This binary distribution of NumPy also bundles the following software: + + +Name: OpenBLAS +Files: numpy.libs/libopenblas*.so +Description: bundled as a dynamically linked library +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause + Copyright (c) 2011-2014, The OpenBLAS 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. Neither the name of the OpenBLAS project 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. + + +Name: LAPACK +Files: numpy.libs/libopenblas*.so +Description: bundled in OpenBLAS +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause-Attribution + Copyright (c) 1992-2013 The University of Tennessee and The University + of Tennessee Research Foundation. All rights + reserved. + Copyright (c) 2000-2013 The University of California Berkeley. All + rights reserved. + Copyright (c) 2006-2013 The University of Colorado Denver. All rights + reserved. + + $COPYRIGHT$ + + Additional copyrights may follow + + $HEADER$ + + 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 listed + in this license in the documentation and/or other materials + provided with the distribution. + + - Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + The copyright holders provide no reassurances that the source code + provided does not infringe any patent, copyright, or any other + intellectual property rights of third parties. The copyright holders + disclaim any liability to any recipient for claims brought against + recipient by any third party for infringement of that parties + intellectual property rights. + + 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. + + +Name: GCC runtime library +Files: numpy.libs/libgfortran*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libgfortran +License: GPL-3.0-with-GCC-exception + Copyright (C) 2002-2017 Free Software Foundation, Inc. + + Libgfortran is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Libgfortran 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 General Public License for more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . + +---- + +Full text of license texts referred to above follows (that they are +listed below does not necessarily imply the conditions apply to the +present binary release): + +---- + +GCC RUNTIME LIBRARY EXCEPTION + +Version 3.1, 31 March 2009 + +Copyright (C) 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. + +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. + +0. Definitions. + +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. + +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. + +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. + +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. + +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. + +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. + +1. Grant of Additional Permission. + +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. + +2. No Weakening of GCC Copyleft. + +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. + +---- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +Name: libquadmath +Files: numpy.libs/libquadmath*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath +License: LGPL-2.1-or-later + + GCC Quad-Precision Math Library + Copyright (C) 2010-2019 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert + + This file is part of the libquadmath library. + Libquadmath 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.1 of the License, or (at your option) any later version. + + Libquadmath 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 + Lesser General Public License for more details. + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +omegaconf +2.3.0 +BSD License +https://github.com/omry/omegaconf +BSD 3-Clause License + +Copyright (c) 2018, Omry Yadan +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. Neither the name of the copyright holder 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 HOLDER 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. + + +onnx +1.20.1 +Apache-2.0 +https://onnx.ai/ + + 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. + + +onnxscript +0.7.0 +MIT License +https://microsoft.github.io/onnxscript/ +MIT License + +Copyright (c) Microsoft Corporation + +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. + + +opencv-python-headless +4.11.0.86 +Apache Software License +https://github.com/opencv/opencv-python +OpenCV library is redistributed within opencv-python package. +This license applies to OpenCV binary in the directory cv2/. + + + 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. + +------------------------------------------------------------------------------ +libvpx is redistributed within all opencv-python Linux packages. +This license applies to libvpx binary in the directory cv2/. + +Copyright (c) 2010, The WebM Project authors. 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, nor the WebM Project, 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 +HOLDER 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. + +------------------------------------------------------------------------------ +FFmpeg is redistributed within all opencv-python packages. + +Libbluray, libgnutls, libnettle, libhogweed, libintl, libmp3lame, libp11, +librtmp, libsoxr and libtasn1 are redistributed within all opencv-python macOS packages. + +This license applies to the above library binaries in the directory cv2/. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + 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 Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +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 other code 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. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + 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, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) 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. + + d) 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. + + e) 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 materials to be 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 with +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 Lesser 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 + +------------------------------------------------------------------------------ +Qt 5 is redistributed within non-headless opencv-python Linux and macOS packages. +libgmp is redistributed within opencv-python macOS packages. +libidn2 is redistributed within opencv-python macOS packages. +libunistring is redistributed within opencv-python macOS packages. +This license applies to the above binaries in the directory cv2/. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + 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 that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +------------------------------------------------------------------------------ +bzip2 is redistributed within all opencv-python Linux packages. +This license applies to libbz2 binary in the directory cv2/. + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2010 Julian R Seward. 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. 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. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +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. + +Julian Seward, jseward@bzip.org +bzip2/libbzip2 version 1.0.6 of 6 September 2010 + +------------------------------------------------------------------------------ +libcrypto and libssl are redistributed within all opencv-python Linux and macOS packages. +libopencore-amrnb and libopencore-amrwb are redistributed within all opencv-python Linux and macOS packages. +This license applies to above binaries in the directory cv2/. + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double 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. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 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 adhered 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 routines 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 publicly 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.] + */ + +------------------------------------------------------------------------------ +libfontconfig is redistributed within all opencv-python macOS packages. +This license applies to libfontconfig binary in the directory cv2/. + +Copyright © 2000,2001,2002,2003,2004,2006,2007 Keith Packard +Copyright © 2005 Patrick Lam +Copyright © 2009 Roozbeh Pournader +Copyright © 2008,2009 Red Hat, Inc. +Copyright © 2008 Danilo Šegan +Copyright © 2012 Google, Inc. + + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of the author(s) not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. The authors make no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +------------------------------------------------------------------------------ +libfreetype is redistributed within opencv-python Linux and macOS packages. +This license applies to libfreetype binary in the directory cv2/. + + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + +------------------------------------------------------------------------------ +libpng is redistributed within all opencv-python Linux and macOS packages. +This license applies to libpng binary in the directory cv2/. + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2019 The PNG Reference Library Authors. + * Copyright (c) 2018-2019 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +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 Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. + +------------------------------------------------------------------------------ +libz is redistributed within all opencv-python Linux packages. +This license applies to libz binary in the directory cv2/. + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + 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. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +------------------------------------------------------------------------------ +libdav1d is redistributed within opencv-python macOS packages. +This license applies to libdav1d binary in the directory cv2/. + +Copyright © 2018-2019, VideoLAN and dav1d authors +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. + +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. + +------------------------------------------------------------------------------ +libffi is redistributed within opencv-python macOS packages. +This license applies to libffi binary in the directory cv2/. + +libffi - Copyright (c) 1996-2020 Anthony Green, Red Hat, Inc and others. +See source files for details. + +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. + +------------------------------------------------------------------------------ +libogg is redistributed within opencv-python macOS packages. +This license applies to libogg binary in the directory cv2/. + +Copyright (c) 2002, Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +libopenjp2 is redistributed within opencv-python macOS packages. +This license applies to libopenjp2 binary in the directory cv2/. + +The copyright in this software is being made available under the 2-clauses +BSD License, included below. This software may be subject to other third +party and contributor rights, including patent rights, and no such rights +are granted under this license. + +Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium +Copyright (c) 2002-2014, Professor Benoit Macq +Copyright (c) 2003-2014, Antonin Descampe +Copyright (c) 2003-2009, Francois-Olivier Devaux +Copyright (c) 2005, Herve Drolon, FreeImage Team +Copyright (c) 2002-2003, Yannick Verschueren +Copyright (c) 2001-2003, David Janssens +Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France +Copyright (c) 2012, CS Systemes d'Information, France + +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. + +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. + +------------------------------------------------------------------------------ +libopus is redistributed within opencv-python macOS packages. +This license applies to libopus binary in the directory cv2/. + +Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo + +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 Internet Society, IETF or IETF Trust, nor the +names of specific 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. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ + +------------------------------------------------------------------------------ +librav1e is redistributed within opencv-python macOS packages. +This license applies to librav1e binary in the directory cv2/. + +BSD 2-Clause License + +Copyright (c) 2017-2020, the rav1e contributors +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. + +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 HOLDER 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. + +------------------------------------------------------------------------------ +libsnappy is redistributed within opencv-python macOS packages. +This license applies to libsnappy binary in the directory cv2/. + +Copyright 2011, 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. + +------------------------------------------------------------------------------ +libspeex is redistributed within opencv-python macOS packages. +This license applies to libspeex binary in the directory cv2/. + +Copyright 2002-2008 Xiph.org Foundation +Copyright 2002-2008 Jean-Marc Valin +Copyright 2005-2007 Analog Devices Inc. +Copyright 2005-2008 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) +Copyright 1993, 2002, 2006 David Rowe +Copyright 2003 EpicGames +Copyright 1992-1994 Jutta Degener, Carsten Bormann + +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 the Xiph.org Foundation 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 FOUNDATION 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. + +------------------------------------------------------------------------------ +libsrt is redistributed within opencv-python macOS packages. +This license applies to libsrt binary in the directory cv2/. + +/* + * + * Copyright (c) 2001-2017 Cisco Systems, 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 the Cisco Systems, 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 HOLDERS 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. + * + */ + + + 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. + +------------------------------------------------------------------------------ +libtheoradec and libtheoraenc are redistributed within opencv-python macOS packages. +This license applies to libtheoradec and libtheoraenc binaries in the directory cv2/. + + Copyright (C) 2002-2009 Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +libwebp and libwebpmux are redistributed within all opencv-python packages. +This license applies to libwebp and libwebpmux binaries in the directory cv2/. + +Copyright (c) 2010, 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 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 +HOLDER 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. + +------------------------------------------------------------------------------ +libvorbis and libvorbisenc are redistributed within opencv-python macOS packages. +This license applies to libvorbis and libvorbisenc binaries in the directory cv2/. + +Copyright (c) 2002-2020 Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +Libxcb utility libraries are redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb related binaries in the directory cv2/. + +Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett. +All Rights Reserved. + +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 +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 names of the authors +or their institutions shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this +Software without prior written authorization from the +authors. + +------------------------------------------------------------------------------ +Libxcb-image is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-image binary in the directory cv2/. + +Copyright © 2007-2008 Bart Massey +Copyright © 2008 Julien Danjou +Copyright © 2008 Keith Packard + +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 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 names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-util is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-util binary in the directory cv2/. + +Copyright © 2008 Bart Massey +Copyright © 2008 Ian Osgood +Copyright © 2008 Jamey Sharp +Copyright © 2008 Josh Triplett +Copyright © 2008-2009 Julien Danjou + +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 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 names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-render-util is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-render-util binary in the directory cv2/. + +Copyright © 2000 Keith Packard + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of Keith Packard not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. Keith Packard makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +Copyright © 2006 Jamey Sharp. + +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 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 names of the authors or their +institutions shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization from the authors. + +Copyright © 2006 Ian Osgood + +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 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 names of the authors or their +institutions shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-icccm is redistributed within opencv-python non-headless Linux packages. +This license applies to Libxcb-icccm binary in the directory cv2/. + +Copyright © 2008-2011 Arnaud Fontaine +Copyright © 2007-2008 Vincent Torri + +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 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 names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +libXau is redistributed within opencv-python non-headless Linux packages. +This license applies to libXau binary in the directory cv2/. + +Copyright 1988, 1993, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +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 +OPEN GROUP 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 The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +------------------------------------------------------------------------------ +Vulkan headers are redistributed within all opencv-python packages. +This license applies to Vulkan headers in the directory 3rdparty/include/vulkan. + +Copyright (c) 2015-2018 The Khronos Group Inc. + +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. + +------------------------------------------------------------------------------ +Libjpeg-turbo is redistributed within all opencv-python packages as build option. + +libjpeg-turbo Licenses +====================== + +libjpeg-turbo is covered by three compatible BSD-style open source licenses: + +- The IJG (Independent JPEG Group) License, which is listed in + [README.ijg](README.ijg) + + This license applies to the libjpeg API library and associated programs + (any code inherited from libjpeg, and any modifications to that code.) + +- The Modified (3-clause) BSD License, which is listed below + + This license covers the TurboJPEG API library and associated programs, as + well as the build system. + +- The [zlib License](https://opensource.org/licenses/Zlib) + + This license is a subset of the other two, and it covers the libjpeg-turbo + SIMD extensions. + + +Complying with the libjpeg-turbo Licenses +========================================= + +This section provides a roll-up of the libjpeg-turbo licensing terms, to the +best of our understanding. + +1. If you are distributing a modified version of the libjpeg-turbo source, + then: + + 1. You cannot alter or remove any existing copyright or license notices + from the source. + + **Origin** + - Clause 1 of the IJG License + - Clause 1 of the Modified BSD License + - Clauses 1 and 3 of the zlib License + + 2. You must add your own copyright notice to the header of each source + file you modified, so others can tell that you modified that file (if + there is not an existing copyright header in that file, then you can + simply add a notice stating that you modified the file.) + + **Origin** + - Clause 1 of the IJG License + - Clause 2 of the zlib License + + 3. You must include the IJG README file, and you must not alter any of the + copyright or license text in that file. + + **Origin** + - Clause 1 of the IJG License + +2. If you are distributing only libjpeg-turbo binaries without the source, or + if you are distributing an application that statically links with + libjpeg-turbo, then: + + 1. Your product documentation must include a message stating: + + This software is based in part on the work of the Independent JPEG + Group. + + **Origin** + - Clause 2 of the IJG license + + 2. If your binary distribution includes or uses the TurboJPEG API, then + your product documentation must include the text of the Modified BSD + License (see below.) + + **Origin** + - Clause 2 of the Modified BSD License + +3. You cannot use the name of the IJG or The libjpeg-turbo Project or the + contributors thereof in advertising, publicity, etc. + + **Origin** + - IJG License + - Clause 3 of the Modified BSD License + +4. The IJG and The libjpeg-turbo Project do not warrant libjpeg-turbo to be + free of defects, nor do we accept any liability for undesirable + consequences resulting from your use of the software. + + **Origin** + - IJG License + - Modified BSD License + - zlib License + + +The Modified (3-clause) BSD License +=================================== + +Copyright (C)2009-2022 D. R. Commander. All Rights Reserved.
+Copyright (C)2015 Viktor Szathmáry. 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 the libjpeg-turbo Project 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 HOLDERS 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. + + +Why Three Licenses? +=================== + +The zlib License could have been used instead of the Modified (3-clause) BSD +License, and since the IJG License effectively subsumes the distribution +conditions of the zlib License, this would have effectively placed +libjpeg-turbo binary distributions under the IJG License. However, the IJG +License specifically refers to the Independent JPEG Group and does not extend +attribution and endorsement protections to other entities. Thus, it was +desirable to choose a license that granted us the same protections for new code +that were granted to the IJG for code derived from their software. + +------------------------------------------------------------------------------ +Libspng is redistributed within all opencv-python packages as build option. + +BSD 2-Clause License + +Copyright (c) 2018-2022, Randy +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. + +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 HOLDER 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. + +------------------------------------------------------------------------------ +QUIRC library is redistributed within all opencv-python packages. + +quirc -- QR-code recognition library +Copyright (C) 2010-2012 Daniel Beer + +Permission to use, copy, modify, and/or 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" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +------------------------------------------------------------------------------ +Flatbuffers library is redistributed within all opencv-python packages. + + 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. + +------------------------------------------------------------------------------ +Protobuf library is redistributed within all opencv-python packages. + +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. + +------------------------------------------------------------------------------ +OpenJPEG library is redistributed within all opencv-python packages. + +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * 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. + * + * 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. + */ + +------------------------------------------------------------------------------ +TIFF library is redistributed within all opencv-python packages. + +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. + +------------------------------------------------------------------------------ +OpenEXR library is redistributed within all opencv-python packages. + +Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm +Entertainment Company Ltd. Portions contributed and copyright held by +others as indicated. 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 Industrial Light & Magic nor the names of + any other contributors to this software 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. + +------------------------------------------------------------------------------ +Intel(R) IPP ICV library statically linked within x86 and x86_64 opencv-python packages. + +Intel(R) Integrated Performance Primitives 2021 Update 10 + +Intel Simplified Software License (Version October 2022) + +Intel(R) Integrated Performance Primitives (Intel(R) IPP) : Copyright (C) 1997 Intel Corporation + +Use and Redistribution. You may use and redistribute the software, which is +provided in binary form only, (the "Software"), without modification, +provided the following conditions are met: + +* Redistributions must reproduce the above copyright notice and these + terms of use in the Software and in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel nor the names of its suppliers may be used to + endorse or promote products derived from this Software without specific + prior written permission. +* No reverse engineering, decompilation, or disassembly of the Software is + permitted, nor any modification or alteration of the Software or its operation + at any time, including during execution. + +No other licenses. Except as provided in the preceding section, Intel grants no +licenses or other rights by implication, estoppel or otherwise to, patent, +copyright, trademark, trade name, service mark or other intellectual property +licenses or rights of Intel. + +Third party software. "Third Party Software" means the files (if any) listed +in the "third-party-software.txt" or other similarly-named text file that may +be included with the Software. Third Party Software, even if included with the +distribution of the Software, may be governed by separate license terms, including +without limitation, third party license terms, open source software notices and +terms, and/or other Intel software license terms. These separate license terms +solely govern Your use of the Third Party Software. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE +DISCLAIMED. THIS SOFTWARE IS NOT INTENDED FOR USE IN SYSTEMS OR APPLICATIONS +WHERE FAILURE OF THE SOFTWARE MAY CAUSE PERSONAL INJURY OR DEATH AND YOU AGREE +THAT YOU ARE FULLY RESPONSIBLE FOR ANY CLAIMS, COSTS, DAMAGES, EXPENSES, AND +ATTORNEYS' FEES ARISING OUT OF ANY SUCH USE, EVEN IF ANY CLAIM ALLEGES THAT +INTEL WAS NEGLIGENT REGARDING THE DESIGN OR MANUFACTURE OF THE SOFTWARE. + +LIMITATION OF LIABILITY. IN NO EVENT WILL INTEL 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. + +No support. Intel may make changes to the Software, at any time without notice, +and is not obligated to support, update or provide training for the Software. + +Termination. Your right to use the Software is terminated in the event of your +breach of this license. + +Feedback. Should you provide Intel with comments, modifications, corrections, +enhancements or other input ("Feedback") related to the Software, Intel will be +free to use, disclose, reproduce, license or otherwise distribute or exploit the +Feedback in its sole discretion without any obligations or restrictions of any +kind, including without limitation, intellectual property rights or licensing +obligations. + +Compliance with laws. You agree to comply with all relevant laws and regulations +governing your use, transfer, import or export (or prohibition thereof) of the +Software. + +Governing law. All disputes will be governed by the laws of the United States of +America and the State of Delaware without reference to conflict of law +principles and subject to the exclusive jurisdiction of the state or federal +courts sitting in the State of Delaware, and each party agrees that it submits +to the personal jurisdiction and venue of those courts and waives any +objections. THE UNITED NATIONS CONVENTION ON CONTRACTS FOR THE INTERNATIONAL +SALE OF GOODS (1980) IS SPECIFICALLY EXCLUDED AND WILL NOT APPLY TO THE SOFTWARE. + +------------------------------------------------------------------------------ +Orbbec SDK distributed with arm64 MacOS packages. + +MIT License + +Copyright (c) 2023 OrbbecDeveloper + +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. + + +pandas +2.2.3 +BSD License +https://pandas.pydata.org +BSD 3-Clause License + +Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team +All rights reserved. + +Copyright (c) 2011-2023, Open source contributors. + +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 the copyright holder 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 HOLDER 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. +Copyright (c) 2010-2019 Keith Goodman +Copyright (c) 2019 Bottleneck Developers +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. + +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 HOLDER 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.Copyright 2017- Paul Ganssle +Copyright 2017- dateutil contributors (see AUTHORS file) + + 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. + +The above license applies to all contributions after 2017-12-01, as well as +all contributions that have been re-licensed (see AUTHORS file for the list of +contributors who have re-licensed their code). +-------------------------------------------------------------------------------- +dateutil - Extensions to the standard Python datetime module. + +Copyright (c) 2003-2011 - Gustavo Niemeyer +Copyright (c) 2012-2014 - Tomi Pieviläinen +Copyright (c) 2014-2016 - Yaron de Leeuw +Copyright (c) 2015- - Paul Ganssle +Copyright (c) 2015- - dateutil contributors (see AUTHORS file) + +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 the copyright holder 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. + +The above BSD License Applies to all code, even that also covered by Apache 2.0.# MIT License + +Copyright (c) 2019 Hadley Wickham; RStudio; and Evan Miller + +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. +Based on http://opensource.org/licenses/MIT + +This is a template. Complete and ship as file LICENSE the following 2 +lines (only) + +YEAR: +COPYRIGHT HOLDER: + +and specify as + +License: MIT + file 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. +The MIT License + +Copyright (c) 2008- Attractive Chaos + +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.musl as a whole is licensed under the following standard MIT license: + +---------------------------------------------------------------------- +Copyright © 2005-2020 Rich Felker, et al. + +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. +---------------------------------------------------------------------- + +Authors/contributors include: + +A. Wilcox +Ada Worcester +Alex Dowad +Alex Suykov +Alexander Monakov +Andre McCurdy +Andrew Kelley +Anthony G. Basile +Aric Belsito +Arvid Picciani +Bartosz Brachaczek +Benjamin Peterson +Bobby Bingham +Boris Brezillon +Brent Cook +Chris Spiegel +Clément Vasseur +Daniel Micay +Daniel Sabogal +Daurnimator +David Carlier +David Edelsohn +Denys Vlasenko +Dmitry Ivanov +Dmitry V. Levin +Drew DeVault +Emil Renner Berthing +Fangrui Song +Felix Fietkau +Felix Janda +Gianluca Anzolin +Hauke Mehrtens +He X +Hiltjo Posthuma +Isaac Dunham +Jaydeep Patil +Jens Gustedt +Jeremy Huntwork +Jo-Philipp Wich +Joakim Sindholt +John Spencer +Julien Ramseier +Justin Cormack +Kaarle Ritvanen +Khem Raj +Kylie McClain +Leah Neukirchen +Luca Barbato +Luka Perkov +M Farkas-Dyck (Strake) +Mahesh Bodapati +Markus Wichmann +Masanori Ogino +Michael Clark +Michael Forney +Mikhail Kremnyov +Natanael Copa +Nicholas J. Kain +orc +Pascal Cuoq +Patrick Oppenlander +Petr Hosek +Petr Skocik +Pierre Carrier +Reini Urban +Rich Felker +Richard Pennington +Ryan Fairfax +Samuel Holland +Segev Finer +Shiz +sin +Solar Designer +Stefan Kristiansson +Stefan O'Rear +Szabolcs Nagy +Timo Teräs +Trutz Behn +Valentin Ochs +Will Dietz +William Haddon +William Pitcock + +Portions of this software are derived from third-party works licensed +under terms compatible with the above MIT license: + +The TRE regular expression implementation (src/regex/reg* and +src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed +under a 2-clause BSD license (license text in the source files). The +included version has been heavily modified by Rich Felker in 2012, in +the interests of size, simplicity, and namespace cleanliness. + +Much of the math library code (src/math/* and src/complex/*) is +Copyright © 1993,2004 Sun Microsystems or +Copyright © 2003-2011 David Schultz or +Copyright © 2003-2009 Steven G. Kargl or +Copyright © 2003-2009 Bruce D. Evans or +Copyright © 2008 Stephen L. Moshier or +Copyright © 2017-2018 Arm Limited +and labelled as such in comments in the individual source files. All +have been licensed under extremely permissive terms. + +The ARM memcpy code (src/string/arm/memcpy.S) is Copyright © 2008 +The Android Open Source Project and is licensed under a two-clause BSD +license. It was taken from Bionic libc, used on Android. + +The AArch64 memcpy and memset code (src/string/aarch64/*) are +Copyright © 1999-2019, Arm Limited. + +The implementation of DES for crypt (src/crypt/crypt_des.c) is +Copyright © 1994 David Burren. It is licensed under a BSD license. + +The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was +originally written by Solar Designer and placed into the public +domain. The code also comes with a fallback permissive license for use +in jurisdictions that may not recognize the public domain. + +The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011 +Valentin Ochs and is licensed under an MIT-style license. + +The x86_64 port was written by Nicholas J. Kain and is licensed under +the standard MIT terms. + +The mips and microblaze ports were originally written by Richard +Pennington for use in the ellcc project. The original code was adapted +by Rich Felker for build system and code conventions during upstream +integration. It is licensed under the standard MIT terms. + +The mips64 port was contributed by Imagination Technologies and is +licensed under the standard MIT terms. + +The powerpc port was also originally written by Richard Pennington, +and later supplemented and integrated by John Spencer. It is licensed +under the standard MIT terms. + +All other files which have no copyright comments are original works +produced specifically for use as part of this library, written either +by Rich Felker, the main author of the library, or by one or more +contibutors listed above. Details on authorship of individual files +can be found in the git version control history of the project. The +omission of copyright and license comments in each file is in the +interest of source tree size. + +In addition, permission is hereby granted for all public header files +(include/* and arch/*/bits/*) and crt files intended to be linked into +applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit +the copyright notice and permission notice otherwise required by the +license, and to use these files without any requirement of +attribution. These files include substantial contributions from: + +Bobby Bingham +John Spencer +Nicholas J. Kain +Rich Felker +Richard Pennington +Stefan Kristiansson +Szabolcs Nagy + +all of whom have explicitly granted such permission. + +This file previously contained text expressing a belief that most of +the files covered by the above exception were sufficiently trivial not +to be subject to copyright, resulting in confusion over whether it +negated the permissions granted in the license. In the spirit of +permissive licensing, and of not having licensing issues being an +obstacle to adoption, that text has been removed.Copyright (c) 2005-2023, NumPy Developers. +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 the NumPy Developers nor the names of any + 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. + 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 + + +Copyright (c) Donald Stufft and individual contributors. +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. + +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 HOLDER 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.A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +Copyright (c) 2014, Al Sweigart +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 the {organization} 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 HOLDER 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.Copyright (c) 2017 Anthony Sottile + +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.Copyright (c) 2015-2019 Jared Hobbs + +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.Developed by ESN, an Electronic Arts Inc. studio. +Copyright (c) 2014, Electronic Arts 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 ESN, Electronic Arts 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 ELECTRONIC ARTS INC. 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. + +---- + +Portions of code from MODP_ASCII - Ascii transformations (upper/lower, etc) +https://github.com/client9/stringencoders + + Copyright 2005, 2006, 2007 + Nick Galbreath -- nickg [at] modp [dot] com + 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 the modp.com 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. + + This is the standard "new" BSD license: + http://www.opensource.org/licenses/bsd-license.php + +https://github.com/client9/stringencoders/blob/cfd5c1507325ae497ea9bacdacba12c0ffd79d30/COPYING + +---- + +Numeric decoder derived from from TCL library +https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms + * Copyright (c) 1988-1993 The Regents of the University of California. + * Copyright (c) 1994 Sun Microsystems, Inc. + + This software is copyrighted by the Regents of the University of + California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState + Corporation and other parties. The following terms apply to all files + associated with the software unless explicitly disclaimed in + individual files. + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. + + IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY + FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY + DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE + IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE + NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. + + GOVERNMENT USE: If you are acquiring this software on behalf of the + U.S. government, the Government shall have only "Restricted Rights" + in the software and related documentation as defined in the Federal + Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you + are acquiring the software on behalf of the Department of Defense, the + software shall be classified as "Commercial Computer Software" and the + Government shall have only "Restricted Rights" as defined in Clause + 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the + authors grant the U.S. Government and others acting in its behalf + permission to use and distribute the software in accordance with the + terms specified in this 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 + +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. + +peft +0.17.1 +Apache Software License +https://github.com/huggingface/peft + 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. + + +pyzmq +27.0.1 +BSD License +https://pyzmq.readthedocs.org +BSD 3-Clause License + +Copyright (c) 2009-2012, Brian Granger, Min Ragan-Kelley + +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. Neither the name of the copyright holder 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 HOLDER 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. + + +scipy +1.15.3 +BSD License +https://scipy.org/ +Copyright (c) 2001-2002 Enthought, Inc. 2003-2024, SciPy Developers. +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. Neither the name of the copyright holder 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. + +---- + +This binary distribution of SciPy can also bundle the following software +(depending on the build): + + +Name: OpenBLAS +Files: scipy.libs/libscipy_openblas*.so +Description: bundled as a dynamically linked library +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause-Attribution + Copyright (c) 2011-2014, The OpenBLAS 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. Neither the name of the OpenBLAS project 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. + + +Name: LAPACK +Files: scipy.libs/libscipy_openblas*.so +Description: bundled in OpenBLAS +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause-Attribution + Copyright (c) 1992-2013 The University of Tennessee and The University + of Tennessee Research Foundation. All rights + reserved. + Copyright (c) 2000-2013 The University of California Berkeley. All + rights reserved. + Copyright (c) 2006-2013 The University of Colorado Denver. All rights + reserved. + + $COPYRIGHT$ + + Additional copyrights may follow + + $HEADER$ + + 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 listed + in this license in the documentation and/or other materials + provided with the distribution. + + - Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + The copyright holders provide no reassurances that the source code + provided does not infringe any patent, copyright, or any other + intellectual property rights of third parties. The copyright holders + disclaim any liability to any recipient for claims brought against + recipient by any third party for infringement of that parties + intellectual property rights. + + 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. + + +Name: GCC runtime library +Files: scipy.libs/libgfortran*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libgfortran +License: GPL-3.0-with-GCC-exception + Copyright (C) 2002-2017 Free Software Foundation, Inc. + + Libgfortran is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Libgfortran 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 General Public License for more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . + +---- + +Full text of license texts referred to above follows (that they are +listed below does not necessarily imply the conditions apply to the +present binary release): + +---- + +GCC RUNTIME LIBRARY EXCEPTION + +Version 3.1, 31 March 2009 + +Copyright (C) 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. + +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. + +0. Definitions. + +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. + +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. + +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. + +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. + +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. + +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. + +1. Grant of Additional Permission. + +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. + +2. No Weakening of GCC Copyleft. + +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. + +---- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +Name: libquadmath +Files: scipy.libs/libquadmath*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath +License: LGPL-2.1-or-later + + GCC Quad-Precision Math Library + Copyright (C) 2010-2019 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert + + This file is part of the libquadmath library. + Libquadmath 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.1 of the License, or (at your option) any later version. + + Libquadmath 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 + Lesser General Public License for more details. + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +tensorrt_cu12 +10.15.1.29 +Other/Proprietary License +https://github.com/nvidia/tensorrt +Abstract +This document is the Software License Agreement (SLA) for NVIDIA TensorRT. This document contains specific license terms and conditions for NVIDIA TensorRT. By accepting this agreement, you agree to comply with all the terms and conditions applicable to the specific product(s) included herein. + +If you are receiving TensorRT under the NVIDIA Prerelease License Agreement (also known as NPLA) or under the NVIDIA Software License Agreement (previously known as the NVIDIA Tegra Software License Agreement), your use of TensorRT is governed by such applicable terms and conditions. All other uses of TensorRT are governed by the terms and conditions of the below license agreement. + +NVIDIA SOFTWARE LICENSE AGREEMENT +Important: READ BEFORE DOWNLOADING, INSTALLING, COPYING OR USING THE LICENSED SOFTWARE +This Software License Agreement ("SLA”), made and entered into as of the time and date of click through action (“Effective Date”),is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs the use of the NVIDIA computer software and the documentation made available for use with such NVIDIA software. By downloading, installing, copying, or otherwise using the NVIDIA software and/or documentation, you agree to be bound by the terms of this SLA. If you do not agree to the terms of this SLA, do not download, install, copy or use the NVIDIA software or documentation. IF YOU ARE ENTERING INTO THIS SLAON BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THE ENTITY TO THIS SLA, IN WHICH CASE “YOU” WILL MEAN THE ENTITY YOU REPRESENT. IF YOU DON’T HAVE SUCH AUTHORITY, OR IF YOU DON’T ACCEPT ALL THE TERMS AND CONDITIONS OF THIS SLA, THEN NVIDIA DOES NOT AGREETO LICENSE THE LICENSED SOFTWARETO YOU, AND YOU MAY NOT DOWNLOAD, INSTALL, COPY OR USE IT. + +Preface +This document is the Software License Agreement (SLA) for NVIDIA TensorRT. This document contains specific license terms and conditions for NVIDIA TensorRT. By accepting this agreement, you agree to comply with all the terms and conditions applicable to the specific product(s) included herein. + +If you are receiving TensorRT under the NVIDIA Prerelease License Agreement (also known as NPLA) or under the NVIDIA Software License Agreement (previously known as the NVIDIA Tegra Software License Agreement), your use of TensorRT is governed by such applicable terms and conditions. All other uses of TensorRT are governed by the terms and conditions of the below license agreement. + +NVIDIA SOFTWARE LICENSE AGREEMENT +Important: READ BEFORE DOWNLOADING, INSTALLING, COPYING OR USING THE LICENSED SOFTWARE +This Software License Agreement ("SLA”), made and entered into as of the time and date of click through action (“Effective Date”),is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs the use of the NVIDIA computer software and the documentation made available for use with such NVIDIA software. By downloading, installing, copying, or otherwise using the NVIDIA software and/or documentation, you agree to be bound by the terms of this SLA. If you do not agree to the terms of this SLA, do not download, install, copy or use the NVIDIA software or documentation. IF YOU ARE ENTERING INTO THIS SLAON BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THE ENTITY TO THIS SLA, IN WHICH CASE “YOU” WILL MEAN THE ENTITY YOU REPRESENT. IF YOU DON’T HAVE SUCH AUTHORITY, OR IF YOU DON’T ACCEPT ALL THE TERMS AND CONDITIONS OF THIS SLA, THEN NVIDIA DOES NOT AGREETO LICENSE THE LICENSED SOFTWARETO YOU, AND YOU MAY NOT DOWNLOAD, INSTALL, COPY OR USE IT. + +1. LICENSE. +1.1. License Grant +Subject to the terms of the AGREEMENT, NVIDIA hereby grants you a non-exclusive, non-transferable license, without the right to sublicense (except as expressly set forth in a Supplement), during the applicable license term unless earlier terminated as provided below, to have Authorized Users install and use the Software, including modifications (if expressly permitted in a Supplement), in accordance with the Documentation. You are only licensed to activate and use Licensed Software for which you a have a valid license, even if during the download or installation you are presented with other product options. No Orders are binding on NVIDIA until accepted by NVIDIA. Your Orders are subject to the AGREEMENT. + +SLA Supplements: Certain Licensed Software licensed under this SLA may be subject to additional terms and conditions that will be presented to you in a Supplement for acceptance prior to the delivery of such Licensed Software under this SLA and the applicable Supplement. Licensed Software will only be delivered to you upon your acceptance of all applicable terms. + +1.2. Limited Purpose Licenses +If your license is provided for one of the purposes indicated below, then notwithstanding contrary terms in License Grant or in a Supplement, such licenses are for internal use and do not include any right or license to sub-license and distribute the Licensed Software or its output in any way in any public release, however limited, and/or in any manner that provides third parties with use of or access to the Licensed Software or its functionality or output, including (but not limited to) external alpha or beta testing or development phases. Further: +Evaluation License. You may use evaluation licenses solely for your internal evaluation of the Licensed Software for broader adoption within your Enterprise or in connection with a NVIDIA product purchase decision, and such licenses have an expiration date as indicated by NVIDIA in its sole discretion (or ninety days from the date of download if no other duration is indicated). +Educational/Academic License. You may use educational/academic licenses solely for educational purposes and all users must be enrolled or employed by an academic institution. If you do not meet NVIDIA’s academic program requirements for educational institutions, you have no rights under this license. +Test/Development License. You may use test/development licenses solely for your internal development, testing and/or debugging of your software applications or for interoperability testing with the Licensed Software, and such licenses have an expiration date as indicated by NVIDIA in its sole discretion (or one year from the date of download if no other duration is indicated). NVIDIA Confidential Information under the AGREEMENT includes output from Licensed Software developer tools identified as “Pro” versions, where the output reveals functionality or performance data pertinent to NVIDIA hardware or software products. +1.3. Pre-Release Licenses +With respect to alpha, beta, preview, and other pre-release Software and Documentation (“Pre-Release Licensed Software”) delivered to you under the AGREEMENT you acknowledge and agree that such Pre-Release Licensed Software (i) may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, accessibility, availability, and reliability standards relative to commercially provided NVIDIA software and documentation, and (ii) use of such Pre-Release Licensed Software may result in unexpected results, loss of data, project delays or other unpredictable damage or loss. THEREFORE, PRE-RELEASE LICENSED SOFTWARE IS NOT INTENDED FOR USE, AND SHOULD NOT BE USED, IN PRODUCTION OR BUSINESS-CRITICAL SYSTEMS. NVIDIA has no obligation to make available a commercial version of any Pre-Release Licensed Software and NVIDIA has the right to abandon development of Pre-Release Licensed Software at any time without liability. + +1.4. Enterprise and Contractor Usage +You may allow your Enterprise employees and Contractors to access and use the Licensed Software pursuant to the terms of the AGREEMENT solely to perform work on your behalf, provided further that with respect to Contractors: (i) you obtain a written agreement from each Contractor which contains terms and obligations with respect to access to and use of Licensed Software no less protective of NVIDIA than those set forth in the AGREEMENT, and (ii) such Contractor’s access and use expressly excludes any sublicensing or distribution rights for the Licensed Software. You are responsible for the compliance with the terms and conditions of the AGREEMENT by your Enterprise and Contractors. Any act or omission that, if committed by you, would constitute a breach of the AGREEMENT shall be deemed to constitute a breach of the AGREEMENT if committed by your Enterprise or Contractors. + +1.5. Services +Except as expressly indicated in an Order, NVIDIA is under no obligation to provide support for the Licensed Software or to provide any patches, maintenance, updates or upgrades under the AGREEMENT. Unless patches, maintenance, updates or upgrades are provided with their separate governing terms and conditions, they constitute Licensed Software licensed to you under the AGREEMENT. + +2. LIMITATIONS. +2.1. License Restrictions +Except as expressly authorized in the AGREEMENT, you agree that you will not (nor authorize third parties to): (i) copy and use Software that was licensed to you for use in one or more NVIDIA hardware products in other unlicensed products (provided that copies solely for backup purposes are allowed); (ii) reverse engineer, decompile, disassemble (except to the extent applicable laws specifically require that such activities be permitted) or attempt to derive the source code, underlying ideas, algorithm or structure of Software provided to you in object code form; (iii) sell, transfer, assign, distribute, rent, loan, lease, sublicense or otherwise make available the Licensed Software or its functionality to third parties (a) as an application services provider or service bureau, (b) by operating hosted/virtual system environments, (c) by hosting, time sharing or providing any other type of services, or (d) otherwise by means of the internet; (iv) modify, translate or otherwise create any derivative works of any Licensed Software; (v) remove, alter, cover or obscure any proprietary notice that appears on or with the Licensed Software or any copies thereof; (vi) use the Licensed Software, or allow its use, transfer, transmission or export in violation of any applicable export control laws, rules or regulations; (vii) distribute, permit access to, or sublicense the Licensed Software as a stand-alone product; (viii) bypass, disable, circumvent or remove any form of copy protection, encryption, security or digital rights management or authentication mechanism used by NVIDIA in connection with the Licensed Software, or use the Licensed Software together with any authorization code, serial number, or other copy protection device not supplied by NVIDIA directly or through an authorized reseller; (ix) use the Licensed Software for the purpose of developing competing products or technologies or assisting a third party in such activities; (x) use the Licensed Software with any system or application where the use or failure of such system or application can reasonably be expected to threaten or result in personal injury, death, or catastrophic loss including, without limitation, use in connection with any nuclear, avionics, navigation, military, medical, life support or other life critical application (“Critical Applications”), unless the parties have entered into a Critical Applications agreement; (xi) distribute any modification or derivative work you make to the Licensed Software under or by reference to the same name as used by NVIDIA; or (xii) use the Licensed Software in any manner that would cause the Licensed Software to become subject to an Open Source License. Nothing in the AGREEMENT shall be construed to give you a right to use, or otherwise obtain access to, any source code from which the Software or any portion thereof is compiled or interpreted. You acknowledge that NVIDIA does not design, test, manufacture or certify the Licensed Software for use in the context of a Critical Application and NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such use. You agree to defend, indemnify and hold harmless NVIDIA and its Affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney’s fees and costs incident to establishing the right of indemnification) arising out of or related to you and your Enterprise, and their respective employees, contractors, agents, distributors, resellers, end users, officers and directors use of Licensed Software outside of the scope of the AGREEMENT or any other breach of the terms of the AGREEMENT. + +2.2. Third Party License Obligations +You acknowledge and agree that the Licensed Software may include or incorporate third party technology (collectively “Third Party Components”), which is provided for use in or with the Software and not otherwise used separately. If the Licensed Software includes or incorporates Third Party Components, then the third-party pass-through terms and conditions (“Third Party Terms”) for the particular Third Party Component will be bundled with the Software or otherwise made available online as indicated by NVIDIA and will be incorporated by reference into the AGREEMENT. In the event of any conflict between the terms in the AGREEMENT and the Third Party Terms, the Third Party Terms shall govern. Copyright to Third Party Components are held by the copyright holders indicated in the copyright notices indicated in the Third Party Terms. + +Audio/Video Encoders and Decoders: You acknowledge and agree that it is your sole responsibility to obtain any additional third party licenses required to make, have made, use, have used, sell, import, and offer for sale your products or services that include or incorporate any Third Party Components and content relating to audio and/or video encoders and decoders from, including but not limited to, Microsoft, Thomson, Fraunhofer IIS, Sisvel S.p.A., MPEG-LA, and Coding Technologies as NVIDIA does not grant to you under the AGREEMENT any necessary patent or other rights with respect to audio and/or video encoders and decoders. + +2.3. Limited Rights +Your rights in the Licensed Software are limited to those expressly granted under the AGREEMENT and no other licenses are granted whether by implication, estoppel or otherwise. NVIDIA reserves all rights, title and interest in and to the Licensed Software not expressly granted under the AGREEMENT. + +3. CONFIDENTIALITY +Neither party will use the other party’s Confidential Information, except as necessary for the performance of the AGREEMENT, nor will either party disclose such Confidential Information to any third party, except to personnel of NVIDIA and its Affiliates, you, your Enterprise, your Enterprise Contractors, and each party’s legal and financial advisors that have a need to know such Confidential Information for the performance of the AGREEMENT, provided that each such personnel, employee and Contractor is subject to a written agreement that includes confidentiality obligations consistent with those set forth herein. Each party will use all reasonable efforts to maintain the confidentiality of all of the other party’s Confidential Information in its possession or control, but in no event less than the efforts that it ordinarily uses with respect to its own Confidential Information of similar nature and importance. The foregoing obligations will not restrict either party from disclosing the other party’s Confidential Information or the terms and conditions of the AGREEMENT as required under applicable securities regulations or pursuant to the order or requirement of a court, administrative agency, or other governmental body, provided that the party required to make such disclosure (i) gives reasonable notice to the other party to enable it to contest such order or requirement prior to its disclosure (whether through protective orders or otherwise), (ii) uses reasonable effort to obtain confidential treatment or similar protection to the fullest extent possible to avoid such public disclosure, and (iii) discloses only the minimum amount of information necessary to comply with such requirements. + +4. OWNERSHIP +You are not obligated to disclose to NVIDIA any modifications that you, your Enterprise or your Contractors make to the Licensed Software as permitted under the AGREEMENT. As between the parties, all modifications are owned by NVIDIA and licensed to you under the AGREEMENT unless otherwise expressly provided in a Supplement. The Licensed Software and all modifications owned by NVIDIA, and the respective Intellectual Property Rights therein, are and will remain the sole and exclusive property of NVIDIA or its licensors, whether the Licensed Software is separate from or combined with any other products or materials. You shall not engage in any act or omission that would impair NVIDIA’s and/or its licensors’ Intellectual Property Rights in the Licensed Software or any other materials, information, processes or subject matter proprietary to NVIDIA. NVIDIA’s licensors are intended third party beneficiaries with the right to enforce provisions of the AGREEMENT with respect to their Confidential Information and/or Intellectual Property Rights. + +5. FEEDBACK +You have no obligation to provide Feedback to NVIDIA. However, NVIDIA and/or its Affiliates may use and include any Feedback that you provide to improve the Licensed Software or other NVIDIA products, technologies or materials. Accordingly, if you provide Feedback, you agree that NVIDIA and/or its Affiliates, at their option, may, and may permit their licensees, to make, have made, use, have used, reproduce, license, distribute and otherwise commercialize the Feedback in the Licensed Software or in other NVIDIA products, technologies or materials without the payment of any royalties or fees to you. All Feedback becomes the sole property of NVIDIA and may be used in any manner NVIDIA sees fit, and you hereby assign to NVIDIA all of your right, title and interest in and to any Feedback. NVIDIA has no obligation to respond to Feedback or to incorporate Feedback into the Licensed Software. + +6. NO WARRANTIES +THE LICENSED SOFTWARE AND ANY OTHER CONFIDENTIAL INFORMATION AND/OR SERVICES ARE PROVIDED BY NVIDIA “AS IS” AND “WITH ALL FAULTS,” AND NVIDIA EXPRESSLY DISCLAIMS ALL OTHER WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF OPERABILITY, CONDITION, VALUE, ACCURACY OF DATA, OR QUALITY, AS WELL AS ANY WARRANTIES OF MERCHANTABILITY, SYSTEM INTEGRATION, WORKMANSHIP, SUITABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE BY NVIDIA ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE OF TRADE. NVIDIA DOES NOT WARRANT THAT THE LICENSED SOFTWARE OR ANY OTHER CONFIDENTIAL INFORMATION AND/OR SERVICES PROVIDED BY NVIDIA UNDER THE AGREEMENT WILL MEET YOUR REQUIREMENTS OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ALL ERRORS WILL BE CORRECTED. YOU ACKNOWLEDGE THAT NVIDIA’S OBLIGATIONS UNDER THE AGREEMENT ARE FOR THE BENEFIT OF YOU ONLY. Nothing in this warranty section affects any statutory rights of consumers or other recipients to the extent that they cannot be waived or limited by contract under applicable law. + +7. LIMITATION OF LIABILITY +TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA OR ITS LICENSORS SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THE AGREEMENT OR THE USE OR PERFORMANCE OF THE LICENSED SOFTWARE AND ANY OTHER CONFIDENTIAL INFORMATION AND/OR SERVICES PROVIDED BY NVIDIA UNDER THE AGREEMENT, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA’S TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THE AGREEMENT EXCEED THE NET AMOUNTS RECEIVED BY NVIDIA FOR YOUR USE OF THE PARTICULAR LICENSED SOFTWARE DURING THE TWELVE (12) MONTHS BEFORE THE LIABILITY AROSE (or up to US$10.00 if you acquired the Licensed Software for no charge). THE NATURE OF THE LIABILITY, THE NUMBER OF CLAIMS OR SUITS OR THE NUMBER OF PARTIES WITHIN YOUR ENTERPRISE THAT ACCEPTED THE TERMS OF THE AGREEMENT SHALL NOT ENLARGE OR EXTEND THIS LIMIT. THE FOREGOING LIMITATIONS SHALL APPLY REGARDLESS OF WHETHER NVIDIA OR ITS LICENSORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND REGARDLESS OF WHETHER ANY REMEDY FAILS ITS ESSENTIAL PURPOSE. The disclaimers, exclusions and limitations of liability set forth in the AGREEMENT form an essential basis of the bargain between the parties, and, absent any such disclaimers, exclusions or limitations of liability, the provisions of the AGREEMENT, including, without limitation, the economic terms, would be substantially different. + +8. TERM AND TERMINATION. +8.1. AGREEMENT, Licenses and Services +This SLA shall become effective upon the Effective Date, each Supplement upon their acceptance, and both this SLA and Supplements shall continue in effect until your last access or use of the Licensed Software and/or services hereunder, unless earlier terminated as provided in this “Term and Termination” section. Each Licensed Software license ends at the earlier of (a) the expiration of the applicable license term, or (b) termination of such license or the AGREEMENT. Each service ends at the earlier of (x) the expiration of the applicable service term, (y) termination of such service or the AGREEMENT, or (z) expiration or termination of the associated license and no credit or refund will be provided upon the expiration or termination of the associated license for any service fees paid. + +8.2. Termination and Effect of Expiration or Termination +NVIDIA may terminate the AGREEMENT in whole or in part: (i) if you breach any term of the AGREEMENT and fail to cure such breach within thirty (30) days following notice thereof from NVIDIA (or immediately if you violate NVIDIA’s Intellectual Property Rights); (ii) if you become the subject of a voluntary or involuntary petition in bankruptcy or any proceeding relating to insolvency, receivership, liquidation or composition for the benefit of creditors, if that petition or proceeding is not dismissed with prejudice within sixty (60) days after filing, or if you cease to do business; or (iii) if you commence or participate in any legal proceeding against NVIDIA, with respect to the Licensed Software that is the subject of the proceeding during the pendency of such legal proceeding. If you or your authorized NVIDIA reseller fail to pay license fees or service fees when due then NVIDIA may, in its sole discretion, suspend or terminate your license grants, services and any other rights provided under the AGREEMENT for the affected Licensed Software, in addition to any other remedies NVIDIA may have at law or equity. Upon any expiration or termination of the AGREEMENT, a license or a service provided hereunder, (a) any amounts owed to NVIDIA become immediately due and payable, (b) you must promptly discontinue use of the affected Licensed Software and/or service, and (c) you must promptly destroy or return to NVIDIA all copies of the affected Licensed Software and all portions thereof in your possession or control, and each party will promptly destroy or return to the other all of the other party’s Confidential Information within its possession or control. Upon written request, you will certify in writing that you have complied with your obligations under this section. Upon expiration or termination of the AGREEMENT all provisions survive except for the license grant provisions. + +9. CONSENT TO COLLECTION AND USE OF INFORMATION. +You hereby agree and acknowledge that the Software may access, collect non-personally identifiable information about your Enterprise computer systems in order to properly optimize such systems for use with the Software. To the extent that you use the Software, you hereby consent to all of the foregoing, and represent and warrant that you have the right to grant such consent. In addition, you agree that you are solely responsible for maintaining appropriate data backups and system restore points for your Enterprise systems, and that NVIDIA will have no responsibility for any damage or loss to such systems (including loss of data or access) arising from or relating to (a) any changes to the configuration, application settings, environment variables, registry, drivers, BIOS, or other attributes of the systems (or any part of such systems) initiated through the Software; or (b) installation of any Software or third party software patches initiated through the Software. In certain systems you may change your system update preferences by unchecking "Automatically check for updates" in the "Preferences" tab of the control panel for the Software. + +In connection with the receipt of the Licensed Software or services you may receive access to links to third party websites and services and the availability of those links does not imply any endorsement by NVIDIA. NVIDIA encourages you to review the privacy statements on those sites and services that you choose to visit so that you can understand how they may collect, use and share personal information of individuals. NVIDIA is not responsible or liable for: (i) the availability or accuracy of such links; or (ii) the products, services or information available on or through such links; or (iii) the privacy statements or practices of sites and services controlled by other companies or organizations. + +To the extent that you or members of your Enterprise provide to NVIDIA during registration or otherwise personal information, you acknowledge that such information will be collected, used and disclosed by NVIDIA in accordance with NVIDIA's privacy policy, available at URL http://www.nvidia.com/object/privacy_policy.html. + +10. GENERAL. +This SLA, any Supplements incorporated hereto, and Orders constitute the entire agreement of the parties with respect to the subject matter hereto and supersede all prior negotiations, conversations, or discussions between the parties relating to the subject matter hereto, oral or written, and all past dealings or industry custom. Any additional and/or conflicting terms and conditions on purchase order(s) or any other documents issued by you are null, void, and invalid. Any amendment or waiver under the AGREEMENT must be in writing and signed by representatives of both parties. + +The AGREEMENT and the rights and obligations thereunder may not be assigned by you, in whole or in part, including by merger, consolidation, dissolution, operation of law, or any other manner, without written consent of NVIDIA, and any purported assignment in violation of this provision shall be void and of no effect. NVIDIA may assign, delegate or transfer the AGREEMENT and its rights and obligations hereunder, and if to a non-Affiliate you will be notified. + +Each party acknowledges and agrees that the other is an independent contractor in the performance of the AGREEMENT, and each party is solely responsible for all of its employees, agents, contractors, and labor costs and expenses arising in connection therewith. The parties are not partners, joint ventures or otherwise affiliated, and neither has any authority to make any statements, representations or commitments of any kind to bind the other party without prior written consent. + +Neither party will be responsible for any failure or delay in its performance under the AGREEMENT (except for any payment obligations) to the extent due to causes beyond its reasonable control for so long as such force majeure event continues in effect. + +The AGREEMENT will be governed by and construed under the laws of the State of Delaware and the United States without regard to the conflicts of law provisions thereof and without regard to the United Nations Convention on Contracts for the International Sale of Goods. The parties consent to the personal jurisdiction of the federal and state courts located in Santa Clara County, California. You acknowledge and agree that a breach of any of your promises or agreements contained in the AGREEMENT may result in irreparable and continuing injury to NVIDIA for which monetary damages may not be an adequate remedy and therefore NVIDIA is entitled to seek injunctive relief as well as such other and further relief as may be appropriate. If any court of competent jurisdiction determines that any provision of the AGREEMENT is illegal, invalid or unenforceable, the remaining provisions will remain in full force and effect. Unless otherwise specified, remedies are cumulative. + +The Licensed Software has been developed entirely at private expense and is “commercial items” consisting of “commercial computer software” and “commercial computer software documentation” provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government or a U.S. Government subcontractor is subject to the restrictions set forth in the AGREEMENT pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (c)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/manufacturer is NVIDIA, 2701 San Tomas Expressway, Santa Clara, CA 95050. + +You acknowledge that the Licensed Software described under the AGREEMENT is subject to export control under the U.S. Export Administration Regulations (EAR) and economic sanctions regulations administered by the U.S. Department of Treasury’s Office of Foreign Assets Control (OFAC). Therefore, you may not export, reexport or transfer in-country the Licensed Software without first obtaining any license or other approval that may be required by BIS and/or OFAC. You are responsible for any violation of the U.S. or other applicable export control or economic sanctions laws, regulations and requirements related to the Licensed Software. By accepting this SLA, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the Licensed Software. + +Any notice delivered by NVIDIA to you under the AGREEMENT will be delivered via mail, email or fax. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, California 95050, United States of America, Attention: Legal Department. + +11. GLOSSARY OF TERMS +Certain capitalized terms, if not otherwise defined elsewhere in this SLA, shall have the meanings set forth below: +“Affiliate” +“Affiliate” means any legal entity that Owns, is Owned by, or is commonly Owned with a party. “Own” means having more than 50% ownership or the right to direct the management of the entity. +“AGREEMENT” +“AGREEMENT” means this SLA and all associated Supplements entered by the parties referencing this SLA. +“Authorized Users” +“Authorized Users” means your Enterprise individual employees and any of your Enterprise’s Contractors, subject to the terms of the “Enterprise and Contractors Usage” section. +“Confidential Information” +“Confidential Information” means the Licensed Software (unless made publicly available by NVIDIA without confidentiality obligations), and any NVIDIA business, marketing, pricing, research and development, know-how, technical, scientific, financial status, proposed new products or other information disclosed by NVIDIA to you which, at the time of disclosure, is designated in writing as confidential or proprietary (or like written designation), or orally identified as confidential or proprietary or is otherwise reasonably identifiable by parties exercising reasonable business judgment, as confidential. Confidential Information does not and will not include information that: (i) is or becomes generally known to the public through no fault of or breach of the AGREEMENT by the receiving party; (ii) is rightfully known by the receiving party at the time of disclosure without an obligation of confidentiality; (iii) is independently developed by the receiving party without use of the disclosing party’s Confidential Information; or (iv) is rightfully obtained by the receiving party from a third party without restriction on use or disclosure. +“Contractor” +“Contractor” means an individual who works primarily for your Enterprise on a contractor basis from your secure network. means an individual who works primarily for your Enterprise on a contractor basis from your secure network. +“Documentation” +“Documentation” means the NVIDIA documentation made available for use with the Software, including (without limitation) user manuals, datasheets, operations instructions, installation guides, release notes and other materials provided to you under the AGREEMENT. +“Enterprise” +“Enterprise” means you or any company or legal entity for which you accepted the terms of this SLA, and their subsidiaries of which your company or legal entity owns more than fifty percent (50%) of the issued and outstanding equity. +“Feedback” +“Feedback” means any and all suggestions, feature requests, comments or other feedback regarding the Licensed Software, including possible enhancements or modifications thereto. +“Intellectual Property Rights” +“Intellectual Property Rights” means all patent, copyright, trademark, trade secret, trade dress, trade names, utility models, mask work, moral rights, rights of attribution or integrity service marks, master recording and music publishing rights, performance rights, author’s rights, database rights, registered design rights and any applications for the protection or registration of these rights, or other intellectual or industrial property rights or proprietary rights, howsoever arising and in whatever media, whether now known or hereafter devised, whether or not registered, (including all claims and causes of action for infringement, misappropriation or violation and all rights in any registrations and renewals), worldwide and whether existing now or in the future. +“Licensed Software” +“Licensed Software” means Software, Documentation and all modifications owned by NVIDIA. +“Open Source License” +“Open Source License” includes, without limitation, a software license that requires as a condition of use, modification, and/or distribution of such software that the Software be (i) disclosed or distributed in source code form; (ii) be licensed for the purpose of making derivative works; or (iii) be redistributable at no charge. +“Order” +“Order” means a purchase order issued by you, a signed purchase agreement with you, or other ordering document issued by you to NVIDIA or a NVIDIA authorized reseller (including any on-line acceptance process) that references and incorporates the AGREEMENT and is accepted by NVIDIA. +“Software” +“Software” means the NVIDIA software programs licensed to you under the AGREEMENT including, without limitation, libraries, sample code, utility programs and programming code. +“Supplement” +“Supplement” means the additional terms and conditions beyond those stated in this SLA that apply to certain Licensed Software licensed hereunder. +12. TensorRT SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT +TensorRT SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT +The terms set forth in this TensorRT Supplement (“Supplement”) govern your use of the NVIDIA GPU inference engine (the “TensorRT Licensed Software”) under the terms of your software license agreement (“SLA”) as modified by this Supplement. This Supplement is an exhibit to the SLA and is hereby incorporated as an integral part thereto. Capitalized terms used but not defined herein shall have the meaning assigned to them in the SLA. In the event of conflict between the terms in this Supplement and the terms in the SLA, this Supplement shall control. + +12.1. TensorRT DISTRIBUTION +Subject to the terms of the SLA and this Supplement, NVIDIA hereby grants you a non-exclusive, nontransferable license during the applicable license term unless earlier terminated pursuant to the SLA, to distribute the libnvinfer and libnvinfer_plugin libraries when delivered to you as part of the TensorRT Licensed Software in source code form or binary form (but not when provided to you as part of a hardware product), subject to the following: such distribution is solely in binary form to your licensees (“Customers”) only as a component of your own software products having additional material functionality beyond the TensorRT Licensed Software (each, a “Licensee Application"). Subject to the terms and conditions of the SLA and this Supplement, you may further authorize Customers to redistribute the libnvinfer and libnvinfer_plugin libraries as incorporated into a Licensee Application, solely in binary form, provided, however, that you shall require in your agreements with your Customers that their distributions be on terms at least as restrictive as those applicable for your use of such TensorRT Licensed Software within a Licensee Application. The expiration or termination of your licenses to the above described TensorRT Licensed Software under the SLA and this Supplement will not affect rights previously granted by you to recipients that were in compliance with the SLA and this Supplement. + +In addition to the rights above, for parties that are developing software intended solely for use on Jetson development kits or Jetson modules and running Linux for Tegra software the following shall apply: TensorRT Licensed Software licensed hereunder may be distributed in its entirety, as provided by NVIDIA and without separation of its components, for you and/or your licensees to create software development kits for use only on the Jetson platform and running Linux for Tegra software. You shall require in your agreements with your licensees that their distributions be on terms at least as restrictive as those applicable for your distribution of TensorRT Licensed Software as described in this Section 1. + +In addition to the rights above, for parties that are developing software intended solely for use on Jetson development kits or Jetson modules and running Linux for Tegra software the following shall apply: TensorRT Licensed Software licensed hereunder may be distributed in its entirety, as provided by NVIDIA and without separation of its components, for you and/or your licensees to create software development kits for use only on the Jetson platform and running Linux for Tegra software. You shall require in your agreements with your licensees that their distributions be on terms at least as restrictive as those applicable for your distribution of TensorRT Licensed Software as described in this Section 1. + +12.2. LICENSE DURATION +Each TensorRT Licensed Software is licensed to you for an initial duration of one year starting from the date of delivery or download. The licenses granted will automatically renew for successive one year periods, provided that NVIDIA reserves the right to terminate licenses upon ninety days (90) days written notice to you prior to the commencement of a renewal year in addition to the termination rights set forth in the SLA. + +12.3. EXPIRATION OF TERMINATION OF THIS SUPPLEMENT +Your failure to comply with the terms of this Supplement is ground for termination for breach by NVIDIA under the SLA. This Supplement will automatically expire or terminate upon the expiration or termination of your rights to TensorRT Licensed Software under the SLA or this Supplement. + +Notices +Notice +This document is provided for information purposes only and shall not be regarded as a warranty of a certain functionality, condition, or quality of a product. NVIDIA Corporation (“NVIDIA”) makes no representations or warranties, expressed or implied, as to the accuracy or completeness of the information contained in this document and assumes no responsibility for any errors contained herein. NVIDIA shall have no liability for the consequences or use of such information or for any infringement of patents or other rights of third parties that may result from its use. This document is not a commitment to develop, release, or deliver any Material (defined below), code, or functionality. + +NVIDIA reserves the right to make corrections, modifications, enhancements, improvements, and any other changes to this document, at any time without notice. + +Customer should obtain the latest relevant information before placing orders and should verify that such information is current and complete. + +NVIDIA products are sold subject to the NVIDIA standard terms and conditions of sale supplied at the time of order acknowledgement, unless otherwise agreed in an individual sales agreement signed by authorized representatives of NVIDIA and customer (“Terms of Sale”). NVIDIA hereby expressly objects to applying any customer general terms and conditions with regards to the purchase of the NVIDIA product referenced in this document. No contractual obligations are formed either directly or indirectly by this document. + +NVIDIA products are not designed, authorized, or warranted to be suitable for use in medical, military, aircraft, space, or life support equipment, nor in applications where failure or malfunction of the NVIDIA product can reasonably be expected to result in personal injury, death, or property or environmental damage. NVIDIA accepts no liability for inclusion and/or use of NVIDIA products in such equipment or applications and therefore such inclusion and/or use is at customer’s own risk. + +NVIDIA makes no representation or warranty that products based on this document will be suitable for any specified use. Testing of all parameters of each product is not necessarily performed by NVIDIA. It is customer’s sole responsibility to evaluate and determine the applicability of any information contained in this document, ensure the product is suitable and fit for the application planned by customer, and perform the necessary testing for the application in order to avoid a default of the application or the product. Weaknesses in customer’s product designs may affect the quality and reliability of the NVIDIA product and may result in additional or different conditions and/or requirements beyond those contained in this document. NVIDIA accepts no liability related to any default, damage, costs, or problem which may be based on or attributable to: (i) the use of the NVIDIA product in any manner that is contrary to this document or (ii) customer product designs. + +No license, either expressed or implied, is granted under any NVIDIA patent right, copyright, or other NVIDIA intellectual property right under this document. Information published by NVIDIA regarding third-party products or services does not constitute a license from NVIDIA to use such products or services or a warranty or endorsement thereof. Use of such information may require a license from a third party under the patents or other intellectual property rights of the third party, or a license from NVIDIA under the patents or other intellectual property rights of NVIDIA. + +Reproduction of information in this document is permissible only if approved in advance by NVIDIA in writing, reproduced without alteration and in full compliance with all applicable export laws and regulations, and accompanied by all associated conditions, limitations, and notices. + +THIS DOCUMENT AND ALL NVIDIA DESIGN SPECIFICATIONS, REFERENCE BOARDS, FILES, DRAWINGS, DIAGNOSTICS, LISTS, AND OTHER DOCUMENTS (TOGETHER AND SEPARATELY, “MATERIALS”) ARE BEING PROVIDED “AS IS.” NVIDIA MAKES NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL NVIDIA BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF ANY USE OF THIS DOCUMENT, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Notwithstanding any damages that customer might incur for any reason whatsoever, NVIDIA’s aggregate and cumulative liability towards customer for the products described herein shall be limited in accordance with the Terms of Sale for the product. + +VESA DisplayPort +DisplayPort and DisplayPort Compliance Logo, DisplayPort Compliance Logo for Dual-mode Sources, and DisplayPort Compliance Logo for Active Cables are trademarks owned by the Video Electronics Standards Association in the United States and other countries. + +HDMI +HDMI, the HDMI logo, and High-Definition Multimedia Interface are trademarks or registered trademarks of HDMI Licensing LLC. + +ARM +ARM, AMBA and ARM Powered are registered trademarks of ARM Limited. Cortex, MPCore and Mali are trademarks of ARM Limited. All other brands or product names are the property of their respective holders. "ARM" is used to represent ARM Holdings plc; its operating company ARM Limited; and the regional subsidiaries ARM Inc.; ARM KK; ARM Korea Limited.; ARM Taiwan Limited; ARM France SAS; ARM Consulting (Shanghai) Co. Ltd.; ARM Germany GmbH; ARM Embedded Technologies Pvt. Ltd.; ARM Norway, AS and ARM Sweden AB. + +OpenCL +OpenCL is a trademark of Apple Inc. used under license to the Khronos Group Inc. + +Trademarks +NVIDIA, the NVIDIA logo, and cuBLAS, CUDA, CUDA Toolkit, cuDNN, DALI, DIGITS, DGX, DGX-1, DGX-2, DGX Station, DLProf, GPU, JetPack, Jetson, Kepler, Maxwell, NCCL, Nsight Compute, Nsight Systems, NVCaffe, NVIDIA Ampere GPU architecture, NVIDIA Deep Learning SDK, NVIDIA Developer Program, NVIDIA GPU Cloud, NVLink, NVSHMEM, PerfWorks, Pascal, SDK Manager, T4, Tegra, TensorRT, TensorRT Inference Server, Tesla, TF-TRT, Triton Inference Server, Turing, and Volta are trademarks and/or registered trademarks of NVIDIA Corporation in the United States and other countries. Other company and product names may be trademarks of the respective companies with which they are associated. + +Copyright +© 2021 NVIDIA Corporation. All rights reserved. + + +tensorrt_cu12_libs +10.15.1.29 +Other/Proprietary License +https://github.com/nvidia/tensorrt +Abstract +This document is the Software License Agreement (SLA) for NVIDIA TensorRT. This document contains specific license terms and conditions for NVIDIA TensorRT. By accepting this agreement, you agree to comply with all the terms and conditions applicable to the specific product(s) included herein. + +If you are receiving TensorRT under the NVIDIA Prerelease License Agreement (also known as NPLA) or under the NVIDIA Software License Agreement (previously known as the NVIDIA Tegra Software License Agreement), your use of TensorRT is governed by such applicable terms and conditions. All other uses of TensorRT are governed by the terms and conditions of the below license agreement. + +NVIDIA SOFTWARE LICENSE AGREEMENT +Important: READ BEFORE DOWNLOADING, INSTALLING, COPYING OR USING THE LICENSED SOFTWARE +This Software License Agreement ("SLA”), made and entered into as of the time and date of click through action (“Effective Date”),is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs the use of the NVIDIA computer software and the documentation made available for use with such NVIDIA software. By downloading, installing, copying, or otherwise using the NVIDIA software and/or documentation, you agree to be bound by the terms of this SLA. If you do not agree to the terms of this SLA, do not download, install, copy or use the NVIDIA software or documentation. IF YOU ARE ENTERING INTO THIS SLAON BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THE ENTITY TO THIS SLA, IN WHICH CASE “YOU” WILL MEAN THE ENTITY YOU REPRESENT. IF YOU DON’T HAVE SUCH AUTHORITY, OR IF YOU DON’T ACCEPT ALL THE TERMS AND CONDITIONS OF THIS SLA, THEN NVIDIA DOES NOT AGREETO LICENSE THE LICENSED SOFTWARETO YOU, AND YOU MAY NOT DOWNLOAD, INSTALL, COPY OR USE IT. + +Preface +This document is the Software License Agreement (SLA) for NVIDIA TensorRT. This document contains specific license terms and conditions for NVIDIA TensorRT. By accepting this agreement, you agree to comply with all the terms and conditions applicable to the specific product(s) included herein. + +If you are receiving TensorRT under the NVIDIA Prerelease License Agreement (also known as NPLA) or under the NVIDIA Software License Agreement (previously known as the NVIDIA Tegra Software License Agreement), your use of TensorRT is governed by such applicable terms and conditions. All other uses of TensorRT are governed by the terms and conditions of the below license agreement. + +NVIDIA SOFTWARE LICENSE AGREEMENT +Important: READ BEFORE DOWNLOADING, INSTALLING, COPYING OR USING THE LICENSED SOFTWARE +This Software License Agreement ("SLA”), made and entered into as of the time and date of click through action (“Effective Date”),is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs the use of the NVIDIA computer software and the documentation made available for use with such NVIDIA software. By downloading, installing, copying, or otherwise using the NVIDIA software and/or documentation, you agree to be bound by the terms of this SLA. If you do not agree to the terms of this SLA, do not download, install, copy or use the NVIDIA software or documentation. IF YOU ARE ENTERING INTO THIS SLAON BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THE ENTITY TO THIS SLA, IN WHICH CASE “YOU” WILL MEAN THE ENTITY YOU REPRESENT. IF YOU DON’T HAVE SUCH AUTHORITY, OR IF YOU DON’T ACCEPT ALL THE TERMS AND CONDITIONS OF THIS SLA, THEN NVIDIA DOES NOT AGREETO LICENSE THE LICENSED SOFTWARETO YOU, AND YOU MAY NOT DOWNLOAD, INSTALL, COPY OR USE IT. + +1. LICENSE. +1.1. License Grant +Subject to the terms of the AGREEMENT, NVIDIA hereby grants you a non-exclusive, non-transferable license, without the right to sublicense (except as expressly set forth in a Supplement), during the applicable license term unless earlier terminated as provided below, to have Authorized Users install and use the Software, including modifications (if expressly permitted in a Supplement), in accordance with the Documentation. You are only licensed to activate and use Licensed Software for which you a have a valid license, even if during the download or installation you are presented with other product options. No Orders are binding on NVIDIA until accepted by NVIDIA. Your Orders are subject to the AGREEMENT. + +SLA Supplements: Certain Licensed Software licensed under this SLA may be subject to additional terms and conditions that will be presented to you in a Supplement for acceptance prior to the delivery of such Licensed Software under this SLA and the applicable Supplement. Licensed Software will only be delivered to you upon your acceptance of all applicable terms. + +1.2. Limited Purpose Licenses +If your license is provided for one of the purposes indicated below, then notwithstanding contrary terms in License Grant or in a Supplement, such licenses are for internal use and do not include any right or license to sub-license and distribute the Licensed Software or its output in any way in any public release, however limited, and/or in any manner that provides third parties with use of or access to the Licensed Software or its functionality or output, including (but not limited to) external alpha or beta testing or development phases. Further: +Evaluation License. You may use evaluation licenses solely for your internal evaluation of the Licensed Software for broader adoption within your Enterprise or in connection with a NVIDIA product purchase decision, and such licenses have an expiration date as indicated by NVIDIA in its sole discretion (or ninety days from the date of download if no other duration is indicated). +Educational/Academic License. You may use educational/academic licenses solely for educational purposes and all users must be enrolled or employed by an academic institution. If you do not meet NVIDIA’s academic program requirements for educational institutions, you have no rights under this license. +Test/Development License. You may use test/development licenses solely for your internal development, testing and/or debugging of your software applications or for interoperability testing with the Licensed Software, and such licenses have an expiration date as indicated by NVIDIA in its sole discretion (or one year from the date of download if no other duration is indicated). NVIDIA Confidential Information under the AGREEMENT includes output from Licensed Software developer tools identified as “Pro” versions, where the output reveals functionality or performance data pertinent to NVIDIA hardware or software products. +1.3. Pre-Release Licenses +With respect to alpha, beta, preview, and other pre-release Software and Documentation (“Pre-Release Licensed Software”) delivered to you under the AGREEMENT you acknowledge and agree that such Pre-Release Licensed Software (i) may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, accessibility, availability, and reliability standards relative to commercially provided NVIDIA software and documentation, and (ii) use of such Pre-Release Licensed Software may result in unexpected results, loss of data, project delays or other unpredictable damage or loss. THEREFORE, PRE-RELEASE LICENSED SOFTWARE IS NOT INTENDED FOR USE, AND SHOULD NOT BE USED, IN PRODUCTION OR BUSINESS-CRITICAL SYSTEMS. NVIDIA has no obligation to make available a commercial version of any Pre-Release Licensed Software and NVIDIA has the right to abandon development of Pre-Release Licensed Software at any time without liability. + +1.4. Enterprise and Contractor Usage +You may allow your Enterprise employees and Contractors to access and use the Licensed Software pursuant to the terms of the AGREEMENT solely to perform work on your behalf, provided further that with respect to Contractors: (i) you obtain a written agreement from each Contractor which contains terms and obligations with respect to access to and use of Licensed Software no less protective of NVIDIA than those set forth in the AGREEMENT, and (ii) such Contractor’s access and use expressly excludes any sublicensing or distribution rights for the Licensed Software. You are responsible for the compliance with the terms and conditions of the AGREEMENT by your Enterprise and Contractors. Any act or omission that, if committed by you, would constitute a breach of the AGREEMENT shall be deemed to constitute a breach of the AGREEMENT if committed by your Enterprise or Contractors. + +1.5. Services +Except as expressly indicated in an Order, NVIDIA is under no obligation to provide support for the Licensed Software or to provide any patches, maintenance, updates or upgrades under the AGREEMENT. Unless patches, maintenance, updates or upgrades are provided with their separate governing terms and conditions, they constitute Licensed Software licensed to you under the AGREEMENT. + +2. LIMITATIONS. +2.1. License Restrictions +Except as expressly authorized in the AGREEMENT, you agree that you will not (nor authorize third parties to): (i) copy and use Software that was licensed to you for use in one or more NVIDIA hardware products in other unlicensed products (provided that copies solely for backup purposes are allowed); (ii) reverse engineer, decompile, disassemble (except to the extent applicable laws specifically require that such activities be permitted) or attempt to derive the source code, underlying ideas, algorithm or structure of Software provided to you in object code form; (iii) sell, transfer, assign, distribute, rent, loan, lease, sublicense or otherwise make available the Licensed Software or its functionality to third parties (a) as an application services provider or service bureau, (b) by operating hosted/virtual system environments, (c) by hosting, time sharing or providing any other type of services, or (d) otherwise by means of the internet; (iv) modify, translate or otherwise create any derivative works of any Licensed Software; (v) remove, alter, cover or obscure any proprietary notice that appears on or with the Licensed Software or any copies thereof; (vi) use the Licensed Software, or allow its use, transfer, transmission or export in violation of any applicable export control laws, rules or regulations; (vii) distribute, permit access to, or sublicense the Licensed Software as a stand-alone product; (viii) bypass, disable, circumvent or remove any form of copy protection, encryption, security or digital rights management or authentication mechanism used by NVIDIA in connection with the Licensed Software, or use the Licensed Software together with any authorization code, serial number, or other copy protection device not supplied by NVIDIA directly or through an authorized reseller; (ix) use the Licensed Software for the purpose of developing competing products or technologies or assisting a third party in such activities; (x) use the Licensed Software with any system or application where the use or failure of such system or application can reasonably be expected to threaten or result in personal injury, death, or catastrophic loss including, without limitation, use in connection with any nuclear, avionics, navigation, military, medical, life support or other life critical application (“Critical Applications”), unless the parties have entered into a Critical Applications agreement; (xi) distribute any modification or derivative work you make to the Licensed Software under or by reference to the same name as used by NVIDIA; or (xii) use the Licensed Software in any manner that would cause the Licensed Software to become subject to an Open Source License. Nothing in the AGREEMENT shall be construed to give you a right to use, or otherwise obtain access to, any source code from which the Software or any portion thereof is compiled or interpreted. You acknowledge that NVIDIA does not design, test, manufacture or certify the Licensed Software for use in the context of a Critical Application and NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such use. You agree to defend, indemnify and hold harmless NVIDIA and its Affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney’s fees and costs incident to establishing the right of indemnification) arising out of or related to you and your Enterprise, and their respective employees, contractors, agents, distributors, resellers, end users, officers and directors use of Licensed Software outside of the scope of the AGREEMENT or any other breach of the terms of the AGREEMENT. + +2.2. Third Party License Obligations +You acknowledge and agree that the Licensed Software may include or incorporate third party technology (collectively “Third Party Components”), which is provided for use in or with the Software and not otherwise used separately. If the Licensed Software includes or incorporates Third Party Components, then the third-party pass-through terms and conditions (“Third Party Terms”) for the particular Third Party Component will be bundled with the Software or otherwise made available online as indicated by NVIDIA and will be incorporated by reference into the AGREEMENT. In the event of any conflict between the terms in the AGREEMENT and the Third Party Terms, the Third Party Terms shall govern. Copyright to Third Party Components are held by the copyright holders indicated in the copyright notices indicated in the Third Party Terms. + +Audio/Video Encoders and Decoders: You acknowledge and agree that it is your sole responsibility to obtain any additional third party licenses required to make, have made, use, have used, sell, import, and offer for sale your products or services that include or incorporate any Third Party Components and content relating to audio and/or video encoders and decoders from, including but not limited to, Microsoft, Thomson, Fraunhofer IIS, Sisvel S.p.A., MPEG-LA, and Coding Technologies as NVIDIA does not grant to you under the AGREEMENT any necessary patent or other rights with respect to audio and/or video encoders and decoders. + +2.3. Limited Rights +Your rights in the Licensed Software are limited to those expressly granted under the AGREEMENT and no other licenses are granted whether by implication, estoppel or otherwise. NVIDIA reserves all rights, title and interest in and to the Licensed Software not expressly granted under the AGREEMENT. + +3. CONFIDENTIALITY +Neither party will use the other party’s Confidential Information, except as necessary for the performance of the AGREEMENT, nor will either party disclose such Confidential Information to any third party, except to personnel of NVIDIA and its Affiliates, you, your Enterprise, your Enterprise Contractors, and each party’s legal and financial advisors that have a need to know such Confidential Information for the performance of the AGREEMENT, provided that each such personnel, employee and Contractor is subject to a written agreement that includes confidentiality obligations consistent with those set forth herein. Each party will use all reasonable efforts to maintain the confidentiality of all of the other party’s Confidential Information in its possession or control, but in no event less than the efforts that it ordinarily uses with respect to its own Confidential Information of similar nature and importance. The foregoing obligations will not restrict either party from disclosing the other party’s Confidential Information or the terms and conditions of the AGREEMENT as required under applicable securities regulations or pursuant to the order or requirement of a court, administrative agency, or other governmental body, provided that the party required to make such disclosure (i) gives reasonable notice to the other party to enable it to contest such order or requirement prior to its disclosure (whether through protective orders or otherwise), (ii) uses reasonable effort to obtain confidential treatment or similar protection to the fullest extent possible to avoid such public disclosure, and (iii) discloses only the minimum amount of information necessary to comply with such requirements. + +4. OWNERSHIP +You are not obligated to disclose to NVIDIA any modifications that you, your Enterprise or your Contractors make to the Licensed Software as permitted under the AGREEMENT. As between the parties, all modifications are owned by NVIDIA and licensed to you under the AGREEMENT unless otherwise expressly provided in a Supplement. The Licensed Software and all modifications owned by NVIDIA, and the respective Intellectual Property Rights therein, are and will remain the sole and exclusive property of NVIDIA or its licensors, whether the Licensed Software is separate from or combined with any other products or materials. You shall not engage in any act or omission that would impair NVIDIA’s and/or its licensors’ Intellectual Property Rights in the Licensed Software or any other materials, information, processes or subject matter proprietary to NVIDIA. NVIDIA’s licensors are intended third party beneficiaries with the right to enforce provisions of the AGREEMENT with respect to their Confidential Information and/or Intellectual Property Rights. + +5. FEEDBACK +You have no obligation to provide Feedback to NVIDIA. However, NVIDIA and/or its Affiliates may use and include any Feedback that you provide to improve the Licensed Software or other NVIDIA products, technologies or materials. Accordingly, if you provide Feedback, you agree that NVIDIA and/or its Affiliates, at their option, may, and may permit their licensees, to make, have made, use, have used, reproduce, license, distribute and otherwise commercialize the Feedback in the Licensed Software or in other NVIDIA products, technologies or materials without the payment of any royalties or fees to you. All Feedback becomes the sole property of NVIDIA and may be used in any manner NVIDIA sees fit, and you hereby assign to NVIDIA all of your right, title and interest in and to any Feedback. NVIDIA has no obligation to respond to Feedback or to incorporate Feedback into the Licensed Software. + +6. NO WARRANTIES +THE LICENSED SOFTWARE AND ANY OTHER CONFIDENTIAL INFORMATION AND/OR SERVICES ARE PROVIDED BY NVIDIA “AS IS” AND “WITH ALL FAULTS,” AND NVIDIA EXPRESSLY DISCLAIMS ALL OTHER WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF OPERABILITY, CONDITION, VALUE, ACCURACY OF DATA, OR QUALITY, AS WELL AS ANY WARRANTIES OF MERCHANTABILITY, SYSTEM INTEGRATION, WORKMANSHIP, SUITABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE BY NVIDIA ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE OF TRADE. NVIDIA DOES NOT WARRANT THAT THE LICENSED SOFTWARE OR ANY OTHER CONFIDENTIAL INFORMATION AND/OR SERVICES PROVIDED BY NVIDIA UNDER THE AGREEMENT WILL MEET YOUR REQUIREMENTS OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ALL ERRORS WILL BE CORRECTED. YOU ACKNOWLEDGE THAT NVIDIA’S OBLIGATIONS UNDER THE AGREEMENT ARE FOR THE BENEFIT OF YOU ONLY. Nothing in this warranty section affects any statutory rights of consumers or other recipients to the extent that they cannot be waived or limited by contract under applicable law. + +7. LIMITATION OF LIABILITY +TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA OR ITS LICENSORS SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THE AGREEMENT OR THE USE OR PERFORMANCE OF THE LICENSED SOFTWARE AND ANY OTHER CONFIDENTIAL INFORMATION AND/OR SERVICES PROVIDED BY NVIDIA UNDER THE AGREEMENT, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA’S TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THE AGREEMENT EXCEED THE NET AMOUNTS RECEIVED BY NVIDIA FOR YOUR USE OF THE PARTICULAR LICENSED SOFTWARE DURING THE TWELVE (12) MONTHS BEFORE THE LIABILITY AROSE (or up to US$10.00 if you acquired the Licensed Software for no charge). THE NATURE OF THE LIABILITY, THE NUMBER OF CLAIMS OR SUITS OR THE NUMBER OF PARTIES WITHIN YOUR ENTERPRISE THAT ACCEPTED THE TERMS OF THE AGREEMENT SHALL NOT ENLARGE OR EXTEND THIS LIMIT. THE FOREGOING LIMITATIONS SHALL APPLY REGARDLESS OF WHETHER NVIDIA OR ITS LICENSORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND REGARDLESS OF WHETHER ANY REMEDY FAILS ITS ESSENTIAL PURPOSE. The disclaimers, exclusions and limitations of liability set forth in the AGREEMENT form an essential basis of the bargain between the parties, and, absent any such disclaimers, exclusions or limitations of liability, the provisions of the AGREEMENT, including, without limitation, the economic terms, would be substantially different. + +8. TERM AND TERMINATION. +8.1. AGREEMENT, Licenses and Services +This SLA shall become effective upon the Effective Date, each Supplement upon their acceptance, and both this SLA and Supplements shall continue in effect until your last access or use of the Licensed Software and/or services hereunder, unless earlier terminated as provided in this “Term and Termination” section. Each Licensed Software license ends at the earlier of (a) the expiration of the applicable license term, or (b) termination of such license or the AGREEMENT. Each service ends at the earlier of (x) the expiration of the applicable service term, (y) termination of such service or the AGREEMENT, or (z) expiration or termination of the associated license and no credit or refund will be provided upon the expiration or termination of the associated license for any service fees paid. + +8.2. Termination and Effect of Expiration or Termination +NVIDIA may terminate the AGREEMENT in whole or in part: (i) if you breach any term of the AGREEMENT and fail to cure such breach within thirty (30) days following notice thereof from NVIDIA (or immediately if you violate NVIDIA’s Intellectual Property Rights); (ii) if you become the subject of a voluntary or involuntary petition in bankruptcy or any proceeding relating to insolvency, receivership, liquidation or composition for the benefit of creditors, if that petition or proceeding is not dismissed with prejudice within sixty (60) days after filing, or if you cease to do business; or (iii) if you commence or participate in any legal proceeding against NVIDIA, with respect to the Licensed Software that is the subject of the proceeding during the pendency of such legal proceeding. If you or your authorized NVIDIA reseller fail to pay license fees or service fees when due then NVIDIA may, in its sole discretion, suspend or terminate your license grants, services and any other rights provided under the AGREEMENT for the affected Licensed Software, in addition to any other remedies NVIDIA may have at law or equity. Upon any expiration or termination of the AGREEMENT, a license or a service provided hereunder, (a) any amounts owed to NVIDIA become immediately due and payable, (b) you must promptly discontinue use of the affected Licensed Software and/or service, and (c) you must promptly destroy or return to NVIDIA all copies of the affected Licensed Software and all portions thereof in your possession or control, and each party will promptly destroy or return to the other all of the other party’s Confidential Information within its possession or control. Upon written request, you will certify in writing that you have complied with your obligations under this section. Upon expiration or termination of the AGREEMENT all provisions survive except for the license grant provisions. + +9. CONSENT TO COLLECTION AND USE OF INFORMATION. +You hereby agree and acknowledge that the Software may access, collect non-personally identifiable information about your Enterprise computer systems in order to properly optimize such systems for use with the Software. To the extent that you use the Software, you hereby consent to all of the foregoing, and represent and warrant that you have the right to grant such consent. In addition, you agree that you are solely responsible for maintaining appropriate data backups and system restore points for your Enterprise systems, and that NVIDIA will have no responsibility for any damage or loss to such systems (including loss of data or access) arising from or relating to (a) any changes to the configuration, application settings, environment variables, registry, drivers, BIOS, or other attributes of the systems (or any part of such systems) initiated through the Software; or (b) installation of any Software or third party software patches initiated through the Software. In certain systems you may change your system update preferences by unchecking "Automatically check for updates" in the "Preferences" tab of the control panel for the Software. + +In connection with the receipt of the Licensed Software or services you may receive access to links to third party websites and services and the availability of those links does not imply any endorsement by NVIDIA. NVIDIA encourages you to review the privacy statements on those sites and services that you choose to visit so that you can understand how they may collect, use and share personal information of individuals. NVIDIA is not responsible or liable for: (i) the availability or accuracy of such links; or (ii) the products, services or information available on or through such links; or (iii) the privacy statements or practices of sites and services controlled by other companies or organizations. + +To the extent that you or members of your Enterprise provide to NVIDIA during registration or otherwise personal information, you acknowledge that such information will be collected, used and disclosed by NVIDIA in accordance with NVIDIA's privacy policy, available at URL http://www.nvidia.com/object/privacy_policy.html. + +10. GENERAL. +This SLA, any Supplements incorporated hereto, and Orders constitute the entire agreement of the parties with respect to the subject matter hereto and supersede all prior negotiations, conversations, or discussions between the parties relating to the subject matter hereto, oral or written, and all past dealings or industry custom. Any additional and/or conflicting terms and conditions on purchase order(s) or any other documents issued by you are null, void, and invalid. Any amendment or waiver under the AGREEMENT must be in writing and signed by representatives of both parties. + +The AGREEMENT and the rights and obligations thereunder may not be assigned by you, in whole or in part, including by merger, consolidation, dissolution, operation of law, or any other manner, without written consent of NVIDIA, and any purported assignment in violation of this provision shall be void and of no effect. NVIDIA may assign, delegate or transfer the AGREEMENT and its rights and obligations hereunder, and if to a non-Affiliate you will be notified. + +Each party acknowledges and agrees that the other is an independent contractor in the performance of the AGREEMENT, and each party is solely responsible for all of its employees, agents, contractors, and labor costs and expenses arising in connection therewith. The parties are not partners, joint ventures or otherwise affiliated, and neither has any authority to make any statements, representations or commitments of any kind to bind the other party without prior written consent. + +Neither party will be responsible for any failure or delay in its performance under the AGREEMENT (except for any payment obligations) to the extent due to causes beyond its reasonable control for so long as such force majeure event continues in effect. + +The AGREEMENT will be governed by and construed under the laws of the State of Delaware and the United States without regard to the conflicts of law provisions thereof and without regard to the United Nations Convention on Contracts for the International Sale of Goods. The parties consent to the personal jurisdiction of the federal and state courts located in Santa Clara County, California. You acknowledge and agree that a breach of any of your promises or agreements contained in the AGREEMENT may result in irreparable and continuing injury to NVIDIA for which monetary damages may not be an adequate remedy and therefore NVIDIA is entitled to seek injunctive relief as well as such other and further relief as may be appropriate. If any court of competent jurisdiction determines that any provision of the AGREEMENT is illegal, invalid or unenforceable, the remaining provisions will remain in full force and effect. Unless otherwise specified, remedies are cumulative. + +The Licensed Software has been developed entirely at private expense and is “commercial items” consisting of “commercial computer software” and “commercial computer software documentation” provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government or a U.S. Government subcontractor is subject to the restrictions set forth in the AGREEMENT pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (c)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/manufacturer is NVIDIA, 2701 San Tomas Expressway, Santa Clara, CA 95050. + +You acknowledge that the Licensed Software described under the AGREEMENT is subject to export control under the U.S. Export Administration Regulations (EAR) and economic sanctions regulations administered by the U.S. Department of Treasury’s Office of Foreign Assets Control (OFAC). Therefore, you may not export, reexport or transfer in-country the Licensed Software without first obtaining any license or other approval that may be required by BIS and/or OFAC. You are responsible for any violation of the U.S. or other applicable export control or economic sanctions laws, regulations and requirements related to the Licensed Software. By accepting this SLA, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the Licensed Software. + +Any notice delivered by NVIDIA to you under the AGREEMENT will be delivered via mail, email or fax. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, California 95050, United States of America, Attention: Legal Department. + +11. GLOSSARY OF TERMS +Certain capitalized terms, if not otherwise defined elsewhere in this SLA, shall have the meanings set forth below: +“Affiliate” +“Affiliate” means any legal entity that Owns, is Owned by, or is commonly Owned with a party. “Own” means having more than 50% ownership or the right to direct the management of the entity. +“AGREEMENT” +“AGREEMENT” means this SLA and all associated Supplements entered by the parties referencing this SLA. +“Authorized Users” +“Authorized Users” means your Enterprise individual employees and any of your Enterprise’s Contractors, subject to the terms of the “Enterprise and Contractors Usage” section. +“Confidential Information” +“Confidential Information” means the Licensed Software (unless made publicly available by NVIDIA without confidentiality obligations), and any NVIDIA business, marketing, pricing, research and development, know-how, technical, scientific, financial status, proposed new products or other information disclosed by NVIDIA to you which, at the time of disclosure, is designated in writing as confidential or proprietary (or like written designation), or orally identified as confidential or proprietary or is otherwise reasonably identifiable by parties exercising reasonable business judgment, as confidential. Confidential Information does not and will not include information that: (i) is or becomes generally known to the public through no fault of or breach of the AGREEMENT by the receiving party; (ii) is rightfully known by the receiving party at the time of disclosure without an obligation of confidentiality; (iii) is independently developed by the receiving party without use of the disclosing party’s Confidential Information; or (iv) is rightfully obtained by the receiving party from a third party without restriction on use or disclosure. +“Contractor” +“Contractor” means an individual who works primarily for your Enterprise on a contractor basis from your secure network. means an individual who works primarily for your Enterprise on a contractor basis from your secure network. +“Documentation” +“Documentation” means the NVIDIA documentation made available for use with the Software, including (without limitation) user manuals, datasheets, operations instructions, installation guides, release notes and other materials provided to you under the AGREEMENT. +“Enterprise” +“Enterprise” means you or any company or legal entity for which you accepted the terms of this SLA, and their subsidiaries of which your company or legal entity owns more than fifty percent (50%) of the issued and outstanding equity. +“Feedback” +“Feedback” means any and all suggestions, feature requests, comments or other feedback regarding the Licensed Software, including possible enhancements or modifications thereto. +“Intellectual Property Rights” +“Intellectual Property Rights” means all patent, copyright, trademark, trade secret, trade dress, trade names, utility models, mask work, moral rights, rights of attribution or integrity service marks, master recording and music publishing rights, performance rights, author’s rights, database rights, registered design rights and any applications for the protection or registration of these rights, or other intellectual or industrial property rights or proprietary rights, howsoever arising and in whatever media, whether now known or hereafter devised, whether or not registered, (including all claims and causes of action for infringement, misappropriation or violation and all rights in any registrations and renewals), worldwide and whether existing now or in the future. +“Licensed Software” +“Licensed Software” means Software, Documentation and all modifications owned by NVIDIA. +“Open Source License” +“Open Source License” includes, without limitation, a software license that requires as a condition of use, modification, and/or distribution of such software that the Software be (i) disclosed or distributed in source code form; (ii) be licensed for the purpose of making derivative works; or (iii) be redistributable at no charge. +“Order” +“Order” means a purchase order issued by you, a signed purchase agreement with you, or other ordering document issued by you to NVIDIA or a NVIDIA authorized reseller (including any on-line acceptance process) that references and incorporates the AGREEMENT and is accepted by NVIDIA. +“Software” +“Software” means the NVIDIA software programs licensed to you under the AGREEMENT including, without limitation, libraries, sample code, utility programs and programming code. +“Supplement” +“Supplement” means the additional terms and conditions beyond those stated in this SLA that apply to certain Licensed Software licensed hereunder. +12. TensorRT SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT +TensorRT SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT +The terms set forth in this TensorRT Supplement (“Supplement”) govern your use of the NVIDIA GPU inference engine (the “TensorRT Licensed Software”) under the terms of your software license agreement (“SLA”) as modified by this Supplement. This Supplement is an exhibit to the SLA and is hereby incorporated as an integral part thereto. Capitalized terms used but not defined herein shall have the meaning assigned to them in the SLA. In the event of conflict between the terms in this Supplement and the terms in the SLA, this Supplement shall control. + +12.1. TensorRT DISTRIBUTION +Subject to the terms of the SLA and this Supplement, NVIDIA hereby grants you a non-exclusive, nontransferable license during the applicable license term unless earlier terminated pursuant to the SLA, to distribute the libnvinfer and libnvinfer_plugin libraries when delivered to you as part of the TensorRT Licensed Software in source code form or binary form (but not when provided to you as part of a hardware product), subject to the following: such distribution is solely in binary form to your licensees (“Customers”) only as a component of your own software products having additional material functionality beyond the TensorRT Licensed Software (each, a “Licensee Application"). Subject to the terms and conditions of the SLA and this Supplement, you may further authorize Customers to redistribute the libnvinfer and libnvinfer_plugin libraries as incorporated into a Licensee Application, solely in binary form, provided, however, that you shall require in your agreements with your Customers that their distributions be on terms at least as restrictive as those applicable for your use of such TensorRT Licensed Software within a Licensee Application. The expiration or termination of your licenses to the above described TensorRT Licensed Software under the SLA and this Supplement will not affect rights previously granted by you to recipients that were in compliance with the SLA and this Supplement. + +In addition to the rights above, for parties that are developing software intended solely for use on Jetson development kits or Jetson modules and running Linux for Tegra software the following shall apply: TensorRT Licensed Software licensed hereunder may be distributed in its entirety, as provided by NVIDIA and without separation of its components, for you and/or your licensees to create software development kits for use only on the Jetson platform and running Linux for Tegra software. You shall require in your agreements with your licensees that their distributions be on terms at least as restrictive as those applicable for your distribution of TensorRT Licensed Software as described in this Section 1. + +In addition to the rights above, for parties that are developing software intended solely for use on Jetson development kits or Jetson modules and running Linux for Tegra software the following shall apply: TensorRT Licensed Software licensed hereunder may be distributed in its entirety, as provided by NVIDIA and without separation of its components, for you and/or your licensees to create software development kits for use only on the Jetson platform and running Linux for Tegra software. You shall require in your agreements with your licensees that their distributions be on terms at least as restrictive as those applicable for your distribution of TensorRT Licensed Software as described in this Section 1. + +12.2. LICENSE DURATION +Each TensorRT Licensed Software is licensed to you for an initial duration of one year starting from the date of delivery or download. The licenses granted will automatically renew for successive one year periods, provided that NVIDIA reserves the right to terminate licenses upon ninety days (90) days written notice to you prior to the commencement of a renewal year in addition to the termination rights set forth in the SLA. + +12.3. EXPIRATION OF TERMINATION OF THIS SUPPLEMENT +Your failure to comply with the terms of this Supplement is ground for termination for breach by NVIDIA under the SLA. This Supplement will automatically expire or terminate upon the expiration or termination of your rights to TensorRT Licensed Software under the SLA or this Supplement. + +Notices +Notice +This document is provided for information purposes only and shall not be regarded as a warranty of a certain functionality, condition, or quality of a product. NVIDIA Corporation (“NVIDIA”) makes no representations or warranties, expressed or implied, as to the accuracy or completeness of the information contained in this document and assumes no responsibility for any errors contained herein. NVIDIA shall have no liability for the consequences or use of such information or for any infringement of patents or other rights of third parties that may result from its use. This document is not a commitment to develop, release, or deliver any Material (defined below), code, or functionality. + +NVIDIA reserves the right to make corrections, modifications, enhancements, improvements, and any other changes to this document, at any time without notice. + +Customer should obtain the latest relevant information before placing orders and should verify that such information is current and complete. + +NVIDIA products are sold subject to the NVIDIA standard terms and conditions of sale supplied at the time of order acknowledgement, unless otherwise agreed in an individual sales agreement signed by authorized representatives of NVIDIA and customer (“Terms of Sale”). NVIDIA hereby expressly objects to applying any customer general terms and conditions with regards to the purchase of the NVIDIA product referenced in this document. No contractual obligations are formed either directly or indirectly by this document. + +NVIDIA products are not designed, authorized, or warranted to be suitable for use in medical, military, aircraft, space, or life support equipment, nor in applications where failure or malfunction of the NVIDIA product can reasonably be expected to result in personal injury, death, or property or environmental damage. NVIDIA accepts no liability for inclusion and/or use of NVIDIA products in such equipment or applications and therefore such inclusion and/or use is at customer’s own risk. + +NVIDIA makes no representation or warranty that products based on this document will be suitable for any specified use. Testing of all parameters of each product is not necessarily performed by NVIDIA. It is customer’s sole responsibility to evaluate and determine the applicability of any information contained in this document, ensure the product is suitable and fit for the application planned by customer, and perform the necessary testing for the application in order to avoid a default of the application or the product. Weaknesses in customer’s product designs may affect the quality and reliability of the NVIDIA product and may result in additional or different conditions and/or requirements beyond those contained in this document. NVIDIA accepts no liability related to any default, damage, costs, or problem which may be based on or attributable to: (i) the use of the NVIDIA product in any manner that is contrary to this document or (ii) customer product designs. + +No license, either expressed or implied, is granted under any NVIDIA patent right, copyright, or other NVIDIA intellectual property right under this document. Information published by NVIDIA regarding third-party products or services does not constitute a license from NVIDIA to use such products or services or a warranty or endorsement thereof. Use of such information may require a license from a third party under the patents or other intellectual property rights of the third party, or a license from NVIDIA under the patents or other intellectual property rights of NVIDIA. + +Reproduction of information in this document is permissible only if approved in advance by NVIDIA in writing, reproduced without alteration and in full compliance with all applicable export laws and regulations, and accompanied by all associated conditions, limitations, and notices. + +THIS DOCUMENT AND ALL NVIDIA DESIGN SPECIFICATIONS, REFERENCE BOARDS, FILES, DRAWINGS, DIAGNOSTICS, LISTS, AND OTHER DOCUMENTS (TOGETHER AND SEPARATELY, “MATERIALS”) ARE BEING PROVIDED “AS IS.” NVIDIA MAKES NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL NVIDIA BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF ANY USE OF THIS DOCUMENT, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Notwithstanding any damages that customer might incur for any reason whatsoever, NVIDIA’s aggregate and cumulative liability towards customer for the products described herein shall be limited in accordance with the Terms of Sale for the product. + +VESA DisplayPort +DisplayPort and DisplayPort Compliance Logo, DisplayPort Compliance Logo for Dual-mode Sources, and DisplayPort Compliance Logo for Active Cables are trademarks owned by the Video Electronics Standards Association in the United States and other countries. + +HDMI +HDMI, the HDMI logo, and High-Definition Multimedia Interface are trademarks or registered trademarks of HDMI Licensing LLC. + +ARM +ARM, AMBA and ARM Powered are registered trademarks of ARM Limited. Cortex, MPCore and Mali are trademarks of ARM Limited. All other brands or product names are the property of their respective holders. "ARM" is used to represent ARM Holdings plc; its operating company ARM Limited; and the regional subsidiaries ARM Inc.; ARM KK; ARM Korea Limited.; ARM Taiwan Limited; ARM France SAS; ARM Consulting (Shanghai) Co. Ltd.; ARM Germany GmbH; ARM Embedded Technologies Pvt. Ltd.; ARM Norway, AS and ARM Sweden AB. + +OpenCL +OpenCL is a trademark of Apple Inc. used under license to the Khronos Group Inc. + +Trademarks +NVIDIA, the NVIDIA logo, and cuBLAS, CUDA, CUDA Toolkit, cuDNN, DALI, DIGITS, DGX, DGX-1, DGX-2, DGX Station, DLProf, GPU, JetPack, Jetson, Kepler, Maxwell, NCCL, Nsight Compute, Nsight Systems, NVCaffe, NVIDIA Ampere GPU architecture, NVIDIA Deep Learning SDK, NVIDIA Developer Program, NVIDIA GPU Cloud, NVLink, NVSHMEM, PerfWorks, Pascal, SDK Manager, T4, Tegra, TensorRT, TensorRT Inference Server, Tesla, TF-TRT, Triton Inference Server, Turing, and Volta are trademarks and/or registered trademarks of NVIDIA Corporation in the United States and other countries. Other company and product names may be trademarks of the respective companies with which they are associated. + +Copyright +© 2021 NVIDIA Corporation. All rights reserved. + + +termcolor +3.2.0 +MIT +https://github.com/termcolor/termcolor +Copyright (c) 2008-2011 Volvox Development Team + +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. + + +torch +2.9.0+cu128 +BSD-3-Clause +https://pytorch.org +From PyTorch: + +Copyright (c) 2016- Facebook, Inc (Adam Paszke) +Copyright (c) 2014- Facebook, Inc (Soumith Chintala) +Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert) +Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu) +Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu) +Copyright (c) 2011-2013 NYU (Clement Farabet) +Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston) +Copyright (c) 2006 Idiap Research Institute (Samy Bengio) +Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz) + +From Caffe2: + +Copyright (c) 2016-present, Facebook Inc. All rights reserved. + +All contributions by Facebook: +Copyright (c) 2016 Facebook Inc. + +All contributions by Google: +Copyright (c) 2015 Google Inc. +All rights reserved. + +All contributions by Yangqing Jia: +Copyright (c) 2015 Yangqing Jia +All rights reserved. + +All contributions by Kakao Brain: +Copyright 2019-2020 Kakao Brain + +All contributions by Cruise LLC: +Copyright (c) 2022 Cruise LLC. +All rights reserved. + +All contributions by Tri Dao: +Copyright (c) 2024 Tri Dao. +All rights reserved. + +All contributions by Arm: +Copyright (c) 2021, 2023-2024 Arm Limited and/or its affiliates + +All contributions from Caffe: +Copyright(c) 2013, 2014, 2015, the respective contributors +All rights reserved. + +All other contributions: +Copyright(c) 2015, 2016 the respective contributors +All rights reserved. + +Caffe2 uses a copyright model similar to Caffe: each contributor holds +copyright over their contributions to Caffe2. The project versioning records +all such contribution and copyright details. If a contributor wants to further +mark their specific copyright on a particular contribution, they should +indicate their copyright solely in the commit message of the change when it is +committed. + +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. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories America + and IDIAP Research Institute 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. + + +The PyTorch repository and source distributions bundle several libraries that are +compatibly licensed. We list these here. + +Name: DCGM +License: Apache-2.0 +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/LICENSE + +Name: FP16 +License: MIT +Files: /pytorch/third_party/FP16 + For details, see the files concatenated below: /pytorch/third_party/FP16/LICENSE + +Name: FXdiv +License: MIT +Files: /pytorch/third_party/FXdiv + For details, see the files concatenated below: /pytorch/third_party/FXdiv/LICENSE + +Name: NNPACK +License: BSD-2-Clause +Files: /pytorch/third_party/NNPACK + For details, see the files concatenated below: /pytorch/third_party/NNPACK/LICENSE + +Name: NVTX +License: Apache-2.0 with exception +Files: /pytorch/third_party/NVTX + For details, see the files concatenated below: /pytorch/third_party/NVTX/LICENSE.txt + +Name: VulkanMemoryAllocator +License: MIT +Files: /pytorch/third_party/VulkanMemoryAllocator + For details, see the files concatenated below: /pytorch/third_party/VulkanMemoryAllocator/LICENSE.txt + +Name: XNNPACK +License: BSD-3-Clause +Files: /pytorch/third_party/XNNPACK + For details, see the files concatenated below: /pytorch/third_party/XNNPACK/LICENSE + +Name: aiter +License: MIT +Files: /pytorch/third_party/aiter + For details, see the files concatenated below: /pytorch/third_party/aiter/LICENSE + +Name: benchmark +License: Apache-2.0 +Files: /pytorch/third_party/benchmark, + /pytorch/third_party/opentelemetry-cpp/third_party/benchmark, + /pytorch/third_party/protobuf/third_party/benchmark + For details, see the files concatenated below: /pytorch/third_party/benchmark/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/benchmark/LICENSE, + /pytorch/third_party/protobuf/third_party/benchmark/LICENSE + +Name: boost-vcpkg-helpers +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/boost-vcpkg-helpers + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/boost-vcpkg-helpers/LICENSE.txt + +Name: cJSON +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON/LICENSE + +Name: catch2 +License: BSL-1.0 +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/catch2 + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/catch2/LICENSE.txt + +Name: clog +License: BSD-2-Clause +Files: /pytorch/third_party/cpuinfo/deps/clog, + /pytorch/third_party/fbgemm/external/cpuinfo/deps/clog + For details, see the files concatenated below: /pytorch/third_party/cpuinfo/deps/clog/LICENSE, + /pytorch/third_party/fbgemm/external/cpuinfo/deps/clog/LICENSE + +Name: colorama +License: BSD-3-Clause +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/testing/python3/libs_3rdparty/colorama + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/testing/python3/libs_3rdparty/colorama/LICENSE.txt + +Name: composable_kernel +License: MIT +Files: /pytorch/third_party/aiter/3rdparty/composable_kernel, + /pytorch/third_party/composable_kernel, + /pytorch/third_party/fbgemm/external/composable_kernel, + /pytorch/third_party/flash-attention/csrc/composable_kernel + For details, see the files concatenated below: /pytorch/third_party/aiter/3rdparty/composable_kernel/LICENSE, + /pytorch/third_party/composable_kernel/LICENSE, + /pytorch/third_party/fbgemm/external/composable_kernel/LICENSE, + /pytorch/third_party/flash-attention/csrc/composable_kernel/LICENSE + +Name: cpp-httplib +License: MIT +Files: /pytorch/third_party/cpp-httplib + For details, see the files concatenated below: /pytorch/third_party/cpp-httplib/LICENSE + +Name: cpplint +License: BSD-3-Clause +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/third_party/cpplint + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/third_party/cpplint/LICENSE + +Name: cpr +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/LICENSE + +Name: cpuinfo +License: BSD-2-Clause +Files: /pytorch/third_party/cpuinfo, + /pytorch/third_party/fbgemm/external/cpuinfo + For details, see the files concatenated below: /pytorch/third_party/cpuinfo/LICENSE, + /pytorch/third_party/fbgemm/external/cpuinfo/LICENSE + +Name: cudnn_frontend +License: MIT +Files: /pytorch/third_party/cudnn_frontend + For details, see the files concatenated below: /pytorch/third_party/cudnn_frontend/LICENSE.txt + +Name: cutlass +License: BSD-3-Clause +Files: /pytorch/third_party/cutlass, + /pytorch/third_party/fbgemm/external/cutlass, + /pytorch/third_party/flash-attention/csrc/cutlass + For details, see the files concatenated below: /pytorch/third_party/cutlass/LICENSE.txt, + /pytorch/third_party/fbgemm/external/cutlass/LICENSE.txt, + /pytorch/third_party/flash-attention/csrc/cutlass/LICENSE.txt + +Name: dart +License: Apache-2.0 +Files: /pytorch/third_party/flatbuffers/dart + For details, see the files concatenated below: /pytorch/third_party/flatbuffers/dart/LICENSE + +Name: docs +License: Apache-2.0 with exception +Files: /pytorch/third_party/NVTX/docs + For details, see the files concatenated below: /pytorch/third_party/NVTX/docs/LICENSE.txt + +Name: doctest +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/test/thirdparty/doctest + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/test/thirdparty/doctest/LICENSE.txt + +Name: duktape-1.5.2 +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2 + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2/LICENSE.txt + +Name: duktape-1.8.0 +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0 + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0/LICENSE.txt + +Name: dynolog +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/LICENSE + +Name: etw +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/exporters/etw/include/opentelemetry/exporters/etw + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/exporters/etw/include/opentelemetry/exporters/etw/LICENSE + +Name: expected +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/expected + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/expected/LICENSE + +Name: fbgemm +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm + For details, see the files concatenated below: /pytorch/third_party/fbgemm/LICENSE + +Name: ffnvcodec +License: MIT with exception +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/ffnvcodec + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/ffnvcodec/LICENSE.txt + +Name: flash-attention +License: BSD-3-Clause +Files: /pytorch/third_party/flash-attention + For details, see the files concatenated below: /pytorch/third_party/flash-attention/LICENSE + +Name: flatbuffers +License: Apache-2.0 +Files: /pytorch/third_party/flatbuffers + For details, see the files concatenated below: /pytorch/third_party/flatbuffers/LICENSE + +Name: fmt +License: MIT with exception +Files: /pytorch/third_party/fmt, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/fmt, + /pytorch/third_party/kineto/libkineto/third_party/fmt + For details, see the files concatenated below: /pytorch/third_party/fmt/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/fmt/LICENSE.rst, + /pytorch/third_party/kineto/libkineto/third_party/fmt/LICENSE + +Name: gemmlowp +License: Apache-2.0 +Files: /pytorch/third_party/gemmlowp/gemmlowp + For details, see the files concatenated below: /pytorch/third_party/gemmlowp/gemmlowp/LICENSE + +Name: generator +License: Apache-2.0 +Files: /pytorch/third_party/kineto/libkineto/third_party/googletest/googlemock/scripts/generator, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator, + /pytorch/third_party/protobuf/third_party/googletest/googlemock/scripts/generator, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock/scripts/generator + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/googletest/googlemock/scripts/generator/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator/LICENSE, + /pytorch/third_party/protobuf/third_party/googletest/googlemock/scripts/generator/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock/scripts/generator/LICENSE + +Name: gettimeofday +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/gettimeofday + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/gettimeofday/LICENSE + +Name: gloo +License: BSD-3-Clause +Files: /pytorch/third_party/gloo + For details, see the files concatenated below: /pytorch/third_party/gloo/LICENSE + +Name: googlemock +License: BSD-3-Clause +Files: /pytorch/third_party/kineto/libkineto/third_party/googletest/googlemock, + /pytorch/third_party/protobuf/third_party/googletest/googlemock, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/googletest/googlemock/LICENSE, + /pytorch/third_party/protobuf/third_party/googletest/googlemock/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock/LICENSE + +Name: googletest +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm/external/googletest, + /pytorch/third_party/googletest, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/googletest, + /pytorch/third_party/kineto/libkineto/third_party/googletest, + /pytorch/third_party/kineto/libkineto/third_party/googletest/googletest, + /pytorch/third_party/opentelemetry-cpp/third_party/googletest, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest, + /pytorch/third_party/protobuf/third_party/googletest, + /pytorch/third_party/protobuf/third_party/googletest/googletest, + /pytorch/third_party/tensorpipe/third_party/googletest, + /pytorch/third_party/tensorpipe/third_party/googletest/googletest + For details, see the files concatenated below: /pytorch/third_party/fbgemm/external/googletest/LICENSE, + /pytorch/third_party/googletest/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/googletest/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/googletest/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/googletest/googletest/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/googletest/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/LICENSE, + /pytorch/third_party/protobuf/third_party/googletest/LICENSE, + /pytorch/third_party/protobuf/third_party/googletest/googletest/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/googletest/LICENSE + +Name: gtest +License: BSD-3-Clause +Files: /pytorch/third_party/ideep/mkl-dnn/tests/gtests/gtest + For details, see the files concatenated below: /pytorch/third_party/ideep/mkl-dnn/tests/gtests/gtest/LICENSE + +Name: hipify_torch +License: MIT +Files: /pytorch/third_party/fbgemm/external/hipify_torch + For details, see the files concatenated below: /pytorch/third_party/fbgemm/external/hipify_torch/LICENSE.txt + +Name: hstu +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm/fbgemm_gpu/experimental/hstu + For details, see the files concatenated below: /pytorch/third_party/fbgemm/fbgemm_gpu/experimental/hstu/LICENSE + +Name: hungarian +License: Permissive (free to use) +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/hungarian + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/hungarian/LICENSE.txt + +Name: ideep +License: MIT +Files: /pytorch/third_party/ideep + For details, see the files concatenated below: /pytorch/third_party/ideep/LICENSE + +Name: irrlicht +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/irrlicht + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/irrlicht/LICENSE.txt + +Name: kineto +License: BSD-3-Clause +Files: /pytorch/third_party/kineto + For details, see the files concatenated below: /pytorch/third_party/kineto/LICENSE + +Name: libnop +License: Apache-2.0 +Files: /pytorch/third_party/tensorpipe/third_party/libnop + For details, see the files concatenated below: /pytorch/third_party/tensorpipe/third_party/libnop/LICENSE + +Name: libstemmer +License: BSD-3-Clause +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/libstemmer + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/libstemmer/LICENSE + +Name: libuv +License: MIT +Files: /pytorch/third_party/tensorpipe/third_party/libuv + For details, see the files concatenated below: /pytorch/third_party/tensorpipe/third_party/libuv/LICENSE + +Name: mimalloc +License: MIT +Files: /pytorch/third_party/mimalloc + For details, see the files concatenated below: /pytorch/third_party/mimalloc/LICENSE + +Name: miniz-3.0.2 +License: MIT +Files: /pytorch/third_party/miniz-3.0.2 + For details, see the files concatenated below: /pytorch/third_party/miniz-3.0.2/LICENSE + +Name: mkl-dnn +License: Apache-2.0 +Files: /pytorch/third_party/ideep/mkl-dnn + For details, see the files concatenated below: /pytorch/third_party/ideep/mkl-dnn/LICENSE + +Name: ms-gsl +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/ms-gsl + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/ms-gsl/LICENSE + +Name: mx +License: MIT +Files: /pytorch/third_party/fbgemm/fbgemm_gpu/src/quantize_ops/mx, + /pytorch/third_party/fbgemm/fbgemm_gpu/test/quantize/mx + For details, see the files concatenated below: /pytorch/third_party/fbgemm/fbgemm_gpu/src/quantize_ops/mx/LICENSE, + /pytorch/third_party/fbgemm/fbgemm_gpu/test/quantize/mx/LICENSE + +Name: onnx +License: Apache-2.0 +Files: /pytorch/third_party/onnx + For details, see the files concatenated below: /pytorch/third_party/onnx/LICENSE + +Name: opentelemetry-cpp +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/LICENSE + +Name: opentelemetry-proto +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentelemetry-proto + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentelemetry-proto/LICENSE + +Name: opentracing-cpp +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/LICENSE + +Name: pdcurses +License: Public Domain for core +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pdcurses + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pdcurses/LICENSE + +Name: pfs +License: Apache-2.0 +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/pfs + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/pfs/LICENSE + +Name: physac +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/physac + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/physac/LICENSE + +Name: pqp +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pqp + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pqp/LICENSE + +Name: prometheus-cpp +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/LICENSE + +Name: protobuf +License: BSD-3-Clause +Files: /pytorch/third_party/protobuf + For details, see the files concatenated below: /pytorch/third_party/protobuf/LICENSE + +Name: psimd +License: MIT +Files: /pytorch/third_party/psimd + For details, see the files concatenated below: /pytorch/third_party/psimd/LICENSE + +Name: pthreadpool +License: BSD-2-Clause +Files: /pytorch/third_party/pthreadpool + For details, see the files concatenated below: /pytorch/third_party/pthreadpool/LICENSE + +Name: pybind11 +License: BSD-3-Clause +Files: /pytorch/third_party/onnx/third_party/pybind11, + /pytorch/third_party/pybind11, + /pytorch/third_party/tensorpipe/third_party/pybind11 + For details, see the files concatenated below: /pytorch/third_party/onnx/third_party/pybind11/LICENSE, + /pytorch/third_party/pybind11/LICENSE, + /pytorch/third_party/tensorpipe/third_party/pybind11/LICENSE + +Name: python +License: Apache-2.0 with exception +Files: /pytorch/third_party/NVTX/python + For details, see the files concatenated below: /pytorch/third_party/NVTX/python/LICENSE.txt + +Name: python +License: BSD-3-Clause +Files: /pytorch/third_party/cutlass/python + For details, see the files concatenated below: /pytorch/third_party/cutlass/python/LICENSE.txt + +Name: python +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm/external/cutlass/python + For details, see the files concatenated below: /pytorch/third_party/fbgemm/external/cutlass/python/LICENSE.txt + +Name: python +License: BSD-3-Clause +Files: /pytorch/third_party/flash-attention/csrc/cutlass/python + For details, see the files concatenated below: /pytorch/third_party/flash-attention/csrc/cutlass/python/LICENSE.txt + +Name: python-peachpy +License: BSD-2-Clause +Files: /pytorch/third_party/python-peachpy + For details, see the files concatenated below: /pytorch/third_party/python-peachpy/LICENSE.rst + +Name: sigslot +License: Public Domain +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/sigslot + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/sigslot/LICENSE + +Name: sleef +License: BSL-1.0 +Files: /pytorch/third_party/sleef + For details, see the files concatenated below: /pytorch/third_party/sleef/LICENSE.txt + +Name: swift +License: Apache-2.0 +Files: /pytorch/third_party/flatbuffers/swift + For details, see the files concatenated below: /pytorch/third_party/flatbuffers/swift/LICENSE + +Name: tb_plugin +License: BSD-3-Clause +Files: /pytorch/third_party/kineto/tb_plugin + For details, see the files concatenated below: /pytorch/third_party/kineto/tb_plugin/LICENSE + +Name: tensorflow-common +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/tensorflow-common + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/tensorflow-common/LICENSE.txt + +Name: tensorpipe +License: BSD-3-Clause +Files: /pytorch/third_party/tensorpipe + For details, see the files concatenated below: /pytorch/third_party/tensorpipe/LICENSE.txt + +Name: test +License: MIT with exception +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/test + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/test/LICENSE + +Name: variant +License: BSD-3-Clause +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/variant + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/variant/LICENSE + +Name: vcpkg +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/LICENSE.txt + +Name: vulkan +License: Apache-2.0 with exception +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/vulkan + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/vulkan/LICENSE.txt + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/LICENSE +---------------------------------------------------------------------------------- +Copyright (c) 2022, NVIDIA CORPORATION. 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. + + +/pytorch/third_party/FP16/LICENSE +--------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2017 Georgia Institute of Technology +Copyright 2019 Google LLC + +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. + + +/pytorch/third_party/FXdiv/LICENSE +---------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2016-2017 Marat Dukhan + +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. + + +/pytorch/third_party/NNPACK/LICENSE +----------------------------------- +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2015-2017, Georgia Institute of Technology +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. + +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 HOLDER 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. + + +/pytorch/third_party/NVTX/LICENSE.txt +------------------------------------- +============================================================================== +NVTX is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + + +/pytorch/third_party/VulkanMemoryAllocator/LICENSE.txt +------------------------------------------------------ +Copyright (c) 2017-2025 Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/XNNPACK/LICENSE +------------------------------------ +BSD License + +For XNNPACK software + +Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. +Copyright 2019 Google LLC + +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 Facebook 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 HOLDER 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. + + +/pytorch/third_party/aiter/LICENSE +---------------------------------- +Copyright © Advanced Micro Devices, Inc. All rights reserved. + +MIT License + +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. + + +/pytorch/third_party/benchmark/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: + + (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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/benchmark/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: + + (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. + + +/pytorch/third_party/protobuf/third_party/benchmark/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: + + (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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/boost-vcpkg-helpers/LICENSE.txt +---------------------------------------------------------------------------------------- +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON/LICENSE +--------------------------------------------------------------------------------------------------------------- +Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + +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. + + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/catch2/LICENSE.txt +------------------------------------------------------------------------------------------------------------------- +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +/pytorch/third_party/cpuinfo/deps/clog/LICENSE +---------------------------------------------- +Copyright (C) 2018 Marat Dukhan +Copyright (c) 2017-2018 Facebook Inc. +Copyright (c) 2017 Georgia Institute of Technology + +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. + +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 HOLDER 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. + + +/pytorch/third_party/fbgemm/external/cpuinfo/deps/clog/LICENSE +-------------------------------------------------------------- +Copyright (C) 2018 Marat Dukhan +Copyright (c) 2017-2018 Facebook Inc. +Copyright (c) 2017 Georgia Institute of Technology + +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. + +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 HOLDER 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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/testing/python3/libs_3rdparty/colorama/LICENSE.txt +----------------------------------------------------------------------------------------------------------------------------- +Copyright (c) 2010 Jonathan Hartley + +Released under the New BSD license (reproduced below), or alternatively you may +use this software under any OSI approved open source license such as those at +http://opensource.org/licenses/alphabetical + +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(s) of the copyright holders, nor those 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 HOLDER 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. + + + +/pytorch/third_party/aiter/3rdparty/composable_kernel/LICENSE +------------------------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/composable_kernel/LICENSE +---------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/fbgemm/external/composable_kernel/LICENSE +-------------------------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/flash-attention/csrc/composable_kernel/LICENSE +------------------------------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2024, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/cpp-httplib/LICENSE +---------------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 yhirose + +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. + + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/third_party/cpplint/LICENSE +------------------------------------------------------------------------------------------------------ +cpplint.py and its corresponding unit tests are Copyright (C) 2009 Google Inc. + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/LICENSE +--------------------------------------------------------------------------------- +This license applies to everything except the contents of the "test" +directory and its subdirectories. + +MIT License + +Copyright (c) 2017-2021 Huu Nguyen +Copyright (c) 2022 libcpr and many other contributors + +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. + +/pytorch/third_party/cpuinfo/LICENSE +------------------------------------ +Copyright (c) 2019 Google LLC +Copyright (c) 2017-2018 Facebook Inc. +Copyright (C) 2012-2017 Georgia Institute of Technology +Copyright (C) 2010-2012 Marat Dukhan + +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. + +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 HOLDER 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. + + +/pytorch/third_party/fbgemm/external/cpuinfo/LICENSE +---------------------------------------------------- +Copyright (c) 2019 Google LLC +Copyright (c) 2017-2018 Facebook Inc. +Copyright (C) 2012-2017 Georgia Institute of Technology +Copyright (C) 2010-2012 Marat Dukhan + +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. + +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 HOLDER 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. + + +/pytorch/third_party/cudnn_frontend/LICENSE.txt +----------------------------------------------- +/* + * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + * + * 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. + */ + + +/pytorch/third_party/cutlass/LICENSE.txt +---------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. Neither the name of the copyright holder 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 HOLDER 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. + +Certain files within this repository are subject to separate licensing terms: + +- The files located in the `python/CuTeDSL` directory are licensed under the + NVIDIA End User License Agreement (EULA). Please refer to + https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html + for the full terms. + + +/pytorch/third_party/fbgemm/external/cutlass/LICENSE.txt +-------------------------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. Neither the name of the copyright holder 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 HOLDER 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. + +Certain files within this repository are subject to separate licensing terms: + +- The files located in the `python/CuTeDSL` directory are licensed under the + NVIDIA End User License Agreement (EULA). Please refer to + https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html + for the full terms. + + +/pytorch/third_party/flash-attention/csrc/cutlass/LICENSE.txt +------------------------------------------------------------- +Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. Neither the name of the copyright holder 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 HOLDER 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. + + +/pytorch/third_party/flatbuffers/dart/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: + + (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 2014 Google Inc. + + 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. + + +/pytorch/third_party/NVTX/docs/LICENSE.txt +------------------------------------------ +============================================================================== +NVTX is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/test/thirdparty/doctest/LICENSE.txt +-------------------------------------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) 2016-2021 Viktor Kirilov + +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2/LICENSE.txt +----------------------------------------------------------------------------------------------------------------------------- +=============== +Duktape license +=============== + +(http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2016 by Duktape authors (see AUTHORS.rst) + +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0/LICENSE.txt +----------------------------------------------------------------------------------------------------------------------------- +=============== +Duktape license +=============== + +(http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/LICENSE +----------------------------------------------------------------- +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +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. + + +/pytorch/third_party/opentelemetry-cpp/exporters/etw/include/opentelemetry/exporters/etw/LICENSE +------------------------------------------------------------------------------------------------ +TraceLogging Dynamic for Windows + +Copyright (c) Microsoft Corporation. All rights reserved. + +MIT License + +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/expected/LICENSE +----------------------------------------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) 2015 Martin Moene +Copyright (c) 2015 Microsoft Corporation. All rights reserved. + +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. + + + +/pytorch/third_party/fbgemm/LICENSE +----------------------------------- +BSD License + +For FBGEMM software + +Copyright (c) Meta Platforms, Inc. and affiliates. 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 Facebook 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 HOLDER 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/ffnvcodec/LICENSE.txt +------------------------------------------------------------------------------ +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] +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 Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these 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 other code 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. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +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, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) 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. +d) 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. +e) 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 materials to be 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 with 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 Lesser 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 Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, 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! + +/pytorch/third_party/flash-attention/LICENSE +-------------------------------------------- +BSD 3-Clause License + +Copyright (c) 2022, the respective contributors, as shown by the AUTHORS file. +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 the copyright holder 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 HOLDER 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. + + +/pytorch/third_party/flatbuffers/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: + + (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. + + +/pytorch/third_party/fmt/LICENSE +-------------------------------- +Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors + +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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/fmt/LICENSE.rst +------------------------------------------------------------------------------------- +Copyright (c) 2012 - present, Victor Zverovich + +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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + + +/pytorch/third_party/kineto/libkineto/third_party/fmt/LICENSE +------------------------------------------------------------- +Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors + +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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + + +/pytorch/third_party/gemmlowp/gemmlowp/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: + + (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. + + +/pytorch/third_party/kineto/libkineto/third_party/googletest/googlemock/scripts/generator/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: + + (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 [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator/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: + + (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 [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/protobuf/third_party/googletest/googlemock/scripts/generator/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: + + (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 [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/googlemock/scripts/generator/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: + + (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 [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/gettimeofday/LICENSE +----------------------------------------------------------------------------- +/* + * Copied from PostgreSQL source: + * http://doxygen.postgresql.org/gettimeofday_8c_source.html + * + */ + +/* + * gettimeofday.c + * Win32 gettimeofday() replacement + * + * src/port/gettimeofday.c + * + * Copyright (c) 2003 SRA, Inc. + * Copyright (c) 2003 SKC, Inc. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose, without fee, and without a + * written agreement is hereby granted, provided that the above + * copyright notice and this paragraph and the following two + * paragraphs appear in all copies. + * + * IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, + * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING + * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS + * DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS + * IS" BASIS, AND THE AUTHOR HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, + * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + + +/pytorch/third_party/gloo/LICENSE +--------------------------------- +BSD License + +For Gloo software + +Copyright (c) 2017-present, Facebook, 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 Facebook 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 HOLDER 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. + + +/pytorch/third_party/kineto/libkineto/third_party/googletest/googlemock/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. + + +/pytorch/third_party/protobuf/third_party/googletest/googlemock/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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/googlemock/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. + + +/pytorch/third_party/fbgemm/external/googletest/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. + + +/pytorch/third_party/googletest/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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/googletest/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. + + +/pytorch/third_party/kineto/libkineto/third_party/googletest/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. + + +/pytorch/third_party/kineto/libkineto/third_party/googletest/googletest/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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/googletest/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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/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. + + +/pytorch/third_party/protobuf/third_party/googletest/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. + + +/pytorch/third_party/protobuf/third_party/googletest/googletest/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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/googletest/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. + + +/pytorch/third_party/ideep/mkl-dnn/tests/gtests/gtest/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. + + +/pytorch/third_party/fbgemm/external/hipify_torch/LICENSE.txt +------------------------------------------------------------- +MIT License + +Copyright (c) 2021-2024, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/fbgemm/fbgemm_gpu/experimental/hstu/LICENSE +---------------------------------------------------------------- +BSD 3-Clause License + +Copyright (c) 2022, the respective contributors, as shown by the AUTHORS file. +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 the copyright holder 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 HOLDER 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. + +/* + * SPDX-FileCopyrightText: Copyright (c) <2024> NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: LicenseRef-NvidiaProprietary + * + * NVIDIA CORPORATION, its affiliates and licensors retain all intellectual + * property and proprietary rights in and to this material, related + * documentation and any modifications thereto. Any use, reproduction, + * disclosure or distribution of this material and related documentation + * without an express license agreement from NVIDIA CORPORATION or + * its affiliates is strictly prohibited. + */ + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/hungarian/LICENSE.txt +------------------------------------------------------------------------------ +/******************************************************************** + ******************************************************************** + ** + ** libhungarian by Cyrill Stachniss, 2004 + ** + ** + ** Solving the Minimum Assignment Problem using the + ** Hungarian Method. + ** + ** ** This file may be freely copied and distributed! ** + ** + ** Parts of the used code was originally provided by the + ** "Stanford GraphGase", but I made changes to this code. + ** As asked by the copyright node of the "Stanford GraphGase", + ** I hereby proclaim that this file are *NOT* part of the + ** "Stanford GraphGase" distrubition! + ** + ** This file 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. + ** + ******************************************************************** + ********************************************************************/ + + +/pytorch/third_party/ideep/LICENSE +---------------------------------- +Copyright (c) 2018 Intel Corporation. + +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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/irrlicht/LICENSE.txt +----------------------------------------------------------------------------- +The Irrlicht Engine License +=========================== + +Copyright (C) 2002-2015 Nikolaus Gebhardt + +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 acknowledgement in the product documentation would be + appreciated but is not required. +2. Altered source versions must be clearly 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. + +/pytorch/third_party/kineto/LICENSE +----------------------------------- +BSD License + +For Kineto software + +Copyright (c) Meta Platforms, Inc. and affiliates. + +All contributions by Microsoft: +Copyright (c) Microsoft Corporation. (The Azure AI Platform team) + +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 Meta 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 HOLDER 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. + + +/pytorch/third_party/tensorpipe/third_party/libnop/LICENSE +---------------------------------------------------------- +Copyright 2017 The Native Object Protocols Authors + +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 + + https://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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/libstemmer/LICENSE +--------------------------------------------------------------------------- +Snowball - License +Except where explicitly noted, all the software given out on this Snowball site is covered by the 3-clause BSD License: + +Copyright (c) 2001, Dr Martin Porter, +Copyright (c) 2002, Richard Boulton. +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. Neither the name of the copyright holder 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 HOLDER 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. +Essentially, all this means is that you can do what you like with the code, except claim another Copyright for it, or claim that it is issued under a different license. The software is also issued without warranties, which means that if anyone suffers through its use, they cannot come back and sue you. You also have to alert anyone to whom you give the Snowball software to the fact that it is covered by the BSD license. + +We have not bothered to insert the licensing arrangement into the text of the Snowball software. + + +/pytorch/third_party/tensorpipe/third_party/libuv/LICENSE +--------------------------------------------------------- +Copyright (c) 2015-present libuv project contributors. + +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. + + +/pytorch/third_party/mimalloc/LICENSE +------------------------------------- +MIT License + +Copyright (c) 2018-2025 Microsoft Corporation, Daan Leijen + +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. + + +/pytorch/third_party/miniz-3.0.2/LICENSE +---------------------------------------- +Copyright 2013-2014 RAD Game Tools and Valve Software +Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + +All Rights Reserved. + +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. + + +/pytorch/third_party/ideep/mkl-dnn/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: + + (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 + + ============================================================================ + + Copyright 2016-2023 Intel Corporation + Copyright 2018 YANDEX LLC + Copyright 2019-2023 FUJITSU LIMITED + Copyright 2020-2023 Arm Ltd. and affiliates + Copyright 2020-2022 Codeplay Software Limited + Copyright 2021 Alanna Tempest + Copyright 2022-2023 IBM Corporation + Copyright 2023 KNS Group LLC (YADRO) + + 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. + + This distribution includes third party software ("third party programs"). + This third party software, even if included with the distribution of + the Intel software, may be governed by separate license terms, including + without limitation, third party license terms, other Intel software license + terms, and open source software license terms. These separate license terms + govern your use of the third party programs as set forth in the + "THIRD-PARTY-PROGRAMS" file. + + +/pytorch/third_party/opentelemetry-cpp/third_party/ms-gsl/LICENSE +----------------------------------------------------------------- +Copyright (c) 2015 Microsoft Corporation. All rights reserved. + +This code is licensed under the MIT License (MIT). + +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. + + +/pytorch/third_party/fbgemm/fbgemm_gpu/src/quantize_ops/mx/LICENSE +------------------------------------------------------------------ + MIT License + + Copyright (c) Microsoft Corporation. + + 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 + + +/pytorch/third_party/fbgemm/fbgemm_gpu/test/quantize/mx/LICENSE +--------------------------------------------------------------- + MIT License + + Copyright (c) Microsoft Corporation. + + 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 + + +/pytorch/third_party/onnx/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: + + (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. + + +/pytorch/third_party/opentelemetry-cpp/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: + + (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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentelemetry-proto/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: + + (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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/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: + + (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 The OpenTracing Authors + + 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. + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pdcurses/LICENSE +------------------------------------------------------------------------- +The core package is in the public domain, but small portions of PDCurses are subject to copyright under various licenses. + +The win32 files are released to the public domain. + +If you use PDCurses in an application, an acknowledgement would be appreciated, but is not mandatory. If you make corrections or enhancements to PDCurses, please forward them to the current maintainer for the benefit of other users. + +This software is provided AS IS with NO WARRANTY whatsoever. + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/pfs/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: + + (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 + + Copyright 2020-present Daniel Trugman + + 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/physac/LICENSE +----------------------------------------------------------------------- +MIT License + +Copyright (c) 2022 Víctor Fisac + +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. + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pqp/LICENSE +-------------------------------------------------------------------- +Copyright 1999 University of North Carolina at Chapel Hill. +All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for educational, research, and non-profit purposes, without fee, +and without a written agreement is hereby granted, provided that the above +copyright notice and the following three paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL BE LIABLE TO +ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL SPECIFICALLY DISCLAIMS ANY +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED +HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF NORTH CAROLINA AT +CHAPEL HILL HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, +ENHANCEMENTS, OR MODIFICATIONS. + +The authors may be contacted via: + +US Mail: Eric Larsen, Stefan Gottschalk + Department of Computer Science + Sitterson Hall, CB #3175 + University of North Carolina + Chapel Hill, NC 27599-3175 + +Phone: (919) 962-1749 + +Email: geom@cs.unc.edu + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/LICENSE +------------------------------------------------------------------------- +MIT License + +Copyright (c) 2016-2021 Jupp Mueller +Copyright (c) 2017-2022 Gregor Jasny + +And many contributors, see +https://github.com/jupp0r/prometheus-cpp/graphs/contributors + +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. + + +/pytorch/third_party/protobuf/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. + + +/pytorch/third_party/psimd/LICENSE +---------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2014-2017 Georgia Institute of Technology +Copyright 2019 Google LLC + +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. + + +/pytorch/third_party/pthreadpool/LICENSE +---------------------------------------- +Copyright 2019 Google LLC +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2015-2017 Georgia Institute of Technology +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. + +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 HOLDER 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. + + + +/pytorch/third_party/onnx/third_party/pybind11/LICENSE +------------------------------------------------------ +Copyright (c) 2016 Wenzel Jakob , 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. Neither the name of the copyright holder 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 HOLDER 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. + +Please also refer to the file .github/CONTRIBUTING.md, which clarifies licensing of +external contributions to this project including patches, pull requests, etc. + + +/pytorch/third_party/pybind11/LICENSE +------------------------------------- +Copyright (c) 2016 Wenzel Jakob , 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. Neither the name of the copyright holder 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 HOLDER 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. + +Please also refer to the file .github/CONTRIBUTING.md, which clarifies licensing of +external contributions to this project including patches, pull requests, etc. + + +/pytorch/third_party/tensorpipe/third_party/pybind11/LICENSE +------------------------------------------------------------ +Copyright (c) 2016 Wenzel Jakob , 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. Neither the name of the copyright holder 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 HOLDER 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. + +Please also refer to the file CONTRIBUTING.md, which clarifies licensing of +external contributions to this project including patches, pull requests, etc. + + +/pytorch/third_party/NVTX/python/LICENSE.txt +-------------------------------------------- +============================================================================== +NVTX is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + + +/pytorch/third_party/cutlass/python/LICENSE.txt +----------------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. Neither the name of the copyright holder 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 HOLDER 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. + + +/pytorch/third_party/fbgemm/external/cutlass/python/LICENSE.txt +--------------------------------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. Neither the name of the copyright holder 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 HOLDER 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. + + +/pytorch/third_party/flash-attention/csrc/cutlass/python/LICENSE.txt +-------------------------------------------------------------------- +Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. Neither the name of the copyright holder 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 HOLDER 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. + + +/pytorch/third_party/python-peachpy/LICENSE.rst +----------------------------------------------- +============================== +PeachPy license (2-clause BSD) +============================== + +Copyright (c) 2017, Facebook Inc. +Copyright (c) 2013-2017, Georgia Institute of Technology +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. + +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 HOLDER 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/sigslot/LICENSE +------------------------------------------------------------------------ +License +The sigslot library has been placed in the public domain. This means that you are free to use it however you like. + +The author takes no responsibility or liability of any kind for any use that you may make of this library. + +If you screw up, it's your fault. + +If the library screws up, you got it for free, so you should have tested it better - it's still your responsibility. + +/pytorch/third_party/sleef/LICENSE.txt +-------------------------------------- +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +/pytorch/third_party/flatbuffers/swift/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: + + (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. + + +/pytorch/third_party/kineto/tb_plugin/LICENSE +--------------------------------------------- +BSD License + +For Kineto software + +Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. + +All contributions by Microsoft: +Copyright (c) Microsoft Corporation. (The Azure AI Platform team) + +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 Facebook 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 HOLDER 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/tensorflow-common/LICENSE.txt +-------------------------------------------------------------------------------------- +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +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. + + +/pytorch/third_party/tensorpipe/LICENSE.txt +------------------------------------------- +BSD License + +For TensorPipe software + +Copyright (c) Meta Platforms, Inc. and affiliates. 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 Meta 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 HOLDER 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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/test/LICENSE +-------------------------------------------------------------------------------------- +This license applies to everything inside this directory and all +subdirectories. + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/variant/LICENSE +---------------------------------------------------------------------------------------------------------------- +Copyright (c) MapBox +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 "MapBox" 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 HOLDER 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. + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/LICENSE.txt +-------------------------------------------------------------- +MIT License + +Copyright (c) Microsoft Corporation + +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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/vulkan/LICENSE.txt +--------------------------------------------------------------------------- +/* +* +* 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. +*/ + + +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 + +=============================================================================================================================================== + +/Copyright (C) 2012 LunarG, 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 LunarG 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 HOLDERS 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. + +=============================================================================================================================================== + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# Copyright 2007-2008 Miguel A. Figueroa-Villanueva +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright_cmake.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + + +============================================================================================================================================== + +// +// Copyright (C) 2015-2018 Google, Inc. +// Copyright (C) +// +// 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 3Dlabs Inc. Ltd. 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 HOLDERS 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. +// + +========================================================================================================================================== + +Note: This license has also been called the "New BSD License" or "Modified BSD License". See also the 2-clause BSD License. +Copyright +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. Neither the name of the copyright holder 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 HOLDER 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. + + +========================================================================================================================================== + +/* +* xxHash - Fast Hash algorithm +* Copyright (C) 2012-2016, Yann Collet +* +* BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +* +* 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. +* +* 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. +* +* You can contact the author at : +* - xxHash homepage: http://www.xxhash.com +* - xxHash source repository : https://github.com/Cyan4973/xxHash +*/ + + +=========================================================================================================================================== + +# Copyright (C) 2018 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 HOLDERS 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. + +========================================================================================================================================== + +/* A Bison parser, made by GNU Bison 3.0.4. */ + +/* Bison implementation for Yacc-like parsers in C +Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +This program 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 General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains +part or all of the Bison parser skeleton and distribute that work +under terms of your choice, so long as that work isn't itself a +parser generator using the skeleton or a modified version thereof +as a parser skeleton. Alternatively, if you modify or redistribute +the parser skeleton itself, you may (at your option) remove this +special exception, which will cause the skeleton and the resulting +Bison output files to be licensed under the GNU General Public +License without this special exception. +This special exception was added by the Free Software Foundation in +version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by +simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid +infringing on user name space. This should be done even for local +variables, as they might otherwise be expanded by user macros. +There are some unavoidable exceptions within include files to +define necessary library symbols; they are noted "INFRINGES ON +USER NAME SPACE" below. */ + +============================================================================================================================================== + +copyright : [ +Copyright (c) 2017 The Khronos Group Inc., +, +Permission is hereby granted, free of charge, to any person obtaining a copy, +of this software and/or associated documentation files (the \Materials\"),", +to deal in the Materials without restriction, including without limitation, +the rights to use, copy, modify, merge, publish, distribute, sublicense,, +and/or sell copies of the Materials, and to permit persons to whom the, +Materials are 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 Materials., +, +MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS, +STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND, +HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ , +, +THE MATERIALS ARE 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 MATERIALS OR THE USE OR OTHER DEALINGS, +IN THE MATERIALS. + +============================================================================================================================================= + +CMake - Cross Platform Makefile Generator +Copyright 2000-2009 Kitware, Inc., Insight Software Consortium +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 names of Kitware, Inc., the Insight Software Consortium, +nor the names of their 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 +HOLDER 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 above copyright and license notice applies to distributions of +CMake in source and binary form. Some source files contain additional +notices of original copyright by their contributors; see each source +for details. Third-party software packages supplied with CMake under +compatible licenses provide their own copyright notices documented in +corresponding subdirectories. + +------------------------------------------------------------------------------ + +CMake was initially developed by Kitware with the following sponsorship: + +* National Library of Medicine at the National Institutes of Health +as part of the Insight Segmentation and Registration Toolkit (ITK). + +* US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel +Visualization Initiative. + +* National Alliance for Medical Image Computing (NAMIC) is funded by the +National Institutes of Health through the NIH Roadmap for Medical Research, +Grant U54 EB005149. + +* Kitware, Inc. + +======================================================================================================================================== + +The authors of this software are Rob Pike and Ken Thompson. +* Copyright (c) 2002 by Lucent Technologies. +* Permission to use, copy, modify, and distribute this software for any +* purpose without fee is hereby granted, provided that this entire notice +* is included in all copies of any software which is or includes a copy +* or modification of this software and in all copies of the supporting +* documentation for such software. +* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED +* WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY +* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY +* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + + +======================================================================================================================================== + +Copyright (c) 2015-2018 Baldur Karlsson + +Copyright (c) 2014 Crytek + +Copyright (c) 1998-2018 Third party code and tools + +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. + +========================================================================================================================================= + +/* +Copyright (c) 2009 Dave Gamble +Copyright (c) 2015-2016 The Khronos Group Inc. +Copyright (c) 2015-2016 Valve Corporation +Copyright (c) 2015-2016 LunarG, Inc. + +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. +*/ + +=========================================================================================================================================== + +Copyright (c) 2005 - 2017 G-Truc Creation + +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 JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: +http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +Copyright (c) 2007-2010 Baptiste Lepilleur +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. + +========================================================================================================================================== + +/** +* `murmurhash.h' - murmurhash +* +* copyright (c) 2014 joseph werle +* Copyright (c) 2015-2016 The Khronos Group Inc. +* Copyright (c) 2015-2016 Valve Corporation +* Copyright (c) 2015-2016 LunarG, Inc. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and/or associated documentation files (the "Materials"), to +* deal in the Materials without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Materials, and to permit persons to whom the Materials are +* furnished to do so, subject to the following conditions: +* +* The above copyright notice(s) and this permission notice shall be included in +* all copies or substantial portions of the Materials. +* +* THE MATERIALS ARE 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 MATERIALS OR THE +* USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +========================================================================================================================================= + +Licenced as X11: http://www.kryogenix.org/code/browser/licence.html +This basically means: do what you want with it. + +========================================================================================================================================= + +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/common.hpp +/// @date 2013-12-24 / 2013-12-24 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + + +========================================================================================================================================== + +// LICENSE +// +// This software is in the public domain. Where that dedication is not +// recognized, you are granted a perpetual, irrevocable license to copy, +// distribute, and modify this file as you see fit. +// + +========================================================================================================================================== + +Simple DirectMedia Layer +Copyright (C) 1997-2018 Sam Lantinga + +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. + +========================================================================================================================================= + +/****************************************************************************\ +Copyright (c) 2002, NVIDIA Corporation. + +NVIDIA Corporation("NVIDIA") supplies this software to you in +consideration of your agreement to the following terms, and your use, +installation, modification or redistribution of this NVIDIA software +constitutes acceptance of these terms. If you do not agree with these +terms, please do not use, install, modify or redistribute this NVIDIA +software. + +In consideration of your agreement to abide by the following terms, and +subject to these terms, NVIDIA grants you a personal, non-exclusive +license, under NVIDIA's copyrights in this original NVIDIA software (the +NVIDIA Software), to use, reproduce, modify and redistribute the +NVIDIA Software, with or without modifications, in source and/or binary +forms; provided that if you redistribute the NVIDIA Software, you must +retain the copyright notice of NVIDIA, this notice and the following +text and disclaimers in all such redistributions of the NVIDIA Software. +Neither the name, trademarks, service marks nor logos of NVIDIA +Corporation may be used to endorse or promote products derived from the +NVIDIA Software without specific prior written permission from NVIDIA. +Except as expressly stated in this notice, no other rights or licenses +express or implied, are granted by NVIDIA herein, including but not +limited to any patent rights that may be infringed by your derivative +works or by other works in which the NVIDIA Software may be +incorporated. No hardware is licensed hereunder. + +THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR +ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER +PRODUCTS. + +IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, +INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY +OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE +NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, +TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF +NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\****************************************************************************/ + +================================================================================================================================================== + +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. + + +================================================================================================================================================== + +GNU LESSER GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. + +0. Additional Definitions. + +As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. + +"The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. + +An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. + +A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". + +The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. + +The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. + +1. Exception to Section 3 of the GNU GPL. + +You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. + +2. Conveying Modified Versions. + +If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: + +a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or +b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. +3. Object Code Incorporating Material from Library Header Files. + +The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: + +a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the object code with a copy of the GNU GPL and this license document. +4. Combined Works. + +You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: + +a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the Combined Work with a copy of the GNU GPL and this license document. +c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. +d) Do one of the following: +0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. +1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. +e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) +5. Combined Libraries. + +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 that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. +b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. +6. Revised Versions of the GNU Lesser General Public License. + +The Free Software Foundation may publish revised and/or new versions of the GNU Lesser 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 as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. + + +torchcodec +0.8.0 +UNKNOWN +https://pytorch.org/torchcodec/stable/index.html +BSD 3-Clause License + +Copyright 2024 Meta + +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. Neither the name of the copyright holder 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 HOLDER 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. + + +torchvision +0.24.0+cu128 +BSD +https://github.com/pytorch/vision +BSD 3-Clause License + +Copyright (c) Soumith Chintala 2016, +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 the copyright holder 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 HOLDER 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. + + +transformers +4.57.3 +Apache Software License +https://github.com/huggingface/transformers +Copyright 2018- The Hugging Face team. All rights reserved. + + 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. + + +triton +3.5.0 +MIT License +https://github.com/triton-lang/triton/ +/* +* Copyright 2018-2020 Philippe Tillet +* Copyright 2020-2022 OpenAI +* +* 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. +*/ + + +tyro +0.9.17 +MIT License +UNKNOWN +MIT License + +Copyright (c) 2024 Brent Yi + +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. + + +wandb +0.23.0 +MIT License +https://github.com/wandb/wandb +MIT License + +Copyright (c) 2021 Weights and Biases, Inc. + +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. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..0d4b50d56 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,79 @@ +# CLAUDE.md — Isaac GR00T N1.7 + +## Project overview + +Isaac GR00T N1.7 is an open vision-language-action (VLA) model for generalized humanoid robot skills. +The repo contains the model, training pipeline, evaluation harness, and deployment tooling. + +- **Language:** Python 3.12 +- **Package manager:** [uv](https://docs.astral.sh/uv/) +- **Build system:** setuptools (see `pyproject.toml`) + +## Quick-start commands + +```bash +# Install (dev mode with all extras) +uv sync --all-extras + +# Lint and format (uses ruff via pre-commit) +pre-commit run --all-files + +# Run CPU tests +python -m pytest tests/ -m "not gpu" -v --timeout=300 + +# Run GPU tests +python -m pytest tests/ -m gpu -v --timeout=300 + +# Build package +uv build + +# Validate lockfile +uv lock --locked +``` + +## Code style + +- Formatter: `ruff format` (double quotes, spaces, line-length 100) +- Linter: `ruff check` with rules E, F, I (ignores E501) +- Config lives in `pyproject.toml` under `[tool.ruff]` +- Run `pre-commit run --all-files` before committing + +## Directory layout + +``` +gr00t/ # Main package + configs/ # Training, data, and model configs + data/ # Data loading, embodiment tags, dataset processing + eval/ # Evaluation (run_gr00t_server.py) + experiment/ # Training pipeline (launch_finetune.py, trainer.py) + model/ # Model architecture (N1.7, base, modules) + policy/ # Policy inference (Gr00tPolicy, server/client) +examples/ # Per-embodiment example configs and READMEs +scripts/ # Deployment, conversion, and utility scripts + deployment/ # Platform install scripts (dgpu, orin, thor, spark) +tests/ # pytest suite (markers: gpu, not gpu) +getting_started/ # User-facing guides and notebooks +``` + +## Key entry points + +- **Fine-tune:** `bash examples/finetune.sh --base-model-path --dataset-path --embodiment-tag --output-dir ` +- **Inference server:** `python gr00t/eval/run_gr00t_server.py --model-path --embodiment-tag ` +- **ONNX export:** `python scripts/deployment/export_onnx_n1d7.py` +- **TensorRT build:** `python scripts/deployment/build_trt_pipeline.py` +- **Benchmark:** `python scripts/deployment/benchmark_inference.py` + +## Testing + +- Test markers: `gpu` (requires GPU), default is CPU-safe +- Fixtures live in `tests/fixtures/` and `demo_data/` +- CI runs CPU and GPU tests in separate jobs with 300s timeout + +## Deployment platforms + +- **dGPU (H100, A100, RTX):** CUDA 12.8 — install via `scripts/deployment/dgpu/install_deps.sh`, container via top-level `docker/Dockerfile` (supports x86_64 and aarch64) +- **Jetson Orin:** JetPack 7.2 / CUDA 13.2 — install via `scripts/deployment/orin/install_deps.sh`, container via `scripts/deployment/orin/Dockerfile` +- **Jetson Thor:** JetPack 7.2 / CUDA 13.2 — install via `scripts/deployment/thor/install_deps.sh`, container via `scripts/deployment/thor/Dockerfile` +- **DGX Spark:** CUDA 13.0 — install via `scripts/deployment/spark/install_deps.sh`, container via `scripts/deployment/spark/Dockerfile` + +Each Jetson/Spark platform ships an `activate_*.sh` helper (`scripts/activate_orin.sh`, `scripts/activate_spark.sh`, `scripts/activate_thor.sh`) that exports platform-specific library paths. For dGPU, the standard `source .venv/bin/activate` is sufficient. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1505c2c92..fe6e0cba5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,171 +1,7 @@ -# Contributing +# Contributions -Thanks for considering contributing to NVIDIA Isaac-GR00T! Please read this document to learn the various ways you can contribute to this project and how to go about doing it. +We welcome pull requests and contributions. If you encounter issues or have suggestions, please open an [Issue](https://github.com/NVIDIA/Isaac-GR00T/issues) or submit a pull request in this repository. -## Bug reports and feature requests +## Support -### Did you find a bug? - -First, do [a quick search](https://github.com/NVIDIA/Isaac-GR00T/issues) to see whether your issue has already been reported. -If your issue has already been reported, please comment on the existing issue. - -Otherwise, open [a new GitHub issue](https://github.com/NVIDIA/Isaac-GR00T/issues/new). Be sure to include a clear title -and description. The description should include as much relevant information as possible. The description should -explain how to reproduce the erroneous behavior as well as the behavior you expect to see. Ideally you would include a -code sample or an executable test case demonstrating the expected behavior. - -### Do you have a suggestion for an enhancement or new feature? - -We use GitHub issues to track feature requests. Before you create a feature request: - -* Make sure you have a clear idea of the enhancement you would like. If you have a vague idea, consider discussing -it first on a GitHub issue. -* Check the documentation to make sure your feature does not already exist. -* Do [a quick search](https://github.com/NVIDIA/Isaac-GR00T/issues) to see whether your feature has already been suggested. - -When creating your request, please: - -* Provide a clear title and description. -* Explain why the enhancement would be useful. It may be helpful to highlight the feature in other libraries. -* Include code examples to demonstrate how the enhancement would be used. - -## Making a pull request - -When you're ready to contribute code to address an open issue, please follow these guidelines to help us be able to review your pull request (PR) quickly. - -1. **Initial setup** (only do this once) - -
Expand details 👇
- - If you haven't already done so, please [fork](https://help.github.com/en/enterprise/2.13/user/articles/fork-a-repo) this repository on GitHub. - - Then clone your fork locally with - - git clone https://github.com/USERNAME/Isaac-GR00T.git - - or - - git clone git@github.com:USERNAME/Isaac-GR00T.git - - At this point the local clone of your fork only knows that it came from *your* repo, github.com/USERNAME/Isaac-GR00T.git, but doesn't know anything the *main* repo, [https://github.com/NVIDIA/Isaac-GR00T.git](https://github.com/NVIDIA/Isaac-GR00T). You can see this by running - - git remote -v - - which will output something like this: - - origin https://github.com/USERNAME/Isaac-GR00T.git (fetch) - origin https://github.com/USERNAME/Isaac-GR00T.git (push) - - This means that your local clone can only track changes from your fork, but not from the main repo, and so you won't be able to keep your fork up-to-date with the main repo over time. Therefore you'll need to add another "remote" to your clone that points to [https://github.com/NVIDIA/Isaac-GR00T.git](https://github.com/NVIDIA/Isaac-GR00T). To do this, run the following: - - git remote add upstream https://github.com/NVIDIA/Isaac-GR00T.git - - Now if you do `git remote -v` again, you'll see - - origin https://github.com/USERNAME/Isaac-GR00T.git (fetch) - origin https://github.com/USERNAME/Isaac-GR00T.git (push) - upstream https://github.com/NVIDIA/Isaac-GR00T.git (fetch) - upstream https://github.com/NVIDIA/Isaac-GR00T.git (push) - - Finally, you'll need to create a Python 3 virtual environment suitable for working on this project. - ```bash - uv pip install -e .[dev] - ``` - - The "editable mode" comes from the `-e` argument to `pip`, and essential just creates a symbolic link from the site-packages directory of your virtual environment to the source code in your local clone. That way any changes you make will be immediately reflected in your virtual environment. - -
- -2. **Ensure your fork is up-to-date** - -
Expand details 👇
- - Once you've added an "upstream" remote pointing to [https://github.com/NVIDIA/Isaac-GR00T.git](https://github.com/NVIDIA/Isaac-GR00T), keeping your fork up-to-date is easy: - - git checkout main # if not already on main - git pull --rebase upstream main - git push - -
- -3. **Create a new branch to work on your fix or enhancement** - -
Expand details 👇
- - Committing directly to the main branch of your fork is not recommended. It will be easier to keep your fork clean if you work on a separate branch for each contribution you intend to make. - - You can create a new branch with - - # replace BRANCH with whatever name you want to give it - git checkout -b BRANCH - git push -u origin BRANCH - -
- -4. **Test your changes** - -
Expand details 👇
- - Our continuous integration (CI) testing runs [a number of checks](https://github.com/NVIDIA/Isaac-GR00T/actions) for each pull request on [GitHub Actions](https://github.com/features/actions). You can run most of these tests locally, which is something you should do *before* opening a PR to help speed up the review process and make it easier for us. - - First, you should run [`ruff`](https://docs.astral.sh/ruff/) to make sure you code is formatted consistently. - Many IDEs support code formatters as plugins, so you may be able to setup isort and black to run automatically everytime you save. - For example, [`black.vim`](https://github.com/psf/black/tree/master/plugin) will give you this functionality in Vim. But both `isort` and `black` are also easy to run directly from the command line. - Just run this from the root of your clone: - - ```bash - ruff format . - ruff check --fix . - ``` - - We also strive to maintain high test coverage, so most contributions should include additions to [the unit tests](https://github.com/NVIDIA/Isaac-GR00T/tree/main/tests). These tests are run with [`pytest`](https://docs.pytest.org/en/latest/), which you can use to locally run any test modules that you've added or changed. - - For example, if you've fixed a bug in `isaac-gr00t/a/b.py`, you can run the tests specific to that module with - - pytest -v tests/a/b_test.py - - After all of the above checks have passed, you can now open [a new GitHub pull request](https://github.com/NVIDIA/Isaac-GR00T/pulls). - Make sure you have a clear description of the problem and the solution, and include a link to relevant issues. - - We look forward to reviewing your PR! - -
- -### Developer Certificate of Origin - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` \ No newline at end of file +Now that GR00T N1.7 has reached General Availability (GA), it ships with a stable, fully validated feature set. If you encounter issues or have suggestions, please open an [Issue](https://github.com/NVIDIA/Isaac-GR00T/issues) in this repository. diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 000000000..f232da53d --- /dev/null +++ b/FAQ.md @@ -0,0 +1,81 @@ +# GR00T N1.7 FAQ + +## Infrastructure & Hardware + +### Is the data loader GPU-accelerated? + +No, the current data loader is CPU-based. However, it has been heavily optimized for multimodal data to ensure it does not become a training bottleneck. We validated this on various configurations, including GB200, H100, and local desktops with RTX 4090 GPUs. We are actively exploring GPU-accelerated approaches for future releases. + +### Is the same data loader used for both pre-training and post-training? + +Yes, the data loading pipeline is unified across both training stages. + +### What is the role of the Policy Remote Server in the server-client deployment? + +The Policy Remote Server decouples inference from the physical robot. This allows users to run the policy on a high-compute cluster (e.g., H100s) for faster inference while the robot operates in a separate environment. It separates dependencies and enables scaling beyond the robot's onboard compute. See [Server-Client Inference](README.md#server-client-inference-for-deployment) for the architecture and setup. + +## Workflow & Architecture + +### Why retain only specific LLM layers (e.g., 16 layers) during fine-tuning? + +This configuration was empirically tuned for the backbone (e.g., Eagle, or [Cosmos-Reason](https://huggingface.co/nvidia/Cosmos-Reason2-2B) — the reasoning VLM used as N1.7's backbone). Research suggests early layers capture grammatical structure, while middle-to-late layers are highly expressive. However, the very last layers are often over-optimized for next-token prediction; pruning or freezing them can sometimes yield better representations for vision-language-action alignment. + +### How do you verify if the language model is successfully aligned with the action space? + +We evaluate this end-to-end via downstream task success. We design evaluation tasks that are ambiguous without language instructions (e.g., "pick the pear" from a bowl of mixed fruit). If the robot succeeds, it confirms the model is correctly grounding language commands into physical actions. + +## Data Strategy & Volume + +### How much data is required for post-training on a new embodiment or task? + +Data requirements depend heavily on task complexity and scene variation. Typical guidelines include: + +- **Simple, fixed-location tasks (Pick & Place):** ~100 trajectories. +- **Complex scenes or multi-step tasks:** ~500+ trajectories. +- **High-DoF humanoid tasks:** ~2,000+ trajectories (e.g., shelf-picking with G1). +- **Fine manipulation:** ~100–500 episodes, ideally with human motion pre-training. + +### What is the recommended strategy for improving success rates on hard tasks? + +We recommend an iterative approach: start with ~100 teleoperated demonstrations, train a policy, and then use HG-DAgger (Human Gated Dataset Aggregation). Run the policy, intervene when it fails, and add the corrections from those trajectories to the dataset. This helps the model cover out-of-distribution states that pure behavior cloning (BC) might miss, and recover from partial failure states (e.g., a grip slipping or imprecise item placement). + +### Does including real-robot data from other embodiments help if I only care about one robot? + +Yes. Even if cross-embodiment generalization is not your goal, including diverse real-robot data adds visual diversity and robustness to the VLA's backbone, improving performance on your specific target robot. + +### Does GR00T N1.7 support synthetic data generation via Cosmos? + +While research models (like [DreamGen](https://research.nvidia.com/labs/gear/dreamgen/), a pipeline that generates synthetic robot trajectories from video world models) show promise, a robust, product-ready pipeline for generating synthetic training data via [NVIDIA Cosmos](https://www.nvidia.com/en-us/ai/cosmos/) world foundation models is currently in development and not yet part of the standard release. + +## Model Capabilities + +### Can the model handle lighting changes or different object colors? + +VLMs can struggle with drastic appearance changes (e.g., hard shadows or significant hue shifts). While we haven't released specific lighting ablations, we strongly recommend using color jitter augmentation during training and collecting diverse data (20–50 episodes) under different lighting conditions to prevent overfitting. + +### Can GR00T models perform reasoning or Visual Question Answering (VQA)? + +The GR00T N1.x series is optimized specifically for action generation, not open-ended reasoning or VQA. Capabilities requiring complex semantic reasoning are targeted for future N2 (the next generation of GR00T, not yet released) releases. + +### Can the model learn "retry" behaviors? + +The current architecture is stateless and does not inherently "know" if a previous attempt failed. While some retry behavior may emerge from high-quality data, explicit recovery strategies are best achieved through DAgger (collecting data on recovery from failure) or Reinforcement Learning (RL), rather than pure Imitation Learning. + +### Does the model distinguish between left and right arms in bimanual tasks? + +Yes, provided the training data is distinct or annotated (e.g., instructions specifying "left arm" vs. "right arm"). If the dataset contains mixed, unannotated data where both arms perform identical tasks indiscriminately, the model may struggle to distinguish them. + +### Is there a zero-shot cross-embodiment VLA model? + +No. While cross-embodiment data improves generalization, a true "zero-shot" model (one that works perfectly on a new robot without *any* fine-tuning) does not currently exist in the open VLA landscape. + +### Will differences in object shape between training and deployment cause the success rate to drop? + +It depends on the degree of deviation. If the target object's shape differs drastically from the training data, performance will likely drop significantly. However, if the shape variation is minor and shares a similar grasping affordance (e.g., a slightly different bottle shape that is still grasped from the side), the model may still succeed, though with potentially lower reliability than on the original objects. + +### Has the impact of large viewpoint changes (e.g., head movement) on task difficulty been studied? + +Yes. Large viewpoint changes effectively change the observation distribution, which can complicate simple tasks. For example, a "simple" handover becomes complex if the robot's head moves significantly, altering the camera's perspective of its own hands. + +- **Current Status:** Most public GR00T demos feature a relatively fixed head position to stabilize observations. +- **Mitigation:** To handle natural head movement, we recommend training with aggressive camera pose augmentation or collecting data that explicitly includes head motion to ensure the policy becomes robust to viewpoint shifts. diff --git a/LICENSE b/LICENSE index 65c4eb09b..c6b51dc27 100644 --- a/LICENSE +++ b/LICENSE @@ -1,37 +1,190 @@ -NVIDIA License - -1. Definitions - -“Licensor” means any person or entity that distributes its Work. -“Work” means (a) the original work of authorship made available under this license, which may include software, documentation, or other files, and (b) any additions to or derivative works thereof that are made available under this license. -The terms “reproduce,” “reproduction,” “derivative works,” and “distribution” have the meaning as provided under U.S. copyright law; provided, however, that 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. -Works are “made available” under this license by including in or with the Work either (a) a copyright notice referencing the applicability of this license to the Work, or (b) a copy of this license. - -2. License Grant - -2.1 Copyright Grant. Subject to the terms and conditions of this license, each Licensor grants to you a perpetual, worldwide, non-exclusive, royalty-free, copyright license to use, reproduce, prepare derivative works of, publicly display, publicly perform, sublicense and distribute its Work and any resulting derivative works in any form. - -3. Limitations - -3.1 Redistribution. You may reproduce or distribute the Work only if (a) you do so under this license, (b) you include a complete copy of this license with your distribution, and (c) you retain without modification any copyright, patent, trademark, or attribution notices that are present in the Work. - -3.2 Derivative Works. You may specify that additional or different terms apply to the use, reproduction, and distribution of your derivative works of the Work (“Your Terms”) only if (a) Your Terms provide that the use limitation in Section 3.3 applies to your derivative works; (b) you comply with Other Licenses, and (c) you identify the specific derivative works that are subject to Your Terms and Other Licenses, as applicable. Notwithstanding Your Terms, this license (including the redistribution requirements in Section 3.1) will continue to apply to the Work itself. - -3.3 Use Limitation. The Work and any derivative works thereof only may be used or intended for use non-commercially. As used herein, “non-commercially” means for non-commercial research purposes only, and excludes any military, surveillance, service of nuclear technology or biometric processing purposes. - -3.4 Patent Claims. If you bring or threaten to bring a patent claim against any Licensor (including any claim, cross-claim or counterclaim in a lawsuit) to enforce any patents that you allege are infringed by any Work, then your rights under this license from such Licensor (including the grant in Section 2.1) will terminate immediately. - -3.5 Trademarks. This license does not grant any rights to use any Licensor’s or its affiliates’ names, logos, or trademarks, except as necessary to reproduce the notices described in this license. - -3.6 Termination. If you violate any term of this license, then your rights under this license (including the grant in Section 2.1) will terminate immediately. - -3.7 Components Under Other Licenses. The Work may include or be distributed with components provided with separate legal notices or terms that accompany the components, such as open source software licenses and other license terms, including but not limited to the Meta OPT-IML 175B License Agreement (“Other Licenses”). The components are subject to the applicable Other Licenses, including any proprietary notices, disclaimers, requirements and extended use rights; except that this Agreement will prevail regarding the use of third-party software, unless a third-party software license requires it license terms to prevail. - -4. Disclaimer of Warranty. - -THE WORK IS PROVIDED “AS IS” WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WARRANTIES OR CONDITIONS OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT. YOU BEAR THE RISK OF UNDERTAKING ANY ACTIVITIES UNDER THIS LICENSE. - -5. Limitation of Liability. - -EXCEPT AS PROHIBITED BY APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE SHALL ANY LICENSOR BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATED TO THIS LICENSE, THE USE OR INABILITY TO USE THE WORK (INCLUDING BUT NOT LIMITED TO LOSS OF GOODWILL, BUSINESS INTERRUPTION, LOST PROFITS OR DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY OTHER DAMAGES OR LOSSES), EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file + 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 the 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 the 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 any 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 + + Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. 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. diff --git a/README.md b/README.md index f17120c80..6d86ea8af 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,145 @@ +## Table of Contents + +- [NVIDIA Isaac GR00T](#nvidia-isaac-gr00t) +- [What's New in GR00T N1.7](#whats-new-in-gr00t-n17) +- [Installation](#installation) +- [LeRobot Integration](#lerobot-integration) +- [Model Checkpoints & Embodiment Tags](#model-checkpoints--embodiment-tags) +- [Data Format](#data-format) +- [Inference](#inference) +- [Fine-tuning](#fine-tuning) +- [Evaluation](#evaluation) +- [Contributions](#contributions) +- [License](#license) +- [Citation](#citation) + +--- + ## NVIDIA Isaac GR00T -
- GR00T Demo -
+ + + + + + +
+ + + + + +
+ +> We just released GR00T N1.7 General Availability, the latest version of GR00T N1 with a new VLM backbone (Cosmos-Reason2-2B / Qwen3-VL) and improved performance. + +> **This is a General Availability (GA) release.** You are welcome to download the model, explore the codebase, and build on the stack, with full support and stability guarantees. +> +> **What's available:** +> - Pre-trained GR00T N1.7 model weights and reference code +> - Fine-tuning and inference with custom robot data or demonstrations +> - Experimentation, prototyping, and research use cases +> - Production deployment with commercial support +> - Complete benchmarks and a fully validated, stable feature set +> - Pull request contributions +> +> We welcome feedback - please feel free to raise issues and pull requests in this repository. -> We just released GR00T N1.6, an updated version of GR00T N1 with improved performance and new features. Check out the [release blog post](https://research.nvidia.com/labs/gear/gr00t-n1_6/) for more details. +> Previous releases: [N1.6](https://github.com/NVIDIA/Isaac-GR00T/tree/n1d6) | [N1.5](https://github.com/NVIDIA/Isaac-GR00T/tree/n1d5) -> To use the older version, N1.5, please checkout the [n1.5-release](https://github.com/NVIDIA/Isaac-GR00T/tree/n1.5-release) branch. +NVIDIA Isaac GR00T N1.7 is an open vision-language-action (VLA) model for generalized humanoid robot skills. This cross-embodiment model takes multimodal input, including language and images, to perform manipulation tasks in diverse environments. -NVIDIA Isaac GR00T N1.6 is an open vision-language-action (VLA) model for generalized humanoid robot skills. This cross-embodiment model takes multimodal input, including language and images, to perform manipulation tasks in diverse environments. +GR00T N1.7 is trained on a diverse mixture of robot data including bimanual, semi-humanoid and an expansive humanoid dataset. It is adaptable through post-training for specific embodiments, tasks and environments. -GR00T N1.6 is trained on a diverse mixture of robot data including bimanual, semi-humanoid and an expansive humanoid dataset. It is adaptable through post-training for specific embodiments, tasks and environments. +GR00T N1.7 is fully commercially licensable under Apache 2.0. It delivers comparable performance to N1.6, with improved generalization and language-following capabilities driven by the inclusion of 20K hours of EgoScale human video data in pretraining. -The neural network architecture of GR00T N1.6 is a combination of vision-language foundation model and diffusion transformer head that denoises continuous actions. Here is a schematic diagram of the architecture: +The neural network architecture of GR00T N1.7 is a combination of vision-language foundation model and diffusion transformer head that denoises continuous actions. Here is a schematic diagram of the architecture:
model-architecture
-Here is the general procedure to use GR00T N1.6: +### Workflow Overview -1. We assume the user has already collected a dataset of robot demonstrations in the form of (video, state, action) triplets for a specific task. -2. The user will first convert the demonstration data into the LeRobot compatible data schema (more info in [`getting_started/data_preparation.md`](getting_started/data_preparation.md)), which is compatible with the upstream [Huggingface LeRobot Dataset V2](https://github.com/huggingface/lerobot). -3. Our repo provides convenient scripts to validate zero-shot performance of the pretrained model (see [Policy API Guide](getting_started/policy.md) and [RoboCasa Zero-Shot](examples/robocasa-gr1-tabletop-tasks/README.md)). -4. Our repo provides examples of different configurations for training with different robot embodiments (see [`examples/`](examples/) and [Fine-tuning Guide](getting_started/finetune_new_embodiment.md)). -5. Our repo provides convenient scripts for finetuning the pre-trained GR00T N1.6 model on user's data, and running inference, see [`examples`](examples). -6. Our repo provides convenient scripts to run academic simulation benchmarks with finetuned checkpoints (see [LIBERO](examples/LIBERO/README.md), [SimplerEnv](examples/SimplerEnv/README.md), [RoboCasa](examples/robocasa/README.md)). -7. The user will need to connect the `Gr00tPolicy` to the robot controller to execute actions on their target hardware. +1. **Prepare data** — Collect robot demonstrations (video, state, action) and convert them to the [GR00T LeRobot format](#data-format). Demo datasets are included for quick testing. +2. **Run inference** — Try zero-shot inference with the base model on [pretrain embodiments](#embodiment-tags), or use a [finetuned checkpoint](#checkpoints) for benchmark tasks. +3. **Fine-tune** — Adapt the model to your robot using [`launch_finetune.py`](#fine-tuning) with your own data and modality config. +4. **Evaluate** — Validate with [open-loop evaluation](#open-loop-evaluation), then test in [simulation benchmarks](#benchmark-examples) or on real hardware via the [Policy API](getting_started/policy.md). +5. **Deploy** — Connect `Gr00tPolicy` to your robot controller, optionally accelerated with [TensorRT](scripts/deployment/README.md). -## What's New in GR00T N1.6 +## What's New in GR00T N1.7 -GR00T N1.6 represents a significant upgrade over GR00T N1.5, with improvements in both model architecture and data leading to better performance in many aspects. +GR00T N1.7 builds on N1.6 with a new VLM backbone and code-level improvements. -### Model and Data Improvements +1. **Relative EEF Action Space** — N1.7 adopts a relative end-effector action space shared across robot and human embodiments. Representing actions as deltas from the current pose (rather than absolute targets) improves generalization and is a key factor in the model's cross-embodiment performance. See [`getting_started/finetune_new_embodiment.md`](getting_started/finetune_new_embodiment.md) for guidance on configuring relative EEF for your own robot. -Architectural changes: -- Base VLM: We use an internal NVIDIA Cosmos-Reason-2B VLM variant. The VLM supports flexible resolution and can encode images in their native aspect ratio without padding. The VLM is trained both general vision-language tasks and embodied reasoning tasks like next action prediction. -- Uses 2x larger DiT (32 layers vs 16 layers in N1.5). -- Removes N1.5's post-VLM 4-layer transformer adapter. Instead, unfreezes top 4 layers of the VLM during pretraining. -- Predicts state-relative action chunks for most embodiments, rather than absolute joint angles or EEF positions. +2. **Human Video Pretraining** — N1.7 is pretrained on 20K hours of EgoScale human video data alongside diverse robot demonstrations. Because the relative EEF action representation is consistent across both human and robot data, the model can transfer manipulation priors learned from human video directly to robot control. -Beyond the N1.5 data mixture, the N1.6 pretraining data additionally includes several thousand hours of teleoperated data from: -- Bimanual YAM arms -- AGIBot Genie1 -- Simulated Galaxea R1 Pro on the BEHAVIOR suite -- Whole-Body Locomanipulation with Unitree G1 +### Key Changes from N1.6 -Other code-level improvements: -- Faster dataloader with sharded dataloader support. -- RTC and Async Policy Wrapper for inference (soon to release) -- Simplified data processing pipeline with `processing_gr00t_n1d6.py` -- Flexible Training configuration +Compared with N1.6, N1.7 updates the model stack, training data interface, +evaluation coverage, deployment flow, fine-tuning workflow, and runtime behavior. -## Target Audience +- **New VLM backbone:** Cosmos-Reason2-2B (Qwen3-VL architecture), replacing the Eagle backbone used in N1.6. Supports flexible resolution and encodes images in their native aspect ratio without padding. +- **Updated model interface:** N1.7 moves to the `gr00t_n1d7` model package, expands the state/action dimensions, and increases the model action horizon. +- **More flexible dataset handling:** Fine-tuning can use multiple dataset paths with mixture weighting, making multi-dataset training easier to configure. +- **Broader benchmark coverage:** N1.7 refreshes and expands documented results across RoboCasa, RoboCasa GR1 tabletop tasks, SimplerEnv, and real G1 evaluation. +- **More complete deployment path:** N1.7 adds full-pipeline ONNX and TensorRT export support and improves deployment consistency across desktop GPUs and edge platforms. +- **More predictable runtime behavior:** Policy serving, rollout recording, evaluation, and configuration validation have been hardened so errors are easier to diagnose. -GR00T N1.6 is intended for researchers and professionals in robotics. This repository provides tools to: +
+Detailed changes from N1.6 -- Leverage a pre-trained foundation model for robot control -- Fine-tune on small, custom datasets -- Adapt the model to specific robotics tasks with minimal data -- Deploy the model for inference +These are the main code, model, training, evaluation, and deployment changes +that distinguish the current N1.7 main branch from the N1.6 / 1D6 code path. +Use the [`n1d6` branch](https://github.com/NVIDIA/Isaac-GR00T/tree/n1d6) when you need +the N1.6 model package and runtime behavior. -The focus is on enabling customization of robot behaviors through finetuning. +- Model package changed from `gr00t_n1d6` to `gr00t_n1d7`, so codepaths and processor metadata move to the N1.7 namespace. +- VLM backbone changed from vendored Eagle, `nvidia/Eagle-Block2A-2B-v2`, to `nvidia/Cosmos-Reason2-2B` via Qwen3-VL. +- Transformers changed from `4.51.3` to `4.57.3` to support the newer Qwen3-VL stack. +- Model defaults changed: `select_layer` `16` to `12`, `tune_top_llm_layers` `4` to `0`, and `load_bf16` `true` to `false`. +- State and action dimensions expanded from `29` to `132`, and `action_horizon` expanded from `16` to `40`. +- Action head remains flow-matching DiT, but changes from `32` to `16` diffusion layers and adds newer N1.7 behavior options. +- Dataset input handling now supports multiple dataset paths and `ds_weights_alpha` for dataset mixtures. +- The rollout CLI flag was renamed from `--action-horizon` to `--execution-horizon` to clarify how many predicted actions are executed per policy call. +- Server/client transport has stronger object-dtype ndarray serialization and cleaner socket timeout behavior. -## Installation Guide +
+ +--- + +## Installation + +### Hardware Requirements + +**Inference:** 1 GPU with 16 GB+ VRAM (e.g., RTX 4090, L40, H100, Jetson AGX Thor/Orin, DGX Spark). + +**Fine-tuning:** 1 or more GPUs with 40 GB+ VRAM recommended. We recommend H100 or L40 nodes for optimal performance. Other hardware (e.g., A6000) works but may require longer training time. See the [Hardware Recommendation Guide](getting_started/hardware_recommendation.md) for detailed specs. + +**CUDA / Python per platform:** dGPU on CUDA 12.8 with Python 3.12; Jetson Thor and Orin on JetPack 7.2 / CUDA 13.2 with Python 3.12; DGX Spark on CUDA 13.0 with Python 3.12. The per-platform install scripts and Dockerfiles live under `scripts/deployment/`; see the [Deployment & Inference Guide](scripts/deployment/README.md) for the full matrix. ### Clone the Repository GR00T relies on submodules for certain dependencies. Include them when cloning: +**Note:** `git-lfs` is **required** to download parquet data files in `demo_data/`. Install it before cloning: `sudo apt install git-lfs && git lfs install`. ```sh git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T cd Isaac-GR00T @@ -97,264 +153,456 @@ git submodule update --init --recursive ### Set Up the Environment -GR00T uses [uv](https://github.com/astral-sh/uv) for fast, reproducible dependency management. +GR00T uses [uv](https://github.com/astral-sh/uv) for fast, reproducible dependency management. Install uv first: + +```sh +curl -LsSf https://astral.sh/uv/install.sh | sh +``` -> **Requirement:** uv **v0.8.4+** is needed to parse `[tool.uv.extra-build-dependencies]` in `pyproject.toml` (required for building `flash-attn`). +#### dGPU (x86_64) — Default + +Install FFmpeg (required by `torchcodec`, the only supported video backend): +```sh +sudo apt-get update && sudo apt-get install -y ffmpeg +``` +> **FFmpeg version:** `torchcodec==0.8.0` supports **FFmpeg 4-7 only**. On Ubuntu 25.10+/26.04 the `ffmpeg` package is version 8, which `torchcodec` cannot load (`RuntimeError: Could not load libtorchcodec ... We support versions 4, 5, 6 and 7`). On those distros install an FFmpeg<8 runtime instead, e.g. `conda install -c conda-forge 'ffmpeg<8'`, and make sure its libraries are on `LD_LIBRARY_PATH`. -After installing uv, create the environment and install GR00T: +Create the environment and install GR00T: +```sh +uv sync --python 3.12 +``` +GPU dependencies (flash-attn, TensorRT, etc.) are included in the default install. +Verify the installation: ```sh -uv sync --python 3.10 -uv pip install -e . +uv run python -c "import gr00t; print('GR00T installed successfully')" ``` -> Note: CUDA 12.4 is recommended and officially tested. However, CUDA 11.8 has also been verified to work. -> In such cases, make sure to install a compatible version of `flash-attn` manually (e.g., `flash-attn==2.8.2` was confirmed working with CUDA 11.8). +> **Hugging Face access (required):** GR00T's VLM backbone is [`nvidia/Cosmos-Reason2-2B`](https://huggingface.co/nvidia/Cosmos-Reason2-2B), a **gated** model that every GR00T checkpoint (including the base `nvidia/GR00T-N1.7-3B`) loads on first use. Before running inference or finetuning, request access on the model page and authenticate: +> ```sh +> uv run huggingface-cli login # or: export HF_TOKEN= +> ``` +> Without access, model loading fails with a `GatedRepoError` / `401 Client Error`. + +> **`flash-attn` message on every `uv run`:** You may see `Installing flash-attn...` each time you run `uv run`. This is a known `uv` behavior with URL-pinned wheel sources — `uv` re-validates the cached wheel against the source URL on each invocation. It is **not** rebuilding from source; the wheel is already cached locally and the operation takes 2-3 seconds. This affects platforms that use URL-pinned flash-attn wheels (x86_64 and aarch64). +> To suppress it, remove the `flash-attn` entries under `[tool.uv.sources]` in your local `pyproject.toml` after the initial install. But that will break `uv lock` and cause flash-attn to build from source on next lock regeneration. + +
+Alternative: pip install (without uv) + +If you prefer pip/conda over uv, create a Python 3.12 virtualenv and install: +```sh +python3.12 -m venv .venv && source .venv/bin/activate +pip install -e . +``` +Note: GPU dependencies (flash-attn, TensorRT) may require manual installation with pip. The `uv` workflow handles these automatically. +
+ +> **If fine-tuning fails with `CUDA_HOME is unset`:** Run `bash scripts/deployment/dgpu/install_deps.sh` once to configure CUDA paths, or manually `export CUDA_HOME=/usr/local/cuda`. + +> **CUDA 13.x Users (Thor, Spark, and other CUDA 13+ platforms):** PyTorch 2.7 pins Triton to 3.3.1, which does not recognize CUDA major version 13+. This causes a `RuntimeError` in Triton's `ptx_get_version()`. Run `scripts/patch_triton_cuda13.sh` to fix: +> ```sh +> uv run bash scripts/patch_triton_cuda13.sh +> ``` + +> **GB300 (sm_103) Users:** Triton 3.3.1 (pinned by PyTorch 2.7) does not support the GB300 GPU architecture (sm_103). `torch.compile` will fail on GB300. Use PyTorch eager mode or TensorRT inference instead. Triton 3.5.1+ adds sm_103 support but is not yet compatible with the pinned PyTorch version. -For a containerized setup that avoids system-level dependency conflicts, see our [Docker Setup Guide](docker/README.md). +> **Video Backend:** GR00T uses [`torchcodec`](https://github.com/pytorch/torchcodec) as its sole video decoding backend. Backends such as `decord` and `pyav` are no longer supported. The default dGPU install pins `torchcodec` 0.8.0, which requires **FFmpeg 4-7** (FFmpeg 8 is not supported — see the FFmpeg version note above) and supports H.264 on all platforms; AV1 decoding is not guaranteed (convert AV1 datasets to H.264 with `examples/SimplerEnv/convert_av1_to_h264.py`). JetPack 7.2 Thor and Orin use the PyTorch cu132 `torchcodec` 0.15.0 wheel; Spark may build `torchcodec` from source during `install_deps.sh` when a platform wheel is not available. -For training and inference hardware recommendations (RTX PRO Servers, DGX, Jetson AGX Thor), see the [Hardware Recommendation Guide](getting_started/hardware_recommendation.md). +
+DGX Spark (tested with DGX Spark GB10) -## Model Checkpoints +```bash +bash scripts/deployment/spark/install_deps.sh +source .venv/bin/activate +source scripts/activate_spark.sh +``` -### Base Models -We provide pre-trained base VLA model checkpoints. These checkpoints have been pre-trained on 10k+ hours of robot data and can be used for finetuning on downstream tasks. +See the [Spark setup guide](scripts/deployment/README.md#dgx-spark-setup) for Docker and bare metal details. +
-| Model | Use Case | Description | Checkpoint Path | Branch | -| ----- | -------- | ----------- | --------------- | ------ | -| GR00T N1.5 | Finetuning | Base [GR00T N1.5 model](https://research.nvidia.com/labs/gear/gr00t-n1_5/) (3B parameters) | [nvidia/GR00T-N1.5-3B](https://huggingface.co/nvidia/GR00T-N1.5-3B) | [n1.5-release](https://github.com/NVIDIA/Isaac-GR00T/tree/n1.5-release) | -| GR00T N1.6 | Finetuning | Base [GR00T N1.6 model](https://research.nvidia.com/labs/gear/gr00t-n1_6/) (3B parameters) | [nvidia/GR00T-N1.6-3B](https://huggingface.co/nvidia/GR00T-N1.6-3B) | [main](https://github.com/NVIDIA/Isaac-GR00T) | +
+Jetson AGX Thor (tested with JetPack 7.2) -### Finetuned Models -We also provide finetuned checkpoints for various robot platforms and benchmarks. These models are finetuned from the base models above and can be used directly for evaluation or as starting points for further finetuning. +```bash +bash scripts/deployment/thor/install_deps.sh +source .venv/bin/activate +source scripts/activate_thor.sh +``` -| Model | Base Model | Description | Checkpoint Path | Example | -| ----- | ---------- | ----------- | --------------- | ------- | -| GR00T-N1.6-bridge | [nvidia/GR00T-N1.6-3B](https://huggingface.co/nvidia/GR00T-N1.6-3B) | Fine-tuned on [Bridge dataset](https://rail-berkeley.github.io/bridgedata/) for WidowX robot on manipulation tasks | [nvidia/GR00T-N1.6-bridge](https://huggingface.co/nvidia/GR00T-N1.6-bridge) | [SimplerEnv](examples/SimplerEnv/README.md) | -| GR00T-N1.6-fractal | [nvidia/GR00T-N1.6-3B](https://huggingface.co/nvidia/GR00T-N1.6-3B) | Fine-tuned on [Fractal dataset](https://www.tensorflow.org/datasets/catalog/fractal20220817_data) for Google robot on manipulation tasks | [nvidia/GR00T-N1.6-fractal](https://huggingface.co/nvidia/GR00T-N1.6-fractal) | [SimplerEnv](examples/SimplerEnv/README.md) | -| GR00T-N1.6-BEHAVIOR1k | [nvidia/GR00T-N1.6-3B](https://huggingface.co/nvidia/GR00T-N1.6-3B) | Fine-tuned on [BEHAVIOR-1K](https://behavior.stanford.edu/) for Galaxea R1 Pro robot on loco-manipulation tasks | [nvidia/GR00T-N1.6-BEHAVIOR1k](https://huggingface.co/nvidia/GR00T-N1.6-BEHAVIOR1k) | [BEHAVIOR](examples/BEHAVIOR/README.md) | -| GR00T-N1.6-G1-PnPAppleToPlate | [nvidia/GR00T-N1.6-3B](https://huggingface.co/nvidia/GR00T-N1.6-3B) | Fine-tuned for Unitree G1 loco-manipulation pick-and-place tasks | [nvidia/GR00T-N1.6-G1-PnPAppleToPlate](https://huggingface.co/nvidia/GR00T-N1.6-G1-PnPAppleToPlate) | [G1 LocoManipulation](examples/GR00T-WholeBodyControl/README.md) | +See the [Thor setup guide](scripts/deployment/README.md#jetson-thor-setup) for Docker and bare metal details. +
-## Quick Start +
+Jetson Orin (tested with JetPack 7.2) -We can quickly start by downloading a pre-trained checkpoint and starting the policy server for any pretrained embodiement, e.g. GR1 embodiment. ```bash -# On GPU server: Start the policy server -uv run python gr00t/eval/run_gr00t_server.py --embodiment-tag GR1 --model-path nvidia/GR00T-N1.6-3B +bash scripts/deployment/orin/install_deps.sh +source .venv/bin/activate +source scripts/activate_orin.sh +``` + +See the [Orin setup guide](scripts/deployment/README.md#jetson-orin-setup) for Docker and bare metal details. +
+ +> ⚠️ **aarch64 users (Spark / Thor / Orin):** After running `install_deps.sh`, always +> activate the venv with `source .venv/bin/activate && source scripts/activate_.sh` +> (`activate_spark.sh`, `activate_thor.sh`, or `activate_orin.sh`) and run the example +> commands in this guide with **plain `python`** / `torchrun`, not `uv run python` / +> `uv run torchrun`. The latter will re-sync against the root `pyproject.toml` (which targets +> x86_64 Python 3.12) and destroy the platform-specific environment. See the +> [Deployment & Inference Guide](scripts/deployment/README.md#platform-specific-setup) for +> per-platform Docker and bare-metal setup. + + +For a containerized setup that avoids system-level dependency conflicts, see our [Docker Setup Guide](docker/README.md). The recommended container workflow is to start the image first, then clone or pull the repo inside the running container so your checkout uses the image's prebuilt dependency environment. + +--- + +## LeRobot Integration + +GR00T N1.7 is also available through Hugging Face LeRobot via the `groot` policy type. Use the [LeRobot GR00T documentation](https://github.com/huggingface/lerobot/blob/main/docs/source/groot.mdx) for LeRobot-native training, evaluation, and rollout workflows. Use this repository for the reference GR00T implementation, model internals, deployment tooling, and benchmark-specific examples. + +--- + +## Model Checkpoints & Embodiment Tags + +### Checkpoints + +| Checkpoint | Type | Embodiment Tag | Description | +|------------|------|---------------|-------------| +| [`nvidia/GR00T-N1.7-3B`](https://huggingface.co/nvidia/GR00T-N1.7-3B) | Base | See [pretrain tags](getting_started/policy.md#--embodiment-tag) | Base model (3B params) — zero-shot inference on pretrain embodiments, or finetune for new tasks | +| [`nvidia/GR00T-N1.7-LIBERO`](https://huggingface.co/nvidia/GR00T-N1.7-LIBERO) | Finetuned | `LIBERO_PANDA` | Finetuned on [LIBERO](https://libero-project.github.io/) benchmark (Franka Panda) | +| [`nvidia/GR00T-N1.7-DROID`](https://huggingface.co/nvidia/GR00T-N1.7-DROID) | Finetuned | `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` | Finetuned on [DROID](https://droid-dataset.github.io/) dataset | +| [`nvidia/GR00T-N1.7-SimplerEnv-Bridge`](https://huggingface.co/nvidia/GR00T-N1.7-SimplerEnv-Bridge) | Finetuned | `SIMPLER_ENV_WIDOWX` | Finetuned on SimplerEnv Bridge (WidowX) | +| [`nvidia/GR00T-N1.7-SimplerEnv-Fractal`](https://huggingface.co/nvidia/GR00T-N1.7-SimplerEnv-Fractal) | Finetuned | `SIMPLER_ENV_GOOGLE` | Finetuned on SimplerEnv Fractal (Google Robot) | + +### Embodiment Tags + +Every inference or finetuning command requires an `--embodiment-tag`. The tag determines which modality config (state/action keys, normalization) the model uses. Tags are **case-insensitive**. + +For the full list of pretrain and posttrain tags, see the [Policy API Guide — Embodiment Tags](getting_started/policy.md#--embodiment-tag). + +--- + +## Data Format + +GR00T uses a flavor of the [LeRobot v2 dataset format](https://github.com/huggingface/lerobot) with an additional `meta/modality.json` file that describes state/action/video structure. A dataset looks like: + ``` +my_dataset/ + meta/ + info.json # dataset metadata + episodes.jsonl # episode index and lengths + tasks.jsonl # language task descriptions + modality.json # state/action/video key mapping (GR00T-specific) + data/chunk-000/ # parquet files (state, action per timestep) + videos/chunk-000/ # mp4 video files per episode +``` + +The `modality.json` maps how the concatenated state/action arrays split into named fields (e.g., `x`, `y`, `z`, `gripper`) and which video keys are available. This is what the embodiment tag uses to interpret the data. -Then, refer to the [robocasa-gr1-tabletop-tasks](examples/robocasa-gr1-tabletop-tasks/README.md) for more details on how to rollout the policy with `GR1` embodiment. +**Included demo datasets** (ready to use, no download needed): -## Getting started with this repo +| Dataset | Robot | Embodiment Tag | Use Case | +|---------|-------|---------------|----------| +| `demo_data/droid_sample` | DROID (3 episodes) | `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` | Zero-shot or finetuned inference (DROID) | +| `demo_data/libero_demo` | LIBERO Panda (5 episodes) | `LIBERO_PANDA` | Inference with finetuned checkpoint | +| `demo_data/simplerenv_bridge_sample` | WidowX (SimplerEnv Bridge) | `SIMPLER_ENV_WIDOWX` | Inference with finetuned SimplerEnv Bridge checkpoint | +| `demo_data/simplerenv_fractal_sample` | Google Robot (SimplerEnv Fractal) | `SIMPLER_ENV_GOOGLE` | Inference with finetuned SimplerEnv Fractal checkpoint | +| `demo_data/cube_to_bowl_5` | SO100 arm (5 episodes) | `NEW_EMBODIMENT` | Fine-tuning custom embodiment example | +| `demo_data/cube_to_bowl_5_with_mask` | SO100 arm + per-frame masks | `NEW_EMBODIMENT` | [Mask-guided background suppression](examples/mask-guided-background-suppression/README.md) example | -We provide accessible Jupyter notebooks and detailed documentation in the [`./getting_started`](getting_started) folder. +> To generate more DROID episodes: `python scripts/download_droid_sample.py --num-episodes 10` -## 1. Data Preparation +**Using your own data:** Convert your demonstrations to the format above. If coming from LeRobot v3, use the conversion helper in its own environment: +```bash +cd scripts/lerobot_conversion +uv venv +source .venv/bin/activate +uv pip install -e . --verbose +python convert_v3_to_v2.py --repo-id +``` +See the full [Data Preparation Guide](getting_started/data_preparation.md) for schema details and examples. -Please refer to the [data preparation guide](getting_started/data_preparation.md) for more details. +--- -## 2. Inference +## Inference -After data is prepared, the GR00T model can be used to generate output actions with the below simple inference script: +> **Prefer an interactive walkthrough?** The [`getting_started/GR00T_inference.ipynb`](getting_started/GR00T_inference.ipynb) notebook steps through loading the model and predicting actions from observations on a sample dataset. + +### Zero-Shot Inference (Base Model) + +The included `demo_data/droid_sample` dataset works with the base model out of the box — no finetuning or checkpoint download needed: ```bash uv run python scripts/deployment/standalone_inference_script.py \ - --model-path nvidia/GR00T-N1.6-3B \ - --dataset-path demo_data/gr1.PickNPlace \ - --embodiment-tag GR1 \ - --traj-ids 0 1 2 \ - --inference-mode pytorch \ - --action-horizon 8 + --model-path nvidia/GR00T-N1.7-3B \ + --dataset-path demo_data/droid_sample \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --traj-ids 1 2 \ + --inference-mode pytorch \ + --execution-horizon 8 ``` -GR00T-N1.6-3B inference timing (4 denoising steps, single view): - -| Device | Mode | Data Processing | Backbone | Action Head | E2E | Frequency | -|--------|------|-----------------|----------|-------------|-----|-----------| -| RTX 5090 | torch.compile | 2 ms | 18 ms | 16 ms | 37 ms | 27.3 Hz | -| H100 | torch.compile | 4 ms | 23 ms | 11 ms | 38 ms | 26.3 Hz | -| RTX 4090 | torch.compile | 2 ms | 25 ms | 17 ms | 44 ms | 22.8 Hz | -| Thor | torch.compile | 5 ms | 39 ms | 61 ms | 105 ms | 9.5 Hz | +This runs open-loop inference on 2 DROID episodes, comparing predicted actions against ground truth. The base model downloads automatically from HuggingFace on first run (~6 GB). -For more details, please check our full [inference guide](scripts/deployment/README.md) for more details including faster inference with `TensorRT` +> **Note:** The base model loads the gated `nvidia/Cosmos-Reason2-2B` backbone, so this command requires Hugging Face access (see [Set Up the Environment](#set-up-the-environment)). Without it the run fails with a `GatedRepoError`. -## 3. Finetuning +### Finetuned Inference -### Fine-tune on Pre-registered Post-train Embodiment Tags +For posttrain embodiments, use a finetuned checkpoint. Most finetuned checkpoints (e.g., DROID, SimplerEnv) have a flat file structure and can be passed directly as a HuggingFace model ID — no manual download needed: -GR00T provides several pre-registered embodiment tags with ready-to-use configurations: +```bash +uv run python scripts/deployment/standalone_inference_script.py \ + --model-path nvidia/GR00T-N1.7-DROID \ + --dataset-path demo_data/droid_sample \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --traj-ids 1 2 \ + --inference-mode pytorch \ + --execution-horizon 8 +``` -- `LIBERO_PANDA` -- `OXE_GOOGLE` -- `OXE_WIDOWX` -- `UNITREE_G1` -- `BEHAVIOR_R1_PRO` +Some checkpoints (e.g., LIBERO) use a nested folder structure with model files under a subfolder. HuggingFace does not support nested repo paths in `--model-path`, so you must download first: -**Example:** To finetune Libero-Spatial on GR00T N1.6, follow the instructions in the [Libero finetuning guide](examples/LIBERO/README.md#finetune-libero-spatial-dataset). We also provide simulation environment setup for evaluation linked with post-train checkpoints and benchmark numbers. +```bash +uv run hf download nvidia/GR00T-N1.7-LIBERO \ + --include "libero_10/config.json" "libero_10/embodiment_id.json" \ + "libero_10/model-*.safetensors" "libero_10/model.safetensors.index.json" \ + "libero_10/processor_config.json" "libero_10/statistics.json" \ + --local-dir checkpoints/GR00T-N1.7-LIBERO +``` -### Fine-tune on Custom Embodiments ("NEW_EMBODIMENT") +```bash +uv run python scripts/deployment/standalone_inference_script.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA \ + --traj-ids 0 1 2 \ + --inference-mode pytorch \ + --execution-horizon 8 +``` -To finetune GR00T on your own robot data and configuration, follow the detailed tutorial available at [`getting_started/finetune_new_embodiment.md`](getting_started/finetune_new_embodiment.md). +### Server-Client Inference (for Deployment) -#### Prerequisites +For real-world deployment or simulation evaluation, use the server-client architecture. The policy runs on a GPU server; a lightweight client sends observations and receives actions over ZMQ. -Ensure your input data follows the **GR00T-flavored LeRobot v2 format**, and specify your modality configuration at `modality_config_path`. +**Terminal 1 — Start the policy server:** +```bash +uv run python gr00t/eval/run_gr00t_server.py \ + --model-path nvidia/GR00T-N1.7-3B \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --device cuda:0 +``` -#### Run Fine-tuning Script +**Terminal 2 — Run open-loop evaluation as a client:** ```bash -# Set number of GPUs -export NUM_GPUS=1 +uv run python gr00t/eval/open_loop_eval.py \ + --dataset-path demo_data/droid_sample \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --host 127.0.0.1 \ + --port 5555 \ + --traj-ids 1 2 \ + --execution-horizon 8 +``` + +> **Tip:** If you get `ZMQError: Address already in use`, the default port 5555 is occupied. Use `--port `. + +For connecting to a real robot (e.g., DROID hardware), see [examples/DROID/README.md](examples/DROID/README.md). For faster inference with TensorRT, see the [Deployment & Inference Guide](scripts/deployment/README.md). +See the complete [Policy API Guide](getting_started/policy.md) for documentation on observation/action formats, batched inference, and troubleshooting. + +--- + +## Fine-tuning + +### Reproducing Benchmark Results + +Each benchmark has a self-contained README with dataset download, finetune, and evaluation commands: + +| Benchmark | Embodiment | Guide | +|-----------|-----------|-------| +| LIBERO | `LIBERO_PANDA` | [examples/LIBERO/README.md](examples/LIBERO/README.md) | +| SimplerEnv (Fractal) | `SIMPLER_ENV_GOOGLE` | [examples/SimplerEnv/README.md](examples/SimplerEnv/README.md) | +| SimplerEnv (Bridge) | `SIMPLER_ENV_WIDOWX` | [examples/SimplerEnv/README.md](examples/SimplerEnv/README.md) | +| SO100 | `NEW_EMBODIMENT` | [examples/SO100/README.md](examples/SO100/README.md) | + +### Humanoid Whole-Body Control (SONIC) + +GR00T N1.7 supports whole-body humanoid control via the `UNITREE_G1_SONIC` embodiment tag and the [GEAR-SONIC](https://github.com/NVlabs/GR00T-WholeBodyControl) controller. In this workflow, the VLA predicts compact latent action tokens that a learned whole-body controller decodes into full-body joint commands — including legs, arms, and hands. A single policy produces language-conditioned, coordinated manipulation and locomotion end-to-end. SONIC supports whole-body coordination with precise hand and foot placements. + +The complete collect → finetune → deploy workflow is documented in the [GR00T-WholeBodyControl repository](https://github.com/NVlabs/GR00T-WholeBodyControl): + +- [Data collection](https://nvlabs.github.io/GR00T-WholeBodyControl/tutorials/data_collection.html) — VR teleoperation with SONIC for demonstration recording +- [VLA Workflow](https://nvlabs.github.io/GR00T-WholeBodyControl/tutorials/vla_workflow.html) — finetuning Isaac-GR00T N1.7 on collected data and deploying the policy +- [VLA Inference](https://nvlabs.github.io/GR00T-WholeBodyControl/tutorials/vla_inference.html) — running the PolicyServer + SONIC decoder for real-time control + +> **Note:** The `UNITREE_G1` embodiment tag is compatible with the [decoupled WBC](https://github.com/NVlabs/GR00T-WholeBodyControl/tree/main/decoupled_wbc) controller, but the end-to-end collect-finetune-deploy workflow is only supported for GEAR-SONIC (`UNITREE_G1_SONIC`). + +### Fine-tune on Your Own Robot ("NEW_EMBODIMENT") + +To finetune GR00T on your own robot data and configuration, follow the detailed tutorial at [`getting_started/finetune_new_embodiment.md`](getting_started/finetune_new_embodiment.md). + +Ensure your input data follows the [GR00T LeRobot format](#data-format), and specify your modality configuration via `--modality-config-path`. + +**Single GPU:** +```bash CUDA_VISIBLE_DEVICES=0 uv run python \ gr00t/experiment/launch_finetune.py \ - --base-model-path nvidia/GR00T-N1.6-3B \ - --dataset-path \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path demo_data/cube_to_bowl_5 \ --embodiment-tag NEW_EMBODIMENT \ - --modality-config-path \ - --num-gpus $NUM_GPUS \ - --output-dir \ - --save-total-limit 5 \ - --save-steps 2000 \ + --modality-config-path examples/SO100/so100_config.py \ + --num-gpus 1 \ + --output-dir /tmp/test_finetune \ --max-steps 2000 \ - --use-wandb \ --global-batch-size 32 \ - --color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ --dataloader-num-workers 4 ``` -> For more extensive finetuning configuration, use `gr00t/experiment/launch_train.py` instead to launch the training process. - -### Recommended Fine-tuning Configuration - -For optimal results, maximize your batch size based on available hardware and train for a few thousand steps. - -#### Hardware Performance Considerations +**Multi-GPU (e.g., 8xH100):** +```bash +uv run torchrun --nproc_per_node=8 --master_port=29500 \ + gr00t/experiment/launch_finetune.py \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path demo_data/cube_to_bowl_5 \ + --embodiment-tag NEW_EMBODIMENT \ + --modality-config-path examples/SO100/so100_config.py \ + --num-gpus 8 \ + --output-dir /tmp/test_finetune_8gpu \ + --max-steps 2000 \ + --global-batch-size 32 \ + --dataloader-num-workers 4 +``` -**Fine-tuning Performance** -- We recommend using 1 H100 node or L40 node for optimal finetuning performance -- Other hardware configurations (e.g., A6000) will also work but may require longer training time -- Optimal batch size depends on your hardware and which model components are being tuned +Replace `demo_data/cube_to_bowl_5` and `examples/SO100/so100_config.py` with your own dataset and modality config. See [`examples/SO100`](examples/SO100/README.md) for a complete walkthrough. -#### Training Variance +> **Note:** Use `uv run torchrun` (not bare `torchrun`) to ensure the correct virtual environment is used. Add `--use-wandb` to enable Weights & Biases logging. For more extensive configuration, use `gr00t/experiment/launch_train.py`. -Users may observe some variance in post-training results across runs, even when using the same configuration, seed, and dropout settings. In our experiments, we have observed performance differences as large as 5-6% between runs. This variance may be attributed to non-deterministic operations in image augmentations or other stochastic components. When comparing results to reported benchmarks, please keep this inherent variance in mind. +### Training Tips -## 4. Evaluation +- Maximize batch size for your hardware and train for a few thousand steps. +- Users may observe 5-6% variance between runs due to non-deterministic image augmentations. Keep this in mind when comparing to reported benchmarks. +- **`--state_dropout_prob`** (model config default: 0.8; finetune CLI default: 0.2; see `gr00t/configs/finetune_config.py`): Randomly drops state inputs during training to improve generalization and reduce state-dependency. The shipped benchmark scripts override the CLI default per suite: LIBERO 10-Long uses 0.2 (the CLI default), SimplerEnv Bridge uses 0.8, SimplerEnv Fractal uses 0.5. If your task relies heavily on proprioceptive state, lower this value. -We recommend a two-stage evaluation approach: open-loop evaluation followed by simulation evaluation to comprehensively assess model quality. +--- -### 4.1 Open-Loop Evaluation +## Evaluation -Open-loop evaluation provides an offline assessment by comparing the model's predicted actions against ground truth data from your dataset. +### Open-Loop Evaluation -#### Running the Evaluation +Compare predicted actions against ground truth from your dataset: -Execute the evaluation script with your newly trained model: ```bash uv run python gr00t/eval/open_loop_eval.py \ --dataset-path \ --embodiment-tag NEW_EMBODIMENT \ --model-path \ --traj-ids 0 \ - --action-horizon 16 # ensure this is within the delta_indices of action's modality config. + --execution-horizon 16 ``` -#### Interpreting Results - -The evaluation generates a visualization saved at `/tmp/open_loop_eval/traj_{traj_id}.jpeg`, which includes: -- Ground truth actions vs. predicted actions -- Unnormalized mean squared error (MSE) metrics - -These plots provide a quick indicator of the policy's accuracy on the training dataset distribution. - -### 4.2 Closed-Loop Evaluation - -After validating performance through open-loop evaluation, test your model in closed-loop environments. +This generates a visualization at `/tmp/open_loop_eval/traj_{traj_id}.jpeg` with ground truth vs. predicted actions and MSE metrics. Use `--save-plot-path ` to save plots to a custom location. -#### Understanding the Policy API +### Closed-Loop Evaluation -After training your model, you'll use the `Gr00tPolicy` class to load and run inference. The policy expects observations in a specific format (nested dictionaries with video, state, and language modalities) and returns actions ready for execution. - -**Quick Start with Server-Client Architecture:** +Test your model in simulation or on real hardware using the server-client architecture: ```bash -# On GPU server: Start the policy server +# Start the policy server uv run python gr00t/eval/run_gr00t_server.py \ --embodiment-tag NEW_EMBODIMENT \ --model-path \ --device cuda:0 \ - --host 0.0.0.0 \ - --port 5555 + --host 0.0.0.0 --port 5555 ``` ```python from gr00t.policy.server_client import PolicyClient -policy = PolicyClient(host="localhost", port=5555) # Connect to the policy server -env = YourEnvironment() # Create an environment -obs, info = env.reset() # Reset the environment -if not policy.ping(): # Verify connection - raise RuntimeError("Cannot connect to policy server!") -action, info = policy.get_action(obs) # Run inference -obs, reward, done, truncated, info = env.step(action) # Execute the action +policy = PolicyClient(host="localhost", port=5555) +env = YourEnvironment() +obs, info = env.reset() +action, info = policy.get_action(obs) +obs, reward, done, truncated, info = env.step(action) ``` -**Debugging with ReplayPolicy:** +**Debugging with ReplayPolicy:** To verify your environment setup without a trained model, start the server with `--dataset-path ` (omit `--model-path`) to replay recorded actions from the dataset. + +See the complete [Policy API Guide](getting_started/policy.md) for observation/action formats, batched inference, and troubleshooting. + +### Benchmark Examples + +We support evaluation on public benchmarks using a server-client architecture. The policy server reuses the project root's uv environment; simulation clients have individual setup scripts. -When developing a new environment integration or debugging your inference loop, you can use `ReplayPolicy` to replay recorded actions from an existing dataset. This helps verify that your environment setup, observation formatting, and action execution work correctly—without needing a trained model. +You can use [the verification script](scripts/eval/check_sim_eval_ready.py) to verify that all dependencies are properly configured. + +#### One-Time Simulation Environment Setup + +Each simulation benchmark needs a one-time environment setup before its first run. First install the shared system libraries: ```bash -# Start server with ReplayPolicy (replays actions from dataset) -uv run python gr00t/eval/run_gr00t_server.py \ - --dataset-path \ - --embodiment-tag NEW_EMBODIMENT \ - --execution-horizon 8 # should match the executed action horizon in the environment +sudo apt update +sudo apt install libegl1-mesa-dev libglu1-mesa ``` -The server will replay actions from the first episode of the dataset. Use `policy.reset(options={"episode_index": N})` on the client to switch to a different episode. +Then run the benchmark's own `setup_*.sh` script, linked from each simulation benchmark's README (LIBERO, SimplerEnv, robocasa, and robocasa-gr1). This only needs to run once per benchmark; afterward you just launch the server and client. The real-hardware/custom-embodiment workflows (DROID, RoboLab, SO100) have no simulation setup script; follow their own READMEs instead. + +**Zero-shot** (evaluate with the base model, no finetuning): +- [DROID](examples/DROID/README.md) — real-world DROID robot (also available as the finetuned `nvidia/GR00T-N1.7-DROID` checkpoint; `examples/DROID/README.md` covers both paths) -**For detailed documentation on:** -- How to adapt the policy to your own environment -- Server-client architecture for remote inference -- Observation and action formats -- Querying modality configurations -- Batched inference -- Troubleshooting common errors +**Finetuned** (evaluate with finetuned checkpoints): +- [DROID](examples/DROID/README.md) — real-world DROID robot via `nvidia/GR00T-N1.7-DROID` +- [RoboLab](examples/RoboLab/README.md) — RoboLab simulation tasks via `nvidia/GR00T-N1.7-DROID` +- [LIBERO](examples/LIBERO/README.md) — LIBERO benchmark (Franka Panda) +- [SimplerEnv](examples/SimplerEnv/README.md) — Google Robot (Fractal) and WidowX (Bridge) +- [SO100](examples/SO100/README.md) — SO100 custom embodiment workflow -See the complete [Policy API Guide](getting_started/policy.md). +
+Adding a New Sim Benchmark -#### Evaluation Examples +Each sim benchmark registers its environments under a gym env_name with the format `{prefix}/{task_name}` (e.g., `libero_sim/LIVING_ROOM_SCENE2_put_soup_in_basket`). The evaluation framework uses the prefix to look up the corresponding `EmbodimentTag` via a mapping in [`gr00t/eval/sim/env_utils.py`](gr00t/eval/sim/env_utils.py). -We support evaluation on available public benchmarks and our internal benchmarks. Our evaluation framework uses a server-client architecture that communicates via RESTful API. Both the policy server and simulation environment client use the same IP (usually localhost) and port to run simulation evaluation. +> **Important:** The env_name prefix and the `EmbodimentTag` **name** are often different. For example, the prefix `libero_sim` maps to `EmbodimentTag.LIBERO_PANDA` (whose value happens to be `"libero_sim"`). Do not assume the prefix matches the tag name. -For the policy server, we reuse the project root's uv environment (same as finetuning) to run `run_gr00t_server`. For simulation environment clients, we provide individual setup scripts to configure uv environments, as they typically conflict with each other when using a single shared environment. +To add a new benchmark: -You can use [the verification script](scripts/eval/check_sim_eval_ready.py) to verify that all dependencies and environments for simulation evaluation are properly configured. +1. Add an entry to `ENV_PREFIX_TO_EMBODIMENT_TAG` in `gr00t/eval/sim/env_utils.py`: + ```python + ENV_PREFIX_TO_EMBODIMENT_TAG = { + ... + "my_new_benchmark": EmbodimentTag.MY_ROBOT, + } + ``` +2. If the benchmark has multiple env_name prefixes (e.g., `my_benchmark_v1`, `my_benchmark_v2`), all related prefixes **must** map to the same `EmbodimentTag`. +3. Add corresponding test cases in `tests/gr00t/eval/sim/test_env_utils.py` and update the `test_all_known_prefixes_present` test. +
-Please refer to each benchmark link below for more details. -**Zero-shot Evaluation** (evaluate without finetuning): -- **RoboCasa**: [Instructions](examples/robocasa/README.md) -- **RoboCasa GR1 Tabletop Tasks**: [Instructions](examples/robocasa-gr1-tabletop-tasks/README.md) -**Finetuned Evaluation** (test after task-specific finetuning): -- **G1 LocoManipulation**: [Instructions](examples/GR00T-WholeBodyControl/README.md) -- **LIBERO**: [Instructions](examples/LIBERO/README.md) -- **SimplerEnv**: [Instructions](examples/SimplerEnv/README.md) -- **BEHAVIOR**: [Instructions](examples/BEHAVIOR/README.md) -- **PointNav**: [Instructions](examples/PointNav/README.md) -- **SO-100**: [Instructions](examples/SO100/README.md) +## Running Tests +Install the development dependencies before running the test suite: +```bash +uv sync --python 3.12 --extra dev +uv run python -m pytest +``` -# Contributing +Use targeted test paths for faster local checks, and reserve GPU-marked tests for machines with the required CUDA hardware. -For more details, see [CONTRIBUTING.md](CONTRIBUTING.md) +--- +## Contributions -## License +We welcome issues and pull requests. See [CONTRIBUTING.md](CONTRIBUTING.md) for how to contribute and for support details now that GR00T N1.7 has reached General Availability (GA). + +## License + +- **Code:** Apache 2.0 — see [LICENSE](LICENSE) +- **Model weights:** [NVIDIA Open Model License](https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-open-model-license/) ``` -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -372,7 +620,7 @@ For more details, see [CONTRIBUTING.md](CONTRIBUTING.md) ## Citation - + [Paper Site](https://research.nvidia.com/labs/lpr/publication/gr00tn1_2025/) ```bibtex @inproceedings{gr00tn1_2025, diff --git a/demo_data/cube_to_bowl_5_with_mask/data/chunk-000/episode_000000.parquet b/demo_data/cube_to_bowl_5_with_mask/data/chunk-000/episode_000000.parquet new file mode 100644 index 000000000..4d2399683 --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/data/chunk-000/episode_000000.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:037ef9dacbe35d080286f7c2b7e551d4a337b206df03d2f9c88d4c46ac408082 +size 28581 diff --git a/demo_data/cube_to_bowl_5_with_mask/masks/chunk-000/observation.images.front/episode_000000_masks.npz b/demo_data/cube_to_bowl_5_with_mask/masks/chunk-000/observation.images.front/episode_000000_masks.npz new file mode 100644 index 000000000..3a180ee7d Binary files /dev/null and b/demo_data/cube_to_bowl_5_with_mask/masks/chunk-000/observation.images.front/episode_000000_masks.npz differ diff --git a/demo_data/cube_to_bowl_5_with_mask/masks/chunk-000/observation.images.wrist/episode_000000_masks.npz b/demo_data/cube_to_bowl_5_with_mask/masks/chunk-000/observation.images.wrist/episode_000000_masks.npz new file mode 100644 index 000000000..e43586ab2 Binary files /dev/null and b/demo_data/cube_to_bowl_5_with_mask/masks/chunk-000/observation.images.wrist/episode_000000_masks.npz differ diff --git a/demo_data/cube_to_bowl_5_with_mask/meta/episodes.jsonl b/demo_data/cube_to_bowl_5_with_mask/meta/episodes.jsonl new file mode 100644 index 000000000..be6e59df6 --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/meta/episodes.jsonl @@ -0,0 +1 @@ +{"episode_index": 0, "tasks": ["cube into yellow bowl"], "length": 568} diff --git a/demo_data/cube_to_bowl_5_with_mask/meta/info.json b/demo_data/cube_to_bowl_5_with_mask/meta/info.json new file mode 100644 index 000000000..50805b5be --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/meta/info.json @@ -0,0 +1,128 @@ +{ + "codebase_version": "v2.1", + "robot_type": "so101_follower", + "total_episodes": 1, + "total_frames": 568, + "total_tasks": 2, + "chunks_size": 1000, + "fps": 30, + "splits": { + "train": "0:1" + }, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "mask_path": "masks/chunk-{episode_chunk:03d}/{mask_key}/episode_{episode_index:06d}_masks.npz", + "features": { + "action": { + "dtype": "float32", + "names": [ + "shoulder_pan.pos", + "shoulder_lift.pos", + "elbow_flex.pos", + "wrist_flex.pos", + "wrist_roll.pos", + "gripper.pos" + ], + "shape": [ + 6 + ] + }, + "observation.state": { + "dtype": "float32", + "names": [ + "shoulder_pan.pos", + "shoulder_lift.pos", + "elbow_flex.pos", + "wrist_flex.pos", + "wrist_roll.pos", + "gripper.pos" + ], + "shape": [ + 6 + ] + }, + "observation.images.wrist": { + "dtype": "video", + "shape": [ + 480, + 640, + 3 + ], + "names": [ + "height", + "width", + "channels" + ], + "info": { + "video.height": 480, + "video.width": 640, + "video.codec": "av1", + "video.pix_fmt": "yuv420p", + "video.is_depth_map": false, + "video.fps": 30, + "video.channels": 3, + "has_audio": false + } + }, + "observation.images.front": { + "dtype": "video", + "shape": [ + 480, + 640, + 3 + ], + "names": [ + "height", + "width", + "channels" + ], + "info": { + "video.height": 480, + "video.width": 640, + "video.codec": "av1", + "video.pix_fmt": "yuv420p", + "video.is_depth_map": false, + "video.fps": 30, + "video.channels": 3, + "has_audio": false + } + }, + "timestamp": { + "dtype": "float32", + "shape": [ + 1 + ], + "names": null + }, + "frame_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + }, + "episode_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + }, + "index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + }, + "task_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + } + }, + "total_chunks": 0, + "total_videos": 2 +} \ No newline at end of file diff --git a/demo_data/cube_to_bowl_5_with_mask/meta/modality.json b/demo_data/cube_to_bowl_5_with_mask/meta/modality.json new file mode 100644 index 000000000..c0327018e --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/meta/modality.json @@ -0,0 +1,43 @@ +{ + "state": { + "single_arm": { + "start": 0, + "end": 5 + }, + "gripper": { + "start": 5, + "end": 6 + } + }, + "action": { + "single_arm": { + "start": 0, + "end": 5 + }, + "gripper": { + "start": 5, + "end": 6 + } + }, + "video": { + "front": { + "original_key": "observation.images.front" + }, + "wrist": { + "original_key": "observation.images.wrist" + } + }, + "annotation": { + "human.task_description": { + "original_key": "task_index" + } + }, + "mask": { + "front": { + "original_key": "observation.images.front" + }, + "wrist": { + "original_key": "observation.images.wrist" + } + } +} \ No newline at end of file diff --git a/demo_data/cube_to_bowl_5_with_mask/meta/relative_stats.json b/demo_data/cube_to_bowl_5_with_mask/meta/relative_stats.json new file mode 100644 index 000000000..6620d6a69 --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/meta/relative_stats.json @@ -0,0 +1,688 @@ +{ + "single_arm": { + "max": [ + [ + 7.227047920227051, + 16.08368682861328, + 31.912792205810547, + 17.933265686035156, + 3.892965793609619 + ], + [ + 9.206897735595703, + 20.15316390991211, + 39.331809997558594, + 22.375808715820312, + 4.874370574951172 + ], + [ + 11.133679389953613, + 24.191795349121094, + 46.702816009521484, + 26.220321655273438, + 5.649164199829102 + ], + [ + 12.995877265930176, + 28.230426788330078, + 53.599369049072266, + 29.552230834960938, + 6.328370094299316 + ], + [ + 14.858074188232422, + 32.13432693481445, + 60.28241729736328, + 32.45697021484375, + 6.798589706420898 + ], + [ + 16.630714416503906, + 35.95650100708008, + 66.55200958251953, + 35.105411529541016, + 7.211812496185303 + ], + [ + 18.480424880981445, + 39.90733337402344, + 72.61260986328125, + 37.582984924316406, + 7.368552207946777 + ], + [ + 20.098922729492188, + 43.81123352050781, + 78.41114044189453, + 39.4625244140625, + 7.523510932922363 + ], + [ + 21.563278198242188, + 47.67427062988281, + 83.94927978515625, + 41.00811767578125, + 7.5757575035095215 + ], + [ + 22.959924697875977, + 51.58424377441406, + 89.15812683105469, + 42.460487365722656, + 7.680250644683838 + ], + [ + 24.34720802307129, + 55.53507995605469, + 94.06930541992188, + 43.57112503051758, + 7.975325584411621 + ], + [ + 25.7344913482666, + 59.43898010253906, + 98.78675079345703, + 43.91285705566406, + 8.285242080688477 + ], + [ + 26.851810455322266, + 63.30201721191406, + 103.48894500732422, + 43.91285705566406, + 8.285242080688477 + ], + [ + 27.969558715820312, + 67.16505432128906, + 107.81326293945312, + 43.91285705566406, + 8.360644340515137 + ], + [ + 29.086877822875977, + 70.94029235839844, + 112.09748840332031, + 43.91285705566406, + 8.722214698791504 + ], + [ + 30.165876388549805, + 74.54389953613281, + 116.06822967529297, + 43.91285705566406, + 9.083785057067871 + ] + ], + "min": [ + [ + -7.29669189453125, + -19.12729263305664, + -16.433109283447266, + -16.5345458984375, + -2.8984992504119873 + ], + [ + -9.223474502563477, + -23.731897354125977, + -19.97119140625, + -20.14093780517578, + -3.5699868202209473 + ], + [ + -11.073184967041016, + -27.936100006103516, + -23.314973831176758, + -23.335166931152344, + -4.196946144104004 + ], + [ + -12.842272758483887, + -32.233375549316406, + -26.76325035095215, + -26.22027587890625, + -4.719411849975586 + ], + [ + -14.611360549926758, + -36.637779235839844, + -30.006494522094727, + -28.590187072753906, + -5.132635116577148 + ], + [ + -16.380447387695312, + -40.76420593261719, + -33.24974060058594, + -30.75402069091797, + -5.498361587524414 + ], + [ + -18.056425094604492, + -44.868309020996094, + -36.48902893066406, + -32.81481170654297, + -5.811841011047363 + ], + [ + -19.732402801513672, + -48.972415924072266, + -39.73678970336914, + -34.865211486816406, + -6.0730743408203125 + ], + [ + -21.40838050842285, + -52.976417541503906, + -42.98003387451172, + -36.71992874145508, + -6.177567481994629 + ], + [ + -23.04646873474121, + -56.68012237548828, + -46.319862365722656, + -38.26552200317383, + -6.2808732986450195 + ], + [ + -24.72244644165039, + -60.58402633666992, + -49.563106536865234, + -39.605037689208984, + -6.624037742614746 + ], + [ + -26.3409423828125, + -64.38783264160156, + -52.80239486694336, + -40.53239822387695, + -6.937518119812012 + ], + [ + -27.923812866210938, + -67.8996810913086, + -56.24897766113281, + -41.356712341308594, + -7.247435569763184 + ], + [ + -29.234024047851562, + -71.69513702392578, + -59.59275817871094, + -42.2840690612793, + -7.350741386413574 + ], + [ + -30.537561416625977, + -75.20698547363281, + -62.93654251098633, + -43.1083869934082, + -7.50570011138916 + ], + [ + -31.561769485473633, + -78.71884155273438, + -66.28032684326172, + -43.82966613769531, + -7.609005928039551 + ] + ], + "q01": [ + [ + -4.23784034729004, + -14.375373306274414, + -14.165144500732422, + -7.273419036865234, + -1.3692410469055176 + ], + [ + -5.497804870605469, + -17.904056701660156, + -17.344697723388673, + -9.157820739746095, + -1.7802792310714721 + ], + [ + -6.63084794998169, + -21.586752548217774, + -20.466706695556642, + -11.088979949951172, + -2.1261278915405275 + ], + [ + -7.840053424835205, + -24.966434936523438, + -23.643480529785155, + -12.948350677490234, + -2.4942054080963136 + ], + [ + -8.744508361816406, + -28.386601943969726, + -26.769420394897463, + -14.786944274902345, + -2.7678825092315673 + ], + [ + -9.681380615234376, + -31.900753784179688, + -29.964607849121094, + -16.589480590820312, + -2.943312339782715 + ], + [ + -10.673098640441895, + -35.34648208618164, + -33.080697021484376, + -18.63617950439453, + -3.150517883300781 + ], + [ + -11.95774356842041, + -38.33349609375, + -36.28114837646484, + -20.1299072265625, + -3.325282545089722 + ], + [ + -12.806884117126465, + -41.66666946411133, + -39.415945587158205, + -22.051227111816406, + -3.5802699661254884 + ], + [ + -13.808811225891114, + -44.544593811035156, + -42.451150512695314, + -23.286329650878905, + -3.731286058425903 + ], + [ + -14.876593208312988, + -47.34120468139648, + -45.51039611816406, + -24.05833953857422, + -3.8670087242126465 + ], + [ + -15.927819595336913, + -50.11199157714844, + -48.38114288330078, + -24.950498504638674, + -4.060867290496827 + ], + [ + -16.791456451416014, + -52.501808929443364, + -51.349612121582034, + -26.047926635742186, + -4.140543460845947 + ], + [ + -17.81103698730469, + -55.46957763671875, + -53.96011047363281, + -28.00439697265625, + -4.140543460845947 + ], + [ + -18.637240829467775, + -58.448575744628904, + -56.549330139160155, + -29.336976623535158, + -4.1746462631225585 + ], + [ + -19.514024200439454, + -60.94651321411133, + -59.3496810913086, + -30.503678283691407, + -4.276408081054687 + ] + ], + "q99": [ + [ + 4.676858329772943, + 11.665605163574195, + 16.091908340454072, + 11.34327850341795, + 1.4188514328002877 + ], + [ + 6.009842987060514, + 14.986484107971183, + 20.531300048828086, + 11.557043151855465, + 1.8548733472824075 + ], + [ + 7.167793502807573, + 18.18393402099609, + 25.149650650024167, + 11.994031372070294, + 2.231784992218015 + ], + [ + 8.535839309692367, + 21.31609405517577, + 29.81890274047832, + 12.981733093261711, + 2.5109715843200457 + ], + [ + 9.847635879516584, + 24.459614562988268, + 34.81173721313457, + 13.973945922851536, + 2.8182767677306986 + ], + [ + 10.77020095825194, + 27.582397460937493, + 39.36669281005826, + 14.523704528808594, + 2.9696255302429146 + ], + [ + 12.221202812194822, + 30.694138946533187, + 44.825713348388625, + 14.888239288330057, + 3.2303361511230144 + ], + [ + 13.452139015197684, + 33.650971984863276, + 49.40192550659139, + 15.709628753662104, + 3.68079715728755 + ], + [ + 14.549436683654768, + 36.66313110351561, + 54.610656280517546, + 16.890311279296842, + 3.847796630859373 + ], + [ + 15.546420669555651, + 39.55626144409177, + 59.776550750732284, + 18.00881057739257, + 4.262800464630121 + ], + [ + 16.628041381835878, + 42.72866424560545, + 64.04900299072258, + 19.164665222167944, + 4.476536846160838 + ], + [ + 17.2377612304687, + 45.35421188354486, + 69.50755218505844, + 19.856475830078093, + 4.909399929046601 + ], + [ + 18.191674728393448, + 48.02970336914055, + 74.03710662841792, + 20.6749267578125, + 5.004559707641552 + ], + [ + 18.799336853027274, + 51.032914581298826, + 78.21505065917944, + 21.63610748291012, + 5.268262500762906 + ], + [ + 19.532418518066354, + 53.253244018554575, + 83.61114990234364, + 22.62223937988278, + 5.628598232269281 + ], + [ + 20.329340209960932, + 55.95927246093747, + 87.7207006835937, + 23.27384674072258, + 5.821815452575663 + ] + ], + "mean": [ + [ + -0.05541839078068733, + -0.48545631766319275, + 0.3736479580402374, + 1.5412200689315796, + -0.006794311106204987 + ], + [ + -0.0573614202439785, + -0.48668450117111206, + 0.3732597529888153, + 1.5434463024139404, + -0.005626989994198084 + ], + [ + -0.059304386377334595, + -0.4879351854324341, + 0.37297090888023376, + 1.5452935695648193, + -0.004459710791707039 + ], + [ + -0.06124741956591606, + -0.48916348814964294, + 0.3728508949279785, + 1.5469378232955933, + -0.0032924364786595106 + ], + [ + -0.0631905123591423, + -0.49034836888313293, + 0.3728039860725403, + 1.5485563278198242, + -0.0021379701793193817 + ], + [ + -0.06513368338346481, + -0.4914482533931732, + 0.37277916073799133, + 1.5500496625900269, + -0.0009706764249131083 + ], + [ + -0.06707657873630524, + -0.4925262928009033, + 0.37277957797050476, + 1.5514907836914062, + 0.000183802520041354 + ], + [ + -0.06901966780424118, + -0.49360397458076477, + 0.37277981638908386, + 1.5529323816299438, + 0.0013254927471280098 + ], + [ + -0.07096276432275772, + -0.49463874101638794, + 0.3727555572986603, + 1.5543735027313232, + 0.002454245463013649 + ], + [ + -0.07290593534708023, + -0.4956730306148529, + 0.37273216247558594, + 1.55581533908844, + 0.003557488787919283 + ], + [ + -0.07484886795282364, + -0.4967080354690552, + 0.37270739674568176, + 1.5572580099105835, + 0.004647879395633936 + ], + [ + -0.07679196447134018, + -0.4977640211582184, + 0.3726597726345062, + 1.558700442314148, + 0.005725559778511524 + ], + [ + -0.07873509079217911, + -0.49894964694976807, + 0.37261173129081726, + 1.560217022895813, + 0.006790251936763525 + ], + [ + -0.08067819476127625, + -0.5001566410064697, + 0.3725634515285492, + 1.561811923980713, + 0.007854948751628399 + ], + [ + -0.08262105286121368, + -0.5013633966445923, + 0.3725149929523468, + 1.5634052753448486, + 0.008894022554159164 + ], + [ + -0.08454133570194244, + -0.5025922060012817, + 0.37246689200401306, + 1.5649996995925903, + 0.00993306003510952 + ] + ], + "std": [ + [ + 1.132851243019104, + 3.606031894683838, + 5.186952114105225, + 2.995941162109375, + 0.3995916247367859 + ], + [ + 1.431091070175171, + 4.4754958152771, + 6.1009039878845215, + 3.320981740951538, + 0.4986129403114319 + ], + [ + 1.724656343460083, + 5.348557949066162, + 7.051599979400635, + 3.6684064865112305, + 0.5925520062446594 + ], + [ + 2.0116126537323, + 6.2185750007629395, + 8.02036190032959, + 4.026544094085693, + 0.6813880205154419 + ], + [ + 2.291104316711426, + 7.082036972045898, + 8.996530532836914, + 4.38752555847168, + 0.7655370235443115 + ], + [ + 2.562415361404419, + 7.93643856048584, + 9.97282886505127, + 4.746272563934326, + 0.8453348875045776 + ], + [ + 2.8255069255828857, + 8.780613899230957, + 10.945276260375977, + 5.099498748779297, + 0.9210251569747925 + ], + [ + 3.080246686935425, + 9.613626480102539, + 11.911107063293457, + 5.445309162139893, + 0.9928242564201355 + ], + [ + 3.3267204761505127, + 10.435517311096191, + 12.868016242980957, + 5.782613277435303, + 1.060863971710205 + ], + [ + 3.565215587615967, + 11.24631118774414, + 13.815924644470215, + 6.1110992431640625, + 1.1253132820129395 + ], + [ + 3.7958297729492188, + 12.04518985748291, + 14.753532409667969, + 6.430792808532715, + 1.1863986253738403 + ], + [ + 4.018860816955566, + 12.832834243774414, + 15.68036937713623, + 6.741820335388184, + 1.2442182302474976 + ], + [ + 4.234539985656738, + 13.609060287475586, + 16.596139907836914, + 7.044507026672363, + 1.2990483045578003 + ], + [ + 4.442948818206787, + 14.374250411987305, + 17.500635147094727, + 7.33843469619751, + 1.3512938022613525 + ], + [ + 4.644613265991211, + 15.128630638122559, + 18.3944034576416, + 7.623828887939453, + 1.401329755783081 + ], + [ + 4.839704990386963, + 15.872313499450684, + 19.275827407836914, + 7.900622367858887, + 1.4495384693145752 + ] + ] + } +} \ No newline at end of file diff --git a/demo_data/cube_to_bowl_5_with_mask/meta/stats.json b/demo_data/cube_to_bowl_5_with_mask/meta/stats.json new file mode 100644 index 000000000..67727fac2 --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/meta/stats.json @@ -0,0 +1,122 @@ +{ + "action": { + "mean": [ + 2.008634090423584, + -58.35673904418945, + 52.06699752807617, + 84.1640853881836, + -1.612541913986206, + 9.500179290771484 + ], + "std": [ + 10.53703498840332, + 57.80693435668945, + 64.35710144042969, + 10.117609024047852, + 2.4160561561584473, + 15.964427947998047 + ], + "min": [ + -29.98137855529785, + -100.0, + -97.83783721923828, + 25.296239852905273, + -11.12852668762207, + 0.41356492042541504 + ], + "max": [ + 12.476722717285156, + 59.78928756713867, + 99.60688018798828, + 100.0, + 3.9184954166412354, + 63.68899917602539 + ], + "q01": [ + -28.770950317382812, + -99.38542938232422, + -91.9931217956543, + 46.92838798522949, + -11.076279640197754, + 0.41356492042541504 + ], + "q99": [ + 11.080074310302734, + 56.504828834533626, + 97.64128112792969, + 100.0, + 2.7690699100494385, + 63.110008239746094 + ] + }, + "observation.state": { + "mean": [ + 2.0609896183013916, + -57.88691329956055, + 51.65326690673828, + 82.56475067138672, + -1.6077017784118652, + 10.830865859985352 + ], + "std": [ + 10.588406562805176, + 58.685508728027344, + 62.279624938964844, + 9.900030136108398, + 2.4157283306121826, + 16.614965438842773 + ], + "min": [ + -30.173410415649414, + -99.39939880371094, + -94.67084503173828, + 27.03972625732422, + -11.105371475219727, + 0.3401360511779785 + ], + "max": [ + 11.907514572143555, + 60.76076126098633, + 98.43260192871094, + 100.0, + 3.6157023906707764, + 63.46938705444336 + ], + "q01": [ + -28.940269470214844, + -99.1991958618164, + -90.18390876770019, + 47.52840698242188, + -11.002065658569336, + 0.3401360511779785 + ], + "q99": [ + 10.905587196350098, + 59.51851905822746, + 98.0146255493164, + 100.0, + 2.5826447010040283, + 63.1972770690918 + ] + }, + "timestamp": { + "mean": [ + 18.6832275390625 + ], + "std": [ + 15.743875503540039 + ], + "min": [ + 0.0 + ], + "max": [ + 59.86666488647461 + ], + "q01": [ + 0.2666666805744171 + ], + "q99": [ + 58.48433357238768 + ] + } +} \ No newline at end of file diff --git a/demo_data/cube_to_bowl_5_with_mask/meta/tasks.jsonl b/demo_data/cube_to_bowl_5_with_mask/meta/tasks.jsonl new file mode 100644 index 000000000..5aebc0711 --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/meta/tasks.jsonl @@ -0,0 +1,2 @@ +{"task_index": 0, "task": "cube into yellow bowl"} +{"task_index": 1, "task": "cube into green bowl"} diff --git a/demo_data/cube_to_bowl_5_with_mask/videos/chunk-000/observation.images.front/episode_000000.mp4 b/demo_data/cube_to_bowl_5_with_mask/videos/chunk-000/observation.images.front/episode_000000.mp4 new file mode 100644 index 000000000..682ec5dcf --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/videos/chunk-000/observation.images.front/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c9a00cb6e2706b8dbc573e3ac2b05402cf6e667ec61786be971e104cac81605 +size 2414613 diff --git a/demo_data/cube_to_bowl_5_with_mask/videos/chunk-000/observation.images.wrist/episode_000000.mp4 b/demo_data/cube_to_bowl_5_with_mask/videos/chunk-000/observation.images.wrist/episode_000000.mp4 new file mode 100644 index 000000000..bd5808da4 --- /dev/null +++ b/demo_data/cube_to_bowl_5_with_mask/videos/chunk-000/observation.images.wrist/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33f42924b0e6f603fb91ffc856430b0abd2c182f1eaf2324f2a3906a60452f06 +size 1442621 diff --git a/demo_data/droid_sample/data/chunk-000/episode_000000.parquet b/demo_data/droid_sample/data/chunk-000/episode_000000.parquet new file mode 100644 index 000000000..92ad90564 --- /dev/null +++ b/demo_data/droid_sample/data/chunk-000/episode_000000.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137c8556829ffeb4cbc7c41369d0e0c3cd485c2ce4f576d0a0c9b0e83eb0314f +size 140159 diff --git a/demo_data/droid_sample/data/chunk-000/episode_000001.parquet b/demo_data/droid_sample/data/chunk-000/episode_000001.parquet new file mode 100644 index 000000000..f7a1f2bc2 --- /dev/null +++ b/demo_data/droid_sample/data/chunk-000/episode_000001.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14f86cfe04380c5ba8e876cab6e0532b9231af5cd4e5ddcd8e019e458f79d709 +size 211230 diff --git a/demo_data/droid_sample/data/chunk-000/episode_000002.parquet b/demo_data/droid_sample/data/chunk-000/episode_000002.parquet new file mode 100644 index 000000000..8f42cc2dc --- /dev/null +++ b/demo_data/droid_sample/data/chunk-000/episode_000002.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c22df4dca06122846d4ea0848751d734a211ed008d2bd63e29b66a8ce67222c6 +size 308481 diff --git a/demo_data/droid_sample/meta/episodes.jsonl b/demo_data/droid_sample/meta/episodes.jsonl new file mode 100644 index 000000000..c549a038a --- /dev/null +++ b/demo_data/droid_sample/meta/episodes.jsonl @@ -0,0 +1,3 @@ +{"episode_index": 0, "tasks": [""], "length": 167} +{"episode_index": 1, "tasks": ["Put the blue block in the green bowl"], "length": 266} +{"episode_index": 2, "tasks": ["Move the bottom right tip of the duvet to the left"], "length": 411} diff --git a/demo_data/droid_sample/meta/info.json b/demo_data/droid_sample/meta/info.json new file mode 100644 index 000000000..219ffe3a9 --- /dev/null +++ b/demo_data/droid_sample/meta/info.json @@ -0,0 +1,49 @@ +{ + "codebase_version": "v2.1", + "robot_type": "droid", + "total_episodes": 3, + "total_frames": 844, + "fps": 15, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "chunks_size": 1000, + "splits": { + "train": "0:3" + }, + "features": { + "observation.images.exterior_1_left": { + "dtype": "video", + "shape": [ + 180, + 320, + 3 + ] + }, + "observation.images.wrist_left": { + "dtype": "video", + "shape": [ + 180, + 320, + 3 + ] + }, + "observation.state": { + "dtype": "float32", + "shape": [ + 17 + ] + }, + "action": { + "dtype": "float32", + "shape": [ + 17 + ] + }, + "task_index": { + "dtype": "int64", + "shape": [ + 1 + ] + } + } +} \ No newline at end of file diff --git a/demo_data/droid_sample/meta/modality.json b/demo_data/droid_sample/meta/modality.json new file mode 100644 index 000000000..c9f01322b --- /dev/null +++ b/demo_data/droid_sample/meta/modality.json @@ -0,0 +1,43 @@ +{ + "state": { + "eef_9d": { + "start": 0, + "end": 9 + }, + "gripper_position": { + "start": 9, + "end": 10 + }, + "joint_position": { + "start": 10, + "end": 17 + } + }, + "action": { + "eef_9d": { + "start": 0, + "end": 9 + }, + "gripper_position": { + "start": 9, + "end": 10 + }, + "joint_position": { + "start": 10, + "end": 17 + } + }, + "video": { + "exterior_1_left": { + "original_key": "observation.images.exterior_1_left" + }, + "wrist_left": { + "original_key": "observation.images.wrist_left" + } + }, + "annotation": { + "language.language_instruction": { + "original_key": "task_index" + } + } +} \ No newline at end of file diff --git a/demo_data/droid_sample/meta/relative_stats.json b/demo_data/droid_sample/meta/relative_stats.json new file mode 100644 index 000000000..5db056de2 --- /dev/null +++ b/demo_data/droid_sample/meta/relative_stats.json @@ -0,0 +1,4834 @@ +{ + "__fingerprints__": { + "eef_9d": "sha256:d178ccdc492661ab000e2f364209abf2417eab82eb10d5192e1e04543a5d9e77", + "joint_position": "sha256:c70f5e9a175c4820fe6b6403e18de68c379a51c87654dc5b99b583254b1f11a1" + }, + "eef_9d": { + "max": [ + [ + 0.08385815471410751, + 0.07893279939889908, + 0.09344028681516647, + 1.0, + 0.15977777540683746, + 0.2756974697113037, + 0.18580004572868347, + 1.0, + 0.17945638298988342 + ], + [ + 0.10056769847869873, + 0.101486936211586, + 0.11694682389497757, + 1.0, + 0.19767774641513824, + 0.34229201078414917, + 0.229178324341774, + 1.0, + 0.2275213897228241 + ], + [ + 0.11811833083629608, + 0.12227248400449753, + 0.14131683111190796, + 1.0, + 0.22934021055698395, + 0.40388426184654236, + 0.27119842171669006, + 1.0, + 0.2627362012863159 + ], + [ + 0.1349784880876541, + 0.14419876039028168, + 0.16617900133132935, + 1.0, + 0.2666788399219513, + 0.4577878415584564, + 0.30172184109687805, + 1.0, + 0.29376140236854553 + ], + [ + 0.15191872417926788, + 0.1652292162179947, + 0.19061681628227234, + 1.0, + 0.3003934919834137, + 0.509002149105072, + 0.32966434955596924, + 1.0, + 0.31564658880233765 + ], + [ + 0.16895397007465363, + 0.18630465865135193, + 0.2153686136007309, + 1.0, + 0.3269821107387543, + 0.5544936656951904, + 0.3502345681190491, + 1.0, + 0.3290961682796478 + ], + [ + 0.18619492650032043, + 0.20747189223766327, + 0.23990358412265778, + 1.0, + 0.35586604475975037, + 0.6004248261451721, + 0.36207321286201477, + 1.0, + 0.3492805063724518 + ], + [ + 0.20255810022354126, + 0.22938981652259827, + 0.26487720012664795, + 1.0, + 0.38185441493988037, + 0.6387602090835571, + 0.36774757504463196, + 1.0, + 0.38822293281555176 + ], + [ + 0.21662013232707977, + 0.2522564232349396, + 0.2897658944129944, + 1.0, + 0.4074786305427551, + 0.6713553667068481, + 0.36785921454429626, + 1.0, + 0.4274948835372925 + ], + [ + 0.22914491593837738, + 0.27348214387893677, + 0.3130512237548828, + 1.0, + 0.4410254955291748, + 0.7005125880241394, + 0.3675936460494995, + 1.0, + 0.46274858713150024 + ], + [ + 0.24026183784008026, + 0.2935466766357422, + 0.33293887972831726, + 1.0, + 0.47337549924850464, + 0.7372458577156067, + 0.3692704141139984, + 1.0, + 0.4954064190387726 + ], + [ + 0.2571277618408203, + 0.3143463730812073, + 0.34923407435417175, + 1.0, + 0.5008516907691956, + 0.7749360203742981, + 0.3715318441390991, + 1.0, + 0.5225494503974915 + ], + [ + 0.2739711105823517, + 0.3344026505947113, + 0.36206281185150146, + 1.0, + 0.5282590389251709, + 0.8071429133415222, + 0.3737472593784332, + 1.0, + 0.5497511029243469 + ], + [ + 0.2926863133907318, + 0.3525005877017975, + 0.3707907795906067, + 1.0, + 0.5547084212303162, + 0.8349544405937195, + 0.37620124220848083, + 1.0, + 0.5702276825904846 + ], + [ + 0.30937063694000244, + 0.36961829662323, + 0.37620624899864197, + 1.0, + 0.5801233649253845, + 0.8585622906684875, + 0.3777446746826172, + 1.0, + 0.5881227254867554 + ], + [ + 0.3244030177593231, + 0.3865451514720917, + 0.38049131631851196, + 1.0, + 0.6075394749641418, + 0.8715718984603882, + 0.3784024119377136, + 1.0, + 0.6005953550338745 + ], + [ + 0.3390650153160095, + 0.40162140130996704, + 0.3851414918899536, + 1.0, + 0.6337327361106873, + 0.8911387324333191, + 0.37742117047309875, + 1.0, + 0.6075139045715332 + ], + [ + 0.35224851965904236, + 0.40605786442756653, + 0.38829731941223145, + 1.0, + 0.6617494821548462, + 0.9116165637969971, + 0.3807399272918701, + 1.0, + 0.6137265563011169 + ], + [ + 0.365259051322937, + 0.399645060300827, + 0.3921153247356415, + 0.9999998211860657, + 0.6911815404891968, + 0.9292022585868835, + 0.38454964756965637, + 1.0, + 0.6191103458404541 + ], + [ + 0.37718650698661804, + 0.3851258158683777, + 0.3996478319168091, + 0.9999979734420776, + 0.7206162214279175, + 0.9433763027191162, + 0.3883536159992218, + 0.9999997615814209, + 0.6235589385032654 + ], + [ + 0.38825562596321106, + 0.38272497057914734, + 0.4077940285205841, + 0.9999913573265076, + 0.747123122215271, + 0.9546656608581543, + 0.39126503467559814, + 0.9999992251396179, + 0.627675473690033 + ], + [ + 0.39920851588249207, + 0.3826685845851898, + 0.41645142436027527, + 0.9999796748161316, + 0.7713693380355835, + 0.9632714986801147, + 0.39426741003990173, + 0.9999986886978149, + 0.6311351656913757 + ], + [ + 0.4080136716365814, + 0.3793553113937378, + 0.42332008481025696, + 0.9998804926872253, + 0.7922605276107788, + 0.9689995646476746, + 0.3972793221473694, + 0.9999831914901733, + 0.6340650320053101 + ], + [ + 0.4162248969078064, + 0.3752719759941101, + 0.437285453081131, + 0.9999567270278931, + 0.8140850067138672, + 0.9765765070915222, + 0.40127259492874146, + 0.9999762177467346, + 0.636523962020874 + ], + [ + 0.4231542944908142, + 0.3731490969657898, + 0.46137115359306335, + 0.9995923042297363, + 0.8336503505706787, + 0.9829616546630859, + 0.40520885586738586, + 0.9999951720237732, + 0.6380470395088196 + ], + [ + 0.4304685890674591, + 0.3819431960582733, + 0.4847337007522583, + 0.9995497465133667, + 0.8490381836891174, + 0.9879007935523987, + 0.4170583188533783, + 0.9999816417694092, + 0.6385583281517029 + ], + [ + 0.43795472383499146, + 0.38971734046936035, + 0.5078415870666504, + 0.9995906352996826, + 0.86017245054245, + 0.9910487532615662, + 0.4401435852050781, + 0.9999820590019226, + 0.6373910903930664 + ], + [ + 0.4467301368713379, + 0.39906471967697144, + 0.5293472409248352, + 0.9996439218521118, + 0.8701016306877136, + 0.9930968880653381, + 0.4607134759426117, + 0.9999377131462097, + 0.6352571845054626 + ], + [ + 0.45899635553359985, + 0.406816691160202, + 0.5497741103172302, + 0.9997764825820923, + 0.874812126159668, + 0.9955117702484131, + 0.4770136773586273, + 0.9999039769172668, + 0.6322718262672424 + ], + [ + 0.4653550982475281, + 0.41450732946395874, + 0.5683690905570984, + 0.9998871088027954, + 0.8834917545318604, + 0.9969056248664856, + 0.4926890730857849, + 0.9998916387557983, + 0.6292688250541687 + ], + [ + 0.4619382321834564, + 0.41934308409690857, + 0.5859857797622681, + 0.9999432563781738, + 0.886361837387085, + 0.9975503087043762, + 0.5052409768104553, + 0.9999558925628662, + 0.625906765460968 + ], + [ + 0.4819859564304352, + 0.42230138182640076, + 0.6017528176307678, + 0.9999538064002991, + 0.8842214345932007, + 0.997532844543457, + 0.5128415822982788, + 0.9999993443489075, + 0.6232929229736328 + ], + [ + 0.5028998851776123, + 0.42536550760269165, + 0.6165757179260254, + 0.9999412894248962, + 0.8796729445457458, + 0.9974075555801392, + 0.518102765083313, + 0.9999880194664001, + 0.6270619630813599 + ], + [ + 0.5221604108810425, + 0.4271126091480255, + 0.630014955997467, + 0.9999377131462097, + 0.8734655976295471, + 0.997247576713562, + 0.519020140171051, + 0.9999760985374451, + 0.6304476857185364 + ], + [ + 0.540493905544281, + 0.4281916916370392, + 0.6427670121192932, + 0.9999112486839294, + 0.8707283735275269, + 0.9971490502357483, + 0.5184984803199768, + 0.9999909996986389, + 0.6333915591239929 + ], + [ + 0.5578802227973938, + 0.4320504367351532, + 0.6546762585639954, + 0.9998931288719177, + 0.8707755208015442, + 0.9974417686462402, + 0.5180832147598267, + 0.9999085068702698, + 0.6360145211219788 + ], + [ + 0.5741020441055298, + 0.43996351957321167, + 0.6653059124946594, + 0.9998866319656372, + 0.8708989024162292, + 0.9974352121353149, + 0.5176194906234741, + 0.9998703598976135, + 0.6376450657844543 + ], + [ + 0.589387059211731, + 0.44856321811676025, + 0.6753552556037903, + 0.9998566508293152, + 0.8712365627288818, + 0.9986828565597534, + 0.5170679092407227, + 0.9997969269752502, + 0.638228178024292 + ], + [ + 0.6040249466896057, + 0.45780429244041443, + 0.6846708655357361, + 0.9998325109481812, + 0.8721035122871399, + 0.9985576868057251, + 0.5227276086807251, + 0.9998825192451477, + 0.637030303478241 + ], + [ + 0.6179838180541992, + 0.4696052074432373, + 0.693419337272644, + 0.9998193383216858, + 0.87274569272995, + 0.997373640537262, + 0.5295984148979187, + 0.9998523592948914, + 0.6342744827270508 + ] + ], + "min": [ + [ + -0.09850378334522247, + -0.0984773188829422, + -0.08230959624052048, + 0.9604161381721497, + -0.18814702332019806, + -0.2096671164035797, + -0.15195919573307037, + 0.9778716564178467, + -0.1967276632785797 + ], + [ + -0.12591469287872314, + -0.12343299388885498, + -0.09781212359666824, + 0.9355562925338745, + -0.23768745362758636, + -0.27515825629234314, + -0.18926453590393066, + 0.9643943309783936, + -0.2557382881641388 + ], + [ + -0.15231312811374664, + -0.14515970647335052, + -0.11979381740093231, + 0.9042337536811829, + -0.2806466519832611, + -0.3381401300430298, + -0.21724101901054382, + 0.9478769302368164, + -0.3091225326061249 + ], + [ + -0.17929309606552124, + -0.16628137230873108, + -0.14076584577560425, + 0.8694451451301575, + -0.32319051027297974, + -0.39851880073547363, + -0.2489922046661377, + 0.9343860149383545, + -0.35571983456611633 + ], + [ + -0.20622560381889343, + -0.18480266630649567, + -0.1619078516960144, + 0.8312453031539917, + -0.364656537771225, + -0.45427244901657104, + -0.2769182622432709, + 0.919014573097229, + -0.39298680424690247 + ], + [ + -0.23221991956233978, + -0.20062881708145142, + -0.18269169330596924, + 0.7910196781158447, + -0.3988403081893921, + -0.5003286004066467, + -0.304384708404541, + 0.9063113927841187, + -0.41491973400115967 + ], + [ + -0.25745299458503723, + -0.21378986537456512, + -0.20363648235797882, + 0.7505804896354675, + -0.42957356572151184, + -0.5402402877807617, + -0.3297886252403259, + 0.8979674577713013, + -0.4301620423793793 + ], + [ + -0.2813741862773895, + -0.22593754529953003, + -0.22248230874538422, + 0.710141122341156, + -0.45883044600486755, + -0.5756973624229431, + -0.35828444361686707, + 0.8845067620277405, + -0.43232622742652893 + ], + [ + -0.30256375670433044, + -0.2386193424463272, + -0.2428167462348938, + 0.6739290952682495, + -0.4851941466331482, + -0.6035743355751038, + -0.3904123902320862, + 0.8691220283508301, + -0.43232008814811707 + ], + [ + -0.32646843791007996, + -0.2470853626728058, + -0.26261547207832336, + 0.6389321088790894, + -0.5062261819839478, + -0.6152176856994629, + -0.4248252213001251, + 0.8538541197776794, + -0.43231478333473206 + ], + [ + -0.3475860059261322, + -0.2495718151330948, + -0.2826838493347168, + 0.6101420521736145, + -0.5232684016227722, + -0.6245089173316956, + -0.46212998032569885, + 0.8399094939231873, + -0.43231675028800964 + ], + [ + -0.36763423681259155, + -0.2499106526374817, + -0.2984417676925659, + 0.5835298895835876, + -0.5350255966186523, + -0.6462001800537109, + -0.49919411540031433, + 0.8278532028198242, + -0.43231746554374695 + ], + [ + -0.3872259259223938, + -0.24999742209911346, + -0.31638815999031067, + 0.5549927353858948, + -0.5448683500289917, + -0.6716095209121704, + -0.5372975468635559, + 0.8184008002281189, + -0.4323132634162903 + ], + [ + -0.4071725308895111, + -0.24999521672725677, + -0.33207178115844727, + 0.5213469862937927, + -0.5470926761627197, + -0.7003498077392578, + -0.573738157749176, + 0.8090587854385376, + -0.43232041597366333 + ], + [ + -0.4260317087173462, + -0.2499966323375702, + -0.3451482355594635, + 0.48876887559890747, + -0.549473762512207, + -0.7307830452919006, + -0.6068241000175476, + 0.7947188019752502, + -0.4323166310787201 + ], + [ + -0.44346749782562256, + -0.24999581277370453, + -0.3596203923225403, + 0.4627678096294403, + -0.5491209030151367, + -0.758974552154541, + -0.635373592376709, + 0.7717432975769043, + -0.43232473731040955 + ], + [ + -0.4575325548648834, + -0.24999520182609558, + -0.37015068531036377, + 0.435526579618454, + -0.5520911812782288, + -0.7816123366355896, + -0.6590354442596436, + 0.7507101893424988, + -0.4323195815086365 + ], + [ + -0.4749446213245392, + -0.24999701976776123, + -0.37322860956192017, + 0.38782215118408203, + -0.5560141801834106, + -0.8055697679519653, + -0.6848241686820984, + 0.7259873747825623, + -0.43232211470603943 + ], + [ + -0.4900561571121216, + -0.2534514367580414, + -0.36774536967277527, + 0.34034788608551025, + -0.5603272318840027, + -0.8310264348983765, + -0.7080839276313782, + 0.7021014094352722, + -0.4323141276836395 + ], + [ + -0.5055829286575317, + -0.26121407747268677, + -0.37146541476249695, + 0.2954419255256653, + -0.563580334186554, + -0.8530893921852112, + -0.7319128513336182, + 0.6794430613517761, + -0.4325837194919586 + ], + [ + -0.5187162160873413, + -0.2706775367259979, + -0.37610605359077454, + 0.2528577148914337, + -0.5655969977378845, + -0.8749142289161682, + -0.755443274974823, + 0.6538435816764832, + -0.4512709379196167 + ], + [ + -0.5311821699142456, + -0.2808004319667816, + -0.3794177770614624, + 0.21182118356227875, + -0.5676602125167847, + -0.8939764499664307, + -0.7771787643432617, + 0.6279030442237854, + -0.4684624969959259 + ], + [ + -0.5427349209785461, + -0.2891584634780884, + -0.38027292490005493, + 0.17723023891448975, + -0.569861650466919, + -0.9078758358955383, + -0.7965469360351562, + 0.6014432907104492, + -0.48623570799827576 + ], + [ + -0.5499646067619324, + -0.29443344473838806, + -0.3781881332397461, + 0.1592642068862915, + -0.5701555013656616, + -0.9185214042663574, + -0.8144314289093018, + 0.5760730504989624, + -0.49764013290405273 + ], + [ + -0.5542452335357666, + -0.29826363921165466, + -0.37536701560020447, + 0.1518208384513855, + -0.5694250464439392, + -0.9258469343185425, + -0.8292872309684753, + 0.55086749792099, + -0.5112676620483398 + ], + [ + -0.5561670660972595, + -0.30013641715049744, + -0.3773302137851715, + 0.13591617345809937, + -0.5676393508911133, + -0.9286880493164062, + -0.8427781462669373, + 0.5282324552536011, + -0.527408242225647 + ], + [ + -0.5564931631088257, + -0.3017054498195648, + -0.3803715705871582, + 0.10673405230045319, + -0.5654733777046204, + -0.9294029474258423, + -0.8546808362007141, + 0.506282389163971, + -0.5425784587860107 + ], + [ + -0.5566475987434387, + -0.3025447130203247, + -0.3822455406188965, + 0.08766026049852371, + -0.5625172853469849, + -0.9294015765190125, + -0.8650686740875244, + 0.4857119917869568, + -0.5511283874511719 + ], + [ + -0.5566455125808716, + -0.30268949270248413, + -0.38509824872016907, + 0.06962579488754272, + -0.5592738389968872, + -0.9294028878211975, + -0.8743349313735962, + 0.46554866433143616, + -0.5599693655967712 + ], + [ + -0.5566471815109253, + -0.30274346470832825, + -0.38727104663848877, + 0.060368724167346954, + -0.5564831495285034, + -0.9294019937515259, + -0.8818995952606201, + 0.44612810015678406, + -0.567624568939209 + ], + [ + -0.5566477179527283, + -0.3024788200855255, + -0.38994717597961426, + 0.05116657912731171, + -0.5560055375099182, + -0.9408989548683167, + -0.8844130039215088, + 0.42735448479652405, + -0.5715915560722351 + ], + [ + -0.5665276646614075, + -0.30217528343200684, + -0.39256641268730164, + 0.02882884256541729, + -0.55613112449646, + -0.9567832350730896, + -0.8851614594459534, + 0.4189312756061554, + -0.572957456111908 + ], + [ + -0.5836316347122192, + -0.3014172613620758, + -0.3928001821041107, + -0.026184966787695885, + -0.552875280380249, + -0.9705226421356201, + -0.8860654830932617, + 0.39980268478393555, + -0.5730989575386047 + ], + [ + -0.5992085337638855, + -0.3006449043750763, + -0.39438334107398987, + -0.08075450360774994, + -0.5476359724998474, + -0.9821435809135437, + -0.8863739967346191, + 0.39209768176078796, + -0.5767109394073486 + ], + [ + -0.6126400828361511, + -0.300172358751297, + -0.3925577998161316, + -0.13091416656970978, + -0.5565364956855774, + -0.9901829361915588, + -0.8860892653465271, + 0.3914419412612915, + -0.5805339217185974 + ], + [ + -0.6242882609367371, + -0.2990978956222534, + -0.3908819556236267, + -0.18064767122268677, + -0.5708268880844116, + -0.9958654642105103, + -0.8859955668449402, + 0.39161261916160583, + -0.5841468572616577 + ], + [ + -0.6366129517555237, + -0.2966499328613281, + -0.3873438239097595, + -0.22519217431545258, + -0.5844009518623352, + -0.9990917444229126, + -0.8867756724357605, + 0.39123523235321045, + -0.5922772884368896 + ], + [ + -0.6496105194091797, + -0.29368704557418823, + -0.39943480491638184, + -0.26927101612091064, + -0.5995667576789856, + -0.9999704360961914, + -0.8889432549476624, + 0.38966479897499084, + -0.6008526682853699 + ], + [ + -0.6617180109024048, + -0.29148849844932556, + -0.4134305715560913, + -0.3114960789680481, + -0.6123514771461487, + -0.9993411898612976, + -0.8924819827079773, + 0.38737165927886963, + -0.6091049909591675 + ], + [ + -0.6726367473602295, + -0.2880340814590454, + -0.4236701428890228, + -0.35195690393447876, + -0.6229584217071533, + -0.9999127984046936, + -0.898892879486084, + 0.3845345079898834, + -0.6158916354179382 + ] + ], + "q01": [ + [ + -0.0864895099401474, + -0.08092794403433799, + -0.07520113617181778, + 0.9624385833740234, + -0.10846575886011124, + -0.19710892856121062, + -0.1359347814321518, + 0.9826559603214264, + -0.1554131069779396 + ], + [ + -0.11218591451644898, + -0.09827179789543151, + -0.09120053485035896, + 0.9418958449363708, + -0.1458022737503052, + -0.2482200515270233, + -0.16754727602005004, + 0.9739823496341705, + -0.18853153467178346 + ], + [ + -0.1366121742129326, + -0.1151178839802742, + -0.10388095051050186, + 0.9163013958930969, + -0.17488131523132325, + -0.2928928881883621, + -0.20206830888986588, + 0.9626995229721069, + -0.20971624791622162 + ], + [ + -0.16257573395967484, + -0.1325874960422516, + -0.12341103345155716, + 0.8906492722034455, + -0.22007810264825822, + -0.33818641006946565, + -0.23511868476867676, + 0.9510631275177002, + -0.23555043160915376 + ], + [ + -0.185575994849205, + -0.14157766371965408, + -0.13985104233026505, + 0.8621498227119446, + -0.25119008153676986, + -0.3848514497280121, + -0.26281638622283937, + 0.9417555546760559, + -0.25260260194540024 + ], + [ + -0.20973318368196486, + -0.1566343519091606, + -0.15629344314336777, + 0.8306697940826416, + -0.2823942333459854, + -0.426123314499855, + -0.29386153936386106, + 0.9284238719940185, + -0.2673620319366455 + ], + [ + -0.2343691486120224, + -0.16688495606184006, + -0.177325219810009, + 0.7972956919670104, + -0.3215649229288101, + -0.46567883133888244, + -0.3200717544555664, + 0.9151818752288818, + -0.2725029158592224 + ], + [ + -0.2582134395837784, + -0.17998260825872422, + -0.1931370559334755, + 0.7665676867961884, + -0.34397705078125, + -0.5024499744176865, + -0.3466847002506256, + 0.9033303499221802, + -0.301770675778389 + ], + [ + -0.2782673847675324, + -0.19152088940143586, + -0.20726965099573136, + 0.728895652294159, + -0.36993534326553346, + -0.5368937861919403, + -0.3758783400058746, + 0.8934880232810974, + -0.3108796924352646 + ], + [ + -0.2996448403596878, + -0.2022252833843231, + -0.22604648530483246, + 0.6923482251167298, + -0.40406083822250366, + -0.5703283095359802, + -0.404241189956665, + 0.8866311919689178, + -0.3233789193630219 + ], + [ + -0.32051599383354185, + -0.21091786593198777, + -0.24153583735227585, + 0.655238687992096, + -0.4195640981197357, + -0.6000863075256347, + -0.4310968154668808, + 0.8730065619945526, + -0.3243395572900772 + ], + [ + -0.34127776086330414, + -0.21905381858348846, + -0.2403123462200165, + 0.619228572845459, + -0.4462283718585968, + -0.6272131490707398, + -0.4609632420539856, + 0.8580986249446869, + -0.3326152288913727 + ], + [ + -0.35798184216022494, + -0.22535261303186416, + -0.24901538074016571, + 0.584852648973465, + -0.46845307409763337, + -0.6565780484676361, + -0.49062985956668853, + 0.8435864984989166, + -0.33435742735862733 + ], + [ + -0.3789142221212387, + -0.22921686589717866, + -0.2607553917169571, + 0.5611259937286377, + -0.48086646020412444, + -0.682760134935379, + -0.5168889284133911, + 0.8274767112731933, + -0.3393332874774933 + ], + [ + -0.39645073890686033, + -0.23304753750562668, + -0.2725119060277939, + 0.5321532046794891, + -0.501425628066063, + -0.7085603058338166, + -0.5428294384479523, + 0.8094074189662933, + -0.34592044532299043 + ], + [ + -0.40966191828250886, + -0.23691859543323518, + -0.28845642268657684, + 0.4945820653438568, + -0.512104594707489, + -0.7346128308773041, + -0.574343044757843, + 0.7961167979240418, + -0.3587010139226913 + ], + [ + -0.42542516767978666, + -0.23905894190073013, + -0.29422237038612364, + 0.45967028915882113, + -0.5264926040172577, + -0.759382472038269, + -0.5984449255466461, + 0.7804069435596466, + -0.3714577579498291 + ], + [ + -0.44055781602859495, + -0.24316953718662263, + -0.29821268558502195, + 0.422140793800354, + -0.533494383096695, + -0.7791370940208435, + -0.6225964641571045, + 0.7628444373607636, + -0.3885780769586563 + ], + [ + -0.45100666761398317, + -0.24590046882629393, + -0.304337557554245, + 0.3863616925477982, + -0.53584641456604, + -0.7963448774814605, + -0.6516629612445831, + 0.7377292954921723, + -0.4038068300485611 + ], + [ + -0.4605309599637985, + -0.24964027106761932, + -0.31282912313938144, + 0.35077245950698854, + -0.5354238903522491, + -0.8122842395305634, + -0.6809883308410645, + 0.7144818639755249, + -0.4121061486005783 + ], + [ + -0.46313332676887514, + -0.2507521146535873, + -0.31681530773639677, + 0.32158495783805846, + -0.5350064551830291, + -0.8160009813308716, + -0.7032543992996216, + 0.6915566718578339, + -0.4210784691572189 + ], + [ + -0.4739589935541153, + -0.25263939261436463, + -0.3120053851604462, + 0.2836964929103851, + -0.532699499130249, + -0.8202533280849457, + -0.7240859854221344, + 0.6670193612575531, + -0.4317657881975174 + ], + [ + -0.48239029943943024, + -0.25833868205547333, + -0.3205812245607376, + 0.2527423191070557, + -0.5331876850128174, + -0.836243498325348, + -0.7438037514686584, + 0.6450408673286437, + -0.437747957110405 + ], + [ + -0.49465708434581757, + -0.2605225682258606, + -0.32756861627101896, + 0.21690994679927825, + -0.537483971118927, + -0.8484304857254028, + -0.764800888299942, + 0.6219635689258576, + -0.4518130749464035 + ], + [ + -0.504999327659607, + -0.26524694621562955, + -0.3317954099178314, + 0.19779022991657258, + -0.5423892915248871, + -0.8611003851890564, + -0.7848260128498078, + 0.6027255666255951, + -0.4685081154108047 + ], + [ + -0.5114738404750824, + -0.268331486582756, + -0.3333534324169159, + 0.17702311903238296, + -0.5436205303668976, + -0.8742318141460419, + -0.8014523720741272, + 0.5833806395530701, + -0.48334562122821806 + ], + [ + -0.523881367444992, + -0.2725673520565033, + -0.3333060199022293, + 0.15450423896312712, + -0.546324874162674, + -0.8827656471729278, + -0.811748411655426, + 0.5661701452732086, + -0.4927734613418579 + ], + [ + -0.5278214740753174, + -0.2775516766309738, + -0.33177006363868716, + 0.14991278439760208, + -0.5473429727554321, + -0.8960133516788482, + -0.8171901941299439, + 0.5454729068279266, + -0.5026600968837738 + ], + [ + -0.5374265873432159, + -0.2808088552951813, + -0.3341319167613983, + 0.13254738837480545, + -0.5481133389472962, + -0.9070481646060944, + -0.8284931194782257, + 0.533190277814865, + -0.5117585003376007 + ], + [ + -0.5405315148830414, + -0.2833367836475372, + -0.3366685938835144, + 0.11681153520941734, + -0.5460471534729003, + -0.9203787100315094, + -0.8383668243885041, + 0.5204612493515015, + -0.5216609013080596 + ], + [ + -0.5480864155292511, + -0.28700709342956543, + -0.3379775232076645, + 0.08437516421079636, + -0.544485182762146, + -0.9358651340007782, + -0.8441197121143341, + 0.510021243095398, + -0.5311465418338776 + ], + [ + -0.5534894371032715, + -0.288998995423317, + -0.339865158200264, + 0.054328592270612715, + -0.5425406432151795, + -0.9491853904724121, + -0.8474749183654785, + 0.5016486418247222, + -0.5381205677986145 + ], + [ + -0.5584327363967896, + -0.2878622269630432, + -0.3388576698303223, + 0.013997444603592157, + -0.5409758639335632, + -0.9626585066318512, + -0.850640971660614, + 0.48060841500759127, + -0.5472305858135224 + ], + [ + -0.5712673103809357, + -0.2858153522014618, + -0.3393647485971451, + -0.036830785237252715, + -0.5407164740562439, + -0.9726080393791199, + -0.8563531732559204, + 0.4678777092695236, + -0.5544822859764099 + ], + [ + -0.583302526473999, + -0.28472066462039947, + -0.3513708424568176, + -0.07524325639009476, + -0.5439663934707641, + -0.9809053826332093, + -0.8608829903602601, + 0.4557536315917969, + -0.5614752006530762 + ], + [ + -0.5991008341312408, + -0.2829277944564819, + -0.36357965528965, + -0.12206286549568177, + -0.5443690586090087, + -0.9879919302463531, + -0.8629776096343994, + 0.4422807586193085, + -0.5665083849430084 + ], + [ + -0.6134129679203033, + -0.27924124121665955, + -0.3725931614637375, + -0.15904873937368394, + -0.5480648756027222, + -0.9933698332309723, + -0.8646563184261322, + 0.4337161934375763, + -0.571824791431427 + ], + [ + -0.62525550365448, + -0.27759747982025146, + -0.3733229809999466, + -0.1954229187965393, + -0.5512418580055237, + -0.99716841340065, + -0.8704050183296204, + 0.4205726230144501, + -0.5816651058197021 + ], + [ + -0.6363086140155793, + -0.27253137826919555, + -0.3735312223434448, + -0.24059601098299027, + -0.5588141620159149, + -0.9982018148899079, + -0.8738165974617005, + 0.4126369732618332, + -0.590145388841629 + ], + [ + -0.6476940310001373, + -0.2699635362625122, + -0.3756671494245529, + -0.2753484773635864, + -0.5706809639930726, + -0.9955166339874267, + -0.8766013813018799, + 0.4093071246147156, + -0.5985138463973999 + ] + ], + "q99": [ + [ + 0.07828140780329707, + 0.06568291530013087, + 0.08980536609888078, + 1.0, + 0.1319926130771637, + 0.24837928444147112, + 0.10273252710700037, + 1.0, + 0.11867564812302589 + ], + [ + 0.09273677751421931, + 0.08668708667159082, + 0.11102887138724328, + 1.0, + 0.16689072161912918, + 0.31754306972026825, + 0.12355493739247322, + 1.0, + 0.15485958427190782 + ], + [ + 0.10692853108048439, + 0.10872879862785341, + 0.13178764671087265, + 1.0, + 0.19806390792131426, + 0.38150826752185824, + 0.15141068935394297, + 1.0, + 0.18626291364431383 + ], + [ + 0.12017312988638883, + 0.13067383348941808, + 0.15489731401205067, + 1.0, + 0.23304146021604538, + 0.43851792573928833, + 0.16018019884824752, + 1.0, + 0.22252393305301668 + ], + [ + 0.12949141114950186, + 0.15077372252941135, + 0.17811561048030858, + 1.0, + 0.2653335100412369, + 0.49124186277389525, + 0.1889670500159265, + 1.0, + 0.2463771361112595 + ], + [ + 0.14390640854835512, + 0.17119720369577412, + 0.19471221894025809, + 1.0, + 0.2994547426700592, + 0.5390829598903657, + 0.2220950254797939, + 1.0, + 0.2696980851888657 + ], + [ + 0.160256821513176, + 0.1905817243456841, + 0.2085603082180023, + 1.0, + 0.3323110300302506, + 0.5812387120723724, + 0.2314848425984384, + 1.0, + 0.3036833012104036 + ], + [ + 0.17327717840671542, + 0.2091207638382912, + 0.2259863543510437, + 1.0, + 0.36216303408145906, + 0.6204093146324158, + 0.2543886119127275, + 1.0, + 0.31811426103115087 + ], + [ + 0.18904691815376287, + 0.22730567544698715, + 0.24281682133674623, + 1.0, + 0.39344603657722477, + 0.6587699317932129, + 0.283667314052582, + 1.0, + 0.34950590431690254 + ], + [ + 0.19965029209852225, + 0.24723895668983464, + 0.25953219175338743, + 1.0, + 0.4235890609025955, + 0.6945383524894715, + 0.29093397617340094, + 1.0, + 0.361376935839653 + ], + [ + 0.21234500020742422, + 0.26168474823236487, + 0.27438116848468785, + 0.9999999535083771, + 0.44953206419944763, + 0.7268677318096162, + 0.30477441430091856, + 1.0, + 0.3744387775659563 + ], + [ + 0.2204626452922821, + 0.2555983370542529, + 0.2893738234043121, + 0.9999993407726288, + 0.47902063727378846, + 0.7563536465167999, + 0.3195575910806656, + 0.9999999380111695, + 0.4023806244134905 + ], + [ + 0.2328205481171608, + 0.25552732974290854, + 0.30579165220260623, + 0.9999962687492371, + 0.5093014681339264, + 0.7819910573959351, + 0.3322360497713089, + 0.9999996221065521, + 0.4302391850948337 + ], + [ + 0.2405764019489289, + 0.27066072523593904, + 0.3198263019323349, + 0.9999962532520295, + 0.5385732173919678, + 0.8099294555187225, + 0.3457706284523011, + 0.9999991011619568, + 0.4483694422245026 + ], + [ + 0.2521579509973526, + 0.2865163058042528, + 0.3344680345058441, + 0.9999883794784545, + 0.5680055451393128, + 0.8362223362922668, + 0.3513054341077805, + 0.999977457523346, + 0.4818529111146931 + ], + [ + 0.2602525234222413, + 0.2903897875547411, + 0.34476951956748964, + 0.9999119186401367, + 0.5933249521255494, + 0.8608459806442261, + 0.3547925275564194, + 0.9999570965766906, + 0.4920788681507112 + ], + [ + 0.2722295296192169, + 0.2958270764350891, + 0.3544802057743073, + 0.9997168982028961, + 0.6182637917995453, + 0.8835398995876312, + 0.3653081393241883, + 0.9999171757698059, + 0.5148797655105593 + ], + [ + 0.2874799841642381, + 0.3095585423707964, + 0.36298568427562716, + 0.999694608449936, + 0.6429838454723358, + 0.9005789828300477, + 0.36803296744823455, + 0.9998727869987488, + 0.5370730972290041 + ], + [ + 0.3038747090101244, + 0.3126471596956254, + 0.37052479803562166, + 0.9998480725288391, + 0.6658697080612183, + 0.916926099061966, + 0.36782411575317386, + 0.9998872447013855, + 0.5509159505367279 + ], + [ + 0.3206837731599809, + 0.3190660613775254, + 0.37601219832897187, + 0.9997601294517517, + 0.6845301425457001, + 0.9326039123535156, + 0.3678433567285538, + 0.9998974013328552, + 0.5708858108520509 + ], + [ + 0.33032283723354344, + 0.3298203426599504, + 0.3820259410142899, + 0.999726026058197, + 0.7069263434410096, + 0.9453703045845032, + 0.36926813006401066, + 0.9998845911026001, + 0.5802021563053131 + ], + [ + 0.3398336637020111, + 0.33175411701202395, + 0.3932884442806244, + 0.9994905722141266, + 0.730983009338379, + 0.9557569217681885, + 0.3761457777023316, + 0.9998711264133453, + 0.5893499159812928 + ], + [ + 0.35129066348075877, + 0.33409869968891154, + 0.40947674453258515, + 0.9989171600341797, + 0.7484633135795593, + 0.9639007198810577, + 0.3808989828824998, + 0.9998484563827514, + 0.596703304052353 + ], + [ + 0.3626444220542909, + 0.339694186449051, + 0.42416219770908353, + 0.9988430058956146, + 0.7677780747413637, + 0.9694477188587189, + 0.38413538157939914, + 0.9998459768295288, + 0.6014246797561645 + ], + [ + 0.3744477182626726, + 0.33823366463184357, + 0.4333925503492356, + 0.9985406506061554, + 0.7845110666751863, + 0.9730800640583038, + 0.3923713207244873, + 0.9998559308052063, + 0.6043440663814544 + ], + [ + 0.385806156396866, + 0.3393001037836076, + 0.44395447492599494, + 0.9986035227775574, + 0.7948622369766236, + 0.973798644542694, + 0.40060448944568633, + 0.9998508989810944, + 0.6072387218475342 + ], + [ + 0.39685401558876054, + 0.33616994678974155, + 0.4588921451568604, + 0.9983686435222626, + 0.8114419198036196, + 0.9739378929138184, + 0.4057867693901062, + 0.9998159754276276, + 0.6109357094764709 + ], + [ + 0.4039593672752381, + 0.33514169037342073, + 0.4791857266426087, + 0.9984290874004365, + 0.8172636330127716, + 0.9733217859268188, + 0.4146788012981415, + 0.9997871911525726, + 0.6131167197227478 + ], + [ + 0.4167341458797455, + 0.3390073150396347, + 0.5000424879789355, + 0.9984749674797058, + 0.8244560778141022, + 0.9781834995746613, + 0.42391923248767854, + 0.9997641110420227, + 0.6145908391475677 + ], + [ + 0.43422043919563297, + 0.34597554087638865, + 0.5173368692398073, + 0.9985087954998016, + 0.8325461506843568, + 0.9805337846279144, + 0.4323783218860626, + 0.9997840583324432, + 0.6160075724124908 + ], + [ + 0.4495619815587998, + 0.35276361942291273, + 0.5304755115509033, + 0.9985192239284515, + 0.8393490302562715, + 0.9853729355335236, + 0.43823623716831206, + 0.9998366022109986, + 0.6182919418811799 + ], + [ + 0.4578994059562683, + 0.3606653857231142, + 0.548151205778122, + 0.9984868586063385, + 0.8467900609970094, + 0.9890444898605347, + 0.4406506222486496, + 0.9998610699176789, + 0.6193150317668915 + ], + [ + 0.46761361956596376, + 0.3665023982524873, + 0.5664266943931582, + 0.9984961247444153, + 0.8527576196193696, + 0.9910252833366394, + 0.44936679124832163, + 0.9999312329292297, + 0.6204894578456879 + ], + [ + 0.4875249141454698, + 0.37443725585937515, + 0.5791527736186982, + 0.9985832667350769, + 0.8575096821784973, + 0.9914031112194062, + 0.4559251648187637, + 0.9999071252346039, + 0.620161851644516 + ], + [ + 0.5060734081268312, + 0.3815812009572984, + 0.5903439784049987, + 0.9986637258529663, + 0.8609046256542207, + 0.989746334552765, + 0.46995893776416786, + 0.9998193836212158, + 0.6178025531768799 + ], + [ + 0.5211516678333283, + 0.3868890291452408, + 0.6045639622211457, + 0.9986409771442414, + 0.8601146912574769, + 0.989282579421997, + 0.4802956247329712, + 0.999723790884018, + 0.6152631413936616 + ], + [ + 0.5382560932636261, + 0.3958244395256043, + 0.6198150515556337, + 0.9986518132686615, + 0.8576038825511932, + 0.9891613709926605, + 0.48720538079738623, + 0.9996382784843445, + 0.6108746039867402 + ], + [ + 0.5553788733482362, + 0.40926889598369603, + 0.632825860977173, + 0.9986180174350738, + 0.857512127161026, + 0.9889154016971589, + 0.49364906489849103, + 0.9994935202598572, + 0.6082459151744842 + ], + [ + 0.5679033994674684, + 0.4180349463224411, + 0.6419549560546876, + 0.9983985197544097, + 0.8578498303890228, + 0.9888878679275512, + 0.49302752912044534, + 0.9994006538391114, + 0.6093288743495942 + ], + [ + 0.5807548701763153, + 0.429619933962822, + 0.6521052932739259, + 0.9981409442424775, + 0.8586832690238952, + 0.9869674599170685, + 0.4927038514614106, + 0.9993502497673035, + 0.6158532762527466 + ] + ], + "mean": [ + [ + -0.007458558771759272, + -0.001947017153725028, + 0.009862096048891544, + 0.9923685193061829, + 0.010682589374482632, + 0.026743469759821892, + -0.010556977242231369, + 0.9972215294837952, + -0.007479894440621138 + ], + [ + -0.008107369765639305, + -0.0014804339734837413, + 0.011458508670330048, + 0.988001823425293, + 0.012975388206541538, + 0.03332975134253502, + -0.012871774844825268, + 0.9957804083824158, + -0.009400847367942333 + ], + [ + -0.008660306222736835, + -0.0009529514936730266, + 0.012999326921999454, + 0.982799768447876, + 0.01519174687564373, + 0.039823729544878006, + -0.015142125077545643, + 0.9940882921218872, + -0.01117478683590889 + ], + [ + -0.009123971685767174, + -0.000373634829884395, + 0.014487509615719318, + 0.9768626093864441, + 0.0173106137663126, + 0.04619704559445381, + -0.017363082617521286, + 0.9921829104423523, + -0.012804676778614521 + ], + [ + -0.009502822533249855, + 0.00025942601496353745, + 0.015920832753181458, + 0.9702792167663574, + 0.019324133172631264, + 0.05245731770992279, + -0.01953529193997383, + 0.9900956749916077, + -0.014282068237662315 + ], + [ + -0.009799253195524216, + 0.0009416893590241671, + 0.017299551516771317, + 0.9631310701370239, + 0.02121902070939541, + 0.05860693007707596, + -0.021649803966283798, + 0.9878453612327576, + -0.015622967854142189 + ], + [ + -0.010020622052252293, + 0.0016675825463607907, + 0.018623661249876022, + 0.9554928541183472, + 0.023022428154945374, + 0.06464535742998123, + -0.023728009313344955, + 0.9854544997215271, + -0.016839025542140007 + ], + [ + -0.01016759779304266, + 0.002431729808449745, + 0.01991388015449047, + 0.9474282264709473, + 0.02471543848514557, + 0.07059728354215622, + -0.02576136402785778, + 0.9829422235488892, + -0.017850929871201515 + ], + [ + -0.010233028791844845, + 0.003233768045902252, + 0.021190524101257324, + 0.938994288444519, + 0.02628088742494583, + 0.07650753110647202, + -0.0277263056486845, + 0.9803312420845032, + -0.01869633048772812 + ], + [ + -0.01021240558475256, + 0.004071216564625502, + 0.02246042899787426, + 0.9302364587783813, + 0.02770937606692314, + 0.08237755298614502, + -0.0296024102717638, + 0.9776465892791748, + -0.01932573691010475 + ], + [ + -0.010101135820150375, + 0.004933418706059456, + 0.02371455915272236, + 0.9212062358856201, + 0.029045479372143745, + 0.08819614350795746, + -0.03141970932483673, + 0.9749063849449158, + -0.019761957228183746 + ], + [ + -0.00991232879459858, + 0.005807769019156694, + 0.0249495729804039, + 0.9119460582733154, + 0.030257226899266243, + 0.09395196288824081, + -0.033143550157547, + 0.9721243381500244, + -0.02000393532216549 + ], + [ + -0.009644633159041405, + 0.006675776094198227, + 0.026168938726186752, + 0.9025071263313293, + 0.031339190900325775, + 0.09965923428535461, + -0.03478442132472992, + 0.9693102240562439, + -0.020019106566905975 + ], + [ + -0.009287010878324509, + 0.007555203977972269, + 0.02736925333738327, + 0.8929219841957092, + 0.03231407329440117, + 0.10532469302415848, + -0.03632638230919838, + 0.9664647579193115, + -0.019871188327670097 + ], + [ + -0.008840919472277164, + 0.008433070965111256, + 0.028546953573822975, + 0.8832376599311829, + 0.033205095678567886, + 0.11093971878290176, + -0.03780234977602959, + 0.9635904431343079, + -0.019590146839618683 + ], + [ + -0.008322115056216717, + 0.009306932799518108, + 0.029696693643927574, + 0.8734681010246277, + 0.03401467949151993, + 0.11652206629514694, + -0.03921593353152275, + 0.9606846570968628, + -0.019203050062060356 + ], + [ + -0.007732477970421314, + 0.010187065228819847, + 0.030805958434939384, + 0.8636460900306702, + 0.03475913777947426, + 0.12203773111104965, + -0.04057786986231804, + 0.9577478766441345, + -0.018703287467360497 + ], + [ + -0.007080485578626394, + 0.011056466028094292, + 0.031868379563093185, + 0.853783130645752, + 0.035431649535894394, + 0.12749901413917542, + -0.04189985990524292, + 0.9547851085662842, + -0.01812564767897129 + ], + [ + -0.006389274727553129, + 0.011919817887246609, + 0.032877564430236816, + 0.843909502029419, + 0.036036454141139984, + 0.13289566338062286, + -0.04319985583424568, + 0.9518026113510132, + -0.01748509332537651 + ], + [ + -0.00566765945404768, + 0.012762410566210747, + 0.03383009880781174, + 0.8340365290641785, + 0.03656291216611862, + 0.13824330270290375, + -0.04448441416025162, + 0.948803186416626, + -0.016809938475489616 + ], + [ + -0.004920241888612509, + 0.013590672053396702, + 0.03472636640071869, + 0.8241945505142212, + 0.037018079310655594, + 0.14353883266448975, + -0.045768968760967255, + 0.9457991123199463, + -0.016111159697175026 + ], + [ + -0.00415863748639822, + 0.014397120103240013, + 0.0355650931596756, + 0.8143793940544128, + 0.037356890738010406, + 0.14878953993320465, + -0.04701576754450798, + 0.9428024291992188, + -0.015422278083860874 + ], + [ + -0.0033812979236245155, + 0.01519002765417099, + 0.03634772449731827, + 0.8046340346336365, + 0.03760799393057823, + 0.15395666658878326, + -0.04826578497886658, + 0.939821183681488, + -0.014714892953634262 + ], + [ + -0.0026922051329165697, + 0.01596100628376007, + 0.037131719291210175, + 0.7949446439743042, + 0.037905868142843246, + 0.15909141302108765, + -0.04957251995801926, + 0.9368647933006287, + -0.014114074409008026 + ], + [ + -0.0019946997053921223, + 0.016747117042541504, + 0.037885792553424835, + 0.7853635549545288, + 0.038096584379673004, + 0.16412876546382904, + -0.050873443484306335, + 0.933943510055542, + -0.013391238637268543 + ], + [ + -0.0012996770674362779, + 0.01754571497440338, + 0.038596127182245255, + 0.775914192199707, + 0.038168009370565414, + 0.16911205649375916, + -0.05216063931584358, + 0.9310561418533325, + -0.012601993046700954 + ], + [ + -0.0006040869629941881, + 0.018376801162958145, + 0.03927019611001015, + 0.7666233777999878, + 0.03813870996236801, + 0.1740034520626068, + -0.053456779569387436, + 0.9282109141349792, + -0.011725985445082188 + ], + [ + 7.783436012687162e-05, + 0.019225386902689934, + 0.039914410561323166, + 0.7575112581253052, + 0.038026679307222366, + 0.17879147827625275, + -0.05479249730706215, + 0.9254169464111328, + -0.010775083675980568 + ], + [ + 0.0007377590518444777, + 0.02009328082203865, + 0.04054684564471245, + 0.7485986351966858, + 0.037858445197343826, + 0.1834082156419754, + -0.05623169615864754, + 0.9226707816123962, + -0.009782752953469753 + ], + [ + 0.0013689452316612005, + 0.02097390964627266, + 0.04117394611239433, + 0.7399084568023682, + 0.03762218728661537, + 0.18790178000926971, + -0.05774569511413574, + 0.9199839234352112, + -0.008756611496210098 + ], + [ + 0.001975992927327752, + 0.021864015609025955, + 0.041804492473602295, + 0.731471598148346, + 0.03731081634759903, + 0.1923045665025711, + -0.05932119861245155, + 0.9173603057861328, + -0.007712826132774353 + ], + [ + 0.002555297687649727, + 0.022755762562155724, + 0.042437341064214706, + 0.7233060002326965, + 0.036937061697244644, + 0.19661761820316315, + -0.06096307933330536, + 0.9148024916648865, + -0.006670982576906681 + ], + [ + 0.0031082804780453444, + 0.02364521473646164, + 0.04307974502444267, + 0.7154068946838379, + 0.03650258108973503, + 0.2008836418390274, + -0.06264246255159378, + 0.9122974276542664, + -0.005658241454511881 + ], + [ + 0.003631915897130966, + 0.02452961541712284, + 0.043724171817302704, + 0.707781970500946, + 0.03600925952196121, + 0.20514696836471558, + -0.06433796137571335, + 0.909847617149353, + -0.004625149071216583 + ], + [ + 0.004117990378290415, + 0.025368308648467064, + 0.04437441751360893, + 0.7003946900367737, + 0.035425830632448196, + 0.20937879383563995, + -0.06606990844011307, + 0.9074320197105408, + -0.0035391838755458593 + ], + [ + 0.004562626592814922, + 0.02618224546313286, + 0.04502415284514427, + 0.6932054162025452, + 0.03471272438764572, + 0.21357302367687225, + -0.06780316680669785, + 0.9050499200820923, + -0.0024923793971538544 + ], + [ + 0.004944167099893093, + 0.02697969600558281, + 0.04564196616411209, + 0.6861757636070251, + 0.03393477201461792, + 0.21770264208316803, + -0.0693877786397934, + 0.9027020931243896, + -0.0013883730862289667 + ], + [ + 0.005295088980346918, + 0.027742981910705566, + 0.046223461627960205, + 0.6793413162231445, + 0.03303990513086319, + 0.22180397808551788, + -0.07089570164680481, + 0.900375247001648, + -0.000304436864098534 + ], + [ + 0.005605997517704964, + 0.028467122465372086, + 0.046751607209444046, + 0.6726713180541992, + 0.03210814297199249, + 0.22587940096855164, + -0.07235158234834671, + 0.8980470895767212, + 0.0007085417164489627 + ], + [ + 0.005925282835960388, + 0.029189370572566986, + 0.04732528701424599, + 0.6661809682846069, + 0.0313103049993515, + 0.22993098199367523, + -0.07382561266422272, + 0.8957738876342773, + 0.0015457102563232183 + ] + ], + "std": [ + [ + 0.02764870785176754, + 0.031175242736935616, + 0.03680095076560974, + 0.009530776180326939, + 0.05310435965657234, + 0.10707736015319824, + 0.053609490394592285, + 0.0037623466923832893, + 0.04993504658341408 + ], + [ + 0.03312064707279205, + 0.03783394768834114, + 0.04315388947725296, + 0.015271899290382862, + 0.06551041454076767, + 0.13434508442878723, + 0.06637491285800934, + 0.005759279243648052, + 0.061061400920152664 + ], + [ + 0.03872626647353172, + 0.044381652027368546, + 0.04972415789961815, + 0.022119693458080292, + 0.07753181457519531, + 0.1605885922908783, + 0.07879795134067535, + 0.008045414462685585, + 0.07184312492609024 + ], + [ + 0.04436347261071205, + 0.050758540630340576, + 0.05637871474027634, + 0.02989848144352436, + 0.08909137547016144, + 0.18567238748073578, + 0.0907856673002243, + 0.01054896879941225, + 0.082186758518219 + ], + [ + 0.04997313395142555, + 0.0569315068423748, + 0.06303009390830994, + 0.038444750010967255, + 0.100180983543396, + 0.2095676213502884, + 0.10232272744178772, + 0.013212624937295914, + 0.09208910167217255 + ], + [ + 0.05552714318037033, + 0.0628829300403595, + 0.06961561739444733, + 0.047588832676410675, + 0.1108342781662941, + 0.2322583645582199, + 0.11343282461166382, + 0.015992598608136177, + 0.10161609202623367 + ], + [ + 0.06102042272686958, + 0.06860655546188354, + 0.07609140872955322, + 0.05717119202017784, + 0.121066153049469, + 0.2537700831890106, + 0.12412924319505692, + 0.018860002979636192, + 0.11077184230089188 + ], + [ + 0.06645800173282623, + 0.07410859316587448, + 0.0824185237288475, + 0.0670362189412117, + 0.13091683387756348, + 0.274137407541275, + 0.13444259762763977, + 0.021787725389003754, + 0.11955168098211288 + ], + [ + 0.07184317708015442, + 0.07938868552446365, + 0.08856909722089767, + 0.0770588368177414, + 0.14040566980838776, + 0.29341766238212585, + 0.14438389241695404, + 0.024769587442278862, + 0.1279532015323639 + ], + [ + 0.07718019187450409, + 0.0844544768333435, + 0.09451636672019958, + 0.08714707940816879, + 0.14954660832881927, + 0.3116835951805115, + 0.15395775437355042, + 0.02781999669969082, + 0.13594011962413788 + ], + [ + 0.08246832340955734, + 0.08931688964366913, + 0.10024964064359665, + 0.09721492975950241, + 0.1583685576915741, + 0.32897695899009705, + 0.163183331489563, + 0.03094957023859024, + 0.14350809156894684 + ], + [ + 0.08771388977766037, + 0.09399405121803284, + 0.1057652086019516, + 0.1071958839893341, + 0.1669071465730667, + 0.3453453481197357, + 0.1720731258392334, + 0.03416294604539871, + 0.1506630927324295 + ], + [ + 0.09291666001081467, + 0.09850206226110458, + 0.11105688661336899, + 0.11704529821872711, + 0.17517350614070892, + 0.36080771684646606, + 0.1806143820285797, + 0.03746773675084114, + 0.1574869304895401 + ], + [ + 0.09806714206933975, + 0.10281923413276672, + 0.11612758785486221, + 0.12676328420639038, + 0.183148592710495, + 0.37542101740837097, + 0.1888204663991928, + 0.04085884615778923, + 0.16403728723526 + ], + [ + 0.10317223519086838, + 0.10695315152406693, + 0.12098859995603561, + 0.13633431494235992, + 0.19080384075641632, + 0.38921573758125305, + 0.19667786359786987, + 0.04433313384652138, + 0.17039349675178528 + ], + [ + 0.1082390621304512, + 0.11089811474084854, + 0.12565764784812927, + 0.14576216042041779, + 0.19814930856227875, + 0.4022556245326996, + 0.20421820878982544, + 0.047891732305288315, + 0.17658044397830963 + ], + [ + 0.11326485872268677, + 0.11464647203683853, + 0.13015958666801453, + 0.15505601465702057, + 0.2052047997713089, + 0.41456371545791626, + 0.21148310601711273, + 0.05153932049870491, + 0.1825954169034958 + ], + [ + 0.11824068427085876, + 0.11820753663778305, + 0.13451671600341797, + 0.1642402857542038, + 0.21193966269493103, + 0.4262046813964844, + 0.2184687703847885, + 0.05527890846133232, + 0.1884564459323883 + ], + [ + 0.12315427511930466, + 0.12158513069152832, + 0.13875259459018707, + 0.1733550876379013, + 0.21834000945091248, + 0.4371873438358307, + 0.22517812252044678, + 0.05910723656415939, + 0.1941695213317871 + ], + [ + 0.12800543010234833, + 0.12478336691856384, + 0.14288410544395447, + 0.18243153393268585, + 0.22441907227039337, + 0.4475366473197937, + 0.23162299394607544, + 0.06302575767040253, + 0.19972360134124756 + ], + [ + 0.13278405368328094, + 0.1278102844953537, + 0.1469215601682663, + 0.1915033608675003, + 0.23017829656600952, + 0.4572455585002899, + 0.23781627416610718, + 0.06703609973192215, + 0.20508228242397308 + ], + [ + 0.13749732077121735, + 0.13066427409648895, + 0.15087579190731049, + 0.20059913396835327, + 0.23560823500156403, + 0.4663704037666321, + 0.24377816915512085, + 0.07113224267959595, + 0.21020804345607758 + ], + [ + 0.14213038980960846, + 0.1333550214767456, + 0.1547541469335556, + 0.20974552631378174, + 0.24069926142692566, + 0.4748871624469757, + 0.24951514601707458, + 0.07529991865158081, + 0.2150871604681015 + ], + [ + 0.14670626819133759, + 0.1358831226825714, + 0.158542662858963, + 0.21894308924674988, + 0.24536289274692535, + 0.48288461565971375, + 0.2549934983253479, + 0.07953479140996933, + 0.21972626447677612 + ], + [ + 0.1511993408203125, + 0.13825534284114838, + 0.16225174069404602, + 0.22820420563220978, + 0.249702587723732, + 0.4902917444705963, + 0.2602745294570923, + 0.08382261544466019, + 0.22408315539360046 + ], + [ + 0.15562477707862854, + 0.14046624302864075, + 0.1659030169248581, + 0.23751290142536163, + 0.2537285387516022, + 0.49710220098495483, + 0.26536452770233154, + 0.08813650161027908, + 0.22818727791309357 + ], + [ + 0.15995953977108002, + 0.14251092076301575, + 0.1694958657026291, + 0.24683183431625366, + 0.2574596107006073, + 0.5033343434333801, + 0.27028340101242065, + 0.09245066344738007, + 0.23200911283493042 + ], + [ + 0.16420750319957733, + 0.14439107477664948, + 0.17304129898548126, + 0.2561030387878418, + 0.2609032690525055, + 0.509023129940033, + 0.275049090385437, + 0.09674045443534851, + 0.23552969098091125 + ], + [ + 0.16834980249404907, + 0.14611652493476868, + 0.17654001712799072, + 0.2652876675128937, + 0.2640659511089325, + 0.5142177939414978, + 0.2796814441680908, + 0.10098984837532043, + 0.23874831199645996 + ], + [ + 0.17239654064178467, + 0.14769282937049866, + 0.18000082671642303, + 0.2743377089500427, + 0.26694226264953613, + 0.51893550157547, + 0.2841707170009613, + 0.10519427806138992, + 0.24166004359722137 + ], + [ + 0.17632339894771576, + 0.14914262294769287, + 0.18342642486095428, + 0.2832048833370209, + 0.2695343494415283, + 0.5231848955154419, + 0.28852617740631104, + 0.10934770852327347, + 0.24426953494548798 + ], + [ + 0.18013620376586914, + 0.1504652351140976, + 0.18682067096233368, + 0.29186639189720154, + 0.2718473970890045, + 0.5269910097122192, + 0.29273736476898193, + 0.11345003545284271, + 0.24659766256809235 + ], + [ + 0.18382753431797028, + 0.15168820321559906, + 0.19018028676509857, + 0.30029985308647156, + 0.273892879486084, + 0.5303860902786255, + 0.2968190610408783, + 0.11750815063714981, + 0.2486882358789444 + ], + [ + 0.18740352988243103, + 0.15281300246715546, + 0.19351215660572052, + 0.3084818720817566, + 0.27568426728248596, + 0.5333850979804993, + 0.3007652163505554, + 0.1215246170759201, + 0.2505755126476288 + ], + [ + 0.1908693015575409, + 0.15388551354408264, + 0.1968148946762085, + 0.3164214491844177, + 0.2772658169269562, + 0.5360546708106995, + 0.3046000599861145, + 0.12549641728401184, + 0.25230932235717773 + ], + [ + 0.19425353407859802, + 0.15490522980690002, + 0.20009104907512665, + 0.3241406977176666, + 0.2786349356174469, + 0.5384634733200073, + 0.3083074390888214, + 0.12943260371685028, + 0.2539198100566864 + ], + [ + 0.19763325154781342, + 0.15592505037784576, + 0.20337331295013428, + 0.3316899240016937, + 0.27984076738357544, + 0.5406363010406494, + 0.311876505613327, + 0.13334965705871582, + 0.2554674446582794 + ], + [ + 0.20092152059078217, + 0.15693208575248718, + 0.2066638171672821, + 0.33901071548461914, + 0.28090429306030273, + 0.5425600409507751, + 0.31533703207969666, + 0.1372535526752472, + 0.2569486200809479 + ], + [ + 0.20413143932819366, + 0.1579284518957138, + 0.20997358858585358, + 0.34611642360687256, + 0.2819001376628876, + 0.5442399978637695, + 0.318734347820282, + 0.14114037156105042, + 0.2583869397640228 + ], + [ + 0.2072465568780899, + 0.1589174121618271, + 0.21322448551654816, + 0.35307011008262634, + 0.28263017535209656, + 0.5457249879837036, + 0.3219261169433594, + 0.14502213895320892, + 0.2597469091415405 + ] + ] + }, + "joint_position": { + "max": [ + [ + 0.2683179974555969, + 0.23274558782577515, + 0.275177538394928, + 0.25500214099884033, + 0.2826429605484009, + 0.19339251518249512, + 0.21542513370513916 + ], + [ + 0.34016209840774536, + 0.28233879804611206, + 0.35353389382362366, + 0.3117063045501709, + 0.36632275581359863, + 0.238450288772583, + 0.26310622692108154 + ], + [ + 0.4102814793586731, + 0.3337758183479309, + 0.43016839027404785, + 0.3679300546646118, + 0.4426121413707733, + 0.27913784980773926, + 0.30947935581207275 + ], + [ + 0.4806702733039856, + 0.3833145499229431, + 0.5057644844055176, + 0.4254876375198364, + 0.5167117118835449, + 0.3191821575164795, + 0.35753923654556274 + ], + [ + 0.5482763051986694, + 0.43119484186172485, + 0.5814841985702515, + 0.482191801071167, + 0.5735240578651428, + 0.3477141857147217, + 0.40599822998046875 + ], + [ + 0.6155714988708496, + 0.47725754976272583, + 0.6568347215652466, + 0.5388562679290771, + 0.6041154861450195, + 0.3878791332244873, + 0.45518141984939575 + ], + [ + 0.6798931360244751, + 0.5212839245796204, + 0.7275383472442627, + 0.593353271484375, + 0.6224894523620605, + 0.42961859703063965, + 0.5020021200180054 + ], + [ + 0.7476049065589905, + 0.5640109181404114, + 0.7943424582481384, + 0.6435059309005737, + 0.6133677363395691, + 0.4699714183807373, + 0.550101101398468 + ], + [ + 0.8152109384536743, + 0.604265034198761, + 0.858088493347168, + 0.6879235506057739, + 0.6005645394325256, + 0.5104753971099854, + 0.5970321297645569 + ], + [ + 0.8795325756072998, + 0.6442367434501648, + 0.9146062731742859, + 0.7166320085525513, + 0.587822437286377, + 0.5483672618865967, + 0.6434052586555481 + ], + [ + 0.9384105205535889, + 0.6839752793312073, + 0.965829610824585, + 0.7292777299880981, + 0.5809313654899597, + 0.5823178291320801, + 0.6921193599700928 + ], + [ + 0.9935253858566284, + 0.720646321773529, + 1.0139455795288086, + 0.7311939001083374, + 0.5823270082473755, + 0.6152124404907227, + 0.738492488861084 + ], + [ + 1.047105073928833, + 0.7572744488716125, + 1.0568840503692627, + 0.7704252600669861, + 0.593643069267273, + 0.6455404758453369, + 0.7816857695579529 + ], + [ + 1.094598650932312, + 0.7924416661262512, + 1.0995174646377563, + 0.8085891604423523, + 0.6042476296424866, + 0.6762220859527588, + 0.8211912512779236 + ], + [ + 1.1415916681289673, + 0.8308912515640259, + 1.1251087188720703, + 0.8412896394729614, + 0.6073949337005615, + 0.7000374794006348, + 0.8642789125442505 + ], + [ + 1.1861565113067627, + 0.8690294623374939, + 1.142367959022522, + 0.8723412752151489, + 0.6133954524993896, + 0.7058980464935303, + 0.9087061882019043 + ], + [ + 1.2300114631652832, + 0.9012135863304138, + 1.154715657234192, + 0.8941320180892944, + 0.6177728176116943, + 0.706092119216919, + 0.9417837858200073 + ], + [ + 1.2661547660827637, + 0.9333921670913696, + 1.1618518829345703, + 0.9033112525939941, + 0.6263935565948486, + 0.7058215141296387, + 0.9744387865066528 + ], + [ + 1.2977007627487183, + 0.9617794752120972, + 1.1682705879211426, + 0.9054468870162964, + 0.6412372589111328, + 0.7058243751525879, + 0.994407057762146 + ], + [ + 1.3290270566940308, + 0.9926407933235168, + 1.1728951930999756, + 0.9075111150741577, + 0.6482203006744385, + 0.7058284282684326, + 1.0081418752670288 + ], + [ + 1.361433744430542, + 1.0248193740844727, + 1.177943468093872, + 0.9109654426574707, + 0.6608568429946899, + 0.7058267593383789, + 1.0205268859863281 + ], + [ + 1.390934705734253, + 1.052871823310852, + 1.186442255973816, + 0.9162251949310303, + 0.6697392463684082, + 0.7058300971984863, + 1.0241303443908691 + ], + [ + 1.416130781173706, + 1.076539397239685, + 1.21428644657135, + 0.9250339269638062, + 0.6788010597229004, + 0.7058701515197754, + 1.0254738330841064 + ], + [ + 1.4403972625732422, + 1.097301721572876, + 1.243896245956421, + 0.9398839473724365, + 0.6830674409866333, + 0.7074775695800781, + 1.028580904006958 + ], + [ + 1.4627406597137451, + 1.1159636974334717, + 1.2645063400268555, + 0.9600136280059814, + 0.6783088445663452, + 0.7176837921142578, + 1.0324888229370117 + ], + [ + 1.4863886833190918, + 1.1340620517730713, + 1.2817655801773071, + 0.9802747964859009, + 0.6810173392295837, + 0.7378222942352295, + 1.0360922813415527 + ], + [ + 1.5051155090332031, + 1.1518930196762085, + 1.2937955856323242, + 0.998659610748291, + 0.6843555569648743, + 0.7696526050567627, + 1.038016676902771 + ], + [ + 1.5196497440338135, + 1.1695557832717896, + 1.3002142906188965, + 1.0151751041412354, + 0.6847773790359497, + 0.8014304637908936, + 1.0488111972808838 + ], + [ + 1.5309767723083496, + 1.187839150428772, + 1.3063995838165283, + 1.0339535474777222, + 0.6817857027053833, + 0.8319377899169922, + 1.0657377243041992 + ], + [ + 1.5321069955825806, + 1.2066129446029663, + 1.3094313144683838, + 1.0526032447814941, + 0.6726639866828918, + 0.8599083423614502, + 1.0810632705688477 + ], + [ + 1.5408233404159546, + 1.2256765365600586, + 1.3111956119537354, + 1.0736037492752075, + 0.6717904806137085, + 0.8868021965026855, + 1.095285415649414 + ], + [ + 1.5944030284881592, + 1.2437748908996582, + 1.3121453523635864, + 1.0941834449768066, + 0.6729624271392822, + 0.9104228019714355, + 1.1080796718597412 + ], + [ + 1.6461848020553589, + 1.2616058588027954, + 1.3130908012390137, + 1.1163835525512695, + 0.6712750792503357, + 0.9299368858337402, + 1.1204646825790405 + ], + [ + 1.696042776107788, + 1.2897902727127075, + 1.3142976760864258, + 1.1409218311309814, + 0.667544960975647, + 0.9409348964691162, + 1.1297484636306763 + ], + [ + 1.74422287940979, + 1.3358529806137085, + 1.3182146549224854, + 1.165563941001892, + 0.6650953888893127, + 0.9474606513977051, + 1.1392592191696167 + ], + [ + 1.7912158966064453, + 1.3817336559295654, + 1.3265057802200317, + 1.1904202699661255, + 0.6648683547973633, + 0.9499530792236328, + 1.1504924297332764 + ], + [ + 1.8357808589935303, + 1.42576003074646, + 1.3363027572631836, + 1.2155967950820923, + 0.6633951663970947, + 0.9500477313995361, + 1.157970905303955 + ], + [ + 1.8796358108520508, + 1.468487024307251, + 1.342488169670105, + 1.2385252714157104, + 0.6658636331558228, + 0.9492976665496826, + 1.161574363708496 + ], + [ + 1.9186257123947144, + 1.510758638381958, + 1.3480172157287598, + 1.2606016397476196, + 0.6660547256469727, + 0.9453506469726562, + 1.1641898155212402 + ], + [ + 1.9547690153121948, + 1.5510127544403076, + 1.3542026281356812, + 1.2787749767303467, + 0.666337251663208, + 0.9418625831604004, + 1.1655769348144531 + ] + ], + "min": [ + [ + -0.278794527053833, + -0.24037671089172363, + -0.17256081104278564, + -0.2501029968261719, + -0.18326300382614136, + -0.19399666786193848, + -0.2744036316871643 + ], + [ + -0.35784512758255005, + -0.2827160358428955, + -0.21932166814804077, + -0.3038386106491089, + -0.22724807262420654, + -0.24223661422729492, + -0.3529028296470642 + ], + [ + -0.43504267930984497, + -0.31886017322540283, + -0.26266977190971375, + -0.3575327396392822, + -0.27364540100097656, + -0.2851564884185791, + -0.42934370040893555 + ], + [ + -0.5049634575843811, + -0.3539518117904663, + -0.30136817693710327, + -0.41047441959381104, + -0.31844645738601685, + -0.32317352294921875, + -0.5045090913772583 + ], + [ + -0.5727387070655823, + -0.3971576690673828, + -0.338900089263916, + -0.4626709222793579, + -0.3532412648200989, + -0.35042285919189453, + -0.5772643685340881 + ], + [ + -0.635819137096405, + -0.4399774670600891, + -0.37432661652565, + -0.5143218040466309, + -0.387957900762558, + -0.3722877502441406, + -0.6215649247169495 + ], + [ + -0.6920800805091858, + -0.48167043924331665, + -0.4086310565471649, + -0.5652340650558472, + -0.43331778049468994, + -0.3936007022857666, + -0.6609686613082886 + ], + [ + -0.7477080225944519, + -0.5221400856971741, + -0.44335347414016724, + -0.6132203340530396, + -0.4785648286342621, + -0.42339515686035156, + -0.6719564199447632 + ], + [ + -0.8134891390800476, + -0.5611816644668579, + -0.4789288640022278, + -0.6610968112945557, + -0.5226191878318787, + -0.45739269256591797, + -0.6990311145782471 + ], + [ + -0.885053277015686, + -0.6001325249671936, + -0.5041213035583496, + -0.7066991329193115, + -0.5664129853248596, + -0.49249088764190674, + -0.7233089208602905 + ], + [ + -0.9545788168907166, + -0.6371897459030151, + -0.5175429582595825, + -0.752558708190918, + -0.6080112457275391, + -0.5293511152267456, + -0.7457197904586792 + ], + [ + -1.0213149785995483, + -0.675555944442749, + -0.5296023488044739, + -0.7981112003326416, + -0.6487815380096436, + -0.5657652616500854, + -0.7609471082687378 + ], + [ + -1.0795172452926636, + -0.7122685313224792, + -0.5394526720046997, + -0.8429840803146362, + -0.6902901530265808, + -0.5994774103164673, + -0.779220461845398 + ], + [ + -1.1215273141860962, + -0.7451650500297546, + -0.5459067225456238, + -0.8835674524307251, + -0.7303237915039062, + -0.6324557065963745, + -0.7929062843322754 + ], + [ + -1.1608176231384277, + -0.7764506340026855, + -0.548729658126831, + -0.9166586399078369, + -0.7719219923019409, + -0.666594386100769, + -0.80389404296875 + ], + [ + -1.1905357837677002, + -0.8041207194328308, + -0.5501526594161987, + -0.931013822555542, + -0.8074471950531006, + -0.6986263990402222, + -0.813443660736084 + ], + [ + -1.2142950296401978, + -0.8320209980010986, + -0.5500152111053467, + -0.9331851005554199, + -0.8350485563278198, + -0.730847954750061, + -0.8188371658325195 + ], + [ + -1.236141324043274, + -0.8596910834312439, + -0.5501787662506104, + -0.9321354627609253, + -0.8640764951705933, + -0.7625945806503296, + -0.8247634172439575 + ], + [ + -1.2501940727233887, + -0.878205418586731, + -0.5498380064964294, + -0.9338976144790649, + -0.8927417993545532, + -0.7957093715667725, + -0.8303215503692627 + ], + [ + -1.2653570175170898, + -0.8906838893890381, + -0.5493291616439819, + -0.9352952241897583, + -0.9136713743209839, + -0.8249801397323608, + -0.8377447128295898 + ], + [ + -1.2749392986297607, + -0.9006218910217285, + -0.5568619966506958, + -0.9358947277069092, + -0.9627792835235596, + -0.8539630174636841, + -0.846259355545044 + ], + [ + -1.2828214168548584, + -0.908549964427948, + -0.5867007970809937, + -0.9411946535110474, + -1.0091766119003296, + -0.8825829029083252, + -0.8516528606414795 + ], + [ + -1.3007539510726929, + -0.9143440127372742, + -0.6214804649353027, + -0.9514236450195312, + -1.0544235706329346, + -0.907644510269165, + -0.859169065952301 + ], + [ + -1.3743321895599365, + -0.9187233448028564, + -0.6569986343383789, + -0.9671218395233154, + -1.0984779596328735, + -0.9317660331726074, + -0.8800349235534668 + ], + [ + -1.4461296796798706, + -0.9219484925270081, + -0.6911536455154419, + -0.9932187795639038, + -1.1422717571258545, + -0.9530031681060791, + -0.8901619911193848 + ], + [ + -1.5195621252059937, + -0.9236897826194763, + -0.7237033843994141, + -1.0352821350097656, + -1.1830421686172485, + -0.9695210456848145, + -0.9336570501327515 + ], + [ + -1.5894829034805298, + -0.923973023891449, + -0.7528658509254456, + -1.0800604820251465, + -1.224550724029541, + -0.9826831817626953, + -0.9877830147743225 + ], + [ + -1.659008502960205, + -0.9217382073402405, + -0.7805374264717102, + -1.125452995300293, + -1.2645142078399658, + -1.0165152549743652, + -1.0378532409667969 + ], + [ + -1.7267837524414062, + -0.9228609204292297, + -0.805729866027832, + -1.1710054874420166, + -1.306182622909546, + -1.0535759925842285, + -1.0821537971496582 + ], + [ + -1.7898640632629395, + -0.9413752555847168, + -0.8291125297546387, + -1.2162103652954102, + -1.3417078256607056, + -1.101815938949585, + -1.122230887413025 + ], + [ + -1.8461251258850098, + -0.9538537263870239, + -0.8488044738769531, + -1.2607150077819824, + -1.3765026330947876, + -1.1398329734802246, + -1.1536529064178467 + ], + [ + -1.9017529487609863, + -0.9653437733650208, + -0.8681159019470215, + -1.302515983581543, + -1.4036961793899536, + -1.1758742332458496, + -1.1736743450164795 + ], + [ + -1.9550681114196777, + -0.9796552062034607, + -0.8912720680236816, + -1.3430993556976318, + -1.4392213821411133, + -1.211780071258545, + -1.1917153596878052 + ], + [ + -2.006345748901367, + -0.9921336770057678, + -0.9046937227249146, + -1.3775458335876465, + -1.4601563215255737, + -1.2409322261810303, + -1.2159931659698486 + ], + [ + -2.055576801300049, + -1.002232551574707, + -0.9179072380065918, + -1.4098625183105469, + -1.4789286851882935, + -1.2627971172332764, + -1.2384040355682373 + ], + [ + -2.1051740646362305, + -1.0121705532073975, + -0.9313288927078247, + -1.4371883869171143, + -1.4969987869262695, + -1.2686622142791748, + -1.2584254741668701 + ], + [ + -2.1509718894958496, + -1.0211706161499023, + -0.9433882832527161, + -1.4609934091567993, + -1.524132490158081, + -1.2731268405914307, + -1.2736527919769287 + ], + [ + -2.1949353218078613, + -1.029098629951477, + -0.9532386064529419, + -1.4794507026672363, + -1.55414879322052, + -1.2731285095214844, + -1.2919261455535889 + ], + [ + -2.239121437072754, + -1.0348926782608032, + -0.9625475406646729, + -1.4924514293670654, + -1.5866899490356445, + -1.273129940032959, + -1.3061420917510986 + ], + [ + -2.2785091400146484, + -1.0404576063156128, + -0.9690015912055969, + -1.5005642175674438, + -1.6222151517868042, + -1.2731268405914307, + -1.319827914237976 + ] + ], + "q01": [ + [ + -0.2647909712791443, + -0.215289911031723, + -0.13667001247406005, + -0.24526336908340454, + -0.16082383960485458, + -0.15233309984207152, + -0.22328712552785873 + ], + [ + -0.33257859349250796, + -0.25983638048172, + -0.16976765513420106, + -0.2940185952186585, + -0.2010525146126747, + -0.19076478481292725, + -0.25732809364795683 + ], + [ + -0.3951711559295654, + -0.3027662456035614, + -0.2032958459854126, + -0.341980926990509, + -0.24566883325576783, + -0.22811374425888062, + -0.3130601811408997 + ], + [ + -0.454468834400177, + -0.3444627022743225, + -0.2351852187514305, + -0.39120051860809324, + -0.2854903769493103, + -0.2621160006523132, + -0.3540696942806244 + ], + [ + -0.5204328107833862, + -0.3822211885452271, + -0.261422301530838, + -0.43822319984436037, + -0.330427325963974, + -0.2979009795188904, + -0.3990971887111664 + ], + [ + -0.5853677499294281, + -0.4184741735458374, + -0.2888537609577179, + -0.4838149309158325, + -0.37338963985443113, + -0.33184258460998534, + -0.4294454544782639 + ], + [ + -0.6497952330112458, + -0.44985789895057676, + -0.3162858480215073, + -0.5295559334754943, + -0.41001086831092837, + -0.3666263771057129, + -0.4723562979698181 + ], + [ + -0.7096605825424195, + -0.4827951192855835, + -0.3399012392759323, + -0.572802505493164, + -0.44720503211021423, + -0.399936249256134, + -0.495804643034935 + ], + [ + -0.7662335550785064, + -0.5172494101524353, + -0.36773153126239777, + -0.5976174879074097, + -0.4810446137189865, + -0.43624818325042725, + -0.5534158980846405 + ], + [ + -0.8166493952274323, + -0.5414352607727051, + -0.3877567088603973, + -0.6338030648231506, + -0.5266209971904755, + -0.4732127904891968, + -0.584321722984314 + ], + [ + -0.8666782557964325, + -0.5776540219783783, + -0.4031341540813446, + -0.6756873297691345, + -0.5689210987091065, + -0.5054335021972656, + -0.639250259399414 + ], + [ + -0.911803811788559, + -0.6129000723361969, + -0.4240989935398102, + -0.7151624250411988, + -0.599907214641571, + -0.5362505865097046, + -0.6742792010307312 + ], + [ + -0.9542813098430634, + -0.6427665519714355, + -0.4401131951808929, + -0.7536275625228882, + -0.629225046634674, + -0.5653539228439332, + -0.6932716846466065 + ], + [ + -0.9998513126373291, + -0.6606674933433533, + -0.4528951168060303, + -0.7853250551223755, + -0.6639584541320801, + -0.5985958194732666, + -0.7023111939430237 + ], + [ + -1.0349947023391723, + -0.6680407202243805, + -0.46548837184906006, + -0.792786660194397, + -0.6902268600463867, + -0.6360364818572998, + -0.7323719370365143 + ], + [ + -1.0737490701675414, + -0.6762045240402221, + -0.475327427983284, + -0.8038333702087402, + -0.7297874546051025, + -0.6744433450698852, + -0.7570485019683838 + ], + [ + -1.0833439350128173, + -0.7009125101566315, + -0.48142359018325803, + -0.8187557816505432, + -0.774614713191986, + -0.7080319166183472, + -0.7746773326396942 + ], + [ + -1.134791865348816, + -0.7291788101196289, + -0.4877264881134033, + -0.8281351995468139, + -0.8167481911182404, + -0.7389902114868164, + -0.7877036130428314 + ], + [ + -1.1457599449157714, + -0.7593890142440796, + -0.49301562607288363, + -0.8453087520599365, + -0.8568156790733338, + -0.7710943841934204, + -0.8026438295841217 + ], + [ + -1.1575427341461182, + -0.7848779487609864, + -0.5117282223701477, + -0.8547515726089477, + -0.8966450095176697, + -0.7993932247161866, + -0.8201252138614654 + ], + [ + -1.183641185760498, + -0.8042644882202148, + -0.5389025807380676, + -0.8638645482063293, + -0.9314087390899658, + -0.8266724348068237, + -0.8347417962551117 + ], + [ + -1.2227074003219605, + -0.8144470822811126, + -0.5613800144195557, + -0.8781633448600769, + -0.9681457686424255, + -0.8504737043380737, + -0.8407689678668976 + ], + [ + -1.282804753780365, + -0.8331999409198761, + -0.5934442186355591, + -0.8976627802848816, + -1.0066418623924256, + -0.8719053173065185, + -0.8505523157119751 + ], + [ + -1.3363650822639466, + -0.8423084330558777, + -0.6171494913101196, + -0.9326405298709869, + -1.0505680322647095, + -0.8918586444854736, + -0.8576539647579193 + ], + [ + -1.3904359340667725, + -0.8514455115795135, + -0.6425505435466766, + -0.9665309453010559, + -1.0924036312103271, + -0.9137006974220276, + -0.8645544469356536 + ], + [ + -1.4571084260940552, + -0.8618845212459564, + -0.6703882443904877, + -1.0064197516441344, + -1.131460337638855, + -0.9320410966873169, + -0.8757917559146882 + ], + [ + -1.511514127254486, + -0.8626907730102539, + -0.6991569936275482, + -1.0403125143051148, + -1.1659886717796326, + -0.9525818800926209, + -0.8888125193119049 + ], + [ + -1.5770737504959107, + -0.8820846438407898, + -0.7238334667682648, + -1.0713315558433534, + -1.2044374394416808, + -0.9822706270217896, + -0.9185189270973205 + ], + [ + -1.6311864686012267, + -0.8920655870437622, + -0.7484284174442292, + -1.0977420043945312, + -1.228942904472351, + -0.9966063070297241, + -0.9576983869075775 + ], + [ + -1.6843936038017273, + -0.898937063217163, + -0.7703238582611084, + -1.120156648159027, + -1.2526051115989685, + -1.0085212039947509, + -0.9887306404113769 + ], + [ + -1.7461429810523987, + -0.9044706928730011, + -0.7900133752822875, + -1.1371952342987062, + -1.2932310938835143, + -1.0354509449005127, + -1.0207592725753785 + ], + [ + -1.8076135897636414, + -0.9106863987445831, + -0.814013923406601, + -1.1568668270111084, + -1.321114273071289, + -1.0414765119552611, + -1.0690755724906922 + ], + [ + -1.854592022895813, + -0.9172225773334504, + -0.8293705344200134, + -1.184954376220703, + -1.354458260536194, + -1.0685930776596069, + -1.0922147226333618 + ], + [ + -1.9035258436203002, + -0.9364241182804107, + -0.8470102882385254, + -1.2221213936805726, + -1.387638726234436, + -1.0784902524948121, + -1.13982097864151 + ], + [ + -1.950968976020813, + -0.9582450366020203, + -0.8669309604167938, + -1.2500847864151001, + -1.420465350151062, + -1.1070606851577758, + -1.1622207570075989 + ], + [ + -2.002374336719513, + -0.9809632802009582, + -0.8775787484645844, + -1.272718267440796, + -1.4560030913352966, + -1.1274668836593629, + -1.191201333999634 + ], + [ + -2.050056047439575, + -0.9940736997127533, + -0.8925741517543793, + -1.287498769760132, + -1.48901433467865, + -1.159388451576233, + -1.201445894241333 + ], + [ + -2.087253646850586, + -0.9982596898078918, + -0.9090905499458313, + -1.313868556022644, + -1.515993504524231, + -1.1800103187561035, + -1.2194001388549804 + ], + [ + -2.1192378997802734, + -1.0080591559410095, + -0.9219683349132538, + -1.3164221620559693, + -1.544483687877655, + -1.19969491481781, + -1.2375791621208192 + ], + [ + -2.1616070890426635, + -1.0172091794013978, + -0.9340816128253937, + -1.3372604656219482, + -1.5682033896446228, + -1.2197001886367798, + -1.2580780673027039 + ] + ], + "q99": [ + [ + 0.2592447316646576, + 0.21767961621284485, + 0.26180151939392093, + 0.2428443741798401, + 0.13970476269721996, + 0.1743195629119873, + 0.1970393991470337 + ], + [ + 0.32700311541557314, + 0.2618571710586548, + 0.3236996519565583, + 0.29015149593353273, + 0.17148407816886913, + 0.21964733123779298, + 0.24471372485160828 + ], + [ + 0.390869597196579, + 0.3019210076332092, + 0.3893372356891633, + 0.33655296921730044, + 0.20365356683731087, + 0.2575085115432739, + 0.2932903015613556 + ], + [ + 0.4525894951820374, + 0.34730015575885775, + 0.45476315319538135, + 0.3829351627826691, + 0.23523757725954056, + 0.29855642318725584, + 0.3401029586791992 + ], + [ + 0.5168031609058381, + 0.39089319109916687, + 0.5139919936656954, + 0.4237099552154541, + 0.2636020147800447, + 0.33934397220611573, + 0.38798175573349 + ], + [ + 0.5732055485248567, + 0.43863140761852265, + 0.5746426653862001, + 0.4718030285835267, + 0.2981705242395405, + 0.37556487560272217, + 0.4342127597332001 + ], + [ + 0.6276052558422089, + 0.48310242950916293, + 0.6303626632690433, + 0.5115270209312439, + 0.3322448688745502, + 0.4106530022621155, + 0.47762536644935616 + ], + [ + 0.6864614427089692, + 0.5277231228351593, + 0.6758762562274935, + 0.5550532126426697, + 0.3753373396396642, + 0.44397242546081545, + 0.5180622148513795 + ], + [ + 0.7405915570259096, + 0.5736682009696961, + 0.7224655592441562, + 0.5934640800952912, + 0.4099839788675311, + 0.47515505313873296, + 0.561498191356659 + ], + [ + 0.7855554533004763, + 0.6171638596057892, + 0.7643202280998234, + 0.6352275431156159, + 0.460879181027413, + 0.5025253891944885, + 0.6055585241317749 + ], + [ + 0.8345438551902772, + 0.6585500288009644, + 0.8054757142066958, + 0.6763541162014008, + 0.48933981120586395, + 0.5232923221588135, + 0.6467941057682038 + ], + [ + 0.8890160894393923, + 0.6983707046508789, + 0.8475187897682194, + 0.7062180638313295, + 0.5303989911079411, + 0.5466799116134644, + 0.682727168798447 + ], + [ + 0.932370529174805, + 0.733775863647461, + 0.8835129952430728, + 0.7199046373367312, + 0.5441877448558808, + 0.562729320526123, + 0.7072468650341034 + ], + [ + 0.9728204774856568, + 0.7743169605731964, + 0.9263008165359502, + 0.7218778681755068, + 0.5389796268939973, + 0.5760989379882813, + 0.7382509124279025 + ], + [ + 1.0220467042922976, + 0.8069775712490083, + 0.9543933558464052, + 0.7224195075035097, + 0.5360532724857331, + 0.5962830567359925, + 0.7557692730426789 + ], + [ + 1.0673979544639591, + 0.8318592154979706, + 0.9988641500473027, + 0.7233287477493288, + 0.5467482662200929, + 0.6081754302978516, + 0.7874789416790012 + ], + [ + 1.1030771827697756, + 0.8633268821239473, + 1.0231681990623476, + 0.7246962833404542, + 0.5629814755916597, + 0.6179575634002685, + 0.8023502731323242 + ], + [ + 1.1361855483055114, + 0.8828337466716767, + 1.0581645989418034, + 0.7312023448944092, + 0.5704856908321381, + 0.6236627531051636, + 0.8353516137599949 + ], + [ + 1.177269666194916, + 0.9115531992912294, + 1.0834463930130005, + 0.7474216187000275, + 0.5704767358303071, + 0.6303576517105103, + 0.853184007406235 + ], + [ + 1.216457877159119, + 0.9442413151264192, + 1.1179829096794132, + 0.7613733625411987, + 0.5682050061225892, + 0.6345734119415284, + 0.8700177276134492 + ], + [ + 1.2471268796920778, + 0.969666554927826, + 1.1396134591102602, + 0.7788646435737611, + 0.5716261196136475, + 0.6363511657714844, + 0.9024029397964481 + ], + [ + 1.2760287046432495, + 1.0009050691127779, + 1.1629148316383362, + 0.7911798810958862, + 0.5737721717357636, + 0.636794409751892, + 0.918459975719452 + ], + [ + 1.304989266395569, + 1.0244963288307192, + 1.1733700132369995, + 0.8015547227859497, + 0.573141633272171, + 0.6410701847076417, + 0.9433916115760805 + ], + [ + 1.33211211681366, + 1.052311842441559, + 1.178794550895691, + 0.8122784161567689, + 0.5845735251903534, + 0.6425920057296753, + 0.9651515793800356 + ], + [ + 1.3618429732322697, + 1.074110474586487, + 1.1839787650108338, + 0.8216530561447144, + 0.5898322522640229, + 0.6427592611312867, + 0.9803834223747253 + ], + [ + 1.3757756757736208, + 1.096538531780243, + 1.1922674441337586, + 0.8302400934696198, + 0.5946316087245942, + 0.6490427780151368, + 0.99573117852211 + ], + [ + 1.388705236911774, + 1.1221785306930543, + 1.1973571801185607, + 0.8501445829868318, + 0.6040978133678436, + 0.6635603332519532, + 0.9994550132751465 + ], + [ + 1.4018298292160036, + 1.1411488795280458, + 1.2122234106063843, + 0.8748423898220063, + 0.6173315238952637, + 0.6786073112487794, + 1.0031166362762451 + ], + [ + 1.4311272478103638, + 1.160826222896576, + 1.235715861320496, + 0.8997819697856905, + 0.625350695848465, + 0.7038584375381473, + 1.0089704823493957 + ], + [ + 1.4818553471565248, + 1.178594799041748, + 1.2442849254608155, + 0.9243740022182466, + 0.6303199481964111, + 0.7192970752716066, + 1.016340823173523 + ], + [ + 1.5174244809150697, + 1.194170048236847, + 1.2668777227401735, + 0.9470809304714205, + 0.6386990714073181, + 0.7359888744354249, + 1.0238745379447938 + ], + [ + 1.5403950357437135, + 1.2096175479888918, + 1.2836218237876893, + 0.9681425106525423, + 0.6402019357681275, + 0.7618219327926639, + 1.0343141317367555 + ], + [ + 1.5908410382270814, + 1.240591962337494, + 1.296176130771637, + 0.9856742322444918, + 0.637730633020401, + 0.7702915954589844, + 1.044189007282257 + ], + [ + 1.6413205790519716, + 1.275945999622345, + 1.304237425327301, + 1.0011235380172732, + 0.6415024077892304, + 0.7898749113082888, + 1.0529629874229431 + ], + [ + 1.6834332156181337, + 1.3114942049980165, + 1.307675085067749, + 1.0152448844909672, + 0.6453595960140228, + 0.8090675735473635, + 1.0650376844406129 + ], + [ + 1.728991324901581, + 1.350103018283844, + 1.3073589777946473, + 1.0278248834609989, + 0.6464939641952515, + 0.8199131679534913, + 1.0795467138290407 + ], + [ + 1.7702824568748476, + 1.395156650543213, + 1.313988287448883, + 1.041631865501404, + 0.6436521923542022, + 0.841039094924927, + 1.09271222114563 + ], + [ + 1.8114928030967712, + 1.432352192401886, + 1.315835039615631, + 1.0580738830566407, + 0.6462940633296967, + 0.850997862815857, + 1.097726013660431 + ], + [ + 1.8536930894851686, + 1.4739041924476624, + 1.3155357646942138, + 1.076154775619507, + 0.6423897325992585, + 0.8615904998779299, + 1.1024883699417114 + ], + [ + 1.8862630462646484, + 1.5112842464447023, + 1.3179177403450013, + 1.094332399368286, + 0.6450358200073242, + 0.8738159322738648, + 1.1098645091056825 + ] + ], + "mean": [ + [ + 0.007658379152417183, + 0.008857819251716137, + 0.004454368259757757, + 0.012222890742123127, + -0.0003202000807505101, + 0.004750911612063646, + -0.017609231173992157 + ], + [ + 0.009401832707226276, + 0.012104987166821957, + 0.00522783026099205, + 0.013800857588648796, + -0.0018178155878558755, + 0.007190931122750044, + -0.021091649308800697 + ], + [ + 0.011178852058947086, + 0.015330350957810879, + 0.006005396600812674, + 0.015318036079406738, + -0.0033449530601501465, + 0.00970021914690733, + -0.024553723633289337 + ], + [ + 0.012991405092179775, + 0.018530666828155518, + 0.006794790271669626, + 0.01677965559065342, + -0.004889840260148048, + 0.012273578904569149, + -0.027991360053420067 + ], + [ + 0.014872013591229916, + 0.021676411852240562, + 0.007520362734794617, + 0.018165716901421547, + -0.006384320091456175, + 0.014941003173589706, + -0.03141495957970619 + ], + [ + 0.016793275251984596, + 0.024776389822363853, + 0.008240263909101486, + 0.019475553184747696, + -0.007879357784986496, + 0.01768108829855919, + -0.03483860567212105 + ], + [ + 0.0187626164406538, + 0.027816733345389366, + 0.00894118007272482, + 0.020699726417660713, + -0.00937705673277378, + 0.020471403375267982, + -0.03825812786817551 + ], + [ + 0.020784195512533188, + 0.03078964166343212, + 0.009648635983467102, + 0.0218290314078331, + -0.010866060853004456, + 0.023257723078131676, + -0.041672129184007645 + ], + [ + 0.022875744849443436, + 0.03366665914654732, + 0.010376522317528725, + 0.022839022800326347, + -0.01238520722836256, + 0.026055023074150085, + -0.045099157840013504 + ], + [ + 0.025037173181772232, + 0.036453165113925934, + 0.01113645639270544, + 0.023737575858831406, + -0.013935483060777187, + 0.028796987608075142, + -0.04851987957954407 + ], + [ + 0.027261164039373398, + 0.03914705663919449, + 0.011926539242267609, + 0.02454354241490364, + -0.015496991574764252, + 0.0314810648560524, + -0.051920730620622635 + ], + [ + 0.029545992612838745, + 0.04175335541367531, + 0.012737826444208622, + 0.025279754772782326, + -0.01704186387360096, + 0.0341251976788044, + -0.05534590035676956 + ], + [ + 0.031895868480205536, + 0.04425309598445892, + 0.013577328994870186, + 0.02595067210495472, + -0.018575483933091164, + 0.036747124046087265, + -0.05880529060959816 + ], + [ + 0.03427543118596077, + 0.046632591634988785, + 0.014451851136982441, + 0.026537885889410973, + -0.02013111487030983, + 0.039274200797080994, + -0.062253326177597046 + ], + [ + 0.036674223840236664, + 0.048858243972063065, + 0.01535737607628107, + 0.02702954038977623, + -0.02174590341746807, + 0.041699934750795364, + -0.06568543612957001 + ], + [ + 0.039092689752578735, + 0.05094762146472931, + 0.016286293044686317, + 0.027449525892734528, + -0.02340669557452202, + 0.04401855170726776, + -0.0691157877445221 + ], + [ + 0.041474584490060806, + 0.052909135818481445, + 0.017290154471993446, + 0.027788810431957245, + -0.0251191183924675, + 0.046155501157045364, + -0.07253476977348328 + ], + [ + 0.043867286294698715, + 0.0547383613884449, + 0.01831543631851673, + 0.028052257373929024, + -0.02688027173280716, + 0.04818490892648697, + -0.07593102008104324 + ], + [ + 0.04628068208694458, + 0.05647294223308563, + 0.019364940002560616, + 0.0282595194876194, + -0.028703199699521065, + 0.05009632185101509, + -0.07929037511348724 + ], + [ + 0.04871948063373566, + 0.05810447037220001, + 0.020438717678189278, + 0.028412874788045883, + -0.030575715005397797, + 0.0519210584461689, + -0.08264047652482986 + ], + [ + 0.05119102820754051, + 0.05964110046625137, + 0.02153938263654709, + 0.028514934703707695, + -0.03246186673641205, + 0.053641870617866516, + -0.08600873500108719 + ], + [ + 0.05370102450251579, + 0.06107966974377632, + 0.022658443078398705, + 0.028571883216500282, + -0.0343390628695488, + 0.05525055527687073, + -0.08941362798213959 + ], + [ + 0.05624990537762642, + 0.0624350942671299, + 0.02379852905869484, + 0.028590185567736626, + -0.036232683807611465, + 0.056793805211782455, + -0.09283249080181122 + ], + [ + 0.05903080478310585, + 0.06391049176454544, + 0.0248304083943367, + 0.028855938464403152, + -0.03817290812730789, + 0.05804428830742836, + -0.09628290683031082 + ], + [ + 0.0618293471634388, + 0.06527716666460037, + 0.025879522785544395, + 0.029027385637164116, + -0.04015270248055458, + 0.059134986251592636, + -0.09974802285432816 + ], + [ + 0.06464697420597076, + 0.06654639542102814, + 0.02693953923881054, + 0.029120884835720062, + -0.04218311235308647, + 0.060118064284324646, + -0.10323799401521683 + ], + [ + 0.0674806758761406, + 0.06771902740001678, + 0.02801157720386982, + 0.029089344665408134, + -0.04422939568758011, + 0.06102463975548744, + -0.10672996938228607 + ], + [ + 0.07031552493572235, + 0.06879719346761703, + 0.029092615470290184, + 0.028966689482331276, + -0.04629088565707207, + 0.061855919659137726, + -0.11020469665527344 + ], + [ + 0.07315926998853683, + 0.06976184248924255, + 0.03015769086778164, + 0.028728779405355453, + -0.04833582043647766, + 0.06264413148164749, + -0.11365531384944916 + ], + [ + 0.07599813491106033, + 0.0706113949418068, + 0.03121102601289749, + 0.02839682623744011, + -0.05038602277636528, + 0.06335200369358063, + -0.11708284169435501 + ], + [ + 0.07882668077945709, + 0.07134242355823517, + 0.032264191657304764, + 0.027962952852249146, + -0.05245405435562134, + 0.06401149928569794, + -0.12048041820526123 + ], + [ + 0.08164005726575851, + 0.0719563290476799, + 0.033316198736429214, + 0.027433862909674644, + -0.05455007031559944, + 0.06464757770299911, + -0.12382271885871887 + ], + [ + 0.08443126082420349, + 0.07244483381509781, + 0.03437122702598572, + 0.026793232187628746, + -0.0566907599568367, + 0.065323106944561, + -0.12710261344909668 + ], + [ + 0.08718691021203995, + 0.07282527536153793, + 0.03543206676840782, + 0.026059366762638092, + -0.05888713151216507, + 0.06606356799602509, + -0.13032697141170502 + ], + [ + 0.08993057906627655, + 0.07302862405776978, + 0.036481909453868866, + 0.025197867304086685, + -0.06114192679524422, + 0.06698833405971527, + -0.13345319032669067 + ], + [ + 0.09267833828926086, + 0.07308070361614227, + 0.03747568652033806, + 0.024230634793639183, + -0.06349428743124008, + 0.06802012026309967, + -0.13646374642848969 + ], + [ + 0.09537947922945023, + 0.07309087365865707, + 0.038461390882730484, + 0.02329397201538086, + -0.06581474840641022, + 0.06900708377361298, + -0.13933229446411133 + ], + [ + 0.0981098860502243, + 0.07303785532712936, + 0.03939925879240036, + 0.022334931418299675, + -0.0681842714548111, + 0.07007069140672684, + -0.14211679995059967 + ], + [ + 0.10086165368556976, + 0.07293997704982758, + 0.040261171758174896, + 0.021401971578598022, + -0.07048209011554718, + 0.0711694210767746, + -0.1449049413204193 + ], + [ + 0.10362881422042847, + 0.07300710678100586, + 0.041159093379974365, + 0.020546257495880127, + -0.07274740934371948, + 0.07233704626560211, + -0.14775985479354858 + ] + ], + "std": [ + [ + 0.08174657076597214, + 0.08688008785247803, + 0.05284891650080681, + 0.09996537864208221, + 0.06071144714951515, + 0.06781116873025894, + 0.07354088872671127 + ], + [ + 0.10159408301115036, + 0.10383894294500351, + 0.06595910340547562, + 0.11861658841371536, + 0.0744531974196434, + 0.08425485342741013, + 0.09031891822814941 + ], + [ + 0.12117922306060791, + 0.12050133943557739, + 0.07884900271892548, + 0.13696658611297607, + 0.08753102272748947, + 0.10030068457126617, + 0.1066870167851448 + ], + [ + 0.14041486382484436, + 0.13682116568088531, + 0.09145266562700272, + 0.15496845543384552, + 0.09992137551307678, + 0.11587206274271011, + 0.12258248776197433 + ], + [ + 0.15927571058273315, + 0.15277354419231415, + 0.10373204201459885, + 0.1725941002368927, + 0.1116849035024643, + 0.13094797730445862, + 0.13796548545360565 + ], + [ + 0.17770467698574066, + 0.16836890578269958, + 0.11566687375307083, + 0.18984399735927582, + 0.12296844273805618, + 0.14553914964199066, + 0.1528349369764328 + ], + [ + 0.19571635127067566, + 0.18362779915332794, + 0.12725505232810974, + 0.20671740174293518, + 0.1338871717453003, + 0.15963637828826904, + 0.16721151769161224 + ], + [ + 0.2133350521326065, + 0.19857320189476013, + 0.13849331438541412, + 0.2232137769460678, + 0.14454858005046844, + 0.17324991524219513, + 0.18114256858825684 + ], + [ + 0.23059527575969696, + 0.2132318615913391, + 0.14939181506633759, + 0.23933099210262299, + 0.15501272678375244, + 0.18637345731258392, + 0.1946721225976944 + ], + [ + 0.24752309918403625, + 0.22761887311935425, + 0.15995487570762634, + 0.25507402420043945, + 0.1653004139661789, + 0.19899959862232208, + 0.20782290399074554 + ], + [ + 0.26414358615875244, + 0.24174612760543823, + 0.17020079493522644, + 0.27043914794921875, + 0.17541876435279846, + 0.2111324816942215, + 0.22062113881111145 + ], + [ + 0.2804745137691498, + 0.25562426447868347, + 0.1801505833864212, + 0.2854368984699249, + 0.18542587757110596, + 0.22279785573482513, + 0.23311343789100647 + ], + [ + 0.2965184152126312, + 0.2692600190639496, + 0.18980786204338074, + 0.30007779598236084, + 0.19536417722702026, + 0.23402997851371765, + 0.24533742666244507 + ], + [ + 0.3122704327106476, + 0.28264716267585754, + 0.1991804987192154, + 0.31437981128692627, + 0.2052239179611206, + 0.24481631815433502, + 0.2572844326496124 + ], + [ + 0.32774093747138977, + 0.2957938611507416, + 0.20828638970851898, + 0.3283674120903015, + 0.2149822860956192, + 0.2551835775375366, + 0.26895999908447266 + ], + [ + 0.342943012714386, + 0.3086913228034973, + 0.2171461433172226, + 0.3420602083206177, + 0.22463931143283844, + 0.2651374638080597, + 0.2803652584552765 + ], + [ + 0.357896089553833, + 0.32134488224983215, + 0.22577311098575592, + 0.35549670457839966, + 0.23418186604976654, + 0.27465930581092834, + 0.29148656129837036 + ], + [ + 0.3726210296154022, + 0.3337554335594177, + 0.23417995870113373, + 0.3686940670013428, + 0.24358510971069336, + 0.2838376462459564, + 0.3022983968257904 + ], + [ + 0.3871349096298218, + 0.34591352939605713, + 0.2423790842294693, + 0.38166069984436035, + 0.2527966797351837, + 0.29269349575042725, + 0.3127790689468384 + ], + [ + 0.4014585018157959, + 0.3578132688999176, + 0.2503823935985565, + 0.3944037854671478, + 0.2617955207824707, + 0.3012499213218689, + 0.3229442238807678 + ], + [ + 0.41560494899749756, + 0.36945125460624695, + 0.2581910192966461, + 0.40691447257995605, + 0.2705843150615692, + 0.3095126748085022, + 0.332806795835495 + ], + [ + 0.42958971858024597, + 0.3808092772960663, + 0.26581817865371704, + 0.4191874861717224, + 0.279185026884079, + 0.31747400760650635, + 0.34240517020225525 + ], + [ + 0.44340482354164124, + 0.3918876349925995, + 0.2732551693916321, + 0.431210994720459, + 0.28758662939071655, + 0.32517650723457336, + 0.35173699259757996 + ], + [ + 0.45705294609069824, + 0.4026266932487488, + 0.2805432379245758, + 0.442937970161438, + 0.2957890033721924, + 0.3325645625591278, + 0.3608241081237793 + ], + [ + 0.47051939368247986, + 0.4130870997905731, + 0.2876516282558441, + 0.4544163942337036, + 0.3038281798362732, + 0.33969491720199585, + 0.3696805238723755 + ], + [ + 0.48379719257354736, + 0.4232894778251648, + 0.2945936620235443, + 0.46566325426101685, + 0.31172144412994385, + 0.3465479910373688, + 0.3783152103424072 + ], + [ + 0.4968703091144562, + 0.4332132935523987, + 0.30136987566947937, + 0.4766405522823334, + 0.3195023238658905, + 0.353159636259079, + 0.38676172494888306 + ], + [ + 0.5097216963768005, + 0.4428729712963104, + 0.30799081921577454, + 0.48736056685447693, + 0.32716822624206543, + 0.3595106303691864, + 0.3950084447860718 + ], + [ + 0.5223303437232971, + 0.4522712230682373, + 0.31447848677635193, + 0.4978027939796448, + 0.3347381055355072, + 0.3656587302684784, + 0.4030694365501404 + ], + [ + 0.5346918106079102, + 0.46142372488975525, + 0.32085052132606506, + 0.5079835653305054, + 0.3422068655490875, + 0.3715355396270752, + 0.4109339714050293 + ], + [ + 0.546795666217804, + 0.4703352451324463, + 0.3271092474460602, + 0.5178886651992798, + 0.3495839834213257, + 0.3771463930606842, + 0.4186027944087982 + ], + [ + 0.5586374998092651, + 0.479002445936203, + 0.33326464891433716, + 0.5275102853775024, + 0.3568689525127411, + 0.38247206807136536, + 0.4260764420032501 + ], + [ + 0.5702112913131714, + 0.48742660880088806, + 0.3393203616142273, + 0.5368348956108093, + 0.36405983567237854, + 0.38753870129585266, + 0.433351993560791 + ], + [ + 0.5815216302871704, + 0.49560579657554626, + 0.34527522325515747, + 0.5458804368972778, + 0.371147483587265, + 0.39230164885520935, + 0.44038447737693787 + ], + [ + 0.5925602912902832, + 0.50358647108078, + 0.3511498272418976, + 0.5545957684516907, + 0.3781278133392334, + 0.39692744612693787, + 0.44719111919403076 + ], + [ + 0.6033177375793457, + 0.5114069581031799, + 0.35699108242988586, + 0.5630057454109192, + 0.38496050238609314, + 0.40137872099876404, + 0.453816294670105 + ], + [ + 0.6138854622840881, + 0.5191879868507385, + 0.3627449572086334, + 0.5712494254112244, + 0.3917534649372101, + 0.40548208355903625, + 0.46029090881347656 + ], + [ + 0.6241997480392456, + 0.5268219113349915, + 0.36845242977142334, + 0.5792925357818604, + 0.3984285593032837, + 0.40938976407051086, + 0.4665985107421875 + ], + [ + 0.6342678070068359, + 0.534338653087616, + 0.3741312623023987, + 0.5871620178222656, + 0.40508952736854553, + 0.4130985140800476, + 0.47278887033462524 + ], + [ + 0.6440860033035278, + 0.5415440201759338, + 0.3796880543231964, + 0.5948605537414551, + 0.4116789996623993, + 0.4165865182876587, + 0.478929340839386 + ] + ] + } +} \ No newline at end of file diff --git a/demo_data/droid_sample/meta/stats.json b/demo_data/droid_sample/meta/stats.json new file mode 100644 index 000000000..3a91f6329 --- /dev/null +++ b/demo_data/droid_sample/meta/stats.json @@ -0,0 +1,238 @@ +{ + "action": { + "mean": [ + 0.5444459915161133, + 0.0006728441221639514, + 0.32045629620552063, + 0.08815183490514755, + -0.0003649781574495137, + -0.49132856726646423, + 0.4859964847564697, + -0.12859651446342468, + 0.116498664021492, + 0.4010031819343567, + 0.08634048700332642, + 0.4730435311794281, + -0.048279549926519394, + -1.727648138999939, + -0.09448366612195969, + 2.2636709213256836, + -0.16986365616321564 + ], + "std": [ + 0.11196079850196838, + 0.31248483061790466, + 0.19094185531139374, + 0.5754572153091431, + 0.34039023518562317, + 0.5511884689331055, + 0.5650026202201843, + 0.260168194770813, + 0.5888826251029968, + 0.4420638978481293, + 0.5168144106864929, + 0.5416669845581055, + 0.368845134973526, + 0.4841535687446594, + 0.49455031752586365, + 0.411504864692688, + 0.6770331859588623 + ], + "min": [ + 0.29008662700653076, + -0.6011795997619629, + -0.004260015673935413, + -0.9991557598114014, + -0.6782792210578918, + -0.9998607039451599, + -0.8376816511154175, + -0.8177980780601501, + -0.9994775652885437, + 0.0, + -0.6856127381324768, + -0.5755881071090698, + -1.144209384918213, + -2.5053017139434814, + -1.5517704486846924, + 1.5090316534042358, + -1.4737954139709473 + ], + "max": [ + 0.6961188912391663, + 0.7033843398094177, + 0.7690073847770691, + 0.9892286658287048, + 0.7877424955368042, + 0.6604393720626831, + 0.999996542930603, + 0.38913899660110474, + 0.9777563810348511, + 1.0, + 1.890452265739441, + 1.5922945737838745, + 0.5886840224266052, + -0.5610233545303345, + 0.5861471891403198, + 3.476914644241333, + 1.3992640972137451 + ], + "q01": [ + 0.29226800829172134, + -0.594185848236084, + 0.0030179674411192534, + -0.9891794782876968, + -0.6195239824056625, + -0.9974600732326507, + -0.7859313851594925, + -0.8111711919307709, + -0.9803599089384079, + 0.0, + -0.6834460616111755, + -0.42092331528663635, + -1.137687349319458, + -2.466612629890442, + -1.5462587618827819, + 1.56080153465271, + -1.4482932579517365 + ], + "q99": [ + 0.6955491298437119, + 0.6985538953542709, + 0.7498341053724287, + 0.9761729311943054, + 0.7877424955368042, + 0.6426218485832214, + 0.9990008217096329, + 0.37542753309011445, + 0.9709399473667143, + 0.9974779886007307, + 1.7865182054042816, + 1.509493225812912, + 0.5565401327610008, + -0.632802249193192, + 0.5057953256368631, + 3.436197290420532, + 1.3614182722568509 + ] + }, + "observation.state": { + "mean": [ + 0.5434713959693909, + -0.001445216708816588, + 0.3193525969982147, + 0.08118283003568649, + 0.003153428668156266, + -0.5073641538619995, + 0.5017179250717163, + -0.12669038772583008, + 0.10941077768802643, + 0.35925987362861633, + 0.07708907127380371, + 0.4735225737094879, + -0.049846962094306946, + -1.7333053350448608, + -0.09704513847827911, + 2.258286952972412, + -0.1533462554216385 + ], + "std": [ + 0.10636541247367859, + 0.3017789125442505, + 0.18669173121452332, + 0.574813961982727, + 0.3392915725708008, + 0.5389350652694702, + 0.5530298948287964, + 0.2554329037666321, + 0.5909058451652527, + 0.40394988656044006, + 0.5045275688171387, + 0.5398584604263306, + 0.3690968155860901, + 0.4751741588115692, + 0.4835607707500458, + 0.411763072013855, + 0.6698252558708191 + ], + "min": [ + 0.2983984053134918, + -0.5528624057769775, + 0.03477378934621811, + -0.9992062449455261, + -0.679516077041626, + -0.9999886751174927, + -0.7876043915748596, + -0.8260241150856018, + -0.9997135996818542, + 0.0, + -0.6748055815696716, + -0.4226653277873993, + -1.1486613750457764, + -2.48738956451416, + -1.5257046222686768, + 1.5116517543792725, + -1.4591554403305054 + ], + "max": [ + 0.6932946443557739, + 0.6848794221878052, + 0.7470440864562988, + 0.9853811264038086, + 0.8158777952194214, + 0.584469199180603, + 0.9999576210975647, + 0.37267133593559265, + 0.9823699593544006, + 0.9911894202232361, + 1.8788210153579712, + 1.5030596256256104, + 0.5555510520935059, + -0.6200955510139465, + 0.5116546750068665, + 3.4765472412109375, + 1.3659651279449463 + ], + "q01": [ + 0.30021394670009616, + -0.5454532903432846, + 0.04067844107747078, + -0.9860363614559173, + -0.6176698303222656, + -0.9974438244104386, + -0.7832835912704468, + -0.8167447513341903, + -0.9819917219877243, + 0.0, + -0.6746216052770615, + -0.4210720053315163, + -1.1363329315185546, + -2.4677010440826415, + -1.5255609405040742, + 1.527809236049652, + -1.4450986754894257 + ], + "q99": [ + 0.6911274009943008, + 0.677255392074585, + 0.7351217985153197, + 0.9767449289560318, + 0.7877424955368042, + 0.5694869285821913, + 0.9994880557060242, + 0.3602999603748321, + 0.9776942402124404, + 0.9691630005836487, + 1.7432326161861404, + 1.4999543964862823, + 0.5322058433294292, + -0.6630071103572845, + 0.4522029912471771, + 3.446155400276184, + 1.3584745275974273 + ] + }, + "__fingerprints__": { + "observation.state": "sha256:edda7d765942f8b5f187f6c395dfc6981e7aa38ac9e97503a7ffd53e0b71ac7d", + "action": "sha256:99173041873a763043fa70da1891b7ebdf30e154106979be7b5748a063d28980" + } +} \ No newline at end of file diff --git a/demo_data/droid_sample/meta/tasks.jsonl b/demo_data/droid_sample/meta/tasks.jsonl new file mode 100644 index 000000000..cbe8ba95e --- /dev/null +++ b/demo_data/droid_sample/meta/tasks.jsonl @@ -0,0 +1,3 @@ +{"task_index": 0, "task": ""} +{"task_index": 1, "task": "Put the blue block in the green bowl"} +{"task_index": 2, "task": "Move the bottom right tip of the duvet to the left"} diff --git a/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000000.mp4 b/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000000.mp4 new file mode 100644 index 000000000..cbb42fae5 --- /dev/null +++ b/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d90ec069d7cb36b47fcd5e7c18dd528235a814dfc965511833f05b5674f5fec +size 946024 diff --git a/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000001.mp4 b/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000001.mp4 new file mode 100644 index 000000000..d9e823114 --- /dev/null +++ b/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000001.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89f71cb8289f565fe2b6b405909b6810dc0e51166ee409e95cc8e84ed3f9199f +size 1329966 diff --git a/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000002.mp4 b/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000002.mp4 new file mode 100644 index 000000000..caec15b60 --- /dev/null +++ b/demo_data/droid_sample/videos/chunk-000/observation.images.exterior_1_left/episode_000002.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6d575be937d4259dac4f3d33529d7a81ecda5b22b6c1159ae7222a5adfbd80e +size 2604859 diff --git a/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000000.mp4 b/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000000.mp4 new file mode 100644 index 000000000..8919f675e --- /dev/null +++ b/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ec4045dbeb4c544b8456fadca6bd0bc2392f25d9cb961942aa613fa3e7205b9 +size 625361 diff --git a/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000001.mp4 b/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000001.mp4 new file mode 100644 index 000000000..7fef61795 --- /dev/null +++ b/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000001.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b01e89c75c74ac90b518656e49a7033d249ca4a3213aeae8c388a2db3d17b91 +size 1058453 diff --git a/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000002.mp4 b/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000002.mp4 new file mode 100644 index 000000000..f8b484e7e --- /dev/null +++ b/demo_data/droid_sample/videos/chunk-000/observation.images.wrist_left/episode_000002.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82eeeb20596dae59bd7074c7e44f4dd8c292551d5bd1b2d9948a765523a1f541 +size 1585838 diff --git a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000000.parquet b/demo_data/gr1.PickNPlace/data/chunk-000/episode_000000.parquet deleted file mode 100644 index 6f459a7ef..000000000 --- a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000000.parquet +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9b7e519c0752a30a490d89443294dc44e7159f4631176d9c2f1ad1efb32058e -size 180485 diff --git a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000001.parquet b/demo_data/gr1.PickNPlace/data/chunk-000/episode_000001.parquet deleted file mode 100644 index 5fe69a10b..000000000 --- a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000001.parquet +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf8229e9fb49eb949e8b4a1827a4dfe21bc186e50e712e87569a0afcae99cefb -size 202962 diff --git a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000002.parquet b/demo_data/gr1.PickNPlace/data/chunk-000/episode_000002.parquet deleted file mode 100644 index 342d2475c..000000000 --- a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000002.parquet +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d1c8351eb0989d8dd6c3ee8e0ec5059c17875896750db010180841f8983df73 -size 202919 diff --git a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000003.parquet b/demo_data/gr1.PickNPlace/data/chunk-000/episode_000003.parquet deleted file mode 100644 index 75ecc6790..000000000 --- a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000003.parquet +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a211ec3d27e6a139bdc6d5012f1aff88aca2ce7565658e60c93e3082f635144 -size 178844 diff --git a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000004.parquet b/demo_data/gr1.PickNPlace/data/chunk-000/episode_000004.parquet deleted file mode 100644 index f5f2bc0ed..000000000 --- a/demo_data/gr1.PickNPlace/data/chunk-000/episode_000004.parquet +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdee402095a61d42cca76e05c6c7f7d68f2e48a47e87fb34d4d9899f64a8abfe -size 143900 diff --git a/demo_data/gr1.PickNPlace/meta/episodes.jsonl b/demo_data/gr1.PickNPlace/meta/episodes.jsonl deleted file mode 100644 index 4e8a629f4..000000000 --- a/demo_data/gr1.PickNPlace/meta/episodes.jsonl +++ /dev/null @@ -1,5 +0,0 @@ -{"episode_index": 0, "tasks": ["pick the pear from the counter and place it in the plate", "valid"], "length": 416} -{"episode_index": 1, "tasks": ["pick the sweet potato from the counter and place it in the plate", "valid"], "length": 470} -{"episode_index": 2, "tasks": ["pick the meat from the counter and place it in the plate", "valid"], "length": 470} -{"episode_index": 3, "tasks": ["pick the salt from the counter and place it in the plate", "valid"], "length": 412} -{"episode_index": 4, "tasks": ["pick the cupcake from the counter and place it in the plate", "valid"], "length": 328} diff --git a/demo_data/gr1.PickNPlace/meta/info.json b/demo_data/gr1.PickNPlace/meta/info.json deleted file mode 100644 index 72d5e3839..000000000 --- a/demo_data/gr1.PickNPlace/meta/info.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "codebase_version": "v2.0", - "robot_type": "GR1ArmsOnly", - "total_episodes": 5, - "total_frames": 2096, - "total_tasks": 6, - "total_videos": 2, - "total_chunks": 0, - "chunks_size": 1000, - "fps": 20.0, - "splits": { - "train": "0:100" - }, - "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", - "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", - "features": { - "observation.images.egoview": { - "dtype": "video", - "shape": [ - 800, - 1280, - 3 - ], - "names": [ - "height", - "width", - "channel" - ], - "video_info": { - "video.fps": 20.0, - "video.codec": "h264", - "video.pix_fmt": "yuv420p", - "video.is_depth_map": false, - "has_audio": false - } - }, - "observation.images.ego_view": { - "dtype": "video", - "shape": [ - 256, - 256, - 3 - ], - "names": [ - "height", - "width", - "channel" - ], - "video_info": { - "video.fps": 20.0, - "video.codec": "h264", - "video.pix_fmt": "yuv420p", - "video.is_depth_map": false, - "has_audio": false - } - }, - "observation.state": { - "dtype": "float64", - "shape": [ - 44 - ], - "names": [ - "motor_0", - "motor_1", - "motor_2", - "motor_3", - "motor_4", - "motor_5", - "motor_6", - "motor_7", - "motor_8", - "motor_9", - "motor_10", - "motor_11", - "motor_12", - "motor_13", - "motor_14", - "motor_15", - "motor_16", - "motor_17", - "motor_18", - "motor_19", - "motor_20", - "motor_21", - "motor_22", - "motor_23", - "motor_24", - "motor_25", - "motor_26", - "motor_27", - "motor_28", - "motor_29", - "motor_30", - "motor_31", - "motor_32", - "motor_33", - "motor_34", - "motor_35", - "motor_36", - "motor_37", - "motor_38", - "motor_39", - "motor_40", - "motor_41", - "motor_42", - "motor_43" - ] - }, - "action": { - "dtype": "float64", - "shape": [ - 44 - ], - "names": [ - "motor_0", - "motor_1", - "motor_2", - "motor_3", - "motor_4", - "motor_5", - "motor_6", - "motor_7", - "motor_8", - "motor_9", - "motor_10", - "motor_11", - "motor_12", - "motor_13", - "motor_14", - "motor_15", - "motor_16", - "motor_17", - "motor_18", - "motor_19", - "motor_20", - "motor_21", - "motor_22", - "motor_23", - "motor_24", - "motor_25", - "motor_26", - "motor_27", - "motor_28", - "motor_29", - "motor_30", - "motor_31", - "motor_32", - "motor_33", - "motor_34", - "motor_35", - "motor_36", - "motor_37", - "motor_38", - "motor_39", - "motor_40", - "motor_41", - "motor_42", - "motor_43" - ] - }, - "timestamp": { - "dtype": "float64", - "shape": [ - 1 - ] - }, - "annotation.human.action.task_description": { - "dtype": "int64", - "shape": [ - 1 - ] - }, - "task_index": { - "dtype": "int64", - "shape": [ - 1 - ] - }, - "annotation.human.validity": { - "dtype": "int64", - "shape": [ - 1 - ] - }, - "episode_index": { - "dtype": "int64", - "shape": [ - 1 - ] - }, - "index": { - "dtype": "int64", - "shape": [ - 1 - ] - }, - "next.reward": { - "dtype": "float64", - "shape": [ - 1 - ] - }, - "next.done": { - "dtype": "bool", - "shape": [ - 1 - ] - } - } -} \ No newline at end of file diff --git a/demo_data/gr1.PickNPlace/meta/modality.json b/demo_data/gr1.PickNPlace/meta/modality.json deleted file mode 100644 index d18a1f91d..000000000 --- a/demo_data/gr1.PickNPlace/meta/modality.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "state": { - "left_arm": { - "start": 0, - "end": 7 - }, - "left_hand": { - "start": 7, - "end": 13 - }, - "left_leg": { - "start": 13, - "end": 19 - }, - "neck": { - "start": 19, - "end": 22 - }, - "right_arm": { - "start": 22, - "end": 29 - }, - "right_hand": { - "start": 29, - "end": 35 - }, - "right_leg": { - "start": 35, - "end": 41 - }, - "waist": { - "start": 41, - "end": 44 - } - }, - "action": { - "left_arm": { - "start": 0, - "end": 7 - }, - "left_hand": { - "start": 7, - "end": 13 - }, - "left_leg": { - "start": 13, - "end": 19 - }, - "neck": { - "start": 19, - "end": 22 - }, - "right_arm": { - "start": 22, - "end": 29 - }, - "right_hand": { - "start": 29, - "end": 35 - }, - "right_leg": { - "start": 35, - "end": 41 - }, - "waist": { - "start": 41, - "end": 44 - } - }, - "video": { - "ego_view_bg_crop_pad_res256_freq20": { - "original_key": "observation.images.ego_view" - } - }, - "annotation": { - "human.action.task_description": {}, - "human.validity": {}, - "human.coarse_action": { - "original_key": "annotation.human.action.task_description" - } - } -} \ No newline at end of file diff --git a/demo_data/gr1.PickNPlace/meta/relative_stats.json b/demo_data/gr1.PickNPlace/meta/relative_stats.json deleted file mode 100644 index b3c6d0538..000000000 --- a/demo_data/gr1.PickNPlace/meta/relative_stats.json +++ /dev/null @@ -1,3322 +0,0 @@ -{ - "left_arm": { - "max": [ - [ - 0.01278138067573309, - 0.022661257535219193, - 0.02109443210065365, - 0.019866308197379112, - 0.023536423221230507, - 0.011341695673763752, - 0.031720515340566635 - ], - [ - 0.014348423108458519, - 0.027234936133027077, - 0.025426479056477547, - 0.022513696923851967, - 0.027636509388685226, - 0.013523685745894909, - 0.030411185696721077 - ], - [ - 0.01581135205924511, - 0.03127831593155861, - 0.029385514557361603, - 0.024917269125580788, - 0.031270261853933334, - 0.015361958183348179, - 0.029240740463137627 - ], - [ - 0.016930637881159782, - 0.03459525480866432, - 0.032871510833501816, - 0.026559116318821907, - 0.033780649304389954, - 0.016682889312505722, - 0.02823956124484539 - ], - [ - 0.01795811764895916, - 0.03686743229627609, - 0.03577301278710365, - 0.027421418577432632, - 0.035419970750808716, - 0.017176460474729538, - 0.027537494897842407 - ], - [ - 0.018853120505809784, - 0.03762354701757431, - 0.03813420981168747, - 0.02783173695206642, - 0.03677276149392128, - 0.016561679542064667, - 0.032818734645843506 - ], - [ - 0.02034827321767807, - 0.017517754808068275, - 0.010396112687885761, - 0.028278248384594917, - 0.03799719735980034, - 0.0026489607989788055, - 0.03948487713932991 - ], - [ - 0.022264469414949417, - 0.01754315197467804, - 0.008712978102266788, - 0.02888784185051918, - 0.03898061811923981, - 0.0018487677443772554, - 0.04189053922891617 - ], - [ - 0.02420474961400032, - 0.01762123964726925, - 0.007606820669025183, - 0.02973068132996559, - 0.03949301689863205, - 0.0011694389395415783, - 0.04409824311733246 - ], - [ - 0.025894803926348686, - 0.017841624096035957, - 0.008091080002486706, - 0.03077009506523609, - 0.039485856890678406, - 0.0009080594754777849, - 0.045699119567871094 - ], - [ - 0.0274400245398283, - 0.018156541511416435, - 0.008502453565597534, - 0.03163239732384682, - 0.03944576159119606, - 0.0008997782715596259, - 0.046638958156108856 - ], - [ - 0.028901560232043266, - 0.01852191425859928, - 0.008890140801668167, - 0.032042715698480606, - 0.038920145481824875, - 0.0010528567945584655, - 0.04715875908732414 - ], - [ - 0.030257882550358772, - 0.01889161765575409, - 0.009242796339094639, - 0.03227323293685913, - 0.037983499467372894, - 0.001258018077351153, - 0.04750565439462662 - ], - [ - 0.03135082870721817, - 0.019218165427446365, - 0.009563595056533813, - 0.032430484890937805, - 0.036583997309207916, - 0.0014223628677427769, - 0.04782852157950401 - ], - [ - 0.03236641362309456, - 0.019520331174135208, - 0.010064094327390194, - 0.03249536082148552, - 0.035021211951971054, - 0.0014683863846585155, - 0.048090606927871704 - ], - [ - 0.03315934166312218, - 0.01978767290711403, - 0.010720014572143555, - 0.03249278664588928, - 0.034997615963220596, - 0.0014057776425033808, - 0.048295725136995316 - ] - ], - "min": [ - [ - -0.0076321931555867195, - -0.03160307556390762, - -0.02038472145795822, - -0.0035519262310117483, - -0.02954700030386448, - -0.0195563156157732, - -0.029514705762267113 - ], - [ - -0.009245378896594048, - -0.03812045603990555, - -0.02467464841902256, - -0.004135262221097946, - -0.02499495819211006, - -0.020167037844657898, - -0.027207182720303535 - ], - [ - -0.010855800472199917, - -0.04409059137105942, - -0.0288498904556036, - -0.004507656674832106, - -0.02204325795173645, - -0.023220861330628395, - -0.025150852277874947 - ], - [ - -0.01238772552460432, - -0.04938364773988724, - -0.03260146453976631, - -0.004599291831254959, - -0.024556219577789307, - -0.026153093203902245, - -0.02414133958518505 - ], - [ - -0.013901288621127605, - -0.053895581513643265, - -0.035961560904979706, - -0.0044211652129888535, - -0.026663966476917267, - -0.029063880443572998, - -0.02610529027879238 - ], - [ - -0.015114106237888336, - -0.0574871189892292, - -0.03923818841576576, - -0.0038763161282986403, - -0.028145313262939453, - -0.03166204318404198, - -0.02729036659002304 - ], - [ - -0.0013420272152870893, - -0.05544302985072136, - -0.04223988950252533, - -0.001188791822642088, - -0.008564098738133907, - -0.03406808525323868, - -0.005999675486236811 - ], - [ - -0.0014238867443054914, - -0.05958624184131622, - -0.04522157460451126, - -0.0012619568733498454, - -0.007314614020287991, - -0.036246031522750854, - -0.006086890120059252 - ], - [ - -0.0014983799774199724, - -0.06317777931690216, - -0.0478639230132103, - -0.0013272162759676576, - -0.006164836697280407, - -0.03819523751735687, - -0.0061187949031591415 - ], - [ - -0.0015628744149580598, - -0.06676653027534485, - -0.0504603236913681, - -0.0013917397009208798, - -0.006507294252514839, - -0.03982521966099739, - -0.006124064326286316 - ], - [ - -0.0016239264514297247, - -0.06980685144662857, - -0.05273423716425896, - -0.0014469216112047434, - -0.006858580280095339, - -0.04139868915081024, - -0.006128575652837753 - ], - [ - -0.0017282793996855617, - -0.07232142984867096, - -0.05487393960356712, - -0.0015009737107902765, - -0.0073272171430289745, - -0.042699530720710754, - -0.006108504720032215 - ], - [ - -0.0018213168950751424, - -0.07437756657600403, - -0.05681334808468819, - -0.0015491156373172998, - -0.0077916462905704975, - -0.04382709786295891, - -0.0061137741431593895 - ], - [ - -0.001908396021462977, - -0.0761265754699707, - -0.05818359553813934, - -0.001592472312040627, - -0.0082433195784688, - -0.044822610914707184, - -0.006141786929219961 - ], - [ - -0.001993336249142885, - -0.0776694118976593, - -0.05953820422291756, - -0.0016574684996157885, - -0.008705738000571728, - -0.04572009667754173, - -0.006193940527737141 - ], - [ - -0.0020751957781612873, - -0.07885225117206573, - -0.06040302664041519, - -0.0017570015043020248, - -0.00918837171047926, - -0.04652857035398483, - -0.006802632939070463 - ] - ], - "q01": [ - [ - -0.0006475780624896288, - -0.009210159443318844, - -0.013474815338850022, - -0.0005594850983470679, - -0.002619038475677371, - -0.010268430970609189, - -0.003376663709059358 - ], - [ - -0.000718389917165041, - -0.0103262510150671, - -0.016499019414186477, - -0.00062392606632784, - -0.0030431126710027457, - -0.012152093835175038, - -0.0038007360417395834 - ], - [ - -0.0007878254749812186, - -0.01124905701726675, - -0.018493861705064774, - -0.0006785199395380915, - -0.003477197466418147, - -0.014442766644060611, - -0.0036639679223299027 - ], - [ - -0.0008496593218296766, - -0.012039320915937424, - -0.019922247529029845, - -0.000736041902564466, - -0.0038524041417986156, - -0.01639586091041565, - -0.002548325806856156 - ], - [ - -0.0009278915356844663, - -0.012922481819987298, - -0.020734887942671774, - -0.0007797612342983484, - -0.004270176496356725, - -0.01805633045732975, - -0.0014781081816181542 - ], - [ - -0.0009885319392196835, - -0.01394161768257618, - -0.022186052054166794, - -0.0008229770814068615, - -0.004477653745561838, - -0.019418882578611373, - -0.001025537808891386 - ], - [ - -0.001011225883848965, - -0.014673092402517796, - -0.022478311136364938, - -0.0008791918400675059, - -0.004659113846719265, - -0.02054726332426071, - -0.0007950186613015831 - ], - [ - -0.0010807798709720374, - -0.015037250705063343, - -0.02259643226861954, - -0.0009613680304028094, - -0.004917547665536403, - -0.021091853454709052, - -0.0007762523833662272 - ], - [ - -0.0011645880527794362, - -0.01590952314436436, - -0.022732127457857132, - -0.0010455079609528184, - -0.005288413818925619, - -0.021591095998883248, - -0.0006664824788458646 - ], - [ - -0.0012227327330037953, - -0.016634874045848846, - -0.02324032187461853, - -0.0011229039868339897, - -0.005685952771455049, - -0.022103968262672424, - -0.0006982614635489882 - ], - [ - -0.0012726054526865482, - -0.016969698667526244, - -0.023231204599142075, - -0.0011996233602985739, - -0.006062254961580038, - -0.022816670313477515, - -0.0006948111345991492 - ], - [ - -0.0013527355389669538, - -0.017154018208384515, - -0.02319750785827637, - -0.0012691616779193283, - -0.006396296806633473, - -0.02329602651298046, - -0.0007760600536130369 - ], - [ - -0.0014363802038133144, - -0.017310676351189613, - -0.023203163966536523, - -0.001336720073595643, - -0.006880136672407389, - -0.023691411688923837, - -0.001109090424142778 - ], - [ - -0.0014745424734428525, - -0.017431075870990752, - -0.023164893314242364, - -0.001416182261891663, - -0.0071426331996917725, - -0.024225737899541855, - -0.0011056640185415747 - ], - [ - -0.0015425543300807477, - -0.01754608452320099, - -0.023144233971834183, - -0.001463840971700847, - -0.0074565324932336806, - -0.024663113057613373, - -0.0011022136546671392 - ], - [ - -0.0016149338567629456, - -0.01766626164317131, - -0.02302139960229397, - -0.0015223539201542735, - -0.007696221675723791, - -0.025179540738463402, - -0.0011006283340975643 - ] - ], - "q99": [ - [ - 0.007961433194577686, - 0.0009650469757616499, - 0.003778310818597653, - 0.012040703184902659, - 0.011045523919165115, - -1.2534661618701649e-05, - 0.010535713098943229 - ], - [ - 0.00953893419355154, - 0.001095015020109713, - 0.003825285751372572, - 0.015062870830297462, - 0.012970689497888049, - -1.2895667532575326e-05, - 0.011862376891076557 - ], - [ - 0.011350554972887004, - 0.0011609470937401052, - 0.004202937893569468, - 0.017722698673605913, - 0.015182202309370028, - -1.3193436279834739e-05, - 0.013487242534756652 - ], - [ - 0.013345077633857696, - 0.0011960678733885263, - 0.004596911557018754, - 0.019228896126151085, - 0.01732280664145946, - -1.37532164444565e-05, - 0.014218179509043685 - ], - [ - 0.014641523361206053, - 0.0012122832471504765, - 0.005017762165516615, - 0.021064118668437003, - 0.018936597928404807, - -1.3957604642200788e-05, - 0.014950068853795523 - ], - [ - 0.016091231256723404, - 0.0012157046003267095, - 0.0053672113455831985, - 0.0224509846419096, - 0.021040395274758334, - -1.563664918649011e-05, - 0.0150236193090677 - ], - [ - 0.017376267164945582, - 0.001222917879931621, - 0.005490430723875756, - 0.023828408494591707, - 0.022354506701231, - -1.5862970394664463e-05, - 0.015795717574655976 - ], - [ - 0.018103713169693926, - 0.0012219986645504752, - 0.0058916536159813356, - 0.024474574625492084, - 0.024182335659861522, - -1.561548524477988e-05, - 0.01598414182662961 - ], - [ - 0.018860113620758054, - 0.0012482777005061502, - 0.006403024215251202, - 0.026071280986070627, - 0.02468104548752306, - -1.628847385291014e-05, - 0.01623936705291271 - ], - [ - 0.019300263747572894, - 0.001346012228168541, - 0.006796658877283333, - 0.026941828429698934, - 0.024928016960620827, - -1.7287861192016888e-05, - 0.016287627816200245 - ], - [ - 0.019485645368695254, - 0.0013775284169241697, - 0.007239364553242922, - 0.027267277240753167, - 0.025389563664793897, - -1.872737484518442e-05, - 0.016396148130297647 - ], - [ - 0.019746917486190792, - 0.0013585135107859877, - 0.007761899568140505, - 0.027706708759069415, - 0.02563047185540195, - -1.9013329801964627e-05, - 0.016425511240959145 - ], - [ - 0.019971948862075796, - 0.0013440618058666515, - 0.00810128934681415, - 0.027947295084595664, - 0.025945086777210205, - -2.070135014946579e-05, - 0.016378852725028963 - ], - [ - 0.020093451067805277, - 0.0013298619305714926, - 0.008372377045452592, - 0.02800673879683017, - 0.026184871420264228, - -1.866368584160239e-05, - 0.016259743645787212 - ], - [ - 0.020182242244482028, - 0.0013132000342011437, - 0.008862818777561187, - 0.02796994522213936, - 0.026292285695672032, - -1.9404558770475062e-05, - 0.016079481691122034 - ], - [ - 0.02024434022605418, - 0.0013022011378780003, - 0.009381066448986529, - 0.02795162424445152, - 0.02643220424652097, - -2.101481841236819e-05, - 0.015879993513226498 - ] - ], - "mean": [ - [ - 5.444511043606326e-05, - -0.0008391333394683897, - 0.00032112019835039973, - 0.00020385460811667144, - -0.00021059905702713877, - -0.001137183397077024, - 0.00043829737114720047 - ], - [ - 9.042848978424445e-05, - -0.0009741928079165518, - 0.0003376690438017249, - 0.00025797743001021445, - -0.0001956421765498817, - -0.0013019515899941325, - 0.0004953891038894653 - ], - [ - 0.00012541253818199039, - -0.0011157221160829067, - 0.0003510769456624985, - 0.00031312016653828323, - -0.0001833918213378638, - -0.0014671174576506019, - 0.0005557450349442661 - ], - [ - 0.0001595737412571907, - -0.00126180041115731, - 0.0003607443650253117, - 0.0003692955360747874, - -0.0001724599424051121, - -0.0016311922809109092, - 0.0006191459251567721 - ], - [ - 0.00019299621635582298, - -0.0014115109806880355, - 0.0003664474352262914, - 0.00042637225124053657, - -0.0001621643896214664, - -0.0017935051582753658, - 0.0006856234977021813 - ], - [ - 0.0002256886218674481, - -0.0015644659288227558, - 0.00036813519545830786, - 0.00048421096289530396, - -0.00015219666238408536, - -0.0019537846092134714, - 0.0007552957977168262 - ], - [ - 0.000257617502938956, - -0.0017204871401190758, - 0.0003658147470559925, - 0.0005426910938695073, - -0.00014241492317523807, - -0.0021119131706655025, - 0.0008283062488771975 - ], - [ - 0.000265041075181216, - -0.0018445798195898533, - 0.00042038035462610424, - 0.0005571281653828919, - -0.00017388147534802556, - -0.002253199927508831, - 0.0008549861959181726 - ], - [ - 0.0002693135174922645, - -0.001965051982551813, - 0.00048181667807511985, - 0.000565292895771563, - -0.00021204480435699224, - -0.0023897152859717607, - 0.0008772211731411517 - ], - [ - 0.00027083075838163495, - -0.002082445425912738, - 0.0005489333998411894, - 0.0005684357020072639, - -0.00025584030663594604, - -0.002522334922105074, - 0.0008961043204180896 - ], - [ - 0.0002700480108615011, - -0.0021973545663058758, - 0.0006204093806445599, - 0.0005674459971487522, - -0.0003045828780159354, - -0.0026514113415032625, - 0.0009127213270403445 - ], - [ - 0.0002674920833669603, - -0.002310539362952113, - 0.0006945716449990869, - 0.0005635573179461062, - -0.0003569172404240817, - -0.0027777613140642643, - 0.0009284127154387534 - ], - [ - 0.0002634644915815443, - -0.0024225637316703796, - 0.0007702910806983709, - 0.0005578455748036504, - -0.00041136721847578883, - -0.0029022428207099438, - 0.0009442071313969791 - ], - [ - 0.0002580400323495269, - -0.002533714519813657, - 0.000847065297421068, - 0.0005510533228516579, - -0.00046684377593919635, - -0.0030254290904849768, - 0.0009606265230104327 - ], - [ - 0.0002512623032089323, - -0.0026441242080181837, - 0.0009245300316251814, - 0.0005434633931145072, - -0.0005229807575233281, - -0.003147395793348551, - 0.0009778691455721855 - ], - [ - 0.00024326752463821322, - -0.0027539238799363375, - 0.0010023656068369746, - 0.0005353146116249263, - -0.0005795336328446865, - -0.003268251195549965, - 0.000995989190414548 - ] - ], - "std": [ - [ - 0.0013548474526032805, - 0.002475154120475054, - 0.0025077303871512413, - 0.0018940207082778215, - 0.0023079542443156242, - 0.0018818009411916137, - 0.0021521737799048424 - ], - [ - 0.0016086263349279761, - 0.0029437467455863953, - 0.0029614074155688286, - 0.002254312392324209, - 0.0026473840698599815, - 0.0021987007930874825, - 0.0023184772580862045 - ], - [ - 0.0018367526354268193, - 0.0033414557110518217, - 0.0033444100990891457, - 0.0025866504292935133, - 0.002980591496452689, - 0.0025066230446100235, - 0.0024661230854690075 - ], - [ - 0.002039866056293249, - 0.0036577261053025723, - 0.0036590592935681343, - 0.002896640682592988, - 0.0032892220187932253, - 0.002796158194541931, - 0.0025863905902951956 - ], - [ - 0.0022184376139193773, - 0.0038861988577991724, - 0.003907158505171537, - 0.00318868737667799, - 0.003563008736819029, - 0.00306427082978189, - 0.002673450857400894 - ], - [ - 0.0023727307561784983, - 0.004021742381155491, - 0.004090646281838417, - 0.003467204514890909, - 0.003795101772993803, - 0.0033109046053141356, - 0.00272522890008986 - ], - [ - 0.0025036444421857595, - 0.004059883300215006, - 0.004208434373140335, - 0.0037362826988101006, - 0.003982143010944128, - 0.0035375820007175207, - 0.002743488410487771 - ], - [ - 0.00262695224955678, - 0.0042777759954333305, - 0.0043991743586957455, - 0.0038794903084635735, - 0.004144283477216959, - 0.003738213097676635, - 0.002805743832141161 - ], - [ - 0.00273635215125978, - 0.004474038723856211, - 0.004560509696602821, - 0.003989211283624172, - 0.00427213916555047, - 0.003917904570698738, - 0.002849077805876732 - ], - [ - 0.0028320287819951773, - 0.004649014212191105, - 0.004694393835961819, - 0.004070665687322617, - 0.004367628134787083, - 0.004081347491592169, - 0.0028745976742357016 - ], - [ - 0.0029156580567359924, - 0.004805401898920536, - 0.004804549273103476, - 0.004127940628677607, - 0.004436563700437546, - 0.004229655954986811, - 0.002888681134209037 - ], - [ - 0.0029887468554079533, - 0.0049462830647826195, - 0.004896167665719986, - 0.004167973063886166, - 0.0044878036715090275, - 0.004366667475551367, - 0.0028982097283005714 - ], - [ - 0.003051732201129198, - 0.005074674263596535, - 0.004973197355866432, - 0.004197241738438606, - 0.004530442878603935, - 0.0044966405257582664, - 0.0029071911703795195 - ], - [ - 0.0031043915078043938, - 0.005193181801587343, - 0.005037940572947264, - 0.004220305476337671, - 0.0045707025565207005, - 0.004622585140168667, - 0.002916565630584955 - ], - [ - 0.003146233968436718, - 0.0053033726289868355, - 0.005092197563499212, - 0.00423880061134696, - 0.004611056298017502, - 0.004744598176330328, - 0.002925671637058258 - ], - [ - 0.0031777075491845608, - 0.005406235810369253, - 0.005137944128364325, - 0.004254195839166641, - 0.004652723670005798, - 0.004863101057708263, - 0.0029341913759708405 - ] - ] - }, - "left_hand": { - "max": [ - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ], - [ - -1.5000636577606201, - -1.499900460243225, - -1.4997000694274902, - -1.4998137950897217, - -2.996753692626953, - 2.997972249984741 - ] - ], - "min": [ - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ], - [ - -1.5006921291351318, - -1.500763177871704, - -1.5008478164672852, - -1.500693917274475, - -3.0037848949432373, - 1.2573726177215576 - ] - ], - "q01": [ - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ], - [ - -1.5005980730056763, - -1.5005728006362915, - -1.5005347967147826, - -1.500491690635681, - -2.9972636222839357, - 1.257817769050598 - ] - ], - "q99": [ - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ], - [ - -1.5000636577606201, - -1.4999005794525146, - -1.4997000694274902, - -1.4998137950897217, - -2.99686803817749, - 2.027346658706665 - ] - ], - "mean": [ - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ], - [ - -1.5003572702407837, - -1.500273585319519, - -1.5001356601715088, - -1.5001646280288696, - -2.9971468448638916, - 1.2799968719482422 - ] - ], - "std": [ - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ], - [ - 0.00016429393144790083, - 0.00019574473844841123, - 0.00022936351888347417, - 0.00019283845904283226, - 0.00034553627483546734, - 0.14743126928806305 - ] - ] - }, - "right_arm": { - "max": [ - [ - 0.21072520315647125, - 0.2037069946527481, - 0.2999669313430786, - 0.25969406962394714, - 0.3115633726119995, - 0.3166116178035736, - 0.3860560655593872 - ], - [ - 0.24255700409412384, - 0.24425919353961945, - 0.36596930027008057, - 0.2968527376651764, - 0.3691751956939697, - 0.3589022755622864, - 0.4714507758617401 - ], - [ - 0.2740563750267029, - 0.2829327881336212, - 0.4313660264015198, - 0.3423575758934021, - 0.42055508494377136, - 0.4116286039352417, - 0.5558294057846069 - ], - [ - 0.30609190464019775, - 0.3199182152748108, - 0.49504101276397705, - 0.381285697221756, - 0.4602990746498108, - 0.47245877981185913, - 0.6383022665977478 - ], - [ - 0.33049431443214417, - 0.35711613297462463, - 0.5559873580932617, - 0.4112841486930847, - 0.4835093021392822, - 0.5316651463508606, - 0.718315601348877 - ], - [ - 0.359543114900589, - 0.3926372528076172, - 0.6120075583457947, - 0.4335004389286041, - 0.5085675120353699, - 0.5886786580085754, - 0.7978640198707581 - ], - [ - 0.3898200988769531, - 0.4267802834510803, - 0.6598525643348694, - 0.47033536434173584, - 0.548088014125824, - 0.6440584659576416, - 0.8738303780555725 - ], - [ - 0.42314785718917847, - 0.4582560658454895, - 0.7004927396774292, - 0.5063583850860596, - 0.5847245454788208, - 0.6965187191963196, - 0.9458097815513611 - ], - [ - 0.4570634961128235, - 0.4858098030090332, - 0.7204700708389282, - 0.5410608053207397, - 0.6188598871231079, - 0.7473570704460144, - 1.0138700008392334 - ], - [ - 0.48966628313064575, - 0.5100033283233643, - 0.7346896529197693, - 0.574741005897522, - 0.6492444276809692, - 0.798020601272583, - 1.0801541805267334 - ], - [ - 0.5198734998703003, - 0.5319502353668213, - 0.7230274081230164, - 0.6066354513168335, - 0.67961585521698, - 0.8437690734863281, - 1.1450146436691284 - ], - [ - 0.547039270401001, - 0.5546438097953796, - 0.7228518128395081, - 0.633631706237793, - 0.7114741802215576, - 0.8833536505699158, - 1.2070643901824951 - ], - [ - 0.5712763667106628, - 0.579399585723877, - 0.7036530375480652, - 0.6657716035842896, - 0.7418456077575684, - 0.9219698905944824, - 1.2599232196807861 - ], - [ - 0.5914728045463562, - 0.6066195368766785, - 0.6993873119354248, - 0.7007956504821777, - 0.7675748467445374, - 0.9565989971160889, - 1.3090633153915405 - ], - [ - 0.6060146689414978, - 0.634781002998352, - 0.6811156272888184, - 0.7345805168151855, - 0.7838512659072876, - 0.9895951747894287, - 1.3556699752807617 - ], - [ - 0.6098707318305969, - 0.6636291146278381, - 0.6725215911865234, - 0.7676796317100525, - 0.7983922362327576, - 1.016703724861145, - 1.398797631263733 - ] - ], - "min": [ - [ - -0.21453124284744263, - -0.3109867572784424, - -0.24890835583209991, - -0.30084940791130066, - -0.25627702474594116, - -0.20651939511299133, - -0.2834925949573517 - ], - [ - -0.2599722743034363, - -0.3689158856868744, - -0.2935231626033783, - -0.3668867349624634, - -0.3111845850944519, - -0.25061702728271484, - -0.3399274945259094 - ], - [ - -0.302145779132843, - -0.4180450141429901, - -0.3333745300769806, - -0.43064674735069275, - -0.36298689246177673, - -0.2894563674926758, - -0.39282098412513733 - ], - [ - -0.33930209279060364, - -0.4546187222003937, - -0.3720196783542633, - -0.49345529079437256, - -0.40172404050827026, - -0.3326050341129303, - -0.44052448868751526 - ], - [ - -0.36863917112350464, - -0.4781498312950134, - -0.4044109880924225, - -0.5530989170074463, - -0.4372415840625763, - -0.37595489621162415, - -0.4820925295352936 - ], - [ - -0.3857286870479584, - -0.4921344518661499, - -0.4364601671695709, - -0.6085836887359619, - -0.4685240089893341, - -0.4184119999408722, - -0.5226438641548157 - ], - [ - -0.41033539175987244, - -0.5033268928527832, - -0.46670958399772644, - -0.6640620827674866, - -0.4981405436992645, - -0.4608289897441864, - -0.5568763613700867 - ], - [ - -0.4417691230773926, - -0.5121635794639587, - -0.49408453702926636, - -0.7150974869728088, - -0.5345507860183716, - -0.5016624927520752, - -0.5902871489524841 - ], - [ - -0.47106248140335083, - -0.5186919569969177, - -0.5175268650054932, - -0.7616539597511292, - -0.5661113262176514, - -0.537250280380249, - -0.6166352033615112 - ], - [ - -0.49904152750968933, - -0.5244805812835693, - -0.5359035134315491, - -0.8052321076393127, - -0.5923507809638977, - -0.567986249923706, - -0.6382794380187988 - ], - [ - -0.5254459977149963, - -0.5309654474258423, - -0.5499987602233887, - -0.8437415361404419, - -0.6161884665489197, - -0.5977936387062073, - -0.6591689586639404 - ], - [ - -0.5490509867668152, - -0.5655918121337891, - -0.5605499148368835, - -0.8779564499855042, - -0.6393072009086609, - -0.6210988163948059, - -0.679643452167511 - ], - [ - -0.5687129497528076, - -0.6012357473373413, - -0.5751394033432007, - -0.9073910117149353, - -0.6738080382347107, - -0.6393315196037292, - -0.6946337819099426 - ], - [ - -0.585909366607666, - -0.6365477442741394, - -0.5930218696594238, - -0.9371055960655212, - -0.7053685784339905, - -0.6530861854553223, - -0.7089207172393799 - ], - [ - -0.6048920154571533, - -0.6689974069595337, - -0.607925295829773, - -0.9652555584907532, - -0.7330246567726135, - -0.6645238995552063, - -0.7196268439292908 - ], - [ - -0.6198360919952393, - -0.6989898085594177, - -0.6220205426216125, - -0.9910964965820312, - -0.7592641711235046, - -0.6782101392745972, - -0.7270327210426331 - ] - ], - "q01": [ - [ - -0.16811878979206085, - -0.14991782307624818, - -0.14141232669353485, - -0.2698216915130615, - -0.21203081607818602, - -0.1635749101638794, - -0.21955979168415068 - ], - [ - -0.2009277582168579, - -0.1823760062456131, - -0.17101170122623444, - -0.317666220664978, - -0.24043313562870025, - -0.19594729244709014, - -0.2611590027809143 - ], - [ - -0.23303705751895903, - -0.21657704412937165, - -0.20012712478637695, - -0.37486093044281005, - -0.2636604905128479, - -0.22611366212368011, - -0.29490441679954527 - ], - [ - -0.2655377149581909, - -0.25077712535858154, - -0.22769031226634978, - -0.43266095519065856, - -0.29221311211586, - -0.25722657442092894, - -0.3333491921424866 - ], - [ - -0.29670861959457395, - -0.2841611623764038, - -0.2559209942817688, - -0.4835176408290863, - -0.3230690062046051, - -0.2867045819759369, - -0.36098275184631345 - ], - [ - -0.3259840965270996, - -0.31739014983177183, - -0.28357489705085753, - -0.534505832195282, - -0.35983477234840394, - -0.31441455483436587, - -0.3917800009250641 - ], - [ - -0.3561455965042114, - -0.3472186207771301, - -0.3104469239711761, - -0.576845383644104, - -0.3927053093910217, - -0.3401402413845062, - -0.42814323902130125 - ], - [ - -0.3873085379600525, - -0.38170152306556704, - -0.335877126455307, - -0.6273422360420227, - -0.4258993208408356, - -0.36719309687614443, - -0.4488003790378571 - ], - [ - -0.4167225480079651, - -0.39886733889579773, - -0.35977514982223513, - -0.6661844968795776, - -0.4596480667591095, - -0.38898503184318545, - -0.4781840443611145 - ], - [ - -0.44506930112838744, - -0.416984885931015, - -0.38312519192695615, - -0.7074865460395813, - -0.48881676197052004, - -0.4136102795600891, - -0.4991987764835358 - ], - [ - -0.4678186058998108, - -0.4336636185646057, - -0.4057513833045959, - -0.7409525156021118, - -0.5194042801856995, - -0.43951317071914675, - -0.5199943304061889 - ], - [ - -0.48977736234664915, - -0.45921340584754944, - -0.4242892861366272, - -0.7653108477592468, - -0.550258195400238, - -0.4642402231693268, - -0.5351329445838928 - ], - [ - -0.5145848512649536, - -0.46361684799194336, - -0.4468559443950653, - -0.8067207574844361, - -0.5820294380187988, - -0.4864201366901398, - -0.5557743787765503 - ], - [ - -0.5370270252227783, - -0.4737793684005737, - -0.46631152033805845, - -0.8268830418586731, - -0.6066632509231568, - -0.5093122243881225, - -0.5828661799430848 - ], - [ - -0.5586577177047729, - -0.49517590403556827, - -0.4825188219547272, - -0.8698269486427307, - -0.630876624584198, - -0.5323781728744507, - -0.6031890392303467 - ], - [ - -0.5741685032844543, - -0.4953759491443634, - -0.5014638185501099, - -0.8833739757537842, - -0.6594048738479614, - -0.5539077043533325, - -0.6224391460418701 - ] - ], - "q99": [ - [ - 0.1514697730541229, - 0.12907807528972623, - 0.16030739545822137, - 0.19360511600971217, - 0.18909349143505091, - 0.2821693420410155, - 0.32500133514404295 - ], - [ - 0.18423710763454434, - 0.1570682317018508, - 0.1953429490327834, - 0.23327262699604034, - 0.22685551941394794, - 0.32843022942543, - 0.369025558233261 - ], - [ - 0.21510455310344692, - 0.18319692015647868, - 0.2214645147323608, - 0.2727409243583679, - 0.26023723483085626, - 0.36740184426307676, - 0.42263156175613376 - ], - [ - 0.2423999160528183, - 0.19877199232578263, - 0.2580941319465635, - 0.3065242350101471, - 0.29695782661437964, - 0.413708883523941, - 0.4814862430095672 - ], - [ - 0.2701171576976775, - 0.21858025193214414, - 0.277350342273712, - 0.34632340073585505, - 0.3238804399967191, - 0.458142977952957, - 0.5444404125213622 - ], - [ - 0.29805858731269813, - 0.2387651860713957, - 0.3039378702640533, - 0.38176977634429915, - 0.35301939249038633, - 0.4965781748294828, - 0.6129832267761225 - ], - [ - 0.3190084755420684, - 0.26288548707962034, - 0.3192244768142699, - 0.4109920680522918, - 0.3768789231777188, - 0.5515436172485344, - 0.6587206125259399 - ], - [ - 0.3435586929321286, - 0.2854949235916137, - 0.32940408587455716, - 0.44782546758651703, - 0.3950298964977264, - 0.5894962906837462, - 0.7229091286659235 - ], - [ - 0.3645364522933959, - 0.3007685542106627, - 0.33993546366691585, - 0.4761407434940338, - 0.42126951813697816, - 0.6340970396995544, - 0.7866758465766907 - ], - [ - 0.3830603837966919, - 0.30615168213844296, - 0.3512968182563781, - 0.5164096474647522, - 0.44760426878929116, - 0.6704564213752744, - 0.8340543866157523 - ], - [ - 0.4074786245822906, - 0.31008385419845563, - 0.3534088015556334, - 0.5454080462455749, - 0.4716476440429687, - 0.7045015811920164, - 0.8847203373908994 - ], - [ - 0.4334722995758056, - 0.3122299015522003, - 0.35258018970489496, - 0.582526338100433, - 0.49050275683402994, - 0.7469379067420959, - 0.9228959679603568 - ], - [ - 0.4556069493293761, - 0.31558184623718244, - 0.35567812919616687, - 0.6152176856994627, - 0.5065141081809996, - 0.7879458665847776, - 0.970242822170257 - ], - [ - 0.4789225995540618, - 0.3248419106006616, - 0.38149200081825146, - 0.6414709329605099, - 0.5275038242340088, - 0.8278160214424128, - 0.9911520242691032 - ], - [ - 0.4977700293064114, - 0.32913200259208675, - 0.3700384438037872, - 0.6718515276908872, - 0.5514124870300292, - 0.8517088890075684, - 1.0321561336517324 - ], - [ - 0.5134466171264649, - 0.35528105497360074, - 0.3869406819343562, - 0.6994003295898434, - 0.5767783284187313, - 0.8846071004867553, - 1.0450566768646237 - ] - ], - "mean": [ - [ - -0.011777256615459919, - 0.002282914938405156, - 0.00044189480831846595, - 0.014575326815247536, - 0.0033711332362145185, - 0.023892203345894814, - 0.052374809980392456 - ], - [ - -0.013402769342064857, - 0.0013798775617033243, - 0.0004235589876770973, - 0.017757883295416832, - 0.005755632184445858, - 0.02474619448184967, - 0.05275821313261986 - ], - [ - -0.015025630593299866, - 0.0004984143888577819, - 0.0004191435582470149, - 0.02084885537624359, - 0.008137664757668972, - 0.025591101497411728, - 0.05309908464550972 - ], - [ - -0.01665033958852291, - -0.00036973223905079067, - 0.00044174984213896096, - 0.023846572265028954, - 0.010522384196519852, - 0.02645617350935936, - 0.05341727286577225 - ], - [ - -0.01828172244131565, - -0.0012320325477048755, - 0.0005066390731371939, - 0.02674577757716179, - 0.012926515191793442, - 0.027336176484823227, - 0.053724344819784164 - ], - [ - -0.019916243851184845, - -0.0020912587642669678, - 0.0006301811663433909, - 0.02953314781188965, - 0.015359519049525261, - 0.028232373297214508, - 0.0540216788649559 - ], - [ - -0.02155333012342453, - -0.0029352500569075346, - 0.0008033429621718824, - 0.032212577760219574, - 0.01780766062438488, - 0.029155751690268517, - 0.0543193519115448 - ], - [ - -0.023590106517076492, - -0.003358782036229968, - 0.000669292698148638, - 0.03465885668992996, - 0.019771961495280266, - 0.029826292768120766, - 0.05414098501205444 - ], - [ - -0.025698689743876457, - -0.0037274498026818037, - 0.0005097818793728948, - 0.037016283720731735, - 0.021664347499608994, - 0.030521580949425697, - 0.05381901189684868 - ], - [ - -0.02786490134894848, - -0.004059268161654472, - 0.0002986541949212551, - 0.039292480796575546, - 0.023477619513869286, - 0.031264085322618484, - 0.05334504321217537 - ], - [ - -0.030052125453948975, - -0.0043574245646595955, - 2.4972823666757904e-05, - 0.04154743626713753, - 0.02519730105996132, - 0.03204590454697609, - 0.05272892490029335 - ], - [ - -0.03224394470453262, - -0.00463279290124774, - -0.0003120067995041609, - 0.0438118614256382, - 0.026816492900252342, - 0.03287815675139427, - 0.05196471884846687 - ], - [ - -0.03443245589733124, - -0.004886736162006855, - -0.0007209122995845973, - 0.04609016329050064, - 0.028317231684923172, - 0.03376256674528122, - 0.051083825528621674 - ], - [ - -0.03661622107028961, - -0.005111107137054205, - -0.0012176752788946033, - 0.048372428864240646, - 0.029705950990319252, - 0.03466241434216499, - 0.05010366067290306 - ], - [ - -0.038792017847299576, - -0.0053368364460766315, - -0.0017779783811420202, - 0.05067288130521774, - 0.031028499826788902, - 0.03559289872646332, - 0.04901771992444992 - ], - [ - -0.040956102311611176, - -0.005556515883654356, - -0.0023778595495969057, - 0.05299198627471924, - 0.03228628635406494, - 0.036553867161273956, - 0.04782536253333092 - ] - ], - "std": [ - [ - 0.0550406314432621, - 0.04370221868157387, - 0.05068196728825569, - 0.08400248736143112, - 0.06999439001083374, - 0.08097516000270844, - 0.11880826205015182 - ], - [ - 0.06589947640895844, - 0.052279502153396606, - 0.061264071613550186, - 0.09854598343372345, - 0.08194216340780258, - 0.09378886967897415, - 0.129458948969841 - ], - [ - 0.07642727345228195, - 0.06060953065752983, - 0.07144429534673691, - 0.11325830966234207, - 0.09360246360301971, - 0.10660415142774582, - 0.14090290665626526 - ], - [ - 0.08660052716732025, - 0.06864140927791595, - 0.08115292340517044, - 0.12787142395973206, - 0.10483012348413467, - 0.11924456804990768, - 0.15278153121471405 - ], - [ - 0.09641339629888535, - 0.07635902613401413, - 0.0903565064072609, - 0.14223730564117432, - 0.11554884165525436, - 0.1316438615322113, - 0.16484025120735168 - ], - [ - 0.1058616116642952, - 0.08375643938779831, - 0.09901027381420135, - 0.15627561509609222, - 0.12568198144435883, - 0.1437831073999405, - 0.17690950632095337 - ], - [ - 0.11495624482631683, - 0.09083114564418793, - 0.1071324273943901, - 0.16992026567459106, - 0.13521592319011688, - 0.15564338862895966, - 0.18886932730674744 - ], - [ - 0.12434762716293335, - 0.09716491401195526, - 0.115120530128479, - 0.18318182229995728, - 0.14465142786502838, - 0.16725780069828033, - 0.20070922374725342 - ], - [ - 0.13343702256679535, - 0.10317867249250412, - 0.12263046950101852, - 0.19613978266716003, - 0.15345871448516846, - 0.17860861122608185, - 0.21230019629001617 - ], - [ - 0.14222125709056854, - 0.10890331864356995, - 0.12968631088733673, - 0.20881295204162598, - 0.16172370314598083, - 0.18967565894126892, - 0.2235611528158188 - ], - [ - 0.15075752139091492, - 0.11437512934207916, - 0.13631053268909454, - 0.22120177745819092, - 0.16954274475574493, - 0.20046094059944153, - 0.2344515174627304 - ], - [ - 0.15906043350696564, - 0.1196335181593895, - 0.1425098478794098, - 0.23328997194766998, - 0.17701397836208344, - 0.21100139617919922, - 0.24492353200912476 - ], - [ - 0.16711962223052979, - 0.12468886375427246, - 0.1483183652162552, - 0.24506795406341553, - 0.1841607540845871, - 0.22131648659706116, - 0.25494349002838135 - ], - [ - 0.1749141663312912, - 0.1295423060655594, - 0.1537899374961853, - 0.25653979182243347, - 0.19097350537776947, - 0.23140905797481537, - 0.26451313495635986 - ], - [ - 0.1824343204498291, - 0.13423806428909302, - 0.15893271565437317, - 0.26770439743995667, - 0.19748325645923615, - 0.24125048518180847, - 0.27360638976097107 - ], - [ - 0.18967701494693756, - 0.13879136741161346, - 0.1637880802154541, - 0.27857381105422974, - 0.2037012130022049, - 0.25083157420158386, - 0.28219538927078247 - ] - ] - }, - "right_hand": { - "max": [ - [ - 1.5811593532562256, - 1.883379340171814, - 1.6422902345657349, - 1.574438214302063, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.5811593532562256, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.5811593532562256, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.5811593532562256, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.5811593532562256, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.5811593532562256, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.603063702583313, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.6265816688537598, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.6496903896331787, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.67158043384552, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.6913082599639893, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.7081536054611206, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.7225878238677979, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.7348898649215698, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.7454650402069092, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ], - [ - 1.7541356086730957, - 1.883379340171814, - 1.6422902345657349, - 1.5748565196990967, - 3.068474054336548, - 2.98640775680542 - ] - ], - "min": [ - [ - -2.965686082839966, - -2.9676787853240967, - -2.857959032058716, - -2.959138870239258, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.9657015800476074, - -2.9676871299743652, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.9678423404693604, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.968010425567627, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.968337059020996, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.968738555908203, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.9691789150238037, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.9696671962738037, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.9701738357543945, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.970710515975952, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.971313714981079, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965738534927368, - -2.972003221511841, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965752124786377, - -2.9728407859802246, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965775966644287, - -2.973870277404785, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.965813159942627, - -2.975109577178955, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ], - [ - -2.9658560752868652, - -2.9766085147857666, - -2.857959032058716, - -2.9593732357025146, - -3.515009641647339, - 1.1928452253341675 - ] - ], - "q01": [ - [ - -2.471149444580078, - -2.478701114654541, - -2.274889659881592, - -2.366075944900513, - -3.210518312454224, - 1.2541234493255615 - ], - [ - -2.57660026550293, - -2.5853384494781495, - -2.357476758956909, - -2.46053524017334, - -3.221366548538208, - 1.2541234493255615 - ], - [ - -2.6936927795410157, - -2.703793001174927, - -2.4362151622772217, - -2.5655401229858397, - -3.2386077880859374, - 1.2541234493255615 - ], - [ - -2.8234480381011964, - -2.834972095489502, - -2.527337598800659, - -2.657280445098877, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.9628914833068847, - -2.8400710582733155, - -2.636790657043457, - -2.6646446228027343, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.963114881515503, - -2.9555449962615965, - -2.646287965774536, - -2.68312087059021, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.9638315200805665, - -2.9556881904602053, - -2.6468717575073244, - -2.711092948913574, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.964152431488037, - -2.957309436798096, - -2.6483479499816895, - -2.712934398651123, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.9642570495605467, - -2.958971452713013, - -2.650734710693359, - -2.7152451515197753, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.9643006801605223, - -2.9591766834259032, - -2.6662487983703613, - -2.8039457321166994, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.9653868198394777, - -2.9591907501220702, - -2.6698691844940186, - -2.8531261920928954, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.965430164337158, - -2.959203672409058, - -2.669925022125244, - -2.854821300506592, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.9654393196105957, - -2.959221601486206, - -2.6700061798095702, - -2.856401062011719, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.965457582473755, - -2.959233808517456, - -2.67003755569458, - -2.85783371925354, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.9654722690582274, - -2.959240674972534, - -2.6700637340545654, - -2.8592071533203125, - -3.2523841381073, - 1.2541234493255615 - ], - [ - -2.965488576889038, - -2.9592445373535154, - -2.670110273361206, - -2.8605935096740724, - -3.2523841381073, - 1.2541234493255615 - ] - ], - "q99": [ - [ - 1.231861090660095, - 1.477948546409607, - 1.4206781387329102, - 1.4277435064315795, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.3455218553543087, - 1.4993334531784057, - 1.4420194625854486, - 1.4609242916107175, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.473893165588379, - 1.5611068487167328, - 1.4745173692703246, - 1.471717572212219, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.4751140356063843, - 1.5785104036331177, - 1.4927785873413086, - 1.473433542251587, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.4774629116058349, - 1.5801128625869751, - 1.4968814373016357, - 1.47544105052948, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.482913041114807, - 1.5803231000900269, - 1.5016276359558105, - 1.4800477027893066, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.4886518239974973, - 1.6162418365478495, - 1.506981086730957, - 1.48075213432312, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.496144104003906, - 1.6541039466857894, - 1.5079455852508545, - 1.4813446521759033, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.4970525979995728, - 1.6829123735427844, - 1.5098501443862915, - 1.4818572759628295, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.49715416431427, - 1.7003984451293939, - 1.5115840435028076, - 1.4824181079864502, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.5058526754379267, - 1.7076661586761472, - 1.512832498550415, - 1.4830425262451172, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.5313326120376582, - 1.715614533424377, - 1.5134153366088867, - 1.4837245225906373, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.5383820772171017, - 1.7280478715896601, - 1.527425026893615, - 1.4845113277435302, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.541226577758789, - 1.7449465751647941, - 1.5297647237777707, - 1.4853455305099488, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.545463967323303, - 1.7563818931579585, - 1.5297647237777707, - 1.48621506690979, - 3.036720561981201, - 1.9760947465896606 - ], - [ - 1.5516634225845334, - 1.7563818931579585, - 1.5297647237777707, - 1.4874153137207031, - 3.036720561981201, - 1.9760947465896606 - ] - ], - "mean": [ - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.099361538887024, - 1.3292794227600098 - ], - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.099361538887024, - 1.3292794227600098 - ], - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.099361538887024, - 1.3292794227600098 - ], - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.099361538887024, - 1.3292794227600098 - ], - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.0993616580963135, - 1.3292794227600098 - ], - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.0993616580963135, - 1.3292794227600098 - ], - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.0993616580963135, - 1.3292794227600098 - ], - [ - -0.9629306793212891, - -0.904528021812439, - -0.845432460308075, - -0.8694202899932861, - -1.0993616580963135, - 1.3292794227600098 - ], - [ - -0.9644150733947754, - -0.9060124158859253, - -0.8469168543815613, - -0.8709046840667725, - -1.1023303270339966, - 1.3292794227600098 - ], - [ - -0.9658995270729065, - -0.9074968695640564, - -0.8484013080596924, - -0.8723891377449036, - -1.1052991151809692, - 1.3292794227600098 - ], - [ - -0.9658995270729065, - -0.9074968695640564, - -0.8484013080596924, - -0.872389018535614, - -1.1052993535995483, - 1.3292794227600098 - ], - [ - -0.9658995270729065, - -0.9074968695640564, - -0.8484013080596924, - -0.8723891377449036, - -1.105299472808838, - 1.3292794227600098 - ], - [ - -0.9658995270729065, - -0.9074968695640564, - -0.8484011888504028, - -0.872389018535614, - -1.105299472808838, - 1.3292794227600098 - ], - [ - -0.9658995270729065, - -0.9074968695640564, - -0.8484013080596924, - -0.872389018535614, - -1.105299472808838, - 1.3292794227600098 - ], - [ - -0.9629305601119995, - -0.904528021812439, - -0.845432460308075, - -0.8694202303886414, - -1.0993620157241821, - 1.3292794227600098 - ], - [ - -0.9599618315696716, - -0.9015591740608215, - -0.8424636125564575, - -0.8664513826370239, - -1.0934240818023682, - 1.3292794227600098 - ] - ], - "std": [ - [ - 0.8619524240493774, - 0.9595061540603638, - 1.0311051607131958, - 0.9961561560630798, - 2.8125369548797607, - 0.17713722586631775 - ], - [ - 0.8761469721794128, - 0.9726292490959167, - 1.0409529209136963, - 1.007018804550171, - 2.813600778579712, - 0.17713722586631775 - ], - [ - 0.8897889852523804, - 0.9852515459060669, - 1.0503689050674438, - 1.017444372177124, - 2.8144874572753906, - 0.17713722586631775 - ], - [ - 0.9028639793395996, - 0.9973536133766174, - 1.059329867362976, - 1.0274109840393066, - 2.8151776790618896, - 0.17713722586631775 - ], - [ - 0.9153583645820618, - 1.0089191198349, - 1.0678088665008545, - 1.0368950366973877, - 2.815661668777466, - 0.17713722586631775 - ], - [ - 0.9275029301643372, - 1.0201541185379028, - 1.0759937763214111, - 1.0460892915725708, - 2.816033124923706, - 0.17713722586631775 - ], - [ - 0.9392952919006348, - 1.0310544967651367, - 1.0838844776153564, - 1.0549849271774292, - 2.8162715435028076, - 0.17713722586631775 - ], - [ - 0.9509751796722412, - 1.0418344736099243, - 1.0916872024536133, - 1.06379234790802, - 2.8164944648742676, - 0.17713722586631775 - ], - [ - 0.9610558748245239, - 1.0512158870697021, - 1.0982635021209717, - 1.0713080167770386, - 2.8155813217163086, - 0.17713722586631775 - ], - [ - 0.9710537195205688, - 1.0604915618896484, - 1.1047728061676025, - 1.0787519216537476, - 2.8146626949310303, - 0.17713722586631775 - ], - [ - 0.9815518856048584, - 1.0701181888580322, - 1.1118435859680176, - 1.0865343809127808, - 2.8147382736206055, - 0.17713722586631775 - ], - [ - 0.9918613433837891, - 1.0795420408248901, - 1.1188024282455444, - 1.0941646099090576, - 2.8148176670074463, - 0.17713722586631775 - ], - [ - 1.001974105834961, - 1.0887552499771118, - 1.125649094581604, - 1.1016370058059692, - 2.8148977756500244, - 0.17713722586631775 - ], - [ - 1.0118811130523682, - 1.0977535247802734, - 1.1323769092559814, - 1.108944296836853, - 2.814967632293701, - 0.17713722586631775 - ], - [ - 1.0235223770141602, - 1.1081680059432983, - 1.1405737400054932, - 1.1177626848220825, - 2.8172640800476074, - 0.17713722586631775 - ], - [ - 1.0348036289215088, - 1.1182398796081543, - 1.1485551595687866, - 1.1263021230697632, - 2.8195252418518066, - 0.17713722586631775 - ] - ] - } -} \ No newline at end of file diff --git a/demo_data/gr1.PickNPlace/meta/stats.json b/demo_data/gr1.PickNPlace/meta/stats.json deleted file mode 100644 index 3e9c647ba..000000000 --- a/demo_data/gr1.PickNPlace/meta/stats.json +++ /dev/null @@ -1,598 +0,0 @@ -{ - "observation.state": { - "mean": [ - 0.024073680862784386, - 0.05278654396533966, - 0.008337067440152168, - -2.0737104415893555, - 0.005255588795989752, - -0.060208920389413834, - 0.027672337368130684, - 0.00036930033820681274, - 0.0002634618431329727, - 0.00011519899999257177, - 0.00016780724399723113, - -0.002851120661944151, - 1.7207961082458496, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - -0.33521875739097595, - -0.28372809290885925, - 0.15492740273475647, - -1.4590399265289307, - 0.6038258075714111, - 0.39276280999183655, - 0.6387290358543396, - 0.47703617811203003, - 0.4205632209777832, - 0.36146190762519836, - 0.38529467582702637, - 0.13212567567825317, - 1.6727102994918823, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "std": [ - 0.004963173530995846, - 0.0223115012049675, - 0.016123220324516296, - 0.004333216696977615, - 0.010485930368304253, - 0.02426205761730671, - 0.020790329203009605, - 0.00016415574646089226, - 0.00019572838209569454, - 0.00022856859141029418, - 0.00019300324493087828, - 0.000340089580276981, - 0.14482876658439636, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.3952951729297638, - 0.25863444805145264, - 0.19730082154273987, - 0.5862526297569275, - 0.39639753103256226, - 0.3155990540981293, - 0.45589420199394226, - 0.6322236061096191, - 0.5774209499359131, - 0.47875770926475525, - 0.50752854347229, - 0.11130014061927795, - 0.17440029978752136, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "min": [ - -0.011470829136669636, - 0.024762336164712906, - -0.026556096971035004, - -2.1010613441467285, - -0.01772996224462986, - -0.10745838284492493, - -0.018831634894013405, - 6.368422327795997e-05, - -9.9488694104366e-05, - -0.00029993493808433414, - -0.0001862600038293749, - -0.0032463406678289175, - 0.002027842914685607, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - -1.8967396020889282, - -1.0383824110031128, - -0.37157541513442993, - -2.503601312637329, - -0.3952217996120453, - -0.2964313328266144, - -0.7852774262428284, - -0.26744920015335083, - -0.38337936997413635, - -0.14229026436805725, - -0.07485655695199966, - -0.06847395747900009, - 0.01359221339225769, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "max": [ - 0.03430150821805, - 0.12207967042922974, - 0.04231996089220047, - -2.0674543380737305, - 0.0362711139023304, - 0.022216133773326874, - 0.04543035477399826, - 0.0006921110325492918, - 0.000763183634262532, - 0.0008477637893520296, - 0.0006939115701243281, - 0.0037847936619073153, - 1.7426273822784424, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.512335479259491, - 5.2561413212970365e-06, - 0.824306070804596, - 0.0002504349686205387, - 1.4361546039581299, - 1.2453129291534424, - 1.234397053718567, - 1.496082067489624, - 1.563523292541504, - 1.581580638885498, - 1.4593732357025146, - 0.7286486029624939, - 1.847397804260254, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "q01": [ - 0.005135646276175975, - 0.024818393867462873, - -0.025654945988208055, - -2.0987971425056458, - -0.009493496734648943, - -0.10722454041242599, - -0.013124331552535295, - 6.369604670908302e-05, - -9.947519174602348e-05, - -0.0002999187869136222, - -0.0001862465127487667, - -0.003130580298602581, - 0.9732183277606964, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - -1.7906568050384521, - -0.995996531844139, - -0.3003100335597992, - -2.4953843116760255, - -0.33069525212049483, - -0.18793141171336175, - -0.6559093207120895, - -0.17209125831723213, - -0.2489942863583565, - -0.025486903265118602, - 0.0012177389056887476, - -0.03553793989121914, - 1.0250790774822236, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "q99": [ - 0.034285987913608554, - 0.10236052386462695, - 0.03318197131156921, - -2.0678550124168398, - 0.03548044934868814, - 0.0012744752806611432, - 0.04542382601648569, - 0.0005967515520751479, - 0.000568800832843409, - 0.0005331498687155549, - 0.000485652446513997, - -0.0027482542442157838, - 1.7421821415424348, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.3702386841177954, - -8.26762329779597e-06, - 0.6804755419492752, - -0.03044523755088397, - 1.3087890028953566, - 1.216607600450516, - 1.2253605246543884, - 1.4745453178882602, - 1.4878826022148142, - 1.3669828891754154, - 1.4564199566841125, - 0.6415338873863259, - 1.759756165742875, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "action": { - "mean": [ - 0.02412528358399868, - 0.05197398364543915, - 0.008648553863167763, - -2.073517084121704, - 0.005050849635154009, - -0.0613076388835907, - 0.028096528723835945, - -1.5, - -1.5, - -1.5, - -1.5, - -3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - -0.34802183508872986, - -0.28142520785331726, - 0.15472747385501862, - -1.448104739189148, - 0.6057482361793518, - 0.41758018732070923, - 0.6884610056877136, - -0.5081107020378113, - -0.5081107020378113, - -0.5081107020378113, - -0.5081107020378113, - -1.0162214040756226, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "std": [ - 0.004589506890624762, - 0.021911535412073135, - 0.016204575076699257, - 0.0037121744826436043, - 0.010579580441117287, - 0.023559249937534332, - 0.020886780694127083, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.4004358649253845, - 0.2636469602584839, - 0.20557548105716705, - 0.6067609190940857, - 0.40509313344955444, - 0.33099862933158875, - 0.5248527526855469, - 1.411324381828308, - 1.411324381828308, - 1.411324381828308, - 1.411324381828308, - 2.822648763656616, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "min": [ - -0.010770668275654316, - 0.024592319503426552, - -0.028779253363609314, - -2.1038763523101807, - -0.021692538633942604, - -0.10786217451095581, - -0.03113423101603985, - -1.5, - -1.5, - -1.5, - -1.5, - -3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - -1.92161226272583, - -1.0325450897216797, - -0.38629457354545593, - -2.773324966430664, - -0.47445768117904663, - -0.3029063642024994, - -0.8528487086296082, - -1.5, - -1.5, - -1.5, - -1.5, - -3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "max": [ - 0.03447114676237106, - 0.1162029430270195, - 0.041593607515096664, - -2.067178964614868, - 0.03675825893878937, - 0.002659816760569811, - 0.0454457625746727, - -1.5, - -1.5, - -1.5, - -1.5, - -3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.5824630260467529, - 2.628070774335356e-07, - 0.8480403423309326, - 1.2521748431026936e-05, - 1.4609657526016235, - 1.402172565460205, - 1.4867198467254639, - 1.5, - 1.5, - 1.5, - 1.5, - 3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "q01": [ - 0.009603970870375633, - 0.024657226726412775, - -0.025725506618618964, - -2.096692717075348, - -0.007977667218074202, - -0.10757148712873459, - -0.013268395699560643, - -1.5, - -1.5, - -1.5, - -1.5, - -3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - -1.8025968074798584, - -0.9875128328800201, - -0.34295193254947665, - -2.7020513296127318, - -0.3618214175105095, - -0.21808049380779268, - -0.6810785412788392, - -1.5, - -1.5, - -1.5, - -1.5, - -3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "q99": [ - 0.03431716673076153, - 0.0988083183765412, - 0.033423219434916975, - -2.0676562070846556, - 0.035858726128935814, - -0.009058911912143077, - 0.04543412495404482, - -1.5, - -1.5, - -1.5, - -1.5, - -3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.39618612229824374, - -4.133811799533045e-07, - 0.6863827019929915, - -0.028696178365498246, - 1.2879881978034977, - 1.366839945316315, - 1.4862680375576018, - 1.5, - 1.5, - 1.5, - 1.5, - 3.0, - 3.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "timestamp": { - "mean": [ - 10.666498184204102 - ], - "std": [ - 6.306461811065674 - ], - "min": [ - 0.04999995231628418 - ], - "max": [ - 23.499977111816406 - ], - "q01": [ - 0.2499997615814209 - ], - "q99": [ - 22.999977111816406 - ] - }, - "next.reward": { - "mean": [ - 0.002385496161878109 - ], - "std": [ - 0.04878324642777443 - ], - "min": [ - 0.0 - ], - "max": [ - 1.0 - ], - "q01": [ - 0.0 - ], - "q99": [ - 0.0 - ] - } -} \ No newline at end of file diff --git a/demo_data/gr1.PickNPlace/meta/tasks.jsonl b/demo_data/gr1.PickNPlace/meta/tasks.jsonl deleted file mode 100644 index 5eaaf026e..000000000 --- a/demo_data/gr1.PickNPlace/meta/tasks.jsonl +++ /dev/null @@ -1,6 +0,0 @@ -{"task_index": 0, "task": "pick the pear from the counter and place it in the plate"} -{"task_index": 1, "task": "valid"} -{"task_index": 2, "task": "pick the sweet potato from the counter and place it in the plate"} -{"task_index": 3, "task": "pick the meat from the counter and place it in the plate"} -{"task_index": 4, "task": "pick the salt from the counter and place it in the plate"} -{"task_index": 5, "task": "pick the cupcake from the counter and place it in the plate"} diff --git a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000000.mp4 b/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000000.mp4 deleted file mode 100644 index 04b60d635..000000000 --- a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000000.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8901a22d116aa84d580310507336531a18f8600d8f4bf18af525ce73dadecadc -size 1143093 diff --git a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000001.mp4 b/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000001.mp4 deleted file mode 100644 index 017c2db06..000000000 --- a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000001.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71ebc9e46a96523b48bf2f37a837330f91d89da2df5f90ad3771056e12c786eb -size 858310 diff --git a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000002.mp4 b/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000002.mp4 deleted file mode 100644 index ec3bc1e17..000000000 --- a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000002.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c709527d40ef0c643f9844e99720c4721d4f929602f5cebec04a83b74139c959 -size 1068046 diff --git a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000003.mp4 b/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000003.mp4 deleted file mode 100644 index 071dba522..000000000 --- a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000003.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:042a1bf51a8893aba0cd19fe62500b6552f22b25f92b47e910312e38cd721930 -size 788334 diff --git a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000004.mp4 b/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000004.mp4 deleted file mode 100644 index 3b85626e1..000000000 --- a/demo_data/gr1.PickNPlace/videos/chunk-000/observation.images.ego_view/episode_000004.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9871132e445ddf96e619b753ff2d41aa238d664a572e87df93993dc1119e112b -size 726213 diff --git a/demo_data/libero_demo/data/chunk-000/episode_000000.parquet b/demo_data/libero_demo/data/chunk-000/episode_000000.parquet new file mode 100644 index 000000000..3ad214755 --- /dev/null +++ b/demo_data/libero_demo/data/chunk-000/episode_000000.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a593521d58a1e6b3c27d6d91641c2d4c8a12422cc4534d9bfab49b01e532e68 +size 20341 diff --git a/demo_data/libero_demo/data/chunk-000/episode_000001.parquet b/demo_data/libero_demo/data/chunk-000/episode_000001.parquet new file mode 100644 index 000000000..724c16ae0 --- /dev/null +++ b/demo_data/libero_demo/data/chunk-000/episode_000001.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d02255b7218f7a89db07eea56477d8c283cc3c0afb996a8bf4553b2682fda75d +size 25937 diff --git a/demo_data/libero_demo/data/chunk-000/episode_000002.parquet b/demo_data/libero_demo/data/chunk-000/episode_000002.parquet new file mode 100644 index 000000000..6a18b4300 --- /dev/null +++ b/demo_data/libero_demo/data/chunk-000/episode_000002.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60ec6beaaf6b541d4321596758bfb69c96e2b9df8757fc2c9d70db32792790c9 +size 30641 diff --git a/demo_data/libero_demo/data/chunk-000/episode_000003.parquet b/demo_data/libero_demo/data/chunk-000/episode_000003.parquet new file mode 100644 index 000000000..7a800728b --- /dev/null +++ b/demo_data/libero_demo/data/chunk-000/episode_000003.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21eed03b65778058696f14e676bf6a9d921bd7d128c6b6b2db749fdca1cea0f7 +size 26392 diff --git a/demo_data/libero_demo/data/chunk-000/episode_000004.parquet b/demo_data/libero_demo/data/chunk-000/episode_000004.parquet new file mode 100644 index 000000000..c7d7d6ee4 --- /dev/null +++ b/demo_data/libero_demo/data/chunk-000/episode_000004.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e263ac6c3a1abb853a29d89c99d54c9e6a41a63d8a0acc5b31294804dd74a48 +size 25030 diff --git a/demo_data/libero_demo/meta/episodes.jsonl b/demo_data/libero_demo/meta/episodes.jsonl new file mode 100644 index 000000000..8c968a077 --- /dev/null +++ b/demo_data/libero_demo/meta/episodes.jsonl @@ -0,0 +1,5 @@ +{"episode_index": 0, "tasks": ["put the white mug on the left plate and put the yellow and white mug on the right plate"], "length": 214} +{"episode_index": 1, "tasks": ["put the white mug on the plate and put the chocolate pudding to the right of the plate"], "length": 284} +{"episode_index": 2, "tasks": ["put the yellow and white mug in the microwave and close it"], "length": 345} +{"episode_index": 3, "tasks": ["put the yellow and white mug in the microwave and close it"], "length": 285} +{"episode_index": 4, "tasks": ["put the white mug on the plate and put the chocolate pudding to the right of the plate"], "length": 278} diff --git a/demo_data/libero_demo/meta/episodes_stats.jsonl b/demo_data/libero_demo/meta/episodes_stats.jsonl new file mode 100644 index 000000000..e25da88cb --- /dev/null +++ b/demo_data/libero_demo/meta/episodes_stats.jsonl @@ -0,0 +1,379 @@ +{"episode_index": 0, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3447635701497396]], [[0.28064716473747703]], [[0.2361152744667203]]], "std": [[[0.1564366226417492]], [[0.15523014725268017]], [[0.15795053268985237]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.314681100284352]], [[0.26630007695216756]], [[0.23331412042356003]]], "std": [[[0.14752879512692213]], [[0.16063954781402287]], [[0.1689741518554497]]], "count": [100]}, "observation.state": {"min": [-0.09937734156847, -0.262305349111557, 0.5090022087097168, 2.9535176753997803, -0.6202048063278198, -0.3195846676826477, 0.00216578203253448, -0.03987489640712738], "max": [0.004061548970639706, 0.3263026177883148, 0.6783280968666077, 3.200037717819214, 0.2585979700088501, -0.028236670419573784, 0.039890043437480927, -0.005399784538894892], "mean": [-0.03687908872961998, -0.018966980278491974, 0.5918678641319275, 3.0920450687408447, -0.13682393729686737, -0.13184475898742676, 0.023117829114198685, -0.02376418560743332], "std": [0.031378068029880524, 0.18709546327590942, 0.04594912752509117, 0.06270694732666016, 0.3217035233974457, 0.08319173008203506, 0.01651187054812908, 0.015891386196017265], "count": [214]}, "action": {"min": [-0.39642858505249023, -0.7285714149475098, -0.5517857074737549, -0.12321428209543228, -0.07285714149475098, -0.09749999642372131, 0.0], "max": [0.47410714626312256, 0.7928571701049805, 0.6482142806053162, 0.061071429401636124, 0.11357142776250839, 0.04714285582304001, 1.0], "mean": [0.01754840463399887, 0.10789386183023453, -0.06287132203578949, -0.0037850472144782543, -0.0004055408062413335, -0.014479303732514381, 0.5327102541923523], "std": [0.1684504747390747, 0.40081867575645447, 0.3154919445514679, 0.03467259183526039, 0.03682229667901993, 0.037301335483789444, 0.49892887473106384], "count": [214]}, "timestamp": {"min": [0.0], "max": [10.65], "mean": [5.325], "std": [3.088790216249721], "count": [214]}, "frame_index": {"min": [0], "max": [213], "mean": [106.5], "std": [61.775804324994425], "count": [214]}, "episode_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [214]}, "index": {"min": [0], "max": [213], "mean": [106.5], "std": [61.775804324994425], "count": [214]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [214]}}} +{"episode_index": 1, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3325218811035156]], [[0.2682952605602788]], [[0.22977273021024816]]], "std": [[[0.15231198110631536]], [[0.14885797827475314]], [[0.15365004831575607]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3218649561264936]], [[0.2767489492378983]], [[0.2470669304342831]]], "std": [[[0.15951201677665655]], [[0.17425468926430135]], [[0.18444886141170388]]], "count": [100]}, "observation.state": {"min": [-0.15802150964736938, -0.10634807497262955, 0.44620636105537415, 2.9269096851348877, -0.8180534839630127, -0.568271279335022, 0.0019096746109426022, -0.04052641987800598], "max": [0.14902172982692719, 0.1673574447631836, 0.6833913922309875, 3.201054573059082, 0.18008582293987274, 0.5025855898857117, 0.04022381082177162, -0.002836936619132757], "mean": [0.014008739963173866, 0.03457750007510185, 0.5427497625350952, 3.0857186317443848, -0.06409859657287598, -0.23696480691432953, 0.0261041522026062, -0.025258194655179977], "std": [0.09831700474023819, 0.09625523537397385, 0.07232974469661713, 0.06950269639492035, 0.17392678558826447, 0.2387363314628601, 0.014934275299310684, 0.014975366182625294], "count": [284]}, "action": {"min": [-0.7821428775787354, -0.5383928418159485, -0.6053571701049805, -0.11785714328289032, -0.12107142806053162, -0.26678571105003357, 0.0], "max": [0.8276785612106323, 0.4928571283817291, 0.6214285492897034, 0.10178571194410324, 0.1274999976158142, 0.061071429401636124, 1.0], "mean": [0.009290115907788277, 0.021570032462477684, -0.1176873967051506, 0.0009054320980794728, -0.013343813829123974, -0.024461770430207253, 0.5457746386528015], "std": [0.37411805987358093, 0.18557117879390717, 0.28797829151153564, 0.037710461765527725, 0.05168924853205681, 0.06267670542001724, 0.49790090322494507], "count": [284]}, "timestamp": {"min": [0.0], "max": [14.15], "mean": [7.075000000000001], "std": [4.099161499624039], "count": [284]}, "frame_index": {"min": [0], "max": [283], "mean": [141.5], "std": [81.98322999248077], "count": [284]}, "episode_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [284]}, "index": {"min": [214], "max": [497], "mean": [355.5], "std": [81.98322999248077], "count": [284]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [284]}}} +{"episode_index": 2, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.508211794984107]], [[0.4707252945245481]], [[0.4204929007735907]]], "std": [[[0.3118518638959406]], [[0.2817955791408895]], [[0.2511064891672025]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5128545095406326]], [[0.4820872718960631]], [[0.43675936590456493]]], "std": [[[0.313313235790541]], [[0.28775983190963783]], [[0.26796528607825704]]], "count": [100]}, "observation.state": {"min": [-0.36914321780204773, -0.06604185700416565, 0.9666718244552612, 2.68426775932312, -2.4348578453063965, -1.6532092094421387, 0.007643902208656073, -0.03985508531332016], "max": [0.06075684726238251, 0.25884127616882324, 1.1973172426223755, 3.6714255809783936, 0.00043911903048865497, 0.539918065071106, 0.04002512991428375, -0.006704389583319426], "mean": [-0.07026331126689911, 0.09155508130788803, 1.0509607791900635, 3.0358221530914307, -1.7787443399429321, -0.909773051738739, 0.02872644178569317, -0.028101328760385513], "std": [0.10303619503974915, 0.10811779648065567, 0.06820592284202576, 0.24079002439975739, 0.6881658434867859, 0.5152576565742493, 0.014074328355491161, 0.014532673172652721], "count": [345]}, "action": {"min": [-0.9375, -0.6589285731315613, -0.8946428298950195, -0.15857142210006714, -0.21535713970661163, -0.2817857265472412, 0.0], "max": [0.8303571343421936, 0.7794643044471741, 0.8678571581840515, 0.18642857670783997, 0.13928571343421936, 0.19285714626312256, 1.0], "mean": [-0.025659937411546707, 0.15320652723312378, -0.07407607138156891, 0.010801240801811218, -0.006133538205176592, -0.0130403907969594, 0.634782612323761], "std": [0.3994355797767639, 0.3201043903827667, 0.3185036778450012, 0.07044127583503723, 0.07643746584653854, 0.10507047176361084, 0.48149165511131287], "count": [345]}, "timestamp": {"min": [0.0], "max": [17.2], "mean": [8.6], "std": [4.979625153228571], "count": [345]}, "frame_index": {"min": [0], "max": [344], "mean": [172.0], "std": [99.59250306457142], "count": [345]}, "episode_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [345]}, "index": {"min": [498], "max": [842], "mean": [670.0], "std": [99.59250306457142], "count": [345]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [345]}}} +{"episode_index": 3, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5526895859662224]], [[0.5103554029277727]], [[0.45534285302255667]]], "std": [[[0.30331440270707166]], [[0.27395441994142644]], [[0.24306091584815284]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5095302758310355]], [[0.4784742581236596]], [[0.43264258650237436]]], "std": [[[0.3101831160807947]], [[0.28365325436701794]], [[0.26273177899626765]]], "count": [100]}, "observation.state": {"min": [-0.35102808475494385, -0.0865088701248169, 0.960114598274231, 2.2245523929595947, -2.9251930713653564, -0.9065648317337036, 0.0004384478961583227, -0.04000083729624748], "max": [0.027567286044359207, 0.291602224111557, 1.2257169485092163, 3.2969298362731934, -0.0017087188316509128, -0.062170129269361496, 0.04000801593065262, -0.011357168667018414], "mean": [-0.08796253055334091, 0.08695870637893677, 1.070128321647644, 2.6780338287353516, -2.0286595821380615, -0.6305339336395264, 0.03091881424188614, -0.03477289155125618], "std": [0.10168467462062836, 0.11572626978158951, 0.06818795204162598, 0.3178502023220062, 0.8092204928398132, 0.21160057187080383, 0.015194766223430634, 0.00921166967600584], "count": [285]}, "action": {"min": [-0.9375, -0.6696428656578064, -0.5571428537368774, -0.16178570687770844, -0.09321428835391998, -0.3482142984867096, 0.0], "max": [0.9375, 0.6508928537368774, 0.8142856955528259, 0.15857142210006714, 0.14678572118282318, 0.375, 1.0], "mean": [0.03964285925030708, 0.07795111835002899, -0.025789475068449974, 0.01574435643851757, 0.011447365395724773, -0.014221785590052605, 0.75789475440979], "std": [0.39756593108177185, 0.2899089455604553, 0.27380049228668213, 0.050518713891506195, 0.051743894815444946, 0.1567799150943756, 0.4283585548400879], "count": [285]}, "timestamp": {"min": [0.0], "max": [14.2], "mean": [7.1], "std": [4.113595345517916], "count": [285]}, "frame_index": {"min": [0], "max": [284], "mean": [142.0], "std": [82.27190691035833], "count": [285]}, "episode_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [285]}, "index": {"min": [843], "max": [1127], "mean": [985.0], "std": [82.27190691035833], "count": [285]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [285]}}} +{"episode_index": 4, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34774144550398284]], [[0.28092835848939185]], [[0.2401325845157399]]], "std": [[[0.15163947018884438]], [[0.15456043894341187]], [[0.1617105576532799]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3242811069862515]], [[0.2783237759459252]], [[0.2479907501819087]]], "std": [[[0.15823802052238992]], [[0.17415159451790801]], [[0.18506586649074944]]], "count": [100]}, "observation.state": {"min": [-0.12554340064525604, -0.10721111297607422, 0.4490065574645996, 3.014122247695923, -0.18442152440547943, -0.3850529193878174, 0.0028537337202578783, -0.03986942395567894], "max": [0.14872078597545624, 0.1533234715461731, 0.6876246333122253, 3.164522171020508, 0.34071895480155945, 0.17902810871601105, 0.040175341069698334, -0.002250277204439044], "mean": [-0.017983853816986084, 0.035313498228788376, 0.5390068888664246, 3.1088366508483887, 0.09886372834444046, -0.0689634159207344, 0.025726305320858955, -0.025418596342206], "std": [0.09449697285890579, 0.07778836786746979, 0.071975938975811, 0.05149555578827858, 0.17494018375873566, 0.14197133481502533, 0.014746504835784435, 0.015026367269456387], "count": [278]}, "action": {"min": [-0.7580357193946838, -0.46071428060531616, -0.5651785731315613, -0.0771428570151329, -0.11999999731779099, -0.06321428716182709, 0.0], "max": [0.8357142806053162, 0.4124999940395355, 0.48750001192092896, 0.05892857164144516, 0.11249999701976776, 0.06857142597436905, 1.0], "mean": [0.006272467784583569, 0.03333762660622597, -0.09645746648311615, -0.001102261245250702, 0.005071943625807762, -0.004293422680348158, 0.5071942210197449], "std": [0.3712908923625946, 0.1756131947040558, 0.2724764347076416, 0.022045187652111053, 0.04900123551487923, 0.02528628520667553, 0.49994856119155884], "count": [278]}, "timestamp": {"min": [0.0], "max": [13.85], "mean": [6.925000000000001], "std": [4.012558410789804], "count": [278]}, "frame_index": {"min": [0], "max": [277], "mean": [138.5], "std": [80.25116821579608], "count": [278]}, "episode_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [278]}, "index": {"min": [1128], "max": [1405], "mean": [1266.5], "std": [80.25116821579608], "count": [278]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [278]}}} +{"episode_index": 5, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3511490239162071]], [[0.2881991230085784]], [[0.24921160529641545]]], "std": [[[0.15232925508371747]], [[0.1549183729974163]], [[0.16226206795323683]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3264551044538909]], [[0.28112749167049633]], [[0.2512730712890625]]], "std": [[[0.16104061415479456]], [[0.17686203643296838]], [[0.18773058858928585]]], "count": [100]}, "observation.state": {"min": [-0.16660922765731812, -0.13087964057922363, 0.4476267397403717, 3.0180530548095703, -0.14806216955184937, -0.3303655683994293, 0.004591521807014942, -0.039836373180150986], "max": [0.17709454894065857, 0.1407909244298935, 0.6942042708396912, 3.1988162994384766, 0.47731971740722656, 0.154855415225029, 0.04054006561636925, -0.0020219716243445873], "mean": [0.013884615153074265, 0.018979007378220558, 0.5694555044174194, 3.1208877563476562, 0.14215727150440216, -0.06477929651737213, 0.023862842470407486, -0.02310914918780327], "std": [0.11706581711769104, 0.08677519857883453, 0.06985712051391602, 0.054551806300878525, 0.2077426016330719, 0.16880694031715393, 0.015052980743348598, 0.01527231466025114], "count": [240]}, "action": {"min": [-0.5625, -0.38035714626312256, -0.543749988079071, -0.055714286863803864, -0.11464285850524902, -0.06642857193946838, 0.0], "max": [0.8705357313156128, 0.42321428656578064, 0.9026785492897034, 0.03321428596973419, 0.19178570806980133, 0.07285714149475098, 1.0], "mean": [0.06215401366353035, 0.03693080320954323, -0.06407365947961807, -0.00010267768084304407, 0.0021294623147696257, -0.005959821864962578, 0.42916667461395264], "std": [0.3871458172798157, 0.17505697906017303, 0.3555068075656891, 0.019915657117962837, 0.06228343024849892, 0.03197868913412094, 0.49495723843574524], "count": [240]}, "timestamp": {"min": [0.0], "max": [11.95], "mean": [5.975], "std": [3.4640715446807193], "count": [240]}, "frame_index": {"min": [0], "max": [239], "mean": [119.5], "std": [69.2814308936144], "count": [240]}, "episode_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [240]}, "index": {"min": [1406], "max": [1645], "mean": [1525.5], "std": [69.2814308936144], "count": [240]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [240]}}} +{"episode_index": 6, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5820916538612515]], [[0.5458878969678691]], [[0.5084218480727252]]], "std": [[[0.25937811003019806]], [[0.23808328630562983]], [[0.21646119448006398]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5378961139753753]], [[0.5031099314970129]], [[0.4545016850490196]]], "std": [[[0.30002816596477394]], [[0.2740957054084833]], [[0.254492635525879]]], "count": [100]}, "observation.state": {"min": [-0.2215377539396286, -0.06495244055986404, 0.92683345079422, 2.0181221961975098, -0.013081376440823078, -0.21756115555763245, -0.0010040868073701859, -0.040002431720495224], "max": [0.08451380580663681, 0.20359595119953156, 1.1875823736190796, 3.1948325634002686, 2.7364513874053955, 0.8200035691261292, 0.040808022022247314, -0.004378148354589939], "mean": [-0.07069294899702072, 0.07354898005723953, 1.0626498460769653, 2.681729555130005, 1.4632582664489746, 0.1810215562582016, 0.02847396768629551, -0.028605397790670395], "std": [0.11363642662763596, 0.09427767246961594, 0.08586248010396957, 0.38018617033958435, 1.0399518013000488, 0.3369940221309662, 0.014718849211931229, 0.014077807776629925], "count": [279]}, "action": {"min": [-0.4848214387893677, -0.6267856955528259, -0.7821428775787354, -0.06642857193946838, -0.1403571367263794, -0.025714285671710968, 0.0], "max": [0.7017857432365417, 0.5839285850524902, 0.8892857432365417, 0.11249999701976776, 0.14142857491970062, 0.375, 1.0], "mean": [0.052668970078229904, 0.0575844831764698, -0.10895739495754242, 0.015545311383903027, -0.009220429696142673, 0.056778036057949066, 0.6272401213645935], "std": [0.2849721610546112, 0.2630033493041992, 0.39966878294944763, 0.03561738133430481, 0.055472638458013535, 0.10314130038022995, 0.48353874683380127], "count": [279]}, "timestamp": {"min": [0.0], "max": [13.9], "mean": [6.95], "std": [4.0269922605670185], "count": [279]}, "frame_index": {"min": [0], "max": [278], "mean": [139.0], "std": [80.53984521134038], "count": [279]}, "episode_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [279]}, "index": {"min": [1646], "max": [1924], "mean": [1785.0], "std": [80.53984521134038], "count": [279]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [279]}}} +{"episode_index": 7, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32060500859279256]], [[0.26191507676068476]], [[0.2272685810163909]]], "std": [[[0.1315071427988579]], [[0.12791733166973873]], [[0.13510480274931258]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31539334345798864]], [[0.2701436145258885]], [[0.23728463505763633]]], "std": [[[0.1568585098057606]], [[0.17217274981192263]], [[0.18071167705360028]]], "count": [100]}, "observation.state": {"min": [-0.12019442766904831, -0.1103789284825325, 0.4559570550918579, 2.9820456504821777, -0.7936833500862122, -0.43270009756088257, 0.020525431260466576, -0.03995434567332268], "max": [0.0866132453083992, 0.289645254611969, 0.7293847799301147, 3.1537883281707764, 0.15785986185073853, 0.12297578155994415, 0.03989885374903679, -0.021507110446691513], "mean": [-0.00936717540025711, 0.09442605078220367, 0.6091061234474182, 3.078099250793457, -0.24912503361701965, -0.12703359127044678, 0.03185627982020378, -0.03256790712475777], "std": [0.05881471559405327, 0.13698522746562958, 0.07269317656755447, 0.04767852649092674, 0.3805089294910431, 0.13577567040920258, 0.007832244038581848, 0.007371016778051853], "count": [272]}, "action": {"min": [-0.4714285731315613, -0.6991071701049805, -0.5678571462631226, -0.06750000268220901, -0.1639285683631897, -0.21964286267757416, 0.0], "max": [0.8169642686843872, 0.8946428298950195, 0.9375, 0.0535714291036129, 0.11464285850524902, 0.21535713970661163, 1.0], "mean": [0.04139968752861023, 0.07079505175352097, -0.005918459501117468, 0.00010241579002467915, 0.002836136147379875, 0.0020325547084212303, 0.5367646813392639], "std": [0.2920547127723694, 0.38192737102508545, 0.40644240379333496, 0.016016637906432152, 0.0515349842607975, 0.07026594132184982, 0.49864670634269714], "count": [272]}, "timestamp": {"min": [0.0], "max": [13.55], "mean": [6.7749999999999995], "std": [3.9259552977587506], "count": [272]}, "frame_index": {"min": [0], "max": [271], "mean": [135.5], "std": [78.51910595517501], "count": [272]}, "episode_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [272]}, "index": {"min": [1925], "max": [2196], "mean": [2060.5], "std": [78.51910595517501], "count": [272]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [272]}}} +{"episode_index": 8, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3115691665948606]], [[0.2518085488712086]], [[0.2142805504892387]]], "std": [[[0.13978509915594514]], [[0.13011083260458922]], [[0.13363077610330362]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32069618853400733]], [[0.2732114784390319]], [[0.23849161424823836]]], "std": [[[0.16030264992558632]], [[0.17504251616380329]], [[0.18482422880250993]]], "count": [100]}, "observation.state": {"min": [-0.174160897731781, -0.17412185668945312, 0.4823952317237854, 3.049764633178711, -0.9405806660652161, -0.4233199656009674, 0.021744167432188988, -0.04057037830352783], "max": [-0.002972685033455491, 0.26732170581817627, 0.7099029421806335, 3.2301368713378906, 0.13348370790481567, 0.4318635165691376, 0.03998751565814018, -0.023937536403536797], "mean": [-0.06021801754832268, 0.050783224403858185, 0.631263256072998, 3.12768816947937, -0.4476701021194458, -0.04348025098443031, 0.03174075111746788, -0.03425701707601547], "std": [0.04544349014759064, 0.1462598443031311, 0.06986727565526962, 0.04641331359744072, 0.41465267539024353, 0.19727645814418793, 0.007678526919335127, 0.006476561538875103], "count": [259]}, "action": {"min": [-0.6160714030265808, -0.7875000238418579, -0.6857143044471741, -0.046071428805589676, -0.21535713970661163, -0.08892857283353806, 0.0], "max": [0.7741071581840515, 0.7633928656578064, 0.9375, 0.10178571194410324, 0.18321429193019867, 0.03750000149011612, 1.0], "mean": [0.044801436364650726, 0.0755067765712738, 0.021500959992408752, 0.0008314949809573591, 0.007082183845341206, -0.0199475958943367, 0.5444015264511108], "std": [0.2545265257358551, 0.39766427874565125, 0.41079163551330566, 0.026325704529881477, 0.07138937711715698, 0.03330228105187416, 0.4980241656303406], "count": [259]}, "timestamp": {"min": [0.0], "max": [12.9], "mean": [6.449999999999999], "std": [3.7383151285037486], "count": [259]}, "frame_index": {"min": [0], "max": [258], "mean": [129.0], "std": [74.76630257007497], "count": [259]}, "episode_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [259]}, "index": {"min": [2197], "max": [2455], "mean": [2326.0], "std": [74.76630257007497], "count": [259]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [259]}}} +{"episode_index": 9, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33683611701516547]], [[0.2762985175637638]], [[0.2383443920659084]]], "std": [[[0.13759790252604653]], [[0.13201947528606578]], [[0.13204814765692058]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32373445278990504]], [[0.2796016450769761]], [[0.24714689067765777]]], "std": [[[0.1660799873750791]], [[0.18247509263681294]], [[0.19154214614691256]]], "count": [100]}, "observation.state": {"min": [-0.15898951888084412, -0.11565849930047989, 0.447029173374176, 3.085110664367676, -0.777608335018158, -0.17997939884662628, 0.0215840432792902, -0.040473632514476776], "max": [0.09886468946933746, 0.2636391222476959, 0.6922624111175537, 3.293125867843628, 0.09995263069868088, 0.6438934206962585, 0.03997615724802017, -0.019990088418126106], "mean": [-0.01830211468040943, 0.05887901782989502, 0.5896260738372803, 3.1571502685546875, -0.4104798436164856, 0.1498928666114807, 0.03321497142314911, -0.03314168378710747], "std": [0.07619145512580872, 0.13153532147407532, 0.07139580696821213, 0.04936972260475159, 0.3125469386577606, 0.18203654885292053, 0.007074105087667704, 0.007741862908005714], "count": [302]}, "action": {"min": [-0.6187499761581421, -0.8491071462631226, -0.6428571343421936, -0.0535714291036129, -0.1875, -0.12642857432365417, 0.0], "max": [0.9375, 0.8223214149475098, 0.9375, 0.08785714209079742, 0.20999999344348907, 0.18000000715255737, 1.0], "mean": [0.05526548996567726, 0.06814387440681458, 0.0040533398278057575, 0.005669349804520607, 0.010682357475161552, 0.004072849173098803, 0.559602677822113], "std": [0.3472292125225067, 0.3865571618080139, 0.40894588828086853, 0.02195397950708866, 0.0565161257982254, 0.053240273147821426, 0.4964349567890167], "count": [302]}, "timestamp": {"min": [0.0], "max": [15.05], "mean": [7.525], "std": [4.358970635367942], "count": [302]}, "frame_index": {"min": [0], "max": [301], "mean": [150.5], "std": [87.17941270735884], "count": [302]}, "episode_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [302]}, "index": {"min": [2456], "max": [2757], "mean": [2606.5], "std": [87.17941270735884], "count": [302]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [302]}}} +{"episode_index": 10, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5866809955671722]], [[0.539048651601754]], [[0.4889245892693015]]], "std": [[[0.28435184670351943]], [[0.2579211031248883]], [[0.2284864302021537]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5656239276960784]], [[0.5270688261144302]], [[0.4768755062327666]]], "std": [[[0.29701049687876857]], [[0.27345808471669286]], [[0.2554988758745536]]], "count": [100]}, "observation.state": {"min": [-0.19666120409965515, -0.32248756289482117, 1.0042972564697266, 2.114318609237671, -3.143341541290283, -0.8238800764083862, 0.001563697587698698, -0.04016966000199318], "max": [0.057102542370557785, 0.18641698360443115, 1.213500738143921, 3.1393754482269287, -0.0002635986602399498, -0.0794435515999794, 0.04000963270664215, -0.00643542455509305], "mean": [-0.021479571238160133, -0.05988782271742821, 1.1016260385513306, 2.566495418548584, -2.250626564025879, -0.4802166819572449, 0.023977005854249, -0.024923531338572502], "std": [0.05266956984996796, 0.1596270054578781, 0.060406945645809174, 0.3291328549385071, 0.8111451864242554, 0.1647556722164154, 0.016145505011081696, 0.015515291132032871], "count": [383]}, "action": {"min": [-0.34017857909202576, -0.84375, -0.5089285969734192, -0.1039285734295845, -0.10178571194410324, -0.3385714292526245, 0.0], "max": [0.65625, 0.8517857193946838, 0.65625, 0.14892856776714325, 0.10178571194410324, 0.15857142210006714, 1.0], "mean": [0.04933324456214905, -0.03744405135512352, -0.04195496812462807, 0.005396312102675438, 0.011371692642569542, -0.012717261910438538, 0.5352480411529541], "std": [0.2319621592760086, 0.38736313581466675, 0.291957288980484, 0.05016912892460823, 0.035542797297239304, 0.1071830540895462, 0.49875688552856445], "count": [383]}, "timestamp": {"min": [0.0], "max": [19.1], "mean": [9.549999999999999], "std": [5.528109984434101], "count": [383]}, "frame_index": {"min": [0], "max": [382], "mean": [191.0], "std": [110.56219968868203], "count": [383]}, "episode_index": {"min": [10], "max": [10], "mean": [10.0], "std": [0.0], "count": [383]}, "index": {"min": [2758], "max": [3140], "mean": [2949.0], "std": [110.56219968868203], "count": [383]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [383]}}} +{"episode_index": 11, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3524881262685738]], [[0.2910814388499541]], [[0.25373648968864887]]], "std": [[[0.14752689350781528]], [[0.1537232307494378]], [[0.16428926156188417]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.324443702248966]], [[0.2786840598910463]], [[0.2486414962469363]]], "std": [[[0.1599834257667138]], [[0.17549200026730563]], [[0.18613718807416202]]], "count": [100]}, "observation.state": {"min": [-0.1504770964384079, -0.12306290864944458, 0.4466995596885681, 3.026747703552246, -0.2138388603925705, -0.38699546456336975, 0.002596221398562193, -0.03987450152635574], "max": [0.15237905085086823, 0.11838613450527191, 0.6661331653594971, 3.151386022567749, 0.33453065156936646, 0.26390132308006287, 0.039782483130693436, -0.00290522794239223], "mean": [-0.0007986148702912033, 0.01127260085195303, 0.5518521070480347, 3.0860867500305176, 0.04206836223602295, -0.037090253084897995, 0.023109624162316322, -0.023219777271151543], "std": [0.10153747349977493, 0.08137567341327667, 0.06688526272773743, 0.03811861574649811, 0.17266599833965302, 0.1868191361427307, 0.015809180215001106, 0.015808289870619774], "count": [218]}, "action": {"min": [-0.65625, -0.5249999761581421, -0.5357142686843872, -0.024642856791615486, -0.1510714292526245, -0.07500000298023224, 0.0], "max": [0.8892857432365417, 0.49017858505249023, 0.5678571462631226, 0.035357143729925156, 0.11464285850524902, 0.046071428805589676, 1.0], "mean": [0.05038909241557121, 0.02667512372136116, -0.09716576337814331, -0.0011844695545732975, -0.005076998844742775, -0.00453637121245265, 0.4403669834136963], "std": [0.407520592212677, 0.19470342993736267, 0.2909305989742279, 0.009092111140489578, 0.05842391774058342, 0.02774302288889885, 0.496431827545166], "count": [218]}, "timestamp": {"min": [0.0], "max": [10.85], "mean": [5.425000000000001], "std": [3.1465258619626826], "count": [218]}, "frame_index": {"min": [0], "max": [217], "mean": [108.5], "std": [62.930517239253646], "count": [218]}, "episode_index": {"min": [11], "max": [11], "mean": [11.0], "std": [0.0], "count": [218]}, "index": {"min": [3141], "max": [3358], "mean": [3249.5], "std": [62.930517239253646], "count": [218]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [218]}}} +{"episode_index": 12, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34100309603822]], [[0.2716911561255362]], [[0.22562884521484375]]], "std": [[[0.16083982656679238]], [[0.15457683839398853]], [[0.15011494936489866]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3290581611184513]], [[0.2851671932444853]], [[0.2522725656546798]]], "std": [[[0.16949509534250293]], [[0.18476405951157177]], [[0.19454245734598327]]], "count": [100]}, "observation.state": {"min": [-0.0551072359085083, -0.23254013061523438, 0.44610336422920227, 3.032668113708496, -0.5166447162628174, -0.4995611011981964, 0.007926201447844505, -0.04025617986917496], "max": [0.14735017716884613, 0.26891523599624634, 0.6932153701782227, 3.1767776012420654, 0.0026892381720244884, 0.14302101731300354, 0.04009589925408363, -0.007894085720181465], "mean": [0.05891239270567894, 0.041948333382606506, 0.5843452215194702, 3.1279256343841553, -0.2617754340171814, -0.1513516902923584, 0.029245777055621147, -0.029264584183692932], "std": [0.05811131000518799, 0.14967288076877594, 0.08300860971212387, 0.03672940284013748, 0.12257832288742065, 0.2045293152332306, 0.009678666479885578, 0.009712031111121178], "count": [279]}, "action": {"min": [-0.65625, -0.9053571224212646, -0.8035714030265808, -0.11142857372760773, -0.10499999672174454, -0.1639285683631897, 0.0], "max": [0.8544642925262451, 0.8758928775787354, 0.9375, 0.1007142886519432, 0.15857142210006714, 0.07821428775787354, 1.0], "mean": [0.0013537041377276182, 0.07761135697364807, -0.04374039173126221, -0.003966973628848791, 0.008022275753319263, -0.0037595999892801046, 0.519713282585144], "std": [0.2918049693107605, 0.42814451456069946, 0.4456084966659546, 0.030038531869649887, 0.04205760732293129, 0.04196209833025932, 0.49961134791374207], "count": [279]}, "timestamp": {"min": [0.0], "max": [13.9], "mean": [6.95], "std": [4.0269922605670185], "count": [279]}, "frame_index": {"min": [0], "max": [278], "mean": [139.0], "std": [80.53984521134038], "count": [279]}, "episode_index": {"min": [12], "max": [12], "mean": [12.0], "std": [0.0], "count": [279]}, "index": {"min": [3359], "max": [3637], "mean": [3498.0], "std": [80.53984521134038], "count": [279]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [279]}}} +{"episode_index": 13, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3264161550484452]], [[0.27155924539005055]], [[0.23516551477768843]]], "std": [[[0.15949501155261744]], [[0.15908485609957404]], [[0.16593832363416963]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31752707926432294]], [[0.27084597179936426]], [[0.23631336466471356]]], "std": [[[0.1567425491555617]], [[0.17098259166192892]], [[0.18068588305751584]]], "count": [100]}, "observation.state": {"min": [-0.1320861577987671, -0.1756604015827179, 0.481399267911911, 2.876291036605835, -0.4328324794769287, -0.24473576247692108, 0.02733658067882061, -0.03997613117098808], "max": [-0.009662074968218803, 0.3072294592857361, 0.7187600135803223, 3.157628297805786, 0.002010042080655694, 0.019151978194713593, 0.039872463792562485, -0.027530470862984657], "mean": [-0.06622394919395447, 0.07475107163190842, 0.6120576858520508, 3.065511703491211, -0.17772410809993744, -0.07876165956258774, 0.03377452492713928, -0.03554001823067665], "std": [0.03075345791876316, 0.15965703129768372, 0.06487486511468887, 0.07141246646642685, 0.1415976732969284, 0.07826424390077591, 0.004918184131383896, 0.003828716231510043], "count": [285]}, "action": {"min": [-0.35357141494750977, -0.8276785612106323, -0.6616071462631226, -0.11357142776250839, -0.09000000357627869, -0.06750000268220901, 0.0], "max": [0.5142857432365417, 0.824999988079071, 0.9375, 0.06750000268220901, 0.11892857402563095, 0.0835714265704155, 1.0], "mean": [0.008937970735132694, 0.06118420884013176, -0.012669176794588566, -0.0006315794307738543, 0.00220300629734993, -0.008195486851036549, 0.4877192974090576], "std": [0.16237637400627136, 0.3951215445995331, 0.3908731937408447, 0.034147873520851135, 0.036804310977458954, 0.027107076719403267, 0.4998486340045929], "count": [285]}, "timestamp": {"min": [0.0], "max": [14.2], "mean": [7.1], "std": [4.113595345517916], "count": [285]}, "frame_index": {"min": [0], "max": [284], "mean": [142.0], "std": [82.27190691035833], "count": [285]}, "episode_index": {"min": [13], "max": [13], "mean": [13.0], "std": [0.0], "count": [285]}, "index": {"min": [3638], "max": [3922], "mean": [3780.0], "std": [82.27190691035833], "count": [285]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [285]}}} +{"episode_index": 14, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6046058505189185]], [[0.5550930504892386]], [[0.5004587390376072]]], "std": [[[0.2771139261811805]], [[0.2619616836307318]], [[0.240595267390995]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5491439765481388]], [[0.5091325899011948]], [[0.4589769233254825]]], "std": [[[0.29997925809106596]], [[0.27899171881272805]], [[0.26440657385942407]]], "count": [100]}, "observation.state": {"min": [-0.20520968735218048, -0.09236957132816315, 0.9108186960220337, 2.4097185134887695, -2.075411796569824, -0.8252512216567993, 0.0014699307503178716, -0.03986736387014389], "max": [0.037141501903533936, 0.18999609351158142, 1.1848585605621338, 3.141252279281616, 0.0033362100366503, 0.27582767605781555, 0.040764838457107544, -0.0032798312604427338], "mean": [-0.03184109181165695, 0.022913943976163864, 1.017539143562317, 2.7309484481811523, -1.6689702272415161, -0.14844883978366852, 0.02896512672305107, -0.02896086312830448], "std": [0.06123591959476471, 0.09330562502145767, 0.09488217532634735, 0.22830061614513397, 0.5995411276817322, 0.3303917944431305, 0.016039330512285233, 0.015725748613476753], "count": [257]}, "action": {"min": [-0.44732141494750977, -0.731249988079071, -0.6187499761581421, -0.09000000357627869, -0.14571428298950195, -0.335357129573822, 0.0], "max": [0.675000011920929, 0.7794643044471741, 0.6348214149475098, 0.14892856776714325, 0.17142857611179352, 0.16821429133415222, 1.0], "mean": [0.06281613558530807, 0.1588069498538971, -0.09676210582256317, 0.016450803726911545, 0.005315451417118311, -0.03452334925532341, 0.7081711888313293], "std": [0.20406711101531982, 0.40386563539505005, 0.29236599802970886, 0.0445857010781765, 0.06078274920582771, 0.10522469133138657, 0.4546036720275879], "count": [257]}, "timestamp": {"min": [0.0], "max": [12.8], "mean": [6.399999999999999], "std": [3.7094473981982814], "count": [257]}, "frame_index": {"min": [0], "max": [256], "mean": [128.0], "std": [74.18894796396563], "count": [257]}, "episode_index": {"min": [14], "max": [14], "mean": [14.0], "std": [0.0], "count": [257]}, "index": {"min": [3923], "max": [4179], "mean": [4051.0], "std": [74.18894796396563], "count": [257]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [257]}}} +{"episode_index": 15, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.607676145067402]], [[0.5587847068637025]], [[0.5057926420323988]]], "std": [[[0.26824445125683943]], [[0.25634387376503404]], [[0.23643659121763155]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5487085810642617]], [[0.5086787761613434]], [[0.45840276022518384]]], "std": [[[0.29979240288201775]], [[0.27871125899780486]], [[0.2641060434959442]]], "count": [100]}, "observation.state": {"min": [-0.2026691883802414, -0.09094663709402084, 0.9141412973403931, 2.3370442390441895, -2.5512921810150146, -1.05509614944458, 0.0036872492637485266, -0.03986762464046478], "max": [0.03891029581427574, 0.20669640600681305, 1.1726830005645752, 3.14046049118042, -0.00022521553910337389, 0.23877376317977905, 0.04026978835463524, -0.003878568997606635], "mean": [-0.023860163986682892, 0.03945581242442131, 1.0048480033874512, 2.6408791542053223, -1.7651323080062866, -0.0896686315536499, 0.029415199533104897, -0.029472487047314644], "std": [0.0590217225253582, 0.0943458154797554, 0.08482316136360168, 0.22632825374603271, 0.6441861987113953, 0.29140758514404297, 0.015623020008206367, 0.015474794432520866], "count": [242]}, "action": {"min": [-0.4553571343421936, -0.5919643044471741, -0.6964285969734192, -0.06428571790456772, -0.10499999672174454, -0.24964286386966705, 0.0], "max": [0.5919643044471741, 0.8758928775787354, 0.5491071343421936, 0.26571428775787354, 0.12535713613033295, 0.03642857074737549, 1.0], "mean": [0.07940525561571121, 0.18198786675930023, -0.09293094277381897, 0.03172668442130089, -0.0035463396925479174, -0.05710449442267418, 0.7148760557174683], "std": [0.23559416830539703, 0.4162912964820862, 0.3231109082698822, 0.07608458399772644, 0.04421711713075638, 0.07336658984422684, 0.45147302746772766], "count": [242]}, "timestamp": {"min": [0.0], "max": [12.05], "mean": [6.0249999999999995], "std": [3.4929393066585055], "count": [242]}, "frame_index": {"min": [0], "max": [241], "mean": [120.5], "std": [69.85878613317011], "count": [242]}, "episode_index": {"min": [15], "max": [15], "mean": [15.0], "std": [0.0], "count": [242]}, "index": {"min": [4180], "max": [4421], "mean": [4300.5], "std": [69.85878613317011], "count": [242]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [242]}}} +{"episode_index": 16, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6103905633664598]], [[0.5663222560508578]], [[0.5149134796740963]]], "std": [[[0.2670832968617002]], [[0.24838188842814088]], [[0.2265630050452448]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5509659519569546]], [[0.5111252124262792]], [[0.4608009410184972]]], "std": [[[0.3011218593253065]], [[0.27981405907325546]], [[0.26532046097549417]]], "count": [100]}, "observation.state": {"min": [-0.21250347793102264, -0.0714905858039856, 0.9276306629180908, 2.0706517696380615, -2.145303726196289, -1.3148890733718872, 0.002507230266928673, -0.04021727293729782], "max": [0.0431891605257988, 0.2046000212430954, 1.1707937717437744, 3.1400346755981445, 0.00015349056047853082, 0.586805522441864, 0.04074406996369362, -0.0016173799522221088], "mean": [-0.025541001930832863, 0.037626877427101135, 1.0289934873580933, 2.653860569000244, -1.621010184288025, -0.0593797042965889, 0.027935784310102463, -0.027672940865159035], "std": [0.057903219014406204, 0.09147994965314865, 0.07844860851764679, 0.361930787563324, 0.6015196442604065, 0.5843123197555542, 0.01650109887123108, 0.016706500202417374], "count": [248]}, "action": {"min": [-0.5892857313156128, -0.6133928298950195, -0.8008928298950195, -0.046071428805589676, -0.29892855882644653, -0.301071435213089, 0.0], "max": [0.6964285969734192, 0.7741071581840515, 0.9375, 0.12321428209543228, 0.26249998807907104, 0.035357143729925156, 1.0], "mean": [0.003283402416855097, 0.14517207443714142, -0.13642355799674988, 0.027559038251638412, 0.012874425388872623, -0.05388679727911949, 0.6814516186714172], "std": [0.3094264268875122, 0.3615501821041107, 0.3778267204761505, 0.0374968945980072, 0.11018484085798264, 0.07908248901367188, 0.46591389179229736], "count": [248]}, "timestamp": {"min": [0.0], "max": [12.35], "mean": [6.175], "std": [3.579542568541405], "count": [248]}, "frame_index": {"min": [0], "max": [247], "mean": [123.5], "std": [71.5908513708281], "count": [248]}, "episode_index": {"min": [16], "max": [16], "mean": [16.0], "std": [0.0], "count": [248]}, "index": {"min": [4422], "max": [4669], "mean": [4545.5], "std": [71.5908513708281], "count": [248]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [248]}}} +{"episode_index": 17, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.38360145598766854]], [[0.31703264602960324]], [[0.26972645479090074]]], "std": [[[0.1753795056368454]], [[0.1728714604851204]], [[0.1639912308947464]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33227505792356005]], [[0.28693636007869944]], [[0.2536764454561121]]], "std": [[[0.17906832314522275]], [[0.1946633831832477]], [[0.20488541311106137]]], "count": [100]}, "observation.state": {"min": [-0.05770139768719673, -0.2290247231721878, 0.44834768772125244, 2.979017496109009, -0.26920393109321594, -0.1535254269838333, 0.01700134202837944, -0.039897143840789795], "max": [0.13300549983978271, 0.3066660165786743, 0.7091872096061707, 3.2291319370269775, 0.41308629512786865, 0.9885894656181335, 0.03984580188989639, -0.0192964319139719], "mean": [0.020479628816246986, 0.046709753572940826, 0.594903826713562, 3.1177122592926025, 0.06945257633924484, 0.2436864972114563, 0.028160175308585167, -0.030074546113610268], "std": [0.05482200160622597, 0.17352434992790222, 0.07391496002674103, 0.06914577633142471, 0.18785473704338074, 0.38040927052497864, 0.0097095537930727, 0.008654456585645676], "count": [249]}, "action": {"min": [-0.5249999761581421, -0.8223214149475098, -0.8678571581840515, -0.13500000536441803, -0.18321429193019867, -0.10178571194410324, 0.0], "max": [0.7017857432365417, 0.8758928775787354, 0.9375, 0.07285714149475098, 0.2207142859697342, 0.15964286029338837, 1.0], "mean": [0.060144148766994476, 0.12337563186883926, 0.015608846209943295, -0.005055938847362995, 0.010628226213157177, 0.0013037872267886996, 0.5020080208778381], "std": [0.29043135046958923, 0.49121394753456116, 0.4775540232658386, 0.03764903545379639, 0.08754172921180725, 0.04334181919693947, 0.4999959468841553], "count": [249]}, "timestamp": {"min": [0.0], "max": [12.4], "mean": [6.2], "std": [3.593976442141304], "count": [249]}, "frame_index": {"min": [0], "max": [248], "mean": [124.0], "std": [71.87952884282609], "count": [249]}, "episode_index": {"min": [17], "max": [17], "mean": [17.0], "std": [0.0], "count": [249]}, "index": {"min": [4670], "max": [4918], "mean": [4794.0], "std": [71.87952884282609], "count": [249]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [249]}}} +{"episode_index": 18, "stats": {"observation.images.wrist_image": {"min": [[[0.00784313725490196]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3617419876397825]], [[0.2986750811408548]], [[0.25614690803079043]]], "std": [[[0.15107789243822675]], [[0.15683514348323246]], [[0.16515944601845925]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31154848884133735]], [[0.26172754923502606]], [[0.227836005117379]]], "std": [[[0.1486803027342154]], [[0.16160635219030442]], [[0.1695601638979469]]], "count": [100]}, "observation.state": {"min": [-0.15390154719352722, -0.302482545375824, 0.5072795152664185, 2.952803134918213, -0.5507981181144714, -0.22997665405273438, 0.0033452955540269613, -0.03985368832945824], "max": [0.014479834586381912, 0.3575793504714966, 0.6727398037910461, 3.183175563812256, 0.5532277822494507, 0.34556323289871216, 0.04014985263347626, -0.003822675906121731], "mean": [-0.039566587656736374, -0.04997260868549347, 0.5826029181480408, 3.1101317405700684, 0.15879887342453003, 0.02331148460507393, 0.022218214347958565, -0.02212517149746418], "std": [0.045658908784389496, 0.22250141203403473, 0.047962721437215805, 0.05935923382639885, 0.265792578458786, 0.1427728533744812, 0.016822317615151405, 0.016642911359667778], "count": [276]}, "action": {"min": [-0.4714285731315613, -0.6294642686843872, -0.5410714149475098, -0.08785714209079742, -0.20035713911056519, -0.09535714238882065, 0.0], "max": [0.6187499761581421, 0.8169642686843872, 0.7205356955528259, 0.061071429401636124, 0.13178572058677673, 0.13607142865657806, 1.0], "mean": [0.018264759331941605, 0.09922358393669128, -0.03721856325864792, -0.0022282612044364214, -0.004883541259914637, -0.009627332910895348, 0.5072463750839233], "std": [0.20443765819072723, 0.3699893653392792, 0.3118704557418823, 0.028436841443181038, 0.051356054842472076, 0.04773484542965889, 0.49994713068008423], "count": [276]}, "timestamp": {"min": [0.0], "max": [13.75], "mean": [6.875], "std": [3.983690709212585], "count": [276]}, "frame_index": {"min": [0], "max": [275], "mean": [137.5], "std": [79.6738141842517], "count": [276]}, "episode_index": {"min": [18], "max": [18], "mean": [18.0], "std": [0.0], "count": [276]}, "index": {"min": [4919], "max": [5194], "mean": [5056.5], "std": [79.6738141842517], "count": [276]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [276]}}} +{"episode_index": 19, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34647606045592066]], [[0.28314042214786306]], [[0.24412727864583333]]], "std": [[[0.15724041651440807]], [[0.15890743839880433]], [[0.16499093065786902]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3205449146943934]], [[0.2739941884957108]], [[0.24349406463024664]]], "std": [[[0.1551133369680245]], [[0.17038598026296203]], [[0.18095437406435197]]], "count": [100]}, "observation.state": {"min": [-0.1317390650510788, -0.14533734321594238, 0.4469663202762604, 2.8883659839630127, -0.6422246694564819, -0.3146808445453644, 0.0013511814177036285, -0.03985641896724701], "max": [0.11397401988506317, 0.1253204494714737, 0.6852951645851135, 3.1697418689727783, 0.8415576219558716, 0.08914903551340103, 0.04057462513446808, -0.002960139187052846], "mean": [-0.003665377851575613, 0.006353339180350304, 0.5640525817871094, 3.0718328952789307, 0.14499233663082123, -0.07370373606681824, 0.02079770714044571, -0.020771903917193413], "std": [0.08170374482870102, 0.0948648676276207, 0.0715552344918251, 0.08813382685184479, 0.4374549090862274, 0.09779138118028641, 0.016930144280195236, 0.0166179109364748], "count": [249]}, "action": {"min": [-0.48750001192092896, -0.4928571283817291, -0.6696428656578064, -0.06964285671710968, -0.09749999642372131, -0.12214285880327225, 0.0], "max": [0.6535714268684387, 0.35357141494750977, 0.4821428656578064, 0.07071428745985031, 0.09642857313156128, 0.10928571224212646, 1.0], "mean": [0.030991826206445694, 0.033745694905519485, -0.0925559401512146, -0.0007745270850136876, -9.466474148212001e-05, -0.014814970083534718, 0.4337349534034729], "std": [0.3106810748577118, 0.19673947989940643, 0.2737317681312561, 0.026153555139899254, 0.033928170800209045, 0.06378957629203796, 0.4955891966819763], "count": [249]}, "timestamp": {"min": [0.0], "max": [12.4], "mean": [6.2], "std": [3.593976442141304], "count": [249]}, "frame_index": {"min": [0], "max": [248], "mean": [124.0], "std": [71.87952884282609], "count": [249]}, "episode_index": {"min": [19], "max": [19], "mean": [19.0], "std": [0.0], "count": [249]}, "index": {"min": [5195], "max": [5443], "mean": [5319.0], "std": [71.87952884282609], "count": [249]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [249]}}} +{"episode_index": 20, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5834081606397442]], [[0.5342037658691406]], [[0.4852003879921109]]], "std": [[[0.2847952491812787]], [[0.2584492705396471]], [[0.22868040454778515]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5659450934914982]], [[0.5273478178136489]], [[0.4769040126426547]]], "std": [[[0.2931054429064549]], [[0.26917290339005606]], [[0.25068118569706505]]], "count": [100]}, "observation.state": {"min": [-0.20057930052280426, -0.28530240058898926, 1.0025529861450195, 2.216514825820923, -2.6805222034454346, -1.1564607620239258, 0.0006424529710784554, -0.04023192450404167], "max": [0.043628182262182236, 0.20783892273902893, 1.2109957933425903, 3.1428284645080566, 0.00016835126734804362, -0.07102479040622711, 0.040003519505262375, -0.00830506719648838], "mean": [-0.03228276968002319, -0.034283947199583054, 1.0995428562164307, 2.537412405014038, -2.066786766052246, -0.488760769367218, 0.025965722277760506, -0.028935307636857033], "std": [0.05629850551486015, 0.14830081164836884, 0.06251425296068192, 0.2880142331123352, 0.6716833114624023, 0.2700788080692291, 0.016163142397999763, 0.013387337327003479], "count": [359]}, "action": {"min": [-0.4526785612106323, -0.7848214507102966, -0.4258928596973419, -0.01607142947614193, -0.09107142686843872, -0.3375000059604645, 0.0], "max": [0.6053571701049805, 0.8116071224212646, 0.6294642686843872, 0.10285714268684387, 0.1039285734295845, 0.1071428582072258, 1.0], "mean": [0.04311828315258026, -0.029307620599865913, -0.036850884556770325, 0.016936928033828735, 0.0035336315631866455, -0.027895919978618622, 0.5988857746124268], "std": [0.22033388912677765, 0.39739835262298584, 0.29526740312576294, 0.028362665325403214, 0.040715765208005905, 0.09987975656986237, 0.4901244044303894], "count": [359]}, "timestamp": {"min": [0.0], "max": [17.9], "mean": [8.950000000000001], "std": [5.181698563212646], "count": [359]}, "frame_index": {"min": [0], "max": [358], "mean": [179.0], "std": [103.63397126425292], "count": [359]}, "episode_index": {"min": [20], "max": [20], "mean": [20.0], "std": [0.0], "count": [359]}, "index": {"min": [5444], "max": [5802], "mean": [5623.0], "std": [103.63397126425292], "count": [359]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [359]}}} +{"episode_index": 21, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.37029323802274816]], [[0.30642133166743263]], [[0.2667040692497702]]], "std": [[[0.15620815208453254]], [[0.16581165568844347]], [[0.17674036716644417]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3299216751397825]], [[0.28417581176757817]], [[0.25396118762446385]]], "std": [[[0.16915058572606106]], [[0.18534271178992473]], [[0.19629226628515556]]], "count": [100]}, "observation.state": {"min": [-0.12237849086523056, -0.11069102585315704, 0.44879603385925293, 3.0124495029449463, -0.2729043960571289, -0.20743045210838318, 0.0025139942299574614, -0.03986630588769913], "max": [0.15708333253860474, 0.1489902287721634, 0.6839844584465027, 3.2193875312805176, 0.3426057994365692, 0.3884865939617157, 0.039929211139678955, -0.0026088999584317207], "mean": [0.005076412111520767, 0.011739588342607021, 0.5458745956420898, 3.117990016937256, 0.08373192697763443, 0.16532497107982635, 0.02273622155189514, -0.022108834236860275], "std": [0.0955987349152565, 0.07904966920614243, 0.06365101039409637, 0.04614913463592529, 0.1684390753507614, 0.174137681722641, 0.016229504719376564, 0.01633867248892784], "count": [264]}, "action": {"min": [-0.6160714030265808, -0.5705357193946838, -0.5678571462631226, -0.0503571443259716, -0.1703571379184723, -0.04928571358323097, 0.0], "max": [0.8330357074737549, 0.2946428656578064, 0.4955357015132904, 0.05892857164144516, 0.1607142835855484, 0.07071428745985031, 1.0], "mean": [0.06702514737844467, 0.03300527483224869, -0.06244925409555435, -0.0004667200264520943, -0.0007792211254127324, -0.006278407759964466, 0.4318181872367859], "std": [0.37895047664642334, 0.16807684302330017, 0.28070971369743347, 0.01711629517376423, 0.07203643769025803, 0.02502022683620453, 0.49532896280288696], "count": [264]}, "timestamp": {"min": [0.0], "max": [13.15], "mean": [6.575000000000001], "std": [3.810484439892999], "count": [264]}, "frame_index": {"min": [0], "max": [263], "mean": [131.5], "std": [76.20968879786], "count": [264]}, "episode_index": {"min": [21], "max": [21], "mean": [21.0], "std": [0.0], "count": [264]}, "index": {"min": [5803], "max": [6066], "mean": [5934.5], "std": [76.20968879786], "count": [264]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [264]}}} +{"episode_index": 22, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3552239750880821]], [[0.29204690013212314]], [[0.2497416010837929]]], "std": [[[0.15030020635776445]], [[0.15446818778849047]], [[0.1626537440668536]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31063541068282785]], [[0.26106201112036614]], [[0.22735541908413756]]], "std": [[[0.14666833431147885]], [[0.15955102789337475]], [[0.16781598436449882]]], "count": [100]}, "observation.state": {"min": [-0.1546212136745453, -0.3106688857078552, 0.506780743598938, 2.991600275039673, -0.4207790493965149, -0.28727561235427856, 0.004332894925028086, -0.03989724442362785], "max": [0.004527525044977665, 0.3483603596687317, 0.6668327450752258, 3.233468532562256, 0.5477176904678345, 0.26493021845817566, 0.039974942803382874, -0.002097073011100292], "mean": [-0.05442022159695625, -0.05245430767536163, 0.5656877160072327, 3.1107733249664307, 0.2910383343696594, -0.06945651024580002, 0.021648524329066277, -0.02093483693897724], "std": [0.04257884621620178, 0.21765007078647614, 0.04156608134508133, 0.05176209658384323, 0.30016183853149414, 0.14220300316810608, 0.016183098778128624, 0.016489185392856598], "count": [263]}, "action": {"min": [-0.5678571462631226, -0.65625, -0.6053571701049805, -0.0535714291036129, -0.07928571105003357, -0.12428571283817291, 0.0], "max": [0.65625, 0.8491071462631226, 0.7205356955528259, 0.07285714149475098, 0.12214285880327225, 0.12107142806053162, 1.0], "mean": [0.03333444893360138, 0.09144823998212814, -0.047572650015354156, 0.0010429115500301123, 0.010608366690576077, -0.0100869070738554, 0.463878333568573], "std": [0.23662972450256348, 0.39473894238471985, 0.3231908977031708, 0.023278966546058655, 0.04476655274629593, 0.04887179285287857, 0.4986934959888458], "count": [263]}, "timestamp": {"min": [0.0], "max": [13.1], "mean": [6.550000000000001], "std": [3.7960505792204615], "count": [263]}, "frame_index": {"min": [0], "max": [262], "mean": [131.0], "std": [75.92101158440923], "count": [263]}, "episode_index": {"min": [22], "max": [22], "mean": [22.0], "std": [0.0], "count": [263]}, "index": {"min": [6067], "max": [6329], "mean": [6198.0], "std": [75.92101158440923], "count": [263]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [263]}}} +{"episode_index": 23, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5681199125402113]], [[0.5238811747233073]], [[0.47612989717371323]]], "std": [[[0.288038078438278]], [[0.26126884586355686]], [[0.2329595586364234]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5722932888853784]], [[0.5348137709673713]], [[0.48511308976715684]]], "std": [[[0.29599831159915224]], [[0.27308869176111006]], [[0.25629163703252794]]], "count": [100]}, "observation.state": {"min": [-0.19755516946315765, -0.257276326417923, 1.0188900232315063, 1.7304260730743408, -3.621211290359497, -1.2405074834823608, 0.002580432454124093, -0.04036480188369751], "max": [0.11606404930353165, 0.23216228187084198, 1.2154388427734375, 3.2956652641296387, -0.002152508357539773, -0.0675911009311676, 0.040010031312704086, -0.002904054941609502], "mean": [-0.0063167461194098, -0.03126755729317665, 1.1205949783325195, 2.761066436767578, -1.989078164100647, -0.8199900388717651, 0.028200039640069008, -0.028736433014273643], "std": [0.0708874762058258, 0.12520799040794373, 0.059107519686222076, 0.30799180269241333, 0.670276939868927, 0.2675044536590576, 0.012311696074903011, 0.012361109256744385], "count": [455]}, "action": {"min": [-0.5276785492897034, -0.7419642806053162, -0.5651785731315613, -0.0535714291036129, -0.14785714447498322, -0.24535714089870453, 0.0], "max": [0.5116071701049805, 0.8008928298950195, 0.48750001192092896, 0.08571428805589676, 0.19607143104076385, 0.15321429073810577, 1.0], "mean": [-0.038100481033325195, 0.006251953076571226, -0.048196613788604736, 0.004078493919223547, -0.014180535450577736, -0.05464993044734001, 0.5274725556373596], "std": [0.2306264042854309, 0.3028816878795624, 0.22779233753681183, 0.02752763032913208, 0.05281536281108856, 0.09787724167108536, 0.49924513697624207], "count": [455]}, "timestamp": {"min": [0.0], "max": [22.7], "mean": [11.35], "std": [6.567343450741708], "count": [455]}, "frame_index": {"min": [0], "max": [454], "mean": [227.0], "std": [131.34686901483414], "count": [455]}, "episode_index": {"min": [23], "max": [23], "mean": [23.0], "std": [0.0], "count": [455]}, "index": {"min": [6330], "max": [6784], "mean": [6557.0], "std": [131.34686901483414], "count": [455]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [455]}}} +{"episode_index": 24, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33296534519569543]], [[0.2631363429649204]], [[0.22018137195063572]]], "std": [[[0.13840788435396803]], [[0.13264430251794185]], [[0.13796887381924453]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3294747140921799]], [[0.28534154974245557]], [[0.25250112017463233]]], "std": [[[0.16864685427293125]], [[0.18390428163854536]], [[0.1937891694133795]]], "count": [100]}, "observation.state": {"min": [-0.06202166527509689, -0.2074621170759201, 0.4484417736530304, 3.069031000137329, -0.5686227679252625, -0.2857235074043274, 0.01949973963201046, -0.039876122027635574], "max": [0.12713241577148438, 0.25527164340019226, 0.7061729431152344, 3.2240943908691406, -0.0014111960772424936, 0.08850052952766418, 0.03990935906767845, -0.019186677411198616], "mean": [0.05308970436453819, 0.025589805096387863, 0.5982007384300232, 3.1349151134490967, -0.2874595820903778, -0.0847788006067276, 0.029140427708625793, -0.030376162379980087], "std": [0.050411831587553024, 0.15736229717731476, 0.07617156207561493, 0.035070113837718964, 0.12619450688362122, 0.09556721895933151, 0.009305675514042377, 0.008678218349814415], "count": [241]}, "action": {"min": [-0.6428571343421936, -0.7285714149475098, -0.8276785612106323, -0.14142857491970062, -0.09642857313156128, -0.16178570687770844, 0.0], "max": [0.7151785492897034, 0.8866071701049805, 0.9375, 0.07607142627239227, 0.12535713613033295, 0.12214285880327225, 1.0], "mean": [-0.0053460258059203625, 0.09246072173118591, -0.05340472236275673, -0.0007468876428902149, -0.0009558387100696564, 0.003045347286388278, 0.5186722278594971], "std": [0.2984790503978729, 0.44449836015701294, 0.47801294922828674, 0.031670987606048584, 0.03488995507359505, 0.05038760229945183, 0.4996512532234192], "count": [241]}, "timestamp": {"min": [0.0], "max": [12.0], "mean": [6.0], "std": [3.4785054261852175], "count": [241]}, "frame_index": {"min": [0], "max": [240], "mean": [120.0], "std": [69.57010852370435], "count": [241]}, "episode_index": {"min": [24], "max": [24], "mean": [24.0], "std": [0.0], "count": [241]}, "index": {"min": [6785], "max": [7025], "mean": [6905.0], "std": [69.57010852370435], "count": [241]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [241]}}} +{"episode_index": 25, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3249881759344363]], [[0.273019250607958]], [[0.24356592275582106]]], "std": [[[0.14395659361488733]], [[0.1435337420971683]], [[0.1526500700423403]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3214664001464844]], [[0.2765667898140702]], [[0.24375772752948838]]], "std": [[[0.1612008415442931]], [[0.1776275261834117]], [[0.1867787731405147]]], "count": [100]}, "observation.state": {"min": [-0.2144947201013565, -0.08856261521577835, 0.44871747493743896, 2.8930678367614746, -0.958563506603241, -0.2915538549423218, 0.013103551231324673, -0.04062214493751526], "max": [0.11114510893821716, 0.2537301182746887, 0.6840139031410217, 3.3701798915863037, 0.2018544226884842, 0.6044611930847168, 0.03990798816084862, -0.022662563249468803], "mean": [-0.047506581991910934, 0.08640597760677338, 0.5839080214500427, 3.1229019165039062, -0.42033651471138, 0.019210640341043472, 0.029773131012916565, -0.03554780036211014], "std": [0.09249281138181686, 0.11144525557756424, 0.07043880969285965, 0.11147001385688782, 0.3958958089351654, 0.2523542046546936, 0.009179243817925453, 0.0066274115815758705], "count": [255]}, "action": {"min": [-0.5651785731315613, -0.7794643044471741, -0.7821428775787354, -0.1339285671710968, -0.12214285880327225, -0.15214285254478455, 0.0], "max": [0.8866071701049805, 0.7580357193946838, 0.9348214268684387, 0.12964285910129547, 0.2014285773038864, 0.24321427941322327, 1.0], "mean": [-0.007636565249413252, 0.0920168086886406, -0.06025208905339241, 0.005470589268952608, 0.002273109508678317, -0.007773109246045351, 0.545098066329956], "std": [0.3357292115688324, 0.3692678213119507, 0.43434110283851624, 0.05175839737057686, 0.05967956408858299, 0.07211551070213318, 0.4979618191719055], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [25], "max": [25], "mean": [25.0], "std": [0.0], "count": [255]}, "index": {"min": [7026], "max": [7280], "mean": [7153.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [255]}}} +{"episode_index": 26, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31485910393210015]], [[0.2522940931133196]], [[0.2134853713091682]]], "std": [[[0.1323536381623451]], [[0.12313293150925769]], [[0.12738667882923635]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3188399143592984]], [[0.2725996805826823]], [[0.23830267812691483]]], "std": [[[0.16044416037206552]], [[0.174691101513269]], [[0.1844408031572364]]], "count": [100]}, "observation.state": {"min": [-0.10843538492918015, -0.17104285955429077, 0.4886060357093811, 2.8671181201934814, -0.69539874792099, -0.4282059669494629, 0.03155868873000145, -0.04052574187517166], "max": [0.0717526450753212, 0.27312493324279785, 0.720755398273468, 3.1849584579467773, 0.6884436011314392, 0.15558189153671265, 0.04007631167769432, -0.029267147183418274], "mean": [-0.02495221234858036, 0.056309331208467484, 0.6223748922348022, 3.091968059539795, 0.11994536966085434, -0.14985811710357666, 0.03645382821559906, -0.035370275378227234], "std": [0.049619145691394806, 0.14613842964172363, 0.07174103707075119, 0.07603088766336441, 0.39723366498947144, 0.11799385398626328, 0.0033194548450410366, 0.004534445703029633], "count": [296]}, "action": {"min": [-0.5651785731315613, -0.9294642806053162, -0.7017857432365417, -0.07392857223749161, -0.1307142823934555, -0.19285714626312256, 0.0], "max": [0.7017857432365417, 0.8383928537368774, 0.9375, 0.1339285671710968, 0.14142857491970062, 0.15964286029338837, 1.0], "mean": [0.013076132163405418, 0.06862932443618774, 0.0021808843594044447, 0.0013248070608824492, 0.001929294434376061, -0.01383446715772152, 0.5777027010917664], "std": [0.2523353099822998, 0.3984268009662628, 0.39371204376220703, 0.0379677377641201, 0.04898511990904808, 0.06804518401622772, 0.49392497539520264], "count": [296]}, "timestamp": {"min": [0.0], "max": [14.75], "mean": [7.375], "std": [4.272367610587834], "count": [296]}, "frame_index": {"min": [0], "max": [295], "mean": [147.5], "std": [85.44735221175668], "count": [296]}, "episode_index": {"min": [26], "max": [26], "mean": [26.0], "std": [0.0], "count": [296]}, "index": {"min": [7281], "max": [7576], "mean": [7428.5], "std": [85.44735221175668], "count": [296]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [296]}}} +{"episode_index": 27, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.9882352941176471]], [[0.996078431372549]]], "mean": [[[0.3204613749186198]], [[0.2503651517980239]], [[0.1622178171195236]]], "std": [[[0.21010206082099883]], [[0.15830276337884894]], [[0.10690915612829743]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9764705882352941]], [[0.9647058823529412]], [[0.9607843137254902]]], "mean": [[[0.35132371550915287]], [[0.2954235067928539]], [[0.2196867370605469]]], "std": [[[0.1429358262239228]], [[0.1327717326955869]], [[0.14081645254373745]]], "count": [100]}, "observation.state": {"min": [-0.46368950605392456, -0.14834406971931458, 0.9860599637031555, 1.802812099456787, -2.418309450149536, -0.16605119407176971, 0.0019825303461402655, -0.04025813937187195], "max": [-0.17442969977855682, 0.17385071516036987, 1.3257501125335693, 3.149794340133667, 0.0014351261779665947, 0.1284545660018921, 0.03991418704390526, -0.013592402450740337], "mean": [-0.2889879643917084, -0.016774306073784828, 1.1859121322631836, 2.5828700065612793, -1.4088778495788574, -0.02488132379949093, 0.019470056518912315, -0.024163637310266495], "std": [0.09791061282157898, 0.12024734169244766, 0.09906043112277985, 0.4843640625476837, 0.8416441082954407, 0.0938037857413292, 0.012313339859247208, 0.010124687105417252], "count": [234]}, "action": {"min": [-0.824999988079071, -0.46339285373687744, -0.9375, -0.062142856419086456, -0.07428571581840515, -0.167142853140831, 0.0], "max": [0.4553571343421936, 0.5544642806053162, 0.8464285731315613, 0.05071428418159485, 0.06642857193946838, 0.1542857140302658, 1.0], "mean": [-0.09386447817087173, -0.042204707860946655, -0.0781249850988388, -0.0037484723143279552, -0.0003479848091956228, -0.05069291964173317, 0.24358974397182465], "std": [0.2804504930973053, 0.26268014311790466, 0.38132166862487793, 0.013973366469144821, 0.029316673055291176, 0.07812130451202393, 0.42924946546554565], "count": [234]}, "timestamp": {"min": [0.0], "max": [11.65], "mean": [5.825], "std": [3.377468233257963], "count": [234]}, "frame_index": {"min": [0], "max": [233], "mean": [116.5], "std": [67.54936466515926], "count": [234]}, "episode_index": {"min": [27], "max": [27], "mean": [27.0], "std": [0.0], "count": [234]}, "index": {"min": [7577], "max": [7810], "mean": [7693.5], "std": [67.54936466515926], "count": [234]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [234]}}} +{"episode_index": 28, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.9921568627450981]], [[0.9882352941176471]]], "mean": [[[0.3304095812030867]], [[0.2564161598355162]], [[0.16336891503427542]]], "std": [[[0.21221299758681103]], [[0.15892727693560058]], [[0.10413980396732288]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9686274509803922]], [[0.9764705882352941]], [[0.9686274509803922]]], "mean": [[[0.3534077788708257]], [[0.2975424966251149]], [[0.22194628248027726]]], "std": [[[0.14225232251957431]], [[0.13297360156566596]], [[0.14196638330264338]]], "count": [100]}, "observation.state": {"min": [-0.45457887649536133, -0.15214337408542633, 0.988912045955658, 2.0829274654388428, -2.470290422439575, -0.11030303686857224, 0.012090287171304226, -0.040007561445236206], "max": [-0.19156473875045776, 0.14583010971546173, 1.2670543193817139, 3.1456589698791504, 0.0012601359048858285, 0.05218544974923134, 0.039972301572561264, -0.01463036797940731], "mean": [-0.2873963713645935, 0.006945753004401922, 1.149999976158142, 2.726372718811035, -1.401854157447815, -0.04153801500797272, 0.025537962093949318, -0.025699952617287636], "std": [0.08152211457490921, 0.11127762496471405, 0.08194232732057571, 0.3725768029689789, 0.7946096658706665, 0.04794318601489067, 0.012184114195406437, 0.01203317753970623], "count": [195]}, "action": {"min": [-0.3991071283817291, -0.5223214030265808, -0.5491071343421936, -0.018571428954601288, -0.05214285850524902, -0.20499999821186066, 0.0], "max": [0.5491071343421936, 0.35357141494750977, 0.9375, 0.040714286267757416, 0.03500000014901161, 0.0835714265704155, 1.0], "mean": [-0.06685438752174377, -0.05383242666721344, -0.04370880499482155, 0.0025897438172250986, 0.0007216117228381336, -0.07054577022790909, 0.40512821078300476], "std": [0.2102573812007904, 0.25212350487709045, 0.35858216881752014, 0.011385646648705006, 0.014500229619443417, 0.07125288248062134, 0.49091610312461853], "count": [195]}, "timestamp": {"min": [0.0], "max": [9.7], "mean": [4.85], "std": [2.8145455524234575], "count": [195]}, "frame_index": {"min": [0], "max": [194], "mean": [97.0], "std": [56.290911048469155], "count": [195]}, "episode_index": {"min": [28], "max": [28], "mean": [28.0], "std": [0.0], "count": [195]}, "index": {"min": [7811], "max": [8005], "mean": [7908.0], "std": [56.290911048469155], "count": [195]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [195]}}} +{"episode_index": 29, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32017598051183366]], [[0.26421184883865656]], [[0.2314346217735141]]], "std": [[[0.15355275339633803]], [[0.1519560647170494]], [[0.15879577323294375]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31437281769397213]], [[0.26937032303155634]], [[0.2366254930683211]]], "std": [[[0.15514763677272264]], [[0.17026051951482193]], [[0.17860640760221635]]], "count": [100]}, "observation.state": {"min": [-0.1403828263282776, -0.09230771660804749, 0.4466656744480133, 3.0493619441986084, -0.612102210521698, -0.5308723449707031, 0.02162589505314827, -0.04054718092083931], "max": [0.09212053567171097, 0.2848544716835022, 0.7044679522514343, 3.2085306644439697, 0.07538831979036331, -0.004647410940378904, 0.040561869740486145, -0.020199572667479515], "mean": [-0.01828113943338394, 0.09181103110313416, 0.6028599739074707, 3.145659923553467, -0.26543641090393066, -0.2752978205680847, 0.03288428485393524, -0.03374151512980461], "std": [0.06634720414876938, 0.12757755815982819, 0.07316342741250992, 0.03346245735883713, 0.26872408390045166, 0.1432676762342453, 0.007304685190320015, 0.007509214337915182], "count": [288]}, "action": {"min": [-0.5598214268684387, -0.8544642925262451, -0.6482142806053162, -0.05249999836087227, -0.09000000357627869, -0.16178570687770844, 0.0], "max": [0.7982142567634583, 0.8544642925262451, 0.9375, 0.08142857253551483, 0.11678571254014969, 0.23678570985794067, 1.0], "mean": [0.005877987015992403, 0.06187685951590538, -0.023679295554757118, 0.005290178582072258, 0.003991815727204084, 0.000513393257278949, 0.5590277910232544], "std": [0.29424044489860535, 0.3787544369697571, 0.4005834460258484, 0.015130816958844662, 0.035821568220853806, 0.05490000173449516, 0.4965038299560547], "count": [288]}, "timestamp": {"min": [0.0], "max": [14.35], "mean": [7.174999999999999], "std": [4.156896879484343], "count": [288]}, "frame_index": {"min": [0], "max": [287], "mean": [143.5], "std": [83.13793758968686], "count": [288]}, "episode_index": {"min": [29], "max": [29], "mean": [29.0], "std": [0.0], "count": [288]}, "index": {"min": [8006], "max": [8293], "mean": [8149.5], "std": [83.13793758968686], "count": [288]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [288]}}} +{"episode_index": 30, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32034900201535693]], [[0.2604955629834942]], [[0.2249714786305147]]], "std": [[[0.12776699047366877]], [[0.12159774094906031]], [[0.12624510113873125]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3180345387178309]], [[0.2734630695417815]], [[0.2407959732354856]]], "std": [[[0.16029787896628242]], [[0.17599033540198195]], [[0.18455461976604148]]], "count": [100]}, "observation.state": {"min": [-0.20728735625743866, -0.13328108191490173, 0.4465028643608093, 3.0243470668792725, -0.7257301211357117, -0.3181018829345703, 0.0008039450040087104, -0.04050453007221222], "max": [0.09413452446460724, 0.27536889910697937, 0.6884365081787109, 3.1810240745544434, 0.0015458510024473071, 0.14980918169021606, 0.03990219905972481, -0.0006707696011289954], "mean": [-0.03103734366595745, 0.059503380209207535, 0.5899628400802612, 3.1041929721832275, -0.4744740426540375, -0.046486008912324905, 0.030579419806599617, -0.030228234827518463], "std": [0.08917312324047089, 0.1319447159767151, 0.08256721496582031, 0.04803745448589325, 0.1924857646226883, 0.10957449674606323, 0.010455393232405186, 0.010992537252604961], "count": [284]}, "action": {"min": [-0.40982142090797424, -0.7714285850524902, -0.6964285969734192, -0.04392857104539871, -0.09107142686843872, -0.19821429252624512, 0.0], "max": [0.8839285969734192, 0.8303571343421936, 0.9375, 0.06428571790456772, 0.1039285734295845, 0.12535713613033295, 1.0], "mean": [0.009535334073007107, 0.0685582384467125, -0.03102046623826027, 0.0025616202037781477, 0.0036934111267328262, -0.007032193709164858, 0.5105633735656738], "std": [0.3023908734321594, 0.3847467601299286, 0.4161280393600464, 0.017983105033636093, 0.03857152909040451, 0.051029037684202194, 0.49988794326782227], "count": [284]}, "timestamp": {"min": [0.0], "max": [14.15], "mean": [7.075000000000001], "std": [4.099161499624039], "count": [284]}, "frame_index": {"min": [0], "max": [283], "mean": [141.5], "std": [81.98322999248077], "count": [284]}, "episode_index": {"min": [30], "max": [30], "mean": [30.0], "std": [0.0], "count": [284]}, "index": {"min": [8294], "max": [8577], "mean": [8435.5], "std": [81.98322999248077], "count": [284]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [284]}}} +{"episode_index": 31, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6041271846995634]], [[0.5597270866842832]], [[0.5077472845339308]]], "std": [[[0.27749906684655096]], [[0.26038158141227163]], [[0.23917947101133433]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5481861015768613]], [[0.5086226531384038]], [[0.4591083768956802]]], "std": [[[0.29936950249019606]], [[0.27882005001664256]], [[0.2648070911861206]]], "count": [100]}, "observation.state": {"min": [-0.20622800290584564, -0.06036524102091789, 0.9197998642921448, 2.300781011581421, -2.241945743560791, -0.9594061374664307, 0.002175457077100873, -0.04000963270664215], "max": [0.037679415196180344, 0.18474271893501282, 1.1685421466827393, 3.1404802799224854, 0.0047170910984277725, 0.22948779165744781, 0.04032415151596069, -0.0011217845603823662], "mean": [-0.01542898640036583, 0.02200399339199066, 1.0411406755447388, 2.6933891773223877, -1.6051609516143799, -0.1884782612323761, 0.027871564030647278, -0.027419228106737137], "std": [0.06294116377830505, 0.07725958526134491, 0.0874946191906929, 0.2611163556575775, 0.625321090221405, 0.4027753472328186, 0.016658267006278038, 0.017116578295826912], "count": [241]}, "action": {"min": [-0.7741071581840515, -0.7875000238418579, -0.65625, -0.023571427911520004, -0.14678572118282318, -0.21857142448425293, 0.0], "max": [0.6214285492897034, 0.7098214030265808, 0.9375, 0.2142857164144516, 0.14249999821186066, 0.12107142806053162, 1.0], "mean": [0.036066241562366486, 0.11236662417650223, -0.08942649513483047, 0.015737997367978096, 0.005032602231949568, -0.0446309931576252, 0.6763485670089722], "std": [0.27220943570137024, 0.3344377279281616, 0.39817121624946594, 0.04445397108793259, 0.06340998411178589, 0.08042126148939133, 0.4678691327571869], "count": [241]}, "timestamp": {"min": [0.0], "max": [12.0], "mean": [6.0], "std": [3.4785054261852175], "count": [241]}, "frame_index": {"min": [0], "max": [240], "mean": [120.0], "std": [69.57010852370435], "count": [241]}, "episode_index": {"min": [31], "max": [31], "mean": [31.0], "std": [0.0], "count": [241]}, "index": {"min": [8578], "max": [8818], "mean": [8698.0], "std": [69.57010852370435], "count": [241]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [241]}}} +{"episode_index": 32, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6047275049546186]], [[0.5573765869140626]], [[0.5028416131711474]]], "std": [[[0.2721789274364536]], [[0.25434060958509386]], [[0.23172486106682358]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5486071561925552]], [[0.5086691900515089]], [[0.4588756294998468]]], "std": [[[0.29890216074683407]], [[0.2782158420919031]], [[0.26403483749476847]]], "count": [100]}, "observation.state": {"min": [-0.2024299055337906, -0.07833903282880783, 0.9163646697998047, 2.500936269760132, -2.3478877544403076, -0.8217644691467285, 0.003235842566937208, -0.0398208387196064], "max": [0.04861730709671974, 0.17370761930942535, 1.1687240600585938, 3.139697551727295, 2.983349986607209e-05, 0.38199493288993835, 0.04001150280237198, -0.0023725086357444525], "mean": [-0.030062004923820496, 0.007357911206781864, 1.0337220430374146, 2.7866361141204834, -1.5918439626693726, -0.0347762294113636, 0.027470663189888, -0.024831712245941162], "std": [0.053097497671842575, 0.07944109290838242, 0.07862982898950577, 0.17594321072101593, 0.5610893368721008, 0.3581439256668091, 0.016279611736536026, 0.016333656385540962], "count": [229]}, "action": {"min": [-0.27589285373687744, -0.7124999761581421, -0.5464285612106323, -0.04500000178813934, -0.12964285910129547, -0.3171428442001343, 0.0], "max": [0.5410714149475098, 0.7928571701049805, 0.6991071701049805, 0.21214285492897034, 0.08892857283353806, 0.039642855525016785, 1.0], "mean": [0.060893598943948746, 0.10731829702854156, -0.09902525693178177, 0.026280414313077927, 0.003247038694098592, -0.053646285086870193, 0.6506550312042236], "std": [0.19795803725719452, 0.35542866587638855, 0.34112057089805603, 0.05680176988244057, 0.04450981318950653, 0.0802973210811615, 0.47676345705986023], "count": [229]}, "timestamp": {"min": [0.0], "max": [11.4], "mean": [5.7], "std": [3.3052987762076818], "count": [229]}, "frame_index": {"min": [0], "max": [228], "mean": [114.0], "std": [66.10597552415364], "count": [229]}, "episode_index": {"min": [32], "max": [32], "mean": [32.0], "std": [0.0], "count": [229]}, "index": {"min": [8819], "max": [9047], "mean": [8933.0], "std": [66.10597552415364], "count": [229]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [229]}}} +{"episode_index": 33, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34387710391773896]], [[0.27767051008635873]], [[0.2319305419921875]]], "std": [[[0.1423610557614122]], [[0.14032119501202794]], [[0.1440018693509047]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3103298369762944]], [[0.2609729374904258]], [[0.22746291097005208]]], "std": [[[0.14523991080077409]], [[0.15818604307854306]], [[0.16637449764050527]]], "count": [100]}, "observation.state": {"min": [-0.12106470763683319, -0.2766033709049225, 0.5067641139030457, 3.0438361167907715, -0.10388267785310745, -0.1734534502029419, 0.0017304044449701905, -0.03988354280591011], "max": [0.08294984698295593, 0.3661745488643646, 0.694191038608551, 3.156080722808838, 0.40671512484550476, 0.012780929915606976, 0.03993689641356468, -0.005218342412263155], "mean": [-0.021724501624703407, 0.0031938704196363688, 0.5937464237213135, 3.0999867916107178, 0.11923050135374069, -0.08975779265165329, 0.02181279845535755, -0.022646784782409668], "std": [0.05554713308811188, 0.20802992582321167, 0.056515101343393326, 0.027302907779812813, 0.1215687170624733, 0.044465214014053345, 0.01583603024482727, 0.015176346525549889], "count": [259]}, "action": {"min": [-0.5196428298950195, -0.7392857074737549, -0.7633928656578064, -0.05464285612106323, -0.07607142627239227, -0.0535714291036129, 0.0], "max": [0.8892857432365417, 0.8705357313156128, 0.8517857193946838, 0.062142856419086456, 0.11357142776250839, 0.11142857372760773, 1.0], "mean": [-0.004912439733743668, 0.10456770658493042, -0.06526824086904526, -0.002233866835013032, 0.0019980689976364374, -0.0010342007735744119, 0.4749034643173218], "std": [0.27234479784965515, 0.3912186324596405, 0.3916027843952179, 0.014140998013317585, 0.03093886375427246, 0.0327291339635849, 0.49936947226524353], "count": [259]}, "timestamp": {"min": [0.0], "max": [12.9], "mean": [6.449999999999999], "std": [3.7383151285037486], "count": [259]}, "frame_index": {"min": [0], "max": [258], "mean": [129.0], "std": [74.76630257007497], "count": [259]}, "episode_index": {"min": [33], "max": [33], "mean": [33.0], "std": [0.0], "count": [259]}, "index": {"min": [9048], "max": [9306], "mean": [9177.0], "std": [74.76630257007497], "count": [259]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [259]}}} +{"episode_index": 34, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5001839515835631]], [[0.46401485188802083]], [[0.4103672024595971]]], "std": [[[0.3060881955535384]], [[0.275526085251452]], [[0.24286661496202006]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5155053184359681]], [[0.48475284172506894]], [[0.43929777137905945]]], "std": [[[0.31315181771237743]], [[0.2880094789972293]], [[0.26886335573374753]]], "count": [100]}, "observation.state": {"min": [-0.32790082693099976, -0.08093392848968506, 0.951750636100769, 1.9759875535964966, -3.641430377960205, -1.4355849027633667, 0.004310189746320248, -0.04000530019402504], "max": [0.0910826101899147, 0.275456964969635, 1.1959755420684814, 3.251877784729004, 2.1880762577056885, 0.19975532591342926, 0.04033876955509186, -0.0020703072659671307], "mean": [-0.051120575517416, 0.08573602139949799, 1.0691694021224976, 2.6545488834381104, -1.6715850830078125, -0.9488263726234436, 0.03243221342563629, -0.03230271488428116], "std": [0.11187119781970978, 0.1187683641910553, 0.06881488859653473, 0.36189955472946167, 1.5750259160995483, 0.38608530163764954, 0.012894208543002605, 0.012998724356293678], "count": [449]}, "action": {"min": [-0.65625, -0.8116071224212646, -0.5732142925262451, -0.15642857551574707, -0.2314285784959793, -0.25928571820259094, 0.0], "max": [0.7982142567634583, 0.8973214030265808, 0.637499988079071, 0.30000001192092896, 0.19285714626312256, 0.375, 1.0], "mean": [0.006305684335529804, 0.1196647509932518, -0.04807709529995918, 0.02412981167435646, -0.011377663351595402, 0.02584078535437584, 0.7594654560089111], "std": [0.3132189214229584, 0.29248887300491333, 0.231120303273201, 0.06947784125804901, 0.09009399265050888, 0.15474604070186615, 0.4274064898490906], "count": [449]}, "timestamp": {"min": [0.0], "max": [22.4], "mean": [11.200000000000001], "std": [6.48074069840786], "count": [449]}, "frame_index": {"min": [0], "max": [448], "mean": [224.0], "std": [129.6148139681572], "count": [449]}, "episode_index": {"min": [34], "max": [34], "mean": [34.0], "std": [0.0], "count": [449]}, "index": {"min": [9307], "max": [9755], "mean": [9531.0], "std": [129.6148139681572], "count": [449]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [449]}}} +{"episode_index": 35, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.49819379080978093]], [[0.4625285070082721]], [[0.41344874482996324]]], "std": [[[0.3030100659883498]], [[0.27322408819392363]], [[0.2427647856182864]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5120035340552237]], [[0.48113752417470895]], [[0.4357970186121324]]], "std": [[[0.31177722902650645]], [[0.2858535542621203]], [[0.26561737501818683]]], "count": [100]}, "observation.state": {"min": [-0.26555588841438293, -0.08075970411300659, 0.9646267294883728, 1.8158231973648071, -2.744493007659912, -1.2888683080673218, 0.008814573287963867, -0.03989868983626366], "max": [0.03175167366862297, 0.2804739475250244, 1.1792261600494385, 3.2444915771484375, 2.72225284576416, 0.03619849681854248, 0.040010593831539154, -0.008025436662137508], "mean": [-0.06050006300210953, 0.08934639394283295, 1.0586501359939575, 2.862436532974243, -1.3917772769927979, -0.7493934631347656, 0.03202303498983383, -0.031839799135923386], "std": [0.09497803449630737, 0.11981827765703201, 0.06669484078884125, 0.26990124583244324, 1.5839236974716187, 0.400593638420105, 0.012893962673842907, 0.012927648611366749], "count": [353]}, "action": {"min": [-0.6294642686843872, -0.5303571224212646, -0.4312500059604645, -0.16821429133415222, -0.23357142508029938, -0.2849999964237213, 0.0], "max": [0.5089285969734192, 0.4982142746448517, 0.5491071343421936, 0.15535713732242584, 0.17571428418159485, 0.3589285612106323, 1.0], "mean": [0.005440593231469393, 0.0780731737613678, -0.05224354937672615, 0.010034390725195408, -0.00413091666996479, 0.05703156813979149, 0.7450425028800964], "std": [0.24391596019268036, 0.21688972413539886, 0.20360736548900604, 0.05684022232890129, 0.06934615969657898, 0.18611110746860504, 0.4358368217945099], "count": [353]}, "timestamp": {"min": [0.0], "max": [17.6], "mean": [8.799999999999999], "std": [5.095095681142799], "count": [353]}, "frame_index": {"min": [0], "max": [352], "mean": [176.0], "std": [101.90191362285597], "count": [353]}, "episode_index": {"min": [35], "max": [35], "mean": [35.0], "std": [0.0], "count": [353]}, "index": {"min": [9756], "max": [10108], "mean": [9932.0], "std": [101.90191362285597], "count": [353]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [353]}}} +{"episode_index": 36, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6147509137321922]], [[0.5694474517223882]], [[0.5162954340916054]]], "std": [[[0.26607721919637517]], [[0.24845729466322022]], [[0.22691342018992197]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5491716769349342]], [[0.5093265680051317]], [[0.4594622401817172]]], "std": [[[0.2997505368808157]], [[0.27922084435989014]], [[0.26513611395557973]]], "count": [100]}, "observation.state": {"min": [-0.2060675024986267, -0.07210797816514969, 0.9137789011001587, 2.438431978225708, -2.192721128463745, -0.8319785594940186, 0.002612784970551729, -0.03983910009264946], "max": [0.015396361239254475, 0.18479998409748077, 1.1766438484191895, 3.1414361000061035, 0.002797083929181099, 0.6498464345932007, 0.040615927428007126, -0.0016618784284219146], "mean": [-0.02527349255979061, 0.026474928483366966, 1.0179094076156616, 2.7536168098449707, -1.6673001050949097, -0.011490806937217712, 0.02804623357951641, -0.02747288905084133], "std": [0.05155160278081894, 0.07969280332326889, 0.08704733103513718, 0.22128728032112122, 0.5759229063987732, 0.43477246165275574, 0.016658788546919823, 0.01689034327864647], "count": [240]}, "action": {"min": [-0.24375000596046448, -0.7955357432365417, -0.5705357193946838, -0.10821428894996643, -0.1274999976158142, -0.2807142734527588, 0.0], "max": [0.5196428298950195, 0.7232142686843872, 0.9080356955528259, 0.19928571581840515, 0.15321429073810577, 0.061071429401636124, 1.0], "mean": [0.05870536342263222, 0.12018974125385284, -0.08191966265439987, 0.02241518907248974, -0.00038838948239572346, -0.045968737453222275, 0.6833333373069763], "std": [0.2000206559896469, 0.36369574069976807, 0.3557555079460144, 0.05756206065416336, 0.06354822218418121, 0.08493904024362564, 0.46517595648765564], "count": [240]}, "timestamp": {"min": [0.0], "max": [11.95], "mean": [5.975], "std": [3.4640715446807193], "count": [240]}, "frame_index": {"min": [0], "max": [239], "mean": [119.5], "std": [69.2814308936144], "count": [240]}, "episode_index": {"min": [36], "max": [36], "mean": [36.0], "std": [0.0], "count": [240]}, "index": {"min": [10109], "max": [10348], "mean": [10228.5], "std": [69.2814308936144], "count": [240]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [240]}}} +{"episode_index": 37, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3649475887522978]], [[0.2970350611069623]], [[0.24760608149509805]]], "std": [[[0.18673046146173308]], [[0.17937427831659145]], [[0.16449914079194516]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3267856894100414]], [[0.28178203866996016]], [[0.2520509033203125]]], "std": [[[0.16006517859382544]], [[0.1760448943444906]], [[0.18723710399441995]]], "count": [100]}, "observation.state": {"min": [-0.10481323301792145, -0.13443799316883087, 0.4476321339607239, 3.0274295806884766, -0.3376985490322113, -0.24110500514507294, 0.002127923769876361, -0.03984621912240982], "max": [0.21031762659549713, 0.11972284317016602, 0.6742445826530457, 3.3222107887268066, 0.026411263272166252, 0.1141473576426506, 0.039998676627874374, -0.005349680315703154], "mean": [0.025413135066628456, 0.017155544832348824, 0.5724688172340393, 3.193756103515625, -0.1414896696805954, -0.07073943316936493, 0.02569713070988655, -0.024631621316075325], "std": [0.10886313766241074, 0.08651365339756012, 0.07499764859676361, 0.07200072705745697, 0.12564854323863983, 0.10000505298376083, 0.015384773723781109, 0.014867126010358334], "count": [246]}, "action": {"min": [-0.637499988079071, -0.731249988079071, -0.5651785731315613, -0.09428571164608002, -0.07607142627239227, -0.051428571343421936, 0.0], "max": [0.9375, 0.5625, 0.7071428298950195, 0.08892857283353806, 0.0867857113480568, 0.04392857104539871, 1.0], "mean": [0.044229116290807724, 0.027253905311226845, -0.09569903463125229, -0.00045731634600088, -0.0015243905363604426, -0.003497388679534197, 0.4796747863292694], "std": [0.42153286933898926, 0.23336821794509888, 0.3208453059196472, 0.03643332049250603, 0.03377312794327736, 0.02065545879304409, 0.49958598613739014], "count": [246]}, "timestamp": {"min": [0.0], "max": [12.25], "mean": [6.125], "std": [3.5506748184910806], "count": [246]}, "frame_index": {"min": [0], "max": [245], "mean": [122.5], "std": [71.01349636982161], "count": [246]}, "episode_index": {"min": [37], "max": [37], "mean": [37.0], "std": [0.0], "count": [246]}, "index": {"min": [10349], "max": [10594], "mean": [10471.5], "std": [71.01349636982161], "count": [246]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [246]}}} +{"episode_index": 38, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5639590077119715]], [[0.5299765044567631]], [[0.49418245442708336]]], "std": [[[0.26327336531421935]], [[0.23981246366324657]], [[0.21641905422507318]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5379970374013864]], [[0.5032567623362822]], [[0.45516385725432756]]], "std": [[[0.3001984209277807]], [[0.27468460406801415]], [[0.2555098328024243]]], "count": [100]}, "observation.state": {"min": [-0.21209490299224854, -0.10893342643976212, 0.9271216988563538, 1.513064980506897, 0.0006300237728282809, -0.297270268201828, 0.006650636903941631, -0.040007393807172775], "max": [0.09467686712741852, 0.2107284516096115, 1.1731644868850708, 3.145282030105591, 2.8406214714050293, 0.4396103620529175, 0.03987349942326546, -0.005254915449768305], "mean": [-0.05853191018104553, 0.04996354132890701, 1.0392823219299316, 2.476928234100342, 1.6325777769088745, 0.1434721201658249, 0.028139760717749596, -0.027776336297392845], "std": [0.11764810979366302, 0.11556869745254517, 0.0707009807229042, 0.5862084627151489, 1.090671181678772, 0.2262972593307495, 0.013613658957183361, 0.014496979303658009], "count": [261]}, "action": {"min": [-0.6428571343421936, -0.6776785850524902, -0.8705357313156128, -0.04821428656578064, -0.12964285910129547, -0.03857142850756645, 0.0], "max": [0.7017857432365417, 0.65625, 0.824999988079071, 0.1103571429848671, 0.14571428298950195, 0.375, 1.0], "mean": [0.03462643176317215, 0.06327995657920837, -0.10462848842144012, 0.006346470210701227, -0.011834974400699139, 0.07281605899333954, 0.5938697457313538], "std": [0.2897990942001343, 0.3218718469142914, 0.35683953762054443, 0.031459514051675797, 0.05924133211374283, 0.10145042091608047, 0.49110880494117737], "count": [261]}, "timestamp": {"min": [0.0], "max": [13.0], "mean": [6.5], "std": [3.7671828554858693], "count": [261]}, "frame_index": {"min": [0], "max": [260], "mean": [130.0], "std": [75.34365710971738], "count": [261]}, "episode_index": {"min": [38], "max": [38], "mean": [38.0], "std": [0.0], "count": [261]}, "index": {"min": [10595], "max": [10855], "mean": [10725.0], "std": [75.34365710971738], "count": [261]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [261]}}} +{"episode_index": 39, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3246022967170267]], [[0.2664944559733073]], [[0.22989601344688265]]], "std": [[[0.14353715393086616]], [[0.1399925724756112]], [[0.14330215179744024]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32443763942344517]], [[0.2777175927255668]], [[0.2434086196001838]]], "std": [[[0.16488953247496926]], [[0.180154009826009]], [[0.1901011756532592]]], "count": [100]}, "observation.state": {"min": [-0.09768714755773544, -0.18223139643669128, 0.4802907109260559, 3.0722858905792236, -0.5448519587516785, -0.08963315933942795, 0.026735687628388405, -0.04061606153845787], "max": [-0.012385659851133823, 0.28249961137771606, 0.6844307780265808, 3.2218315601348877, -7.17834263923578e-05, 0.5190905928611755, 0.03996221348643303, -0.03306661918759346], "mean": [-0.05440397560596466, 0.038169898092746735, 0.6066191792488098, 3.1549980640411377, -0.24219901859760284, 0.0809183418750763, 0.0338597409427166, -0.037418972700834274], "std": [0.023511139675974846, 0.15942637622356415, 0.06559985876083374, 0.04374893754720688, 0.11917497962713242, 0.14063085615634918, 0.00564709072932601, 0.0022870192769914865], "count": [288]}, "action": {"min": [-0.3642857074737549, -0.6964285969734192, -0.5142857432365417, -0.07821428775787354, -0.11678571254014969, -0.062142856419086456, 0.0], "max": [0.5357142686843872, 0.8116071224212646, 0.9375, 0.08464285731315613, 0.0535714291036129, 0.025714285671710968, 1.0], "mean": [0.02021019533276558, 0.06995908170938492, -0.018043166026473045, 0.0005654756678268313, -0.006179315038025379, -0.009419643320143223, 0.5451388955116272], "std": [0.1372355818748474, 0.38877347111701965, 0.3567246198654175, 0.024013174697756767, 0.03604365140199661, 0.018567929044365883, 0.4979584515094757], "count": [288]}, "timestamp": {"min": [0.0], "max": [14.35], "mean": [7.174999999999999], "std": [4.156896879484343], "count": [288]}, "frame_index": {"min": [0], "max": [287], "mean": [143.5], "std": [83.13793758968686], "count": [288]}, "episode_index": {"min": [39], "max": [39], "mean": [39.0], "std": [0.0], "count": [288]}, "index": {"min": [10856], "max": [11143], "mean": [10999.5], "std": [83.13793758968686], "count": [288]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [288]}}} +{"episode_index": 40, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5423208642099419]], [[0.5099087584252451]], [[0.47645127778894764]]], "std": [[[0.270294052053251]], [[0.2468731635368198]], [[0.22297232843846293]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5373286234537761]], [[0.5021982601390165]], [[0.4532021191166897]]], "std": [[[0.29995977681313696]], [[0.2735935214816996]], [[0.2534291893256642]]], "count": [100]}, "observation.state": {"min": [-0.21906046569347382, -0.06949003040790558, 0.9273929595947266, 1.9298028945922852, -0.0019249414326623082, -0.19528265297412872, 0.006586273200809956, -0.040567025542259216], "max": [0.021849878132343292, 0.21076169610023499, 1.1819877624511719, 3.144253730773926, 2.6233394145965576, 0.6835130453109741, 0.04009044170379639, -0.001450713025406003], "mean": [-0.1126474067568779, 0.09452739357948303, 1.0362175703048706, 2.6129229068756104, 1.3641237020492554, 0.1348838210105896, 0.027787024155259132, -0.02603946067392826], "std": [0.08818656951189041, 0.09909322112798691, 0.08279406279325485, 0.44341638684272766, 1.0163477659225464, 0.33048754930496216, 0.013572853989899158, 0.014917717315256596], "count": [228]}, "action": {"min": [-0.35357141494750977, -0.7446428537368774, -0.8142856955528259, -0.0503571443259716, -0.1875, -0.012857142835855484, 0.0], "max": [0.675000011920929, 0.7339285612106323, 0.8330357074737549, 0.13500000536441803, 0.15321429073810577, 0.375, 1.0], "mean": [0.03034539334475994, 0.0748942419886589, -0.11134865134954453, 0.012589284218847752, -0.00601973757147789, 0.07402725517749786, 0.5614035129547119], "std": [0.2538083791732788, 0.3361636996269226, 0.3960341215133667, 0.03503604605793953, 0.058060579001903534, 0.11874048411846161, 0.4962156116962433], "count": [228]}, "timestamp": {"min": [0.0], "max": [11.35], "mean": [5.675000000000001], "std": [3.2908648812533565], "count": [228]}, "frame_index": {"min": [0], "max": [227], "mean": [113.5], "std": [65.81729762506713], "count": [228]}, "episode_index": {"min": [40], "max": [40], "mean": [40.0], "std": [0.0], "count": [228]}, "index": {"min": [11144], "max": [11371], "mean": [11257.5], "std": [65.81729762506713], "count": [228]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [228]}}} +{"episode_index": 41, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32552180271522674]], [[0.2663754643458946]], [[0.22936304907705268]]], "std": [[[0.14588453989150663]], [[0.14403805125013516]], [[0.1489642092805167]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31841399787454044]], [[0.27409849219228705]], [[0.24159216488108917]]], "std": [[[0.15884654405408147]], [[0.1744390144958622]], [[0.18308846315669824]]], "count": [100]}, "observation.state": {"min": [-0.1460789293050766, -0.1105380654335022, 0.4484657943248749, 3.1108500957489014, -0.5215796232223511, -0.5747084021568298, 0.01955627091228962, -0.039801258593797684], "max": [0.10274776816368103, 0.26264044642448425, 0.7030103206634521, 3.2174508571624756, 0.30531948804855347, 0.48109978437423706, 0.03984804078936577, -0.022039486095309258], "mean": [-9.148519166046754e-05, 0.08689206093549728, 0.6034433841705322, 3.154956102371216, -0.0815776139497757, -0.16802310943603516, 0.03279849514365196, -0.031001416966319084], "std": [0.07826856523752213, 0.132432222366333, 0.07342901080846786, 0.028673289343714714, 0.22066238522529602, 0.2252008020877838, 0.007941591553390026, 0.007002774626016617], "count": [236]}, "action": {"min": [-0.6267856955528259, -0.8008928298950195, -0.7767857313156128, -0.07928571105003357, -0.26678571105003357, -0.10499999672174454, 0.0], "max": [0.7794643044471741, 0.8491071462631226, 0.9375, 0.11999999731779099, 0.1842857152223587, 0.33642858266830444, 1.0], "mean": [0.02973669208586216, 0.09851694107055664, -0.03786320984363556, 0.0026649492792785168, -0.005057505797594786, 0.005425242241472006, 0.44915252923965454], "std": [0.3508783280849457, 0.4118840992450714, 0.4963529407978058, 0.030744804069399834, 0.0788060873746872, 0.07703319191932678, 0.49740734696388245], "count": [236]}, "timestamp": {"min": [0.0], "max": [11.75], "mean": [5.875], "std": [3.406336008088456], "count": [236]}, "frame_index": {"min": [0], "max": [235], "mean": [117.5], "std": [68.12672016176913], "count": [236]}, "episode_index": {"min": [41], "max": [41], "mean": [41.0], "std": [0.0], "count": [236]}, "index": {"min": [11372], "max": [11607], "mean": [11489.5], "std": [68.12672016176913], "count": [236]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [236]}}} +{"episode_index": 42, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35467505421358]], [[0.2858375908346737]], [[0.24054511515299482]]], "std": [[[0.16174166394561623]], [[0.154379907064327]], [[0.14821070704405664]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33238934745040594]], [[0.2875354823692172]], [[0.2547015967275582]]], "std": [[[0.17136999738407588]], [[0.18748065798278085]], [[0.19822030705911725]]], "count": [100]}, "observation.state": {"min": [-0.06063973531126976, -0.19370943307876587, 0.44777682423591614, 3.1111254692077637, -0.8023443222045898, -0.26722291111946106, 0.0197917390614748, -0.0398724265396595], "max": [0.16018272936344147, 0.24190902709960938, 0.7379204034805298, 3.268968105316162, 0.0012938869185745716, 0.5559810996055603, 0.03985226899385452, -0.019085098057985306], "mean": [0.04503233730792999, 0.04074351489543915, 0.6084854006767273, 3.1633951663970947, -0.34440839290618896, 0.06645519286394119, 0.0290636345744133, -0.029244128614664078], "std": [0.06296935677528381, 0.14982692897319794, 0.0839051678776741, 0.04002808779478073, 0.15492960810661316, 0.24864134192466736, 0.008685333654284477, 0.008940417319536209], "count": [244]}, "action": {"min": [-0.7098214030265808, -0.731249988079071, -0.8571428656578064, -0.08571428805589676, -0.17249999940395355, -0.1339285671710968, 0.0], "max": [0.7928571701049805, 0.8866071701049805, 0.9375, 0.07928571105003357, 0.18214285373687744, 0.06321428716182709, 1.0], "mean": [0.0010538826463744044, 0.08604362607002258, -0.040299318730831146, 0.0009177401079796255, 0.0002151627850253135, -0.01858752779662609, 0.4836065471172333], "std": [0.3394741117954254, 0.4333987534046173, 0.5071010589599609, 0.026333140209317207, 0.06894385069608688, 0.043931636959314346, 0.49973130226135254], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [42], "max": [42], "mean": [42.0], "std": [0.0], "count": [244]}, "index": {"min": [11608], "max": [11851], "mean": [11729.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [244]}}} +{"episode_index": 43, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32820776187672335]], [[0.2585924431295956]], [[0.21584621294806985]]], "std": [[[0.12679442040525002]], [[0.1199337523831296]], [[0.12329562842434719]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32833111153396904]], [[0.28448462153416054]], [[0.2517591881845512]]], "std": [[[0.16830658502199483]], [[0.18339866587921083]], [[0.19340260756432734]]], "count": [100]}, "observation.state": {"min": [-0.05116152763366699, -0.18509094417095184, 0.44783490896224976, 2.989816427230835, -0.3600531816482544, -0.33859050273895264, 0.019402943551540375, -0.03985089436173439], "max": [0.11746995151042938, 0.2394046187400818, 0.7341448068618774, 3.3124144077301025, 0.4615934193134308, -0.023921210318803787, 0.04019387811422348, -0.019560860469937325], "mean": [0.05885510519146919, 0.025083256885409355, 0.5894492268562317, 3.139464855194092, -0.07469074428081512, -0.1337721049785614, 0.030722105875611305, -0.030684152618050575], "std": [0.039928968995809555, 0.15043243765830994, 0.09326546639204025, 0.0760921910405159, 0.25671839714050293, 0.06779715418815613, 0.008872536942362785, 0.00912452768534422], "count": [272]}, "action": {"min": [-0.6267856955528259, -0.84375, -0.6642857193946838, -0.11142857372760773, -0.1039285734295845, -0.18214285373687744, 0.0], "max": [0.7339285612106323, 0.9107142686843872, 0.9375, 0.09749999642372131, 0.06964285671710968, 0.26892855763435364, 1.0], "mean": [0.00016741958097554743, 0.07278423756361008, -0.045525889843702316, 0.00012998827151022851, -0.0008153885719366372, -0.006917015183717012, 0.5588235259056091], "std": [0.26642149686813354, 0.4192439913749695, 0.4349842071533203, 0.038972724229097366, 0.023791493847966194, 0.07555287331342697, 0.4965275824069977], "count": [272]}, "timestamp": {"min": [0.0], "max": [13.55], "mean": [6.7749999999999995], "std": [3.9259552977587506], "count": [272]}, "frame_index": {"min": [0], "max": [271], "mean": [135.5], "std": [78.51910595517501], "count": [272]}, "episode_index": {"min": [43], "max": [43], "mean": [43.0], "std": [0.0], "count": [272]}, "index": {"min": [11852], "max": [12123], "mean": [11987.5], "std": [78.51910595517501], "count": [272]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [272]}}} +{"episode_index": 44, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5302695456112133]], [[0.49005014636469824]], [[0.43622625373391544]]], "std": [[[0.30749294527163834]], [[0.2776764429363788]], [[0.24656081633880636]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5077513649136413]], [[0.4772871626311658]], [[0.4322372777602252]]], "std": [[[0.31117529647506964]], [[0.2852321571847729]], [[0.2648973772856934]]], "count": [100]}, "observation.state": {"min": [-0.2972610294818878, -0.07074043899774551, 0.9574880599975586, 2.265989065170288, -2.722623825073242, -1.158442497253418, 0.0037438746076077223, -0.04000860080122948], "max": [-0.0034785433672368526, 0.2813049852848053, 1.172992467880249, 3.4186229705810547, 0.002683329163119197, -0.08688816428184509, 0.040012262761592865, -0.009310987778007984], "mean": [-0.07683548331260681, 0.07407151907682419, 1.06270170211792, 2.761733055114746, -1.8757033348083496, -0.8130695819854736, 0.03181002289056778, -0.03239910677075386], "std": [0.08556823432445526, 0.11056338250637054, 0.06306196749210358, 0.35079166293144226, 0.8984358310699463, 0.29215988516807556, 0.013326888903975487, 0.012336206622421741], "count": [267]}, "action": {"min": [-0.7982142567634583, -0.7982142567634583, -0.6026785969734192, -0.12857143580913544, -0.1103571429848671, -0.32249999046325684, 0.0], "max": [0.7366071343421936, 0.6616071462631226, 0.5089285969734192, 0.17142857611179352, 0.1510714292526245, 0.2849999964237213, 1.0], "mean": [0.03004615567624569, 0.09945828467607498, -0.03364766389131546, 0.017664523795247078, 0.018603535369038582, 0.0036717401817440987, 0.7565543055534363], "std": [0.31494787335395813, 0.3190520107746124, 0.21442769467830658, 0.061420369893312454, 0.05295876786112785, 0.14991450309753418, 0.4291616380214691], "count": [267]}, "timestamp": {"min": [0.0], "max": [13.3], "mean": [6.65], "std": [3.8537860172389786], "count": [267]}, "frame_index": {"min": [0], "max": [266], "mean": [133.0], "std": [77.07572034477957], "count": [267]}, "episode_index": {"min": [44], "max": [44], "mean": [44.0], "std": [0.0], "count": [267]}, "index": {"min": [12124], "max": [12390], "mean": [12257.0], "std": [77.07572034477957], "count": [267]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [267]}}} +{"episode_index": 45, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[0.9882352941176471]]], "mean": [[[0.580810214771944]], [[0.544154208314185]], [[0.5081136833639706]]], "std": [[[0.24870193649353994]], [[0.22751170677641236]], [[0.2057014576468631]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5423907207414216]], [[0.507362393248315]], [[0.4587343235389859]]], "std": [[[0.3002934199191562]], [[0.2748693501418983]], [[0.2559005329440789]]], "count": [100]}, "observation.state": {"min": [-0.20724298059940338, -0.0762127935886383, 0.9282100796699524, 1.925032138824463, 0.001064478070475161, -0.08659974485635757, 0.007505342829972506, -0.04000840708613396], "max": [0.05438460037112236, 0.20927248895168304, 1.1781761646270752, 3.222498655319214, 2.6456758975982666, 0.8313912153244019, 0.03995728865265846, -0.0024532258976250887], "mean": [-0.07721584290266037, 0.0773121565580368, 1.047261118888855, 2.707068920135498, 1.439980387687683, 0.3509342670440674, 0.02930050902068615, -0.027028288692235947], "std": [0.10155998915433884, 0.1096096932888031, 0.08095232397317886, 0.4072638750076294, 0.9098979830741882, 0.3084476888179779, 0.012829616665840149, 0.014752678573131561], "count": [267]}, "action": {"min": [-0.27589285373687744, -0.6133928298950195, -0.7660714387893677, -0.12321428209543228, -0.16178570687770844, -0.0, 0.0], "max": [0.5946428775787354, 0.6508928537368774, 0.6535714268684387, 0.09535714238882065, 0.19607143104076385, 0.32678571343421936, 1.0], "mean": [0.04361957311630249, 0.05116371437907219, -0.055688198655843735, 0.002977528842166066, -0.009101124480366707, 0.05807382985949516, 0.6067415475845337], "std": [0.20573315024375916, 0.2934510111808777, 0.3361984193325043, 0.03744287043809891, 0.0683126226067543, 0.07905715703964233, 0.48847275972366333], "count": [267]}, "timestamp": {"min": [0.0], "max": [13.3], "mean": [6.65], "std": [3.8537860172389786], "count": [267]}, "frame_index": {"min": [0], "max": [266], "mean": [133.0], "std": [77.07572034477957], "count": [267]}, "episode_index": {"min": [45], "max": [45], "mean": [45.0], "std": [0.0], "count": [267]}, "index": {"min": [12391], "max": [12657], "mean": [12524.0], "std": [77.07572034477957], "count": [267]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [267]}}} +{"episode_index": 46, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5837233324237898]], [[0.5366886417164521]], [[0.48710039624980855]]], "std": [[[0.2868365985726086]], [[0.2597625819543898]], [[0.2302601368320045]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5708540068981695]], [[0.5322269873525581]], [[0.48190128640567553]]], "std": [[[0.2939656533886937]], [[0.2708180262320456]], [[0.2531883083545237]]], "count": [100]}, "observation.state": {"min": [-0.1921014040708542, -0.2990855872631073, 0.9986114501953125, 1.8325955867767334, -2.975451707839966, -0.5344735383987427, 0.006452698726207018, -0.040227971971035004], "max": [0.03073722869157791, 0.2052125781774521, 1.1890228986740112, 3.1434690952301025, -0.00047619189717806876, 0.022166553884744644, 0.040012557059526443, -0.00729736965149641], "mean": [-0.033141449093818665, -0.03945216163992882, 1.0964128971099854, 2.449772357940674, -2.3661322593688965, -0.20305213332176208, 0.026612000539898872, -0.027329111471772194], "std": [0.05351174995303154, 0.15433387458324432, 0.05572720617055893, 0.4136350750923157, 0.7765970230102539, 0.1359294354915619, 0.01442063320428133, 0.013766595162451267], "count": [409]}, "action": {"min": [-0.46875, -0.7633928656578064, -0.46875, -0.07821428775787354, -0.14571428298950195, -0.32892856001853943, 0.0], "max": [0.5651785731315613, 0.8008928298950195, 0.6508928537368774, 0.13178572058677673, 0.12964285910129547, 0.14678572118282318, 1.0], "mean": [0.0309181846678257, -0.027204861864447594, -0.03641941398382187, 0.004555533640086651, -0.003607230493798852, -0.0178658626973629, 0.567237138748169], "std": [0.20112188160419464, 0.34985268115997314, 0.23297476768493652, 0.03419295698404312, 0.04177800193428993, 0.10903187841176987, 0.49545782804489136], "count": [409]}, "timestamp": {"min": [0.0], "max": [20.4], "mean": [10.200000000000001], "std": [5.903388857258177], "count": [409]}, "frame_index": {"min": [0], "max": [408], "mean": [204.0], "std": [118.06777714516353], "count": [409]}, "episode_index": {"min": [46], "max": [46], "mean": [46.0], "std": [0.0], "count": [409]}, "index": {"min": [12658], "max": [13066], "mean": [12862.0], "std": [118.06777714516353], "count": [409]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [409]}}} +{"episode_index": 47, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.984313725490196]], [[0.996078431372549]]], "mean": [[[0.3695107260311351]], [[0.28562968534581806]], [[0.179167771283318]]], "std": [[[0.2063859365972242]], [[0.15358938411791637]], [[0.10005609204113057]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.984313725490196]], [[0.9764705882352941]]], "mean": [[[0.35521505797143077]], [[0.29955784337660846]], [[0.2245333359662224]]], "std": [[[0.14176148648083892]], [[0.13307451786571342]], [[0.14296849734022832]]], "count": [100]}, "observation.state": {"min": [-0.41812923550605774, -0.19096218049526215, 1.0111135244369507, 2.333421230316162, -2.100456476211548, -0.48845231533050537, 0.010262762196362019, -0.03990018740296364], "max": [-0.12366551905870438, 0.16216878592967987, 1.2984206676483154, 3.158435821533203, -0.0004173543129581958, -0.034045957028865814, 0.039946407079696655, -0.014679044485092163], "mean": [-0.22806893289089203, 0.006048764567822218, 1.17020583152771, 2.9249441623687744, -0.8816072344779968, -0.22353516519069672, 0.023706920444965363, -0.024090424180030823], "std": [0.07849271595478058, 0.13328976929187775, 0.08757807314395905, 0.2828037738800049, 0.5980980396270752, 0.15074998140335083, 0.012039470486342907, 0.011699489317834377], "count": [182]}, "action": {"min": [-0.6133928298950195, -0.6321428418159485, -0.9375, -0.13428571820259094, -0.08571428805589676, -0.14071428775787354, 0.0], "max": [0.5678571462631226, 0.44999998807907104, 0.8758928775787354, 0.047857142984867096, 0.09142857044935226, -0.0, 1.0], "mean": [-0.07398448884487152, -0.06359399110078812, -0.052011385560035706, -0.010451335459947586, 0.00027865293668583035, -0.06347331404685974, 0.34065935015678406], "std": [0.2742723226547241, 0.3066239356994629, 0.3916529417037964, 0.04398280382156372, 0.0395294688642025, 0.034604642540216446, 0.4739302098751068], "count": [182]}, "timestamp": {"min": [0.0], "max": [9.05], "mean": [4.5249999999999995], "std": [2.6269040713356855], "count": [182]}, "frame_index": {"min": [0], "max": [181], "mean": [90.5], "std": [52.53808142671371], "count": [182]}, "episode_index": {"min": [47], "max": [47], "mean": [47.0], "std": [0.0], "count": [182]}, "index": {"min": [13067], "max": [13248], "mean": [13157.5], "std": [52.53808142671371], "count": [182]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [182]}}} +{"episode_index": 48, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5583201275993797]], [[0.5250503540039062]], [[0.488401559268727]]], "std": [[[0.2723553374518518]], [[0.24823515264656792]], [[0.22450715732212284]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5420208847943474]], [[0.5067761661305147]], [[0.4582499718759574]]], "std": [[[0.30124211272110774]], [[0.27599263155735554]], [[0.25707414041289955]]], "count": [100]}, "observation.state": {"min": [-0.2136145383119583, -0.11327851563692093, 0.9283631443977356, 1.5913960933685303, -0.16839060187339783, -0.3457528054714203, 0.006480689160525799, -0.04001377895474434], "max": [0.1041034460067749, 0.20433911681175232, 1.1752899885177612, 3.214515447616577, 2.730602502822876, 0.7945433259010315, 0.04060038551688194, -0.006329602096229792], "mean": [-0.059079088270664215, 0.0440104603767395, 1.0512739419937134, 2.4507126808166504, 1.4382110834121704, 0.18970151245594025, 0.029177350923419, -0.028287237510085106], "std": [0.1310136914253235, 0.11808914691209793, 0.0783153772354126, 0.5528942942619324, 1.0197234153747559, 0.36774033308029175, 0.013765252195298672, 0.014024928212165833], "count": [278]}, "action": {"min": [-0.4821428656578064, -0.6616071462631226, -0.8035714030265808, -0.05999999865889549, -0.13178572058677673, -0.055714286863803864, 0.0], "max": [0.7821428775787354, 0.75, 0.8383928537368774, 0.12321428209543228, 0.1435714215040207, 0.375, 1.0], "mean": [0.018817445263266563, 0.07270685583353043, -0.10663219541311264, 0.007303446531295776, -0.0020657782442867756, 0.068991519510746, 0.6438848972320557], "std": [0.2710193991661072, 0.3178049623966217, 0.3666822612285614, 0.03276780992746353, 0.059594325721263885, 0.11012324690818787, 0.478850394487381], "count": [278]}, "timestamp": {"min": [0.0], "max": [13.85], "mean": [6.925000000000001], "std": [4.012558410789804], "count": [278]}, "frame_index": {"min": [0], "max": [277], "mean": [138.5], "std": [80.25116821579608], "count": [278]}, "episode_index": {"min": [48], "max": [48], "mean": [48.0], "std": [0.0], "count": [278]}, "index": {"min": [13249], "max": [13526], "mean": [13387.5], "std": [80.25116821579608], "count": [278]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [278]}}} +{"episode_index": 49, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5929281089633119]], [[0.5557060409246706]], [[0.5211444965437347]]], "std": [[[0.2558379686438702]], [[0.23622603946341564]], [[0.21745136022547745]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5400809966442631]], [[0.5051217783011642]], [[0.45632100901884187]]], "std": [[[0.30029962043360153]], [[0.2743900271500768]], [[0.2549958282524149]]], "count": [100]}, "observation.state": {"min": [-0.20272770524024963, -0.06351632624864578, 0.9586673974990845, 2.250710964202881, -0.014949646778404713, -0.11814732849597931, 0.0010797916911542416, -0.04000752791762352], "max": [0.06988104432821274, 0.20768500864505768, 1.1857151985168457, 3.198455572128296, 2.4283289909362793, 0.7435923218727112, 0.03995348513126373, 0.0006346299778670073], "mean": [-0.06851203739643097, 0.09866438806056976, 1.0588780641555786, 2.7685675621032715, 1.3638402223587036, 0.24504795670509338, 0.026241686195135117, -0.026519211009144783], "std": [0.09921639412641525, 0.09208077192306519, 0.07237635552883148, 0.35397395491600037, 0.9688377976417542, 0.28831714391708374, 0.015498215332627296, 0.015319948084652424], "count": [308]}, "action": {"min": [-0.46071428060531616, -0.7633928656578064, -0.9267857074737549, -0.10499999672174454, -0.13607142865657806, -0.1103571429848671, 0.0], "max": [0.7044642567634583, 0.7955357432365417, 0.7875000238418579, 0.1274999976158142, 0.20250000059604645, 0.375, 1.0], "mean": [0.0030177528969943523, 0.03727388754487038, -0.13370245695114136, 0.010884741321206093, 0.003374303225427866, 0.042157918214797974, 0.600649356842041], "std": [0.2500811517238617, 0.28994065523147583, 0.3828318119049072, 0.033612869679927826, 0.05853063613176346, 0.09309832751750946, 0.4897642135620117], "count": [308]}, "timestamp": {"min": [0.0], "max": [15.35], "mean": [7.674999999999999], "std": [4.4455736412751055], "count": [308]}, "frame_index": {"min": [0], "max": [307], "mean": [153.5], "std": [88.9114728255021], "count": [308]}, "episode_index": {"min": [49], "max": [49], "mean": [49.0], "std": [0.0], "count": [308]}, "index": {"min": [13527], "max": [13834], "mean": [13680.5], "std": [88.9114728255021], "count": [308]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [308]}}} +{"episode_index": 50, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5722403013939952]], [[0.537644297281901]], [[0.5002586729760263]]], "std": [[[0.2615485090790593]], [[0.23909609794188813]], [[0.2160090112510603]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5406836470061658]], [[0.5055566436169194]], [[0.4569775594075521]]], "std": [[[0.30011048763460774]], [[0.27447157873914635]], [[0.25516707380069686]]], "count": [100]}, "observation.state": {"min": [-0.23131108283996582, -0.0960593968629837, 0.9272180199623108, 1.328231692314148, -0.02214929461479187, -0.24675175547599792, 0.007219207938760519, -0.04001501575112343], "max": [0.08352973312139511, 0.20649650692939758, 1.181512713432312, 3.1564643383026123, 3.187884569168091, 0.6820423007011414, 0.040257420390844345, -0.002803660463541746], "mean": [-0.07691127806901932, 0.06822250783443451, 1.0475916862487793, 2.455838680267334, 1.6877521276474, 0.19624389708042145, 0.027191339060664177, -0.026215484365820885], "std": [0.128305122256279, 0.11195819079875946, 0.08421681076288223, 0.536834716796875, 1.1501299142837524, 0.2666434347629547, 0.014035847038030624, 0.014777803793549538], "count": [290]}, "action": {"min": [-0.3375000059604645, -0.6589285731315613, -0.7205356955528259, -0.025714285671710968, -0.18214285373687744, -0.017142856493592262, 0.0], "max": [0.7741071581840515, 0.5973214507102966, 0.9375, 0.09964285790920258, 0.14785714447498322, 0.3610714375972748, 1.0], "mean": [0.0362069346010685, 0.0521397739648819, -0.07517548650503159, 0.013873147778213024, -0.009487684816122055, 0.072620689868927, 0.568965494632721], "std": [0.2579517364501953, 0.27510738372802734, 0.3488174080848694, 0.023178383708000183, 0.06767348200082779, 0.10481540858745575, 0.49522119760513306], "count": [290]}, "timestamp": {"min": [0.0], "max": [14.45], "mean": [7.225], "std": [4.185764565763344], "count": [290]}, "frame_index": {"min": [0], "max": [289], "mean": [144.5], "std": [83.7152913152669], "count": [290]}, "episode_index": {"min": [50], "max": [50], "mean": [50.0], "std": [0.0], "count": [290]}, "index": {"min": [13835], "max": [14124], "mean": [13979.5], "std": [83.7152913152669], "count": [290]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [290]}}} +{"episode_index": 51, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5788688408346737]], [[0.5300091768152574]], [[0.4812092710008808]]], "std": [[[0.2852517019098113]], [[0.2589728826362774]], [[0.22924993055977835]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5682237710391774]], [[0.5298566326066559]], [[0.47982183897729014]]], "std": [[[0.296234617537728]], [[0.2731078792165465]], [[0.255595382611232]]], "count": [100]}, "observation.state": {"min": [-0.20455476641654968, -0.25108811259269714, 0.9917598962783813, 2.2495744228363037, -2.7544753551483154, -1.2758824825286865, 0.001766069559380412, -0.04046178236603737], "max": [0.11863517016172409, 0.1957719773054123, 1.1978715658187866, 3.261146068572998, 0.0015468030469492078, -0.07533054053783417, 0.04001026973128319, -0.007852488197386265], "mean": [-0.016642404720187187, -0.03266791254281998, 1.1065971851348877, 2.6913704872131348, -2.061096668243408, -0.6902689337730408, 0.02599852718412876, -0.02670481614768505], "std": [0.0765448659658432, 0.13473892211914062, 0.05986138805747032, 0.29851728677749634, 0.7068416476249695, 0.2983146905899048, 0.014869607985019684, 0.014573959633708], "count": [404]}, "action": {"min": [-0.5571428537368774, -0.6803571581840515, -0.5357142686843872, -0.12857143580913544, -0.1371428519487381, -0.2817857265472412, 0.0], "max": [0.5464285612106323, 0.6642857193946838, 0.6187499761581421, 0.10821428894996643, 0.14571428298950195, 0.16285714507102966, 1.0], "mean": [0.037818294018507004, -0.03171189874410629, -0.041836101561784744, 0.0041186390444636345, 0.0016416213475167751, -0.019463397562503815, 0.5569307208061218], "std": [0.22137786448001862, 0.32593703269958496, 0.26426029205322266, 0.04184707626700401, 0.04509567841887474, 0.09660791605710983, 0.49674907326698303], "count": [404]}, "timestamp": {"min": [0.0], "max": [20.15], "mean": [10.075000000000001], "std": [5.831219855227549], "count": [404]}, "frame_index": {"min": [0], "max": [403], "mean": [201.5], "std": [116.62439710455098], "count": [404]}, "episode_index": {"min": [51], "max": [51], "mean": [51.0], "std": [0.0], "count": [404]}, "index": {"min": [14125], "max": [14528], "mean": [14326.5], "std": [116.62439710455098], "count": [404]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [404]}}} +{"episode_index": 52, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3531218848134957]], [[0.2896806724398744]], [[0.2503031562356388]]], "std": [[[0.15629474690216397]], [[0.16010584352453708]], [[0.1683513927050079]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3259911056219363]], [[0.2809415564443551]], [[0.2512144302667356]]], "std": [[[0.162540798436084]], [[0.17785222063266723]], [[0.18853192552813827]]], "count": [100]}, "observation.state": {"min": [-0.12711776793003082, -0.15211734175682068, 0.44669806957244873, 3.0327870845794678, -0.33925262093544006, -0.2995469272136688, 0.0009586326195858419, -0.03988521173596382], "max": [0.16922980546951294, 0.09920684248209, 0.6798499822616577, 3.1582870483398438, 0.6334183216094971, 0.1254725605249405, 0.039842959493398666, -0.0014808988198637962], "mean": [0.022232893854379654, -0.006004591938108206, 0.5591936707496643, 3.105095863342285, 0.17470045387744904, -0.0625566840171814, 0.023947784677147865, -0.02401123009622097], "std": [0.10080445557832718, 0.09042394161224365, 0.0642475113272667, 0.03467528522014618, 0.2966111898422241, 0.11226193606853485, 0.01563037559390068, 0.015858005732297897], "count": [237]}, "action": {"min": [-0.5678571462631226, -0.4848214387893677, -0.581250011920929, -0.04714285582304001, -0.14785714447498322, -0.0835714265704155, 0.0], "max": [0.8812500238418579, 0.4848214387893677, 0.43660715222358704, 0.04178571328520775, 0.09214285761117935, 0.09535714238882065, 1.0], "mean": [0.05878162756562233, 0.027881992980837822, -0.08739825338125229, -0.001179927377961576, 0.0020072339102625847, -0.007757691666483879, 0.4556961953639984], "std": [0.3538356125354767, 0.20346558094024658, 0.2814084589481354, 0.01647777110338211, 0.05209949612617493, 0.042778030037879944, 0.49803397059440613], "count": [237]}, "timestamp": {"min": [0.0], "max": [11.8], "mean": [5.8999999999999995], "std": [3.4207698938494335], "count": [237]}, "frame_index": {"min": [0], "max": [236], "mean": [118.0], "std": [68.41539787698868], "count": [237]}, "episode_index": {"min": [52], "max": [52], "mean": [52.0], "std": [0.0], "count": [237]}, "index": {"min": [14529], "max": [14765], "mean": [14647.0], "std": [68.41539787698868], "count": [237]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [237]}}} +{"episode_index": 53, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3315861912147672]], [[0.2680631881414675]], [[0.2304054355995328]]], "std": [[[0.15398300779366322]], [[0.15180486209921218]], [[0.1612780969925488]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3251469241871553]], [[0.2821701929428998]], [[0.24940929218367033]]], "std": [[[0.16534074526049994]], [[0.1800618444806971]], [[0.18978414228032964]]], "count": [100]}, "observation.state": {"min": [-0.04874073341488838, -0.19980542361736298, 0.446380615234375, 3.0820188522338867, -0.6528028249740601, -0.48203665018081665, 0.019443288445472717, -0.039898570626974106], "max": [0.12120665609836578, 0.26595786213874817, 0.6913164854049683, 3.1741080284118652, 0.0011977660469710827, 0.004395626951009035, 0.040204767137765884, -0.019515033811330795], "mean": [0.03678283840417862, 0.04535892233252525, 0.5910581946372986, 3.123978853225708, -0.28957438468933105, -0.19241532683372498, 0.030034096911549568, -0.029981497675180435], "std": [0.055370792746543884, 0.1600138545036316, 0.07336558401584625, 0.023837860673666, 0.15361686050891876, 0.11997275799512863, 0.008701229467988014, 0.00920790620148182], "count": [242]}, "action": {"min": [-0.7821428775787354, -0.7633928656578064, -0.9375, -0.05464285612106323, -0.11464285850524902, -0.11785714328289032, 0.0], "max": [0.6642857193946838, 0.8598214387893677, 0.9375, 0.08464285731315613, 0.12428571283817291, 0.14678572118282318, 1.0], "mean": [-0.008910124190151691, 0.07956020534038544, -0.04780475050210953, 0.0026431523729115725, 0.0038031279109418392, 0.0009873121744021773, 0.5330578684806824], "std": [0.32141831517219543, 0.4529930651187897, 0.47926104068756104, 0.018029773607850075, 0.04698198288679123, 0.05927359685301781, 0.4989062547683716], "count": [242]}, "timestamp": {"min": [0.0], "max": [12.05], "mean": [6.0249999999999995], "std": [3.4929393066585055], "count": [242]}, "frame_index": {"min": [0], "max": [241], "mean": [120.5], "std": [69.85878613317011], "count": [242]}, "episode_index": {"min": [53], "max": [53], "mean": [53.0], "std": [0.0], "count": [242]}, "index": {"min": [14766], "max": [15007], "mean": [14886.5], "std": [69.85878613317011], "count": [242]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [242]}}} +{"episode_index": 54, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5843931011125153]], [[0.5357722850126378]], [[0.48638092759076285]]], "std": [[[0.28469871892798576]], [[0.2584619531132668]], [[0.22879640827763773]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5673954647288603]], [[0.529488499061734]], [[0.4799631748573453]]], "std": [[[0.2969666571298196]], [[0.2740063142986055]], [[0.25650008220733767]]], "count": [100]}, "observation.state": {"min": [-0.2076578289270401, -0.304193377494812, 0.9912784099578857, 1.9186934232711792, -3.112234354019165, -1.0699607133865356, 0.005605041049420834, -0.04001861438155174], "max": [0.10097736865282059, 0.2057051658630371, 1.1852502822875977, 3.1787402629852295, 0.0005248273373581469, -0.09354915469884872, 0.040007445961236954, -0.006983354687690735], "mean": [-0.020992230623960495, -0.04653847962617874, 1.0918409824371338, 2.6234827041625977, -2.060239553451538, -0.7281549572944641, 0.02793213352560997, -0.030702272430062294], "std": [0.06364110857248306, 0.15218517184257507, 0.05750428885221481, 0.3591836094856262, 0.773352324962616, 0.22486408054828644, 0.013563140295445919, 0.012901362963020802], "count": [401]}, "action": {"min": [-0.2919642925262451, -0.8892857432365417, -0.46339285373687744, -0.07285714149475098, -0.08142857253551483, -0.29571428894996643, 0.0], "max": [0.5866071581840515, 0.731249988079071, 0.48750001192092896, 0.09964285790920258, 0.1435714215040207, 0.1842857152223587, 1.0], "mean": [0.05008462443947792, -0.025570010766386986, -0.03654482588171959, 0.004424651153385639, 0.009177944622933865, -0.015109567902982235, 0.5635910034179688], "std": [0.19120065867900848, 0.3696383535861969, 0.2131006419658661, 0.03145212307572365, 0.05090063810348511, 0.11195769160985947, 0.4959394633769989], "count": [401]}, "timestamp": {"min": [0.0], "max": [20.0], "mean": [10.0], "std": [5.787918451395113], "count": [401]}, "frame_index": {"min": [0], "max": [400], "mean": [200.0], "std": [115.75836902790225], "count": [401]}, "episode_index": {"min": [54], "max": [54], "mean": [54.0], "std": [0.0], "count": [401]}, "index": {"min": [15008], "max": [15408], "mean": [15208.0], "std": [115.75836902790225], "count": [401]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [401]}}} +{"episode_index": 55, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.984313725490196]], [[0.9921568627450981]]], "mean": [[[0.3397681364171645]], [[0.2620065540986903]], [[0.16427682913985905]]], "std": [[[0.20950480342893416]], [[0.15445329934600585]], [[0.0959045326239232]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9647058823529412]], [[0.9647058823529412]], [[0.9647058823529412]]], "mean": [[[0.3533355288038067]], [[0.29763638126148895]], [[0.22245848951152725]]], "std": [[[0.14262902417103987]], [[0.13298333742632573]], [[0.14194376142807655]]], "count": [100]}, "observation.state": {"min": [-0.4475644528865814, -0.17970147728919983, 0.9870676398277283, 2.3038532733917236, -2.1609294414520264, -0.2344549596309662, 0.006755343172699213, -0.03990848362445831], "max": [-0.17373041808605194, 0.15841786563396454, 1.260928988456726, 3.148171901702881, 0.003790331771597266, -0.059583958238363266, 0.03995725139975548, -0.014507525600492954], "mean": [-0.28738465905189514, 0.0010560418013483286, 1.1564277410507202, 2.87485671043396, -1.1220569610595703, -0.13221734762191772, 0.024127762764692307, -0.025148985907435417], "std": [0.08510780334472656, 0.13250090181827545, 0.07658258080482483, 0.2803986072540283, 0.685035228729248, 0.05163438990712166, 0.012385894544422626, 0.01168464869260788], "count": [178]}, "action": {"min": [-0.6937500238418579, -0.5946428775787354, -0.8919642567634583, -0.07071428745985031, -0.03285714238882065, -0.16857142746448517, 0.0], "max": [0.43392857909202576, 0.46071428060531616, 0.9375, 0.029285714030265808, 0.04357142746448517, 0.007857142947614193, 1.0], "mean": [-0.10317015647888184, -0.05308986082673073, -0.08503710478544235, -0.003190208924934268, 0.002512039616703987, -0.06905295699834824, 0.3651685416698456], "std": [0.25028491020202637, 0.31110408902168274, 0.4189763069152832, 0.017305800691246986, 0.017431236803531647, 0.04663058742880821, 0.48147693276405334], "count": [178]}, "timestamp": {"min": [0.0], "max": [8.85], "mean": [4.425], "std": [2.569168153313442], "count": [178]}, "frame_index": {"min": [0], "max": [177], "mean": [88.5], "std": [51.383363066268835], "count": [178]}, "episode_index": {"min": [55], "max": [55], "mean": [55.0], "std": [0.0], "count": [178]}, "index": {"min": [15409], "max": [15586], "mean": [15497.5], "std": [51.383363066268835], "count": [178]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [178]}}} +{"episode_index": 56, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32583698945886946]], [[0.25585829491708795]], [[0.21167763444489124]]], "std": [[[0.14448840743478056]], [[0.13614160545035514]], [[0.1357937221214982]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32759410005457257]], [[0.2841854642980239]], [[0.25166056135589]]], "std": [[[0.1719800621187533]], [[0.18632876682633967]], [[0.19561415108092656]]], "count": [100]}, "observation.state": {"min": [-0.03443831577897072, -0.23736856877803802, 0.4474790394306183, 3.035893201828003, -0.5238776206970215, -0.718462347984314, 0.001121553243137896, -0.03999263793230057], "max": [0.16282936930656433, 0.24303583800792694, 0.694762647151947, 3.1802124977111816, 0.06666438281536102, -0.0500623881816864, 0.04029271379113197, -0.0011256065918132663], "mean": [0.0776800736784935, 0.019650496542453766, 0.5815796256065369, 3.131756067276001, -0.16562451422214508, -0.30711591243743896, 0.029174543917179108, -0.02857835590839386], "std": [0.05088163912296295, 0.15395960211753845, 0.08695350587368011, 0.03682032972574234, 0.15809181332588196, 0.20655657351016998, 0.009949162602424622, 0.010592016391456127], "count": [310]}, "action": {"min": [-0.6053571701049805, -0.7982142567634583, -0.6991071701049805, -0.06642857193946838, -0.15642857551574707, -0.11678571254014969, 0.0], "max": [0.5544642806053162, 0.8732143044471741, 0.9375, 0.10499999672174454, 0.12642857432365417, 0.14571428298950195, 1.0], "mean": [-0.005262101534754038, 0.06743954867124557, -0.05082373693585396, 0.00133064528927207, 0.009432027116417885, 0.004862901289016008, 0.5096774101257324], "std": [0.2665177881717682, 0.4252481758594513, 0.4298948347568512, 0.02589116431772709, 0.04645257443189621, 0.05198725312948227, 0.4999067783355713], "count": [310]}, "timestamp": {"min": [0.0], "max": [15.45], "mean": [7.725], "std": [4.474441305906247], "count": [310]}, "frame_index": {"min": [0], "max": [309], "mean": [154.5], "std": [89.48882611812493], "count": [310]}, "episode_index": {"min": [56], "max": [56], "mean": [56.0], "std": [0.0], "count": [310]}, "index": {"min": [15587], "max": [15896], "mean": [15741.5], "std": [89.48882611812493], "count": [310]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [310]}}} +{"episode_index": 57, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5822802746342677]], [[0.5339236863080192]], [[0.48468762925091907]]], "std": [[[0.28432578024236743]], [[0.25740930733113104]], [[0.22769520284820124]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5703627301384421]], [[0.5320119754566867]], [[0.48217916570925246]]], "std": [[[0.2965455167286258]], [[0.2737718971844817]], [[0.2565685915764106]]], "count": [100]}, "observation.state": {"min": [-0.2093721330165863, -0.28553441166877747, 1.0018606185913086, 1.7159775495529175, -3.1468474864959717, -0.8755844235420227, 0.0013460343470796943, -0.04000558704137802], "max": [0.10536620765924454, 0.19915026426315308, 1.1822892427444458, 3.210292100906372, 0.0023418311029672623, -0.08280976861715317, 0.0400095134973526, -0.008890877477824688], "mean": [-0.030057409778237343, -0.05691967159509659, 1.09516179561615, 2.391561508178711, -2.298736095428467, -0.5248050093650818, 0.025502324104309082, -0.027036579325795174], "std": [0.07620877027511597, 0.13741400837898254, 0.05469459667801857, 0.5349310636520386, 0.8830360770225525, 0.20655512809753418, 0.01507268100976944, 0.01383961271494627], "count": [368]}, "action": {"min": [-0.3375000059604645, -0.768750011920929, -0.6723214387893677, -0.1307142823934555, -0.09642857313156128, -0.2046428620815277, 0.0], "max": [0.637499988079071, 0.8357142806053162, 0.6401785612106323, 0.08571428805589676, 0.09428571164608002, 0.2539285719394684, 1.0], "mean": [0.0385189987719059, -0.03462490066885948, -0.05039789527654648, 0.0040964712388813496, -0.0008414238691329956, -0.015896720811724663, 0.5461956262588501], "std": [0.2386380136013031, 0.3733302354812622, 0.286827027797699, 0.041800837963819504, 0.03774700686335564, 0.10818018019199371, 0.49786242842674255], "count": [368]}, "timestamp": {"min": [0.0], "max": [18.35], "mean": [9.174999999999999], "std": [5.311602865425841], "count": [368]}, "frame_index": {"min": [0], "max": [367], "mean": [183.5], "std": [106.23205730851681], "count": [368]}, "episode_index": {"min": [57], "max": [57], "mean": [57.0], "std": [0.0], "count": [368]}, "index": {"min": [15897], "max": [16264], "mean": [16080.5], "std": [106.23205730851681], "count": [368]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [368]}}} +{"episode_index": 58, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3567780833524816]], [[0.29251363477519915]], [[0.2492321460200291]]], "std": [[[0.14827114120605409]], [[0.15109950048121668]], [[0.15876526303749472]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.313943229525697]], [[0.2645514107498468]], [[0.23118788057215073]]], "std": [[[0.14856497507518793]], [[0.16217233654316668]], [[0.17079715187712793]]], "count": [100]}, "observation.state": {"min": [-0.1455492228269577, -0.26800259947776794, 0.5059259533882141, 2.9093799591064453, -0.008846708573400974, -0.15764357149600983, 0.001511527574621141, -0.039994824677705765], "max": [0.04309936985373497, 0.3736788332462311, 0.6767683029174805, 3.1496846675872803, 0.7479108572006226, 0.21438466012477875, 0.03985472768545151, -0.0014335571322590113], "mean": [-0.03850867226719856, 0.010846525430679321, 0.5796821117401123, 3.0305566787719727, 0.4561924934387207, 0.007318187039345503, 0.021190116181969643, -0.02072027325630188], "std": [0.05578411743044853, 0.20949916541576385, 0.04831784963607788, 0.07171628624200821, 0.24098192155361176, 0.11145440489053726, 0.016964420676231384, 0.01709715463221073], "count": [253]}, "action": {"min": [-0.543749988079071, -0.5062500238418579, -0.6000000238418579, -0.05892857164144516, -0.15214285254478455, -0.0503571443259716, 0.0], "max": [0.9375, 0.8357142806053162, 0.75, 0.04392857104539871, 0.10928571224212646, 0.0835714265704155, 1.0], "mean": [0.022794317454099655, 0.10922855138778687, -0.05466192588210106, -0.00165584497153759, -0.00013975157344248146, 0.01306042168289423, 0.4624505937099457], "std": [0.3100983202457428, 0.3680838644504547, 0.3187708854675293, 0.01637623831629753, 0.04519414156675339, 0.024306366220116615, 0.4985879361629486], "count": [253]}, "timestamp": {"min": [0.0], "max": [12.6], "mean": [6.300000000000001], "std": [3.651711927302043], "count": [253]}, "frame_index": {"min": [0], "max": [252], "mean": [126.0], "std": [73.03423854604085], "count": [253]}, "episode_index": {"min": [58], "max": [58], "mean": [58.0], "std": [0.0], "count": [253]}, "index": {"min": [16265], "max": [16517], "mean": [16391.0], "std": [73.03423854604085], "count": [253]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [253]}}} +{"episode_index": 59, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5382146444881664]], [[0.4975402419146369]], [[0.44484398396809893]]], "std": [[[0.30544828683549463]], [[0.27582261841006345]], [[0.245786612505056]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5166291061102176]], [[0.48459456679400276]], [[0.4381010173722809]]], "std": [[[0.3099865545251257]], [[0.28335013030732137]], [[0.2621071421932193]]], "count": [100]}, "observation.state": {"min": [-0.3425541818141937, -0.06830357015132904, 0.960265576839447, 2.139331102371216, -2.7397379875183105, -1.0518720149993896, 0.007032903376966715, -0.040006719529628754], "max": [-0.001563193742185831, 0.2801876366138458, 1.1675609350204468, 3.3953027725219727, -6.555932486662641e-05, -0.0862937942147255, 0.040012359619140625, -0.009337819181382656], "mean": [-0.09531079977750778, 0.10175307095050812, 1.0638107061386108, 2.8232383728027344, -1.9253915548324585, -0.6672970056533813, 0.032792527228593826, -0.0329839363694191], "std": [0.09740053117275238, 0.12033236026763916, 0.06106826663017273, 0.3354954123497009, 0.77443528175354, 0.27119123935699463, 0.012486958876252174, 0.01198613177984953], "count": [224]}, "action": {"min": [-0.7982142567634583, -0.6428571343421936, -0.5866071581840515, -0.1039285734295845, -0.09749999642372131, -0.24535714089870453, 0.0], "max": [0.9375, 0.7526785731315613, 0.46339285373687744, 0.17571428418159485, 0.21642857789993286, 0.2046428620815277, 1.0], "mean": [0.041278693825006485, 0.14307639002799988, -0.0411471463739872, 0.013914219103753567, 0.03150669485330582, -0.025786017999053, 0.7857142686843872], "std": [0.42481106519699097, 0.36416053771972656, 0.23269906640052795, 0.07052382081747055, 0.06728339940309525, 0.1181524321436882, 0.4103255569934845], "count": [224]}, "timestamp": {"min": [0.0], "max": [11.15], "mean": [5.575], "std": [3.2331292890943906], "count": [224]}, "frame_index": {"min": [0], "max": [223], "mean": [111.5], "std": [64.66258578188781], "count": [224]}, "episode_index": {"min": [59], "max": [59], "mean": [59.0], "std": [0.0], "count": [224]}, "index": {"min": [16518], "max": [16741], "mean": [16629.5], "std": [64.66258578188781], "count": [224]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [224]}}} +{"episode_index": 60, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.356699172076057]], [[0.2908870741900276]], [[0.24881467273188573]]], "std": [[[0.15766515998295758]], [[0.15602066315832958]], [[0.15764204609150265]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3273410225662531]], [[0.28360000370998006]], [[0.25049272484872853]]], "std": [[[0.17160979058272316]], [[0.18689555730570495]], [[0.19713376710567404]]], "count": [100]}, "observation.state": {"min": [-0.07595159113407135, -0.22354601323604584, 0.44640979170799255, 2.924354076385498, -0.545099675655365, -0.4912358820438385, 0.01541468407958746, -0.039839014410972595], "max": [0.1160709336400032, 0.32510074973106384, 0.6790595054626465, 3.207284450531006, 0.1146019771695137, 0.4823921024799347, 0.040181130170822144, -0.009531840682029724], "mean": [0.03262442722916603, 0.060850657522678375, 0.5899084210395813, 3.116694450378418, -0.09417130053043365, 0.004874546080827713, 0.02889295294880867, -0.029871705919504166], "std": [0.05724838003516197, 0.18139134347438812, 0.0733395591378212, 0.06825936585664749, 0.14075450599193573, 0.24594469368457794, 0.009640922769904137, 0.009037554264068604], "count": [250]}, "action": {"min": [-0.4419642984867096, -0.8946428298950195, -0.8491071462631226, -0.1307142823934555, -0.14785714447498322, -0.12107142806053162, 0.0], "max": [0.5732142925262451, 0.8598214387893677, 0.9375, 0.06428571790456772, 0.2239285707473755, 0.0771428570151329, 1.0], "mean": [0.005528584588319063, 0.10588928312063217, -0.034671440720558167, -0.0009471415542066097, 0.003805715823546052, -0.011507142335176468, 0.492000013589859], "std": [0.2899857759475708, 0.48730388283729553, 0.4480613172054291, 0.03031785972416401, 0.08184073120355606, 0.041721161454916, 0.4999362826347351], "count": [250]}, "timestamp": {"min": [0.0], "max": [12.45], "mean": [6.225], "std": [3.6084103148062305], "count": [250]}, "frame_index": {"min": [0], "max": [249], "mean": [124.5], "std": [72.16820629612461], "count": [250]}, "episode_index": {"min": [60], "max": [60], "mean": [60.0], "std": [0.0], "count": [250]}, "index": {"min": [16742], "max": [16991], "mean": [16866.5], "std": [72.16820629612461], "count": [250]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [250]}}} +{"episode_index": 61, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[1.0]], [[1.0]]], "mean": [[[0.33444409957586546]], [[0.26021014703488815]], [[0.16540949802772673]]], "std": [[[0.2165881630051165]], [[0.16135503764805278]], [[0.10378416923021448]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.9764705882352941]], [[0.9764705882352941]]], "mean": [[[0.3568868587718291]], [[0.3010700282676547]], [[0.2254262461942785]]], "std": [[[0.1402999559977702]], [[0.13195805869196078]], [[0.14270896872963468]]], "count": [100]}, "observation.state": {"min": [-0.4623863101005554, -0.15594036877155304, 0.9964094161987305, 2.4287619590759277, -2.14424729347229, -0.4241670072078705, 0.010625846683979034, -0.039909131824970245], "max": [-0.1637992262840271, 0.13659587502479553, 1.250014066696167, 3.146778106689453, 0.0009580546175129712, 0.051839135587215424, 0.03992345184087753, -0.014569872058928013], "mean": [-0.24227412045001984, -0.007729192730039358, 1.1501861810684204, 2.937056541442871, -0.9379749894142151, -0.2645033001899719, 0.023526020348072052, -0.024070395156741142], "std": [0.08055765181779861, 0.10453004390001297, 0.08277247101068497, 0.2476426362991333, 0.7423377633094788, 0.1135314330458641, 0.011964554898440838, 0.011609401553869247], "count": [180]}, "action": {"min": [-0.8678571581840515, -0.6803571581840515, -0.9375, -0.0892857164144516, -0.06928571313619614, -0.207857146859169, 0.0], "max": [0.5517857074737549, 0.46339285373687744, 0.9375, 0.058571428060531616, 0.07642856985330582, 0.009285714477300644, 1.0], "mean": [-0.10787203162908554, -0.04752976447343826, -0.07364583760499954, -0.006559524219483137, 0.002226191805675626, -0.06809920072555542, 0.3333333432674408], "std": [0.32393452525138855, 0.29592207074165344, 0.39123284816741943, 0.026682337746024132, 0.025792889297008514, 0.05771176144480705, 0.4714042544364929], "count": [180]}, "timestamp": {"min": [0.0], "max": [8.95], "mean": [4.475], "std": [2.598036117275252], "count": [180]}, "frame_index": {"min": [0], "max": [179], "mean": [89.5], "std": [51.96072234550504], "count": [180]}, "episode_index": {"min": [61], "max": [61], "mean": [61.0], "std": [0.0], "count": [180]}, "index": {"min": [16992], "max": [17171], "mean": [17081.5], "std": [51.96072234550504], "count": [180]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [180]}}} +{"episode_index": 62, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33723706892424943]], [[0.27143040855258116]], [[0.2318977242264093]]], "std": [[[0.14460904650842857]], [[0.1460580189128151]], [[0.15341490364046034]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3193718291637944]], [[0.2730124290316712]], [[0.24254235959520526]]], "std": [[[0.15395416725212627]], [[0.1690588044085981]], [[0.17942725755008965]]], "count": [100]}, "observation.state": {"min": [-0.13740597665309906, -0.13253171741962433, 0.44647541642189026, 2.8787384033203125, -0.21724086999893188, -0.28580114245414734, 0.002551138633862138, -0.03987705335021019], "max": [0.1327992081642151, 0.13571923971176147, 0.679147481918335, 3.145350933074951, 0.7155779600143433, 0.14848953485488892, 0.03985189273953438, -0.00284761399962008], "mean": [-0.009345307014882565, 0.028693286702036858, 0.5458967685699463, 3.0754544734954834, 0.18449439108371735, -0.1332738846540451, 0.025547979399561882, -0.023966988548636436], "std": [0.07965974509716034, 0.09437711536884308, 0.0765434131026268, 0.0773806944489479, 0.3478833734989166, 0.09946724027395248, 0.015041951090097427, 0.014983966015279293], "count": [251]}, "action": {"min": [-0.49017858505249023, -0.4312500059604645, -0.5383928418159485, -0.06535714119672775, -0.12214285880327225, -0.12321428209543228, 0.0], "max": [0.8303571343421936, 0.43392857909202576, 0.5249999761581421, 0.09428571164608002, 0.08571428805589676, 0.13285714387893677, 1.0], "mean": [0.04468199238181114, 0.022271642461419106, -0.10535002499818802, 0.0024971552193164825, 0.002283722860738635, -0.005280309822410345, 0.4501992166042328], "std": [0.3424879312515259, 0.19371971487998962, 0.2736053764820099, 0.028408033773303032, 0.04193875566124916, 0.05448135733604431, 0.49751320481300354], "count": [251]}, "timestamp": {"min": [0.0], "max": [12.5], "mean": [6.25], "std": [3.6228441865473595], "count": [251]}, "frame_index": {"min": [0], "max": [250], "mean": [125.0], "std": [72.4568837309472], "count": [251]}, "episode_index": {"min": [62], "max": [62], "mean": [62.0], "std": [0.0], "count": [251]}, "index": {"min": [17172], "max": [17422], "mean": [17297.0], "std": [72.4568837309472], "count": [251]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [251]}}} +{"episode_index": 63, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3202436643114277]], [[0.25874691892137713]], [[0.22109852450501685]]], "std": [[[0.13311246695070872]], [[0.12484412667649851]], [[0.12626133492139538]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31754083910175396]], [[0.2728589686973422]], [[0.2402376355937883]]], "std": [[[0.15926675493105366]], [[0.17485327640964105]], [[0.18355439450010924]]], "count": [100]}, "observation.state": {"min": [-0.13386140763759613, -0.10230591148138046, 0.44867441058158875, 3.0666887760162354, -0.5594872236251831, -0.36551401019096375, 0.022823555395007133, -0.039901770651340485], "max": [0.11358555406332016, 0.2721460163593292, 0.7192884087562561, 3.1835782527923584, 0.0030223452486097813, 0.276407927274704, 0.03993820771574974, -0.015003886073827744], "mean": [0.0009445456671528518, 0.07584329694509506, 0.6142354011535645, 3.136223554611206, -0.3732115924358368, -0.09756230562925339, 0.03387356922030449, -0.032358359545469284], "std": [0.06533205509185791, 0.1308571696281433, 0.07958729565143585, 0.03187132626771927, 0.13678081333637238, 0.21334606409072876, 0.006099609658122063, 0.008419233374297619], "count": [248]}, "action": {"min": [-0.48750001192092896, -0.8571428656578064, -0.8464285731315613, -0.05464285612106323, -0.17678570747375488, -0.12964285910129547, 0.0], "max": [0.7741071581840515, 0.8491071462631226, 0.9375, 0.06428571790456772, 0.07392857223749161, 0.08892857283353806, 1.0], "mean": [0.031030377373099327, 0.07452479004859924, -0.016017422080039978, 0.001205357490107417, -0.0035858305636793375, -0.00784562062472105, 0.5725806355476379], "std": [0.2948841154575348, 0.4046621322631836, 0.4659256041049957, 0.020405646413564682, 0.04002897068858147, 0.04029254615306854, 0.4947039783000946], "count": [248]}, "timestamp": {"min": [0.0], "max": [12.35], "mean": [6.175], "std": [3.579542568541405], "count": [248]}, "frame_index": {"min": [0], "max": [247], "mean": [123.5], "std": [71.5908513708281], "count": [248]}, "episode_index": {"min": [63], "max": [63], "mean": [63.0], "std": [0.0], "count": [248]}, "index": {"min": [17423], "max": [17670], "mean": [17546.5], "std": [71.5908513708281], "count": [248]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [248]}}} +{"episode_index": 64, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9803921568627451]], [[0.984313725490196]]], "mean": [[[0.3347445780436198]], [[0.25906887218998925]], [[0.1637806151146982]]], "std": [[[0.21407182774907746]], [[0.1582875858293146]], [[0.09883862573986003]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3546280056822534]], [[0.29852341715494796]], [[0.2227645580815334]]], "std": [[[0.1408747280583269]], [[0.13174114005150028]], [[0.14132618152073467]]], "count": [100]}, "observation.state": {"min": [-0.440064400434494, -0.16027894616127014, 0.9860338568687439, 2.12373685836792, -2.2831504344940186, -0.38507023453712463, 0.01280201692134142, -0.03995442017912865], "max": [-0.1888241320848465, 0.1762412041425705, 1.3008108139038086, 3.142292022705078, 0.005425828043371439, -0.024931369349360466, 0.039942461997270584, -0.014916677959263325], "mean": [-0.25521567463874817, 0.012891891412436962, 1.1577054262161255, 2.7377867698669434, -1.2415087223052979, -0.16823741793632507, 0.02451036125421524, -0.025337181985378265], "std": [0.06636684387922287, 0.12748052179813385, 0.0894288644194603, 0.3602607250213623, 0.7630550861358643, 0.13300886750221252, 0.012288913130760193, 0.011661602184176445], "count": [189]}, "action": {"min": [-0.42053571343421936, -0.6508928537368774, -0.5892857313156128, -0.05214285850524902, -0.02500000037252903, -0.17928571999073029, 0.0], "max": [0.42321428656578064, 0.44999998807907104, 0.8732143044471741, 0.0714285746216774, 0.06499999761581421, 0.009999999776482582, 1.0], "mean": [-0.06133785471320152, -0.061663851141929626, -0.05121881514787674, -0.003628117498010397, 0.006005290430039167, -0.07113754004240036, 0.37566137313842773], "std": [0.20685647428035736, 0.29041698575019836, 0.39045068621635437, 0.0223636906594038, 0.017533019185066223, 0.05273053050041199, 0.4842929542064667], "count": [189]}, "timestamp": {"min": [0.0], "max": [9.4], "mean": [4.7], "std": [2.727941837112123], "count": [189]}, "frame_index": {"min": [0], "max": [188], "mean": [94.0], "std": [54.55883674224247], "count": [189]}, "episode_index": {"min": [64], "max": [64], "mean": [64.0], "std": [0.0], "count": [189]}, "index": {"min": [17671], "max": [17859], "mean": [17765.0], "std": [54.55883674224247], "count": [189]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [189]}}} +{"episode_index": 65, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3371330027860754]], [[0.27500654991000306]], [[0.2379316214767157]]], "std": [[[0.14870193448696142]], [[0.15074927835783578]], [[0.16069576003383299]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32948510562672334]], [[0.2857607882630591]], [[0.25293063474168964]]], "std": [[[0.16842537861975496]], [[0.1835086181302043]], [[0.1934573789036143]]], "count": [100]}, "observation.state": {"min": [-0.05637102946639061, -0.18255619704723358, 0.44617724418640137, 3.0022239685058594, -0.14206767082214355, -0.4942183792591095, 0.01836979016661644, -0.03985944762825966], "max": [0.1405705213546753, 0.26207607984542847, 0.6901830434799194, 3.2176520824432373, 0.2254400998353958, 0.023343943059444427, 0.03989291563630104, -0.01959988661110401], "mean": [0.050503820180892944, 0.05750696733593941, 0.5925108194351196, 3.109118938446045, -0.004058324731886387, -0.15400859713554382, 0.028636395931243896, -0.02912973426282406], "std": [0.054358337074518204, 0.15053515136241913, 0.07583732157945633, 0.06413179636001587, 0.12924933433532715, 0.11185845732688904, 0.009184611029922962, 0.009041648358106613], "count": [255]}, "action": {"min": [-0.5196428298950195, -0.7741071581840515, -0.824999988079071, -0.11678571254014969, -0.09214285761117935, -0.06321428716182709, 0.0], "max": [0.7607142925262451, 0.8464285731315613, 0.9375, 0.06964285671710968, 0.09214285761117935, 0.09214285761117935, 1.0], "mean": [0.014873933978378773, 0.07603991776704788, -0.03592437878251076, -0.004168067127466202, 0.010462186299264431, 0.007197478786110878, 0.47843137383461], "std": [0.2801561951637268, 0.4254181385040283, 0.44341376423835754, 0.02794612944126129, 0.03240497037768364, 0.02564077451825142, 0.4995347559452057], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [65], "max": [65], "mean": [65.0], "std": [0.0], "count": [255]}, "index": {"min": [17860], "max": [18114], "mean": [17987.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [255]}}} +{"episode_index": 66, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5771032104492188]], [[0.5397529201133578]], [[0.5031909419041054]]], "std": [[[0.2512151228628695]], [[0.22935579881422422]], [[0.20729047695491462]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5439294379739201]], [[0.5089797548780254]], [[0.4612091267903646]]], "std": [[[0.29845832734315564]], [[0.2734230866958689]], [[0.25463106113713524]]], "count": [100]}, "observation.state": {"min": [-0.19826717674732208, -0.09147930890321732, 0.9277763366699219, 1.1321442127227783, 0.003280650358647108, -0.3570336103439331, 0.007428912911564112, -0.039905134588479996], "max": [0.09825176745653152, 0.21282610297203064, 1.1772023439407349, 3.16794753074646, 3.560650587081909, 0.604421079158783, 0.040008652955293655, -0.006558531895279884], "mean": [-0.061368681490421295, 0.0792689248919487, 1.0596396923065186, 2.5693650245666504, 1.7222671508789062, 0.06324052810668945, 0.0269917044788599, -0.026500146836042404], "std": [0.11341176182031631, 0.11371418833732605, 0.08332683891057968, 0.5906550288200378, 1.2061986923217773, 0.23222753405570984, 0.013787463307380676, 0.01434851624071598], "count": [248]}, "action": {"min": [-0.3991071283817291, -0.7392857074737549, -0.7607142925262451, -0.06750000268220901, -0.06428571790456772, -0.09428571164608002, 0.0], "max": [0.7392857074737549, 0.6214285492897034, 0.9375, 0.12535713613033295, 0.2046428620815277, 0.3310714364051819, 1.0], "mean": [0.055753208696842194, 0.03702476993203163, -0.051940519362688065, 0.015531392768025398, 0.006113190203905106, 0.08684618771076202, 0.5766128897666931], "std": [0.27562573552131653, 0.3277541697025299, 0.38327381014823914, 0.04340159520506859, 0.04286543279886246, 0.08889517933130264, 0.4940952956676483], "count": [248]}, "timestamp": {"min": [0.0], "max": [12.35], "mean": [6.175], "std": [3.579542568541405], "count": [248]}, "frame_index": {"min": [0], "max": [247], "mean": [123.5], "std": [71.5908513708281], "count": [248]}, "episode_index": {"min": [66], "max": [66], "mean": [66.0], "std": [0.0], "count": [248]}, "index": {"min": [18115], "max": [18362], "mean": [18238.5], "std": [71.5908513708281], "count": [248]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [248]}}} +{"episode_index": 67, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5838699705834481]], [[0.5364417563045727]], [[0.4861711156508502]]], "std": [[[0.283684910509244]], [[0.2569321560227423]], [[0.22762064041677987]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5677112396838618]], [[0.5294084071739048]], [[0.47938826856426164]]], "std": [[[0.2990347246788128]], [[0.2763186856643705]], [[0.25923364245472164]]], "count": [100]}, "observation.state": {"min": [-0.1980361044406891, -0.31862980127334595, 0.9856917262077332, 2.1181375980377197, -3.2457680702209473, -1.2543540000915527, 0.0014734650030732155, -0.03989844024181366], "max": [0.13286051154136658, 0.16965050995349884, 1.2035017013549805, 3.1803958415985107, -0.00041199004044756293, -0.08616212010383606, 0.04001246392726898, -0.006792651955038309], "mean": [-0.024393079802393913, -0.07543792575597763, 1.1054408550262451, 2.5943520069122314, -2.3399884700775146, -0.5716845989227295, 0.025907760486006737, -0.028087513521313667], "std": [0.07743224501609802, 0.14559151232242584, 0.06541750580072403, 0.3473806381225586, 0.8002821803092957, 0.28541499376296997, 0.015188603661954403, 0.013773384504020214], "count": [388]}, "action": {"min": [-0.5169642567634583, -0.8223214149475098, -0.5196428298950195, -0.12428571283817291, -0.14142857491970062, -0.260357141494751, 0.0], "max": [0.6080357432365417, 0.8276785612106323, 0.5598214268684387, 0.1039285734295845, 0.15535713732242584, 0.13500000536441803, 1.0], "mean": [0.03668537735939026, -0.039384663105010986, -0.057050809264183044, 0.012506450526416302, 0.004097939468920231, -0.017673062160611153, 0.5644329786300659], "std": [0.24931509792804718, 0.3936549723148346, 0.2774101793766022, 0.04234963282942772, 0.04526670277118683, 0.0951499193906784, 0.49583208560943604], "count": [388]}, "timestamp": {"min": [0.0], "max": [19.35], "mean": [9.674999999999999], "std": [5.600279010906511], "count": [388]}, "frame_index": {"min": [0], "max": [387], "mean": [193.5], "std": [112.0055802181302], "count": [388]}, "episode_index": {"min": [67], "max": [67], "mean": [67.0], "std": [0.0], "count": [388]}, "index": {"min": [18363], "max": [18750], "mean": [18556.5], "std": [112.0055802181302], "count": [388]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [388]}}} +{"episode_index": 68, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3565533979827282]], [[0.2898195968328738]], [[0.24817758418064492]]], "std": [[[0.16232747888869176]], [[0.1628122366936871]], [[0.16608147828101716]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32679559625363813]], [[0.2811579141055836]], [[0.25118480248544733]]], "std": [[[0.16143593582597468]], [[0.17786058717069278]], [[0.18889427628934677]]], "count": [100]}, "observation.state": {"min": [-0.1274786740541458, -0.1287900060415268, 0.44878846406936646, 3.0179436206817627, -0.48855113983154297, -0.12901511788368225, 0.0014644799521192908, -0.039884988218545914], "max": [0.13572019338607788, 0.1344674974679947, 0.681610107421875, 3.2819864749908447, 0.04636738821864128, 0.24582596123218536, 0.040181200951337814, -0.002880249172449112], "mean": [0.012689411640167236, 0.035988785326480865, 0.5393790602684021, 3.145069122314453, -0.18518419563770294, 0.044096171855926514, 0.027941742911934853, -0.027063420042395592], "std": [0.08206330239772797, 0.08936352282762527, 0.07051580399274826, 0.08178453147411346, 0.16737061738967896, 0.1004941463470459, 0.014828886836767197, 0.014707783237099648], "count": [289]}, "action": {"min": [-0.5892857313156128, -0.46875, -0.6187499761581421, -0.10928571224212646, -0.07392857223749161, -0.04928571358323097, 0.0], "max": [0.8383928537368774, 0.4580357074737549, 0.5142857432365417, 0.06642857193946838, 0.08142857253551483, 0.009642857126891613, 1.0], "mean": [0.02389398217201233, 0.024366658180952072, -0.0861499160528183, -0.0010603065602481365, -0.004096638411283493, -0.009294362738728523, 0.5778546929359436], "std": [0.34493425488471985, 0.18305690586566925, 0.289971262216568, 0.03130641207098961, 0.0269217137247324, 0.015878532081842422, 0.4939016103744507], "count": [289]}, "timestamp": {"min": [0.0], "max": [14.4], "mean": [7.200000000000001], "std": [4.171330722922843], "count": [289]}, "frame_index": {"min": [0], "max": [288], "mean": [144.0], "std": [83.42661445845684], "count": [289]}, "episode_index": {"min": [68], "max": [68], "mean": [68.0], "std": [0.0], "count": [289]}, "index": {"min": [18751], "max": [19039], "mean": [18895.0], "std": [83.42661445845684], "count": [289]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [289]}}} +{"episode_index": 69, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.30968432497510723]], [[0.25973819986979163]], [[0.22954141534543507]]], "std": [[[0.16368594149392637]], [[0.1614921942924876]], [[0.16786176900546776]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.315988130457261]], [[0.2687867814606311]], [[0.23433068428787532]]], "std": [[[0.1577067698194518]], [[0.17127685399853512]], [[0.18028228906068638]]], "count": [100]}, "observation.state": {"min": [-0.1349952667951584, -0.17315469682216644, 0.4809541702270508, 2.984227418899536, -0.5315011739730835, -0.584990382194519, 0.025096865370869637, -0.03992161899805069], "max": [-0.016648396849632263, 0.3267166316509247, 0.7182797193527222, 3.1714015007019043, 0.1455753594636917, -0.02970222756266594, 0.039919715374708176, -0.02070428431034088], "mean": [-0.056835636496543884, 0.055204808712005615, 0.6146913170814514, 3.109886884689331, -0.218855082988739, -0.26093417406082153, 0.03381500020623207, -0.0337798185646534], "std": [0.03478794917464256, 0.16367241740226746, 0.07120152562856674, 0.0562528520822525, 0.21867886185646057, 0.18127116560935974, 0.0052756089717149734, 0.005411313846707344], "count": [292]}, "action": {"min": [-0.32678571343421936, -0.6616071462631226, -0.6053571701049805, -0.03857142850756645, -0.0835714265704155, -0.08892857283353806, 0.0], "max": [0.5946428775787354, 0.8116071224212646, 0.9375, 0.02142857201397419, 0.1435714215040207, 0.05785714462399483, 1.0], "mean": [0.01505320891737938, 0.08089837431907654, -0.023354966193437576, -0.000821917608845979, 0.012787424959242344, -0.009312625974416733, 0.4794520437717438], "std": [0.17905907332897186, 0.3948546051979065, 0.41301989555358887, 0.008687647059559822, 0.04621927812695503, 0.030300306156277657, 0.4995773732662201], "count": [292]}, "timestamp": {"min": [0.0], "max": [14.55], "mean": [7.275], "std": [4.214632249674934], "count": [292]}, "frame_index": {"min": [0], "max": [291], "mean": [145.5], "std": [84.2926449934987], "count": [292]}, "episode_index": {"min": [69], "max": [69], "mean": [69.0], "std": [0.0], "count": [292]}, "index": {"min": [19040], "max": [19331], "mean": [19185.5], "std": [84.2926449934987], "count": [292]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [292]}}} +{"episode_index": 70, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5856329345703124]], [[0.5376183142568551]], [[0.487805954877068]]], "std": [[[0.2845927547959962]], [[0.25763282718719827]], [[0.22790135060943748]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5679442551556756]], [[0.5291272995892693]], [[0.4783551659677543]]], "std": [[[0.29687755435713914]], [[0.2733952439481844]], [[0.2554787402152542]]], "count": [100]}, "observation.state": {"min": [-0.20946365594863892, -0.3255046010017395, 1.0026483535766602, 2.2480201721191406, -2.9205739498138428, -0.8520116806030273, 0.0046132588759064674, -0.04048704355955124], "max": [0.02292819134891033, 0.21607884764671326, 1.1803374290466309, 3.1428825855255127, 0.0007860184996388853, -0.06246799975633621, 0.04000932723283768, -0.006779620423913002], "mean": [-0.06555858254432678, -0.01464006770402193, 1.0851527452468872, 2.5860509872436523, -2.312222719192505, -0.4977678060531616, 0.027616599574685097, -0.027481256052851677], "std": [0.054442502558231354, 0.1686209887266159, 0.05660419538617134, 0.2534484267234802, 0.7484936714172363, 0.21493390202522278, 0.015404919162392616, 0.015095889568328857], "count": [416]}, "action": {"min": [-0.3910714387893677, -0.8491071462631226, -0.4928571283817291, -0.10821428894996643, -0.03857142850756645, -0.3278571367263794, 0.0], "max": [0.5571428537368774, 0.8196428418159485, 0.5919643044471741, 0.06964285671710968, 0.09000000357627869, 0.1103571429848671, 1.0], "mean": [0.018383000046014786, -0.02726861461997032, -0.05216775834560394, 0.008177371695637703, 0.004545844160020351, -0.023883074522018433, 0.6322115659713745], "std": [0.18305203318595886, 0.3864111006259918, 0.25300055742263794, 0.03539886698126793, 0.020188679918646812, 0.09164461493492126, 0.4822031557559967], "count": [416]}, "timestamp": {"min": [0.0], "max": [20.75], "mean": [10.375], "std": [6.004425451281746], "count": [416]}, "frame_index": {"min": [0], "max": [415], "mean": [207.5], "std": [120.08850902563492], "count": [416]}, "episode_index": {"min": [70], "max": [70], "mean": [70.0], "std": [0.0], "count": [416]}, "index": {"min": [19332], "max": [19747], "mean": [19539.5], "std": [120.08850902563492], "count": [416]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [416]}}} +{"episode_index": 71, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.30878634763231466]], [[0.2490909896551394]], [[0.21234271659103093]]], "std": [[[0.13819389541664254]], [[0.13035544218885226]], [[0.13575076901642202]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3194604342591529]], [[0.2724103447409237]], [[0.23819358676087624]]], "std": [[[0.15900578503261784]], [[0.1732403491643399]], [[0.18296297107583426]]], "count": [100]}, "observation.state": {"min": [-0.12027311325073242, -0.1734876185655594, 0.4834156930446625, 2.7595767974853516, -1.2287023067474365, -0.3875831067562103, 0.02559417486190796, -0.04111652821302414], "max": [0.0033645150251686573, 0.2599434554576874, 0.7244479656219482, 3.2663989067077637, 0.08344730734825134, 0.32633814215660095, 0.04000598564743996, -0.03128685802221298], "mean": [-0.050167206674814224, 0.03855267912149429, 0.6069232225418091, 3.0652551651000977, -0.42121008038520813, -0.030498642474412918, 0.034411489963531494, -0.03730049356818199], "std": [0.031073888763785362, 0.15554513037204742, 0.07377728819847107, 0.13456390798091888, 0.42843833565711975, 0.16324077546596527, 0.005460571963340044, 0.0029743683990091085], "count": [312]}, "action": {"min": [-0.3910714387893677, -0.7419642806053162, -0.5008928775787354, -0.07821428775787354, -0.1510714292526245, -0.2314285784959793, 0.0], "max": [0.48750001192092896, 0.8062499761581421, 0.9375, 0.07392857223749161, 0.21214285492897034, 0.1007142886519432, 1.0], "mean": [0.019471144303679466, 0.049802515655756, 0.004000707529485226, 0.00023695036361459643, 0.00439903698861599, -0.01297046709805727, 0.5641025900840759], "std": [0.2007898986339569, 0.36420997977256775, 0.38743487000465393, 0.023749331012368202, 0.07787412405014038, 0.06107344478368759, 0.4958741366863251], "count": [312]}, "timestamp": {"min": [0.0], "max": [15.55], "mean": [7.775], "std": [4.503308968599275], "count": [312]}, "frame_index": {"min": [0], "max": [311], "mean": [155.5], "std": [90.0661793719855], "count": [312]}, "episode_index": {"min": [71], "max": [71], "mean": [71.0], "std": [0.0], "count": [312]}, "index": {"min": [19748], "max": [20059], "mean": [19903.5], "std": [90.0661793719855], "count": [312]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [312]}}} +{"episode_index": 72, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5822650194355086]], [[0.5479091766955806]], [[0.5129572532504213]]], "std": [[[0.2560442922757839]], [[0.2341590314207633]], [[0.21313102143242924]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5416443553251379]], [[0.5067008577234605]], [[0.4581058726591222]]], "std": [[[0.30034196556233833]], [[0.27490221718964475]], [[0.25583042630879227]]], "count": [100]}, "observation.state": {"min": [-0.20902256667613983, -0.08170025795698166, 0.928139865398407, 2.3308417797088623, -0.03108496218919754, -0.3876199424266815, -0.0007139866356737912, -0.040012918412685394], "max": [0.06994780898094177, 0.20335747301578522, 1.1708239316940308, 3.2509567737579346, 2.086332321166992, 0.8263334035873413, 0.04018241912126541, -0.010363228619098663], "mean": [-0.06980891525745392, 0.08077216893434525, 1.045945644378662, 2.7923777103424072, 1.2167041301727295, 0.16425824165344238, 0.02820466086268425, -0.02881382592022419], "std": [0.11370053142309189, 0.10874888300895691, 0.07878809422254562, 0.34339070320129395, 0.8241331577301025, 0.42538920044898987, 0.0133003368973732, 0.012306863442063332], "count": [271]}, "action": {"min": [-0.5839285850524902, -0.7044642567634583, -0.6991071701049805, -0.05249999836087227, -0.23357142508029938, -0.06857142597436905, 0.0], "max": [0.5919643044471741, 0.7178571224212646, 0.862500011920929, 0.0803571417927742, 0.15535713732242584, 0.375, 1.0], "mean": [0.03095676749944687, 0.053166188299655914, -0.10577886551618576, 0.011576170101761818, -0.014869539067149162, 0.04476672783493996, 0.5461254715919495], "std": [0.2386704385280609, 0.31663864850997925, 0.34762415289878845, 0.027745801955461502, 0.07407679408788681, 0.11050546169281006, 0.4978674054145813], "count": [271]}, "timestamp": {"min": [0.0], "max": [13.5], "mean": [6.75], "std": [3.911521443121589], "count": [271]}, "frame_index": {"min": [0], "max": [270], "mean": [135.0], "std": [78.23042886243178], "count": [271]}, "episode_index": {"min": [72], "max": [72], "mean": [72.0], "std": [0.0], "count": [271]}, "index": {"min": [20060], "max": [20330], "mean": [20195.0], "std": [78.23042886243178], "count": [271]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [271]}}} +{"episode_index": 73, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5878858080097273]], [[0.5388236137838925]], [[0.48845142977845435]]], "std": [[[0.28440487827832756]], [[0.2583329999104245]], [[0.22861689167639893]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5654011547612209]], [[0.5273454781326594]], [[0.4775719161688113]]], "std": [[[0.2959996379256342]], [[0.27265430288897224]], [[0.25478025358503487]]], "count": [100]}, "observation.state": {"min": [-0.1977563202381134, -0.28430354595184326, 1.0095337629318237, 2.331186532974243, -2.568321466445923, -0.8455615639686584, 0.01225016638636589, -0.0400044322013855], "max": [0.1435326486825943, 0.1783379465341568, 1.1966357231140137, 3.211369514465332, 0.000834575155749917, -0.09081856161355972, 0.04001237824559212, -0.013442663475871086], "mean": [0.012567978352308273, -0.05736406892538071, 1.1117970943450928, 2.6618599891662598, -2.0657875537872314, -0.5527853965759277, 0.028968481346964836, -0.029223527759313583], "std": [0.06915086507797241, 0.14344212412834167, 0.06064480543136597, 0.24156275391578674, 0.5840905904769897, 0.1684134602546692, 0.01181140448898077, 0.011372360400855541], "count": [450]}, "action": {"min": [-0.38035714626312256, -0.7071428298950195, -0.44732141494750977, -0.04821428656578064, -0.1071428582072258, -0.25285714864730835, 0.0], "max": [0.5973214507102966, 0.6803571581840515, 0.5464285612106323, 0.0803571417927742, 0.12857143580913544, 0.062142856419086456, 1.0], "mean": [0.03372025117278099, -0.030553573742508888, -0.03073214925825596, 0.008399995975196362, 0.006335712969303131, -0.024069035425782204, 0.5622222423553467], "std": [0.22911539673805237, 0.3167808949947357, 0.2495710402727127, 0.02240387164056301, 0.044058412313461304, 0.07148981839418411, 0.4961133599281311], "count": [450]}, "timestamp": {"min": [0.0], "max": [22.45], "mean": [11.225], "std": [6.495174490856013], "count": [450]}, "frame_index": {"min": [0], "max": [449], "mean": [224.5], "std": [129.90348981712026], "count": [450]}, "episode_index": {"min": [73], "max": [73], "mean": [73.0], "std": [0.0], "count": [450]}, "index": {"min": [20331], "max": [20780], "mean": [20555.5], "std": [129.90348981712026], "count": [450]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [450]}}} +{"episode_index": 74, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3313961696250766]], [[0.27338652786554074]], [[0.23711606732536764]]], "std": [[[0.14875522669123753]], [[0.1454006299684874]], [[0.14824216463999906]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32089177808574604]], [[0.2765100091672411]], [[0.2440411251292509]]], "std": [[[0.16114112473349337]], [[0.1773167265264157]], [[0.1863423467776695]]], "count": [100]}, "observation.state": {"min": [-0.17416635155677795, -0.12392821907997131, 0.45104268193244934, 2.902724027633667, -1.1350233554840088, -0.4096831679344177, 0.02115044929087162, -0.03987906500697136], "max": [0.12975184619426727, 0.2752363383769989, 0.7070730328559875, 3.282294273376465, 0.149274542927742, 0.43068307638168335, 0.039930082857608795, -0.00921926461160183], "mean": [-0.016201412305235863, 0.06846125423908234, 0.5958588123321533, 3.1214540004730225, -0.4531119465827942, 0.014748613350093365, 0.033012256026268005, -0.03313138335943222], "std": [0.08544152975082397, 0.12673944234848022, 0.07205312699079514, 0.09680308401584625, 0.44620099663734436, 0.228580042719841, 0.006845197174698114, 0.008397539146244526], "count": [264]}, "action": {"min": [-0.5973214507102966, -0.8330357074737549, -0.6991071701049805, -0.08892857283353806, -0.13285714387893677, -0.1103571429848671, 0.0], "max": [0.7848214507102966, 0.8008928298950195, 0.9375, 0.09214285761117935, 0.1510714292526245, 0.2142857164144516, 1.0], "mean": [0.03566354513168335, 0.09463269263505936, -0.0381290502846241, 0.0047808424569666386, 0.001980520784854889, 0.0005519448895938694, 0.5530303120613098], "std": [0.34288424253463745, 0.39643481373786926, 0.46832558512687683, 0.030128849670290947, 0.06310895830392838, 0.06947635114192963, 0.4971804618835449], "count": [264]}, "timestamp": {"min": [0.0], "max": [13.15], "mean": [6.575000000000001], "std": [3.810484439892999], "count": [264]}, "frame_index": {"min": [0], "max": [263], "mean": [131.5], "std": [76.20968879786], "count": [264]}, "episode_index": {"min": [74], "max": [74], "mean": [74.0], "std": [0.0], "count": [264]}, "index": {"min": [20781], "max": [21044], "mean": [20912.5], "std": [76.20968879786], "count": [264]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [264]}}} +{"episode_index": 75, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5963725783404181]], [[0.5468445428586474]], [[0.49427070886948526]]], "std": [[[0.26807474549632243]], [[0.25777098728656384]], [[0.2378534696759663]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5520430249980852]], [[0.5119223112218519]], [[0.4616779258578431]]], "std": [[[0.2962616562817762]], [[0.27506849906697084]], [[0.2603022931454044]]], "count": [100]}, "observation.state": {"min": [-0.20601652562618256, -0.09652698040008545, 0.919550359249115, 2.170743227005005, -2.321593999862671, -0.9354337453842163, 0.0033166275825351477, -0.040039315819740295], "max": [0.057560645043849945, 0.1940106451511383, 1.1776607036590576, 3.1417510509490967, 0.005244930740445852, 0.2961631119251251, 0.040687114000320435, -0.0030331392772495747], "mean": [-0.03259560093283653, 0.02943781204521656, 1.0329619646072388, 2.6159520149230957, -1.7163798809051514, -0.0229045283049345, 0.02829829603433609, -0.027820099145174026], "std": [0.06745360791683197, 0.09444618970155716, 0.08096843212842941, 0.24552026391029358, 0.6153029203414917, 0.3411766290664673, 0.016007578000426292, 0.01619330234825611], "count": [240]}, "action": {"min": [-0.4660714268684387, -0.5142857432365417, -0.6321428418159485, -0.09107142686843872, -0.12535713613033295, -0.3321428596973419, 0.0], "max": [0.5946428775787354, 0.7928571701049805, 0.7017857432365417, 0.17142857611179352, 0.22607143223285675, 0.09857142716646194, 1.0], "mean": [0.04533481225371361, 0.15533484518527985, -0.12152901291847229, 0.026022326201200485, 0.0021741066593676805, -0.045986611396074295, 0.6708333492279053], "std": [0.24423986673355103, 0.35202673077583313, 0.3356650173664093, 0.048780281096696854, 0.0641636773943901, 0.11051477491855621, 0.4699098467826843], "count": [240]}, "timestamp": {"min": [0.0], "max": [11.95], "mean": [5.975], "std": [3.4640715446807193], "count": [240]}, "frame_index": {"min": [0], "max": [239], "mean": [119.5], "std": [69.2814308936144], "count": [240]}, "episode_index": {"min": [75], "max": [75], "mean": [75.0], "std": [0.0], "count": [240]}, "index": {"min": [21045], "max": [21284], "mean": [21164.5], "std": [69.2814308936144], "count": [240]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [240]}}} +{"episode_index": 76, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3494202450022978]], [[0.27652340339211856]], [[0.2262367894789752]]], "std": [[[0.1470620865439907]], [[0.13830277272996402]], [[0.12529327034073262]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32817181516161154]], [[0.2837734261307062]], [[0.2509627374387255]]], "std": [[[0.17117183783068174]], [[0.18629659225838668]], [[0.19630156754664443]]], "count": [100]}, "observation.state": {"min": [-0.048024266958236694, -0.20768485963344574, 0.44634249806404114, 3.083531618118286, -0.3080366253852844, -0.12847615778446198, 0.019773567095398903, -0.039867475628852844], "max": [0.13761219382286072, 0.27570483088493347, 0.7174746990203857, 3.258687734603882, 0.14863379299640656, 0.3095111548900604, 0.03994737192988396, -0.019226549193263054], "mean": [0.07922487705945969, 0.025137554854154587, 0.6036602258682251, 3.1378462314605713, -0.06171655282378197, -0.023150386288762093, 0.029310213401913643, -0.029574209824204445], "std": [0.03901100158691406, 0.17015612125396729, 0.08717893809080124, 0.04098445549607277, 0.12467306852340698, 0.11497699469327927, 0.009031841531395912, 0.0091635063290596], "count": [278]}, "action": {"min": [-0.44999998807907104, -0.8303571343421936, -0.6428571343421936, -0.09107142686843872, -0.0835714265704155, -0.07178571075201035, 0.0], "max": [0.5357142686843872, 0.8812500238418579, 0.9375, 0.09535714238882065, 0.14892856776714325, 0.11785714328289032, 1.0], "mean": [0.025851087644696236, 0.08240945637226105, -0.03206579014658928, 0.0011292388662695885, -0.0007553954492323101, 0.004162384197115898, 0.5], "std": [0.1869153380393982, 0.4514276683330536, 0.43326428532600403, 0.031134814023971558, 0.04029454290866852, 0.03268302232027054, 0.5], "count": [278]}, "timestamp": {"min": [0.0], "max": [13.85], "mean": [6.925000000000001], "std": [4.012558410789804], "count": [278]}, "frame_index": {"min": [0], "max": [277], "mean": [138.5], "std": [80.25116821579608], "count": [278]}, "episode_index": {"min": [76], "max": [76], "mean": [76.0], "std": [0.0], "count": [278]}, "index": {"min": [21285], "max": [21562], "mean": [21423.5], "std": [80.25116821579608], "count": [278]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [278]}}} +{"episode_index": 77, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.30789143700693167]], [[0.24973386816884957]], [[0.2130241352156097]]], "std": [[[0.16081797462149464]], [[0.15506183897750167]], [[0.1592133550097246]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31867696006625307]], [[0.27193145033892463]], [[0.237440185546875]]], "std": [[[0.1598634648149698]], [[0.17365246518416935]], [[0.1828147346032626]]], "count": [100]}, "observation.state": {"min": [-0.09386607259511948, -0.17691795527935028, 0.48204439878463745, 3.0412819385528564, -0.4342172145843506, -0.5613062381744385, 0.03134559467434883, -0.039962075650691986], "max": [0.015293756499886513, 0.2867101728916168, 0.7177013158798218, 3.160123586654663, 0.31441619992256165, 0.1537204533815384, 0.03996824845671654, -0.025019831955432892], "mean": [-0.04205739498138428, 0.0476863831281662, 0.6126198768615723, 3.112532615661621, -0.06168767437338829, -0.26992079615592957, 0.03643997013568878, -0.03449876978993416], "std": [0.030462894588708878, 0.16216903924942017, 0.07159250229597092, 0.03335271775722504, 0.20043863356113434, 0.17618364095687866, 0.0034085081424564123, 0.005584255326539278], "count": [300]}, "action": {"min": [-0.35624998807907104, -0.7205356955528259, -0.6669642925262451, -0.061071429401636124, -0.18642857670783997, -0.08250000327825546, 0.0], "max": [0.6616071462631226, 0.8089285492897034, 0.9375, 0.04714285582304001, 0.10178571194410324, 0.0503571443259716, 1.0], "mean": [0.011892859824001789, 0.05576785281300545, -0.025491075590252876, -0.003421429079025984, -9.285502164857462e-05, -0.00824285950511694, 0.5600000023841858], "std": [0.17694279551506042, 0.381397008895874, 0.39197683334350586, 0.018650319427251816, 0.048481252044439316, 0.028906352818012238, 0.4963867664337158], "count": [300]}, "timestamp": {"min": [0.0], "max": [14.95], "mean": [7.475], "std": [4.330102962594154], "count": [300]}, "frame_index": {"min": [0], "max": [299], "mean": [149.5], "std": [86.60205925188308], "count": [300]}, "episode_index": {"min": [77], "max": [77], "mean": [77.0], "std": [0.0], "count": [300]}, "index": {"min": [21563], "max": [21862], "mean": [21712.5], "std": [86.60205925188308], "count": [300]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [300]}}} +{"episode_index": 78, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3358140037387025]], [[0.27056959503772215]], [[0.23134718113319547]]], "std": [[[0.14697423918458968]], [[0.14394063628478718]], [[0.15107445469437433]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3238809090408625]], [[0.28070607922123925]], [[0.2479449660357307]]], "std": [[[0.1689358575364903]], [[0.18337070303534034]], [[0.19307319966588168]]], "count": [100]}, "observation.state": {"min": [-0.05471302196383476, -0.2009871006011963, 0.4457610547542572, 3.0409281253814697, -0.34422141313552856, -0.636919379234314, 0.016457516700029373, -0.04016660898923874], "max": [0.16869157552719116, 0.26288890838623047, 0.6873326301574707, 3.248560905456543, 0.19546696543693542, 0.03613286092877388, 0.04009005427360535, -0.015399912372231483], "mean": [0.047310277819633484, 0.040665797889232635, 0.593458354473114, 3.1224453449249268, -0.07607840746641159, -0.16578806936740875, 0.030092572793364525, -0.030695728957653046], "std": [0.05062282830476761, 0.1514023095369339, 0.07773967832326889, 0.042838435620069504, 0.14301817119121552, 0.19574348628520966, 0.009520447812974453, 0.009164975956082344], "count": [271]}, "action": {"min": [-0.6026785969734192, -0.9375, -0.731249988079071, -0.1007142886519432, -0.1907142847776413, -0.11999999731779099, 0.0], "max": [0.8330357074737549, 0.8464285731315613, 0.9375, 0.11357142776250839, 0.20357142388820648, 0.1435714215040207, 1.0], "mean": [0.025698482990264893, 0.07386337220668793, -0.03161902353167534, -0.001363996067084372, -6.325946742435917e-05, 0.0018819170072674751, 0.5387454032897949], "std": [0.30017706751823425, 0.4527367651462555, 0.43840134143829346, 0.03355401009321213, 0.06975521892309189, 0.05544522404670715, 0.49849653244018555], "count": [271]}, "timestamp": {"min": [0.0], "max": [13.5], "mean": [6.75], "std": [3.911521443121589], "count": [271]}, "frame_index": {"min": [0], "max": [270], "mean": [135.0], "std": [78.23042886243178], "count": [271]}, "episode_index": {"min": [78], "max": [78], "mean": [78.0], "std": [0.0], "count": [271]}, "index": {"min": [21863], "max": [22133], "mean": [21998.0], "std": [78.23042886243178], "count": [271]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [271]}}} +{"episode_index": 79, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3253151789646523]], [[0.26506461349188115]], [[0.22721354645373776]]], "std": [[[0.15442093297924897]], [[0.1525883233347543]], [[0.15761039458594825]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3202286586387485]], [[0.27300444300034465]], [[0.23852718517827054]]], "std": [[[0.15868061570254402]], [[0.17337510964463376]], [[0.1832059147733065]]], "count": [100]}, "observation.state": {"min": [-0.09637486934661865, -0.14592815935611725, 0.481656551361084, 3.0091397762298584, -0.6016783714294434, -0.3832206726074219, 0.030072035267949104, -0.03982017561793327], "max": [0.009498482570052147, 0.2687736749649048, 0.7203147411346436, 3.2362163066864014, 0.07323337346315384, 0.2863374650478363, 0.040297213941812515, -0.023338301107287407], "mean": [-0.034669388085603714, 0.08354271203279495, 0.6126077175140381, 3.141057252883911, -0.15691311657428741, -0.06588443368673325, 0.03679563105106354, -0.033049024641513824], "std": [0.03191016986966133, 0.14407649636268616, 0.06560828536748886, 0.052595607936382294, 0.16182225942611694, 0.19931451976299286, 0.0034615928307175636, 0.00627905735746026], "count": [274]}, "action": {"min": [-0.4714285731315613, -0.862500011920929, -0.6669642925262451, -0.11142857372760773, -0.1274999976158142, -0.12321428209543228, 0.0], "max": [0.5035714507102966, 0.8732143044471741, 0.9375, 0.09642857313156128, 0.1339285671710968, 0.07285714149475098, 1.0], "mean": [0.018847759813070297, 0.07884189486503601, -0.014067405834794044, 0.0017557356040924788, -0.0028623580001294613, -0.013138685375452042, 0.48905110359191895], "std": [0.2038690596818924, 0.403171569108963, 0.4342086613178253, 0.04212141036987305, 0.054700225591659546, 0.033333852887153625, 0.4998801350593567], "count": [274]}, "timestamp": {"min": [0.0], "max": [13.65], "mean": [6.825], "std": [3.9548230048890938], "count": [274]}, "frame_index": {"min": [0], "max": [273], "mean": [136.5], "std": [79.09646009778187], "count": [274]}, "episode_index": {"min": [79], "max": [79], "mean": [79.0], "std": [0.0], "count": [274]}, "index": {"min": [22134], "max": [22407], "mean": [22270.5], "std": [79.09646009778187], "count": [274]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [274]}}} +{"episode_index": 80, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5632248367608762]], [[0.5201226351868872]], [[0.46459623389150584]]], "std": [[[0.2985619941897113]], [[0.26953577250580524]], [[0.23981160215300182]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5073170429304534]], [[0.47645940683402266]], [[0.4308219233494179]]], "std": [[[0.3098291811510708]], [[0.2832695725788447]], [[0.26233295886963115]]], "count": [100]}, "observation.state": {"min": [-0.31141582131385803, -0.07544644176959991, 0.9654094576835632, 1.894514799118042, -3.1296494007110596, -0.7741668820381165, 0.009142463095486164, -0.04001416265964508], "max": [0.008224560879170895, 0.2723478078842163, 1.176073670387268, 3.2792835235595703, -0.003194165416061878, -0.055427439510822296, 0.040006671100854874, -0.009460744448006153], "mean": [-0.08630356192588806, 0.0824170857667923, 1.0698657035827637, 2.4829301834106445, -2.2176871299743652, -0.5400857329368591, 0.031990017741918564, -0.03195859491825104], "std": [0.09152030199766159, 0.10988208651542664, 0.06247466802597046, 0.4160996079444885, 0.8053084015846252, 0.18327529728412628, 0.012745631858706474, 0.012704051099717617], "count": [239]}, "action": {"min": [-0.6776785850524902, -0.6321428418159485, -0.6723214387893677, -0.12535713613033295, -0.1339285671710968, -0.32035714387893677, 0.0], "max": [0.731249988079071, 0.8116071224212646, 0.6589285731315613, 0.13500000536441803, 0.23678570985794067, 0.19499999284744263, 1.0], "mean": [0.004785577766597271, 0.15678052604198456, -0.049435894936323166, 0.01394650712609291, 0.03026001714169979, -0.04122985154390335, 0.7531380653381348], "std": [0.3255373537540436, 0.36898645758628845, 0.27689313888549805, 0.04890262335538864, 0.07288825511932373, 0.12994253635406494, 0.4311852753162384], "count": [239]}, "timestamp": {"min": [0.0], "max": [11.9], "mean": [5.95], "std": [3.449637662132068], "count": [239]}, "frame_index": {"min": [0], "max": [238], "mean": [119.0], "std": [68.99275324264136], "count": [239]}, "episode_index": {"min": [80], "max": [80], "mean": [80.0], "std": [0.0], "count": [239]}, "index": {"min": [22408], "max": [22646], "mean": [22527.0], "std": [68.99275324264136], "count": [239]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [239]}}} +{"episode_index": 81, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9764705882352941]], [[0.9803921568627451]]], "mean": [[[0.34894968608781407]], [[0.27278303079044114]], [[0.17589198871687345]]], "std": [[[0.208846893200541]], [[0.15826225200069075]], [[0.10948312398225186]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9921568627450981]], [[0.984313725490196]]], "mean": [[[0.35390502630495557]], [[0.29835403681736367]], [[0.22297851382984835]]], "std": [[[0.1421013998551187]], [[0.1328375248032545]], [[0.14220236776450113]]], "count": [100]}, "observation.state": {"min": [-0.45154711604118347, -0.19376659393310547, 1.0127849578857422, 1.8208404779434204, -2.3419628143310547, -0.5112192630767822, 0.011867837980389595, -0.03987428545951843], "max": [-0.16868720948696136, 0.15088100731372833, 1.295893669128418, 3.1415395736694336, 0.00021849283075425774, 0.07529619336128235, 0.03986746445298195, -0.011312942951917648], "mean": [-0.2587764263153076, -0.021201996132731438, 1.1714009046554565, 2.7017011642456055, -1.230130672454834, -0.17678917944431305, 0.022691842168569565, -0.022564826533198357], "std": [0.08008177578449249, 0.12388084083795547, 0.08032793551683426, 0.4623536467552185, 0.736475944519043, 0.16804583370685577, 0.01134176179766655, 0.011429330334067345], "count": [174]}, "action": {"min": [-0.8062499761581421, -0.5892857313156128, -0.9375, -0.17142857611179352, -0.07357142865657806, -0.13571429252624512, 0.0], "max": [0.4982142746448517, 0.4151785671710968, 0.862500011920929, 0.05285714194178581, 0.10642857104539871, 0.1007142886519432, 1.0], "mean": [-0.11311577260494232, -0.04507390409708023, -0.09287253022193909, -0.019573071971535683, 0.004729061853140593, -0.07910513877868652, 0.28735631704330444], "std": [0.301238089799881, 0.2992382347583771, 0.4326930642127991, 0.053184427320957184, 0.03897695615887642, 0.043479837477207184, 0.45252856612205505], "count": [174]}, "timestamp": {"min": [0.0], "max": [8.65], "mean": [4.325], "std": [2.51143219431994], "count": [174]}, "frame_index": {"min": [0], "max": [173], "mean": [86.5], "std": [50.22864388639879], "count": [174]}, "episode_index": {"min": [81], "max": [81], "mean": [81.0], "std": [0.0], "count": [174]}, "index": {"min": [22647], "max": [22820], "mean": [22733.5], "std": [50.22864388639879], "count": [174]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [174]}}} +{"episode_index": 82, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3151096723967907]], [[0.26241291479970896]], [[0.232486130658318]]], "std": [[[0.14977102550441737]], [[0.146901964639276]], [[0.15368833118998462]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3122852107029335]], [[0.2674289999569164]], [[0.23480725636201746]]], "std": [[[0.15553903812688866]], [[0.17000576786943122]], [[0.17820607113935785]]], "count": [100]}, "observation.state": {"min": [-0.16142518818378448, -0.1144849881529808, 0.4475381374359131, 2.831251859664917, -1.1644657850265503, -0.3615725636482239, 0.020682038739323616, -0.040234990417957306], "max": [0.07454538345336914, 0.2853718101978302, 0.6830334067344666, 3.1795401573181152, 0.0001997272192966193, 0.1915373057126999, 0.040003709495067596, -0.02075764909386635], "mean": [-0.019926391541957855, 0.07130751758813858, 0.5875072479248047, 3.0210764408111572, -0.7066458463668823, -0.14105728268623352, 0.033130306750535965, -0.034920576959848404], "std": [0.07131703197956085, 0.14252598583698273, 0.06489316374063492, 0.10337051749229431, 0.4067985713481903, 0.12681511044502258, 0.00731333764269948, 0.006702309008687735], "count": [290]}, "action": {"min": [-0.5517857074737549, -0.7419642806053162, -0.6000000238418579, -0.06428571790456772, -0.0835714265704155, -0.2239285707473755, 0.0], "max": [0.7767857313156128, 0.8303571343421936, 0.9375, 0.08571428805589676, 0.12535713613033295, 0.2507142722606659, 1.0], "mean": [-0.0029371860437095165, 0.06010160595178604, -0.046745702624320984, 0.0024938415735960007, 0.0040381778962910175, -0.005818965844810009, 0.5827586054801941], "std": [0.2654636800289154, 0.38310208916664124, 0.3856857419013977, 0.023056788370013237, 0.03240211308002472, 0.0741143673658371, 0.49310338497161865], "count": [290]}, "timestamp": {"min": [0.0], "max": [14.45], "mean": [7.225], "std": [4.185764565763344], "count": [290]}, "frame_index": {"min": [0], "max": [289], "mean": [144.5], "std": [83.7152913152669], "count": [290]}, "episode_index": {"min": [82], "max": [82], "mean": [82.0], "std": [0.0], "count": [290]}, "index": {"min": [22821], "max": [23110], "mean": [22965.5], "std": [83.7152913152669], "count": [290]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [290]}}} +{"episode_index": 83, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3279912659888174]], [[0.27253915165919884]], [[0.23981960161994484]]], "std": [[[0.15349483875206985]], [[0.15300043384452072]], [[0.159905042075945]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3146941923253676]], [[0.2693644786161535]], [[0.23631927430395985]]], "std": [[[0.15772716243007476]], [[0.17287348737926325]], [[0.18103499296903788]]], "count": [100]}, "observation.state": {"min": [-0.16776001453399658, -0.10985665023326874, 0.4481879770755768, 2.9978795051574707, -1.0126159191131592, -0.42860573530197144, 0.02234259434044361, -0.04053116217255592], "max": [0.08482911437749863, 0.30102503299713135, 0.7575521469116211, 3.203930616378784, 0.0028679000679403543, 0.3998538851737976, 0.040933579206466675, -0.015992607921361923], "mean": [-0.019556237384676933, 0.11283086985349655, 0.6125483512878418, 3.1253983974456787, -0.47191834449768066, -0.10561585426330566, 0.03305899724364281, -0.03155812993645668], "std": [0.07399816066026688, 0.1400580257177353, 0.07763209939002991, 0.05166509747505188, 0.3438732922077179, 0.20095151662826538, 0.006625083740800619, 0.008377515710890293], "count": [292]}, "action": {"min": [-0.5383928418159485, -0.7098214030265808, -0.7714285850524902, -0.08464285731315613, -0.1639285683631897, -0.14892856776714325, 0.0], "max": [0.8758928775787354, 0.8544642925262451, 0.9375, 0.06857142597436905, 0.13500000536441803, 0.1371428519487381, 1.0], "mean": [0.04049047455191612, 0.08017368614673615, -0.023593436926603317, 0.0026785717345774174, 0.00555528374388814, -0.011649947613477707, 0.48630136251449585], "std": [0.29661068320274353, 0.37997326254844666, 0.4365693926811218, 0.02223658747971058, 0.056023504585027695, 0.06409993022680283, 0.4998117983341217], "count": [292]}, "timestamp": {"min": [0.0], "max": [14.55], "mean": [7.275], "std": [4.214632249674934], "count": [292]}, "frame_index": {"min": [0], "max": [291], "mean": [145.5], "std": [84.2926449934987], "count": [292]}, "episode_index": {"min": [83], "max": [83], "mean": [83.0], "std": [0.0], "count": [292]}, "index": {"min": [23111], "max": [23402], "mean": [23256.5], "std": [84.2926449934987], "count": [292]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [292]}}} +{"episode_index": 84, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5608872507132736]], [[0.5173944887647443]], [[0.46080509081073834]]], "std": [[[0.3015820064635536]], [[0.2725774951505418]], [[0.2431430072624518]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.507185292561849]], [[0.47605811145258886]], [[0.42986922140682443]]], "std": [[[0.310109224787278]], [[0.28334005712738997]], [[0.262128905992241]]], "count": [100]}, "observation.state": {"min": [-0.31501734256744385, -0.03915650025010109, 0.9675690531730652, 2.4242818355560303, -2.5933990478515625, -0.9197272658348083, 0.009083333425223827, -0.04000813513994217], "max": [0.037706322968006134, 0.2686363756656647, 1.186641812324524, 3.209805488586426, -0.002933214884251356, -0.06681858748197556, 0.04000980406999588, -0.006855330895632505], "mean": [-0.07207497209310532, 0.07573380321264267, 1.0760565996170044, 2.683396339416504, -1.979690432548523, -0.5876918435096741, 0.03194451332092285, -0.031695540994405746], "std": [0.09040068835020065, 0.09663917124271393, 0.06315401196479797, 0.252913236618042, 0.6612080931663513, 0.22148975729942322, 0.012775535695254803, 0.013110386207699776], "count": [247]}, "action": {"min": [-0.9267857074737549, -0.8892857432365417, -0.6080357432365417, -0.16178570687770844, -0.12857143580913544, -0.3042857050895691, 0.0], "max": [0.9375, 0.8330357074737549, 0.5491071343421936, 0.14142857491970062, 0.14785714447498322, 0.26249998807907104, 1.0], "mean": [0.03999421373009682, 0.09166789054870605, -0.026948388665914536, 0.0029540222603827715, 0.02243492379784584, -0.02936234511435032, 0.7489878535270691], "std": [0.40809521079063416, 0.3182813227176666, 0.23828157782554626, 0.06464944034814835, 0.05816645175218582, 0.12052765488624573, 0.4335956275463104], "count": [247]}, "timestamp": {"min": [0.0], "max": [12.3], "mean": [6.1499999999999995], "std": [3.5651086939951773], "count": [247]}, "frame_index": {"min": [0], "max": [246], "mean": [123.0], "std": [71.30217387990355], "count": [247]}, "episode_index": {"min": [84], "max": [84], "mean": [84.0], "std": [0.0], "count": [247]}, "index": {"min": [23403], "max": [23649], "mean": [23526.0], "std": [71.30217387990355], "count": [247]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [247]}}} +{"episode_index": 85, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35093945492015166]], [[0.2875272324505974]], [[0.24312287633559282]]], "std": [[[0.15575474974586867]], [[0.1566970669973386]], [[0.16245384394904672]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3076520876416973]], [[0.2580767786362592]], [[0.22440189615885417]]], "std": [[[0.14339342737071378]], [[0.15581989881063915]], [[0.1637040168528375]]], "count": [100]}, "observation.state": {"min": [-0.10943444818258286, -0.28331172466278076, 0.5069107413291931, 2.995861768722534, -0.7154739499092102, -0.3058989346027374, 0.001613742089830339, -0.039863020181655884], "max": [0.045825183391571045, 0.39128610491752625, 0.6768941283226013, 3.1481335163116455, 0.3225025534629822, 0.3439963757991791, 0.03995697572827339, -0.00281088100746274], "mean": [-0.023527324199676514, 0.031309377402067184, 0.570736825466156, 3.100001811981201, -0.11435935646295547, -0.09837674349546432, 0.018719427287578583, -0.018833201378583908], "std": [0.03573178872466087, 0.23649169504642487, 0.04937687888741493, 0.03813692554831505, 0.30373427271842957, 0.15931975841522217, 0.016632884740829468, 0.01645001769065857], "count": [292]}, "action": {"min": [-0.32678571343421936, -0.5705357193946838, -0.6669642925262451, -0.03857142850756645, -0.14142857491970062, -0.11142857372760773, 0.0], "max": [0.5732142925262451, 0.8089285492897034, 0.6910714507102966, 0.07607142627239227, 0.16607142984867096, 0.07821428775787354, 1.0], "mean": [0.017713431268930435, 0.08994316309690475, -0.06142366677522659, 0.0013319473946467042, 0.0020731412805616856, -0.013257090002298355, 0.4109589159488678], "std": [0.17276118695735931, 0.3680582344532013, 0.32404330372810364, 0.017916981130838394, 0.0470740832388401, 0.03622011840343475, 0.4920080602169037], "count": [292]}, "timestamp": {"min": [0.0], "max": [14.55], "mean": [7.275], "std": [4.214632249674934], "count": [292]}, "frame_index": {"min": [0], "max": [291], "mean": [145.5], "std": [84.2926449934987], "count": [292]}, "episode_index": {"min": [85], "max": [85], "mean": [85.0], "std": [0.0], "count": [292]}, "index": {"min": [23650], "max": [23941], "mean": [23795.5], "std": [84.2926449934987], "count": [292]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [292]}}} +{"episode_index": 86, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5834055558746937]], [[0.5338470829982384]], [[0.48422556200214456]]], "std": [[[0.28585150923054925]], [[0.2593409548532821]], [[0.2292752486068787]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5652459100461473]], [[0.5269292644425935]], [[0.47716899258482687]]], "std": [[[0.29331954333873894]], [[0.2695466350255948]], [[0.2510568299414161]]], "count": [100]}, "observation.state": {"min": [-0.1946450024843216, -0.2886890769004822, 1.00644850730896, 2.2474844455718994, -2.8482344150543213, -0.6721014976501465, 0.009625012055039406, -0.0399695448577404], "max": [0.12393008917570114, 0.222092404961586, 1.18782377243042, 3.1637539863586426, 0.0015068372013047338, -0.09216298162937164, 0.040009453892707825, -0.011005997657775879], "mean": [0.006581178400665522, -0.04238172620534897, 1.1057254076004028, 2.609395980834961, -1.9774742126464844, -0.426103800535202, 0.03100399300456047, -0.03160286322236061], "std": [0.06260448694229126, 0.15160486102104187, 0.05734771117568016, 0.24491657316684723, 0.6865325570106506, 0.12139290571212769, 0.011451608501374722, 0.011025315150618553], "count": [421]}, "action": {"min": [-0.3482142984867096, -0.7928571701049805, -0.4178571403026581, -0.1039285734295845, -0.09321428835391998, -0.3042857050895691, 0.0], "max": [0.5946428775787354, 0.7205356955528259, 0.6026785969734192, 0.05249999836087227, 0.11571428924798965, 0.17892856895923615, 1.0], "mean": [0.034827761352062225, -0.026022227481007576, -0.031824756413698196, 0.0022192117758095264, 0.005423311609774828, -0.017919080331921577, 0.5819477438926697], "std": [0.22451508045196533, 0.33646681904792786, 0.27234071493148804, 0.02584817446768284, 0.03852536156773567, 0.11030225455760956, 0.49323827028274536], "count": [421]}, "timestamp": {"min": [0.0], "max": [21.0], "mean": [10.5], "std": [6.076594440967736], "count": [421]}, "frame_index": {"min": [0], "max": [420], "mean": [210.0], "std": [121.53188881935473], "count": [421]}, "episode_index": {"min": [86], "max": [86], "mean": [86.0], "std": [0.0], "count": [421]}, "index": {"min": [23942], "max": [24362], "mean": [24152.0], "std": [121.53188881935473], "count": [421]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [421]}}} +{"episode_index": 87, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.572525364296109]], [[0.535456983977673]], [[0.4994295456830193]]], "std": [[[0.2641208239185736]], [[0.24286037929906265]], [[0.22131437061572853]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5362285658892463]], [[0.5013863716873468]], [[0.4531592694450827]]], "std": [[[0.29914584717353854]], [[0.27324862880215844]], [[0.2535311179836077]]], "count": [100]}, "observation.state": {"min": [-0.22060343623161316, -0.07955332100391388, 0.9279797673225403, 2.373709201812744, -0.041464827954769135, -0.2587582767009735, 0.004554372280836105, -0.039799053221940994], "max": [0.10545261949300766, 0.1993044763803482, 1.1728830337524414, 3.1768765449523926, 2.6492974758148193, 0.762519359588623, 0.04090471565723419, -0.0012115980498492718], "mean": [-0.07497161626815796, 0.07221466302871704, 1.0526748895645142, 2.762024164199829, 1.541110634803772, 0.047233618795871735, 0.029150299727916718, -0.027474813163280487], "std": [0.12370605021715164, 0.10140417516231537, 0.08415952324867249, 0.29198917746543884, 1.0216457843780518, 0.2467159777879715, 0.013182305730879307, 0.014851906336843967], "count": [263]}, "action": {"min": [-0.4285714328289032, -0.6133928298950195, -0.8705357313156128, -0.04285714402794838, -0.13500000536441803, -0.05785714462399483, 0.0], "max": [0.7982142567634583, 0.6830357313156128, 0.65625, 0.11464285850524902, 0.15857142210006714, 0.375, 1.0], "mean": [0.01672324351966381, 0.06812532246112823, -0.11653311550617218, 0.02389734424650669, -0.011777566745877266, 0.05076859891414642, 0.6197718381881714], "std": [0.2826719880104065, 0.28468185663223267, 0.3876174986362457, 0.03068586066365242, 0.05082479491829872, 0.09938378632068634, 0.4854426681995392], "count": [263]}, "timestamp": {"min": [0.0], "max": [13.1], "mean": [6.550000000000001], "std": [3.7960505792204615], "count": [263]}, "frame_index": {"min": [0], "max": [262], "mean": [131.0], "std": [75.92101158440923], "count": [263]}, "episode_index": {"min": [87], "max": [87], "mean": [87.0], "std": [0.0], "count": [263]}, "index": {"min": [24363], "max": [24625], "mean": [24494.0], "std": [75.92101158440923], "count": [263]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [263]}}} +{"episode_index": 88, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34336748429840686]], [[0.27892034194048715]], [[0.23456942868700215]]], "std": [[[0.14381496680794634]], [[0.14259382070412574]], [[0.1474608241086666]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3095935327866498]], [[0.2604433563830806]], [[0.22689818737553616]]], "std": [[[0.14592265469153376]], [[0.1584817863055944]], [[0.1663871754577751]]], "count": [100]}, "observation.state": {"min": [-0.11616400629281998, -0.2714536488056183, 0.5082763433456421, 2.9702913761138916, -0.47240960597991943, -0.23069645464420319, 0.0027118416037410498, -0.03991372510790825], "max": [0.038075048476457596, 0.3693923056125641, 0.6796607375144958, 3.1425070762634277, 0.5126990079879761, -0.02216627635061741, 0.03985343500971794, -0.002940842416137457], "mean": [-0.016883937641978264, -0.00029790843836963177, 0.5868661403656006, 3.054567575454712, 0.12532559037208557, -0.11995463073253632, 0.020272271707654, -0.020440466701984406], "std": [0.04463215544819832, 0.2114967554807663, 0.04779280722141266, 0.045406024903059006, 0.2324134260416031, 0.04994865506887436, 0.016939695924520493, 0.016789689660072327], "count": [269]}, "action": {"min": [-0.40982142090797424, -0.6669642925262451, -0.6000000238418579, -0.05999999865889549, -0.1103571429848671, -0.12214285880327225, 0.0], "max": [0.6428571343421936, 0.8142856955528259, 0.6883928775787354, 0.051428571343421936, 0.06857142597436905, 0.10499999672174454, 1.0], "mean": [0.02633761800825596, 0.09636884182691574, -0.046153075993061066, -0.0025849698577076197, -0.0004699947021435946, -0.009674722328782082, 0.4758364260196686], "std": [0.20910856127738953, 0.37234652042388916, 0.2948305904865265, 0.01760115474462509, 0.021839704364538193, 0.043912310153245926, 0.4994156062602997], "count": [269]}, "timestamp": {"min": [0.0], "max": [13.4], "mean": [6.700000000000001], "std": [3.8826537316634355], "count": [269]}, "frame_index": {"min": [0], "max": [268], "mean": [134.0], "std": [77.6530746332687], "count": [269]}, "episode_index": {"min": [88], "max": [88], "mean": [88.0], "std": [0.0], "count": [269]}, "index": {"min": [24626], "max": [24894], "mean": [24760.0], "std": [77.6530746332687], "count": [269]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [269]}}} +{"episode_index": 89, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.600259729123583]], [[0.555966968611175]], [[0.5051714369829964]]], "std": [[[0.27680504657060234]], [[0.2594876725461318]], [[0.23764852487059746]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5498300404268153]], [[0.5098165845683976]], [[0.459791649313534]]], "std": [[[0.2974937768477485]], [[0.2765208655885374]], [[0.2619277291924044]]], "count": [100]}, "observation.state": {"min": [-0.20770519971847534, -0.06145641952753067, 0.9334927201271057, 2.3550336360931396, -2.1256067752838135, -0.902605414390564, 0.002146368380635977, -0.04000397399067879], "max": [0.023305032402276993, 0.18852770328521729, 1.1688560247421265, 3.141855001449585, 0.0012226381804794073, 0.20967969298362732, 0.04000689089298248, -0.0009214478195644915], "mean": [-0.02533331885933876, 0.03823690861463547, 1.0305014848709106, 2.709017753601074, -1.603972315788269, -0.164443239569664, 0.02673228830099106, -0.02667589671909809], "std": [0.051836706697940826, 0.08417022228240967, 0.07590765506029129, 0.24408499896526337, 0.5585421323776245, 0.3900381028652191, 0.016151558607816696, 0.017412038519978523], "count": [229]}, "action": {"min": [-0.4553571343421936, -0.6803571581840515, -0.5705357193946838, -0.04714285582304001, -0.09107142686843872, -0.2239285707473755, 0.0], "max": [0.6321428418159485, 0.8089285492897034, 0.8383928537368774, 0.14571428298950195, 0.2142857164144516, 0.04928571358323097, 1.0], "mean": [0.01608312875032425, 0.16863302886486053, -0.12913286685943604, 0.017727693542838097, 0.0023767929524183273, -0.050904564559459686, 0.6593886613845825], "std": [0.2826765477657318, 0.3613632023334503, 0.37175193428993225, 0.03942932188510895, 0.057662349194288254, 0.07055602967739105, 0.47391477227211], "count": [229]}, "timestamp": {"min": [0.0], "max": [11.4], "mean": [5.7], "std": [3.3052987762076818], "count": [229]}, "frame_index": {"min": [0], "max": [228], "mean": [114.0], "std": [66.10597552415364], "count": [229]}, "episode_index": {"min": [89], "max": [89], "mean": [89.0], "std": [0.0], "count": [229]}, "index": {"min": [24895], "max": [25123], "mean": [25009.0], "std": [66.10597552415364], "count": [229]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [229]}}} +{"episode_index": 90, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6176564019895068]], [[0.5708383681353401]], [[0.5171105047487745]]], "std": [[[0.26436027937123396]], [[0.24702920298360698]], [[0.22582863248961502]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5471293311025582]], [[0.5072069773954503]], [[0.45701446293849574]]], "std": [[[0.29991717601333395]], [[0.27868382975706624]], [[0.2639143613321279]]], "count": [100]}, "observation.state": {"min": [-0.19131606817245483, -0.08096735179424286, 0.9109736084938049, 2.5197439193725586, -1.6902323961257935, -0.9104810953140259, 0.0023973502684384584, -0.039826225489377975], "max": [0.03395000845193863, 0.1902008056640625, 1.1832733154296875, 3.1417455673217773, -0.0038930638693273067, 0.3241398334503174, 0.040237199515104294, -0.002214467851445079], "mean": [-0.01789357326924801, 0.024806316941976547, 1.0308068990707397, 2.8135106563568115, -1.3697516918182373, -0.1313689798116684, 0.028900783509016037, -0.028255173936486244], "std": [0.05702134221792221, 0.07941313832998276, 0.09651955217123032, 0.16555610299110413, 0.4637179374694824, 0.42080923914909363, 0.016202539205551147, 0.01607212796807289], "count": [223]}, "action": {"min": [-0.5517857074737549, -0.7446428537368774, -0.5919643044471741, -0.046071428805589676, -0.13607142865657806, -0.27321428060531616, 0.0], "max": [0.6294642686843872, 0.8276785612106323, 0.8866071701049805, 0.19928571581840515, 0.18321429193019867, 0.08464285731315613, 1.0], "mean": [0.01190339494496584, 0.15158554911613464, -0.12992869317531586, 0.0202226173132658, 0.005049644969403744, -0.04354419931769371, 0.713004469871521], "std": [0.2847638726234436, 0.38831982016563416, 0.3697569966316223, 0.045854903757572174, 0.06067535653710365, 0.08499464392662048, 0.45235976576805115], "count": [223]}, "timestamp": {"min": [0.0], "max": [11.1], "mean": [5.550000000000001], "std": [3.218695387886217], "count": [223]}, "frame_index": {"min": [0], "max": [222], "mean": [111.0], "std": [64.37390775772433], "count": [223]}, "episode_index": {"min": [90], "max": [90], "mean": [90.0], "std": [0.0], "count": [223]}, "index": {"min": [25124], "max": [25346], "mean": [25235.0], "std": [64.37390775772433], "count": [223]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [223]}}} +{"episode_index": 91, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3383693877575444]], [[0.2696331200693168]], [[0.22590529497931985]]], "std": [[[0.14881252851680773]], [[0.1426810834607839]], [[0.14238254855289123]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3280125020345052]], [[0.28355243697820925]], [[0.2504882256002987]]], "std": [[[0.16749621656557057]], [[0.18281008129719212]], [[0.19247292487516102]]], "count": [100]}, "observation.state": {"min": [-0.05530741065740585, -0.20895583927631378, 0.4482235312461853, 3.0716142654418945, -0.39505535364151, -0.29087239503860474, 0.01926942728459835, -0.03983282297849655], "max": [0.14829739928245544, 0.25437048077583313, 0.7242522239685059, 3.2645909786224365, 0.22513160109519958, 0.06890249997377396, 0.04000147432088852, -0.01940501481294632], "mean": [0.06664718687534332, 0.029924925416707993, 0.6067984104156494, 3.1653339862823486, -0.10556001961231232, -0.14807818830013275, 0.030023353174328804, -0.029576832428574562], "std": [0.05756236985325813, 0.15858590602874756, 0.08250655978918076, 0.05971387401223183, 0.17419998347759247, 0.0980198085308075, 0.008992168121039867, 0.009401559829711914], "count": [258]}, "action": {"min": [-0.6776785850524902, -0.8303571343421936, -0.8357142806053162, -0.09535714238882065, -0.08250000327825546, -0.1542857140302658, 0.0], "max": [0.6830357313156128, 0.8812500238418579, 0.9375, 0.10499999672174454, 0.12107142806053162, 0.1574999988079071, 1.0], "mean": [0.012551904655992985, 0.08518482744693756, -0.03127077966928482, 0.0019642857369035482, 0.0033720924984663725, 0.006931062787771225, 0.5193798542022705], "std": [0.3094235360622406, 0.4557454586029053, 0.47954466938972473, 0.04187142103910446, 0.03916776552796364, 0.05262909084558487, 0.4996245801448822], "count": [258]}, "timestamp": {"min": [0.0], "max": [12.85], "mean": [6.425000000000001], "std": [3.723881263771264], "count": [258]}, "frame_index": {"min": [0], "max": [257], "mean": [128.5], "std": [74.47762527542528], "count": [258]}, "episode_index": {"min": [91], "max": [91], "mean": [91.0], "std": [0.0], "count": [258]}, "index": {"min": [25347], "max": [25604], "mean": [25475.5], "std": [74.47762527542528], "count": [258]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [258]}}} +{"episode_index": 92, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33076695042030485]], [[0.262128724341299]], [[0.21743224559110752]]], "std": [[[0.14435535881132555]], [[0.13446916887334825]], [[0.1281699319041364]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32361567059685203]], [[0.2764360094257429]], [[0.24187689568014706]]], "std": [[[0.16498331090291207]], [[0.1801010146831996]], [[0.1902528658246625]]], "count": [100]}, "observation.state": {"min": [-0.10547015815973282, -0.16201558709144592, 0.48064032196998596, 2.9628474712371826, -0.3846975862979889, -0.3023589551448822, 0.01970885694026947, -0.03989333659410477], "max": [0.06171369552612305, 0.24722053110599518, 0.73201584815979, 3.2759599685668945, 0.22011278569698334, 0.496334046125412, 0.03995952382683754, -0.01973237469792366], "mean": [-0.014432566240429878, 0.03191806748509407, 0.6220149993896484, 3.1115682125091553, -0.09159361571073532, 0.05477798730134964, 0.031638987362384796, -0.03260902687907219], "std": [0.047309812158346176, 0.1386353224515915, 0.07703512907028198, 0.07755271345376968, 0.18625405430793762, 0.20854440331459045, 0.008140824735164642, 0.008017933927476406], "count": [280]}, "action": {"min": [-0.40714284777641296, -0.862500011920929, -0.9107142686843872, -0.1103571429848671, -0.1371428519487381, -0.07071428745985031, 0.0], "max": [0.5758928656578064, 0.862500011920929, 0.9375, 0.07500000298023224, 0.18000000715255737, 0.08250000327825546, 1.0], "mean": [0.06930802017450333, 0.07232144474983215, 0.027264032512903214, -0.003868621541187167, 0.013783162459731102, -0.006669646594673395, 0.5285714268684387], "std": [0.24650970101356506, 0.4134124219417572, 0.491634339094162, 0.03918413445353508, 0.08385040611028671, 0.026207538321614265, 0.4991830885410309], "count": [280]}, "timestamp": {"min": [0.0], "max": [13.95], "mean": [6.975], "std": [4.041426109679602], "count": [280]}, "frame_index": {"min": [0], "max": [279], "mean": [139.5], "std": [80.82852219359204], "count": [280]}, "episode_index": {"min": [92], "max": [92], "mean": [92.0], "std": [0.0], "count": [280]}, "index": {"min": [25605], "max": [25884], "mean": [25744.5], "std": [80.82852219359204], "count": [280]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [280]}}} +{"episode_index": 93, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5574364420572916]], [[0.523684627158969]], [[0.49143852144129135]]], "std": [[[0.26210438650682405]], [[0.23808430648932388]], [[0.2153985078073151]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5361008414474189]], [[0.5015565047918581]], [[0.4531183687097886]]], "std": [[[0.2999771826357938]], [[0.2738891870973629]], [[0.2540675932651043]]], "count": [100]}, "observation.state": {"min": [-0.21192514896392822, -0.058901283890008926, 0.9566009640693665, 1.3127037286758423, 0.0006567949312739074, -0.20791079103946686, 0.0009093564585782588, -0.04080484062433243], "max": [0.09625843912363052, 0.20083583891391754, 1.1679729223251343, 3.2153849601745605, 3.0668506622314453, 0.5184304714202881, 0.03989679366350174, -0.0032976765651255846], "mean": [-0.06519883871078491, 0.09297729283571243, 1.0497522354125977, 2.5760743618011475, 1.42586350440979, 0.09051482379436493, 0.02506317012012005, -0.025960562750697136], "std": [0.11542265117168427, 0.09407395124435425, 0.07254548370838165, 0.6342618465423584, 1.1046440601348877, 0.2525721490383148, 0.014777909964323044, 0.014721631072461605], "count": [235]}, "action": {"min": [-0.6053571701049805, -0.7419642806053162, -0.9375, -0.06750000268220901, -0.1907142847776413, -0.035357143729925156, 0.0], "max": [0.8330357074737549, 0.7473214268684387, 0.7821428775787354, 0.10499999672174454, 0.16607142984867096, 0.375, 1.0], "mean": [0.0019604952540248632, 0.05345745384693146, -0.17579400539398193, 0.009205169044435024, -0.015369299799203873, 0.08428264409303665, 0.5404255390167236], "std": [0.3302649259567261, 0.3196209967136383, 0.42698827385902405, 0.024541683495044708, 0.05914685130119324, 0.09885438531637192, 0.4983631372451782], "count": [235]}, "timestamp": {"min": [0.0], "max": [11.7], "mean": [5.85], "std": [3.391902121229326], "count": [235]}, "frame_index": {"min": [0], "max": [234], "mean": [117.0], "std": [67.83804242458652], "count": [235]}, "episode_index": {"min": [93], "max": [93], "mean": [93.0], "std": [0.0], "count": [235]}, "index": {"min": [25885], "max": [26119], "mean": [26002.0], "std": [67.83804242458652], "count": [235]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [235]}}} +{"episode_index": 94, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33462531834022674]], [[0.265860933191636]], [[0.22407869645661]]], "std": [[[0.13924634354357476]], [[0.132799526079748]], [[0.1372123953033306]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32547724166570924]], [[0.28066333067650884]], [[0.24776891012752758]]], "std": [[[0.16411942769866128]], [[0.17904056962956408]], [[0.18907046334940417]]], "count": [100]}, "observation.state": {"min": [-0.04617404192686081, -0.2138177752494812, 0.44749686121940613, 3.0594847202301025, -0.4473746120929718, -0.2558506727218628, 0.019568031653761864, -0.03983413055539131], "max": [0.1561601758003235, 0.26787859201431274, 0.6924740076065063, 3.244999408721924, 0.009794800542294979, 0.15441979467868805, 0.04032658413052559, -0.01819555275142193], "mean": [0.06593801826238632, 0.05562819540500641, 0.6023086309432983, 3.145557403564453, -0.22197318077087402, -0.11036856472492218, 0.02992195449769497, -0.029147492721676826], "std": [0.05255311354994774, 0.1673145741224289, 0.07586293667554855, 0.05599670857191086, 0.13723675906658173, 0.061790309846401215, 0.008665444329380989, 0.00940239429473877], "count": [257]}, "action": {"min": [-0.4821428656578064, -0.7366071343421936, -0.7821428775787354, -0.1071428582072258, -0.1371428519487381, -0.16285714507102966, 0.0], "max": [0.7473214268684387, 0.8999999761581421, 0.9375, 0.10285714268684387, 0.06750000268220901, 0.13928571343421936, 1.0], "mean": [0.006659950129687786, 0.09842967242002487, -0.03436286002397537, 0.003089215839281678, -0.0068829902447760105, -0.0006461923476308584, 0.49805447459220886], "std": [0.31571388244628906, 0.438186377286911, 0.4386495351791382, 0.040529023855924606, 0.03809310868382454, 0.04952319711446762, 0.49999621510505676], "count": [257]}, "timestamp": {"min": [0.0], "max": [12.8], "mean": [6.399999999999999], "std": [3.7094473981982814], "count": [257]}, "frame_index": {"min": [0], "max": [256], "mean": [128.0], "std": [74.18894796396563], "count": [257]}, "episode_index": {"min": [94], "max": [94], "mean": [94.0], "std": [0.0], "count": [257]}, "index": {"min": [26120], "max": [26376], "mean": [26248.0], "std": [74.18894796396563], "count": [257]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [257]}}} +{"episode_index": 95, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5719097487505745]], [[0.53662239224303]], [[0.5011288673550475]]], "std": [[[0.2573753160606617]], [[0.2353540960106367]], [[0.2127403671697989]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5390040791829427]], [[0.5038672784543505]], [[0.455050973331227]]], "std": [[[0.2998763603249177]], [[0.27392875684105217]], [[0.25435418463257514]]], "count": [100]}, "observation.state": {"min": [-0.20846575498580933, -0.07136279344558716, 0.9267476797103882, 1.596747636795044, -0.06599611788988113, -0.19452643394470215, 0.0018874212400987744, -0.04000629112124443], "max": [0.04833401367068291, 0.20823919773101807, 1.1756411790847778, 3.1501305103302, 3.0361392498016357, 0.5629421472549438, 0.0401344895362854, -0.006001078989356756], "mean": [-0.08753263205289841, 0.07833021879196167, 1.0473287105560303, 2.6278083324432373, 1.4314110279083252, 0.2160150110721588, 0.025441905483603477, -0.025558603927493095], "std": [0.10230953991413116, 0.10120033472776413, 0.07911694049835205, 0.4613281190395355, 1.045175552368164, 0.2659517824649811, 0.014959334395825863, 0.014774433337152004], "count": [242]}, "action": {"min": [-0.46875, -0.8196428418159485, -0.8357142806053162, -0.02142857201397419, -0.23250000178813934, -0.05249999836087227, 0.0], "max": [0.7848214507102966, 0.6669642925262451, 0.9375, 0.10178571194410324, 0.07821428775787354, 0.375, 1.0], "mean": [0.04988562688231468, 0.06687573343515396, -0.08461849391460419, 0.010988784953951836, -0.0026210155338048935, 0.08070249855518341, 0.5289255976676941], "std": [0.26592257618904114, 0.33274030685424805, 0.37943485379219055, 0.02598518319427967, 0.045999206602573395, 0.09729024767875671, 0.4991627037525177], "count": [242]}, "timestamp": {"min": [0.0], "max": [12.05], "mean": [6.0249999999999995], "std": [3.4929393066585055], "count": [242]}, "frame_index": {"min": [0], "max": [241], "mean": [120.5], "std": [69.85878613317011], "count": [242]}, "episode_index": {"min": [95], "max": [95], "mean": [95.0], "std": [0.0], "count": [242]}, "index": {"min": [26377], "max": [26618], "mean": [26497.5], "std": [69.85878613317011], "count": [242]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [242]}}} +{"episode_index": 96, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33048282638250615]], [[0.27604257261986825]], [[0.24644041592467067]]], "std": [[[0.1274545397567724]], [[0.12883653719115357]], [[0.14137803767969576]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3194474433450138]], [[0.2741143218395757]], [[0.24109714044309127]]], "std": [[[0.16091790974486916]], [[0.17702370461978462]], [[0.18593180180817753]]], "count": [100]}, "observation.state": {"min": [-0.20766529440879822, -0.08973460644483566, 0.4458763301372528, 2.9807894229888916, -0.5955422520637512, -0.2195015549659729, 0.022378655150532722, -0.039902035146951675], "max": [0.08286167681217194, 0.2561151683330536, 0.7113267779350281, 3.1795012950897217, 0.35962849855422974, 0.727899968624115, 0.040863800793886185, -0.01586185395717621], "mean": [-0.046392280608415604, 0.0938790887594223, 0.5984261631965637, 3.0877797603607178, -0.18551670014858246, 0.03910492733120918, 0.031747519969940186, -0.031455907970666885], "std": [0.08788686245679855, 0.11574701219797134, 0.07491053640842438, 0.04870268702507019, 0.3158964216709137, 0.2287442684173584, 0.007090660743415356, 0.00882627908140421], "count": [280]}, "action": {"min": [-0.8008928298950195, -0.7366071343421936, -0.6642857193946838, -0.08250000327825546, -0.12214285880327225, -0.11999999731779099, 0.0], "max": [0.8758928775787354, 0.8196428418159485, 0.9375, 0.03750000149011612, 0.23357142508029938, 0.2014285773038864, 1.0], "mean": [0.07305804640054703, 0.11117025464773178, 0.024355879053473473, -0.010373726487159729, 0.026575258001685143, 0.002713011344894767, 0.4714285731315613], "std": [0.394379585981369, 0.35247471928596497, 0.4831869602203369, 0.023453611880540848, 0.07669651508331299, 0.04986182227730751, 0.49918290972709656], "count": [280]}, "timestamp": {"min": [0.0], "max": [13.95], "mean": [6.975], "std": [4.041426109679602], "count": [280]}, "frame_index": {"min": [0], "max": [279], "mean": [139.5], "std": [80.82852219359204], "count": [280]}, "episode_index": {"min": [96], "max": [96], "mean": [96.0], "std": [0.0], "count": [280]}, "index": {"min": [26619], "max": [26898], "mean": [26758.5], "std": [80.82852219359204], "count": [280]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [280]}}} +{"episode_index": 97, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.602013464834176]], [[0.5564656192555146]], [[0.5049480806238511]]], "std": [[[0.27822897935161794]], [[0.26186005804568846]], [[0.24145413956008863]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.549491678275314]], [[0.5091292928059896]], [[0.45881990739411]]], "std": [[[0.2993037474940566]], [[0.27849485663106033]], [[0.263935724220768]]], "count": [100]}, "observation.state": {"min": [-0.2141706794500351, -0.08215941488742828, 0.911958634853363, 2.295584201812744, -2.2983033657073975, -1.1961534023284912, 0.0022084105294197798, -0.04016227647662163], "max": [0.05445301905274391, 0.20605483651161194, 1.1829501390457153, 3.1406362056732178, -0.0006094034761190414, 0.2701275050640106, 0.04009474068880081, -0.0007894368609413505], "mean": [-0.02602382004261017, 0.02648892067372799, 1.0373859405517578, 2.7125282287597656, -1.708469271659851, -0.15834473073482513, 0.02498197928071022, -0.023809006437659264], "std": [0.0622330904006958, 0.08803213387727737, 0.08529618382453918, 0.22355568408966064, 0.6166009306907654, 0.3374807834625244, 0.01732756197452545, 0.01801156811416149], "count": [249]}, "action": {"min": [-0.24375000596046448, -0.6776785850524902, -0.6053571701049805, -0.025714285671710968, -0.15214285254478455, -0.302142858505249, 0.0], "max": [0.731249988079071, 0.7205356955528259, 0.8116071224212646, 0.23571428656578064, 0.18321429193019867, 0.11357142776250839, 1.0], "mean": [0.08278825879096985, 0.1056906208395958, -0.08353053778409958, 0.025133393704891205, 0.010895006358623505, -0.044918276369571686, 0.5943775177001953], "std": [0.20737415552139282, 0.32568779587745667, 0.34087005257606506, 0.05471894517540932, 0.061660826206207275, 0.10000548511743546, 0.4910113513469696], "count": [249]}, "timestamp": {"min": [0.0], "max": [12.4], "mean": [6.2], "std": [3.593976442141304], "count": [249]}, "frame_index": {"min": [0], "max": [248], "mean": [124.0], "std": [71.87952884282609], "count": [249]}, "episode_index": {"min": [97], "max": [97], "mean": [97.0], "std": [0.0], "count": [249]}, "index": {"min": [26899], "max": [27147], "mean": [27023.0], "std": [71.87952884282609], "count": [249]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [249]}}} +{"episode_index": 98, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3189814082126991]], [[0.2667157963771446]], [[0.23701503978056065]]], "std": [[[0.1533637643074683]], [[0.15141010945352262]], [[0.15802753429679092]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31675412226658245]], [[0.27224646235447303]], [[0.23972890636967678]]], "std": [[[0.15821124766975628]], [[0.17373417935056826]], [[0.1823510711454795]]], "count": [100]}, "observation.state": {"min": [-0.19684287905693054, -0.11962632834911346, 0.4496563971042633, 2.8877675533294678, -1.1475248336791992, -0.5140766501426697, 0.02253641188144684, -0.04050055891275406], "max": [0.07850325852632523, 0.2794927656650543, 0.7125505805015564, 3.297184705734253, 0.0006491885287687182, 0.08070670068264008, 0.04043367877602577, -0.019316526129841805], "mean": [-0.022540196776390076, 0.07301069051027298, 0.5962830185890198, 3.0819528102874756, -0.600149929523468, -0.13213077187538147, 0.03385285288095474, -0.034025415778160095], "std": [0.08551247417926788, 0.14181771874427795, 0.06942559778690338, 0.11567872762680054, 0.4298471510410309, 0.1518981009721756, 0.006787074729800224, 0.007925459183752537], "count": [285]}, "action": {"min": [-0.4982142746448517, -0.6589285731315613, -0.675000011920929, -0.034285712987184525, -0.15964286029338837, -0.341785728931427, 0.0], "max": [0.8973214030265808, 0.8839285969734192, 0.9375, 0.19285714626312256, 0.1703571379184723, 0.36642858386039734, 1.0], "mean": [0.0006108959787525237, 0.07025374472141266, -0.029868416488170624, 0.011101502925157547, 0.009030078537762165, -0.008609013631939888, 0.5964912176132202], "std": [0.28883641958236694, 0.38214415311813354, 0.41061797738075256, 0.03246575593948364, 0.04920235648751259, 0.10453824698925018, 0.4906008541584015], "count": [285]}, "timestamp": {"min": [0.0], "max": [14.2], "mean": [7.1], "std": [4.113595345517916], "count": [285]}, "frame_index": {"min": [0], "max": [284], "mean": [142.0], "std": [82.27190691035833], "count": [285]}, "episode_index": {"min": [98], "max": [98], "mean": [98.0], "std": [0.0], "count": [285]}, "index": {"min": [27148], "max": [27432], "mean": [27290.0], "std": [82.27190691035833], "count": [285]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [285]}}} +{"episode_index": 99, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5170690947887944]], [[0.4786755365109911]], [[0.42617032698089]]], "std": [[[0.30946626204380845]], [[0.27951424698735855]], [[0.24810663667364358]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5100465357163373]], [[0.479107842538871]], [[0.43364255119772516]]], "std": [[[0.31110463723963755]], [[0.2849041950774951]], [[0.26426372580334934]]], "count": [100]}, "observation.state": {"min": [-0.34345170855522156, -0.07224409282207489, 0.9864860773086548, 2.4474918842315674, -2.5998404026031494, -1.281997799873352, 0.009222152642905712, -0.039958417415618896], "max": [0.026962582021951675, 0.24782179296016693, 1.198950171470642, 3.478184461593628, 0.3346656858921051, -0.05693303048610687, 0.04001589119434357, -0.009046482853591442], "mean": [-0.08394958078861237, 0.0719636082649231, 1.0791016817092896, 2.873322010040283, -1.7051500082015991, -0.7906647324562073, 0.03270469233393669, -0.032534196972846985], "std": [0.10871054977178574, 0.10317682474851608, 0.06358468532562256, 0.34020480513572693, 0.9129301905632019, 0.33732545375823975, 0.012571650557219982, 0.012566747143864632], "count": [288]}, "action": {"min": [-0.7258928418159485, -0.6723214387893677, -0.7232142686843872, -0.12321428209543228, -0.2014285773038864, -0.24642856419086456, 0.0], "max": [0.8866071701049805, 0.9026785492897034, 0.5919643044471741, 0.1907142847776413, 0.2142857164144516, 0.23892857134342194, 1.0], "mean": [0.05585937201976776, 0.11622951924800873, -0.038113828748464584, 0.012979913502931595, 0.016328122466802597, 0.008162216283380985, 0.7743055820465088], "std": [0.37320390343666077, 0.3415457606315613, 0.2475273758172989, 0.06749626994132996, 0.08035288006067276, 0.1330329030752182, 0.418038547039032], "count": [288]}, "timestamp": {"min": [0.0], "max": [14.35], "mean": [7.174999999999999], "std": [4.156896879484343], "count": [288]}, "frame_index": {"min": [0], "max": [287], "mean": [143.5], "std": [83.13793758968686], "count": [288]}, "episode_index": {"min": [99], "max": [99], "mean": [99.0], "std": [0.0], "count": [288]}, "index": {"min": [27433], "max": [27720], "mean": [27576.5], "std": [83.13793758968686], "count": [288]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [288]}}} +{"episode_index": 100, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5859599950453814]], [[0.5377458244772518]], [[0.48755905271043964]]], "std": [[[0.2868483630477464]], [[0.26041069264105]], [[0.23076864020029594]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5661247690238205]], [[0.5281690153234145]], [[0.47778034644033396]]], "std": [[[0.2935546256848457]], [[0.26952450879320766]], [[0.2510481739406575]]], "count": [100]}, "observation.state": {"min": [-0.18636831641197205, -0.29136303067207336, 1.0078001022338867, 2.25272274017334, -2.710463047027588, -0.7732008695602417, 0.0020935749635100365, -0.04016881063580513], "max": [0.07649938017129898, 0.18074654042720795, 1.2084143161773682, 3.2151341438293457, 0.0032427471596747637, -0.0993742123246193, 0.04000271111726761, -0.010983901098370552], "mean": [-0.009157740511000156, -0.053211309015750885, 1.1104578971862793, 2.5644617080688477, -2.03747296333313, -0.5668364763259888, 0.02634291909635067, -0.02853562869131565], "std": [0.05534415319561958, 0.14348123967647552, 0.06376689672470093, 0.2516346871852875, 0.6459075212478638, 0.13336148858070374, 0.014466851949691772, 0.012792170979082584], "count": [392]}, "action": {"min": [-0.2919642925262451, -0.862500011920929, -0.5249999761581421, -0.056785713881254196, -0.1371428519487381, -0.3642857074737549, 0.0], "max": [0.6883928775787354, 0.75, 0.6482142806053162, 0.05464285612106323, 0.21535713970661163, 0.1103571429848671, 1.0], "mean": [0.037978313863277435, -0.03193787485361099, -0.04500272870063782, 0.0003279887023381889, 0.017954634502530098, -0.023164168000221252, 0.5382652878761292], "std": [0.2060815989971161, 0.3721616268157959, 0.29706162214279175, 0.024553269147872925, 0.0561571903526783, 0.10454542934894562, 0.49853286147117615], "count": [392]}, "timestamp": {"min": [0.0], "max": [19.55], "mean": [9.775], "std": [5.658014227624388], "count": [392]}, "frame_index": {"min": [0], "max": [391], "mean": [195.5], "std": [113.16028455248777], "count": [392]}, "episode_index": {"min": [100], "max": [100], "mean": [100.0], "std": [0.0], "count": [392]}, "index": {"min": [27721], "max": [28112], "mean": [27916.5], "std": [113.16028455248777], "count": [392]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [392]}}} +{"episode_index": 101, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.313402696796492]], [[0.2541830061370251]], [[0.21698773013844208]]], "std": [[[0.1475624004812322]], [[0.14202207202507022]], [[0.14798639437078995]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3209397265864353]], [[0.27389720722273286]], [[0.23957967421587775]]], "std": [[[0.15896951078331117]], [[0.17369977547732848]], [[0.18367289356150535]]], "count": [100]}, "observation.state": {"min": [-0.10075216740369797, -0.17745527625083923, 0.48164910078048706, 3.0782201290130615, -0.756381630897522, -0.4487655460834503, 0.021908702328801155, -0.03996031731367111], "max": [0.03754401579499245, 0.26905250549316406, 0.7007254958152771, 3.241835594177246, 0.008687286637723446, 0.14409609138965607, 0.03990767523646355, -0.028146440163254738], "mean": [-0.04095419496297836, 0.053904131054878235, 0.6092668771743774, 3.129472494125366, -0.177253857254982, -0.1002265065908432, 0.03281765058636665, -0.035745035856962204], "std": [0.03343866765499115, 0.14814600348472595, 0.06464119255542755, 0.0367288812994957, 0.16927717626094818, 0.1428452432155609, 0.006834913976490498, 0.003657824359834194], "count": [278]}, "action": {"min": [-0.38035714626312256, -0.6776785850524902, -0.6723214387893677, -0.03214285895228386, -0.23357142508029938, -0.0803571417927742, 0.0], "max": [0.4714285731315613, 0.8062499761581421, 0.9375, 0.07607142627239227, 0.17142857611179352, -0.0, 1.0], "mean": [0.044822726398706436, 0.056635402143001556, -0.005655830726027489, 0.004297276027500629, 0.005896710325032473, -0.01431783102452755, 0.5251798629760742], "std": [0.16786232590675354, 0.3918089270591736, 0.3975289463996887, 0.014625184237957, 0.06652459502220154, 0.022963063791394234, 0.49936529994010925], "count": [278]}, "timestamp": {"min": [0.0], "max": [13.85], "mean": [6.925000000000001], "std": [4.012558410789804], "count": [278]}, "frame_index": {"min": [0], "max": [277], "mean": [138.5], "std": [80.25116821579608], "count": [278]}, "episode_index": {"min": [101], "max": [101], "mean": [101.0], "std": [0.0], "count": [278]}, "index": {"min": [28113], "max": [28390], "mean": [28251.5], "std": [80.25116821579608], "count": [278]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [278]}}} +{"episode_index": 102, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3110265323414522]], [[0.25260364008884806]], [[0.21547966631721047]]], "std": [[[0.15485271309689047]], [[0.1482009025467873]], [[0.15158154038163368]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3191905613319546]], [[0.2720649019129136]], [[0.23761189718807446]]], "std": [[[0.15885362058242747]], [[0.17309941049894284]], [[0.1827662864531453]]], "count": [100]}, "observation.state": {"min": [-0.11937619745731354, -0.1857183426618576, 0.4807848036289215, 2.916369676589966, -1.218671202659607, -0.30849167704582214, 0.030640091747045517, -0.039949916303157806], "max": [0.023118972778320312, 0.2843586206436157, 0.7255639433860779, 3.1801087856292725, 0.1556520164012909, 0.32738810777664185, 0.039955347776412964, -0.02961066924035549], "mean": [-0.05152096599340439, 0.052585162222385406, 0.6123923063278198, 3.075369358062744, -0.5420021414756775, -0.04932141676545143, 0.03562319651246071, -0.035294000059366226], "std": [0.03949514403939247, 0.16120003163814545, 0.0761476457118988, 0.07858875393867493, 0.441182017326355, 0.14560836553573608, 0.0038979470264166594, 0.004233004990965128], "count": [317]}, "action": {"min": [-0.23035714030265808, -0.7232142686843872, -0.5303571224212646, -0.07607142627239227, -0.0803571417927742, -0.11249999701976776, 0.0], "max": [0.4928571283817291, 0.8116071224212646, 0.9375, 0.034285712987184525, 0.14142857491970062, 0.04285714402794838, 1.0], "mean": [0.028991106897592545, 0.055160004645586014, -0.020338546484708786, 0.0008618749561719596, 0.002257773419842124, -0.020424753427505493, 0.5331230163574219], "std": [0.15309658646583557, 0.3662661612033844, 0.38764074444770813, 0.015890713781118393, 0.05301864445209503, 0.037337690591812134, 0.49890175461769104], "count": [317]}, "timestamp": {"min": [0.0], "max": [15.8], "mean": [7.9], "std": [4.575478117093338], "count": [317]}, "frame_index": {"min": [0], "max": [316], "mean": [158.0], "std": [91.50956234186677], "count": [317]}, "episode_index": {"min": [102], "max": [102], "mean": [102.0], "std": [0.0], "count": [317]}, "index": {"min": [28391], "max": [28707], "mean": [28549.0], "std": [91.50956234186677], "count": [317]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [317]}}} +{"episode_index": 103, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9803921568627451]], [[0.9882352941176471]]], "mean": [[[0.3414995206945083]], [[0.2653398658902037]], [[0.16900650981828277]]], "std": [[[0.21516891171095176]], [[0.16000096407137107]], [[0.1028332317127735]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.9764705882352941]], [[0.9803921568627451]]], "mean": [[[0.35601360784792435]], [[0.3001958312988281]], [[0.22477895280426624]]], "std": [[[0.14074168940499943]], [[0.13231098561129603]], [[0.14257633284405857]]], "count": [100]}, "observation.state": {"min": [-0.44342681765556335, -0.181595578789711, 0.9857202768325806, 2.0724802017211914, -2.0699384212493896, -0.4921904504299164, 0.013614892959594727, -0.03989756852388382], "max": [-0.17573922872543335, 0.18646490573883057, 1.2411597967147827, 3.1421046257019043, -0.0021888348273932934, -0.03295854479074478, 0.03995588421821594, -0.013750710524618626], "mean": [-0.2625160217285156, 0.008403324522078037, 1.138601541519165, 2.8521320819854736, -1.097011923789978, -0.1913772076368332, 0.024337802082300186, -0.024453897029161453], "std": [0.07550308853387833, 0.12804989516735077, 0.07402829825878143, 0.34890344738960266, 0.6559418439865112, 0.16273489594459534, 0.011600039899349213, 0.011470758356153965], "count": [184]}, "action": {"min": [-0.5973214507102966, -0.675000011920929, -0.8866071701049805, -0.08785714209079742, -0.030714286491274834, -0.14000000059604645, 0.0], "max": [0.5142857432365417, 0.4124999940395355, 0.8276785612106323, 0.055714286863803864, 0.09928571432828903, -0.0, 1.0], "mean": [-0.0800660029053688, -0.043992627412080765, -0.07348604500293732, -0.006409161724150181, 0.016358697786927223, -0.06704581528902054, 0.34239131212234497], "std": [0.2368423044681549, 0.3305329382419586, 0.3812152147293091, 0.02646218053996563, 0.026604993268847466, 0.04574804753065109, 0.4745103418827057], "count": [184]}, "timestamp": {"min": [0.0], "max": [9.15], "mean": [4.575], "std": [2.655772015817623], "count": [184]}, "frame_index": {"min": [0], "max": [183], "mean": [91.5], "std": [53.115440316352455], "count": [184]}, "episode_index": {"min": [103], "max": [103], "mean": [103.0], "std": [0.0], "count": [184]}, "index": {"min": [28708], "max": [28891], "mean": [28799.5], "std": [53.115440316352455], "count": [184]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [184]}}} +{"episode_index": 104, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.9764705882352941]], [[0.9882352941176471]]], "mean": [[[0.34137803081437657]], [[0.2653812926049326]], [[0.1696843734442019]]], "std": [[[0.2120895395730979]], [[0.1593856865362539]], [[0.10643707550880867]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9882352941176471]], [[0.9882352941176471]], [[0.9882352941176471]]], "mean": [[[0.35331550209195006]], [[0.29802824012905943]], [[0.22317335839365043]]], "std": [[[0.14257672136001234]], [[0.1332656793663535]], [[0.1424432456403642]]], "count": [100]}, "observation.state": {"min": [-0.43569737672805786, -0.18573129177093506, 0.9868379235267639, 2.171009063720703, -2.0134835243225098, -0.41300657391548157, 0.011737930588424206, -0.03988584131002426], "max": [-0.16347666084766388, 0.1685870885848999, 1.273282527923584, 3.1434998512268066, -7.782012107782066e-05, -0.04210976883769035, 0.03995535522699356, -0.015623209998011589], "mean": [-0.2527930438518524, -0.01007188018411398, 1.1589713096618652, 2.767462730407715, -1.1868928670883179, -0.21006330847740173, 0.022230975329875946, -0.02467966638505459], "std": [0.0753682404756546, 0.13800130784511566, 0.08402863144874573, 0.3577127158641815, 0.6115186810493469, 0.14006200432777405, 0.012637663632631302, 0.010791370645165443], "count": [189]}, "action": {"min": [-0.581250011920929, -0.8946428298950195, -0.9375, -0.05785714462399483, -0.020714284852147102, -0.17000000178813934, 0.0], "max": [0.38303571939468384, 0.4312500059604645, 0.918749988079071, 0.023571427911520004, 0.10571428388357162, -0.0, 1.0], "mean": [-0.06777210533618927, -0.06282593309879303, -0.0655045434832573, -0.008454270660877228, 0.012630384415388107, -0.06356766074895859, 0.32275131344795227], "std": [0.23348258435726166, 0.31757020950317383, 0.40089699625968933, 0.019371114671230316, 0.02289082482457161, 0.05844784155488014, 0.46752819418907166], "count": [189]}, "timestamp": {"min": [0.0], "max": [9.4], "mean": [4.7], "std": [2.727941837112123], "count": [189]}, "frame_index": {"min": [0], "max": [188], "mean": [94.0], "std": [54.55883674224247], "count": [189]}, "episode_index": {"min": [104], "max": [104], "mean": [104.0], "std": [0.0], "count": [189]}, "index": {"min": [28892], "max": [29080], "mean": [28986.0], "std": [54.55883674224247], "count": [189]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [189]}}} +{"episode_index": 105, "stats": {"observation.images.wrist_image": {"min": [[[0.011764705882352941]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3591425996668199]], [[0.2960225135952818]], [[0.25266932708141854]]], "std": [[[0.1479539678000353]], [[0.15274650090516806]], [[0.16092029331901286]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3156965290144378]], [[0.2665752832749311]], [[0.23310255761240042]]], "std": [[[0.14981805118309593]], [[0.1637826499742378]], [[0.17256104351220306]]], "count": [100]}, "observation.state": {"min": [-0.13567058742046356, -0.2628170847892761, 0.5024234056472778, 3.0082345008850098, -0.120487280189991, -0.1568041741847992, 0.003294692374765873, -0.03988496959209442], "max": [-0.009840342216193676, 0.365063339471817, 0.6814985275268555, 3.1989309787750244, 0.2739960849285126, 0.406173974275589, 0.040442030876874924, -0.004828545730561018], "mean": [-0.05760835111141205, 0.017288967967033386, 0.5699880719184875, 3.0864994525909424, 0.16028481721878052, 0.04327403008937836, 0.022868894040584564, -0.022763337939977646], "std": [0.035958632826805115, 0.2125030905008316, 0.04617086052894592, 0.05028587952256203, 0.10761439800262451, 0.13651400804519653, 0.016406254842877388, 0.01622714474797249], "count": [237]}, "action": {"min": [-0.4258928596973419, -0.6294642686843872, -0.5839285850524902, -0.07392857223749161, -0.20999999344348907, -0.08571428805589676, 0.0], "max": [0.5303571224212646, 0.8839285969734192, 0.6991071701049805, 0.07928571105003357, 0.12857143580913544, 0.10607142746448517, 1.0], "mean": [0.0038765829522162676, 0.1082843691110611, -0.06791366636753082, -0.0024999999441206455, -0.0012432173825800419, -0.0024095845874398947, 0.5189873576164246], "std": [0.19408205151557922, 0.41510361433029175, 0.3077603280544281, 0.02386394515633583, 0.0537419430911541, 0.029311250895261765, 0.4996393620967865], "count": [237]}, "timestamp": {"min": [0.0], "max": [11.8], "mean": [5.8999999999999995], "std": [3.4207698938494335], "count": [237]}, "frame_index": {"min": [0], "max": [236], "mean": [118.0], "std": [68.41539787698868], "count": [237]}, "episode_index": {"min": [105], "max": [105], "mean": [105.0], "std": [0.0], "count": [237]}, "index": {"min": [29081], "max": [29317], "mean": [29199.0], "std": [68.41539787698868], "count": [237]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [237]}}} +{"episode_index": 106, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5831312788421033]], [[0.5361184949687883]], [[0.4869393238740809]]], "std": [[[0.2838410567089241]], [[0.2576519899549881]], [[0.22864312197427122]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5685971248851103]], [[0.5305192153033088]], [[0.480366346172258]]], "std": [[[0.29687118683116454]], [[0.27370607159159416]], [[0.2560664260905241]]], "count": [100]}, "observation.state": {"min": [-0.20539988577365875, -0.26716771721839905, 1.0020463466644287, 2.4151690006256104, -2.569387674331665, -1.2478350400924683, 0.0004616903024725616, -0.039984915405511856], "max": [0.1082272157073021, 0.17388884723186493, 1.1851963996887207, 3.429320812225342, -0.003817647695541382, -0.07638785988092422, 0.04000575467944145, -0.007673610933125019], "mean": [-0.023990454152226448, -0.04202859476208687, 1.0946944952011108, 2.781291961669922, -1.948330283164978, -0.6828901171684265, 0.029121674597263336, -0.029498953372240067], "std": [0.07048150151968002, 0.13849294185638428, 0.056131087243556976, 0.27318528294563293, 0.6470603942871094, 0.31995782256126404, 0.014765704050660133, 0.011913063004612923], "count": [436]}, "action": {"min": [-0.4821428656578064, -0.7553571462631226, -0.49017858505249023, -0.039642855525016785, -0.06535714119672775, -0.21214285492897034, 0.0], "max": [0.5357142686843872, 0.731249988079071, 0.6294642686843872, 0.1339285671710968, 0.22499999403953552, 0.14678572118282318, 1.0], "mean": [0.06021871045231819, -0.053122952580451965, -0.030017202720046043, 0.016769325360655785, 0.017356649041175842, -0.006821752060204744, 0.5435779690742493], "std": [0.22603371739387512, 0.340701162815094, 0.21835263073444366, 0.027890179306268692, 0.05983065813779831, 0.08661573380231857, 0.49809786677360535], "count": [436]}, "timestamp": {"min": [0.0], "max": [21.75], "mean": [10.875], "std": [6.293101381671839], "count": [436]}, "frame_index": {"min": [0], "max": [435], "mean": [217.5], "std": [125.86202763343677], "count": [436]}, "episode_index": {"min": [106], "max": [106], "mean": [106.0], "std": [0.0], "count": [436]}, "index": {"min": [29318], "max": [29753], "mean": [29535.5], "std": [125.86202763343677], "count": [436]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [436]}}} +{"episode_index": 107, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3429480088177849]], [[0.2755088165881587]], [[0.22900527236040902]]], "std": [[[0.14528544960740414]], [[0.14309425225884473]], [[0.14413568972752477]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3135902943330653]], [[0.26502020682540595]], [[0.23163026218788296]]], "std": [[[0.14853568645465737]], [[0.16154980202978814]], [[0.16954323963704523]]], "count": [100]}, "observation.state": {"min": [-0.10470565408468246, -0.289157509803772, 0.5259655714035034, 2.8001699447631836, -1.2672858238220215, -0.2143120914697647, 0.0016623811097815633, -0.03982486575841904], "max": [0.041162438690662384, 0.32263821363449097, 0.6859167218208313, 3.2576022148132324, 0.3684038519859314, 0.027472922578454018, 0.04000759497284889, -0.0051965233869850636], "mean": [-0.010214258916676044, -0.030895128846168518, 0.5906001329421997, 3.120598316192627, -0.11608075350522995, -0.11037290096282959, 0.02443581447005272, -0.02511272393167019], "std": [0.04518697038292885, 0.18778443336486816, 0.04632457718253136, 0.10660073906183243, 0.4845747947692871, 0.06961032003164291, 0.015673724934458733, 0.01477404497563839], "count": [237]}, "action": {"min": [-0.3589285612106323, -0.6991071701049805, -0.5973214507102966, -0.10928571224212646, -0.07607142627239227, -0.13928571343421936, 0.0], "max": [0.5758928656578064, 0.7982142567634583, 0.731249988079071, 0.10607142746448517, 0.08571428805589676, 0.1103571429848671, 1.0], "mean": [0.01946202665567398, 0.10113021731376648, -0.056170906871557236, -0.003896924667060375, 0.001912296051159501, -0.029801076278090477, 0.5358649492263794], "std": [0.18685489892959595, 0.3949320316314697, 0.3136617839336395, 0.03473588451743126, 0.02405974082648754, 0.05622505396604538, 0.4987117052078247], "count": [237]}, "timestamp": {"min": [0.0], "max": [11.8], "mean": [5.8999999999999995], "std": [3.4207698938494335], "count": [237]}, "frame_index": {"min": [0], "max": [236], "mean": [118.0], "std": [68.41539787698868], "count": [237]}, "episode_index": {"min": [107], "max": [107], "mean": [107.0], "std": [0.0], "count": [237]}, "index": {"min": [29754], "max": [29990], "mean": [29872.0], "std": [68.41539787698868], "count": [237]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [237]}}} +{"episode_index": 108, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3437864750880821]], [[0.2777046688304228]], [[0.23719158935546875]]], "std": [[[0.1520045295327844]], [[0.15224266258069702]], [[0.1578954316535001]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3217199539483762]], [[0.2754477030436198]], [[0.24505913109872854]]], "std": [[[0.15816003916497492]], [[0.17296328737714167]], [[0.18335064882930566]]], "count": [100]}, "observation.state": {"min": [-0.1320541352033615, -0.1513642519712448, 0.44783324003219604, 3.0571258068084717, -0.3924507796764374, -0.3487228453159332, 0.0067832376807928085, -0.03984704241156578], "max": [0.15420576930046082, 0.14727534353733063, 0.6810598373413086, 3.354783535003662, 0.5657370090484619, 0.11898550391197205, 0.040132179856300354, -0.011298909783363342], "mean": [-0.006451427936553955, 0.0025014709681272507, 0.5583495497703552, 3.167391538619995, 0.13190969824790955, -0.12474868446588516, 0.026674728840589523, -0.026505865156650543], "std": [0.09381071478128433, 0.09896719455718994, 0.06718774139881134, 0.08669932931661606, 0.2875595688819885, 0.11197789013385773, 0.012349178083240986, 0.01172869186848402], "count": [242]}, "action": {"min": [-0.6080357432365417, -0.4553571343421936, -0.5383928418159485, -0.061071429401636124, -0.05999999865889549, -0.1007142886519432, 0.0], "max": [0.675000011920929, 0.4526785612106323, 0.3241071403026581, 0.09964285790920258, 0.09749999642372131, 0.1307142823934555, 1.0], "mean": [0.030526861548423767, 0.030781414359807968, -0.09927316009998322, -0.001496457844041288, -0.0021472859662026167, -0.009262104518711567, 0.44628098607063293], "std": [0.33878034353256226, 0.21875302493572235, 0.2579268515110016, 0.030378825962543488, 0.03242284804582596, 0.05141257494688034, 0.49710613489151], "count": [242]}, "timestamp": {"min": [0.0], "max": [12.05], "mean": [6.0249999999999995], "std": [3.4929393066585055], "count": [242]}, "frame_index": {"min": [0], "max": [241], "mean": [120.5], "std": [69.85878613317011], "count": [242]}, "episode_index": {"min": [108], "max": [108], "mean": [108.0], "std": [0.0], "count": [242]}, "index": {"min": [29991], "max": [30232], "mean": [30111.5], "std": [69.85878613317011], "count": [242]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [242]}}} +{"episode_index": 109, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9921568627450981]], [[0.996078431372549]]], "mean": [[[0.34854098151711854]], [[0.2718312958362056]], [[0.17422648889878217]]], "std": [[[0.21008921026663002]], [[0.15767401679060586]], [[0.10615928465336529]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9882352941176471]], [[0.9803921568627451]], [[0.9803921568627451]]], "mean": [[[0.353737341188917]], [[0.29751875574448533]], [[0.22173563340130975]]], "std": [[[0.14138670302915562]], [[0.13196113725919045]], [[0.1411529826346419]]], "count": [100]}, "observation.state": {"min": [-0.42104536294937134, -0.16741476953029633, 0.9987344741821289, 2.285771131515503, -2.0043320655822754, -0.5434417128562927, 0.011565319262444973, -0.0398559495806694], "max": [-0.14882199466228485, 0.16566744446754456, 1.3154577016830444, 3.1487720012664795, -0.0018301780801266432, -0.06948889046907425, 0.03987544775009155, -0.014837191440165043], "mean": [-0.25119152665138245, -0.008477865718305111, 1.1832386255264282, 2.860290050506592, -0.9944697618484497, -0.2989228665828705, 0.02260861173272133, -0.023032432422041893], "std": [0.08203805238008499, 0.13428239524364471, 0.0939253643155098, 0.29004955291748047, 0.6453628540039062, 0.17741364240646362, 0.011580954305827618, 0.011233380995690823], "count": [167]}, "action": {"min": [-0.5276785492897034, -0.7178571224212646, -0.9375, -0.05714285746216774, -0.022142857313156128, -0.17142857611179352, 0.0], "max": [0.4312500059604645, 0.4714285731315613, 0.9375, 0.006428571417927742, 0.09000000357627869, -0.0, 1.0], "mean": [-0.09349334985017776, -0.0778389573097229, -0.07275450229644775, -0.012147132307291031, 0.013413174077868462, -0.0687425434589386, 0.2934131622314453], "std": [0.27586525678634644, 0.3094535171985626, 0.4714517891407013, 0.019135428592562675, 0.02519853599369526, 0.05286022275686264, 0.4553263485431671], "count": [167]}, "timestamp": {"min": [0.0], "max": [8.3], "mean": [4.1499999999999995], "std": [2.41039415863879], "count": [167]}, "frame_index": {"min": [0], "max": [166], "mean": [83.0], "std": [48.2078831727758], "count": [167]}, "episode_index": {"min": [109], "max": [109], "mean": [109.0], "std": [0.0], "count": [167]}, "index": {"min": [30233], "max": [30399], "mean": [30316.0], "std": [48.2078831727758], "count": [167]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [167]}}} +{"episode_index": 110, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35087613154392616]], [[0.2864376292509191]], [[0.24760802265242035]]], "std": [[[0.1536651719801033]], [[0.15944582375049507]], [[0.16913911481803706]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32185000969381894]], [[0.2761678012025123]], [[0.24603081736845128]]], "std": [[[0.1582324179065916]], [[0.17373238775561622]], [[0.18445224976835242]]], "count": [100]}, "observation.state": {"min": [-0.1590254157781601, -0.11545902490615845, 0.44602635502815247, 3.0692784786224365, -0.14896978437900543, -0.1927216500043869, 0.0015930936206132174, -0.0397682785987854], "max": [0.13594307005405426, 0.13304503262043, 0.677299439907074, 3.1915457248687744, 0.37252768874168396, 0.10985676199197769, 0.040369290858507156, -0.002040821360424161], "mean": [0.005716182291507721, 0.018360858783125877, 0.5336308479309082, 3.1247544288635254, 0.183197483420372, -0.06797851622104645, 0.023144535720348358, -0.020968522876501083], "std": [0.09405075758695602, 0.08170221745967865, 0.06897882372140884, 0.031011439859867096, 0.176855206489563, 0.0716417133808136, 0.015636861324310303, 0.015340751968324184], "count": [246]}, "action": {"min": [-0.6133928298950195, -0.6133928298950195, -0.6000000238418579, -0.051428571343421936, -0.0803571417927742, -0.12535713613033295, 0.0], "max": [0.8892857432365417, 0.46875, 0.5169642567634583, 0.055714286863803864, 0.13928571343421936, 0.06857142597436905, 1.0], "mean": [0.036574482917785645, 0.02496735006570816, -0.1188371330499649, 0.0018728220602497458, -0.0007491289870813489, -0.013166376389563084, 0.3658536672592163], "std": [0.37010011076927185, 0.20341336727142334, 0.2739996612071991, 0.018544403836131096, 0.03759445622563362, 0.04226556420326233, 0.4816688001155853], "count": [246]}, "timestamp": {"min": [0.0], "max": [12.25], "mean": [6.125], "std": [3.5506748184910806], "count": [246]}, "frame_index": {"min": [0], "max": [245], "mean": [122.5], "std": [71.01349636982161], "count": [246]}, "episode_index": {"min": [110], "max": [110], "mean": [110.0], "std": [0.0], "count": [246]}, "index": {"min": [30400], "max": [30645], "mean": [30522.5], "std": [71.01349636982161], "count": [246]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [246]}}} +{"episode_index": 111, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.996078431372549]], [[1.0]]], "mean": [[[0.34037988759957105]], [[0.2666244093951057]], [[0.17250875315946693]]], "std": [[[0.21143675637324544]], [[0.1593094421679036]], [[0.10849983054275827]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.9686274509803922]], [[0.9686274509803922]]], "mean": [[[0.3540798573213465]], [[0.29837217084099266]], [[0.22290961052389707]]], "std": [[[0.14187238587398696]], [[0.13258533730981475]], [[0.14201955575921332]]], "count": [100]}, "observation.state": {"min": [-0.4611196517944336, -0.14008547365665436, 0.985674262046814, 2.107419729232788, -2.029454231262207, -0.4283970892429352, 0.010772309266030788, -0.0399404913187027], "max": [-0.14629904925823212, 0.14442887902259827, 1.2712934017181396, 3.1481332778930664, -0.002949699992313981, -0.032360441982746124, 0.03994183614850044, -0.014866650104522705], "mean": [-0.2569476068019867, -0.012718330137431622, 1.1707038879394531, 2.771204948425293, -1.153120994567871, -0.1821838617324829, 0.023418812081217766, -0.024440087378025055], "std": [0.08065488189458847, 0.1161947101354599, 0.08666404336690903, 0.36503100395202637, 0.6472058892250061, 0.11785154789686203, 0.012094724923372269, 0.011493549682199955], "count": [202]}, "action": {"min": [-0.7633928656578064, -0.7660714387893677, -0.9375, -0.07000000029802322, -0.04642857238650322, -0.15857142210006714, 0.0], "max": [0.5464285612106323, 0.46339285373687744, 0.9375, 0.044285714626312256, 0.11714285612106323, 0.0014285714132711291, 1.0], "mean": [-0.0780896320939064, -0.056939493864774704, -0.07029260694980621, -0.006103252526372671, 0.01073196530342102, -0.06012022867798805, 0.3366336524486542], "std": [0.28557056188583374, 0.27806922793388367, 0.3952854871749878, 0.01879073865711689, 0.030573958531022072, 0.05576920509338379, 0.47255873680114746], "count": [202]}, "timestamp": {"min": [0.0], "max": [10.05], "mean": [5.0249999999999995], "std": [2.915583132068095], "count": [202]}, "frame_index": {"min": [0], "max": [201], "mean": [100.5], "std": [58.31166264136189], "count": [202]}, "episode_index": {"min": [111], "max": [111], "mean": [111.0], "std": [0.0], "count": [202]}, "index": {"min": [30646], "max": [30847], "mean": [30746.5], "std": [58.31166264136189], "count": [202]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [202]}}} +{"episode_index": 112, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6104925967945772]], [[0.566477315865311]], [[0.5140475320255055]]], "std": [[[0.2696750238745662]], [[0.2504440811209135]], [[0.22843941052558364]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.549276455748315]], [[0.5091324845856311]], [[0.45915910668466603]]], "std": [[[0.298390329928421]], [[0.27774803183583524]], [[0.26319087171002165]]], "count": [100]}, "observation.state": {"min": [-0.20287427306175232, -0.07380933314561844, 0.9341650009155273, 2.403369426727295, -1.8300539255142212, -0.8723903894424438, 0.0018780685495585203, -0.04011068120598793], "max": [0.06921964138746262, 0.19168204069137573, 1.1717803478240967, 3.1405839920043945, -0.0006983376224525273, 0.3759984076023102, 0.040010884404182434, -0.0014190423535183072], "mean": [-0.00666300393640995, 0.02872782200574875, 1.040117621421814, 2.7546799182891846, -1.4993692636489868, -0.1084141805768013, 0.024928467348217964, -0.024632051587104797], "std": [0.0651056244969368, 0.0807732567191124, 0.07811765372753143, 0.1855180859565735, 0.45725154876708984, 0.40310734510421753, 0.01746067777276039, 0.017622046172618866], "count": [263]}, "action": {"min": [-0.5758928656578064, -0.7124999761581421, -0.5276785492897034, -0.05892857164144516, -0.14142857491970062, -0.27214285731315613, 0.0], "max": [0.5919643044471741, 0.7232142686843872, 0.8866071701049805, 0.1510714292526245, 0.17142857611179352, 0.09535714238882065, 1.0], "mean": [0.04576997086405754, 0.09205935150384903, -0.07441949099302292, 0.012221621349453926, -0.0018536096904426813, -0.04279196262359619, 0.6007604598999023], "std": [0.248483806848526, 0.33130958676338196, 0.33735740184783936, 0.043763842433691025, 0.0661809891462326, 0.08404108136892319, 0.4897421896457672], "count": [263]}, "timestamp": {"min": [0.0], "max": [13.1], "mean": [6.550000000000001], "std": [3.7960505792204615], "count": [263]}, "frame_index": {"min": [0], "max": [262], "mean": [131.0], "std": [75.92101158440923], "count": [263]}, "episode_index": {"min": [112], "max": [112], "mean": [112.0], "std": [0.0], "count": [263]}, "index": {"min": [30848], "max": [31110], "mean": [30979.0], "std": [75.92101158440923], "count": [263]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [263]}}} +{"episode_index": 113, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3740027501723346]], [[0.31042360552619486]], [[0.26697587196499695]]], "std": [[[0.17161039525109553]], [[0.17348495072866407]], [[0.17356330913154905]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3331213444728477]], [[0.28775742115693936]], [[0.25777729887120865]]], "std": [[[0.17197459076296]], [[0.1885407549508943]], [[0.1997627850263122]]], "count": [100]}, "observation.state": {"min": [-0.12403006851673126, -0.12296965718269348, 0.4601152539253235, 3.061717987060547, -0.35384318232536316, -0.18232783675193787, 0.0014106633607298136, -0.03985218703746796], "max": [0.16445693373680115, 0.12758344411849976, 0.67567378282547, 3.2745919227600098, 0.017610901966691017, 0.47323325276374817, 0.03990168124437332, -0.002845804439857602], "mean": [0.018520686775445938, 0.015014356933534145, 0.5541744828224182, 3.154477834701538, -0.13240456581115723, 0.1894611269235611, 0.023900941014289856, -0.022888746112585068], "std": [0.09840362519025803, 0.07710115611553192, 0.05947375297546387, 0.05526075139641762, 0.11366827040910721, 0.200489342212677, 0.01623827964067459, 0.0156788881868124], "count": [247]}, "action": {"min": [-0.5946428775787354, -0.5410714149475098, -0.6080357432365417, -0.07607142627239227, -0.14249999821186066, -0.04821428656578064, 0.0], "max": [0.7821428775787354, 0.5330356955528259, 0.5517857074737549, 0.12428571283817291, 0.13178572058677673, 0.0535714291036129, 1.0], "mean": [0.04962403327226639, 0.027740031480789185, -0.08291643857955933, 0.0019042803905904293, -0.0056737978011369705, -0.003088490106165409, 0.4412955343723297], "std": [0.38033515214920044, 0.19192616641521454, 0.303535521030426, 0.03236754238605499, 0.05951792374253273, 0.024423722177743912, 0.4965413212776184], "count": [247]}, "timestamp": {"min": [0.0], "max": [12.3], "mean": [6.1499999999999995], "std": [3.5651086939951773], "count": [247]}, "frame_index": {"min": [0], "max": [246], "mean": [123.0], "std": [71.30217387990355], "count": [247]}, "episode_index": {"min": [113], "max": [113], "mean": [113.0], "std": [0.0], "count": [247]}, "index": {"min": [31111], "max": [31357], "mean": [31234.0], "std": [71.30217387990355], "count": [247]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [247]}}} +{"episode_index": 114, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3394217738731235]], [[0.27590882424747243]], [[0.23017660223268996]]], "std": [[[0.14268818045497703]], [[0.1405316351855486]], [[0.1417889694357533]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3103542677935432]], [[0.261021821863511]], [[0.2271680351706112]]], "std": [[[0.1488232536419206]], [[0.16115360022551048]], [[0.16864418088358968]]], "count": [100]}, "observation.state": {"min": [-0.12837253510951996, -0.2895123064517975, 0.5325809717178345, 2.8745462894439697, -0.1465742141008377, -0.5434913039207458, 0.0020746951922774315, -0.0398993156850338], "max": [0.03072749264538288, 0.3371925950050354, 0.6892354488372803, 3.196364402770996, 0.5559406280517578, 0.19657057523727417, 0.04067812114953995, -0.0030913979280740023], "mean": [-0.02921559289097786, 0.005788213107734919, 0.5922781825065613, 3.014338731765747, 0.11035798490047455, -0.16327974200248718, 0.020496556535363197, -0.020861031487584114], "std": [0.047496065497398376, 0.21206416189670563, 0.04205074906349182, 0.09137319773435593, 0.17922332882881165, 0.24623547494411469, 0.01708519458770752, 0.016584530472755432], "count": [266]}, "action": {"min": [-0.49017858505249023, -0.6589285731315613, -0.6696428656578064, -0.1007142886519432, -0.1403571367263794, -0.09107142686843872, 0.0], "max": [0.6857143044471741, 0.8276785612106323, 0.8062499761581421, 0.12107142806053162, 0.11357142776250839, 0.13928571343421936, 1.0], "mean": [0.0102410102263093, 0.0939614400267601, -0.04354187101125717, -0.00891782995313406, -0.0031256726942956448, -0.0028276056982576847, 0.46992480754852295], "std": [0.24663880467414856, 0.38279014825820923, 0.322750061750412, 0.03392478823661804, 0.051670294255018234, 0.0475856252014637, 0.4990944564342499], "count": [266]}, "timestamp": {"min": [0.0], "max": [13.25], "mean": [6.625], "std": [3.8393521588934765], "count": [266]}, "frame_index": {"min": [0], "max": [265], "mean": [132.5], "std": [76.78704317786953], "count": [266]}, "episode_index": {"min": [114], "max": [114], "mean": [114.0], "std": [0.0], "count": [266]}, "index": {"min": [31358], "max": [31623], "mean": [31490.5], "std": [76.78704317786953], "count": [266]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [266]}}} +{"episode_index": 115, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5714093185125613]], [[0.5249846568388097]], [[0.47673488422468596]]], "std": [[[0.2898880605849304]], [[0.2622805828495327]], [[0.23205067577200128]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5700932844573375]], [[0.5319220521216299]], [[0.48149842625038297]]], "std": [[[0.2954626370111105]], [[0.27209033435994134]], [[0.2541963207389482]]], "count": [100]}, "observation.state": {"min": [-0.2050575166940689, -0.2936575412750244, 1.008784532546997, 2.2587132453918457, -2.6674916744232178, -1.0195502042770386, 0.009646471589803696, -0.04015064239501953], "max": [0.06962168961763382, 0.2227330207824707, 1.20098876953125, 3.1967146396636963, -0.0006701710517518222, -0.09331520646810532, 0.0400020070374012, -0.009288026951253414], "mean": [-0.033513765782117844, -0.03819388523697853, 1.1059801578521729, 2.6444621086120605, -2.0785629749298096, -0.6835168600082397, 0.032590437680482864, -0.032354582101106644], "std": [0.056286897510290146, 0.15044625103473663, 0.05548657104372978, 0.3120424747467041, 0.7014490962028503, 0.24531017243862152, 0.009343832731246948, 0.008363406173884869], "count": [373]}, "action": {"min": [-0.3616071343421936, -0.9267857074737549, -0.4151785671710968, -0.0803571417927742, -0.06428571790456772, -0.26357144117355347, 0.0], "max": [0.5919643044471741, 0.7714285850524902, 0.6535714268684387, 0.10499999672174454, 0.11464285850524902, 0.11999999731779099, 1.0], "mean": [0.04074590280652046, -0.033636562526226044, -0.03422539681196213, 0.008094596676528454, 0.007999805733561516, -0.01356664951890707, 0.554959774017334], "std": [0.1912599354982376, 0.38532426953315735, 0.26612743735313416, 0.029196329414844513, 0.03371930867433548, 0.10056370496749878, 0.49697035551071167], "count": [373]}, "timestamp": {"min": [0.0], "max": [18.6], "mean": [9.299999999999999], "std": [5.3837719119591245], "count": [373]}, "frame_index": {"min": [0], "max": [372], "mean": [186.0], "std": [107.67543823918248], "count": [373]}, "episode_index": {"min": [115], "max": [115], "mean": [115.0], "std": [0.0], "count": [373]}, "index": {"min": [31624], "max": [31996], "mean": [31810.0], "std": [107.67543823918248], "count": [373]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [373]}}} +{"episode_index": 116, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3343587736241958]], [[0.26599795233034623]], [[0.22288485418581494]]], "std": [[[0.14441619036086836]], [[0.13799070546005854]], [[0.13959176317377517]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3284093508252911]], [[0.283524704877068]], [[0.25024616615445006]]], "std": [[[0.16878792886650903]], [[0.18421204601466004]], [[0.19407905067608264]]], "count": [100]}, "observation.state": {"min": [-0.05876607075333595, -0.22139714658260345, 0.44788628816604614, 3.106215715408325, -0.4159437417984009, -0.37426432967185974, 0.020357593894004822, -0.04026065766811371], "max": [0.15612784028053284, 0.24602670967578888, 0.7798225283622742, 3.237455368041992, 0.4103710949420929, 0.21260927617549896, 0.040608182549476624, -0.015566011890769005], "mean": [0.07154558598995209, 0.038215357810258865, 0.606739342212677, 3.160257339477539, -0.06884215772151947, -0.16167786717414856, 0.030847450718283653, -0.029746104031801224], "std": [0.052961815148591995, 0.15337558090686798, 0.09643205255270004, 0.03175635263323784, 0.2032759040594101, 0.14030519127845764, 0.0086486442014575, 0.009778903797268867], "count": [262]}, "action": {"min": [-0.5758928656578064, -0.9348214268684387, -0.8464285731315613, -0.04821428656578064, -0.11464285850524902, -0.1039285734295845, 0.0], "max": [0.8598214387893677, 0.8999999761581421, 0.9375, 0.07821428775787354, 0.11464285850524902, 0.09857142716646194, 1.0], "mean": [0.010724502615630627, 0.08276987075805664, -0.05821291729807854, 0.0007729003555141389, 0.003038440365344286, 0.008874045684933662, 0.5419847369194031], "std": [0.3028787076473236, 0.4353076219558716, 0.4847447872161865, 0.019030092284083366, 0.042621150612831116, 0.041675589978694916, 0.49823394417762756], "count": [262]}, "timestamp": {"min": [0.0], "max": [13.05], "mean": [6.524999999999999], "std": [3.781616717754458], "count": [262]}, "frame_index": {"min": [0], "max": [261], "mean": [130.5], "std": [75.63233435508916], "count": [262]}, "episode_index": {"min": [116], "max": [116], "mean": [116.0], "std": [0.0], "count": [262]}, "index": {"min": [31997], "max": [32258], "mean": [32127.5], "std": [75.63233435508916], "count": [262]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [262]}}} +{"episode_index": 117, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3508755756452972]], [[0.28165156405579805]], [[0.2358794220569087]]], "std": [[[0.15514340617819175]], [[0.14943471999637384]], [[0.14533037560422876]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.327114096847235]], [[0.28189838723575367]], [[0.24850658461626837]]], "std": [[[0.1672580247817903]], [[0.18244989133433892]], [[0.19241799800505044]]], "count": [100]}, "observation.state": {"min": [-0.03881371021270752, -0.21522265672683716, 0.44711166620254517, 2.883605480194092, -0.19928334653377533, -0.36366939544677734, 0.019182099029421806, -0.03987583518028259], "max": [0.15531763434410095, 0.2679322063922882, 0.7312429547309875, 3.1955020427703857, 0.26157695055007935, 0.0464746430516243, 0.039861444383859634, -0.019589509814977646], "mean": [0.06744890660047531, 0.043003011494874954, 0.6157039403915405, 3.0877909660339355, 0.041902992874383926, -0.10468379408121109, 0.02911866270005703, -0.02861917018890381], "std": [0.05294569209218025, 0.16961608827114105, 0.08541334420442581, 0.08156704157590866, 0.1559048891067505, 0.11286920309066772, 0.008878533728420734, 0.009432653896510601], "count": [258]}, "action": {"min": [-0.6348214149475098, -0.8812500238418579, -0.918749988079071, -0.06535714119672775, -0.18000000715255737, -0.07392857223749161, 0.0], "max": [0.6803571581840515, 0.8919642567634583, 0.9375, 0.06428571790456772, 0.14892856776714325, 0.08892857283353806, 1.0], "mean": [0.00035298673901706934, 0.08565198630094528, -0.03744807094335556, -0.006702657788991928, 0.0029983373824507, 0.007533221039921045, 0.4728682041168213], "std": [0.34739384055137634, 0.4729991853237152, 0.5022000670433044, 0.021794745698571205, 0.05741620436310768, 0.03722391650080681, 0.49926331639289856], "count": [258]}, "timestamp": {"min": [0.0], "max": [12.85], "mean": [6.425000000000001], "std": [3.723881263771264], "count": [258]}, "frame_index": {"min": [0], "max": [257], "mean": [128.5], "std": [74.47762527542528], "count": [258]}, "episode_index": {"min": [117], "max": [117], "mean": [117.0], "std": [0.0], "count": [258]}, "index": {"min": [32259], "max": [32516], "mean": [32387.5], "std": [74.47762527542528], "count": [258]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [258]}}} +{"episode_index": 118, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.30894393681544885]], [[0.24918050728592217]], [[0.21348154584099263]]], "std": [[[0.13272154790239918]], [[0.12339200924408099]], [[0.1286710031302332]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3183784993489583]], [[0.27115282544902725]], [[0.23667950379614736]]], "std": [[[0.1581673051089118]], [[0.17248432861061067]], [[0.18217749444352713]]], "count": [100]}, "observation.state": {"min": [-0.11060537397861481, -0.1534634679555893, 0.48432210087776184, 2.9737255573272705, -0.9909075498580933, -0.20679067075252533, 0.027367867529392242, -0.04022330418229103], "max": [0.0313260592520237, 0.2861655056476593, 0.7177283763885498, 3.2097039222717285, 0.004852275364100933, 0.11397572606801987, 0.03991984203457832, -0.030949950218200684], "mean": [-0.03390292823314667, 0.04992757365107536, 0.6232433319091797, 3.1150999069213867, -0.373706579208374, -0.05735126510262489, 0.03363696113228798, -0.03656475245952606], "std": [0.041253406554460526, 0.14369477331638336, 0.0697057917714119, 0.06521285325288773, 0.29015472531318665, 0.07619789987802505, 0.005534726660698652, 0.0031828517094254494], "count": [268]}, "action": {"min": [-0.38303571939468384, -0.7232142686843872, -0.5544642806053162, -0.06535714119672775, -0.08571428805589676, -0.1007142886519432, 0.0], "max": [0.6133928298950195, 0.7901785969734192, 0.9375, 0.07821428775787354, 0.09642857313156128, 0.024642856791615486, 1.0], "mean": [0.03219282627105713, 0.07522987574338913, -0.0038979239761829376, 0.00028784608002752066, 0.00030783581314608455, -0.01944963075220585, 0.5261194109916687], "std": [0.22164888679981232, 0.3980748951435089, 0.41839954257011414, 0.022059982642531395, 0.038736458867788315, 0.02345636673271656, 0.4993177652359009], "count": [268]}, "timestamp": {"min": [0.0], "max": [13.35], "mean": [6.675000000000001], "std": [3.868219874826145], "count": [268]}, "frame_index": {"min": [0], "max": [267], "mean": [133.5], "std": [77.36439749652291], "count": [268]}, "episode_index": {"min": [118], "max": [118], "mean": [118.0], "std": [0.0], "count": [268]}, "index": {"min": [32517], "max": [32784], "mean": [32650.5], "std": [77.36439749652291], "count": [268]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [268]}}} +{"episode_index": 119, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.335269723331227]], [[0.26762044988893996]], [[0.22584707103056065]]], "std": [[[0.1434209994646017]], [[0.13794094480840965]], [[0.14110941780050704]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.327622122371898]], [[0.28390189915077363]], [[0.25134431008731617]]], "std": [[[0.16754915588322172]], [[0.18241336832884816]], [[0.1922093045751334]]], "count": [100]}, "observation.state": {"min": [-0.06254453212022781, -0.1987665295600891, 0.44646313786506653, 3.0132100582122803, -0.21159067749977112, -0.5423457622528076, 0.019459193572402, -0.03988630697131157], "max": [0.15014366805553436, 0.24729713797569275, 0.7102223038673401, 3.2205164432525635, 0.2943905293941498, 0.08260858058929443, 0.039885688573122025, -0.01940501667559147], "mean": [0.058643896132707596, 0.034957155585289, 0.602050244808197, 3.135730504989624, 0.0047517563216388226, -0.17512038350105286, 0.028900643810629845, -0.029306452721357346], "std": [0.05156238377094269, 0.15556463599205017, 0.0801575630903244, 0.05131140723824501, 0.16332301497459412, 0.17271599173545837, 0.008998492732644081, 0.009115454740822315], "count": [247]}, "action": {"min": [-0.8464285731315613, -0.8008928298950195, -0.8946428298950195, -0.1274999976158142, -0.1639285683631897, -0.07607142627239227, 0.0], "max": [0.6160714030265808, 0.8973214030265808, 0.9375, 0.06857142597436905, 0.17142857611179352, 0.11142857372760773, 1.0], "mean": [0.014976127073168755, 0.0757482573390007, -0.035547997802495956, 0.0027458076365292072, 0.0020213997922837734, 0.007079235278069973, 0.49392712116241455], "std": [0.29000991582870483, 0.45020920038223267, 0.45636460185050964, 0.035197190940380096, 0.0747387483716011, 0.030344320461153984, 0.49996358156204224], "count": [247]}, "timestamp": {"min": [0.0], "max": [12.3], "mean": [6.1499999999999995], "std": [3.5651086939951773], "count": [247]}, "frame_index": {"min": [0], "max": [246], "mean": [123.0], "std": [71.30217387990355], "count": [247]}, "episode_index": {"min": [119], "max": [119], "mean": [119.0], "std": [0.0], "count": [247]}, "index": {"min": [32785], "max": [33031], "mean": [32908.0], "std": [71.30217387990355], "count": [247]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [247]}}} +{"episode_index": 120, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5992699058383119]], [[0.5485907856062346]], [[0.49471068079331343]]], "std": [[[0.27369816577205575]], [[0.2631202611351279]], [[0.2437894949718476]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5484714313581879]], [[0.5088029880897672]], [[0.45892741064931836]]], "std": [[[0.2983912607659887]], [[0.2770310479021817]], [[0.2623989715901943]]], "count": [100]}, "observation.state": {"min": [-0.21260929107666016, -0.08850035816431046, 0.9200879335403442, 2.3822953701019287, -2.115593194961548, -0.8135755062103271, 0.001133328303694725, -0.04010690376162529], "max": [0.042393531650304794, 0.1946316361427307, 1.1643933057785034, 3.1401796340942383, 0.0009684172691777349, 0.2758180499076843, 0.040211573243141174, -0.0013034370495006442], "mean": [-0.04384847730398178, 0.01709485612809658, 1.0355390310287476, 2.712796449661255, -1.495461106300354, -0.12649096548557281, 0.02859373204410076, -0.028330925852060318], "std": [0.06725811958312988, 0.08127928525209427, 0.087861567735672, 0.2446390688419342, 0.6294740438461304, 0.34785977005958557, 0.016500277444720268, 0.01680237613618374], "count": [236]}, "action": {"min": [-0.27589285373687744, -0.6991071701049805, -0.6642857193946838, -0.06857142597436905, -0.1403571367263794, -0.3375000059604645, 0.0], "max": [0.6482142806053162, 0.9053571224212646, 0.8116071224212646, 0.23678570985794067, 0.1703571379184723, 0.13607142865657806, 1.0], "mean": [0.052425116300582886, 0.11309020221233368, -0.09763161838054657, 0.024788135662674904, 0.00812651589512825, -0.05187346413731575, 0.7033898234367371], "std": [0.2408011555671692, 0.3378527760505676, 0.3743058443069458, 0.057420916855335236, 0.06166863813996315, 0.11372832953929901, 0.45676347613334656], "count": [236]}, "timestamp": {"min": [0.0], "max": [11.75], "mean": [5.875], "std": [3.406336008088456], "count": [236]}, "frame_index": {"min": [0], "max": [235], "mean": [117.5], "std": [68.12672016176913], "count": [236]}, "episode_index": {"min": [120], "max": [120], "mean": [120.0], "std": [0.0], "count": [236]}, "index": {"min": [33032], "max": [33267], "mean": [33149.5], "std": [68.12672016176913], "count": [236]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [236]}}} +{"episode_index": 121, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34424661494236364]], [[0.2810468223422181]], [[0.23825006582222732]]], "std": [[[0.14771839914877197]], [[0.14805474567277332]], [[0.15318290256715575]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31348122570561426]], [[0.26476871325922946]], [[0.23141046621285233]]], "std": [[[0.14963415099370317]], [[0.16267577706763434]], [[0.17073917844093595]]], "count": [100]}, "observation.state": {"min": [-0.1136544868350029, -0.28097108006477356, 0.5070111751556396, 2.8912301063537598, -0.4385385811328888, -0.5069028735160828, 0.00034187480923719704, -0.03996008634567261], "max": [0.051854636520147324, 0.34036219120025635, 0.6851474046707153, 3.1685407161712646, 0.35384443402290344, 0.39062559604644775, 0.03988930210471153, -0.0012072628596797585], "mean": [-0.030331816524267197, -0.021110322326421738, 0.5884974002838135, 3.043386936187744, 0.037420231848955154, -0.10206317156553268, 0.021680189296603203, -0.021943116560578346], "std": [0.0499081015586853, 0.18780827522277832, 0.052743468433618546, 0.07155298441648483, 0.21057051420211792, 0.24511782824993134, 0.016948439180850983, 0.01668732985854149], "count": [292]}, "action": {"min": [-0.4955357015132904, -0.7151785492897034, -0.6401785612106323, -0.09214285761117935, -0.1510714292526245, -0.0803571417927742, 0.0], "max": [0.5035714507102966, 0.7714285850524902, 0.7366071343421936, 0.07821428775787354, 0.17249999940395355, 0.07392857223749161, 1.0], "mean": [0.015924658626317978, 0.08529230952262878, -0.05380075424909592, -0.00625244714319706, -0.005184686742722988, -0.00844667386263609, 0.5136986374855042], "std": [0.18957209587097168, 0.3606797754764557, 0.3146514892578125, 0.027986498549580574, 0.05625099688768387, 0.0286331158131361, 0.4998117685317993], "count": [292]}, "timestamp": {"min": [0.0], "max": [14.55], "mean": [7.275], "std": [4.214632249674934], "count": [292]}, "frame_index": {"min": [0], "max": [291], "mean": [145.5], "std": [84.2926449934987], "count": [292]}, "episode_index": {"min": [121], "max": [121], "mean": [121.0], "std": [0.0], "count": [292]}, "index": {"min": [33268], "max": [33559], "mean": [33413.5], "std": [84.2926449934987], "count": [292]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [292]}}} +{"episode_index": 122, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3261239049574908]], [[0.25792694151635265]], [[0.2153655227960325]]], "std": [[[0.14645976814654754]], [[0.1377565997970989]], [[0.13861940739444314]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3233321467380898]], [[0.27896043784945623]], [[0.24628537884880514]]], "std": [[[0.1683302838069108]], [[0.18221127552571226]], [[0.19124061229595285]]], "count": [100]}, "observation.state": {"min": [-0.03877262398600578, -0.21765056252479553, 0.44670194387435913, 3.098818778991699, -0.5612420439720154, -0.5735019445419312, 0.019412344321608543, -0.040260523557662964], "max": [0.1935494989156723, 0.2763132154941559, 0.7092776894569397, 3.2061169147491455, 0.0027685973327606916, -0.052500803023576736, 0.040107086300849915, -0.019283168017864227], "mean": [0.07158612459897995, 0.027896299958229065, 0.60565584897995, 3.140888214111328, -0.27301692962646484, -0.3051173985004425, 0.029956921935081482, -0.03076762706041336], "std": [0.054826606065034866, 0.16103382408618927, 0.08435873687267303, 0.028147945180535316, 0.19798539578914642, 0.17442402243614197, 0.009294236078858376, 0.008925347588956356], "count": [276]}, "action": {"min": [-0.7285714149475098, -0.7339285612106323, -0.7419642806053162, -0.08250000327825546, -0.2175000011920929, -0.1510714292526245, 0.0], "max": [0.8196428418159485, 0.8491071462631226, 0.9375, 0.06428571790456772, 0.15857142210006714, 0.13285714387893677, 1.0], "mean": [0.005599778611212969, 0.07828027755022049, -0.046399492770433426, 0.00022515520686283708, -0.003288042964413762, -5.435046477941796e-05, 0.5362318754196167], "std": [0.3371987044811249, 0.4288593530654907, 0.4680596590042114, 0.023093827068805695, 0.06217646598815918, 0.045765671879053116, 0.49868518114089966], "count": [276]}, "timestamp": {"min": [0.0], "max": [13.75], "mean": [6.875], "std": [3.983690709212585], "count": [276]}, "frame_index": {"min": [0], "max": [275], "mean": [137.5], "std": [79.6738141842517], "count": [276]}, "episode_index": {"min": [122], "max": [122], "mean": [122.0], "std": [0.0], "count": [276]}, "index": {"min": [33560], "max": [33835], "mean": [33697.5], "std": [79.6738141842517], "count": [276]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [276]}}} +{"episode_index": 123, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5298189439960554]], [[0.4907369187298943]], [[0.43951090016084554]]], "std": [[[0.3019516029597131]], [[0.27237988411481545]], [[0.24237779461279158]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5071564139571844]], [[0.476191733565985]], [[0.4307164857153799]]], "std": [[[0.308511419517219]], [[0.2816088253726282]], [[0.2601119058426791]]], "count": [100]}, "observation.state": {"min": [-0.3058081567287445, -0.08133367449045181, 0.9372995495796204, 2.335700511932373, -2.5639407634735107, -1.245200276374817, 0.0066778832115232944, -0.04000472649931908], "max": [0.00545732956379652, 0.26918286085128784, 1.1997442245483398, 3.3682644367218018, 2.22294282913208, 0.10820742696523666, 0.040008582174777985, -0.00509738689288497], "mean": [-0.10164505988359451, 0.0897572785615921, 1.0529148578643799, 2.7907190322875977, -1.2196892499923706, -0.6883993744850159, 0.03133842349052429, -0.03161250799894333], "std": [0.09076838195323944, 0.1081332340836525, 0.0747390165925026, 0.2990726828575134, 1.3742622137069702, 0.30029281973838806, 0.013215144164860249, 0.012827015481889248], "count": [317]}, "action": {"min": [-0.8062499761581421, -0.6348214149475098, -0.768750011920929, -0.15214285254478455, -0.1403571367263794, -0.2742857038974762, 0.0], "max": [0.6589285731315613, 0.9160714149475098, 0.6455357074737549, 0.18535713851451874, 0.2378571480512619, 0.375, 1.0], "mean": [-0.019037283957004547, 0.14536114037036896, -0.11417306214570999, 0.019099822267889977, 0.010812305845320225, 0.04720032215118408, 0.7287065982818604], "std": [0.3430076837539673, 0.3220135271549225, 0.2973218262195587, 0.07772785425186157, 0.07832467555999756, 0.17003072798252106, 0.4446275234222412], "count": [317]}, "timestamp": {"min": [0.0], "max": [15.8], "mean": [7.9], "std": [4.575478117093338], "count": [317]}, "frame_index": {"min": [0], "max": [316], "mean": [158.0], "std": [91.50956234186677], "count": [317]}, "episode_index": {"min": [123], "max": [123], "mean": [123.0], "std": [0.0], "count": [317]}, "index": {"min": [33836], "max": [34152], "mean": [33994.0], "std": [91.50956234186677], "count": [317]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [317]}}} +{"episode_index": 124, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3214745100432751]], [[0.26644902128331804]], [[0.23451392858168657]]], "std": [[[0.14403210163123775]], [[0.14295627076968126]], [[0.15147006736504612]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32084831985772827]], [[0.27690270218194696]], [[0.24451986395143996]]], "std": [[[0.16256008078105177]], [[0.17840171322273404]], [[0.18701185666957282]]], "count": [100]}, "observation.state": {"min": [-0.18653219938278198, -0.11839446425437927, 0.44621479511260986, 2.981509208679199, -0.09544927626848221, -0.4895476996898651, 0.022034870460629463, -0.039898112416267395], "max": [0.09971803426742554, 0.25638675689697266, 0.6965970396995544, 3.147477626800537, 0.2629517912864685, -0.00843308586627245, 0.039843033999204636, -0.019901880994439125], "mean": [-0.016331352293491364, 0.0614614337682724, 0.598746120929718, 3.0816967487335205, 0.05409853905439377, -0.18307369947433472, 0.03348195552825928, -0.033867452293634415], "std": [0.07941249012947083, 0.12690597772598267, 0.07470230758190155, 0.05273784324526787, 0.11860302835702896, 0.12067537754774094, 0.006461692042648792, 0.007140062283724546], "count": [219]}, "action": {"min": [-0.9375, -0.8866071701049805, -0.7955357432365417, -0.14892856776714325, -0.1274999976158142, -0.08571428805589676, 0.0], "max": [0.9080356955528259, 0.9375, 0.9375, 0.06535714119672775, 0.11892857402563095, 0.0803571417927742, 1.0], "mean": [0.00588308135047555, 0.08538402616977692, -0.05107630416750908, -0.004907045513391495, 0.0038307267241179943, -0.0021477476693689823, 0.5616438388824463], "std": [0.36006879806518555, 0.43994128704071045, 0.4816628098487854, 0.03159591928124428, 0.042251914739608765, 0.027386615052819252, 0.49618592858314514], "count": [219]}, "timestamp": {"min": [0.0], "max": [10.9], "mean": [5.45], "std": [3.1609597698589376], "count": [219]}, "frame_index": {"min": [0], "max": [218], "mean": [109.0], "std": [63.219195397178744], "count": [219]}, "episode_index": {"min": [124], "max": [124], "mean": [124.0], "std": [0.0], "count": [219]}, "index": {"min": [34153], "max": [34371], "mean": [34262.0], "std": [63.219195397178744], "count": [219]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [219]}}} +{"episode_index": 125, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34835997637580424]], [[0.28161562751321234]], [[0.23654946001838234]]], "std": [[[0.15374614769306497]], [[0.15286202085069997]], [[0.1572224712257876]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3170221497778799]], [[0.2690927046233532]], [[0.23633923698874082]]], "std": [[[0.147944964334418]], [[0.16189536337859067]], [[0.17084955731088242]]], "count": [100]}, "observation.state": {"min": [-0.10114669799804688, -0.24471795558929443, 0.510383129119873, 3.0056498050689697, -0.7527308464050293, -0.24325107038021088, 0.0029727425426244736, -0.03999992832541466], "max": [0.049236148595809937, 0.3292834460735321, 0.6771954894065857, 3.1865878105163574, 0.5671364665031433, 0.12546764314174652, 0.04038277640938759, -0.0031006678473204374], "mean": [-0.02143687754869461, 0.0018331778701394796, 0.5884677767753601, 3.0774056911468506, -0.0915742740035057, -0.11120153963565826, 0.02458466961979866, -0.02487768419086933], "std": [0.04288307577371597, 0.18428844213485718, 0.04647554084658623, 0.04296566918492317, 0.3409461975097656, 0.07732763886451721, 0.016756495460867882, 0.016445796936750412], "count": [242]}, "action": {"min": [-0.39642858505249023, -0.6214285492897034, -0.5196428298950195, -0.0803571417927742, -0.14571428298950195, -0.09535714238882065, 0.0], "max": [0.5303571224212646, 0.7794643044471741, 0.7580357193946838, 0.0771428570151329, 0.055714286863803864, 0.2517857253551483, 1.0], "mean": [0.019912201911211014, 0.10743064433336258, -0.05517633631825447, -0.0017399643547832966, -0.003634887281805277, -0.01613784022629261, 0.5785123705863953], "std": [0.22241708636283875, 0.3475021421909332, 0.32299304008483887, 0.03379707410931587, 0.03388473391532898, 0.06288108229637146, 0.49379676580429077], "count": [242]}, "timestamp": {"min": [0.0], "max": [12.05], "mean": [6.0249999999999995], "std": [3.4929393066585055], "count": [242]}, "frame_index": {"min": [0], "max": [241], "mean": [120.5], "std": [69.85878613317011], "count": [242]}, "episode_index": {"min": [125], "max": [125], "mean": [125.0], "std": [0.0], "count": [242]}, "index": {"min": [34372], "max": [34613], "mean": [34492.5], "std": [69.85878613317011], "count": [242]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [242]}}} +{"episode_index": 126, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.518578223733341]], [[0.47985230808632046]], [[0.42829726394952516]]], "std": [[[0.30922068221142746]], [[0.2790699328093038]], [[0.24784605272443733]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5135953740138633]], [[0.4821484261307062]], [[0.43645280785654106]]], "std": [[[0.3096546108629931]], [[0.2831724104362511]], [[0.26230520706840793]]], "count": [100]}, "observation.state": {"min": [-0.4038902819156647, -0.10586849600076675, 0.9626172780990601, 2.441102981567383, -2.5304484367370605, -1.2216675281524658, 0.00592168839648366, -0.040003448724746704], "max": [-0.0002950690977741033, 0.29753974080085754, 1.1861653327941895, 3.4363958835601807, -0.001430183881893754, -0.09357499331235886, 0.04000994563102722, -0.007620491553097963], "mean": [-0.10343657433986664, 0.11553683131933212, 1.0502926111221313, 2.831918716430664, -1.8938313722610474, -0.8340046405792236, 0.027801334857940674, -0.028077848255634308], "std": [0.11349009722471237, 0.14050352573394775, 0.05755540356040001, 0.2572171986103058, 0.632931649684906, 0.27609267830848694, 0.014653404243290424, 0.01429659966379404], "count": [293]}, "action": {"min": [-0.8839285969734192, -0.6348214149475098, -0.7446428537368774, -0.11571428924798965, -0.15964286029338837, -0.2539285719394684, 0.0], "max": [0.9375, 0.8330357074737549, 0.6401785612106323, 0.2014285773038864, 0.207857146859169, 0.33000001311302185, 1.0], "mean": [-0.026365196332335472, 0.15385794639587402, -0.06031813472509384, 0.005580204539000988, 0.012301316484808922, -0.014382011257112026, 0.61774742603302], "std": [0.42183175683021545, 0.3464156687259674, 0.27010294795036316, 0.058588411659002304, 0.07687129825353622, 0.11238279193639755, 0.485938161611557], "count": [293]}, "timestamp": {"min": [0.0], "max": [14.6], "mean": [7.299999999999999], "std": [4.2290660907581], "count": [293]}, "frame_index": {"min": [0], "max": [292], "mean": [146.0], "std": [84.581321815162], "count": [293]}, "episode_index": {"min": [126], "max": [126], "mean": [126.0], "std": [0.0], "count": [293]}, "index": {"min": [34614], "max": [34906], "mean": [34760.0], "std": [84.581321815162], "count": [293]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [293]}}} +{"episode_index": 127, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9803921568627451]], [[0.984313725490196]]], "mean": [[[0.3400386849197687]], [[0.2649986470540365]], [[0.17058461626838237]]], "std": [[[0.20760662801937044]], [[0.1564018395525839]], [[0.10704823297438183]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.9764705882352941]], [[0.9725490196078431]]], "mean": [[[0.35498321892233453]], [[0.2987655932856541]], [[0.22262936162013633]]], "std": [[[0.14061806873592972]], [[0.13156783127691396]], [[0.14144507113366875]]], "count": [100]}, "observation.state": {"min": [-0.430942565202713, -0.20589321851730347, 1.0012004375457764, 1.9890193939208984, -2.1999361515045166, -0.4232582151889801, 0.01297506783157587, -0.039805617183446884], "max": [-0.18600285053253174, 0.12999841570854187, 1.2975280284881592, 3.1484994888305664, 0.0018127396469935775, -0.019641198217868805, 0.03984152525663376, -0.014373395591974258], "mean": [-0.2702348232269287, -0.052843235433101654, 1.1791974306106567, 2.7811925411224365, -0.9801439046859741, -0.22462895512580872, 0.020866921171545982, -0.02134663239121437], "std": [0.07159850001335144, 0.12294121086597443, 0.08407103270292282, 0.43281057476997375, 0.8101460933685303, 0.1496032476425171, 0.010696908459067345, 0.010411480441689491], "count": [190]}, "action": {"min": [-0.6642857193946838, -0.9375, -0.7098214030265808, -0.14428570866584778, -0.03214285895228386, -0.2435714304447174, 0.0], "max": [0.4392857253551483, 0.4580357074737549, 0.9375, 0.025714285671710968, 0.11642856895923615, 0.01785714365541935, 1.0], "mean": [-0.07077068835496902, -0.06517389416694641, -0.03735903277993202, -0.017966169863939285, 0.010263158939778805, -0.06910150498151779, 0.22631579637527466], "std": [0.2597716748714447, 0.30054739117622375, 0.39693787693977356, 0.04053974524140358, 0.02515706792473793, 0.07685061544179916, 0.4184453785419464], "count": [190]}, "timestamp": {"min": [0.0], "max": [9.45], "mean": [4.725], "std": [2.742375794817333], "count": [190]}, "frame_index": {"min": [0], "max": [189], "mean": [94.5], "std": [54.847515896346664], "count": [190]}, "episode_index": {"min": [127], "max": [127], "mean": [127.0], "std": [0.0], "count": [190]}, "index": {"min": [34907], "max": [35096], "mean": [35001.5], "std": [54.847515896346664], "count": [190]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [190]}}} +{"episode_index": 128, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35541407207414216]], [[0.2861525531843597]], [[0.24116668701171876]]], "std": [[[0.1502359556527017]], [[0.14824495945726943]], [[0.14941332749430708]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3297430491727941]], [[0.2847675464106541]], [[0.2516119223201976]]], "std": [[[0.16803155250089927]], [[0.1839748983561502]], [[0.19418682829140627]]], "count": [100]}, "observation.state": {"min": [-0.05438954383134842, -0.2106403261423111, 0.4477745592594147, 3.075507402420044, -0.29767268896102905, -0.15563693642616272, 0.019457465037703514, -0.03981751203536987], "max": [0.14629580080509186, 0.271795392036438, 0.7216264605522156, 3.290282964706421, 0.5802996754646301, 0.1003292128443718, 0.04019880294799805, -0.018356386572122574], "mean": [0.057766132056713104, 0.04883626475930214, 0.6036880016326904, 3.1553938388824463, 0.042837247252464294, -0.028982121497392654, 0.02867310307919979, -0.02946704626083374], "std": [0.055854424834251404, 0.16425172984600067, 0.07957493513822556, 0.05735907331109047, 0.22432205080986023, 0.056408025324344635, 0.009434675797820091, 0.008900966495275497], "count": [254]}, "action": {"min": [-0.6857143044471741, -0.8410714268684387, -0.6964285969734192, -0.1510714292526245, -0.07500000298023224, -0.1403571367263794, 0.0], "max": [0.7098214030265808, 0.8785714507102966, 0.9375, 0.07071428745985031, 0.0867857113480568, 0.21321429312229156, 1.0], "mean": [0.008889907971024513, 0.09088166058063507, -0.04063203185796738, -0.0014257600996643305, 0.00010967353591695428, -0.007765746675431728, 0.4842519760131836], "std": [0.3130725920200348, 0.45458588004112244, 0.4779742360115051, 0.029240742325782776, 0.028379159048199654, 0.061312321573495865, 0.49975210428237915], "count": [254]}, "timestamp": {"min": [0.0], "max": [12.65], "mean": [6.325], "std": [3.6661457963370743], "count": [254]}, "frame_index": {"min": [0], "max": [253], "mean": [126.5], "std": [73.32291592674149], "count": [254]}, "episode_index": {"min": [128], "max": [128], "mean": [128.0], "std": [0.0], "count": [254]}, "index": {"min": [35097], "max": [35350], "mean": [35223.5], "std": [73.32291592674149], "count": [254]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [254]}}} +{"episode_index": 129, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35198402614219515]], [[0.28783271819469974]], [[0.24463272094726562]]], "std": [[[0.1553043567706971]], [[0.15644450086742206]], [[0.16193261544206386]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3132520823759191]], [[0.2642336778827742]], [[0.2309083479339001]]], "std": [[[0.14819058098926222]], [[0.16138965657556997]], [[0.16973765856462053]]], "count": [100]}, "observation.state": {"min": [-0.12732142210006714, -0.2767195701599121, 0.5013777613639832, 3.004786729812622, -0.23586700856685638, -0.20586206018924713, 0.0012389703188091516, -0.03992973268032074], "max": [0.030334897339344025, 0.34943413734436035, 0.6864542365074158, 3.1996500492095947, 0.27426087856292725, 0.1181890219449997, 0.040496841073036194, -0.005208950489759445], "mean": [-0.0400780513882637, -0.018612178042531013, 0.5801117420196533, 3.097243547439575, 0.011044594459235668, -0.06320477277040482, 0.022127140313386917, -0.02262561023235321], "std": [0.04837244004011154, 0.20327255129814148, 0.04596523568034172, 0.05753994360566139, 0.15650136768817902, 0.11029032617807388, 0.016578081995248795, 0.015926340594887733], "count": [250]}, "action": {"min": [-0.4285714328289032, -0.6508928537368774, -0.5866071581840515, -0.11892857402563095, -0.06857142597436905, -0.07285714149475098, 0.0], "max": [0.7178571224212646, 0.8276785612106323, 0.5839285850524902, 0.05785714462399483, 0.0867857113480568, 0.11571428924798965, 1.0], "mean": [-0.000996434479020536, 0.1062428280711174, -0.06795001775026321, -0.004294286947697401, -0.002219999674707651, -0.0009128572419285774, 0.5040000081062317], "std": [0.2594273090362549, 0.3727463185787201, 0.30024057626724243, 0.03140702843666077, 0.02847829833626747, 0.04271567612886429, 0.4999847412109375], "count": [250]}, "timestamp": {"min": [0.0], "max": [12.45], "mean": [6.225], "std": [3.6084103148062305], "count": [250]}, "frame_index": {"min": [0], "max": [249], "mean": [124.5], "std": [72.16820629612461], "count": [250]}, "episode_index": {"min": [129], "max": [129], "mean": [129.0], "std": [0.0], "count": [250]}, "index": {"min": [35351], "max": [35600], "mean": [35475.5], "std": [72.16820629612461], "count": [250]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [250]}}} +{"episode_index": 130, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34734681073357077]], [[0.28403848505955115]], [[0.2456155024509804]]], "std": [[[0.1672958461243669]], [[0.168943818736705]], [[0.1759375379935317]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3188373389150582]], [[0.2724749205346201]], [[0.24191171803193934]]], "std": [[[0.15549043988332187]], [[0.17002169531242592]], [[0.18022237194428734]]], "count": [100]}, "observation.state": {"min": [-0.12275721877813339, -0.13998128473758698, 0.44763702154159546, 3.0930655002593994, -0.5995396375656128, -0.3530879616737366, 0.001994096441194415, -0.0398685447871685], "max": [0.129648819565773, 0.11621926724910736, 0.6823782920837402, 3.2071290016174316, 0.000192041858099401, 0.05167900398373604, 0.04019816964864731, -0.0028010981623083353], "mean": [-0.002011113567277789, 0.0013477090978994966, 0.5561914443969727, 3.1571924686431885, -0.16836954653263092, -0.1275101602077484, 0.02691231481730938, -0.024518348276615143], "std": [0.08153898268938065, 0.08965837210416794, 0.06988650560379028, 0.02922489307820797, 0.14056114852428436, 0.09219590574502945, 0.01562309730798006, 0.01565738022327423], "count": [228]}, "action": {"min": [-0.47410714626312256, -0.5544642806053162, -0.6026785969734192, -0.046071428805589676, -0.18857142329216003, -0.19178570806980133, 0.0], "max": [0.7660714387893677, 0.4553571343421936, 0.48750001192092896, 0.07178571075201035, 0.1510714292526245, 0.0503571443259716, 1.0], "mean": [0.040425289422273636, 0.03543233126401901, -0.10176220536231995, 0.0020770675037056208, 0.0004370313254185021, -0.013571426272392273, 0.5131579041481018], "std": [0.3133920431137085, 0.2124623954296112, 0.27218708395957947, 0.021568987518548965, 0.06300617754459381, 0.04701380431652069, 0.4998267889022827], "count": [228]}, "timestamp": {"min": [0.0], "max": [11.35], "mean": [5.675000000000001], "std": [3.2908648812533565], "count": [228]}, "frame_index": {"min": [0], "max": [227], "mean": [113.5], "std": [65.81729762506713], "count": [228]}, "episode_index": {"min": [130], "max": [130], "mean": [130.0], "std": [0.0], "count": [228]}, "index": {"min": [35601], "max": [35828], "mean": [35714.5], "std": [65.81729762506713], "count": [228]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [228]}}} +{"episode_index": 131, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3551009401807598]], [[0.2890851464365043]], [[0.2461079843558517]]], "std": [[[0.1638670312195218]], [[0.16045737699352952]], [[0.15945621683957223]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32517028868432135]], [[0.2797743123372396]], [[0.24620163741766238]]], "std": [[[0.16729563162826408]], [[0.18221865287470998]], [[0.1919454692205728]]], "count": [100]}, "observation.state": {"min": [-0.05068255588412285, -0.19935612380504608, 0.44698089361190796, 2.886876106262207, 0.0009090344537980855, -0.4760972559452057, 0.018845781683921814, -0.04035297781229019], "max": [0.1344747245311737, 0.2765951454639435, 0.7174279093742371, 3.163149118423462, 0.45416367053985596, 0.3646060824394226, 0.039805177599191666, -0.020182287320494652], "mean": [0.03848548233509064, 0.05600432679057121, 0.6019383072853088, 3.0361335277557373, 0.19675275683403015, -0.09701193869113922, 0.02934243343770504, -0.03013109229505062], "std": [0.047253821045160294, 0.16630052030086517, 0.08340277522802353, 0.09415335953235626, 0.14374569058418274, 0.18403960764408112, 0.0090343551710248, 0.008770252577960491], "count": [237]}, "action": {"min": [-0.543749988079071, -0.8999999761581421, -0.9267857074737549, -0.11892857402563095, -0.15214285254478455, -0.07928571105003357, 0.0], "max": [0.581250011920929, 0.8999999761581421, 0.9375, 0.11249999701976776, 0.18000000715255737, 0.13285714387893677, 1.0], "mean": [0.011968806385993958, 0.10452079772949219, -0.0470275804400444, -0.009597650729119778, 0.009999998845160007, 0.008829114027321339, 0.5147679448127747], "std": [0.26546409726142883, 0.4897983968257904, 0.5240516066551208, 0.04175722971558571, 0.07094854861497879, 0.04027743265032768, 0.49978166818618774], "count": [237]}, "timestamp": {"min": [0.0], "max": [11.8], "mean": [5.8999999999999995], "std": [3.4207698938494335], "count": [237]}, "frame_index": {"min": [0], "max": [236], "mean": [118.0], "std": [68.41539787698868], "count": [237]}, "episode_index": {"min": [131], "max": [131], "mean": [131.0], "std": [0.0], "count": [237]}, "index": {"min": [35829], "max": [36065], "mean": [35947.0], "std": [68.41539787698868], "count": [237]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [237]}}} +{"episode_index": 132, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3211863116096048]], [[0.2585589414110371]], [[0.21688906022614124]]], "std": [[[0.15123650496132204]], [[0.14119424131947822]], [[0.1374157214959825]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3222106305290671]], [[0.2751671310125613]], [[0.2407889494054458]]], "std": [[[0.1621817551852108]], [[0.1769190058118709]], [[0.18678916803692908]]], "count": [100]}, "observation.state": {"min": [-0.09581388533115387, -0.1642795354127884, 0.4844902455806732, 3.1200497150421143, -0.6510447263717651, -0.26079261302948, 0.02573036216199398, -0.04032303765416145], "max": [0.01415211334824562, 0.2977723777294159, 0.7119017839431763, 3.214569330215454, 0.0813843384385109, 0.4060508608818054, 0.040003594011068344, -0.029040003195405006], "mean": [-0.04085279256105423, 0.04837953671813011, 0.615524172782898, 3.1745123863220215, -0.29846203327178955, -0.012656758539378643, 0.0332406610250473, -0.03549789637327194], "std": [0.03499298170208931, 0.14652028679847717, 0.06984774023294449, 0.0238113384693861, 0.24283699691295624, 0.20054848492145538, 0.006206325720995665, 0.004175734706223011], "count": [312]}, "action": {"min": [-0.3723214268684387, -0.6937500238418579, -0.5732142925262451, -0.04285714402794838, -0.14785714447498322, -0.07928571105003357, 0.0], "max": [0.5625, 0.7714285850524902, 0.9375, 0.051428571343421936, 0.14142857491970062, 0.03321428596973419, 1.0], "mean": [0.017625348642468452, 0.06922218948602676, -0.020149385556578636, 0.002554945182055235, -0.00015109979722183198, -0.010662776418030262, 0.5224359035491943], "std": [0.17254120111465454, 0.35044509172439575, 0.3572412133216858, 0.01351316086947918, 0.06025965139269829, 0.022797806188464165, 0.4994969367980957], "count": [312]}, "timestamp": {"min": [0.0], "max": [15.55], "mean": [7.775], "std": [4.503308968599275], "count": [312]}, "frame_index": {"min": [0], "max": [311], "mean": [155.5], "std": [90.0661793719855], "count": [312]}, "episode_index": {"min": [132], "max": [132], "mean": [132.0], "std": [0.0], "count": [312]}, "index": {"min": [36066], "max": [36377], "mean": [36221.5], "std": [90.0661793719855], "count": [312]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [312]}}} +{"episode_index": 133, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9647058823529412]], [[0.9764705882352941]]], "mean": [[[0.3382019605449602]], [[0.26268622903262867]], [[0.16734528904335172]]], "std": [[[0.21139407518616568]], [[0.1563373198851035]], [[0.0995813306473338]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3537107705508961]], [[0.2980194989372702]], [[0.22288313263537837]]], "std": [[[0.14257565894930285]], [[0.13364617453015232]], [[0.14293133977610553]]], "count": [100]}, "observation.state": {"min": [-0.4741346538066864, -0.14418703317642212, 0.9836326837539673, 2.046557664871216, -2.580271005630493, -0.10301186889410019, 0.012734323740005493, -0.039945051074028015], "max": [-0.18880395591259003, 0.20089510083198547, 1.2493577003479004, 3.1464498043060303, 0.001821763115003705, 0.13483256101608276, 0.03996860235929489, -0.014653711579740047], "mean": [-0.28281304240226746, 0.04681762307882309, 1.1441220045089722, 2.7262957096099854, -1.3694111108779907, 0.028784340247511864, 0.02544672228395939, -0.026087893173098564], "std": [0.08666243404150009, 0.1267317235469818, 0.07959054410457611, 0.36510801315307617, 0.8288259506225586, 0.07161995023488998, 0.012391701340675354, 0.011916820891201496], "count": [181]}, "action": {"min": [-0.5357142686843872, -0.5276785492897034, -0.6321428418159485, -0.058571428060531616, -0.044285714626312256, -0.17571428418159485, 0.0], "max": [0.47678571939468384, 0.5169642567634583, 0.9375, 0.06642857193946838, 0.07999999821186066, 0.1778571456670761, 1.0], "mean": [-0.09255127608776093, -0.06441888958215714, -0.05790745094418526, 0.005544593092054129, -0.004459352698177099, -0.07359907776117325, 0.40883979201316833], "std": [0.2474461793899536, 0.30558329820632935, 0.3742162585258484, 0.024076513946056366, 0.016880329698324203, 0.0735636055469513, 0.4916190505027771], "count": [181]}, "timestamp": {"min": [0.0], "max": [9.0], "mean": [4.5], "std": [2.6124700955226263], "count": [181]}, "frame_index": {"min": [0], "max": [180], "mean": [90.0], "std": [52.24940191045253], "count": [181]}, "episode_index": {"min": [133], "max": [133], "mean": [133.0], "std": [0.0], "count": [181]}, "index": {"min": [36378], "max": [36558], "mean": [36468.0], "std": [52.24940191045253], "count": [181]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [181]}}} +{"episode_index": 134, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.57447232354856]], [[0.5395383085363051]], [[0.502054105870864]]], "std": [[[0.26060260002571983]], [[0.23770192749264907]], [[0.2144765797793736]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.538656920189951]], [[0.5037767172420725]], [[0.4552736912147672]]], "std": [[[0.2985819127197064]], [[0.2725772695112586]], [[0.2528388762403226]]], "count": [100]}, "observation.state": {"min": [-0.21209664642810822, -0.06422045081853867, 0.9351104497909546, 1.9197081327438354, -0.06862623244524002, -0.5067893862724304, 0.008647667244076729, -0.039878033101558685], "max": [0.08942282199859619, 0.21916697919368744, 1.1796389818191528, 3.166963815689087, 2.9375100135803223, 0.45360836386680603, 0.040011439472436905, -0.004188974853605032], "mean": [-0.08293596655130386, 0.09065745025873184, 1.0607467889785767, 2.6806652545928955, 1.5219162702560425, 0.0417713038623333, 0.028937112540006638, -0.027829336002469063], "std": [0.12093137949705124, 0.10541148483753204, 0.0840054452419281, 0.39439740777015686, 1.0894421339035034, 0.30065232515335083, 0.01277791615575552, 0.013554875738918781], "count": [262]}, "action": {"min": [-0.38035714626312256, -0.6160714030265808, -0.7767857313156128, -0.013928571715950966, -0.207857146859169, -0.04285714402794838, 0.0], "max": [0.6535714268684387, 0.5946428775787354, 0.7875000238418579, 0.12535713613033295, 0.2046428620815277, 0.3589285612106323, 1.0], "mean": [0.03726484626531601, 0.06397899985313416, -0.07233162969350815, 0.017306433990597725, -0.001169573049992323, 0.061537597328424454, 0.6106870174407959], "std": [0.22621895372867584, 0.2921731770038605, 0.34156906604766846, 0.032497093081474304, 0.06982910633087158, 0.0972815603017807, 0.4875951111316681], "count": [262]}, "timestamp": {"min": [0.0], "max": [13.05], "mean": [6.524999999999999], "std": [3.781616717754458], "count": [262]}, "frame_index": {"min": [0], "max": [261], "mean": [130.5], "std": [75.63233435508916], "count": [262]}, "episode_index": {"min": [134], "max": [134], "mean": [134.0], "std": [0.0], "count": [262]}, "index": {"min": [36559], "max": [36820], "mean": [36689.5], "std": [75.63233435508916], "count": [262]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [262]}}} +{"episode_index": 135, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32803968900792735]], [[0.2722741938572304]], [[0.2404403267654718]]], "std": [[[0.13553282922465237]], [[0.1359654434503191]], [[0.14531519445466998]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3200739201564415]], [[0.27528400376263784]], [[0.24256421915690105]]], "std": [[[0.159356016764028]], [[0.175540574516801]], [[0.1846138087842324]]], "count": [100]}, "observation.state": {"min": [-0.17094364762306213, -0.08805198222398758, 0.44702768325805664, 3.0644309520721436, -0.6675513386726379, -0.12752246856689453, 0.02122969552874565, -0.040226180106401443], "max": [0.06625354290008545, 0.26872411370277405, 0.6793158650398254, 3.2110908031463623, -0.0018715827027335763, 0.25699010491371155, 0.03988472372293472, -0.020818114280700684], "mean": [-0.041265007108449936, 0.0730183869600296, 0.5828225612640381, 3.1233816146850586, -0.39901214838027954, 0.019918721169233322, 0.03212270140647888, -0.03493136912584305], "std": [0.07095571607351303, 0.12162691354751587, 0.07240015268325806, 0.039190828800201416, 0.20009419322013855, 0.10553698986768723, 0.007660171948373318, 0.0070847333408892155], "count": [250]}, "action": {"min": [-0.6080357432365417, -0.7794643044471741, -0.7526785731315613, -0.04285714402794838, -0.1607142835855484, -0.11357142776250839, 0.0], "max": [0.6160714030265808, 0.8223214149475098, 0.9375, 0.08142857253551483, 0.13500000536441803, 0.14678572118282318, 1.0], "mean": [0.00561428302899003, 0.06480000913143158, -0.05241429805755615, 0.005434286314994097, 0.003870000597089529, -0.010208570398390293, 0.5879999995231628], "std": [0.24986135959625244, 0.40417546033859253, 0.43269893527030945, 0.0188152939081192, 0.05475926771759987, 0.048305146396160126, 0.4921947717666626], "count": [250]}, "timestamp": {"min": [0.0], "max": [12.45], "mean": [6.225], "std": [3.6084103148062305], "count": [250]}, "frame_index": {"min": [0], "max": [249], "mean": [124.5], "std": [72.16820629612461], "count": [250]}, "episode_index": {"min": [135], "max": [135], "mean": [135.0], "std": [0.0], "count": [250]}, "index": {"min": [36821], "max": [37070], "mean": [36945.5], "std": [72.16820629612461], "count": [250]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [250]}}} +{"episode_index": 136, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9764705882352941]], [[0.9764705882352941]]], "mean": [[[0.3379627039292279]], [[0.2640519098020067]], [[0.16973179357192095]]], "std": [[[0.2137920560040199]], [[0.15919151116758135]], [[0.10331352644755988]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.9803921568627451]], [[0.9725490196078431]]], "mean": [[[0.3546847390567555]], [[0.29928344487208947]], [[0.2246470899394914]]], "std": [[[0.1420047425909642]], [[0.13314722487196468]], [[0.14280982861558864]]], "count": [100]}, "observation.state": {"min": [-0.46371880173683167, -0.14021284878253937, 0.9857168197631836, 2.0931649208068848, -2.3023366928100586, -0.28366950154304504, 0.0013270534109324217, -0.039920128881931305], "max": [-0.15106509625911713, 0.16395437717437744, 1.2339266538619995, 3.1411378383636475, -0.0001796957803890109, -0.02545909956097603, 0.039920393377542496, -0.014934846200048923], "mean": [-0.25868386030197144, 0.043451178818941116, 1.1375237703323364, 2.788187265396118, -1.142066478729248, -0.13641270995140076, 0.023341918364167213, -0.026185303926467896], "std": [0.0874246135354042, 0.11461609601974487, 0.07590935379266739, 0.3463830351829529, 0.670658528804779, 0.07969177514314651, 0.012903399765491486, 0.01150588784366846], "count": [172]}, "action": {"min": [-0.47678571939468384, -0.5089285969734192, -0.6053571701049805, -0.0892857164144516, -0.022857142612338066, -0.16785714030265808, 0.0], "max": [0.43660715222358704, 0.4258928596973419, 0.6348214149475098, 0.03928571566939354, 0.1007142886519432, -0.0, 1.0], "mean": [-0.10189472138881683, -0.0704682245850563, -0.06409884244203568, -0.0031270766630768776, 0.00506644556298852, -0.08012042194604874, 0.35465115308761597], "std": [0.2566603422164917, 0.2638513147830963, 0.3515383005142212, 0.02241818793118, 0.01868070289492607, 0.0419875830411911, 0.4784080386161804], "count": [172]}, "timestamp": {"min": [0.0], "max": [8.55], "mean": [4.2749999999999995], "std": [2.4825641985656683], "count": [172]}, "frame_index": {"min": [0], "max": [171], "mean": [85.5], "std": [49.65128397131337], "count": [172]}, "episode_index": {"min": [136], "max": [136], "mean": [136.0], "std": [0.0], "count": [172]}, "index": {"min": [37071], "max": [37242], "mean": [37156.5], "std": [49.65128397131337], "count": [172]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [172]}}} +{"episode_index": 137, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3125802696078432]], [[0.2533137248918122]], [[0.21597926958869484]]], "std": [[[0.15030838573790864]], [[0.14477712450360805]], [[0.14919076966621964]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32087641457950367]], [[0.2740413106282552]], [[0.239653465719784]]], "std": [[[0.16082037442120803]], [[0.17539186812324978]], [[0.1851347600492619]]], "count": [100]}, "observation.state": {"min": [-0.10686856508255005, -0.18407826125621796, 0.4835878610610962, 2.984466075897217, -1.1176350116729736, -0.25784093141555786, 0.029188480228185654, -0.04034142941236496], "max": [0.00635064160451293, 0.2792183756828308, 0.7152138948440552, 3.1494312286376953, 0.2093823105096817, 0.2410607933998108, 0.03994843363761902, -0.03174377977848053], "mean": [-0.048041243106126785, 0.052596788853406906, 0.6130051016807556, 3.0769946575164795, -0.3594299852848053, -0.043328508734703064, 0.034524232149124146, -0.03616432100534439], "std": [0.03314351290464401, 0.1554589718580246, 0.0693150982260704, 0.04612644761800766, 0.45258209109306335, 0.1478099673986435, 0.0048761204816401005, 0.0034794555976986885], "count": [317]}, "action": {"min": [-0.21696428954601288, -0.7982142567634583, -0.5625, -0.05785714462399483, -0.1703571379184723, -0.09000000357627869, 0.0], "max": [0.40982142090797424, 0.8008928298950195, 0.9375, 0.05785714462399483, 0.12642857432365417, 0.040714286267757416, 1.0], "mean": [0.024588774889707565, 0.052853189408779144, -0.01575033739209175, -0.0003413697995711118, 0.0001892742729978636, -0.018869983032345772, 0.5331230163574219], "std": [0.14232318103313446, 0.3711070120334625, 0.37422266602516174, 0.019862832501530647, 0.05353742092847824, 0.030070731416344643, 0.49890175461769104], "count": [317]}, "timestamp": {"min": [0.0], "max": [15.8], "mean": [7.9], "std": [4.575478117093338], "count": [317]}, "frame_index": {"min": [0], "max": [316], "mean": [158.0], "std": [91.50956234186677], "count": [317]}, "episode_index": {"min": [137], "max": [137], "mean": [137.0], "std": [0.0], "count": [317]}, "index": {"min": [37243], "max": [37559], "mean": [37401.0], "std": [91.50956234186677], "count": [317]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [317]}}} +{"episode_index": 138, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34459915819355086]], [[0.27929485605277266]], [[0.2398776903339461]]], "std": [[[0.16159803278217116]], [[0.1614951405740886]], [[0.1677009611516279]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32235601986155793]], [[0.2767365950042126]], [[0.24663767915613513]]], "std": [[[0.1578242316739518]], [[0.17285370431627184]], [[0.18328391378452302]]], "count": [100]}, "observation.state": {"min": [-0.1280248612165451, -0.11517991870641708, 0.4476298987865448, 3.0840861797332764, -0.12262272834777832, -0.2483827918767929, 0.0013260741252452135, -0.03982871025800705], "max": [0.14226652681827545, 0.11020772159099579, 0.688202440738678, 3.2513022422790527, 0.05739627778530121, -0.08783753961324692, 0.039811454713344574, -0.0020852109882980585], "mean": [0.00665272818878293, 0.01594347320497036, 0.5507292151451111, 3.136924982070923, -0.007186989299952984, -0.1810905784368515, 0.02351023443043232, -0.0242911484092474], "std": [0.09085740894079208, 0.08114032447338104, 0.06612981855869293, 0.04492601379752159, 0.03411398455500603, 0.0400090329349041, 0.015527557581663132, 0.015576177276670933], "count": [220]}, "action": {"min": [-0.5946428775787354, -0.5410714149475098, -0.581250011920929, -0.04821428656578064, -0.07285714149475098, -0.09107142686843872, 0.0], "max": [0.7741071581840515, 0.5116071701049805, 0.4553571343421936, 0.05785714462399483, 0.07607142627239227, 0.023571427911520004, 1.0], "mean": [0.030596613883972168, 0.022110404446721077, -0.12258116155862808, 0.00081331079127267, 0.005810066591948271, -0.0030827922746539116, 0.44545453786849976], "std": [0.37584835290908813, 0.1954028308391571, 0.2929195761680603, 0.024483567103743553, 0.027657462283968925, 0.016329368576407433, 0.4970157742500305], "count": [220]}, "timestamp": {"min": [0.0], "max": [10.95], "mean": [5.475], "std": [3.17539367638093], "count": [220]}, "frame_index": {"min": [0], "max": [219], "mean": [109.5], "std": [63.50787352761861], "count": [220]}, "episode_index": {"min": [138], "max": [138], "mean": [138.0], "std": [0.0], "count": [220]}, "index": {"min": [37560], "max": [37779], "mean": [37669.5], "std": [63.50787352761861], "count": [220]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [220]}}} +{"episode_index": 139, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5598450796089921]], [[0.5168625105315564]], [[0.4621593711703431]]], "std": [[[0.300042554282786]], [[0.2709202662609442]], [[0.2408268740473151]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5185945027669271]], [[0.48655931181066175]], [[0.4400439147949219]]], "std": [[[0.30961844303027714]], [[0.28330372406720555]], [[0.2625422354001898]]], "count": [100]}, "observation.state": {"min": [-0.42030462622642517, -0.08109734952449799, 0.9646074771881104, 1.5116013288497925, -3.0997252464294434, -1.076403260231018, 0.008330647833645344, -0.04065965861082077], "max": [0.029976963996887207, 0.2650598883628845, 1.1860673427581787, 3.4339723587036133, 0.0002661917242221534, -0.08468129485845566, 0.0400100015103817, -0.0094367153942585], "mean": [-0.10610907524824142, 0.10574650019407272, 1.0643043518066406, 2.3114867210388184, -2.344613790512085, -0.658913791179657, 0.03163091838359833, -0.032248903065919876], "std": [0.11747940629720688, 0.11886493116617203, 0.06319784373044968, 0.5654488205909729, 0.873589277267456, 0.26003625988960266, 0.013191995210945606, 0.012475631199777126], "count": [286]}, "action": {"min": [-0.9107142686843872, -0.6455357074737549, -0.65625, -0.14142857491970062, -0.1510714292526245, -0.2742857038974762, 0.0], "max": [0.9375, 0.7258928418159485, 0.4124999940395355, 0.21964286267757416, 0.2378571480512619, 0.20357142388820648, 1.0], "mean": [-0.004870122764259577, 0.17205600440502167, -0.0015453245723620057, -0.0034128392580896616, 0.035769231617450714, -0.034469276666641235, 0.748251736164093], "std": [0.4231448173522949, 0.3077693283557892, 0.23193621635437012, 0.06778285652399063, 0.07468681037425995, 0.11478173732757568, 0.4340173900127411], "count": [286]}, "timestamp": {"min": [0.0], "max": [14.25], "mean": [7.125], "std": [4.128029190788262], "count": [286]}, "frame_index": {"min": [0], "max": [285], "mean": [142.5], "std": [82.56058381576526], "count": [286]}, "episode_index": {"min": [139], "max": [139], "mean": [139.0], "std": [0.0], "count": [286]}, "index": {"min": [37780], "max": [38065], "mean": [37922.5], "std": [82.56058381576526], "count": [286]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [286]}}} +{"episode_index": 140, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.46332828057981007]], [[0.43164784809187345]], [[0.3859198841768153]]], "std": [[[0.30465688337348495]], [[0.27556486727191637]], [[0.24562773089114878]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5116044173895145]], [[0.4805299299651501]], [[0.43508480535768995]]], "std": [[[0.3111583479319345]], [[0.2848877904836911]], [[0.26417645062170386]]], "count": [100]}, "observation.state": {"min": [-0.30347907543182373, -0.05097486078739166, 0.9585623145103455, 2.108546257019043, -2.1278390884399414, -1.842738389968872, 0.00547073595225811, -0.039974749088287354], "max": [0.008407113142311573, 0.2826198637485504, 1.1756200790405273, 3.456627130508423, 2.291024923324585, 0.2546389102935791, 0.0400129035115242, -0.008654395118355751], "mean": [-0.10606420785188675, 0.11376676708459854, 1.0532838106155396, 2.979219675064087, -0.9348930716514587, -0.9412733912467957, 0.0328722707927227, -0.03318300470709801], "std": [0.08835122734308243, 0.10883617401123047, 0.0635453462600708, 0.2742097079753876, 1.3346303701400757, 0.707432210445404, 0.012967425398528576, 0.012093190103769302], "count": [312]}, "action": {"min": [-0.8705357313156128, -0.6267856955528259, -0.5089285969734192, -0.23035714030265808, -0.2314285784959793, -0.24857142567634583, 0.0], "max": [0.6508928537368774, 0.768750011920929, 0.5544642806053162, 0.17249999940395355, 0.18214285373687744, 0.3310714364051819, 1.0], "mean": [-0.0004979539662599564, 0.12548932433128357, -0.054275400936603546, -0.0018028909107670188, -0.004326921887695789, 0.04909685254096985, 0.7916666865348816], "std": [0.31746408343315125, 0.2608276605606079, 0.22152726352214813, 0.0743693858385086, 0.09357932955026627, 0.14526991546154022, 0.40611687302589417], "count": [312]}, "timestamp": {"min": [0.0], "max": [15.55], "mean": [7.775], "std": [4.503308968599275], "count": [312]}, "frame_index": {"min": [0], "max": [311], "mean": [155.5], "std": [90.0661793719855], "count": [312]}, "episode_index": {"min": [140], "max": [140], "mean": [140.0], "std": [0.0], "count": [312]}, "index": {"min": [38066], "max": [38377], "mean": [38221.5], "std": [90.0661793719855], "count": [312]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [312]}}} +{"episode_index": 141, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9803921568627451]], [[0.9725490196078431]]], "mean": [[[0.332898790546492]], [[0.2595313906202129]], [[0.16688340490004597]]], "std": [[[0.2058991142885517]], [[0.15366764074741923]], [[0.10245132068029214]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9764705882352941]], [[0.9725490196078431]], [[0.9607843137254902]]], "mean": [[[0.3550478144626991]], [[0.29868088606292126]], [[0.22250071925742954]]], "std": [[[0.1391861345408519]], [[0.13007271558473518]], [[0.13994697739470385]]], "count": [100]}, "observation.state": {"min": [-0.4188911020755768, -0.1580697000026703, 0.9868044257164001, 2.0566418170928955, -2.240699529647827, -0.6017539501190186, 0.01318652555346489, -0.039821285754442215], "max": [-0.16855740547180176, 0.17713037133216858, 1.2542831897735596, 3.1492788791656494, 0.0034561892971396446, -0.03355366364121437, 0.0398554801940918, -0.014951949007809162], "mean": [-0.24645085632801056, -0.002274643164128065, 1.159142255783081, 2.772838592529297, -0.9850308895111084, -0.21060030162334442, 0.0218342337757349, -0.022222531959414482], "std": [0.06984676420688629, 0.13017237186431885, 0.0816182866692543, 0.3651903569698334, 0.6544433832168579, 0.18822866678237915, 0.01113739050924778, 0.010838008485734463], "count": [173]}, "action": {"min": [-0.4821428656578064, -0.7901785969734192, -0.7044642567634583, -0.10642857104539871, -0.14714285731315613, -0.11571428924798965, 0.0], "max": [0.4660714268684387, 0.4848214387893677, 0.8598214387893677, 0.03285714238882065, 0.10928571224212646, -0.012857142835855484, 1.0], "mean": [-0.07899463921785355, -0.06673204153776169, -0.060709111392498016, -0.018220484256744385, -0.00333608640357852, -0.07366637140512466, 0.2601155936717987], "std": [0.2698851525783539, 0.31507396697998047, 0.3876425623893738, 0.03875402361154556, 0.060722868889570236, 0.026692774146795273, 0.43869704008102417], "count": [173]}, "timestamp": {"min": [0.0], "max": [8.6], "mean": [4.3], "std": [2.4969981978367546], "count": [173]}, "frame_index": {"min": [0], "max": [172], "mean": [86.0], "std": [49.93996395673509], "count": [173]}, "episode_index": {"min": [141], "max": [141], "mean": [141.0], "std": [0.0], "count": [173]}, "index": {"min": [38378], "max": [38550], "mean": [38464.0], "std": [49.93996395673509], "count": [173]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [173]}}} +{"episode_index": 142, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5284214417700673]], [[0.48850858860389856]], [[0.43666204534792435]]], "std": [[[0.30871163303962784]], [[0.2788436298540051]], [[0.24836421423943486]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5134138596478631]], [[0.48211566700654873]], [[0.43639754291609223]]], "std": [[[0.3117414770501396]], [[0.28566246808733825]], [[0.2650847148715129]]], "count": [100]}, "observation.state": {"min": [-0.42784690856933594, -0.07832065224647522, 0.9636075496673584, 2.0939483642578125, -2.9561071395874023, -1.1306043863296509, 0.0071338992565870285, -0.0399646982550621], "max": [0.016383454203605652, 0.2827463448047638, 1.1840898990631104, 3.4238624572753906, 0.002115202136337757, 0.4130861461162567, 0.04002266004681587, -0.009641691111028194], "mean": [-0.09890381246805191, 0.0834110751748085, 1.0627208948135376, 2.8105313777923584, -2.070406913757324, -0.6350414156913757, 0.03190881758928299, -0.03221622854471207], "std": [0.12030153721570969, 0.11193694919347763, 0.06886497884988785, 0.3574284017086029, 0.7939115166664124, 0.4572421908378601, 0.013243093155324459, 0.01237932126969099], "count": [300]}, "action": {"min": [-0.8678571581840515, -0.731249988079071, -0.6910714507102966, -0.09535714238882065, -0.18214285373687744, -0.2871428430080414, 0.0], "max": [0.9375, 0.7794643044471741, 0.5785714387893677, 0.18000000715255737, 0.1907142847776413, 0.1778571456670761, 1.0], "mean": [0.04787498712539673, 0.08886605501174927, -0.04822320118546486, 0.010296417400240898, 0.013603565283119678, -0.017928551882505417, 0.753333330154419], "std": [0.4455568492412567, 0.3203805387020111, 0.25732702016830444, 0.06515384465456009, 0.08135447651147842, 0.11530955135822296, 0.43107107281684875], "count": [300]}, "timestamp": {"min": [0.0], "max": [14.95], "mean": [7.475], "std": [4.330102962594154], "count": [300]}, "frame_index": {"min": [0], "max": [299], "mean": [149.5], "std": [86.60205925188308], "count": [300]}, "episode_index": {"min": [142], "max": [142], "mean": [142.0], "std": [0.0], "count": [300]}, "index": {"min": [38551], "max": [38850], "mean": [38700.5], "std": [86.60205925188308], "count": [300]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [300]}}} +{"episode_index": 143, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5837413886575137]], [[0.5350968388576134]], [[0.48564097206265316]]], "std": [[[0.2859383362122785]], [[0.2594334972103516]], [[0.229805289571269]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5659152921788833]], [[0.527877805223652]], [[0.4783722941080729]]], "std": [[[0.29572998779429904]], [[0.27264418258348466]], [[0.2550968256784716]]], "count": [100]}, "observation.state": {"min": [-0.20323356986045837, -0.3064059317111969, 1.0086621046066284, 1.6654103994369507, -3.1509499549865723, -0.8925518989562988, 0.0009281646343879402, -0.0400678813457489], "max": [0.11435618996620178, 0.20049455761909485, 1.178920030593872, 3.1522862911224365, -0.001977684209123254, -0.09818662703037262, 0.040002819150686264, -0.0007510737632401288], "mean": [-0.007217882201075554, -0.0402044877409935, 1.0999071598052979, 2.2410590648651123, -2.360551357269287, -0.5726931095123291, 0.028430208563804626, -0.029418449848890305], "std": [0.08053605258464813, 0.13503395020961761, 0.05690627545118332, 0.3981874883174896, 0.6812756061553955, 0.16926026344299316, 0.0130928298458457, 0.012648351490497589], "count": [419]}, "action": {"min": [-0.5249999761581421, -0.8598214387893677, -0.47410714626312256, -0.04392857104539871, -0.06321428716182709, -0.2507142722606659, 0.0], "max": [0.5383928418159485, 0.6883928775787354, 0.6321428418159485, 0.046071428805589676, 0.12964285910129547, 0.12214285880327225, 1.0], "mean": [0.02667064778506756, -0.02939397469162941, -0.04115026071667671, 0.004789465572685003, 0.008371972478926182, -0.03194596245884895, 0.5966587066650391], "std": [0.258598268032074, 0.34958407282829285, 0.26525476574897766, 0.017625007778406143, 0.03447330370545387, 0.08622286468744278, 0.49056825041770935], "count": [419]}, "timestamp": {"min": [0.0], "max": [20.9], "mean": [10.449999999999998], "std": [6.0477268456834254], "count": [419]}, "frame_index": {"min": [0], "max": [418], "mean": [209.0], "std": [120.95453691366852], "count": [419]}, "episode_index": {"min": [143], "max": [143], "mean": [143.0], "std": [0.0], "count": [419]}, "index": {"min": [38851], "max": [39269], "mean": [39060.0], "std": [120.95453691366852], "count": [419]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [419]}}} +{"episode_index": 144, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5919007999195772]], [[0.5483343601600796]], [[0.49861984911151963]]], "std": [[[0.2812677551315936]], [[0.2666837117739152]], [[0.24658435533569678]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.550489990832759]], [[0.510725700228822]], [[0.46086183136584713]]], "std": [[[0.29905871351523566]], [[0.2782840566446077]], [[0.2641165530459352]]], "count": [100]}, "observation.state": {"min": [-0.21463824808597565, -0.07410828769207001, 0.9252362251281738, 1.8811103105545044, -2.247690439224243, -1.367212176322937, 0.0025496436282992363, -0.040003787726163864], "max": [0.03803334757685661, 0.19026978313922882, 1.1711939573287964, 3.1451549530029297, -0.00024324496916960925, 0.3803481161594391, 0.04054743051528931, -0.0016238212119787931], "mean": [-0.027488363906741142, 0.03382263332605362, 1.0310922861099243, 2.4206838607788086, -1.8926864862442017, -0.26366138458251953, 0.02324478141963482, -0.02330697886645794], "std": [0.058048225939273834, 0.08692282438278198, 0.07333395630121231, 0.34472233057022095, 0.6357231140136719, 0.45174941420555115, 0.017375927418470383, 0.01702134497463703], "count": [284]}, "action": {"min": [-0.2517857253551483, -0.8223214149475098, -0.6080357432365417, -0.09321428835391998, -0.11464285850524902, -0.35035714507102966, 0.0], "max": [0.6401785612106323, 0.7044642567634583, 0.6803571581840515, 0.17249999940395355, 0.25928571820259094, 0.10821428894996643, 1.0], "mean": [0.0567498616874218, 0.07955547422170639, -0.08147945255041122, 0.02034582570195198, 0.01341549213975668, -0.04472082480788231, 0.5457746386528015], "std": [0.19179944694042206, 0.33433154225349426, 0.3031696081161499, 0.05161502957344055, 0.06509406119585037, 0.10617400705814362, 0.4979008734226227], "count": [284]}, "timestamp": {"min": [0.0], "max": [14.15], "mean": [7.075000000000001], "std": [4.099161499624039], "count": [284]}, "frame_index": {"min": [0], "max": [283], "mean": [141.5], "std": [81.98322999248077], "count": [284]}, "episode_index": {"min": [144], "max": [144], "mean": [144.0], "std": [0.0], "count": [284]}, "index": {"min": [39270], "max": [39553], "mean": [39411.5], "std": [81.98322999248077], "count": [284]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [284]}}} +{"episode_index": 145, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.49674107390759037]], [[0.45960558004940255]], [[0.4034589975394455]]], "std": [[[0.31767119813267597]], [[0.28696178553524426]], [[0.25366508668837007]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.511387233360141]], [[0.4803257745481005]], [[0.43405738680970435]]], "std": [[[0.310946701802557]], [[0.2847055174132609]], [[0.2640116374295995]]], "count": [100]}, "observation.state": {"min": [-0.29543671011924744, -0.04736282676458359, 0.9639416933059692, 2.497748851776123, -2.3645458221435547, -1.375870943069458, 0.0009653298184275627, -0.04058855399489403], "max": [0.01614193432033062, 0.2675502300262451, 1.207735538482666, 3.3406107425689697, -0.000686583633068949, -0.07760893553495407, 0.04001057893037796, 0.0007581997779197991], "mean": [-0.07231935858726501, 0.09292662888765335, 1.0859603881835938, 2.8818891048431396, -1.762400507926941, -0.9326619505882263, 0.030871495604515076, -0.029706550762057304], "std": [0.08312524110078812, 0.11145208030939102, 0.0660107284784317, 0.25759944319725037, 0.7101306319236755, 0.37252095341682434, 0.01401321217417717, 0.013248234055936337], "count": [255]}, "action": {"min": [-0.8732143044471741, -0.9214285612106323, -0.7071428298950195, -0.11571428924798965, -0.2817857265472412, -0.3053571283817291, 0.0], "max": [0.6830357313156128, 0.8035714030265808, 0.7419642806053162, 0.15642857551574707, 0.20892857015132904, 0.3385714292526245, 1.0], "mean": [0.02050420269370079, 0.10838235914707184, -0.04904412478208542, 0.009802517481148243, 0.013819331303238869, -0.008705874904990196, 0.729411780834198], "std": [0.38163846731185913, 0.316213458776474, 0.2891767621040344, 0.060000061988830566, 0.09145019203424454, 0.1262940764427185, 0.4442644715309143], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [145], "max": [145], "mean": [145.0], "std": [0.0], "count": [255]}, "index": {"min": [39554], "max": [39808], "mean": [39681.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [255]}}} +{"episode_index": 146, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35348029043160234]], [[0.28775660915000767]], [[0.24826752068014704]]], "std": [[[0.16031762895270596]], [[0.16339324876443845]], [[0.17036839422747851]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32311002963197]], [[0.27830789244408705]], [[0.24866271434110754]]], "std": [[[0.16015523158666328]], [[0.17555021856254427]], [[0.18615595813346678]]], "count": [100]}, "observation.state": {"min": [-0.15764369070529938, -0.14786168932914734, 0.44647517800331116, 3.015855312347412, -0.257280558347702, -0.47758468985557556, 0.005008477717638016, -0.03993840888142586], "max": [0.1582859456539154, 0.10960274934768677, 0.6760115623474121, 3.217250108718872, 0.5841323137283325, 0.06408333033323288, 0.04003782197833061, -0.00497841602191329], "mean": [0.016492437571287155, 0.010192892514169216, 0.5357788801193237, 3.10176944732666, 0.07447712123394012, -0.13757789134979248, 0.025759810581803322, -0.026659367606043816], "std": [0.09845194220542908, 0.09025555104017258, 0.07062549144029617, 0.053982049226760864, 0.2829253077507019, 0.13500235974788666, 0.01389394048601389, 0.013911878690123558], "count": [278]}, "action": {"min": [-0.5785714387893677, -0.4660714268684387, -0.6080357432365417, -0.04178571328520775, -0.16607142984867096, -0.08892857283353806, 0.0], "max": [0.8142856955528259, 0.4794642925262451, 0.48750001192092896, 0.05249999836087227, 0.12214285880327225, 0.0835714265704155, 1.0], "mean": [0.01972314715385437, 0.013180878944694996, -0.12148956954479218, 0.000674460781738162, -0.004832989536225796, -0.005596091505140066, 0.49640288949012756], "std": [0.3617483377456665, 0.18737982213497162, 0.28360316157341003, 0.01749039627611637, 0.05517229065299034, 0.038060400635004044, 0.49998635053634644], "count": [278]}, "timestamp": {"min": [0.0], "max": [13.85], "mean": [6.925000000000001], "std": [4.012558410789804], "count": [278]}, "frame_index": {"min": [0], "max": [277], "mean": [138.5], "std": [80.25116821579608], "count": [278]}, "episode_index": {"min": [146], "max": [146], "mean": [146.0], "std": [0.0], "count": [278]}, "index": {"min": [39809], "max": [40086], "mean": [39947.5], "std": [80.25116821579608], "count": [278]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [278]}}} +{"episode_index": 147, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.996078431372549]], [[1.0]]], "mean": [[[0.3306623056449142]], [[0.25792194261737894]], [[0.16602971873563876]]], "std": [[[0.2139776285991127]], [[0.1588984268212273]], [[0.10295904273916365]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9882352941176471]], [[0.9882352941176471]], [[0.9764705882352941]]], "mean": [[[0.3538583703134574]], [[0.2969968734442019]], [[0.2201152110380285]]], "std": [[[0.14025765006513297]], [[0.13046529757980566]], [[0.13948607459134896]]], "count": [100]}, "observation.state": {"min": [-0.449891597032547, -0.1499907225370407, 0.9881898164749146, 2.1371047496795654, -2.2431812286376953, -0.502303957939148, 0.013504545204341412, -0.03990813344717026], "max": [-0.1644688993692398, 0.1444544643163681, 1.3286138772964478, 3.142871379852295, -0.003380861831828952, -0.09029174596071243, 0.039909061044454575, -0.01275964267551899], "mean": [-0.273785263299942, -0.020422223955392838, 1.1924867630004883, 2.8032186031341553, -1.1152187585830688, -0.2863755226135254, 0.022583529353141785, -0.02270301803946495], "std": [0.07409732788801193, 0.11652728170156479, 0.09854985773563385, 0.3945377767086029, 0.8296274542808533, 0.11564282327890396, 0.01145652960985899, 0.011343755759298801], "count": [199]}, "action": {"min": [-0.5785714387893677, -0.6937500238418579, -0.9375, -0.04571428522467613, -0.019999999552965164, -0.20499999821186066, 0.0], "max": [0.3991071283817291, 0.4419642984867096, 0.9375, 0.023571427911520004, 0.06499999761581421, -0.0, 1.0], "mean": [-0.07003320008516312, -0.04832196235656738, -0.06502603739500046, -0.0025125627871602774, 0.013653982430696487, -0.06661880761384964, 0.29145729541778564], "std": [0.23416857421398163, 0.25872018933296204, 0.44280770421028137, 0.01208112109452486, 0.021343829110264778, 0.0674973577260971, 0.45443281531333923], "count": [199]}, "timestamp": {"min": [0.0], "max": [9.9], "mean": [4.95], "std": [2.8722813232690143], "count": [199]}, "frame_index": {"min": [0], "max": [198], "mean": [99.0], "std": [57.445626465380286], "count": [199]}, "episode_index": {"min": [147], "max": [147], "mean": [147.0], "std": [0.0], "count": [199]}, "index": {"min": [40087], "max": [40285], "mean": [40186.0], "std": [57.445626465380286], "count": [199]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [199]}}} +{"episode_index": 148, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3371430358886719]], [[0.2819333436255362]], [[0.24933458216050092]]], "std": [[[0.13813189020496164]], [[0.1376802663467725]], [[0.1436197536407104]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3233676315008425]], [[0.27898697198606004]], [[0.24634530220779718]]], "std": [[[0.16375866051113352]], [[0.18034847314095523]], [[0.1894687846518109]]], "count": [100]}, "observation.state": {"min": [-0.2075500786304474, -0.1383592039346695, 0.4512360990047455, 2.9514408111572266, -0.819821834564209, -0.0908069759607315, 0.02249579317867756, -0.04019581153988838], "max": [0.09148918837308884, 0.26931077241897583, 0.7095162868499756, 3.269166946411133, 0.06746625155210495, 0.46291083097457886, 0.03994324058294296, -0.021993836387991905], "mean": [-0.03149508684873581, 0.06787896901369095, 0.5885400772094727, 3.0905518531799316, -0.37130987644195557, 0.11075422912836075, 0.033212192356586456, -0.03400189056992531], "std": [0.08142975717782974, 0.13744251430034637, 0.07576419413089752, 0.08095699548721313, 0.25822877883911133, 0.12883490324020386, 0.005942565854638815, 0.006335429847240448], "count": [289]}, "action": {"min": [-0.6803571581840515, -0.918749988079071, -0.7205356955528259, -0.11464285850524902, -0.09321428835391998, -0.19607143104076385, 0.0], "max": [0.7392857074737549, 0.8999999761581421, 0.9375, 0.1542857140302658, 0.14142857491970062, 0.17249999940395355, 1.0], "mean": [0.042727384716272354, 0.08336009085178375, -0.01965831220149994, -0.004096639342606068, 0.01872219331562519, 0.0013272382784634829, 0.5397923588752747], "std": [0.349070280790329, 0.40636149048805237, 0.44878721237182617, 0.045400045812129974, 0.05337221547961235, 0.05890649929642677, 0.4984140396118164], "count": [289]}, "timestamp": {"min": [0.0], "max": [14.4], "mean": [7.200000000000001], "std": [4.171330722922843], "count": [289]}, "frame_index": {"min": [0], "max": [288], "mean": [144.0], "std": [83.42661445845684], "count": [289]}, "episode_index": {"min": [148], "max": [148], "mean": [148.0], "std": [0.0], "count": [289]}, "index": {"min": [40286], "max": [40574], "mean": [40430.0], "std": [83.42661445845684], "count": [289]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [289]}}} +{"episode_index": 149, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.580032465916054]], [[0.5320017365100337]], [[0.4834775294883578]]], "std": [[[0.28534856677485937]], [[0.2581480268685099]], [[0.22828325430374166]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.568701930027382]], [[0.5301667426614199]], [[0.4800704052495022]]], "std": [[[0.29541732809077964]], [[0.2721571323033788]], [[0.254336438046023]]], "count": [100]}, "observation.state": {"min": [-0.2047567218542099, -0.29466280341148376, 1.0001050233840942, 1.9904980659484863, -2.843596935272217, -0.6505334973335266, 0.001877491595223546, -0.04029262438416481], "max": [0.05114908516407013, 0.2086789757013321, 1.1731047630310059, 3.1418521404266357, -0.001772052375599742, -0.05894343927502632, 0.040012262761592865, -0.010623104870319366], "mean": [-0.03233865275979042, -0.057741545140743256, 1.09065580368042, 2.570195436477661, -2.2048473358154297, -0.39307621121406555, 0.02764158509671688, -0.028961505740880966], "std": [0.06131364405155182, 0.15184713900089264, 0.05300017446279526, 0.313022643327713, 0.6784827709197998, 0.16910438239574432, 0.013057250529527664, 0.012077927589416504], "count": [373]}, "action": {"min": [-0.4821428656578064, -0.7044642567634583, -0.44732141494750977, -0.011785713955760002, -0.0835714265704155, -0.335357129573822, 0.0], "max": [0.6830357313156128, 0.7392857074737549, 0.5491071343421936, 0.10821428894996643, 0.1274999976158142, 0.07392857223749161, 1.0], "mean": [0.02665647119283676, -0.041981007903814316, -0.054339826107025146, 0.00935274176299572, 0.001344313845038414, -0.03389506787061691, 0.554959774017334], "std": [0.25328779220581055, 0.3774395287036896, 0.251278281211853, 0.024506963789463043, 0.03420551121234894, 0.08941168338060379, 0.4969702661037445], "count": [373]}, "timestamp": {"min": [0.0], "max": [18.6], "mean": [9.299999999999999], "std": [5.3837719119591245], "count": [373]}, "frame_index": {"min": [0], "max": [372], "mean": [186.0], "std": [107.67543823918248], "count": [373]}, "episode_index": {"min": [149], "max": [149], "mean": [149.0], "std": [0.0], "count": [373]}, "index": {"min": [40575], "max": [40947], "mean": [40761.0], "std": [107.67543823918248], "count": [373]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [373]}}} +{"episode_index": 150, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5697363975375306]], [[0.5365578697054993]], [[0.5015405171712239]]], "std": [[[0.2703232270253261]], [[0.2507302977057691]], [[0.23238348525160243]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5396722142836626]], [[0.5048597962622549]], [[0.45637493178423716]]], "std": [[[0.30008318563934544]], [[0.2744644796288864]], [[0.2552648343099328]]], "count": [100]}, "observation.state": {"min": [-0.20988301932811737, -0.09834711998701096, 0.9274046421051025, 2.1119112968444824, 0.00025462463963776827, -0.14177118241786957, 0.006348995491862297, -0.03998640552163124], "max": [0.05112346634268761, 0.20336179435253143, 1.1702380180358887, 3.1433582305908203, 3.0100414752960205, 0.8412485122680664, 0.04017903283238411, -0.006893059704452753], "mean": [-0.07946829497814178, 0.0787467509508133, 1.0564216375350952, 2.701249599456787, 1.5637329816818237, 0.25705015659332275, 0.026417164131999016, -0.02647300250828266], "std": [0.1069578230381012, 0.10413084924221039, 0.08013316243886948, 0.35262420773506165, 1.0707981586456299, 0.29661139845848083, 0.014921565540134907, 0.01486132387071848], "count": [298]}, "action": {"min": [-0.36696428060531616, -0.6803571581840515, -0.7258928418159485, -0.023571427911520004, -0.14892856776714325, -0.0503571443259716, 0.0], "max": [0.7098214030265808, 0.6482142806053162, 0.918749988079071, 0.11357142776250839, 0.1574999988079071, 0.375, 1.0], "mean": [0.044160470366477966, 0.03099234402179718, -0.06914852559566498, 0.022205177694559097, 0.0026749775279313326, 0.052633028477430344, 0.5771812200546265], "std": [0.20256131887435913, 0.2935941219329834, 0.3605183959007263, 0.03408690541982651, 0.0637502372264862, 0.09183066338300705, 0.49400684237480164], "count": [298]}, "timestamp": {"min": [0.0], "max": [14.85], "mean": [7.424999999999999], "std": [4.301235287681901], "count": [298]}, "frame_index": {"min": [0], "max": [297], "mean": [148.5], "std": [86.024705753638], "count": [298]}, "episode_index": {"min": [150], "max": [150], "mean": [150.0], "std": [0.0], "count": [298]}, "index": {"min": [40948], "max": [41245], "mean": [41096.5], "std": [86.024705753638], "count": [298]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [298]}}} +{"episode_index": 151, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6027563314998851]], [[0.5540506029316024]], [[0.500776553883272]]], "std": [[[0.2663322321481594]], [[0.25428323631135596]], [[0.23454010074997098]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5482519561169195]], [[0.508523639753753]], [[0.4585442822026271]]], "std": [[[0.2986360838443956]], [[0.2775076257726053]], [[0.2629091080839002]]], "count": [100]}, "observation.state": {"min": [-0.21527299284934998, -0.07010959833860397, 0.9329493641853333, 2.397061824798584, -1.9630684852600098, -0.7656122446060181, 0.0018284557154402137, -0.040011730045080185], "max": [0.052038274705410004, 0.16352704167366028, 1.1626465320587158, 3.1406896114349365, 0.004015568643808365, 0.4943169951438904, 0.040010493248701096, -0.0013542756205424666], "mean": [-0.033119913190603256, 0.02203732542693615, 1.0447183847427368, 2.633497953414917, -1.5207810401916504, -0.036842841655015945, 0.02687210403382778, -0.026649216189980507], "std": [0.07450426369905472, 0.07433833926916122, 0.0755964070558548, 0.22744470834732056, 0.562461793422699, 0.407107949256897, 0.01693011075258255, 0.01747417449951172], "count": [217]}, "action": {"min": [-0.5223214030265808, -0.6401785612106323, -0.5544642806053162, -0.09000000357627869, -0.10928571224212646, -0.3407142758369446, 0.0], "max": [0.5196428298950195, 0.768750011920929, 0.8705357313156128, 0.14785714447498322, 0.21964286267757416, 0.09857142716646194, 1.0], "mean": [0.054151590913534164, 0.11761027574539185, -0.10762428492307663, 0.009761356748640537, 0.014298885129392147, -0.04497035592794418, 0.6589861512184143], "std": [0.26370131969451904, 0.3510555326938629, 0.36826908588409424, 0.03919004648923874, 0.07274230569601059, 0.10478533059358597, 0.4740501344203949], "count": [217]}, "timestamp": {"min": [0.0], "max": [10.8], "mean": [5.3999999999999995], "std": [3.132091952673165], "count": [217]}, "frame_index": {"min": [0], "max": [216], "mean": [108.0], "std": [62.6418390534633], "count": [217]}, "episode_index": {"min": [151], "max": [151], "mean": [151.0], "std": [0.0], "count": [217]}, "index": {"min": [41246], "max": [41462], "mean": [41354.0], "std": [62.6418390534633], "count": [217]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [217]}}} +{"episode_index": 152, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3570235679476869]], [[0.29251930865119485]], [[0.25281623152190563]]], "std": [[[0.15727091492876744]], [[0.1616872322461497]], [[0.17049076340530844]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32676088520124846]], [[0.28129264143401506]], [[0.2512697873583027]]], "std": [[[0.1639723430633305]], [[0.1796568859976663]], [[0.19037219355901014]]], "count": [100]}, "observation.state": {"min": [-0.1171196848154068, -0.10673639923334122, 0.4513373076915741, 3.0601565837860107, -0.3537205457687378, -0.24216514825820923, 0.0010918114567175508, -0.039802756160497665], "max": [0.16249562799930573, 0.15034617483615875, 0.69350266456604, 3.220512628555298, 0.6630134582519531, 0.2859657108783722, 0.040484439581632614, -0.002586016431450844], "mean": [0.020579596981406212, 0.010099156759679317, 0.5612232685089111, 3.1569299697875977, 0.11693470180034637, -0.014623981900513172, 0.024613741785287857, -0.022110000252723694], "std": [0.09071832150220871, 0.08388134837150574, 0.06735794991254807, 0.05771718546748161, 0.3496474027633667, 0.14823316037654877, 0.016522251069545746, 0.01600363478064537], "count": [226]}, "action": {"min": [-0.6133928298950195, -0.46875, -0.6321428418159485, -0.062142856419086456, -0.12964285910129547, -0.1071428582072258, 0.0], "max": [0.7526785731315613, 0.43392857909202576, 0.4955357015132904, 0.04928571358323097, 0.09642857313156128, 0.14142857491970062, 1.0], "mean": [0.040131162852048874, 0.04574906453490257, -0.10210571438074112, -0.0021807842422276735, -0.006983248516917229, -0.010591020807623863, 0.43805310130119324], "std": [0.3642953634262085, 0.20996464788913727, 0.280620813369751, 0.02117099054157734, 0.04680028185248375, 0.05472540110349655, 0.49614790081977844], "count": [226]}, "timestamp": {"min": [0.0], "max": [11.25], "mean": [5.625], "std": [3.261997087674972], "count": [226]}, "frame_index": {"min": [0], "max": [225], "mean": [112.5], "std": [65.23994175349944], "count": [226]}, "episode_index": {"min": [152], "max": [152], "mean": [152.0], "std": [0.0], "count": [226]}, "index": {"min": [41463], "max": [41688], "mean": [41575.5], "std": [65.23994175349944], "count": [226]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [226]}}} +{"episode_index": 153, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5716212942086014]], [[0.5363023418351716]], [[0.501608154296875]]], "std": [[[0.2580289602305772]], [[0.23980601546222854]], [[0.2214435919030115]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5402375763537837]], [[0.5050694454417509]], [[0.45631944903205424]]], "std": [[[0.30314349300580007]], [[0.27779214552465387]], [[0.25872248687509936]]], "count": [100]}, "observation.state": {"min": [-0.22443482279777527, -0.06382185965776443, 0.9270684719085693, 2.0022222995758057, -0.01766214333474636, -0.09209342300891876, 0.004354244563728571, -0.040022846311330795], "max": [0.02856438420712948, 0.2134602963924408, 1.1579431295394897, 3.1529526710510254, 2.2954659461975098, 1.1260170936584473, 0.04073289781808853, -0.008111638016998768], "mean": [-0.09854577481746674, 0.0777849480509758, 1.0289868116378784, 2.564300775527954, 1.4246900081634521, 0.4992811977863312, 0.030387742444872856, -0.030199944972991943], "std": [0.10344891995191574, 0.09980275481939316, 0.06767290085554123, 0.43998342752456665, 0.9084001779556274, 0.5192577838897705, 0.011905520223081112, 0.011868845671415329], "count": [255]}, "action": {"min": [-0.27321428060531616, -0.7124999761581421, -0.7607142925262451, -0.02142857201397419, -0.1274999976158142, -0.02678571455180645, 0.0], "max": [0.637499988079071, 0.6133928298950195, 0.7205356955528259, 0.13500000536441803, 0.11785714328289032, 0.375, 1.0], "mean": [0.03440125659108162, 0.061911772936582565, -0.11637601256370544, 0.01626470685005188, -0.008617648854851723, 0.05852099880576134, 0.615686297416687], "std": [0.20102006196975708, 0.3064589500427246, 0.3577180802822113, 0.03470052406191826, 0.05091085284948349, 0.1086789146065712, 0.4864329695701599], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [153], "max": [153], "mean": [153.0], "std": [0.0], "count": [255]}, "index": {"min": [41689], "max": [41943], "mean": [41816.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [255]}}} +{"episode_index": 154, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.996078431372549]], [[1.0]]], "mean": [[[0.3143639951219746]], [[0.24635123697916667]], [[0.16039053584080118]]], "std": [[[0.21202610842070366]], [[0.1608997069818222]], [[0.11006046004994498]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9882352941176471]], [[0.9882352941176471]], [[0.9882352941176471]]], "mean": [[[0.3541128653732]], [[0.2981990715475643]], [[0.22246167291379443]]], "std": [[[0.14137007162103066]], [[0.1319353773178779]], [[0.14135138645875212]]], "count": [100]}, "observation.state": {"min": [-0.4342203438282013, -0.18139156699180603, 0.9882856607437134, 1.9911651611328125, -2.2898547649383545, -0.5141825675964355, 0.0073234825395047665, -0.03994027152657509], "max": [-0.18044432997703552, 0.14615210890769958, 1.3049758672714233, 3.1446194648742676, 0.0027503520250320435, 0.5764784216880798, 0.0399651899933815, -0.01423787884414196], "mean": [-0.27442848682403564, -0.020712317898869514, 1.151737928390503, 2.641789197921753, -1.283719778060913, -0.2342386245727539, 0.022315025329589844, -0.023511409759521484], "std": [0.08715923130512238, 0.12032678723335266, 0.08867643028497696, 0.45308831334114075, 0.7337383031845093, 0.2814885675907135, 0.01184237003326416, 0.011076790280640125], "count": [244]}, "action": {"min": [-0.6991071701049805, -0.5866071581840515, -0.9375, -0.23642857372760773, -0.05000000074505806, -0.17928571999073029, 0.0], "max": [0.4258928596973419, 0.4258928596973419, 0.9375, 0.03285714238882065, 0.10285714268684387, 0.10857142508029938, 1.0], "mean": [-0.1096787229180336, 0.006235364358872175, -0.11935009807348251, -0.03484778106212616, 0.00879683531820774, -0.039080798625946045, 0.2991803288459778], "std": [0.2418443113565445, 0.2482997626066208, 0.42944201827049255, 0.06354842334985733, 0.025044137611985207, 0.07457862794399261, 0.45789834856987], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [154], "max": [154], "mean": [154.0], "std": [0.0], "count": [244]}, "index": {"min": [41944], "max": [42187], "mean": [42065.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [244]}}} +{"episode_index": 155, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6095306103276271]], [[0.5651166974235984]], [[0.5131164113961014]]], "std": [[[0.27223922239989573]], [[0.254957919178181]], [[0.23429135381793073]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5492005172430301]], [[0.5089830543667663]], [[0.45852992039100793]]], "std": [[[0.2989543980267008]], [[0.2776334259381322]], [[0.26282940318640124]]], "count": [100]}, "observation.state": {"min": [-0.20388680696487427, -0.05521506816148758, 0.9183580875396729, 2.2684903144836426, -2.2573444843292236, -0.8764110207557678, 0.0023131894413381815, -0.04000905156135559], "max": [0.05920733883976936, 0.18679741024971008, 1.1856980323791504, 3.1419827938079834, 0.0016511842841282487, 0.25551703572273254, 0.04031830281019211, -0.001081031165085733], "mean": [-0.025340700522065163, 0.04151519015431404, 1.0303258895874023, 2.551750659942627, -1.7475279569625854, -0.10459816455841064, 0.025060981512069702, -0.02378195896744728], "std": [0.0665903314948082, 0.07616214454174042, 0.08655554056167603, 0.24003465473651886, 0.5699984431266785, 0.3645137548446655, 0.01743069849908352, 0.018137866631150246], "count": [267]}, "action": {"min": [-0.4714285731315613, -0.7714285850524902, -0.5705357193946838, -0.029999999329447746, -0.2849999964237213, -0.29571428894996643, 0.0], "max": [0.5116071701049805, 0.7473214268684387, 0.6348214149475098, 0.1842857152223587, 0.20250000059604645, 0.08250000327825546, 1.0], "mean": [0.05628010630607605, 0.09143257886171341, -0.09672953933477402, 0.01799357682466507, 0.005156500265002251, -0.03795745596289635, 0.5805243253707886], "std": [0.21624208986759186, 0.3171185553073883, 0.2938944101333618, 0.036648016422986984, 0.07037127763032913, 0.10389126092195511, 0.49347370862960815], "count": [267]}, "timestamp": {"min": [0.0], "max": [13.3], "mean": [6.65], "std": [3.8537860172389786], "count": [267]}, "frame_index": {"min": [0], "max": [266], "mean": [133.0], "std": [77.07572034477957], "count": [267]}, "episode_index": {"min": [155], "max": [155], "mean": [155.0], "std": [0.0], "count": [267]}, "index": {"min": [42188], "max": [42454], "mean": [42321.0], "std": [77.07572034477957], "count": [267]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [267]}}} +{"episode_index": 156, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31339858051374847]], [[0.2633685446346507]], [[0.23393747845818014]]], "std": [[[0.15009210798157496]], [[0.14726499245849134]], [[0.15398653041209615]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3191947883157169]], [[0.27172237441119024]], [[0.23688052966547946]]], "std": [[[0.15760366855506827]], [[0.17212531742629494]], [[0.18169314117657]]], "count": [100]}, "observation.state": {"min": [-0.13509757816791534, -0.14000912010669708, 0.4822149872779846, 2.8453879356384277, -0.8889849781990051, -0.49161937832832336, 0.018676411360502243, -0.03985460102558136], "max": [0.002218070439994335, 0.2807740271091461, 0.6937834024429321, 3.3123342990875244, 0.4085918962955475, 0.14376519620418549, 0.04128068685531616, -0.020050514489412308], "mean": [-0.07188166677951813, 0.08492252230644226, 0.6046526432037354, 3.1078243255615234, -0.12935350835323334, -0.1363118290901184, 0.035258322954177856, -0.03257127106189728], "std": [0.03583061322569847, 0.14548687636852264, 0.0629131942987442, 0.10755787044763565, 0.3943522274494171, 0.17741774022579193, 0.007057311479002237, 0.006991500500589609], "count": [255]}, "action": {"min": [-0.46339285373687744, -0.8330357074737549, -0.7553571462631226, -0.12535713613033295, -0.17142857611179352, -0.13607142865657806, 0.0], "max": [0.5544642806053162, 0.84375, 0.9375, 0.14571428298950195, 0.12857143580913544, 0.0835714265704155, 1.0], "mean": [0.005777308717370033, 0.09056717902421951, -0.027268890291452408, -0.0030168064404278994, 0.0037983215879648924, -0.01954622007906437, 0.5372549295425415], "std": [0.2650887668132782, 0.4298125207424164, 0.4430123567581177, 0.05496254190802574, 0.05060995742678642, 0.047952327877283096, 0.4986104965209961], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [156], "max": [156], "mean": [156.0], "std": [0.0], "count": [255]}, "index": {"min": [42455], "max": [42709], "mean": [42582.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [255]}}} +{"episode_index": 157, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35308107682770373]], [[0.28915016084558826]], [[0.24551978556315104]]], "std": [[[0.14737924574604722]], [[0.15052400673377203]], [[0.1579375997145995]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31658533791934745]], [[0.26783706545362285]], [[0.2346989740109911]]], "std": [[[0.15153322267990033]], [[0.16572876063142247]], [[0.17468207904299263]]], "count": [100]}, "observation.state": {"min": [-0.12362226843833923, -0.26567453145980835, 0.5041592717170715, 3.017957925796509, -0.22747111320495605, -0.398449182510376, 0.0022651618346571922, -0.03995003178715706], "max": [0.007726480718702078, 0.35354822874069214, 0.6668041944503784, 3.161898136138916, 0.2583797872066498, 0.25343942642211914, 0.039872512221336365, -0.002554673934355378], "mean": [-0.04479736462235451, -0.013301292434334755, 0.5766333341598511, 3.086291790008545, 0.049309439957141876, 0.017456509172916412, 0.022043464705348015, -0.021772775799036026], "std": [0.03714738413691521, 0.20358969271183014, 0.042753588408231735, 0.04286212846636772, 0.14516392350196838, 0.14679595828056335, 0.016723522916436195, 0.016828570514917374], "count": [224]}, "action": {"min": [-0.40714284777641296, -0.6803571581840515, -0.5758928656578064, -0.034285712987184525, -0.10499999672174454, -0.07821428775787354, 0.0], "max": [0.5544642806053162, 0.84375, 0.7580357193946838, 0.05892857164144516, 0.16607142984867096, 0.09321428835391998, 1.0], "mean": [0.020005574449896812, 0.12066730111837387, -0.04802294820547104, 0.0010762119200080633, 0.009403699077665806, -0.0007653055363334715, 0.5044642686843872], "std": [0.23040837049484253, 0.38899487257003784, 0.3401770293712616, 0.01759328320622444, 0.04846654459834099, 0.03661448881030083, 0.4999805688858032], "count": [224]}, "timestamp": {"min": [0.0], "max": [11.15], "mean": [5.575], "std": [3.2331292890943906], "count": [224]}, "frame_index": {"min": [0], "max": [223], "mean": [111.5], "std": [64.66258578188781], "count": [224]}, "episode_index": {"min": [157], "max": [157], "mean": [157.0], "std": [0.0], "count": [224]}, "index": {"min": [42710], "max": [42933], "mean": [42821.5], "std": [64.66258578188781], "count": [224]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [224]}}} +{"episode_index": 158, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.9921568627450981]], [[1.0]]], "mean": [[[0.3144071679208793]], [[0.24716641534543504]], [[0.16162904268152573]]], "std": [[[0.2136005986006174]], [[0.1618563000158412]], [[0.10990778357208252]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9764705882352941]], [[0.9725490196078431]], [[0.9647058823529412]]], "mean": [[[0.35520358515720746]], [[0.2996268065209482]], [[0.224286392511106]]], "std": [[[0.14051926320562813]], [[0.13173094323975054]], [[0.14183472098310446]]], "count": [100]}, "observation.state": {"min": [-0.4695049226284027, -0.17052246630191803, 0.9888848066329956, 2.070024013519287, -2.337132215499878, -0.37293070554733276, 0.0011207843199372292, -0.04075193405151367], "max": [-0.14320820569992065, 0.13178841769695282, 1.2212296724319458, 3.1422343254089355, 0.004611845128238201, -0.017739122733473778, 0.03987005725502968, -0.015434306114912033], "mean": [-0.29356634616851807, -0.03552623838186264, 1.1372835636138916, 2.654264211654663, -1.3054959774017334, -0.20558540523052216, 0.02043810300529003, -0.025934873148798943], "std": [0.11967794597148895, 0.12086538225412369, 0.06367726624011993, 0.39285439252853394, 0.8125348687171936, 0.11403992027044296, 0.012678536586463451, 0.01032398920506239], "count": [211]}, "action": {"min": [-0.5732142925262451, -0.6321428418159485, -0.9375, -0.06857142597436905, -0.04571428522467613, -0.1971428543329239, 0.0], "max": [0.6187499761581421, 0.4955357015132904, 0.8892857432365417, 0.027857143431901932, 0.054999999701976776, 0.04642857238650322, 1.0], "mean": [-0.12796206772327423, -0.037081070244312286, -0.10842502862215042, -0.003480026498436928, 0.002928233239799738, -0.06472919136285782, 0.27962085604667664], "std": [0.3138565123081207, 0.26478445529937744, 0.3705690801143646, 0.015420842915773392, 0.01489193644374609, 0.05338805541396141, 0.4488115608692169], "count": [211]}, "timestamp": {"min": [0.0], "max": [10.5], "mean": [5.25], "std": [3.0454884665682123], "count": [211]}, "frame_index": {"min": [0], "max": [210], "mean": [105.0], "std": [60.909769331364245], "count": [211]}, "episode_index": {"min": [158], "max": [158], "mean": [158.0], "std": [0.0], "count": [211]}, "index": {"min": [42934], "max": [43144], "mean": [43039.0], "std": [60.909769331364245], "count": [211]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [211]}}} +{"episode_index": 159, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.984313725490196]], [[0.9882352941176471]]], "mean": [[[0.349809019799326]], [[0.27429358867570464]], [[0.17743263035194545]]], "std": [[[0.21187717277988663]], [[0.16023373327006057]], [[0.10998583494147895]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3554900841806449]], [[0.2999137357823989]], [[0.2248980162377451]]], "std": [[[0.14114385037756716]], [[0.13216376675011365]], [[0.14243499593095138]]], "count": [100]}, "observation.state": {"min": [-0.4312693476676941, -0.18553835153579712, 0.9906167387962341, 1.8079957962036133, -2.1869912147521973, -0.5427984595298767, 0.012538472190499306, -0.03997337445616722], "max": [-0.13006387650966644, 0.13192571699619293, 1.2712558507919312, 3.1394457817077637, 0.006311504170298576, -0.022887371480464935, 0.039860449731349945, -0.014807933010160923], "mean": [-0.21712841093540192, -0.006116910371929407, 1.1576886177062988, 2.650439739227295, -1.1622945070266724, -0.23444581031799316, 0.024338146671652794, -0.024830801412463188], "std": [0.08073805272579193, 0.1257159411907196, 0.07823984324932098, 0.4322201907634735, 0.7365882992744446, 0.20325222611427307, 0.012140851467847824, 0.011788615956902504], "count": [165]}, "action": {"min": [-0.7982142567634583, -0.543749988079071, -0.5330356955528259, -0.13428571820259094, -0.03928571566939354, -0.17642857134342194, 0.0], "max": [0.581250011920929, 0.47678571939468384, 0.824999988079071, 0.034285712987184525, 0.06428571790456772, 0.027857143431901932, 1.0], "mean": [-0.08212660998106003, -0.07964282482862473, -0.05277595669031143, -0.015649352222681046, 0.01482250913977623, -0.08451945334672928, 0.3636363744735718], "std": [0.3342704772949219, 0.2752707898616791, 0.40367409586906433, 0.03412333503365517, 0.023301739245653152, 0.04077240079641342, 0.48104581236839294], "count": [165]}, "timestamp": {"min": [0.0], "max": [8.2], "mean": [4.1], "std": [2.3815261213488017], "count": [165]}, "frame_index": {"min": [0], "max": [164], "mean": [82.0], "std": [47.63052242697603], "count": [165]}, "episode_index": {"min": [159], "max": [159], "mean": [159.0], "std": [0.0], "count": [165]}, "index": {"min": [43145], "max": [43309], "mean": [43227.0], "std": [47.63052242697603], "count": [165]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [165]}}} +{"episode_index": 160, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32185589240579043]], [[0.26849202593635113]], [[0.23747432035558363]]], "std": [[[0.149670184774712]], [[0.149832820068672]], [[0.1581900277051952]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.318050303141276]], [[0.27340256934072454]], [[0.2406439998851103]]], "std": [[[0.15807727928159085]], [[0.17377099297396012]], [[0.18216444004960328]]], "count": [100]}, "observation.state": {"min": [-0.18100015819072723, -0.11205685883760452, 0.4482892155647278, 3.012432813644409, -0.6244752407073975, -0.7946023941040039, 0.022245770320296288, -0.0399399995803833], "max": [0.07420367747545242, 0.2813926637172699, 0.7050340175628662, 3.1914234161376953, 0.44518497586250305, 0.2582658529281616, 0.040273427963256836, -0.019832545891404152], "mean": [-0.02636757679283619, 0.08317936956882477, 0.6000308990478516, 3.128246784210205, -0.2073303759098053, -0.2575687766075134, 0.034441083669662476, -0.03201794624328613], "std": [0.0668146163225174, 0.12559746205806732, 0.07441187649965286, 0.04283524677157402, 0.3196864724159241, 0.27434131503105164, 0.006746569182723761, 0.007814968004822731], "count": [258]}, "action": {"min": [-0.44999998807907104, -0.7821428775787354, -0.7982142567634583, -0.08250000327825546, -0.12107142806053162, -0.1339285671710968, 0.0], "max": [0.7794643044471741, 0.8464285731315613, 0.9375, 0.11785714328289032, 0.2014285773038864, 0.34607142210006714, 1.0], "mean": [-0.0029173600487411022, 0.08878734707832336, -0.03442692756652832, 0.004975083749741316, -0.0006146157975308597, -0.006287373136729002, 0.5465116500854492], "std": [0.2851710319519043, 0.3677545487880707, 0.4743056297302246, 0.027024779468774796, 0.05574154108762741, 0.09048600494861603, 0.497831791639328], "count": [258]}, "timestamp": {"min": [0.0], "max": [12.85], "mean": [6.425000000000001], "std": [3.723881263771264], "count": [258]}, "frame_index": {"min": [0], "max": [257], "mean": [128.5], "std": [74.47762527542528], "count": [258]}, "episode_index": {"min": [160], "max": [160], "mean": [160.0], "std": [0.0], "count": [258]}, "index": {"min": [43310], "max": [43567], "mean": [43438.5], "std": [74.47762527542528], "count": [258]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [258]}}} +{"episode_index": 161, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31729689654181986]], [[0.25698160328584563]], [[0.22080511534447764]]], "std": [[[0.1263544974685536]], [[0.1180069144377598]], [[0.12120156845799473]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32162979125976565]], [[0.2773878921807981]], [[0.2448018924488741]]], "std": [[[0.16051722390128684]], [[0.17687639239027453]], [[0.1856436936953987]]], "count": [100]}, "observation.state": {"min": [-0.11456477642059326, -0.10228148847818375, 0.45178696513175964, 2.799133062362671, -1.2463871240615845, -0.5137557983398438, 0.0009495379636064172, -0.040409382432699203], "max": [0.11915890872478485, 0.2739241421222687, 0.7042235136032104, 3.2807576656341553, 0.0004515158070717007, 0.3943687081336975, 0.039991382509469986, -0.000732094282284379], "mean": [-0.019964143633842468, 0.07239269465208054, 0.5807579159736633, 3.1183061599731445, -0.5612860918045044, -0.05065606161952019, 0.029037289321422577, -0.03047584742307663], "std": [0.06515903025865555, 0.115806445479393, 0.07547655701637268, 0.12971611320972443, 0.4000701606273651, 0.1660555750131607, 0.010796060785651207, 0.010159946978092194], "count": [323]}, "action": {"min": [-0.5089285969734192, -0.84375, -0.7473214268684387, -0.06428571790456772, -0.1810714304447174, -0.21642857789993286, 0.0], "max": [0.824999988079071, 0.7982142567634583, 0.9375, 0.1039285734295845, 0.2314285784959793, 0.32892856001853943, 1.0], "mean": [0.0271505918353796, 0.06659109145402908, -0.02112174779176712, 0.00388434249907732, -0.004746792372316122, -0.007450235076248646, 0.5170278549194336], "std": [0.28116685152053833, 0.34454911947250366, 0.40406233072280884, 0.02614315040409565, 0.08246610313653946, 0.08846835792064667, 0.4997100532054901], "count": [323]}, "timestamp": {"min": [0.0], "max": [16.1], "mean": [8.049999999999999], "std": [4.662081080376017], "count": [323]}, "frame_index": {"min": [0], "max": [322], "mean": [161.0], "std": [93.24162160752032], "count": [323]}, "episode_index": {"min": [161], "max": [161], "mean": [161.0], "std": [0.0], "count": [323]}, "index": {"min": [43568], "max": [43890], "mean": [43729.0], "std": [93.24162160752032], "count": [323]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [323]}}} +{"episode_index": 162, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.567837838565602]], [[0.5328354444316789]], [[0.49602780271043967]]], "std": [[[0.268326993961801]], [[0.24581704579759223]], [[0.22258749736154268]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5372658565745634]], [[0.5023900888480393]], [[0.45382525634765625]]], "std": [[[0.2994632941885551]], [[0.2734002319508703]], [[0.25369920799974155]]], "count": [100]}, "observation.state": {"min": [-0.24308553338050842, -0.08535761386156082, 0.9245690107345581, 2.149409532546997, 6.389326881617308e-05, -0.1252535581588745, 0.005624726880341768, -0.04000822827219963], "max": [0.03786943852901459, 0.22372157871723175, 1.1781202554702759, 3.152039051055908, 2.6476361751556396, 0.4508061408996582, 0.04061989113688469, -0.003984902519732714], "mean": [-0.10266441106796265, 0.07710913568735123, 1.0413848161697388, 2.7170662879943848, 1.246269941329956, 0.18188920617103577, 0.03155985847115517, -0.026987072080373764], "std": [0.11497306078672409, 0.1111530140042305, 0.07965968549251556, 0.35226666927337646, 0.9255138039588928, 0.20401538908481598, 0.01297160517424345, 0.015040186233818531], "count": [272]}, "action": {"min": [-0.36964285373687744, -0.7580357193946838, -0.6669642925262451, -0.04714285582304001, -0.08571428805589676, -0.07500000298023224, 0.0], "max": [0.7875000238418579, 0.637499988079071, 0.6455357074737549, 0.05785714462399483, 0.1403571367263794, 0.375, 1.0], "mean": [0.053394168615341187, 0.05874146148562431, -0.081312395632267, 0.0025170696899294853, 0.0015519944718107581, 0.05986606329679489, 0.6102941036224365], "std": [0.23000243306159973, 0.30159011483192444, 0.3210282325744629, 0.017966974526643753, 0.04355408623814583, 0.0954994261264801, 0.48768365383148193], "count": [272]}, "timestamp": {"min": [0.0], "max": [13.55], "mean": [6.7749999999999995], "std": [3.9259552977587506], "count": [272]}, "frame_index": {"min": [0], "max": [271], "mean": [135.5], "std": [78.51910595517501], "count": [272]}, "episode_index": {"min": [162], "max": [162], "mean": [162.0], "std": [0.0], "count": [272]}, "index": {"min": [43891], "max": [44162], "mean": [44026.5], "std": [78.51910595517501], "count": [272]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [272]}}} +{"episode_index": 163, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32456311693378526]], [[0.2709608405618107]], [[0.24018613628312654]]], "std": [[[0.14659561518770536]], [[0.14729588795847834]], [[0.15619453692300528]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31794343596813723]], [[0.27371451224532783]], [[0.24128802849264705]]], "std": [[[0.1586309887538121]], [[0.17425158709182034]], [[0.1827434237798848]]], "count": [100]}, "observation.state": {"min": [-0.16932491958141327, -0.10362093895673752, 0.44642919301986694, 3.0723178386688232, -0.5490822792053223, -0.2601008713245392, 0.02133791893720627, -0.03990037366747856], "max": [0.06345338374376297, 0.2595873773097992, 0.6776973009109497, 3.1574859619140625, -0.0018489268841221929, 0.06411286443471909, 0.03990033268928528, -0.020559100434184074], "mean": [-0.020656198263168335, 0.07735911756753922, 0.5926018953323364, 3.107875108718872, -0.3129481375217438, -0.124428391456604, 0.03308442607522011, -0.033097781240940094], "std": [0.06796074658632278, 0.1339937299489975, 0.0675082802772522, 0.026019297540187836, 0.18174496293067932, 0.0917704626917839, 0.0070740473456680775, 0.007377642672508955], "count": [241]}, "action": {"min": [-0.5169642567634583, -0.8276785612106323, -0.7660714387893677, -0.06321428716182709, -0.1103571429848671, -0.15000000596046448, 0.0], "max": [0.6830357313156128, 0.862500011920929, 0.9375, 0.06964285671710968, 0.12214285880327225, 0.12428571283817291, 1.0], "mean": [0.027352549135684967, 0.08016818761825562, -0.021084032952785492, 0.0024496151600033045, 0.004098993260413408, -0.00557053554803133, 0.5560166239738464], "std": [0.28404054045677185, 0.4056255519390106, 0.43231701850891113, 0.016951631754636765, 0.03306625783443451, 0.04758330062031746, 0.4968520700931549], "count": [241]}, "timestamp": {"min": [0.0], "max": [12.0], "mean": [6.0], "std": [3.4785054261852175], "count": [241]}, "frame_index": {"min": [0], "max": [240], "mean": [120.0], "std": [69.57010852370435], "count": [241]}, "episode_index": {"min": [163], "max": [163], "mean": [163.0], "std": [0.0], "count": [241]}, "index": {"min": [44163], "max": [44403], "mean": [44283.0], "std": [69.57010852370435], "count": [241]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [241]}}} +{"episode_index": 164, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5727594472847732]], [[0.5281666175991881]], [[0.4725338924632353]]], "std": [[[0.2957326159176097]], [[0.2667805037963092]], [[0.23619498494038374]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5135023450664445]], [[0.4818859791475184]], [[0.4356997166053922]]], "std": [[[0.3096533490722114]], [[0.28311339173506267]], [[0.261976799910118]]], "count": [100]}, "observation.state": {"min": [-0.31080785393714905, -0.12180739641189575, 0.9546173810958862, 2.2190277576446533, -2.982994318008423, -1.055613398551941, 0.008079148828983307, -0.04000835120677948], "max": [0.03908726945519447, 0.25475698709487915, 1.2010159492492676, 3.2672083377838135, 0.0905047208070755, 0.21623525023460388, 0.04001622647047043, -0.008867460303008556], "mean": [-0.09389850497245789, 0.0681377574801445, 1.0560500621795654, 2.7869760990142822, -1.8669400215148926, -0.35111039876937866, 0.03338183835148811, -0.03203163295984268], "std": [0.09196305274963379, 0.11953134089708328, 0.06666397303342819, 0.2678801715373993, 0.8890302777290344, 0.35003066062927246, 0.012149490416049957, 0.011898497119545937], "count": [310]}, "action": {"min": [-0.6508928537368774, -0.8062499761581421, -0.6267856955528259, -0.2014285773038864, -0.1607142835855484, -0.36000001430511475, 0.0], "max": [0.8330357074737549, 0.6830357313156128, 0.7660714387893677, 0.11571428924798965, 0.29357144236564636, 0.25607141852378845, 1.0], "mean": [0.0219210647046566, 0.11209387332201004, -0.027572007849812508, -0.004161293618381023, 0.027584100142121315, -0.0028375324327498674, 0.7935484051704407], "std": [0.30900534987449646, 0.3021269142627716, 0.26383650302886963, 0.06381548196077347, 0.09463300555944443, 0.14493344724178314, 0.40475794672966003], "count": [310]}, "timestamp": {"min": [0.0], "max": [15.45], "mean": [7.725], "std": [4.474441305906247], "count": [310]}, "frame_index": {"min": [0], "max": [309], "mean": [154.5], "std": [89.48882611812493], "count": [310]}, "episode_index": {"min": [164], "max": [164], "mean": [164.0], "std": [0.0], "count": [310]}, "index": {"min": [44404], "max": [44713], "mean": [44558.5], "std": [89.48882611812493], "count": [310]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [310]}}} +{"episode_index": 165, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3470451941396676]], [[0.2837493776807598]], [[0.24581063962450214]]], "std": [[[0.1464617237055479]], [[0.14795981382319298]], [[0.15693090259896555]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3282418003456265]], [[0.28308480176738665]], [[0.24996544871610754]]], "std": [[[0.16803318429272437]], [[0.18337467587658016]], [[0.1934966409051664]]], "count": [100]}, "observation.state": {"min": [-0.050437524914741516, -0.23889489471912384, 0.4503171741962433, 3.131589412689209, -0.1972905546426773, -0.32187700271606445, 0.01965412311255932, -0.03983994945883751], "max": [0.12380016595125198, 0.26740241050720215, 0.6960353255271912, 3.2626631259918213, 0.14611639082431793, 0.2097487598657608, 0.03998766094446182, -0.019295677542686462], "mean": [0.039732933044433594, 0.044303830713033676, 0.6028693318367004, 3.2064008712768555, -0.07354410737752914, -0.03460388258099556, 0.0294989924877882, -0.029248299077153206], "std": [0.052624136209487915, 0.17476823925971985, 0.0776723325252533, 0.037290871143341064, 0.1010863333940506, 0.13992230594158173, 0.008819231763482094, 0.009217359125614166], "count": [256]}, "action": {"min": [-0.5598214268684387, -0.8517857193946838, -0.8116071224212646, -0.09214285761117935, -0.13607142865657806, -0.09428571164608002, 0.0], "max": [0.6348214149475098, 0.8866071701049805, 0.9375, 0.062142856419086456, 0.10821428894996643, 0.1071428582072258, 1.0], "mean": [0.01637483574450016, 0.09069476276636124, -0.024159444496035576, -0.0002343749802093953, -0.00018833758076652884, -0.0009626125101931393, 0.49609375], "std": [0.2742067873477936, 0.4687325358390808, 0.4595589339733124, 0.02037207968533039, 0.051318563520908356, 0.03665775805711746, 0.4999847412109375], "count": [256]}, "timestamp": {"min": [0.0], "max": [12.75], "mean": [6.375], "std": [3.6950135317749515], "count": [256]}, "frame_index": {"min": [0], "max": [255], "mean": [127.5], "std": [73.90027063549903], "count": [256]}, "episode_index": {"min": [165], "max": [165], "mean": [165.0], "std": [0.0], "count": [256]}, "index": {"min": [44714], "max": [44969], "mean": [44841.5], "std": [73.90027063549903], "count": [256]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [256]}}} +{"episode_index": 166, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34072275139303765]], [[0.26677952964633117]], [[0.2191656530043658]]], "std": [[[0.13377530569144377]], [[0.12615573062511243]], [[0.12502853692630236]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3311028645833333]], [[0.287630651735792]], [[0.254842721378102]]], "std": [[[0.17202093689436132]], [[0.18763968416050428]], [[0.19766138275698197]]], "count": [100]}, "observation.state": {"min": [-0.04463312774896622, -0.19657869637012482, 0.44868674874305725, 3.0989830493927, -0.31252047419548035, -0.2212621420621872, 0.01984962821006775, -0.03985434025526047], "max": [0.15091903507709503, 0.2450762838125229, 0.7062613368034363, 3.2911617755889893, 0.24852187931537628, 0.16865430772304535, 0.039968717843294144, -0.014533198438584805], "mean": [0.07008381187915802, 0.03048422560095787, 0.5845568180084229, 3.2004191875457764, -0.029508192092180252, -0.08336043357849121, 0.02934936247766018, -0.028923610225319862], "std": [0.04076717048883438, 0.13974188268184662, 0.08320581912994385, 0.05024820566177368, 0.15743741393089294, 0.10026698559522629, 0.009012587368488312, 0.00932854600250721], "count": [321]}, "action": {"min": [-0.5919643044471741, -0.9375, -0.7098214030265808, -0.07928571105003357, -0.09535714238882065, -0.12428571283817291, 0.0], "max": [0.6776785850524902, 0.8705357313156128, 0.9375, 0.08142857253551483, 0.1007142886519432, 0.07071428745985031, 1.0], "mean": [0.014427587389945984, 0.06648864597082138, -0.0340537466108799, 4.005395749118179e-05, -0.002336449222639203, 0.001171560725197196, 0.49221184849739075], "std": [0.23929211497306824, 0.40576326847076416, 0.456585556268692, 0.02274804562330246, 0.03507230058312416, 0.02801939845085144, 0.49993979930877686], "count": [321]}, "timestamp": {"min": [0.0], "max": [16.0], "mean": [8.0], "std": [4.633213427705082], "count": [321]}, "frame_index": {"min": [0], "max": [320], "mean": [160.0], "std": [92.66426855410162], "count": [321]}, "episode_index": {"min": [166], "max": [166], "mean": [166.0], "std": [0.0], "count": [321]}, "index": {"min": [44970], "max": [45290], "mean": [45130.0], "std": [92.66426855410162], "count": [321]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [321]}}} +{"episode_index": 167, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3511692002240349]], [[0.2839415343041513]], [[0.2373702667834712]]], "std": [[[0.14639971508670369]], [[0.14714341626009492]], [[0.1515375139959064]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3098548631855086]], [[0.2601389860265395]], [[0.22639686375038295]]], "std": [[[0.14456577550858268]], [[0.15751473307279604]], [[0.16564251815098793]]], "count": [100]}, "observation.state": {"min": [-0.11637243628501892, -0.2841827869415283, 0.5060481429100037, 2.9932682514190674, -1.0254215002059937, -0.13591395318508148, 0.0022559487260878086, -0.03993214666843414], "max": [0.029979899525642395, 0.3678000271320343, 0.6789515614509583, 3.312849760055542, 0.12830908596515656, 0.25102660059928894, 0.03991682827472687, -0.0032239139545708895], "mean": [-0.036134667694568634, -0.004196015186607838, 0.5791922807693481, 3.103020668029785, -0.3072338104248047, 0.029070107266306877, 0.023335592821240425, -0.02376968413591385], "std": [0.03613223880529404, 0.2234298586845398, 0.04569701477885246, 0.09002087265253067, 0.3033161461353302, 0.11327361315488815, 0.015463759191334248, 0.015056424774229527], "count": [248]}, "action": {"min": [-0.4151785671710968, -0.6401785612106323, -0.6107142567634583, -0.12535713613033295, -0.08250000327825546, -0.08464285731315613, 0.0], "max": [0.5517857074737549, 0.7660714387893677, 0.6482142806053162, 0.12321428209543228, 0.06535714119672775, 0.055714286863803864, 1.0], "mean": [0.027034128084778786, 0.10682962089776993, -0.05297737568616867, -0.00018577257287688553, -0.001296082278713584, -0.020741647109389305, 0.5080645084381104], "std": [0.2040785253047943, 0.38645684719085693, 0.3124108612537384, 0.04334253817796707, 0.03193647786974907, 0.029925785958766937, 0.49993476271629333], "count": [248]}, "timestamp": {"min": [0.0], "max": [12.35], "mean": [6.175], "std": [3.579542568541405], "count": [248]}, "frame_index": {"min": [0], "max": [247], "mean": [123.5], "std": [71.5908513708281], "count": [248]}, "episode_index": {"min": [167], "max": [167], "mean": [167.0], "std": [0.0], "count": [248]}, "index": {"min": [45291], "max": [45538], "mean": [45414.5], "std": [71.5908513708281], "count": [248]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [248]}}} +{"episode_index": 168, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3568419428806679]], [[0.2930407888375076]], [[0.253630423153148]]], "std": [[[0.1551893456735105]], [[0.1607339841417348]], [[0.16971918981816733]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3249407450358073]], [[0.2790367060642616]], [[0.2488529992197074]]], "std": [[[0.15986307741190972]], [[0.17558059060295256]], [[0.18637125142422314]]], "count": [100]}, "observation.state": {"min": [-0.12842324376106262, -0.1020546704530716, 0.44805556535720825, 3.0171759128570557, -0.1157476082444191, -0.12650619447231293, 0.002657342003658414, -0.03982994705438614], "max": [0.15327130258083344, 0.13938890397548676, 0.6805556416511536, 3.23030161857605, 0.5531418323516846, 0.18839792907238007, 0.03984910994768143, -0.0015612769639119506], "mean": [0.0043443734757602215, 0.020514795556664467, 0.5521469712257385, 3.106635093688965, 0.19837412238121033, -0.008364816196262836, 0.024269256740808487, -0.023429807275533676], "std": [0.09372313320636749, 0.08430317044258118, 0.06603178381919861, 0.057035304605960846, 0.2522759437561035, 0.09596449136734009, 0.01501817349344492, 0.0159435011446476], "count": [203]}, "action": {"min": [-0.5973214507102966, -0.47410714626312256, -0.6321428418159485, -0.04392857104539871, -0.05892857164144516, -0.1103571429848671, 0.0], "max": [0.768750011920929, 0.44999998807907104, 0.4928571283817291, 0.0535714291036129, 0.06321428716182709, 0.09214285761117935, 1.0], "mean": [0.03917576000094414, 0.04374120756983757, -0.11750089377164841, -0.00048557406989857554, -0.0049507408402860165, -0.004079874139279127, 0.4482758641242981], "std": [0.3979252874851227, 0.18350671231746674, 0.3213958740234375, 0.01998388022184372, 0.025065477937459946, 0.050741441547870636, 0.49731749296188354], "count": [203]}, "timestamp": {"min": [0.0], "max": [10.1], "mean": [5.050000000000001], "std": [2.930017064796722], "count": [203]}, "frame_index": {"min": [0], "max": [202], "mean": [101.0], "std": [58.60034129593445], "count": [203]}, "episode_index": {"min": [168], "max": [168], "mean": [168.0], "std": [0.0], "count": [203]}, "index": {"min": [45539], "max": [45741], "mean": [45640.0], "std": [58.60034129593445], "count": [203]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [203]}}} +{"episode_index": 169, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6143134735705805]], [[0.5692672699572993]], [[0.5153937288172105]]], "std": [[[0.2631454945024331]], [[0.24571598848329476]], [[0.2239555616033213]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5511459984872855]], [[0.5113116155886183]], [[0.4611026593376608]]], "std": [[[0.2999125113202127]], [[0.2788703912099953]], [[0.26452872123591437]]], "count": [100]}, "observation.state": {"min": [-0.2037636935710907, -0.08402761816978455, 0.9164494276046753, 2.3918261528015137, -2.1848251819610596, -1.086337924003601, 0.0012997784651815891, -0.03976815193891525], "max": [0.0513019897043705, 0.2035520076751709, 1.166826605796814, 3.168372631072998, -0.0027359589003026485, 0.4672209620475769, 0.040860552340745926, -0.0019447385566309094], "mean": [-0.018920715898275375, 0.013844385743141174, 1.0142574310302734, 2.665182590484619, -1.7188169956207275, -0.018374694511294365, 0.024059167131781578, -0.02375614643096924], "std": [0.05725659802556038, 0.08710787445306778, 0.07965348660945892, 0.23270559310913086, 0.5063098669052124, 0.44505077600479126, 0.0174122154712677, 0.01637508161365986], "count": [287]}, "action": {"min": [-0.3241071403026581, -0.8919642567634583, -0.7473214268684387, -0.09107142686843872, -0.1939285695552826, -0.2978571355342865, 0.0], "max": [0.5089285969734192, 0.8464285731315613, 0.8651785850524902, 0.20035713911056519, 0.14464285969734192, 0.07607142627239227, 1.0], "mean": [0.05041688308119774, 0.09852849692106247, -0.08484634011983871, 0.022806117311120033, 0.0046776975505054, -0.03777998313307762, 0.5714285969734192], "std": [0.19178460538387299, 0.39039286971092224, 0.425882488489151, 0.05412837117910385, 0.08084279298782349, 0.07893817126750946, 0.4948712885379791], "count": [287]}, "timestamp": {"min": [0.0], "max": [14.3], "mean": [7.15], "std": [4.142463035441596], "count": [287]}, "frame_index": {"min": [0], "max": [286], "mean": [143.0], "std": [82.84926070883192], "count": [287]}, "episode_index": {"min": [169], "max": [169], "mean": [169.0], "std": [0.0], "count": [287]}, "index": {"min": [45742], "max": [46028], "mean": [45885.0], "std": [82.84926070883192], "count": [287]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [287]}}} +{"episode_index": 170, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3499412835813036]], [[0.2870780328488817]], [[0.24440188897824755]]], "std": [[[0.15323314238840116]], [[0.15526632504857812]], [[0.16168532415060324]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3125081200693168]], [[0.2633788679534314]], [[0.22971341361251532]]], "std": [[[0.14862715208143398]], [[0.1613266594918582]], [[0.16922627581200245]]], "count": [100]}, "observation.state": {"min": [-0.1476302444934845, -0.2991348206996918, 0.516921877861023, 2.8859241008758545, -0.003347638761624694, -0.49867191910743713, 0.0028347221668809652, -0.03990453854203224], "max": [0.043368205428123474, 0.35251209139823914, 0.6802680492401123, 3.162045478820801, 0.6257970333099365, 0.3000120520591736, 0.039968837052583694, -0.005242778919637203], "mean": [-0.03635186329483986, -0.025289013981819153, 0.5875846743583679, 3.0625205039978027, 0.39860624074935913, -0.13178570568561554, 0.02190565876662731, -0.022435564547777176], "std": [0.053428929299116135, 0.20570845901966095, 0.04794558137655258, 0.08360414952039719, 0.1875206083059311, 0.18473303318023682, 0.016852688044309616, 0.016364164650440216], "count": [277]}, "action": {"min": [-0.6937500238418579, -0.6589285731315613, -0.6241071224212646, -0.1339285671710968, -0.12321428209543228, -0.06750000268220901, 0.0], "max": [0.7419642806053162, 0.8598214387893677, 0.7285714149475098, 0.08571428805589676, 0.15000000596046448, 0.10285714268684387, 1.0], "mean": [0.013363854959607124, 0.0914485901594162, -0.04815627261996269, 0.0016903049545362592, -0.0037983483634889126, 0.003941466100513935, 0.47653430700302124], "std": [0.29002586007118225, 0.3734264075756073, 0.3171952962875366, 0.02941647171974182, 0.047633491456508636, 0.03509795293211937, 0.49944913387298584], "count": [277]}, "timestamp": {"min": [0.0], "max": [13.8], "mean": [6.8999999999999995], "std": [3.9981245603407602], "count": [277]}, "frame_index": {"min": [0], "max": [276], "mean": [138.0], "std": [79.96249120681522], "count": [277]}, "episode_index": {"min": [170], "max": [170], "mean": [170.0], "std": [0.0], "count": [277]}, "index": {"min": [46029], "max": [46305], "mean": [46167.0], "std": [79.96249120681522], "count": [277]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [277]}}} +{"episode_index": 171, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32418252922506896]], [[0.26864532949410236]], [[0.2349115582634421]]], "std": [[[0.15416966961008752]], [[0.15406968999878443]], [[0.16111008651759934]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31727022597369026]], [[0.2730205221737132]], [[0.24045745311063876]]], "std": [[[0.15813046727066882]], [[0.17348989323237568]], [[0.18176906944586138]]], "count": [100]}, "observation.state": {"min": [-0.13623668253421783, -0.12737558782100677, 0.44648024439811707, 2.9134345054626465, -0.6102834939956665, -0.4306569993495941, 0.022484054788947105, -0.039973217993974686], "max": [0.08735885471105576, 0.260724812746048, 0.7076370716094971, 3.1739234924316406, 0.20468617975711823, 0.06896860897541046, 0.0398600697517395, -0.01694645918905735], "mean": [-0.008803654462099075, 0.08060535043478012, 0.6033440232276917, 3.061230182647705, -0.2312692552804947, -0.18485277891159058, 0.03383674472570419, -0.03287826478481293], "std": [0.06814736872911453, 0.13460730016231537, 0.07355064898729324, 0.07417776435613632, 0.3243524730205536, 0.1116829663515091, 0.006323205307126045, 0.008156700991094112], "count": [261]}, "action": {"min": [-0.5866071581840515, -0.7205356955528259, -0.6991071701049805, -0.08785714209079742, -0.19607143104076385, -0.16178570687770844, 0.0], "max": [0.7553571462631226, 0.8946428298950195, 0.9375, 0.10821428894996643, 0.16178570687770844, 0.3085714280605316, 1.0], "mean": [0.029084568843245506, 0.06944787502288818, -0.026652304455637932, -6.568196840817109e-05, 0.003649423597380519, -0.0007266058819368482, 0.5555555820465088], "std": [0.28503379225730896, 0.40146487951278687, 0.4636266827583313, 0.032040130347013474, 0.06487289816141129, 0.06855136156082153, 0.49690473079681396], "count": [261]}, "timestamp": {"min": [0.0], "max": [13.0], "mean": [6.5], "std": [3.7671828554858693], "count": [261]}, "frame_index": {"min": [0], "max": [260], "mean": [130.0], "std": [75.34365710971738], "count": [261]}, "episode_index": {"min": [171], "max": [171], "mean": [171.0], "std": [0.0], "count": [261]}, "index": {"min": [46306], "max": [46566], "mean": [46436.0], "std": [75.34365710971738], "count": [261]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [261]}}} +{"episode_index": 172, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3444893954407935]], [[0.2745240095549939]], [[0.23159777951708027]]], "std": [[[0.12912098646758055]], [[0.12533950084414391]], [[0.12957377816139123]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33009341011795346]], [[0.2851585950664446]], [[0.2521463347790288]]], "std": [[[0.1682695320319644]], [[0.1840585930921949]], [[0.19434349990922772]]], "count": [100]}, "observation.state": {"min": [-0.06025836989283562, -0.21962755918502808, 0.44645294547080994, 3.0132179260253906, -0.1593122035264969, -0.2797766625881195, 0.019322188571095467, -0.040153082460165024], "max": [0.14221051335334778, 0.26498156785964966, 0.7107458114624023, 3.2768943309783936, 0.3351353704929352, 0.22391270101070404, 0.03988882899284363, -0.019421158358454704], "mean": [0.05990174040198326, 0.05582192540168762, 0.6020388603210449, 3.1539735794067383, 0.03959724307060242, -0.019321439787745476, 0.029156288132071495, -0.0297361109405756], "std": [0.05379633232951164, 0.16053161025047302, 0.08476340025663376, 0.06020805984735489, 0.14442738890647888, 0.11825093626976013, 0.009529609233140945, 0.008783920668065548], "count": [258]}, "action": {"min": [-0.6723214387893677, -0.8758928775787354, -0.8491071462631226, -0.1071428582072258, -0.1510714292526245, -0.06857142597436905, 0.0], "max": [0.6642857193946838, 0.8678571581840515, 0.9375, 0.08892857283353806, 0.17678570747375488, 0.07285714149475098, 1.0], "mean": [-0.0005710093537345529, 0.08874586224555969, -0.0470307357609272, -0.000901162507943809, -0.0032848839182406664, -0.0024916960392147303, 0.5077519416809082], "std": [0.32648828625679016, 0.43065688014030457, 0.4636079668998718, 0.036288708448410034, 0.05707612633705139, 0.03051270730793476, 0.49994057416915894], "count": [258]}, "timestamp": {"min": [0.0], "max": [12.85], "mean": [6.425000000000001], "std": [3.723881263771264], "count": [258]}, "frame_index": {"min": [0], "max": [257], "mean": [128.5], "std": [74.47762527542528], "count": [258]}, "episode_index": {"min": [172], "max": [172], "mean": [172.0], "std": [0.0], "count": [258]}, "index": {"min": [46567], "max": [46824], "mean": [46695.5], "std": [74.47762527542528], "count": [258]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [258]}}} +{"episode_index": 173, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5382235843434053]], [[0.4985341378006281]], [[0.4477389328900505]]], "std": [[[0.3009010921384544]], [[0.2712399244880436]], [[0.24026568756400224]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5089012211818321]], [[0.47715664553174786]], [[0.4308787877699908]]], "std": [[[0.3074068073741472]], [[0.2799209715724425]], [[0.2577621314880344]]], "count": [100]}, "observation.state": {"min": [-0.28061920404434204, -0.05520597845315933, 0.9627556800842285, 2.238476514816284, -2.441408395767212, -0.9708308577537537, 0.005392903927713633, -0.040318813174963], "max": [0.046652618795633316, 0.273639976978302, 1.2308851480484009, 3.374478816986084, 0.5137867331504822, -0.06763236224651337, 0.040608663111925125, -0.009437105618417263], "mean": [-0.08848058432340622, 0.09019629657268524, 1.092504620552063, 2.849748134613037, -1.2502708435058594, -0.5682286024093628, 0.03349890559911728, -0.03357073664665222], "std": [0.08843261003494263, 0.10023115575313568, 0.06916019320487976, 0.372636079788208, 1.0190538167953491, 0.29716387391090393, 0.012151041068136692, 0.011407425627112389], "count": [300]}, "action": {"min": [-0.9375, -0.7366071343421936, -0.7821428775787354, -0.15857142210006714, -0.11999999731779099, -0.2785714268684387, 0.0], "max": [0.9375, 0.7982142567634583, 0.8678571581840515, 0.22607143223285675, 0.207857146859169, 0.3653571307659149, 1.0], "mean": [0.04784821346402168, 0.11279462277889252, -0.04113392531871796, 0.011100000701844692, 0.01684286631643772, 0.008428565226495266, 0.8066666722297668], "std": [0.4325456917285919, 0.34364956617355347, 0.2917662560939789, 0.08106213063001633, 0.053915273398160934, 0.13638922572135925, 0.39491117000579834], "count": [300]}, "timestamp": {"min": [0.0], "max": [14.95], "mean": [7.475], "std": [4.330102962594154], "count": [300]}, "frame_index": {"min": [0], "max": [299], "mean": [149.5], "std": [86.60205925188308], "count": [300]}, "episode_index": {"min": [173], "max": [173], "mean": [173.0], "std": [0.0], "count": [300]}, "index": {"min": [46825], "max": [47124], "mean": [46974.5], "std": [86.60205925188308], "count": [300]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [300]}}} +{"episode_index": 174, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33068156941731774]], [[0.27149096081303614]], [[0.23542232139437808]]], "std": [[[0.13150583877546232]], [[0.1306740016001472]], [[0.13753991999700482]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3238097127278646]], [[0.2797902048148361]], [[0.2473760836732154]]], "std": [[[0.16287928022850737]], [[0.17951786390893806]], [[0.18863173318031615]]], "count": [100]}, "observation.state": {"min": [-0.1468028724193573, -0.12261827290058136, 0.4479474425315857, 2.9946112632751465, -0.604281485080719, -0.23817667365074158, 0.022450009360909462, -0.03990992531180382], "max": [0.08448377996683121, 0.2625093460083008, 0.683355987071991, 3.2414512634277344, 0.07900390774011612, 0.197342649102211, 0.04009474441409111, -0.019239505752921104], "mean": [-0.018705859780311584, 0.07485378533601761, 0.5893135070800781, 3.1253674030303955, -0.26520711183547974, 0.0043908050283789635, 0.032642897218465805, -0.034127164632081985], "std": [0.06972447782754898, 0.13012880086898804, 0.0744183287024498, 0.0669683963060379, 0.24578484892845154, 0.12196411192417145, 0.007201470900326967, 0.0076410179026424885], "count": [244]}, "action": {"min": [-0.6508928537368774, -0.8732143044471741, -0.7098214030265808, -0.05464285612106323, -0.1403571367263794, -0.14571428298950195, 0.0], "max": [0.7660714387893677, 0.8330357074737549, 0.9375, 0.0771428570151329, 0.13500000536441803, 0.2207142859697342, 1.0], "mean": [0.02341555431485176, 0.08166354149580002, -0.018552379682660103, 0.004575526807457209, -0.000944086816161871, -0.00032933035981841385, 0.561475396156311], "std": [0.3430352509021759, 0.41424956917762756, 0.4391219913959503, 0.019710414111614227, 0.05268479883670807, 0.06843084841966629, 0.4962059557437897], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [174], "max": [174], "mean": [174.0], "std": [0.0], "count": [244]}, "index": {"min": [47125], "max": [47368], "mean": [47246.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [244]}}} +{"episode_index": 175, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3419843947466682]], [[0.2753803884468826]], [[0.235242348465265]]], "std": [[[0.135916202752148]], [[0.13696861850782474]], [[0.14697482348473945]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32813011259191177]], [[0.28563839003619024]], [[0.2531602711397059]]], "std": [[[0.16913788839979782]], [[0.1842309064616464]], [[0.19455716362955336]]], "count": [100]}, "observation.state": {"min": [-0.04977140575647354, -0.19289085268974304, 0.44656676054000854, 3.0390536785125732, -0.23672589659690857, -0.3752220869064331, 0.01933593675494194, -0.040589701384305954], "max": [0.12236569076776505, 0.2502542734146118, 0.6788280606269836, 3.1417484283447266, 0.5124260187149048, 0.1532183289527893, 0.04018638655543327, -0.019514385610818863], "mean": [0.05781860277056694, 0.04539114609360695, 0.5838843584060669, 3.108603000640869, 0.20469897985458374, -0.12541736662387848, 0.02985171414911747, -0.029964501038193703], "std": [0.049794793128967285, 0.15575937926769257, 0.07341008633375168, 0.024946564808487892, 0.23517481982707977, 0.12333095818758011, 0.008929600939154625, 0.008995095267891884], "count": [235]}, "action": {"min": [-0.6080357432365417, -0.7178571224212646, -0.824999988079071, -0.05249999836087227, -0.11678571254014969, -0.15000000596046448, 0.0], "max": [0.7178571224212646, 0.8973214030265808, 0.9375, 0.055714286863803864, 0.12428571283817291, 0.11571428924798965, 1.0], "mean": [-0.004536470398306847, 0.08744683116674423, -0.05651216208934784, -0.0007841947372071445, -0.0020653498359024525, -0.008229491300880909, 0.5234042406082153], "std": [0.33667507767677307, 0.43130388855934143, 0.4475325644016266, 0.017834201455116272, 0.04913032799959183, 0.05859546363353729, 0.4994518458843231], "count": [235]}, "timestamp": {"min": [0.0], "max": [11.7], "mean": [5.85], "std": [3.391902121229326], "count": [235]}, "frame_index": {"min": [0], "max": [234], "mean": [117.0], "std": [67.83804242458652], "count": [235]}, "episode_index": {"min": [175], "max": [175], "mean": [175.0], "std": [0.0], "count": [235]}, "index": {"min": [47369], "max": [47603], "mean": [47486.0], "std": [67.83804242458652], "count": [235]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [235]}}} +{"episode_index": 176, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3626285873113894]], [[0.29812238326727175]], [[0.256156961478439]]], "std": [[[0.1718032897895654]], [[0.17263391298373748]], [[0.17436013896285585]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3267450561523438]], [[0.28160534428615197]], [[0.2517340399050245]]], "std": [[[0.16024700805425088]], [[0.1766917589497265]], [[0.18787694653986517]]], "count": [100]}, "observation.state": {"min": [-0.09943318367004395, -0.09926895797252655, 0.4460606873035431, 3.0623667240142822, -0.2097586691379547, -0.24409307539463043, 0.0022661196999251842, -0.040024515241384506], "max": [0.16204138100147247, 0.132431760430336, 0.6817079782485962, 3.2367289066314697, 0.15400844812393188, 0.11897289007902145, 0.03984510898590088, -0.0028115001041442156], "mean": [0.03433358669281006, 0.023687299340963364, 0.5580901503562927, 3.14790678024292, 0.06308868527412415, -0.03694462776184082, 0.01981331780552864, -0.02084789238870144], "std": [0.09433335065841675, 0.06970800459384918, 0.06984319537878036, 0.052412595599889755, 0.10109005123376846, 0.09661905467510223, 0.016075141727924347, 0.016093146055936813], "count": [275]}, "action": {"min": [-0.5330356955528259, -0.5169642567634583, -0.6482142806053162, -0.05999999865889549, -0.09428571164608002, -0.05785714462399483, 0.0], "max": [0.7473214268684387, 0.3991071283817291, 0.6053571701049805, 0.07392857223749161, 0.08250000327825546, 0.04821428656578064, 1.0], "mean": [0.020123396068811417, 0.029220782220363617, -0.09245455265045166, -0.0009506489732302725, -0.003837661352008581, -0.005322078708559275, 0.3636363744735718], "std": [0.3120337128639221, 0.1631809026002884, 0.28181952238082886, 0.02368042804300785, 0.03137063607573509, 0.02146892435848713, 0.4810452461242676], "count": [275]}, "timestamp": {"min": [0.0], "max": [13.7], "mean": [6.85], "std": [3.9692568573978684], "count": [275]}, "frame_index": {"min": [0], "max": [274], "mean": [137.0], "std": [79.38513714795737], "count": [275]}, "episode_index": {"min": [176], "max": [176], "mean": [176.0], "std": [0.0], "count": [275]}, "index": {"min": [47604], "max": [47878], "mean": [47741.0], "std": [79.38513714795737], "count": [275]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [275]}}} +{"episode_index": 177, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6163087989956725]], [[0.5729201426786534]], [[0.5215512007171033]]], "std": [[[0.26125984088602006]], [[0.2448273923073739]], [[0.22435814595672812]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5504508978151808]], [[0.5110539233637792]], [[0.461125124463848]]], "std": [[[0.2994350184716321]], [[0.2784468345239961]], [[0.2642347426512319]]], "count": [100]}, "observation.state": {"min": [-0.2055073231458664, -0.06939065456390381, 0.9177296161651611, 2.088165521621704, -2.209676504135132, -1.2778891324996948, 0.0023651174269616604, -0.03998611122369766], "max": [0.06043355166912079, 0.19634246826171875, 1.1809529066085815, 3.1406331062316895, -0.0004904856905341148, 0.5421250462532043, 0.040499623864889145, -0.0014374746242538095], "mean": [-0.008394023403525352, 0.03380688279867172, 1.0194936990737915, 2.546563148498535, -1.7323404550552368, -5.439461165224202e-05, 0.025642680004239082, -0.024588409811258316], "std": [0.0545077919960022, 0.07909328490495682, 0.0835365355014801, 0.3101111650466919, 0.6175665259361267, 0.4635330140590668, 0.017306851223111153, 0.01757761463522911], "count": [244]}, "action": {"min": [-0.32678571343421936, -0.7098214030265808, -0.6910714507102966, -0.0803571417927742, -0.1639285683631897, -0.29892855882644653, 0.0], "max": [0.7741071581840515, 0.7633928656578064, 0.9375, 0.22285714745521545, 0.18642857670783997, 0.19607143104076385, 1.0], "mean": [0.06801817566156387, 0.09746047109365463, -0.11008493602275848, 0.027185305953025818, 0.012435594573616982, -0.05127047747373581, 0.6106557250022888], "std": [0.26711323857307434, 0.3390868306159973, 0.36518117785453796, 0.06890949606895447, 0.0683031976222992, 0.09914927929639816, 0.4876015782356262], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [177], "max": [177], "mean": [177.0], "std": [0.0], "count": [244]}, "index": {"min": [47879], "max": [48122], "mean": [48000.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [244]}}} +{"episode_index": 178, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.517400308048024]], [[0.47884667071174175]], [[0.4260071728276271]]], "std": [[[0.31071630554559504]], [[0.2806927816415046]], [[0.24949842406811978]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5162908145680147]], [[0.484255407595167]], [[0.43755033365885415]]], "std": [[[0.3100190840899728]], [[0.28353093102123866]], [[0.2624416357712471]]], "count": [100]}, "observation.state": {"min": [-0.32948729395866394, -0.07401711493730545, 0.987508237361908, 2.6773407459259033, -2.5278990268707275, -1.0725635290145874, 0.009772203862667084, -0.040008991956710815], "max": [0.020357977598905563, 0.2772051990032196, 1.1748130321502686, 3.3986594676971436, -0.0005512259667739272, -0.07537152618169785, 0.0400112122297287, -0.008905652910470963], "mean": [-0.09000576287508011, 0.09520552307367325, 1.0800068378448486, 2.9508883953094482, -1.7412781715393066, -0.735771894454956, 0.03178202360868454, -0.03149799257516861], "std": [0.09875530004501343, 0.12288469821214676, 0.06087541580200195, 0.1966969221830368, 0.8329637050628662, 0.2468310296535492, 0.012798674404621124, 0.0131065146997571], "count": [260]}, "action": {"min": [-0.7205356955528259, -0.6455357074737549, -0.7044642567634583, -0.1542857140302658, -0.12857143580913544, -0.31928572058677673, 0.0], "max": [0.9375, 0.6883928775787354, 0.5651785731315613, 0.1875, 0.207857146859169, 0.23250000178813934, 1.0], "mean": [0.042012348771095276, 0.09060785174369812, -0.0388701967895031, 0.013083799742162228, 0.028285719454288483, -0.00907004252076149, 0.7384615540504456], "std": [0.36817634105682373, 0.3107098937034607, 0.25455817580223083, 0.059526048600673676, 0.06985702365636826, 0.12763196229934692, 0.43947216868400574], "count": [260]}, "timestamp": {"min": [0.0], "max": [12.95], "mean": [6.475], "std": [3.7527489924054342], "count": [260]}, "frame_index": {"min": [0], "max": [259], "mean": [129.5], "std": [75.05497984810869], "count": [260]}, "episode_index": {"min": [178], "max": [178], "mean": [178.0], "std": [0.0], "count": [260]}, "index": {"min": [48123], "max": [48382], "mean": [48252.5], "std": [75.05497984810869], "count": [260]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [260]}}} +{"episode_index": 179, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5743464552935432]], [[0.5272337275486366]], [[0.47856138401405485]]], "std": [[[0.290696134519068]], [[0.2629498538858388]], [[0.23270388074152115]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.568244166355507]], [[0.5300336321662453]], [[0.4798094530292586]]], "std": [[[0.29464252751505193]], [[0.27108626640257655]], [[0.2529907987151497]]], "count": [100]}, "observation.state": {"min": [-0.19638244807720184, -0.31016337871551514, 1.0072383880615234, 2.0102035999298096, -2.757488489151001, -0.6670145392417908, 0.0015969212399795651, -0.04022492840886116], "max": [0.05879152566194534, 0.232814222574234, 1.1913195848464966, 3.141047239303589, 0.00045783614041283727, -0.09498085826635361, 0.040002744644880295, -0.010628036223351955], "mean": [-0.02514239028096199, -0.029891572892665863, 1.0971585512161255, 2.4543352127075195, -2.2289600372314453, -0.5159856677055359, 0.03229343518614769, -0.034074172377586365], "std": [0.05552029609680176, 0.15316565334796906, 0.05901169404387474, 0.3712112009525299, 0.7126572132110596, 0.09038529545068741, 0.011112198233604431, 0.010144802741706371], "count": [410]}, "action": {"min": [-0.3348214328289032, -0.8464285731315613, -0.4419642984867096, -0.06964285671710968, -0.06428571790456772, -0.3407142758369446, 0.0], "max": [0.6187499761581421, 0.7392857074737549, 0.6803571581840515, 0.04928571358323097, 0.14678572118282318, 0.1339285671710968, 1.0], "mean": [0.02434234321117401, -0.0224215816706419, -0.04530707001686096, 0.0003632401640061289, 0.0011446003336459398, -0.02165854349732399, 0.5951219797134399], "std": [0.18387895822525024, 0.37306681275367737, 0.24550552666187286, 0.01862664520740509, 0.037063516676425934, 0.09979938715696335, 0.49086853861808777], "count": [410]}, "timestamp": {"min": [0.0], "max": [20.45], "mean": [10.225], "std": [5.917822657025132], "count": [410]}, "frame_index": {"min": [0], "max": [409], "mean": [204.5], "std": [118.35645314050265], "count": [410]}, "episode_index": {"min": [179], "max": [179], "mean": [179.0], "std": [0.0], "count": [410]}, "index": {"min": [48383], "max": [48792], "mean": [48587.5], "std": [118.35645314050265], "count": [410]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [410]}}} +{"episode_index": 180, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.9725490196078431]], [[0.984313725490196]]], "mean": [[[0.31034036673751536]], [[0.2437281296673943]], [[0.15975179395488665]]], "std": [[[0.21347784718949614]], [[0.16128934847947482]], [[0.11048928635101353]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.9803921568627451]], [[0.9764705882352941]]], "mean": [[[0.3544614377489277]], [[0.2974784922880285]], [[0.22026942294251683]]], "std": [[[0.1399284733415431]], [[0.13046444677016653]], [[0.13973075138635085]]], "count": [100]}, "observation.state": {"min": [-0.4741465449333191, -0.1493377387523651, 0.9862945675849915, 2.031913995742798, -2.3191378116607666, -0.2028072625398636, 0.009112351574003696, -0.039842214435338974], "max": [-0.18370844423770905, 0.13758304715156555, 1.2768528461456299, 3.145960807800293, 0.01068995613604784, 0.09086086601018906, 0.03984864801168442, -0.013105995021760464], "mean": [-0.31558993458747864, -0.02899668551981449, 1.1662966012954712, 2.7083139419555664, -1.2852647304534912, -0.07025270909070969, 0.021681511774659157, -0.022585229948163033], "std": [0.08887950330972672, 0.10915408283472061, 0.08147008717060089, 0.43669745326042175, 0.8640968799591064, 0.066278375685215, 0.010388773865997791, 0.010030023753643036], "count": [199]}, "action": {"min": [-0.8410714268684387, -0.6696428656578064, -0.9375, -0.04500000178813934, -0.09142857044935226, -0.21785713732242584, 0.0], "max": [0.5517857074737549, 0.5303571224212646, 0.9375, 0.027142856270074844, 0.07357142865657806, 0.010714286006987095, 1.0], "mean": [-0.11610735952854156, -0.04662599414587021, -0.0920405387878418, -0.0025125625543296337, 0.001844938495196402, -0.06844580173492432, 0.23115578293800354], "std": [0.27706125378608704, 0.27774831652641296, 0.44937270879745483, 0.015526819974184036, 0.04175486043095589, 0.0643874779343605, 0.42157140374183655], "count": [199]}, "timestamp": {"min": [0.0], "max": [9.9], "mean": [4.95], "std": [2.8722813232690143], "count": [199]}, "frame_index": {"min": [0], "max": [198], "mean": [99.0], "std": [57.445626465380286], "count": [199]}, "episode_index": {"min": [180], "max": [180], "mean": [180.0], "std": [0.0], "count": [199]}, "index": {"min": [48793], "max": [48991], "mean": [48892.0], "std": [57.445626465380286], "count": [199]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [199]}}} +{"episode_index": 181, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3240678537406173]], [[0.26647813445446533]], [[0.23055297612208947]]], "std": [[[0.14608039210932594]], [[0.14470978694024378]], [[0.15187591240774653]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32125246773514093]], [[0.27419474044500614]], [[0.2397853178136489]]], "std": [[[0.16124770848762834]], [[0.1759967455415366]], [[0.18556546025638931]]], "count": [100]}, "observation.state": {"min": [-0.11609485745429993, -0.16133296489715576, 0.4804801642894745, 3.0806756019592285, -0.6495407819747925, -0.1413523554801941, 0.025003179907798767, -0.04045674204826355], "max": [0.010601815767586231, 0.29914766550064087, 0.719460666179657, 3.2122087478637695, 0.10207971930503845, 0.15428654849529266, 0.0404609814286232, -0.029550781473517418], "mean": [-0.04605402797460556, 0.0785885825753212, 0.6144872903823853, 3.1350531578063965, -0.24977628886699677, -0.017879948019981384, 0.03420697897672653, -0.0366625115275383], "std": [0.0387493297457695, 0.15356481075286865, 0.07101394236087799, 0.03563893958926201, 0.23239704966545105, 0.07270529866218567, 0.0058181132189929485, 0.003990878816694021], "count": [261]}, "action": {"min": [-0.375, -0.8758928775787354, -0.6696428656578064, -0.08142857253551483, -0.08464285731315613, -0.07392857223749161, 0.0], "max": [0.5839285850524902, 0.8276785612106323, 0.9375, 0.061071429401636124, 0.07392857223749161, 0.035357143729925156, 1.0], "mean": [0.03225574642419815, 0.0921490490436554, -0.011576359160244465, 0.0036247947718948126, 0.004125614650547504, -0.012943350709974766, 0.5593869686126709], "std": [0.20670144259929657, 0.4245951473712921, 0.4196559190750122, 0.02397732250392437, 0.030822131782770157, 0.02266482450067997, 0.4964606761932373], "count": [261]}, "timestamp": {"min": [0.0], "max": [13.0], "mean": [6.5], "std": [3.7671828554858693], "count": [261]}, "frame_index": {"min": [0], "max": [260], "mean": [130.0], "std": [75.34365710971738], "count": [261]}, "episode_index": {"min": [181], "max": [181], "mean": [181.0], "std": [0.0], "count": [261]}, "index": {"min": [48992], "max": [49252], "mean": [49122.0], "std": [75.34365710971738], "count": [261]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [261]}}} +{"episode_index": 182, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5806618167652804]], [[0.5453057957069547]], [[0.5091013931573606]]], "std": [[[0.2520138336563819]], [[0.22983396562507402]], [[0.20749610896342255]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5429553970636106]], [[0.5077714436848959]], [[0.45890062878178617]]], "std": [[[0.30097442103855765]], [[0.2755726633924586]], [[0.2566430751999254]]], "count": [100]}, "observation.state": {"min": [-0.20745132863521576, -0.08925321698188782, 0.9273480176925659, 1.6849335432052612, -0.08294723927974701, -0.2164641171693802, 0.004856186918914318, -0.040015965700149536], "max": [0.062550850212574, 0.20911937952041626, 1.1702371835708618, 3.1536316871643066, 2.786104202270508, 0.7702816724777222, 0.0399777814745903, -0.002319402527064085], "mean": [-0.06528473645448685, 0.07722692936658859, 1.05410635471344, 2.489061117172241, 1.5107386112213135, 0.2996390759944916, 0.028740214183926582, -0.028335386887192726], "std": [0.10672397911548615, 0.11014712601900101, 0.07835575193166733, 0.482073575258255, 0.9973838925361633, 0.3349694311618805, 0.012705913744866848, 0.013122329488396645], "count": [285]}, "action": {"min": [-0.2839285731315613, -0.6696428656578064, -0.6321428418159485, -0.09857142716646194, -0.19285714626312256, -0.04928571358323097, 0.0], "max": [0.6133928298950195, 0.6830357313156128, 0.9160714149475098, 0.0835714265704155, 0.13178572058677673, 0.375, 1.0], "mean": [0.04843984171748161, 0.04342103749513626, -0.07159771770238876, 0.010078944265842438, -0.006206766702234745, 0.06642857193946838, 0.5929824709892273], "std": [0.19951283931732178, 0.30205169320106506, 0.33047667145729065, 0.025549491867423058, 0.06318525969982147, 0.09647969901561737, 0.4912782907485962], "count": [285]}, "timestamp": {"min": [0.0], "max": [14.2], "mean": [7.1], "std": [4.113595345517916], "count": [285]}, "frame_index": {"min": [0], "max": [284], "mean": [142.0], "std": [82.27190691035833], "count": [285]}, "episode_index": {"min": [182], "max": [182], "mean": [182.0], "std": [0.0], "count": [285]}, "index": {"min": [49253], "max": [49537], "mean": [49395.0], "std": [82.27190691035833], "count": [285]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [285]}}} +{"episode_index": 183, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3344230322744332]], [[0.27207538559857536]], [[0.23425320314893536]]], "std": [[[0.15839119167383586]], [[0.15837044076547574]], [[0.1667234107092449]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32450919416838997]], [[0.27951331224628523]], [[0.24599077172372855]]], "std": [[[0.16725464405461643]], [[0.1818730915166082]], [[0.19146760321944709]]], "count": [100]}, "observation.state": {"min": [-0.06406120955944061, -0.19709251821041107, 0.44860702753067017, 2.998429775238037, -0.3211440443992615, -0.4804103374481201, 0.0009286547428928316, -0.03993028402328491], "max": [0.1276969164609909, 0.2856447100639343, 0.6749838590621948, 3.28913950920105, 0.3134588897228241, 0.09388503432273865, 0.03989120572805405, -0.0006913842516951263], "mean": [0.0347151905298233, 0.0597522109746933, 0.5791081190109253, 3.1422617435455322, -0.06702516973018646, -0.23353102803230286, 0.02797137387096882, -0.027564451098442078], "std": [0.05093372240662575, 0.15140804648399353, 0.07589168846607208, 0.0721377357840538, 0.2006712257862091, 0.14982891082763672, 0.01090736873447895, 0.01118776760995388], "count": [303]}, "action": {"min": [-0.5383928418159485, -0.9321428537368774, -0.7607142925262451, -0.08250000327825546, -0.16285714507102966, -0.0835714265704155, 0.0], "max": [0.5892857313156128, 0.8892857432365417, 0.9375, 0.09642857313156128, 0.1007142886519432, 0.07607142627239227, 1.0], "mean": [0.02512378990650177, 0.07669731229543686, -0.01846708543598652, 0.0010820359457284212, 0.0077581326477229595, 0.003256717463955283, 0.4884488582611084], "std": [0.2489052414894104, 0.44591379165649414, 0.482400119304657, 0.037756022065877914, 0.04002333804965019, 0.030469264835119247, 0.4998665153980255], "count": [303]}, "timestamp": {"min": [0.0], "max": [15.1], "mean": [7.549999999999999], "std": [4.373404470966145], "count": [303]}, "frame_index": {"min": [0], "max": [302], "mean": [151.0], "std": [87.46808941932291], "count": [303]}, "episode_index": {"min": [183], "max": [183], "mean": [183.0], "std": [0.0], "count": [303]}, "index": {"min": [49538], "max": [49840], "mean": [49689.0], "std": [87.46808941932291], "count": [303]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [303]}}} +{"episode_index": 184, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5898667877795649]], [[0.5530626831054688]], [[0.5143964293236826]]], "std": [[[0.2530926177664083]], [[0.23181072396207428]], [[0.21007035276077482]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5423461483226103]], [[0.5075577141256893]], [[0.45956286441578587]]], "std": [[[0.2997329999054685]], [[0.2745777019711537]], [[0.25578414070862127]]], "count": [100]}, "observation.state": {"min": [-0.2355896532535553, -0.09840863943099976, 0.9243510365486145, 1.829643964767456, -0.25448668003082275, -0.09079838544130325, 0.004346562083810568, -0.039994966238737106], "max": [0.08317612111568451, 0.20609796047210693, 1.1739739179611206, 3.2267541885375977, 3.0438170433044434, 0.7186983227729797, 0.04059368744492531, -0.004226811230182648], "mean": [-0.07975342869758606, 0.07102766633033752, 1.048764944076538, 2.6853156089782715, 1.4067277908325195, 0.25539323687553406, 0.03071390464901924, -0.02707573026418686], "std": [0.12611468136310577, 0.110664501786232, 0.08047434687614441, 0.5055971741676331, 1.2406578063964844, 0.2672888934612274, 0.013056924566626549, 0.014553437940776348], "count": [239]}, "action": {"min": [-0.47410714626312256, -0.731249988079071, -0.9375, -0.04821428656578064, -0.15321429073810577, -0.05249999836087227, 0.0], "max": [0.8142856955528259, 0.7767857313156128, 0.9375, 0.09321428835391998, 0.09857142716646194, 0.375, 1.0], "mean": [0.05687761679291725, 0.0745181068778038, -0.09136282652616501, 0.007773463614284992, -0.010889122262597084, 0.07892264425754547, 0.6025104522705078], "std": [0.26694372296333313, 0.35234490036964417, 0.41213470697402954, 0.031100653111934662, 0.0455271415412426, 0.11719457060098648, 0.4893782436847687], "count": [239]}, "timestamp": {"min": [0.0], "max": [11.9], "mean": [5.95], "std": [3.449637662132068], "count": [239]}, "frame_index": {"min": [0], "max": [238], "mean": [119.0], "std": [68.99275324264136], "count": [239]}, "episode_index": {"min": [184], "max": [184], "mean": [184.0], "std": [0.0], "count": [239]}, "index": {"min": [49841], "max": [50079], "mean": [49960.0], "std": [68.99275324264136], "count": [239]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [239]}}} +{"episode_index": 185, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5770962464575674]], [[0.5425323474360447]], [[0.5068600212545956]]], "std": [[[0.2626326439171955]], [[0.24184240502630516]], [[0.22081164668155515]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5402398711559819]], [[0.505156463024663]], [[0.4564116486194087]]], "std": [[[0.30007703168428673]], [[0.2743487532529858]], [[0.25498425833246463]]], "count": [100]}, "observation.state": {"min": [-0.23431381583213806, -0.08410956710577011, 0.9274525046348572, 1.6630399227142334, -0.060964684933423996, -0.12570875883102417, 0.007255393546074629, -0.04000454023480415], "max": [0.06340089440345764, 0.20729860663414001, 1.1608142852783203, 3.166884660720825, 3.1016621589660645, 0.5724018812179565, 0.040638215839862823, -0.0019110158318653703], "mean": [-0.0873248502612114, 0.07295186072587967, 1.0438978672027588, 2.5136749744415283, 1.5918024778366089, 0.22040899097919464, 0.028779655694961548, -0.026561163365840912], "std": [0.12193678319454193, 0.105731301009655, 0.07837969809770584, 0.542256772518158, 1.178678035736084, 0.2686019241809845, 0.013514132238924503, 0.01496052648872137], "count": [269]}, "action": {"min": [-0.2705357074737549, -0.6080357432365417, -0.75, -0.08250000327825546, -0.09857142716646194, -0.031071428209543228, 0.0], "max": [0.6696428656578064, 0.6776785850524902, 0.8035714030265808, 0.08250000327825546, 0.07500000298023224, 0.3449999988079071, 1.0], "mean": [0.052784789353609085, 0.0657295435667038, -0.0894184559583664, 0.008336431346833706, -0.002851832425221801, 0.0728372111916542, 0.5836431384086609], "std": [0.22079457342624664, 0.2729254364967346, 0.35410383343696594, 0.03438764065504074, 0.02940216287970543, 0.09584207832813263, 0.49295443296432495], "count": [269]}, "timestamp": {"min": [0.0], "max": [13.4], "mean": [6.700000000000001], "std": [3.8826537316634355], "count": [269]}, "frame_index": {"min": [0], "max": [268], "mean": [134.0], "std": [77.6530746332687], "count": [269]}, "episode_index": {"min": [185], "max": [185], "mean": [185.0], "std": [0.0], "count": [269]}, "index": {"min": [50080], "max": [50348], "mean": [50214.0], "std": [77.6530746332687], "count": [269]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [269]}}} +{"episode_index": 186, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.4870680338541667]], [[0.45323359889610143]], [[0.4067688006232767]]], "std": [[[0.30289215232688027]], [[0.27275813399478727]], [[0.240853083559324]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5150320255055147]], [[0.4835682073854932]], [[0.43765199010512407]]], "std": [[[0.3099375081810331]], [[0.2837970184661851]], [[0.26319615812112074]]], "count": [100]}, "observation.state": {"min": [-0.25450024008750916, -0.09643661975860596, 0.9632115960121155, 1.9017813205718994, -3.1773829460144043, -1.0458869934082031, 0.009092805907130241, -0.04056975245475769], "max": [0.02930421382188797, 0.3169381320476532, 1.1627033948898315, 3.3266046047210693, 2.4412291049957275, -0.01183940190821886, 0.040012627840042114, -0.007641758304089308], "mean": [-0.07989281415939331, 0.10149959474802017, 1.0641435384750366, 2.7493696212768555, -1.5468541383743286, -0.6716342568397522, 0.03216374292969704, -0.030211251229047775], "std": [0.0813671350479126, 0.13482566177845, 0.055812638252973557, 0.349904328584671, 1.568656086921692, 0.24194909632205963, 0.01278465986251831, 0.012682321481406689], "count": [343]}, "action": {"min": [-0.8357142806053162, -0.6883928775787354, -0.637499988079071, -0.15964286029338837, -0.1339285671710968, -0.3117857277393341, 0.0], "max": [0.5705357193946838, 0.8678571581840515, 0.6883928775787354, 0.19607143104076385, 0.19928571581840515, 0.375, 1.0], "mean": [-0.03447781875729561, 0.1487036943435669, -0.0859251469373703, 0.0201728418469429, 0.00839026365429163, 0.0552394799888134, 0.7492711544036865], "std": [0.2461235076189041, 0.3160228729248047, 0.2731245160102844, 0.056603141129016876, 0.07405354082584381, 0.19334138929843903, 0.43343353271484375], "count": [343]}, "timestamp": {"min": [0.0], "max": [17.1], "mean": [8.55], "std": [4.950757517794624], "count": [343]}, "frame_index": {"min": [0], "max": [342], "mean": [171.0], "std": [99.0151503558925], "count": [343]}, "episode_index": {"min": [186], "max": [186], "mean": [186.0], "std": [0.0], "count": [343]}, "index": {"min": [50349], "max": [50691], "mean": [50520.0], "std": [99.0151503558925], "count": [343]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [343]}}} +{"episode_index": 187, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5821588182636336]], [[0.5348234988941866]], [[0.4858627953622855]]], "std": [[[0.28612455209839277]], [[0.2588827394242702]], [[0.22927161273375365]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5679141163545497]], [[0.5295263600068933]], [[0.4792288231943168]]], "std": [[[0.2947144227249124]], [[0.2712106101027296]], [[0.2533675353738849]]], "count": [100]}, "observation.state": {"min": [-0.20132245123386383, -0.3010360896587372, 1.0007447004318237, 2.1150565147399902, -2.807840347290039, -0.8195297122001648, 0.0018289232393726707, -0.040339451283216476], "max": [0.023844389244914055, 0.20934021472930908, 1.1775918006896973, 3.1427505016326904, -0.0006662819650955498, -0.028885500505566597, 0.040010299533605576, -0.006698972545564175], "mean": [-0.028668077662587166, -0.038092438131570816, 1.0890029668807983, 2.5676283836364746, -2.2297401428222656, -0.29559025168418884, 0.026283027604222298, -0.027593618258833885], "std": [0.0471627302467823, 0.14807258546352386, 0.05554017797112465, 0.2411055862903595, 0.6694828271865845, 0.17855164408683777, 0.01524995919317007, 0.014276919886469841], "count": [362]}, "action": {"min": [-0.4017857015132904, -0.7767857313156128, -0.581250011920929, -0.06964285671710968, -0.14142857491970062, -0.30000001192092896, 0.0], "max": [0.5839285850524902, 0.7526785731315613, 0.5276785492897034, 0.11464285850524902, 0.20250000059604645, 0.10928571224212646, 1.0], "mean": [0.031254950910806656, -0.0444406233727932, -0.05192135274410248, 0.010652124881744385, 0.004119969438761473, -0.02849942445755005, 0.5856353640556335], "std": [0.20183005928993225, 0.3884718418121338, 0.2587655484676361, 0.030869828537106514, 0.04445446655154228, 0.10033170133829117, 0.4926127791404724], "count": [362]}, "timestamp": {"min": [0.0], "max": [18.05], "mean": [9.024999999999999], "std": [5.2250000000000005], "count": [362]}, "frame_index": {"min": [0], "max": [361], "mean": [180.5], "std": [104.5], "count": [362]}, "episode_index": {"min": [187], "max": [187], "mean": [187.0], "std": [0.0], "count": [362]}, "index": {"min": [50692], "max": [51053], "mean": [50872.5], "std": [104.5], "count": [362]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [362]}}} +{"episode_index": 188, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31321123250325517]], [[0.2543861137838925]], [[0.21993067662856158]]], "std": [[[0.13412870538035765]], [[0.12692347830628176]], [[0.13269128290244364]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31851944627948836]], [[0.2741208801269531]], [[0.2415261739095052]]], "std": [[[0.1574822931140153]], [[0.17331205301646946]], [[0.1818339405028194]]], "count": [100]}, "observation.state": {"min": [-0.1490064263343811, -0.10855073481798172, 0.45135053992271423, 2.9978482723236084, -0.8683342337608337, -0.47157081961631775, 0.019081806764006615, -0.04032459855079651], "max": [0.07615360617637634, 0.2492438405752182, 0.7201980948448181, 3.296823024749756, 0.055446963757276535, 0.0691462829709053, 0.039917901158332825, -0.02212350443005562], "mean": [-0.008938002400100231, 0.07176273316144943, 0.6064760684967041, 3.113731861114502, -0.41317012906074524, -0.18578532338142395, 0.032563481479883194, -0.0347120575606823], "std": [0.06137647479772568, 0.11737226694822311, 0.07589736580848694, 0.08291488140821457, 0.33797380328178406, 0.14560000598430634, 0.007905146107077599, 0.006598415784537792], "count": [270]}, "action": {"min": [-0.4821428656578064, -0.918749988079071, -0.543749988079071, -0.061071429401636124, -0.15857142210006714, -0.1510714292526245, 0.0], "max": [0.731249988079071, 0.8785714507102966, 0.9375, 0.08571428805589676, 0.11464285850524902, 0.261428564786911, 1.0], "mean": [0.030575385317206383, 0.05540674552321434, -0.015376979485154152, 0.008781746961176395, 0.005408729892224073, -0.0027738099452108145, 0.5740740895271301], "std": [0.2734954059123993, 0.3858465850353241, 0.40280741453170776, 0.022228961810469627, 0.05464933440089226, 0.07175744324922562, 0.4944819211959839], "count": [270]}, "timestamp": {"min": [0.0], "max": [13.45], "mean": [6.725], "std": [3.8970875877591804], "count": [270]}, "frame_index": {"min": [0], "max": [269], "mean": [134.5], "std": [77.9417517551836], "count": [270]}, "episode_index": {"min": [188], "max": [188], "mean": [188.0], "std": [0.0], "count": [270]}, "index": {"min": [51054], "max": [51323], "mean": [51188.5], "std": [77.9417517551836], "count": [270]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [270]}}} +{"episode_index": 189, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6089174469592524]], [[0.5635675922468597]], [[0.5108728972790288]]], "std": [[[0.27608785133457864]], [[0.2577014283779886]], [[0.23535226556174976]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5507913178088618]], [[0.5107726990942861]], [[0.46041997154086245]]], "std": [[[0.3000803220788487]], [[0.2788098755878743]], [[0.2641670182345999]]], "count": [100]}, "observation.state": {"min": [-0.2084869146347046, -0.06746325641870499, 0.9229173064231873, 2.469895601272583, -2.2448320388793945, -0.7705742716789246, 0.002042977372184396, -0.03990660235285759], "max": [0.053110502660274506, 0.20851892232894897, 1.1797531843185425, 3.140831708908081, 0.0023765454534441233, 0.13377432525157928, 0.040308352559804916, -0.0016169011360034347], "mean": [-0.015433256514370441, 0.041891079396009445, 1.0240992307662964, 2.8066577911376953, -1.6629754304885864, -0.20196719467639923, 0.02743595652282238, -0.026911098510026932], "std": [0.06236299127340317, 0.09437107294797897, 0.08630198985338211, 0.2010340839624405, 0.6219940185546875, 0.28753361105918884, 0.017020834609866142, 0.017082130536437035], "count": [252]}, "action": {"min": [-0.3241071403026581, -0.6857143044471741, -0.4955357015132904, -0.05464285612106323, -0.0803571417927742, -0.2346428632736206, 0.0], "max": [0.6321428418159485, 0.7982142567634583, 0.9375, 0.1607142835855484, 0.09214285761117935, 0.06857142597436905, 1.0], "mean": [0.051806990057229996, 0.16245749592781067, -0.0902317464351654, 0.017138611525297165, -0.002053570467978716, -0.04324405640363693, 0.6746031641960144], "std": [0.21661238372325897, 0.3664717972278595, 0.33364012837409973, 0.03849499300122261, 0.03475413843989372, 0.07262842357158661, 0.4685235023498535], "count": [252]}, "timestamp": {"min": [0.0], "max": [12.55], "mean": [6.2749999999999995], "std": [3.6372780573756893], "count": [252]}, "frame_index": {"min": [0], "max": [251], "mean": [125.5], "std": [72.74556114751378], "count": [252]}, "episode_index": {"min": [189], "max": [189], "mean": [189.0], "std": [0.0], "count": [252]}, "index": {"min": [51324], "max": [51575], "mean": [51449.5], "std": [72.74556114751378], "count": [252]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [252]}}} +{"episode_index": 190, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3599879102519914]], [[0.29527236399931067]], [[0.24956565946691175]]], "std": [[[0.14164768000389313]], [[0.14688489544517108]], [[0.15398466812241474]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31965490543141084]], [[0.27131110875746783]], [[0.23815249454273896]]], "std": [[[0.15545034538224628]], [[0.17020942430317787]], [[0.17933548048220746]]], "count": [100]}, "observation.state": {"min": [-0.09910422563552856, -0.2574170231819153, 0.5096285343170166, 3.000114679336548, -0.426125705242157, -0.09024180471897125, 0.0011637317948043346, -0.039857517927885056], "max": [0.024829557165503502, 0.35757720470428467, 0.6865713000297546, 3.1730191707611084, 0.5495364665985107, 0.4066077470779419, 0.04000404477119446, -0.0032589875627309084], "mean": [-0.03075801022350788, 0.0007253350340761244, 0.5790032744407654, 3.1094672679901123, -0.11551725119352341, 0.16768960654735565, 0.02372347190976143, -0.023931020870804787], "std": [0.027821626514196396, 0.20785409212112427, 0.045905351638793945, 0.04653746634721756, 0.3083953261375427, 0.16040630638599396, 0.016795553267002106, 0.0162835530936718], "count": [233]}, "action": {"min": [-0.3348214328289032, -0.6133928298950195, -0.6187499761581421, -0.055714286863803864, -0.08571428805589676, -0.09857142716646194, 0.0], "max": [0.5223214030265808, 0.8062499761581421, 0.6508928537368774, 0.10607142746448517, 0.08892857283353806, 0.12535713613033295, 1.0], "mean": [0.021922895684838295, 0.11314374953508377, -0.046213969588279724, 0.0010208463063463569, -0.0024417543318122625, -0.009192213416099548, 0.557939887046814], "std": [0.17432670295238495, 0.38074538111686707, 0.3186011016368866, 0.02676064521074295, 0.03713348135352135, 0.05145375430583954, 0.49663156270980835], "count": [233]}, "timestamp": {"min": [0.0], "max": [11.6], "mean": [5.8], "std": [3.363034344160048], "count": [233]}, "frame_index": {"min": [0], "max": [232], "mean": [116.0], "std": [67.26068688320095], "count": [233]}, "episode_index": {"min": [190], "max": [190], "mean": [190.0], "std": [0.0], "count": [233]}, "index": {"min": [51576], "max": [51808], "mean": [51692.0], "std": [67.26068688320095], "count": [233]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [233]}}} +{"episode_index": 191, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.984313725490196]], [[0.9882352941176471]]], "mean": [[[0.34703666238223807]], [[0.2673899560068168]], [[0.16674154603247549]]], "std": [[[0.21376661691144477]], [[0.15770139889386794]], [[0.09722810112506075]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9764705882352941]], [[0.9764705882352941]], [[0.9764705882352941]]], "mean": [[[0.35488988001206345]], [[0.29875920493929997]], [[0.22285684563131894]]], "std": [[[0.14112436796491218]], [[0.13213930182173994]], [[0.1419404096413334]]], "count": [100]}, "observation.state": {"min": [-0.45937100052833557, -0.16363681852817535, 0.9879487156867981, 2.367748975753784, -2.157088041305542, -0.3141756057739258, 0.012247461825609207, -0.03988918289542198], "max": [-0.17920345067977905, 0.1471579223871231, 1.3332009315490723, 3.147725820541382, -0.0023846121039241552, -0.08798296749591827, 0.039883244782686234, -0.01475667767226696], "mean": [-0.23882843554019928, -0.014134321361780167, 1.1707011461257935, 2.911907434463501, -0.9814659357070923, -0.1623498797416687, 0.02319437451660633, -0.023897524923086166], "std": [0.07091464847326279, 0.12428531050682068, 0.09684894979000092, 0.2530410885810852, 0.7022722363471985, 0.07761304080486298, 0.011916209943592548, 0.011424885131418705], "count": [165]}, "action": {"min": [-0.6696428656578064, -0.6616071462631226, -0.6107142567634583, -0.034285712987184525, -0.07285714149475098, -0.18357142806053162, 0.0], "max": [0.3642857074737549, 0.5142857432365417, 0.9375, 0.020714284852147102, 0.07785714417695999, -0.0, 1.0], "mean": [-0.09993505477905273, -0.0790584534406662, -0.041818179190158844, -0.0011471860343590379, 0.002545455005019903, -0.07470563799142838, 0.32121211290359497], "std": [0.2906496822834015, 0.28550103306770325, 0.4433465600013733, 0.0060433875769376755, 0.029368679970502853, 0.052122361958026886, 0.46694216132164], "count": [165]}, "timestamp": {"min": [0.0], "max": [8.2], "mean": [4.1], "std": [2.3815261213488017], "count": [165]}, "frame_index": {"min": [0], "max": [164], "mean": [82.0], "std": [47.63052242697603], "count": [165]}, "episode_index": {"min": [191], "max": [191], "mean": [191.0], "std": [0.0], "count": [165]}, "index": {"min": [51809], "max": [51973], "mean": [51891.0], "std": [47.63052242697603], "count": [165]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [165]}}} +{"episode_index": 192, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6085202056286382]], [[0.5606037980621936]], [[0.5063665268841911]]], "std": [[[0.26875435072754716]], [[0.2511320019999998]], [[0.22894437822584024]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5513120841232001]], [[0.5111333235198375]], [[0.4607444829005821]]], "std": [[[0.29857267797209447]], [[0.27763657056536883]], [[0.2631994316447028]]], "count": [100]}, "observation.state": {"min": [-0.21319636702537537, -0.06590799242258072, 0.9535041451454163, 2.232363224029541, -2.2095797061920166, -0.9545379281044006, 0.001962949289008975, -0.04033467546105385], "max": [0.05312478542327881, 0.20485243201255798, 1.1697887182235718, 3.1415903568267822, -0.00044355468708090484, 0.44360288977622986, 0.04107053205370903, -0.0010428957175463438], "mean": [-0.017015542834997177, 0.02222898229956627, 1.0501033067703247, 2.6468801498413086, -1.693872332572937, -0.03882695361971855, 0.027102522552013397, -0.026373187080025673], "std": [0.07060360163450241, 0.08435001224279404, 0.07651873677968979, 0.2410348802804947, 0.5843021869659424, 0.447853147983551, 0.01691708341240883, 0.017489945515990257], "count": [230]}, "action": {"min": [-0.3375000059604645, -0.6535714268684387, -0.6107142567634583, -0.04821428656578064, -0.1939285695552826, -0.334285706281662, 0.0], "max": [0.5839285850524902, 0.75, 0.7178571224212646, 0.18535713851451874, 0.17142857611179352, 0.08571428805589676, 1.0], "mean": [0.07612963765859604, 0.10725931078195572, -0.09054738283157349, 0.021223610267043114, 0.0026086957659572363, -0.048130400478839874, 0.656521737575531], "std": [0.20310646295547485, 0.33159971237182617, 0.3464626371860504, 0.0427280031144619, 0.07276976853609085, 0.10284338891506195, 0.4748694896697998], "count": [230]}, "timestamp": {"min": [0.0], "max": [11.45], "mean": [5.725], "std": [3.319732669960038], "count": [230]}, "frame_index": {"min": [0], "max": [229], "mean": [114.5], "std": [66.39465339920075], "count": [230]}, "episode_index": {"min": [192], "max": [192], "mean": [192.0], "std": [0.0], "count": [230]}, "index": {"min": [51974], "max": [52203], "mean": [52088.5], "std": [66.39465339920075], "count": [230]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [230]}}} +{"episode_index": 193, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5235914629767923]], [[0.4845409827138863]], [[0.4319288826736749]]], "std": [[[0.30920149062542357]], [[0.27948547462343626]], [[0.24851781723266042]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5146842136757047]], [[0.482793576708027]], [[0.43638558600930605]]], "std": [[[0.3094335454005296]], [[0.28270824687293294]], [[0.26135835428483106]]], "count": [100]}, "observation.state": {"min": [-0.3086656630039215, -0.09719613939523697, 0.9713845252990723, 2.254868984222412, -2.723196029663086, -0.9622929096221924, 0.009261618368327618, -0.040069714188575745], "max": [0.002022345783188939, 0.27187976241111755, 1.1880064010620117, 3.3054749965667725, -0.0018815341172739863, -0.052233997732400894, 0.040017060935497284, -0.0004459710617084056], "mean": [-0.083037368953228, 0.09697526693344116, 1.0780425071716309, 2.7107503414154053, -2.0033090114593506, -0.5622817277908325, 0.031789109110832214, -0.029470132663846016], "std": [0.08859231323003769, 0.1300380975008011, 0.06284372508525848, 0.3366951048374176, 0.7991195321083069, 0.2439827024936676, 0.012805535458028316, 0.014060338959097862], "count": [265]}, "action": {"min": [-0.7875000238418579, -0.7714285850524902, -0.6321428418159485, -0.11357142776250839, -0.20571428537368774, -0.34928572177886963, 0.0], "max": [0.918749988079071, 0.824999988079071, 0.6080357432365417, 0.12535713613033295, 0.15214285254478455, 0.23250000178813934, 1.0], "mean": [0.06357817351818085, 0.16259433329105377, -0.04829515516757965, 0.004637463949620724, 0.015792444348335266, -0.02273852750658989, 0.7396226525306702], "std": [0.3484423756599426, 0.3827323317527771, 0.2685388922691345, 0.04902531951665878, 0.06919799000024796, 0.1364009976387024, 0.43883976340293884], "count": [265]}, "timestamp": {"min": [0.0], "max": [13.2], "mean": [6.6], "std": [3.8249182997810554], "count": [265]}, "frame_index": {"min": [0], "max": [264], "mean": [132.0], "std": [76.49836599562111], "count": [265]}, "episode_index": {"min": [193], "max": [193], "mean": [193.0], "std": [0.0], "count": [265]}, "index": {"min": [52204], "max": [52468], "mean": [52336.0], "std": [76.49836599562111], "count": [265]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [265]}}} +{"episode_index": 194, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5810503761441099]], [[0.5310209165086933]], [[0.4825233507343367]]], "std": [[[0.2860541304889939]], [[0.25908355841067054]], [[0.2291104245099503]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5640932030771293]], [[0.525699951171875]], [[0.4757758645450368]]], "std": [[[0.2936150734570301]], [[0.2695842941610199]], [[0.2507804966696327]]], "count": [100]}, "observation.state": {"min": [-0.21580016613006592, -0.2864021956920624, 1.011031150817871, 2.2449164390563965, -2.6486358642578125, -0.6061510443687439, 0.006173000670969486, -0.04000108316540718], "max": [0.10378565639257431, 0.19631272554397583, 1.2039083242416382, 3.208796739578247, 0.04036335274577141, -0.0893305242061615, 0.04000355675816536, -0.0110115185379982], "mean": [-0.015236043371260166, -0.03516015782952309, 1.0964947938919067, 2.595853805541992, -1.943845510482788, -0.42157718539237976, 0.02857169695198536, -0.030351728200912476], "std": [0.07041464745998383, 0.14069761335849762, 0.05214235559105873, 0.32342228293418884, 0.7243792414665222, 0.13569368422031403, 0.012811659835278988, 0.011508222669363022], "count": [466]}, "action": {"min": [-0.4580357074737549, -0.6348214149475098, -0.4285714328289032, -0.08142857253551483, -0.10928571224212646, -0.3182142972946167, 0.0], "max": [0.6428571343421936, 0.7553571462631226, 0.65625, 0.12535713613033295, 0.1842857152223587, 0.20892857015132904, 1.0], "mean": [0.047064684331417084, -0.02767665684223175, -0.025107307359576225, -7.587551226606593e-05, 0.006472256034612656, -0.007831104099750519, 0.5665236115455627], "std": [0.1946587860584259, 0.3105897605419159, 0.2094005048274994, 0.029564276337623596, 0.051451656967401505, 0.11250065267086029, 0.4955543875694275], "count": [466]}, "timestamp": {"min": [0.0], "max": [23.25], "mean": [11.625], "std": [6.726115149177867], "count": [466]}, "frame_index": {"min": [0], "max": [465], "mean": [232.5], "std": [134.52230298355735], "count": [466]}, "episode_index": {"min": [194], "max": [194], "mean": [194.0], "std": [0.0], "count": [466]}, "index": {"min": [52469], "max": [52934], "mean": [52701.5], "std": [134.52230298355735], "count": [466]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [466]}}} +{"episode_index": 195, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3121119534361596]], [[0.251235528085746]], [[0.21352497055951286]]], "std": [[[0.14179181874275346]], [[0.13450267938121596]], [[0.13727959431937795]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3145469097062653]], [[0.26961390117570466]], [[0.23684431607115503]]], "std": [[[0.15524230528839444]], [[0.17040890134381792]], [[0.17889670905460167]]], "count": [100]}, "observation.state": {"min": [-0.12066910415887833, -0.14531192183494568, 0.44982588291168213, 2.795259952545166, -1.1937943696975708, -0.6563490033149719, 0.01697029545903206, -0.04046452417969704], "max": [0.07595900446176529, 0.25345104932785034, 0.6941371560096741, 3.1407063007354736, 0.006385170854628086, 0.0993308275938034, 0.039912786334753036, -0.02254326269030571], "mean": [-0.0004840544715989381, 0.0734081119298935, 0.6053048968315125, 3.000526189804077, -0.5760295987129211, -0.18481916189193726, 0.03082273341715336, -0.033920638263225555], "std": [0.05447346717119217, 0.1302013248205185, 0.0685305967926979, 0.1007796972990036, 0.4300760328769684, 0.20460233092308044, 0.008825097233057022, 0.006342011969536543], "count": [281]}, "action": {"min": [-0.5169642567634583, -0.6482142806053162, -0.5973214507102966, -0.06642857193946838, -0.2175000011920929, -0.19178570806980133, 0.0], "max": [0.75, 0.8008928298950195, 0.9375, 0.08571428805589676, 0.14571428298950195, 0.27214285731315613, 1.0], "mean": [0.01906456984579563, 0.057470157742500305, -0.028539640828967094, 0.0028634979389607906, 0.009425520896911621, -0.009273012168705463, 0.5409252643585205], "std": [0.2703862488269806, 0.36272791028022766, 0.39914533495903015, 0.01911272667348385, 0.06864582747220993, 0.08706936985254288, 0.4983222484588623], "count": [281]}, "timestamp": {"min": [0.0], "max": [14.0], "mean": [7.0], "std": [4.055859958134649], "count": [281]}, "frame_index": {"min": [0], "max": [280], "mean": [140.0], "std": [81.11719916269298], "count": [281]}, "episode_index": {"min": [195], "max": [195], "mean": [195.0], "std": [0.0], "count": [281]}, "index": {"min": [52935], "max": [53215], "mean": [53075.0], "std": [81.11719916269298], "count": [281]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [281]}}} +{"episode_index": 196, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31640134145699295]], [[0.2653496781891468]], [[0.23674278767903645]]], "std": [[[0.15492482040517203]], [[0.15325224594438774]], [[0.16100247763991604]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3154879802629059]], [[0.27102160046147367]], [[0.23862388880112592]]], "std": [[[0.15584361204820876]], [[0.17108383864152346]], [[0.17976875776974977]]], "count": [100]}, "observation.state": {"min": [-0.1680728644132614, -0.10163341462612152, 0.449096143245697, 3.041166067123413, -0.8664724230766296, -0.43383166193962097, 0.022806936874985695, -0.039938200265169144], "max": [0.1027100533246994, 0.27694177627563477, 0.6879109144210815, 3.3118040561676025, 0.06340896338224411, -0.02746875025331974, 0.04068560153245926, -0.015747234225273132], "mean": [-0.03137117996811867, 0.08870864659547806, 0.585997998714447, 3.15006422996521, -0.3833337128162384, -0.20944632589817047, 0.033794935792684555, -0.03311486169695854], "std": [0.08058594912290573, 0.13135993480682373, 0.0715748593211174, 0.07025981694459915, 0.2925103008747101, 0.11250299960374832, 0.006386976223438978, 0.008156560361385345], "count": [269]}, "action": {"min": [-0.4660714268684387, -0.7419642806053162, -0.7553571462631226, -0.06964285671710968, -0.06964285671710968, -0.17249999940395355, 0.0], "max": [0.7151785492897034, 0.8330357074737549, 0.9375, 0.06535714119672775, 0.1639285683631897, 0.3214285671710968, 1.0], "mean": [0.004520697053521872, 0.0976433977484703, -0.037270981818437576, 0.008372277021408081, 0.003986989613622427, -0.003564794547855854, 0.553903341293335], "std": [0.27599596977233887, 0.3654462993144989, 0.3879842460155487, 0.019998840987682343, 0.03487255051732063, 0.07673466950654984, 0.4970856308937073], "count": [269]}, "timestamp": {"min": [0.0], "max": [13.4], "mean": [6.700000000000001], "std": [3.8826537316634355], "count": [269]}, "frame_index": {"min": [0], "max": [268], "mean": [134.0], "std": [77.6530746332687], "count": [269]}, "episode_index": {"min": [196], "max": [196], "mean": [196.0], "std": [0.0], "count": [269]}, "index": {"min": [53216], "max": [53484], "mean": [53350.0], "std": [77.6530746332687], "count": [269]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [269]}}} +{"episode_index": 197, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3669917099896599]], [[0.29949779016831346]], [[0.2524920720119102]]], "std": [[[0.17404307679901188]], [[0.1731435947224022]], [[0.1658619406425619]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3302520009957108]], [[0.2852621376187193]], [[0.2556239049574908]]], "std": [[[0.16763438750566617]], [[0.18399468646777897]], [[0.19512367499309163]]], "count": [100]}, "observation.state": {"min": [-0.16561482846736908, -0.11756747961044312, 0.4459106922149658, 3.0432679653167725, -0.3639926314353943, -0.21552838385105133, 0.0009430646314285696, -0.03979051858186722], "max": [0.1687663048505783, 0.14407144486904144, 0.6823149919509888, 3.2928359508514404, 0.37039119005203247, 0.6947575807571411, 0.04054907336831093, -0.0009580741752870381], "mean": [0.006988526321947575, 0.04646327719092369, 0.5394513607025146, 3.1463019847869873, 0.07224615663290024, 0.05180538073182106, 0.022984594106674194, -0.022328276187181473], "std": [0.1059294193983078, 0.09032431244850159, 0.07063793390989304, 0.05272321403026581, 0.24014593660831451, 0.22277109324932098, 0.016574813053011894, 0.016147376969456673], "count": [301]}, "action": {"min": [-0.7741071581840515, -0.5035714507102966, -0.6910714507102966, -0.06964285671710968, -0.3053571283817291, -0.13607142865657806, 0.0], "max": [0.9267857074737549, 0.4392857253551483, 0.6348214149475098, 0.062142856419086456, 0.18214285373687744, 0.10285714268684387, 1.0], "mean": [0.030585555359721184, 0.0210192259401083, -0.08987005054950714, 0.002238965593278408, -0.0013917870819568634, -0.006581634283065796, 0.43521595001220703], "std": [0.4055629372596741, 0.17279405891895294, 0.3146248161792755, 0.0236381683498621, 0.08701874315738678, 0.05234884098172188, 0.4957853853702545], "count": [301]}, "timestamp": {"min": [0.0], "max": [15.0], "mean": [7.5], "std": [4.344536799245692], "count": [301]}, "frame_index": {"min": [0], "max": [300], "mean": [150.0], "std": [86.89073598491383], "count": [301]}, "episode_index": {"min": [197], "max": [197], "mean": [197.0], "std": [0.0], "count": [301]}, "index": {"min": [53485], "max": [53785], "mean": [53635.0], "std": [86.89073598491383], "count": [301]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [301]}}} +{"episode_index": 198, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.587527634564568]], [[0.538163044649012]], [[0.48568329336128985]]], "std": [[[0.28088892674433713]], [[0.2696688059184415]], [[0.24962370744738216]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5485696716308595]], [[0.5091572792202819]], [[0.4592893832337623]]], "std": [[[0.2977242291871945]], [[0.27631861116771156]], [[0.2614540721276794]]], "count": [100]}, "observation.state": {"min": [-0.20829671621322632, -0.09068750590085983, 0.9381828308105469, 2.0548620223999023, -2.3516921997070312, -1.046983242034912, 0.0016555124893784523, -0.04041949659585953], "max": [0.035134054720401764, 0.1911619007587433, 1.169669270515442, 3.1459128856658936, 0.002485026139765978, 0.21680645644664764, 0.041050974279642105, -0.0014630978694185615], "mean": [-0.030678460374474525, 0.017615152522921562, 1.0499807596206665, 2.3855180740356445, -1.916901707649231, -0.20283502340316772, 0.026147890836000443, -0.025996023789048195], "std": [0.06117971986532211, 0.08525609225034714, 0.07934023439884186, 0.33613768219947815, 0.6277980804443359, 0.4184800386428833, 0.017164887860417366, 0.017364157363772392], "count": [235]}, "action": {"min": [-0.3991071283817291, -0.8410714268684387, -0.6000000238418579, -0.07928571105003357, -0.10821428894996643, -0.32035714387893677, 0.0], "max": [0.5116071701049805, 0.75, 0.862500011920929, 0.19178570806980133, 0.1371428519487381, 0.09535714238882065, 1.0], "mean": [0.052705179899930954, 0.10721124708652496, -0.09158435463905334, 0.024401217699050903, 0.007641335017979145, -0.051962029188871384, 0.6425532102584839], "std": [0.2100011706352234, 0.3538803458213806, 0.3575686812400818, 0.04751303419470787, 0.0477471686899662, 0.11480659991502762, 0.4792484641075134], "count": [235]}, "timestamp": {"min": [0.0], "max": [11.7], "mean": [5.85], "std": [3.391902121229326], "count": [235]}, "frame_index": {"min": [0], "max": [234], "mean": [117.0], "std": [67.83804242458652], "count": [235]}, "episode_index": {"min": [198], "max": [198], "mean": [198.0], "std": [0.0], "count": [235]}, "index": {"min": [53786], "max": [54020], "mean": [53903.0], "std": [67.83804242458652], "count": [235]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [235]}}} +{"episode_index": 199, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32925202253753066]], [[0.27192656752642463]], [[0.2369414230047488]]], "std": [[[0.1357949157559001]], [[0.13103705246734798]], [[0.13429919430860188]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32290918626972276]], [[0.27554739320044425]], [[0.2409878210927926]]], "std": [[[0.16346561778114957]], [[0.17875124761974592]], [[0.18888975566275046]]], "count": [100]}, "observation.state": {"min": [-0.11902023106813431, -0.15230543911457062, 0.48094865679740906, 2.944382429122925, -1.1102098226547241, -0.09333545714616776, 0.02754252962768078, -0.03986981511116028], "max": [-0.014216527342796326, 0.2856646180152893, 0.6810867190361023, 3.2674787044525146, 0.010714564472436905, 0.6072080135345459, 0.04005758464336395, -0.027185948565602303], "mean": [-0.0663544163107872, 0.0669136717915535, 0.6043378710746765, 3.1369571685791016, -0.3126613199710846, 0.1486462652683258, 0.03520733863115311, -0.03461824357509613], "std": [0.03517597168684006, 0.145017609000206, 0.06491638720035553, 0.07096157222986221, 0.30443596839904785, 0.18130028247833252, 0.004326703492552042, 0.005178338848054409], "count": [250]}, "action": {"min": [-0.4392857253551483, -0.7419642806053162, -0.7151785492897034, -0.0535714291036129, -0.09214285761117935, -0.1103571429848671, 0.0], "max": [0.4312500059604645, 0.824999988079071, 0.9375, 0.08464285731315613, 0.1039285734295845, 0.031071428209543228, 1.0], "mean": [0.01973572187125683, 0.08367855101823807, -0.02142857015132904, 0.003565713297575712, -0.0053614298813045025, -0.022208577021956444, 0.5720000267028809], "std": [0.20173242688179016, 0.41895443201065063, 0.41989031434059143, 0.023470979183912277, 0.04502495005726814, 0.030490944162011147, 0.49478915333747864], "count": [250]}, "timestamp": {"min": [0.0], "max": [12.45], "mean": [6.225], "std": [3.6084103148062305], "count": [250]}, "frame_index": {"min": [0], "max": [249], "mean": [124.5], "std": [72.16820629612461], "count": [250]}, "episode_index": {"min": [199], "max": [199], "mean": [199.0], "std": [0.0], "count": [250]}, "index": {"min": [54021], "max": [54270], "mean": [54145.5], "std": [72.16820629612461], "count": [250]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [250]}}} +{"episode_index": 200, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.30051447311102175]], [[0.24024298574410233]], [[0.20314746751972274]]], "std": [[[0.14888798550755997]], [[0.13683677158420485]], [[0.13682783822921393]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3150140733905867]], [[0.2679690120921415]], [[0.2337358757467831]]], "std": [[[0.15762963181446768]], [[0.1707601427685746]], [[0.1797935565747484]]], "count": [100]}, "observation.state": {"min": [-0.10956450551748276, -0.15560247004032135, 0.48108285665512085, 3.0057883262634277, -1.4795541763305664, -0.6121451258659363, 0.013365646824240685, -0.040223170071840286], "max": [0.03296312689781189, 0.2604266107082367, 0.7869645357131958, 3.2254223823547363, 0.0018074869876727462, 0.19724927842617035, 0.03994005173444748, -0.021653149276971817], "mean": [-0.038739364594221115, 0.040070537477731705, 0.6142458319664001, 3.1202163696289062, -0.4930669367313385, -0.2595188021659851, 0.033733267337083817, -0.03517495468258858], "std": [0.04315983131527901, 0.15269216895103455, 0.0844523087143898, 0.056118130683898926, 0.4729498326778412, 0.21457429230213165, 0.006480049341917038, 0.0047088079154491425], "count": [343]}, "action": {"min": [-0.2946428656578064, -0.5678571462631226, -0.5571428537368774, -0.03321428596973419, -0.14892856776714325, -0.14249999821186066, 0.0], "max": [0.6482142806053162, 0.7982142567634583, 0.9375, 0.08464285731315613, 0.18321429193019867, 0.031071428209543228, 1.0], "mean": [0.03023739531636238, 0.049971356987953186, -0.010237917304039001, 0.002958142664283514, 0.0010245728772133589, -0.021288003772497177, 0.5451894998550415], "std": [0.17878563702106476, 0.32568609714508057, 0.3935990333557129, 0.017875930294394493, 0.06451243907213211, 0.033728040754795074, 0.4979538023471832], "count": [343]}, "timestamp": {"min": [0.0], "max": [17.1], "mean": [8.55], "std": [4.950757517794624], "count": [343]}, "frame_index": {"min": [0], "max": [342], "mean": [171.0], "std": [99.0151503558925], "count": [343]}, "episode_index": {"min": [200], "max": [200], "mean": [200.0], "std": [0.0], "count": [343]}, "index": {"min": [54271], "max": [54613], "mean": [54442.0], "std": [99.0151503558925], "count": [343]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [343]}}} +{"episode_index": 201, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3466843656652114]], [[0.27959772985121784]], [[0.2385369520000383]]], "std": [[[0.14513389575444904]], [[0.143370863183025]], [[0.14932400991400777]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3278093513039982]], [[0.2825228115904565]], [[0.24906396304859835]]], "std": [[[0.1667353386677475]], [[0.18219832760763818]], [[0.1925600140409134]]], "count": [100]}, "observation.state": {"min": [-0.06458119302988052, -0.2151847630739212, 0.44626712799072266, 3.031669855117798, -0.3638834059238434, -0.19830043613910675, 0.019417541101574898, -0.03989298641681671], "max": [0.13295812904834747, 0.2689424157142639, 0.7152901887893677, 3.1706573963165283, 0.11506607383489609, 0.14449436962604523, 0.039863470941782, -0.019342035055160522], "mean": [0.03196091204881668, 0.04571672901511192, 0.6069948673248291, 3.1208624839782715, -0.1693142056465149, 0.0030406091827899218, 0.029662569984793663, -0.029656166210770607], "std": [0.05414869263768196, 0.16653798520565033, 0.08158811926841736, 0.03401894122362137, 0.13344904780387878, 0.09297043085098267, 0.008967327885329723, 0.009116002358496189], "count": [243]}, "action": {"min": [-0.46875, -0.7285714149475098, -0.8464285731315613, -0.11464285850524902, -0.11464285850524902, -0.14785714447498322, 0.0], "max": [0.7151785492897034, 0.8999999761581421, 0.9375, 0.07285714149475098, 0.0867857113480568, 0.1071428582072258, 1.0], "mean": [0.017162706702947617, 0.09088403731584549, -0.027766773477196693, -0.0002998237032443285, -0.00016754854004830122, -0.003368604928255081, 0.5102880597114563], "std": [0.2817203104496002, 0.46596741676330566, 0.4901757538318634, 0.028472954407334328, 0.035184308886528015, 0.05342032387852669, 0.4998944103717804], "count": [243]}, "timestamp": {"min": [0.0], "max": [12.1], "mean": [6.05], "std": [3.507373186113315], "count": [243]}, "frame_index": {"min": [0], "max": [242], "mean": [121.0], "std": [70.14746372226631], "count": [243]}, "episode_index": {"min": [201], "max": [201], "mean": [201.0], "std": [0.0], "count": [243]}, "index": {"min": [54614], "max": [54856], "mean": [54735.0], "std": [70.14746372226631], "count": [243]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [243]}}} +{"episode_index": 202, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5739515781776577]], [[0.5381341331332338]], [[0.501189900117762]]], "std": [[[0.2603909614688875]], [[0.23762498948256006]], [[0.21428920229004894]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5384853605382582]], [[0.5035885512408088]], [[0.4550481746897978]]], "std": [[[0.29957223853984033]], [[0.27368211247429564]], [[0.254242016384632]]], "count": [100]}, "observation.state": {"min": [-0.22923633456230164, -0.1024811789393425, 0.927096962928772, 2.2798240184783936, -0.0645814910531044, -0.12170140445232391, 0.005589757580310106, -0.04001039266586304], "max": [0.05896266549825668, 0.21492058038711548, 1.1743297576904297, 3.176913261413574, 2.3841793537139893, 0.581706166267395, 0.039923667907714844, -0.0020256051793694496], "mean": [-0.09131661802530289, 0.07032691687345505, 1.0470925569534302, 2.758659601211548, 1.1734527349472046, 0.19223357737064362, 0.02801547758281231, -0.02638479694724083], "std": [0.11843043565750122, 0.1102859154343605, 0.0839366689324379, 0.33936241269111633, 0.9119774699211121, 0.2599349915981293, 0.013722569681704044, 0.015207186341285706], "count": [232]}, "action": {"min": [-0.4044642746448517, -0.7366071343421936, -0.8517857193946838, -0.04392857104539871, -0.1103571429848671, -0.04285714402794838, 0.0], "max": [0.75, 0.7848214507102966, 0.7419642806053162, 0.06642857193946838, 0.11678571254014969, 0.375, 1.0], "mean": [0.05661945790052414, 0.06774938851594925, -0.10852834582328796, 0.006447045598179102, -0.0006419329438358545, 0.06588362157344818, 0.568965494632721], "std": [0.26834118366241455, 0.35230782628059387, 0.41797974705696106, 0.019327756017446518, 0.050373636186122894, 0.1120963841676712, 0.49522122740745544], "count": [232]}, "timestamp": {"min": [0.0], "max": [11.55], "mean": [5.7749999999999995], "std": [3.3486004539210104], "count": [232]}, "frame_index": {"min": [0], "max": [231], "mean": [115.5], "std": [66.97200907842021], "count": [232]}, "episode_index": {"min": [202], "max": [202], "mean": [202.0], "std": [0.0], "count": [232]}, "index": {"min": [54857], "max": [55088], "mean": [54972.5], "std": [66.97200907842021], "count": [232]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [232]}}} +{"episode_index": 203, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5714169891955805]], [[0.536838758281633]], [[0.5016004836138557]]], "std": [[[0.25251061631085153]], [[0.23008318552556137]], [[0.20716420306599742]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5394240914139093]], [[0.5042727828680301]], [[0.4554484576056985]]], "std": [[[0.29966080766056885]], [[0.27360530420336027]], [[0.25383684449398497]]], "count": [100]}, "observation.state": {"min": [-0.21078316867351532, -0.05712925270199776, 0.9274402260780334, 1.5453099012374878, 0.00013113347813487053, -0.20196077227592468, 0.009885723702609539, -0.04026136174798012], "max": [0.07398109883069992, 0.22034522891044617, 1.1754939556121826, 3.1532678604125977, 3.018087387084961, 0.7489982843399048, 0.03996437042951584, -0.0102395573630929], "mean": [-0.07561860978603363, 0.1000775545835495, 1.059631586074829, 2.581094980239868, 1.5733343362808228, 0.1838793009519577, 0.031056005507707596, -0.0327940434217453], "std": [0.10533580929040909, 0.09911075234413147, 0.08533883094787598, 0.5244149565696716, 1.1023077964782715, 0.330072283744812, 0.010027403011918068, 0.010006778873503208], "count": [243]}, "action": {"min": [-0.4312500059604645, -0.731249988079071, -0.6348214149475098, -0.004285714123398066, -0.15964286029338837, -0.02142857201397419, 0.0], "max": [0.6053571701049805, 0.6026785969734192, 0.9375, 0.13178572058677673, 0.13500000536441803, 0.375, 1.0], "mean": [0.038833778351545334, 0.04582231864333153, -0.08544974774122238, 0.020405638962984085, -0.012380953878164291, 0.0751190334558487, 0.5679012537002563], "std": [0.24226078391075134, 0.30121609568595886, 0.40164604783058167, 0.03347223252058029, 0.05187408998608589, 0.09772949665784836, 0.4953683912754059], "count": [243]}, "timestamp": {"min": [0.0], "max": [12.1], "mean": [6.05], "std": [3.507373186113315], "count": [243]}, "frame_index": {"min": [0], "max": [242], "mean": [121.0], "std": [70.14746372226631], "count": [243]}, "episode_index": {"min": [203], "max": [203], "mean": [203.0], "std": [0.0], "count": [243]}, "index": {"min": [55089], "max": [55331], "mean": [55210.0], "std": [70.14746372226631], "count": [243]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [243]}}} +{"episode_index": 204, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.593960475547641]], [[0.5445402245615043]], [[0.49440891340667126]]], "std": [[[0.2822259449262216]], [[0.2560304246229707]], [[0.2271179259248922]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5674095925723804]], [[0.529027541216682]], [[0.47888151939242496]]], "std": [[[0.2961184295335506]], [[0.2729419221572491]], [[0.2551307454892702]]], "count": [100]}, "observation.state": {"min": [-0.1999455839395523, -0.2776122987270355, 0.9968136548995972, 2.4049737453460693, -2.668733835220337, -0.7232092618942261, 0.004030189476907253, -0.04004938155412674], "max": [0.07282734662294388, 0.16895630955696106, 1.2289719581604004, 3.2313969135284424, -0.0004483558004721999, -0.09038922190666199, 0.040005557239055634, -0.006811340805143118], "mean": [-0.020734762772917747, -0.030795501545071602, 1.0985909700393677, 2.7124667167663574, -2.0724477767944336, -0.5256507396697998, 0.026908498257398605, -0.027551017701625824], "std": [0.0560896173119545, 0.12825943529605865, 0.06409791111946106, 0.2503897249698639, 0.6690579056739807, 0.12468765676021576, 0.01493013370782137, 0.014232601970434189], "count": [398]}, "action": {"min": [-0.39375001192092896, -0.7741071581840515, -0.5866071581840515, -0.10607142746448517, -0.09428571164608002, -0.3182142972946167, 0.0], "max": [0.5089285969734192, 0.8410714268684387, 0.6589285731315613, 0.08892857283353806, 0.17892856895923615, 0.16928571462631226, 1.0], "mean": [0.04548187181353569, -0.03700197488069534, -0.04279657080769539, 0.0017040501115843654, 0.013481692411005497, -0.01328787487000227, 0.5804020166397095], "std": [0.20035770535469055, 0.35551270842552185, 0.24928022921085358, 0.03137380629777908, 0.04396745562553406, 0.11364298313856125, 0.49349406361579895], "count": [398]}, "timestamp": {"min": [0.0], "max": [19.85], "mean": [9.924999999999999], "std": [5.744617045547946], "count": [398]}, "frame_index": {"min": [0], "max": [397], "mean": [198.5], "std": [114.8923409109589], "count": [398]}, "episode_index": {"min": [204], "max": [204], "mean": [204.0], "std": [0.0], "count": [398]}, "index": {"min": [55332], "max": [55729], "mean": [55530.5], "std": [114.8923409109589], "count": [398]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [398]}}} +{"episode_index": 205, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31747630459654563]], [[0.2584226840150123]], [[0.22077912334367342]]], "std": [[[0.16187431149097878]], [[0.15773367190595255]], [[0.1599213737540351]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31518019253599877]], [[0.27082772109087777]], [[0.23829432947495405]]], "std": [[[0.15608038553065762]], [[0.1710314801946566]], [[0.1793015038029403]]], "count": [100]}, "observation.state": {"min": [-0.11035283654928207, -0.10068857669830322, 0.4469311237335205, 3.041781425476074, -0.5880250334739685, -0.557515025138855, 0.017059771344065666, -0.04043538495898247], "max": [0.0953296422958374, 0.26649531722068787, 0.6900953650474548, 3.14113187789917, 0.0018812369089573622, 0.02777850441634655, 0.03987213969230652, -0.02268259786069393], "mean": [-0.007027076557278633, 0.07598669081926346, 0.5926533937454224, 3.104098081588745, -0.34478721022605896, -0.28711998462677, 0.030881816521286964, -0.03503913804888725], "std": [0.06376946717500687, 0.12355026602745056, 0.07042918354272842, 0.029178449884057045, 0.17377111315727234, 0.18100298941135406, 0.008425970561802387, 0.006005723495036364], "count": [238]}, "action": {"min": [-0.6187499761581421, -0.768750011920929, -0.7526785731315613, -0.03214285895228386, -0.1371428519487381, -0.11999999731779099, 0.0], "max": [0.6991071701049805, 0.8089285492897034, 0.9375, 0.05464285612106323, 0.1542857140302658, 0.10821428894996643, 1.0], "mean": [0.018704969435930252, 0.07817375659942627, -0.0506565123796463, 0.0025255102664232254, 0.002575026825070381, -0.005807324778288603, 0.5126050710678101], "std": [0.2703979015350342, 0.40256547927856445, 0.445227712392807, 0.011543111875653267, 0.04700510576367378, 0.041029270738363266, 0.4998408257961273], "count": [238]}, "timestamp": {"min": [0.0], "max": [11.85], "mean": [5.925], "std": [3.435203778526101], "count": [238]}, "frame_index": {"min": [0], "max": [237], "mean": [118.5], "std": [68.70407557052202], "count": [238]}, "episode_index": {"min": [205], "max": [205], "mean": [205.0], "std": [0.0], "count": [238]}, "index": {"min": [55730], "max": [55967], "mean": [55848.5], "std": [68.70407557052202], "count": [238]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [238]}}} +{"episode_index": 206, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3390051030177696]], [[0.2754788668763404]], [[0.23684631946040136]]], "std": [[[0.16083304891265143]], [[0.16081462381984685]], [[0.16685623536319197]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3223009302475873]], [[0.27692496744791667]], [[0.24690353393554687]]], "std": [[[0.15857781488103043]], [[0.17359033912663085]], [[0.18411571968231635]]], "count": [100]}, "observation.state": {"min": [-0.15383510291576385, -0.11558026820421219, 0.44864070415496826, 3.0799832344055176, -0.23088333010673523, -0.4271194636821747, 0.0013530574506148696, -0.03983383625745773], "max": [0.15204381942749023, 0.14824117720127106, 0.686051070690155, 3.231459856033325, 0.4207591116428375, -0.09259534627199173, 0.04028505086898804, -0.0028320681303739548], "mean": [0.011502093635499477, 0.025057164952158928, 0.5553134679794312, 3.1432993412017822, 0.13407643139362335, -0.23391836881637573, 0.021547513082623482, -0.020929625257849693], "std": [0.1015995591878891, 0.08154470473527908, 0.061667196452617645, 0.04177086800336838, 0.20843170583248138, 0.0911288782954216, 0.016284875571727753, 0.015678653493523598], "count": [244]}, "action": {"min": [-0.5625, -0.3910714387893677, -0.731249988079071, -0.046071428805589676, -0.09000000357627869, -0.07285714149475098, 0.0], "max": [0.7848214507102966, 0.5035714507102966, 0.5383928418159485, 0.0771428570151329, 0.07392857223749161, 0.11678571254014969, 1.0], "mean": [0.031956229358911514, 0.04062866419553757, -0.0965932309627533, 4.3907079998461995e-06, -0.0012075542472302914, -0.00484777195379138, 0.3811475336551666], "std": [0.34419628977775574, 0.1723083108663559, 0.2989373207092285, 0.01954319328069687, 0.033922839909791946, 0.04488600417971611, 0.4856685996055603], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [206], "max": [206], "mean": [206.0], "std": [0.0], "count": [244]}, "index": {"min": [55968], "max": [56211], "mean": [56089.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [244]}}} +{"episode_index": 207, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35539635572246475]], [[0.2872649440391391]], [[0.24137927844477633]]], "std": [[[0.14111786597284456]], [[0.14356548212928444]], [[0.1494977063002725]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31808591476141235]], [[0.26957555494121477]], [[0.23643030323701744]]], "std": [[[0.1519309902007762]], [[0.16632081915143332]], [[0.17534327620445486]]], "count": [100]}, "observation.state": {"min": [-0.11951334774494171, -0.25908300280570984, 0.5309700965881348, 2.953855514526367, -1.3165912628173828, -0.09210037440061569, 0.0013538115890696645, -0.0399414487183094], "max": [0.046607743948698044, 0.3354719579219818, 0.6821689009666443, 3.2562241554260254, 0.3608112633228302, 0.32555633783340454, 0.0399053581058979, -0.005443396046757698], "mean": [-0.016925977542996407, -0.012769653461873531, 0.5948459506034851, 3.093341827392578, -0.02610536478459835, 0.04366312175989151, 0.022218622267246246, -0.022935355082154274], "std": [0.05211246758699417, 0.19590400159358978, 0.04531615972518921, 0.08372855186462402, 0.40122613310813904, 0.10625887662172318, 0.016342507675290108, 0.015535558573901653], "count": [240]}, "action": {"min": [-0.4419642984867096, -0.5866071581840515, -0.5169642567634583, -0.06642857193946838, -0.11249999701976776, -0.1842857152223587, 0.0], "max": [0.7553571462631226, 0.8142856955528259, 0.581250011920929, 0.13500000536441803, 0.08785714209079742, 0.09214285761117935, 1.0], "mean": [0.03486604988574982, 0.10284597426652908, -0.04830357804894447, 0.005116069223731756, -0.0020714295096695423, -0.029571425169706345, 0.48750001192092896], "std": [0.21905869245529175, 0.3632410764694214, 0.2785559594631195, 0.04494446888566017, 0.03631224483251572, 0.06618976593017578, 0.4998438060283661], "count": [240]}, "timestamp": {"min": [0.0], "max": [11.95], "mean": [5.975], "std": [3.4640715446807193], "count": [240]}, "frame_index": {"min": [0], "max": [239], "mean": [119.5], "std": [69.2814308936144], "count": [240]}, "episode_index": {"min": [207], "max": [207], "mean": [207.0], "std": [0.0], "count": [240]}, "index": {"min": [56212], "max": [56451], "mean": [56331.5], "std": [69.2814308936144], "count": [240]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [240]}}} +{"episode_index": 208, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32051517920400585]], [[0.26286844350777416]], [[0.22925535972445618]]], "std": [[[0.13563089410786694]], [[0.1323325395852555]], [[0.13959183324297303]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3164083610983456]], [[0.2711700960047105]], [[0.23834434299842985]]], "std": [[[0.1574574392634965]], [[0.173033713623974]], [[0.18179363241981666]]], "count": [100]}, "observation.state": {"min": [-0.16538041830062866, -0.1059996485710144, 0.4460912346839905, 2.9794602394104004, -0.3612267076969147, -0.5119133591651917, 0.020226705819368362, -0.039873067289590836], "max": [0.07788611203432083, 0.2840053141117096, 0.7303589582443237, 3.2416887283325195, 0.0003994958533439785, 0.09260977804660797, 0.040376778692007065, -0.02166971191763878], "mean": [-0.027676226571202278, 0.1026853695511818, 0.6019139885902405, 3.1327908039093018, -0.1696159839630127, -0.16041362285614014, 0.03336493670940399, -0.03396537899971008], "std": [0.07914522290229797, 0.12912361323833466, 0.08469372242689133, 0.07221908122301102, 0.10817491263151169, 0.16339723765850067, 0.007490947376936674, 0.006874952465295792], "count": [250]}, "action": {"min": [-0.5919643044471741, -0.8116071224212646, -0.6696428656578064, -0.11678571254014969, -0.1574999988079071, -0.09535714238882065, 0.0], "max": [0.6857143044471741, 0.9375, 0.9375, 0.07928571105003357, 0.18535713851451874, 0.0535714291036129, 1.0], "mean": [0.03975001350045204, 0.09283927828073502, -0.013542862609028816, -0.0013971440494060516, 0.00023571362544316798, -0.006784285884350538, 0.5839999914169312], "std": [0.2991718351840973, 0.3963893949985504, 0.47127842903137207, 0.035314686596393585, 0.055783092975616455, 0.031723517924547195, 0.49289411306381226], "count": [250]}, "timestamp": {"min": [0.0], "max": [12.45], "mean": [6.225], "std": [3.6084103148062305], "count": [250]}, "frame_index": {"min": [0], "max": [249], "mean": [124.5], "std": [72.16820629612461], "count": [250]}, "episode_index": {"min": [208], "max": [208], "mean": [208.0], "std": [0.0], "count": [250]}, "index": {"min": [56452], "max": [56701], "mean": [56576.5], "std": [72.16820629612461], "count": [250]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [250]}}} +{"episode_index": 209, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.984313725490196]], [[0.996078431372549]]], "mean": [[[0.3455773321413526]], [[0.2659164686016008]], [[0.1654715265012255]]], "std": [[[0.20830939480937768]], [[0.15268423715742643]], [[0.09327468159924657]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.996078431372549]], [[0.9882352941176471]]], "mean": [[[0.35631465298521753]], [[0.30011926449046417]], [[0.22407818902707569]]], "std": [[[0.14044707459537162]], [[0.1320577430086416]], [[0.14238364873716858]]], "count": [100]}, "observation.state": {"min": [-0.45197218656539917, -0.1701626032590866, 0.9869158267974854, 2.1851353645324707, -2.209197521209717, -0.13959427177906036, 0.011500328779220581, -0.03978113457560539], "max": [-0.17263495922088623, 0.15568362176418304, 1.252856969833374, 3.150364637374878, -0.0011639614822342992, 0.02618504874408245, 0.03982558101415634, -0.0154319629073143], "mean": [-0.26245784759521484, -0.013907105661928654, 1.1579937934875488, 2.764418840408325, -1.1921710968017578, -0.0642957091331482, 0.019962582737207413, -0.02268596738576889], "std": [0.08436417579650879, 0.1311172991991043, 0.08675967156887054, 0.3515791893005371, 0.7280144691467285, 0.04512403532862663, 0.011653250083327293, 0.009943220764398575], "count": [169]}, "action": {"min": [-0.5249999761581421, -0.6214285492897034, -0.7044642567634583, -0.03142857179045677, -0.022857142612338066, -0.17000000178813934, 0.0], "max": [0.375, 0.5035714507102966, 0.9375, 0.010714286006987095, 0.01785714365541935, -0.0, 1.0], "mean": [-0.0724482536315918, -0.08587279915809631, -0.055885426700115204, -0.0024852072820067406, 0.00036770926089957356, -0.07623418420553207, 0.23668639361858368], "std": [0.22815844416618347, 0.28818801045417786, 0.4110860228538513, 0.007030433975160122, 0.005800854414701462, 0.041897669434547424, 0.4250483810901642], "count": [169]}, "timestamp": {"min": [0.0], "max": [8.4], "mean": [4.199999999999999], "std": [2.4392621835300936], "count": [169]}, "frame_index": {"min": [0], "max": [168], "mean": [84.0], "std": [48.78524367060187], "count": [169]}, "episode_index": {"min": [209], "max": [209], "mean": [209.0], "std": [0.0], "count": [169]}, "index": {"min": [56702], "max": [56870], "mean": [56786.0], "std": [48.78524367060187], "count": [169]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [169]}}} +{"episode_index": 210, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3458493197571998]], [[0.27868667542700676]], [[0.23719848393458948]]], "std": [[[0.15056467863558848]], [[0.1508052031895157]], [[0.15526606269183243]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33077457502776497]], [[0.2870432834999234]], [[0.2581374033011642]]], "std": [[[0.16416565158063803]], [[0.18063913128824877]], [[0.19181580398770437]]], "count": [100]}, "observation.state": {"min": [-0.12757886946201324, -0.09778478741645813, 0.4460163414478302, 3.03532075881958, -0.2756566107273102, -0.38990914821624756, 0.0022331310901790857, -0.0397617481648922], "max": [0.1720297485589981, 0.16784632205963135, 0.677781343460083, 3.2202680110931396, 0.172647163271904, 0.05735468491911888, 0.040472883731126785, -0.0028490209951996803], "mean": [0.04327443242073059, 0.06076407805085182, 0.5323193669319153, 3.139050006866455, -0.004642958287149668, -0.07796531170606613, 0.023740172386169434, -0.022350789979100227], "std": [0.09823501855134964, 0.08675877004861832, 0.07283048331737518, 0.04520219564437866, 0.14165155589580536, 0.10356679558753967, 0.014745142310857773, 0.014591471292078495], "count": [286]}, "action": {"min": [-0.675000011920929, -0.5276785492897034, -0.6535714268684387, -0.04928571358323097, -0.2175000011920929, -0.14785714447498322, 0.0], "max": [0.8330357074737549, 0.4151785671710968, 0.543749988079071, 0.07607142627239227, 0.12642857432365417, 0.0503571443259716, 1.0], "mean": [0.029483022168278694, 0.01982705108821392, -0.1049138605594635, 0.0011500994442030787, -0.003255493938922882, -0.01087163109332323, 0.4195804297924042], "std": [0.36387690901756287, 0.18811087310314178, 0.27591797709465027, 0.024614153429865837, 0.05358495935797691, 0.03283716365695, 0.49349045753479004], "count": [286]}, "timestamp": {"min": [0.0], "max": [14.25], "mean": [7.125], "std": [4.128029190788262], "count": [286]}, "frame_index": {"min": [0], "max": [285], "mean": [142.5], "std": [82.56058381576526], "count": [286]}, "episode_index": {"min": [210], "max": [210], "mean": [210.0], "std": [0.0], "count": [286]}, "index": {"min": [56871], "max": [57156], "mean": [57013.5], "std": [82.56058381576526], "count": [286]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [286]}}} +{"episode_index": 211, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34472453278186277]], [[0.27843219831878063]], [[0.23297642666685817]]], "std": [[[0.14382831912269065]], [[0.14235391040430947]], [[0.14629894059812215]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3148212974398744]], [[0.2661192854339001]], [[0.23289891620710784]]], "std": [[[0.14971158074346932]], [[0.16321967557934589]], [[0.17166940193334085]]], "count": [100]}, "observation.state": {"min": [-0.12125825136899948, -0.28269219398498535, 0.5086201429367065, 2.9716415405273438, -0.3237486481666565, -0.356641560792923, 0.0012485153274610639, -0.04015874117612839], "max": [0.04832811653614044, 0.33643895387649536, 0.691748321056366, 3.1587579250335693, 0.6453466415405273, 0.10717211663722992, 0.040321920067071915, -0.0033305175602436066], "mean": [-0.015336592681705952, -0.017385192215442657, 0.5959113836288452, 3.0647776126861572, 0.10887281596660614, -0.08212858438491821, 0.022335607558488846, -0.022917354479432106], "std": [0.04995203763246536, 0.19356057047843933, 0.05521613359451294, 0.05296188220381737, 0.24655187129974365, 0.09501488506793976, 0.017161328345537186, 0.01645747944712639], "count": [277]}, "action": {"min": [-0.4660714268684387, -0.7446428537368774, -0.6160714030265808, -0.0535714291036129, -0.13500000536441803, -0.1039285734295845, 0.0], "max": [0.6883928775787354, 0.8571428656578064, 0.6455357074737549, 0.0835714265704155, 0.1274999976158142, 0.14464285969734192, 1.0], "mean": [0.0023787985555827618, 0.08672959357500076, -0.06803765892982483, -0.0010675607481971383, 0.00555054098367691, -0.006273853126913309, 0.5234656929969788], "std": [0.24371100962162018, 0.3762548565864563, 0.33708181977272034, 0.021785397082567215, 0.03661542013287544, 0.04923343285918236, 0.4994490146636963], "count": [277]}, "timestamp": {"min": [0.0], "max": [13.8], "mean": [6.8999999999999995], "std": [3.9981245603407602], "count": [277]}, "frame_index": {"min": [0], "max": [276], "mean": [138.0], "std": [79.96249120681522], "count": [277]}, "episode_index": {"min": [211], "max": [211], "mean": [211.0], "std": [0.0], "count": [277]}, "index": {"min": [57157], "max": [57433], "mean": [57295.0], "std": [79.96249120681522], "count": [277]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [277]}}} +{"episode_index": 212, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3537407992493873]], [[0.28778577378216913]], [[0.24494210815429687]]], "std": [[[0.16532728632625446]], [[0.16482173174950637]], [[0.16577045572508223]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3256816142961091]], [[0.28025394334980086]], [[0.2503607381184896]]], "std": [[[0.1598299828542788]], [[0.1753992757760291]], [[0.18613549213760144]]], "count": [100]}, "observation.state": {"min": [-0.1305084079504013, -0.1271272450685501, 0.44624924659729004, 3.0785882472991943, -0.20213782787322998, -0.2932237386703491, 0.002863378496840596, -0.039848215878009796], "max": [0.1708635538816452, 0.13163617253303528, 0.6830372214317322, 3.1941258907318115, 0.04084673896431923, 0.054509129375219345, 0.03987924009561539, -0.0026673637330532074], "mean": [0.013546617701649666, 0.022486157715320587, 0.560052216053009, 3.144512176513672, -0.035783328115940094, -0.0836036428809166, 0.025024602189660072, -0.024389976635575294], "std": [0.10175103694200516, 0.08976326137781143, 0.06807637959718704, 0.035419780761003494, 0.07725141942501068, 0.08149705827236176, 0.015706824138760567, 0.01559901051223278], "count": [220]}, "action": {"min": [-0.6696428656578064, -0.5625, -0.5785714387893677, -0.04392857104539871, -0.0867857113480568, -0.07392857223749161, 0.0], "max": [0.8785714507102966, 0.47410714626312256, 0.6723214387893677, 0.05892857164144516, 0.10499999672174454, 0.023571427911520004, 1.0], "mean": [0.05286526307463646, 0.03679381683468819, -0.09956979006528854, 0.0011785707902163267, 0.004514610860496759, -0.005025973543524742, 0.5], "std": [0.41699469089508057, 0.2008928507566452, 0.32228076457977295, 0.02372496947646141, 0.03898701071739197, 0.0157143734395504, 0.5], "count": [220]}, "timestamp": {"min": [0.0], "max": [10.95], "mean": [5.475], "std": [3.17539367638093], "count": [220]}, "frame_index": {"min": [0], "max": [219], "mean": [109.5], "std": [63.50787352761861], "count": [220]}, "episode_index": {"min": [212], "max": [212], "mean": [212.0], "std": [0.0], "count": [220]}, "index": {"min": [57434], "max": [57653], "mean": [57543.5], "std": [63.50787352761861], "count": [220]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [220]}}} +{"episode_index": 213, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9882352941176471]], [[0.9803921568627451]], [[0.984313725490196]]], "mean": [[[0.338264097924326]], [[0.2650517578125]], [[0.17214105164770985]]], "std": [[[0.21544805523727933]], [[0.16210933444710315]], [[0.10910878435794594]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.984313725490196]], [[0.984313725490196]]], "mean": [[[0.3552625493068321]], [[0.2997444218654259]], [[0.22477547499712777]]], "std": [[[0.14175636494789257]], [[0.13307521176014664]], [[0.14317864641374195]]], "count": [100]}, "observation.state": {"min": [-0.4256449043750763, -0.14693671464920044, 0.9883802533149719, 2.147829532623291, -2.030266046524048, -0.6673670411109924, 0.007548049092292786, -0.03991307318210602], "max": [-0.1466819792985916, 0.14937816560268402, 1.2500615119934082, 3.1401045322418213, 0.0053849960677325726, -0.037672415375709534, 0.039974309504032135, -0.015156840905547142], "mean": [-0.2386644184589386, 0.009185953997075558, 1.1541166305541992, 2.8123984336853027, -1.099129319190979, -0.3236764669418335, 0.023717358708381653, -0.026077350601553917], "std": [0.06925057619810104, 0.11957555264234543, 0.08173583447933197, 0.3589552342891693, 0.6431678533554077, 0.24501176178455353, 0.013025515712797642, 0.011171282269060612], "count": [184]}, "action": {"min": [-0.5008928775787354, -0.6964285969734192, -0.7232142686843872, -0.06714285910129547, -0.013571428135037422, -0.1907142847776413, 0.0], "max": [0.4928571283817291, 0.4714285731315613, 0.9375, 0.04357142746448517, 0.1314285695552826, -0.0, 1.0], "mean": [-0.06253881752490997, -0.05879754200577736, -0.058681100606918335, -0.00693323090672493, 0.01979813724756241, -0.06432455778121948, 0.375], "std": [0.23738421499729156, 0.2743811309337616, 0.3824129104614258, 0.024830959737300873, 0.037752509117126465, 0.049477458000183105, 0.4841229319572449], "count": [184]}, "timestamp": {"min": [0.0], "max": [9.15], "mean": [4.575], "std": [2.655772015817623], "count": [184]}, "frame_index": {"min": [0], "max": [183], "mean": [91.5], "std": [53.115440316352455], "count": [184]}, "episode_index": {"min": [213], "max": [213], "mean": [213.0], "std": [0.0], "count": [184]}, "index": {"min": [57654], "max": [57837], "mean": [57745.5], "std": [53.115440316352455], "count": [184]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [184]}}} +{"episode_index": 214, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5813832026462928]], [[0.5331392391429227]], [[0.4841941265031403]]], "std": [[[0.28606574166004534]], [[0.2591544561874275]], [[0.22932791020537285]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5659846412808288]], [[0.5275771047554764]], [[0.47763282327090995]]], "std": [[[0.2950836183351623]], [[0.2716098878890019]], [[0.2535079155234835]]], "count": [100]}, "observation.state": {"min": [-0.2080303281545639, -0.29268768429756165, 1.0086861848831177, 2.320935010910034, -2.768298387527466, -0.771531879901886, 0.01126357913017273, -0.03991709649562836], "max": [0.12502522766590118, 0.19133614003658295, 1.2093985080718994, 3.1417059898376465, 0.0003567970416042954, -0.017211932688951492, 0.04000632092356682, -0.011139150708913803], "mean": [-0.024331646040081978, -0.04817771539092064, 1.0980204343795776, 2.622992992401123, -2.047959089279175, -0.4105704724788666, 0.030282702296972275, -0.03153422102332115], "std": [0.07770130783319473, 0.14000511169433594, 0.05781214311718941, 0.27752381563186646, 0.7912606596946716, 0.19281166791915894, 0.010959385894238949, 0.00951026938855648], "count": [388]}, "action": {"min": [-0.40982142090797424, -0.7982142567634583, -0.4660714268684387, -0.12214285880327225, -0.08142857253551483, -0.29035714268684387, 0.0], "max": [0.6642857193946838, 0.824999988079071, 0.75, 0.09535714238882065, 0.167142853140831, 0.3042857050895691, 1.0], "mean": [0.03439338132739067, -0.024431603029370308, -0.05118280649185181, 0.002548788208514452, 0.0021594257559627295, -0.011863043531775475, 0.6005154848098755], "std": [0.24289919435977936, 0.3666878044605255, 0.2712581157684326, 0.0454498790204525, 0.03834894672036171, 0.1168973445892334, 0.48979246616363525], "count": [388]}, "timestamp": {"min": [0.0], "max": [19.35], "mean": [9.674999999999999], "std": [5.600279010906511], "count": [388]}, "frame_index": {"min": [0], "max": [387], "mean": [193.5], "std": [112.0055802181302], "count": [388]}, "episode_index": {"min": [214], "max": [214], "mean": [214.0], "std": [0.0], "count": [388]}, "index": {"min": [57838], "max": [58225], "mean": [58031.5], "std": [112.0055802181302], "count": [388]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [388]}}} +{"episode_index": 215, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3347973429361979]], [[0.2695593758377375]], [[0.22942186961454505]]], "std": [[[0.1534276666158006]], [[0.1489144602358969]], [[0.15322060032454637]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32703591440238206]], [[0.282429510976754]], [[0.24952012843711704]]], "std": [[[0.16614446646820422]], [[0.18127870966918766]], [[0.1910885479437741]]], "count": [100]}, "observation.state": {"min": [-0.03742193430662155, -0.22086140513420105, 0.4466284513473511, 3.0923330783843994, -0.44112518429756165, -0.32430770993232727, 0.01625806838274002, -0.04061064496636391], "max": [0.1623084545135498, 0.276623398065567, 0.7282686829566956, 3.1935887336730957, 0.0017033314798027277, -0.006695504765957594, 0.03983234986662865, -0.019150380045175552], "mean": [0.06072365120053291, 0.04378025233745575, 0.6080031394958496, 3.1358683109283447, -0.27386531233787537, -0.16585059463977814, 0.028610769659280777, -0.030185813084244728], "std": [0.05324731022119522, 0.16493606567382812, 0.08388891071081161, 0.03322383016347885, 0.12180398404598236, 0.07687162607908249, 0.009570072405040264, 0.008613199926912785], "count": [247]}, "action": {"min": [-0.5651785731315613, -0.7178571224212646, -0.7848214507102966, -0.03321428596973419, -0.09428571164608002, -0.16821429133415222, 0.0], "max": [0.8517857193946838, 0.9026785492897034, 0.9375, 0.04928571358323097, 0.09214285761117935, 0.09000000357627869, 1.0], "mean": [0.0015399267431348562, 0.08774220943450928, -0.03535277768969536, 0.0023770963307470083, 0.006233371794223785, -0.002320708706974983, 0.4858299493789673], "std": [0.31080853939056396, 0.44541090726852417, 0.4905490577220917, 0.011533240787684917, 0.03078380599617958, 0.0447133406996727, 0.49979886412620544], "count": [247]}, "timestamp": {"min": [0.0], "max": [12.3], "mean": [6.1499999999999995], "std": [3.5651086939951773], "count": [247]}, "frame_index": {"min": [0], "max": [246], "mean": [123.0], "std": [71.30217387990355], "count": [247]}, "episode_index": {"min": [215], "max": [215], "mean": [215.0], "std": [0.0], "count": [247]}, "index": {"min": [58226], "max": [58472], "mean": [58349.0], "std": [71.30217387990355], "count": [247]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [247]}}} +{"episode_index": 216, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3406598971497779]], [[0.27609659411860443]], [[0.23684091904584098]]], "std": [[[0.15918224457171656]], [[0.15908527017185878]], [[0.16556943315373912]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32343064311906405]], [[0.27813377470128675]], [[0.24836475746304382]]], "std": [[[0.15667682711142028]], [[0.17180435340892655]], [[0.18247634918840094]]], "count": [100]}, "observation.state": {"min": [-0.10047469288110733, -0.11092627793550491, 0.4465644061565399, 3.0711681842803955, -0.38508129119873047, -0.25198793411254883, 0.01088282372802496, -0.04047465696930885], "max": [0.16326944530010223, 0.15072505176067352, 0.6779241561889648, 3.2104780673980713, 0.0012643295340240002, -0.040068551898002625, 0.03985195234417915, -0.01388922892510891], "mean": [0.008965236134827137, 0.0329633429646492, 0.5516523122787476, 3.1415467262268066, -0.19227376580238342, -0.15036864578723907, 0.029547957703471184, -0.028605718165636063], "std": [0.09465742856264114, 0.08966634422540665, 0.06792312860488892, 0.03306863084435463, 0.11781235039234161, 0.0559721514582634, 0.009652062319219112, 0.010116737335920334], "count": [232]}, "action": {"min": [-0.6642857193946838, -0.4982142746448517, -0.5973214507102966, -0.040714286267757416, -0.09000000357627869, -0.12214285880327225, 0.0], "max": [0.7232142686843872, 0.4955357015132904, 0.4151785671710968, 0.03857142850756645, 0.07928571105003357, 0.062142856419086456, 1.0], "mean": [0.02906019240617752, 0.03674955293536186, -0.11110300570726395, -0.0007158255320973694, -0.001856527291238308, -0.012048956006765366, 0.44396552443504333], "std": [0.37147414684295654, 0.18734939396381378, 0.26951977610588074, 0.017129503190517426, 0.03904711455106735, 0.04485378414392471, 0.49685007333755493], "count": [232]}, "timestamp": {"min": [0.0], "max": [11.55], "mean": [5.7749999999999995], "std": [3.3486004539210104], "count": [232]}, "frame_index": {"min": [0], "max": [231], "mean": [115.5], "std": [66.97200907842021], "count": [232]}, "episode_index": {"min": [216], "max": [216], "mean": [216.0], "std": [0.0], "count": [232]}, "index": {"min": [58473], "max": [58704], "mean": [58588.5], "std": [66.97200907842021], "count": [232]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [232]}}} +{"episode_index": 217, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5110806477864583]], [[0.47330006318933826]], [[0.4213559552360983]]], "std": [[[0.30925894096396644]], [[0.2793595519895468]], [[0.2485794702033114]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5104871868058747]], [[0.4795522796032476]], [[0.43391879571652875]]], "std": [[[0.3106186016757935]], [[0.2843505426405329]], [[0.26368199986400215]]], "count": [100]}, "observation.state": {"min": [-0.2973514497280121, -0.08466006070375443, 0.9760622382164001, 2.5061445236206055, -2.3254663944244385, -1.3574362993240356, 0.00906282663345337, -0.039918817579746246], "max": [0.04235976189374924, 0.2595422863960266, 1.2126855850219727, 3.325373649597168, 0.2900407612323761, -0.08626080304384232, 0.04000905156135559, -0.009111132472753525], "mean": [-0.07384887337684631, 0.07341665029525757, 1.0853902101516724, 2.95550799369812, -1.528122901916504, -0.8532607555389404, 0.03214522823691368, -0.03205230087041855], "std": [0.09763845056295395, 0.10900307446718216, 0.06877164542675018, 0.2618308663368225, 0.8307809233665466, 0.4029940068721771, 0.012879821471869946, 0.012717222794890404], "count": [271]}, "action": {"min": [-0.8410714268684387, -0.6294642686843872, -0.7071428298950195, -0.1339285671710968, -0.1510714292526245, -0.29678571224212646, 0.0], "max": [0.9160714149475098, 0.8223214149475098, 0.6991071701049805, 0.17678570747375488, 0.22607143223285675, 0.21214285492897034, 1.0], "mean": [0.04083090275526047, 0.1123121827840805, -0.04352924972772598, 0.008120719343423843, 0.003977338317781687, 0.003400081768631935, 0.7564575672149658], "std": [0.39387863874435425, 0.317099004983902, 0.29519426822662354, 0.06072098761796951, 0.07861551642417908, 0.12434081733226776, 0.42922040820121765], "count": [271]}, "timestamp": {"min": [0.0], "max": [13.5], "mean": [6.75], "std": [3.911521443121589], "count": [271]}, "frame_index": {"min": [0], "max": [270], "mean": [135.0], "std": [78.23042886243178], "count": [271]}, "episode_index": {"min": [217], "max": [217], "mean": [217.0], "std": [0.0], "count": [271]}, "index": {"min": [58705], "max": [58975], "mean": [58840.0], "std": [78.23042886243178], "count": [271]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [271]}}} +{"episode_index": 218, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[0.9882352941176471]]], "mean": [[[0.5906009850595512]], [[0.5541577914368873]], [[0.5198218515433517]]], "std": [[[0.2453464357271215]], [[0.22576940916911525]], [[0.2054156959679076]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5415553499109605]], [[0.5062261149088542]], [[0.45727054072361367]]], "std": [[[0.29965615349998787]], [[0.2739216182934529]], [[0.25456787733383374]]], "count": [100]}, "observation.state": {"min": [-0.21548181772232056, -0.04910631850361824, 0.9280539751052856, 2.1539580821990967, -0.29380059242248535, -0.09118513017892838, 0.0019511205609887838, -0.04000655189156532], "max": [0.04426389932632446, 0.20862562954425812, 1.1697330474853516, 3.198439836502075, 2.7315268516540527, 0.5602071285247803, 0.04043200612068176, -0.008717850781977177], "mean": [-0.08622961491346359, 0.09344504028558731, 1.0500274896621704, 2.7184505462646484, 1.3470796346664429, 0.2905036509037018, 0.028621599078178406, -0.029046541079878807], "std": [0.10135108232498169, 0.09725655615329742, 0.08147280663251877, 0.3879419267177582, 1.0840197801589966, 0.202163428068161, 0.01308173593133688, 0.012872411869466305], "count": [245]}, "action": {"min": [-0.2705357074737549, -0.8383928537368774, -0.824999988079071, -0.14785714447498322, -0.17892856895923615, -0.0803571417927742, 0.0], "max": [0.6080357432365417, 0.7044642567634583, 0.9375, 0.13500000536441803, 0.1435714215040207, 0.375, 1.0], "mean": [0.0572449155151844, 0.04716471582651138, -0.0843476876616478, -0.0006472314707934856, 0.001482507330365479, 0.06585565209388733, 0.6163265109062195], "std": [0.19217005372047424, 0.30935052037239075, 0.3917861580848694, 0.04577316343784332, 0.06933651864528656, 0.10561526566743851, 0.486280232667923], "count": [245]}, "timestamp": {"min": [0.0], "max": [12.2], "mean": [6.1], "std": [3.5362409420173844], "count": [245]}, "frame_index": {"min": [0], "max": [244], "mean": [122.0], "std": [70.7248188403477], "count": [245]}, "episode_index": {"min": [218], "max": [218], "mean": [218.0], "std": [0.0], "count": [245]}, "index": {"min": [58976], "max": [59220], "mean": [59098.0], "std": [70.7248188403477], "count": [245]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [245]}}} +{"episode_index": 219, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.310269806506587]], [[0.24823006364411]], [[0.20955536726409316]]], "std": [[[0.1413254324974243]], [[0.1315194239961195]], [[0.13432429559906237]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3176824879365809]], [[0.2703436315199908]], [[0.23570623121074602]]], "std": [[[0.1583170316211299]], [[0.17258039201623723]], [[0.18212174214205154]]], "count": [100]}, "observation.state": {"min": [-0.07630090415477753, -0.16737490892410278, 0.48228156566619873, 3.0664188861846924, -0.3572956919670105, -0.27906474471092224, 0.0260121151804924, -0.04061078652739525], "max": [0.02978716418147087, 0.3056224584579468, 0.737454354763031, 3.2071855068206787, -0.0015338117955252528, 0.3323429822921753, 0.03990817442536354, -0.03158944472670555], "mean": [-0.023422405123710632, 0.05662522464990616, 0.6282779574394226, 3.1281120777130127, -0.23548908531665802, -0.07775522768497467, 0.033272452652454376, -0.03659403696656227], "std": [0.0327213853597641, 0.15060871839523315, 0.07418624311685562, 0.03859318792819977, 0.1080702394247055, 0.13517358899116516, 0.0056833866983652115, 0.0028789083007723093], "count": [267]}, "action": {"min": [-0.43660715222358704, -0.8517857193946838, -0.6616071462631226, -0.051428571343421936, -0.12214285880327225, -0.056785713881254196, 0.0], "max": [0.46071428060531616, 0.8035714030265808, 0.9375, 0.07928571105003357, 0.07392857223749161, 0.04714285582304001, 1.0], "mean": [0.0185493566095829, 0.08194221556186676, -0.024889664724469185, 0.0006902084569446743, -0.004406099673360586, -0.006757624913007021, 0.5056179761886597], "std": [0.1728687882423401, 0.40933549404144287, 0.4475475549697876, 0.02214699052274227, 0.039782602339982986, 0.020724870264530182, 0.49996888637542725], "count": [267]}, "timestamp": {"min": [0.0], "max": [13.3], "mean": [6.65], "std": [3.8537860172389786], "count": [267]}, "frame_index": {"min": [0], "max": [266], "mean": [133.0], "std": [77.07572034477957], "count": [267]}, "episode_index": {"min": [219], "max": [219], "mean": [219.0], "std": [0.0], "count": [267]}, "index": {"min": [59221], "max": [59487], "mean": [59354.0], "std": [77.07572034477957], "count": [267]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [267]}}} +{"episode_index": 220, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3555390864353554]], [[0.290920846378102]], [[0.2496205073337929]]], "std": [[[0.16680889709147295]], [[0.16878152071117292]], [[0.17218129196575355]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3255499590705423]], [[0.2803641082165288]], [[0.25069651884191174]]], "std": [[[0.1604531874446315]], [[0.17605667306160153]], [[0.18683578724213104]]], "count": [100]}, "observation.state": {"min": [-0.12916265428066254, -0.14183974266052246, 0.4468015432357788, 3.0781328678131104, -0.23708567023277283, -0.27285236120224, 0.0028845348861068487, -0.039813876152038574], "max": [0.187931627035141, 0.1340249627828598, 0.6735000014305115, 3.2257702350616455, 0.3050414025783539, 0.24436070024967194, 0.039907537400722504, -0.003533832496032119], "mean": [0.02050725370645523, 0.011465223506093025, 0.5558090209960938, 3.1521947383880615, 0.06482075899839401, -0.06291230767965317, 0.024297794327139854, -0.02160991169512272], "std": [0.1016521081328392, 0.08950884640216827, 0.07325621694326401, 0.04194822907447815, 0.16673918068408966, 0.10826031863689423, 0.01549797784537077, 0.015339357778429985], "count": [275]}, "action": {"min": [-0.5678571462631226, -0.4714285731315613, -0.5517857074737549, -0.06535714119672775, -0.12535713613033295, -0.09107142686843872, 0.0], "max": [0.675000011920929, 0.47678571939468384, 0.5544642806053162, 0.04714285582304001, 0.10499999672174454, 0.1039285734295845, 1.0], "mean": [0.0519934818148613, 0.030993513762950897, -0.08062989264726639, 4.675355739891529e-05, -0.006479221396148205, -0.008559738285839558, 0.4000000059604645], "std": [0.33924156427383423, 0.1888366937637329, 0.27718794345855713, 0.02073567733168602, 0.0450529083609581, 0.049150820821523666, 0.4898981750011444], "count": [275]}, "timestamp": {"min": [0.0], "max": [13.7], "mean": [6.85], "std": [3.9692568573978684], "count": [275]}, "frame_index": {"min": [0], "max": [274], "mean": [137.0], "std": [79.38513714795737], "count": [275]}, "episode_index": {"min": [220], "max": [220], "mean": [220.0], "std": [0.0], "count": [275]}, "index": {"min": [59488], "max": [59762], "mean": [59625.0], "std": [79.38513714795737], "count": [275]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [275]}}} +{"episode_index": 221, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3314912863338695]], [[0.2758457629633885]], [[0.24042185645009956]]], "std": [[[0.15967160974053876]], [[0.15819125557437028]], [[0.16011098667368312]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3196862092859605]], [[0.27518539428710936]], [[0.24262023447074144]]], "std": [[[0.15957274443751365]], [[0.17570977116386832]], [[0.18453076710289665]]], "count": [100]}, "observation.state": {"min": [-0.11112644523382187, -0.0942070260643959, 0.4498875141143799, 2.9584741592407227, -0.8678998351097107, -0.5831679105758667, 0.02285105362534523, -0.04051584005355835], "max": [0.10481274873018265, 0.29434335231781006, 0.7113391757011414, 3.2810864448547363, 0.00017095895600505173, 0.16082972288131714, 0.03997838497161865, -0.016556942835450172], "mean": [-0.01141245849430561, 0.08925861865282059, 0.5999892354011536, 3.1393234729766846, -0.4617953896522522, -0.13390137255191803, 0.03301892802119255, -0.03391154855489731], "std": [0.06388147175312042, 0.12368520349264145, 0.0734686404466629, 0.08780400454998016, 0.31815698742866516, 0.23393718898296356, 0.006731604691594839, 0.008289658464491367], "count": [274]}, "action": {"min": [-0.47678571939468384, -0.6508928537368774, -0.5839285850524902, -0.14785714447498322, -0.1510714292526245, -0.15535713732242584, 0.0], "max": [0.6080357432365417, 0.8812500238418579, 0.9375, 0.09428571164608002, 0.21535713970661163, 0.17571428418159485, 1.0], "mean": [0.025065191090106964, 0.06301486492156982, -0.029708702117204666, 0.011261732317507267, -0.000531804165802896, -0.009025024250149727, 0.5583941340446472], "std": [0.24093391001224518, 0.37498739361763, 0.4363747239112854, 0.03245924413204193, 0.07210955023765564, 0.06335072964429855, 0.4965784549713135], "count": [274]}, "timestamp": {"min": [0.0], "max": [13.65], "mean": [6.825], "std": [3.9548230048890938], "count": [274]}, "frame_index": {"min": [0], "max": [273], "mean": [136.5], "std": [79.09646009778187], "count": [274]}, "episode_index": {"min": [221], "max": [221], "mean": [221.0], "std": [0.0], "count": [274]}, "index": {"min": [59763], "max": [60036], "mean": [59899.5], "std": [79.09646009778187], "count": [274]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [274]}}} +{"episode_index": 222, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32469302966547947]], [[0.2688100867177926]], [[0.2346253859576057]]], "std": [[[0.14393048543693063]], [[0.14238797583113247]], [[0.14801266711667077]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31997668217677694]], [[0.27568623860677083]], [[0.24310677861232383]]], "std": [[[0.1576329588835485]], [[0.17378338410490693]], [[0.18255015267212046]]], "count": [100]}, "observation.state": {"min": [-0.11965945363044739, -0.1296907216310501, 0.44793978333473206, 3.083446502685547, -0.33190903067588806, -0.36701536178588867, 0.021218452602624893, -0.039847686886787415], "max": [0.06838878989219666, 0.2535157799720764, 0.6881990432739258, 3.2719662189483643, 0.005244601517915726, 0.044991105794906616, 0.03996662423014641, -0.02080225571990013], "mean": [-0.015595205128192902, 0.0850047841668129, 0.5980663895606995, 3.1429691314697266, -0.19900980591773987, -0.13333453238010406, 0.031590793281793594, -0.034912727773189545], "std": [0.049184512346982956, 0.12817557156085968, 0.06659339368343353, 0.051892321556806564, 0.1138160303235054, 0.1093352660536766, 0.007717987522482872, 0.007302156183868647], "count": [243]}, "action": {"min": [-0.35624998807907104, -0.6267856955528259, -0.6187499761581421, -0.07178571075201035, -0.07607142627239227, -0.09428571164608002, 0.0], "max": [0.5276785492897034, 0.8357142806053162, 0.9375, 0.06857142597436905, 0.14571428298950195, 0.09107142686843872, 1.0], "mean": [0.025529101490974426, 0.07616844773292542, -0.01391094271093607, 0.002134039532393217, 0.0028924166690558195, -0.0014373899903148413, 0.5308641791343689], "std": [0.21563059091567993, 0.38760605454444885, 0.4326017200946808, 0.026176054030656815, 0.044205281883478165, 0.03321494534611702, 0.4990469217300415], "count": [243]}, "timestamp": {"min": [0.0], "max": [12.1], "mean": [6.05], "std": [3.507373186113315], "count": [243]}, "frame_index": {"min": [0], "max": [242], "mean": [121.0], "std": [70.14746372226631], "count": [243]}, "episode_index": {"min": [222], "max": [222], "mean": [222.0], "std": [0.0], "count": [243]}, "index": {"min": [60037], "max": [60279], "mean": [60158.0], "std": [70.14746372226631], "count": [243]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [243]}}} +{"episode_index": 223, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33477170637542125]], [[0.2722941260244332]], [[0.23327358769435508]]], "std": [[[0.12795615173957453]], [[0.12495327787274484]], [[0.12825391374815429]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32589678237017466]], [[0.2815660825243183]], [[0.24893111883425245]]], "std": [[[0.1618611917169901]], [[0.1793568118906668]], [[0.18871449083452793]]], "count": [100]}, "observation.state": {"min": [-0.15110187232494354, -0.10521524399518967, 0.44935691356658936, 3.0743608474731445, -0.4342660903930664, -0.12882055342197418, 0.02095099911093712, -0.03984316810965538], "max": [0.07477279007434845, 0.24705682694911957, 0.7116954326629639, 3.2485170364379883, -0.0016326309414580464, 0.2330043762922287, 0.039902910590171814, -0.021090125665068626], "mean": [-0.013941528275609016, 0.08454055339097977, 0.6083530783653259, 3.1710526943206787, -0.29763221740722656, 0.04338162764906883, 0.03275036811828613, -0.032990872859954834], "std": [0.06827738881111145, 0.11833466589450836, 0.07160679250955582, 0.04508962109684944, 0.10970383137464523, 0.1066296249628067, 0.0073497542180120945, 0.007188812363892794], "count": [227]}, "action": {"min": [-0.5464285612106323, -0.9348214268684387, -0.7982142567634583, -0.07285714149475098, -0.0771428570151329, -0.08571428805589676, 0.0], "max": [0.8116071224212646, 0.8919642567634583, 0.9375, 0.11785714328289032, 0.07607142627239227, 0.07500000298023224, 1.0], "mean": [0.03346443921327591, 0.07409142702817917, -0.014490267261862755, 0.005144745577126741, -0.0005994339589960873, -0.00472938921302557, 0.5330396294593811], "std": [0.2878594994544983, 0.4411391615867615, 0.4909575879573822, 0.02959420531988144, 0.027323197573423386, 0.026131663471460342, 0.4989069700241089], "count": [227]}, "timestamp": {"min": [0.0], "max": [11.3], "mean": [5.6499999999999995], "std": [3.2764309850811753], "count": [227]}, "frame_index": {"min": [0], "max": [226], "mean": [113.0], "std": [65.5286197016235], "count": [227]}, "episode_index": {"min": [223], "max": [223], "mean": [223.0], "std": [0.0], "count": [227]}, "index": {"min": [60280], "max": [60506], "mean": [60393.0], "std": [65.5286197016235], "count": [227]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [227]}}} +{"episode_index": 224, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35020613128063727]], [[0.284805632946538]], [[0.24326031913009344]]], "std": [[[0.1631770809816084]], [[0.16339791885393518]], [[0.16638055959016604]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32535342287549784]], [[0.28082639267865345]], [[0.2513306765088848]]], "std": [[[0.16141396381659853]], [[0.17662615057666337]], [[0.18729051274206832]]], "count": [100]}, "observation.state": {"min": [-0.11585645377635956, -0.13809284567832947, 0.4479343593120575, 2.9373018741607666, -0.07162370532751083, -0.30139994621276855, 0.0019375954288989305, -0.03983384743332863], "max": [0.20085979998111725, 0.11459364742040634, 0.6802669763565063, 3.1994099617004395, 0.30759909749031067, -0.059802860021591187, 0.03982848301529884, -0.0015818180982023478], "mean": [0.024633536115288734, 0.0014504538848996162, 0.5493462085723877, 3.095690965652466, 0.08624647557735443, -0.14152418076992035, 0.023143863305449486, -0.022448105737566948], "std": [0.10825205594301224, 0.08170907199382782, 0.06619606167078018, 0.0727396160364151, 0.11601689457893372, 0.0544651560485363, 0.015556530095636845, 0.01575664058327675], "count": [235]}, "action": {"min": [-0.8196428418159485, -0.5089285969734192, -0.6160714030265808, -0.07392857223749161, -0.09857142716646194, -0.06750000268220901, 0.0], "max": [0.9241071343421936, 0.3776785731315613, 0.5116071701049805, 0.11892857402563095, 0.08464285731315613, 0.06750000268220901, 1.0], "mean": [0.032507605850696564, 0.03447946161031723, -0.10568387806415558, -0.001504559419117868, 6.838799163233489e-05, -0.0018191492417827249, 0.4127659499645233], "std": [0.4273901879787445, 0.18637995421886444, 0.2817755937576294, 0.0376659631729126, 0.03996579721570015, 0.034527894109487534, 0.4923316240310669], "count": [235]}, "timestamp": {"min": [0.0], "max": [11.7], "mean": [5.85], "std": [3.391902121229326], "count": [235]}, "frame_index": {"min": [0], "max": [234], "mean": [117.0], "std": [67.83804242458652], "count": [235]}, "episode_index": {"min": [224], "max": [224], "mean": [224.0], "std": [0.0], "count": [235]}, "index": {"min": [60507], "max": [60741], "mean": [60624.0], "std": [67.83804242458652], "count": [235]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [235]}}} +{"episode_index": 225, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5637975852816712]], [[0.5294520538928462]], [[0.49376558730181525]]], "std": [[[0.26380191533412506]], [[0.24244013719302687]], [[0.22134341102024435]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.540677127015357]], [[0.5058497487984452]], [[0.45715749284332874]]], "std": [[[0.3020836404421053]], [[0.2767381513118652]], [[0.2578236769486447]]], "count": [100]}, "observation.state": {"min": [-0.22028574347496033, -0.0524161234498024, 0.927863597869873, 1.4615164995193481, -0.2966178357601166, -0.5485999584197998, 0.009441474452614784, -0.040013011544942856], "max": [0.04389926418662071, 0.20576699078083038, 1.173277735710144, 3.144878625869751, 3.150125026702881, 0.9043704867362976, 0.04019395262002945, -0.004584615584462881], "mean": [-0.08982005715370178, 0.09065484255552292, 1.0391664505004883, 2.3850371837615967, 1.608878254890442, 0.3192504644393921, 0.028375012800097466, -0.027439551427960396], "std": [0.10890208184719086, 0.09709732979536057, 0.0802847295999527, 0.5844770669937134, 1.2154828310012817, 0.4877401888370514, 0.012743090279400349, 0.013541774824261665], "count": [257]}, "action": {"min": [-0.26249998807907104, -0.7473214268684387, -0.6883928775787354, -0.07071428745985031, -0.14571428298950195, -0.08142857253551483, 0.0], "max": [0.7419642806053162, 0.6857143044471741, 0.768750011920929, 0.23571428656578064, 0.25928571820259094, 0.375, 1.0], "mean": [0.07084143906831741, 0.06689130514860153, -0.09509450942277908, 0.021420232951641083, 0.008700667880475521, 0.07980268448591232, 0.5836575627326965], "std": [0.20215961337089539, 0.3017013967037201, 0.36704787611961365, 0.05359337106347084, 0.08021209388971329, 0.11504660546779633, 0.49295154213905334], "count": [257]}, "timestamp": {"min": [0.0], "max": [12.8], "mean": [6.399999999999999], "std": [3.7094473981982814], "count": [257]}, "frame_index": {"min": [0], "max": [256], "mean": [128.0], "std": [74.18894796396563], "count": [257]}, "episode_index": {"min": [225], "max": [225], "mean": [225.0], "std": [0.0], "count": [257]}, "index": {"min": [60742], "max": [60998], "mean": [60870.0], "std": [74.18894796396563], "count": [257]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [257]}}} +{"episode_index": 226, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5445410210104549]], [[0.5029988858092065]], [[0.4492003514906939]]], "std": [[[0.30483370238766966]], [[0.27527215845137676]], [[0.24559500102593343]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5120266394521675]], [[0.48094721954944086]], [[0.435265619614545]]], "std": [[[0.3109345431253475]], [[0.28474916923571736]], [[0.26421219293696113]]], "count": [100]}, "observation.state": {"min": [-0.35152667760849, -0.0532410591840744, 0.9657957553863525, 2.0400049686431885, -2.7486188411712646, -1.2078156471252441, 0.00722318422049284, -0.04001367837190628], "max": [0.021979670971632004, 0.29484260082244873, 1.1634242534637451, 3.370788812637329, -0.0045854696072638035, 0.19488351047039032, 0.04001374915242195, -0.008857912383973598], "mean": [-0.0816274955868721, 0.09065130352973938, 1.0610941648483276, 2.712454319000244, -2.0682759284973145, -0.6608214378356934, 0.03148256242275238, -0.031623419374227524], "std": [0.10552981495857239, 0.11289999634027481, 0.0639255940914154, 0.3528095781803131, 0.7413609623908997, 0.39368194341659546, 0.013240775093436241, 0.012957856059074402], "count": [248]}, "action": {"min": [-0.8089285492897034, -0.6910714507102966, -0.6857143044471741, -0.1371428519487381, -0.15535713732242584, -0.29678571224212646, 0.0], "max": [0.9375, 0.8544642925262451, 0.6455357074737549, 0.20892857015132904, 0.18642857670783997, 0.20678570866584778, 1.0], "mean": [0.05423026531934738, 0.12095695734024048, -0.044358447194099426, 0.00881768949329853, 0.017777927219867706, -0.02708812616765499, 0.7419354915618896], "std": [0.4381369352340698, 0.32543811202049255, 0.26558423042297363, 0.07427418977022171, 0.07437049597501755, 0.1220426931977272, 0.43756958842277527], "count": [248]}, "timestamp": {"min": [0.0], "max": [12.35], "mean": [6.175], "std": [3.579542568541405], "count": [248]}, "frame_index": {"min": [0], "max": [247], "mean": [123.5], "std": [71.5908513708281], "count": [248]}, "episode_index": {"min": [226], "max": [226], "mean": [226.0], "std": [0.0], "count": [248]}, "index": {"min": [60999], "max": [61246], "mean": [61122.5], "std": [71.5908513708281], "count": [248]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [248]}}} +{"episode_index": 227, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[1.0]], [[1.0]]], "mean": [[[0.3586498066023284]], [[0.2775880402209712]], [[0.1740530419443168]]], "std": [[[0.21020399770882725]], [[0.15576554361304637]], [[0.09919058938888008]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.984313725490196]], [[0.9764705882352941]]], "mean": [[[0.3547234598795573]], [[0.2991033085841759]], [[0.22390234434838388]]], "std": [[[0.1425580468016667]], [[0.13376817919105555]], [[0.14342223588015152]]], "count": [100]}, "observation.state": {"min": [-0.42804932594299316, -0.1800466924905777, 0.9872622489929199, 2.2570979595184326, -2.1959006786346436, -0.14176875352859497, 0.014021669514477253, -0.0398816242814064], "max": [-0.1465449184179306, 0.14413896203041077, 1.2794584035873413, 3.1482677459716797, -0.0008592874510213733, -0.023450059816241264, 0.039882875978946686, -0.01443902775645256], "mean": [-0.25535690784454346, 0.006383030209690332, 1.1636993885040283, 2.8930628299713135, -1.0152593851089478, -0.07771000266075134, 0.02327268198132515, -0.023102035745978355], "std": [0.09210969507694244, 0.11940110474824905, 0.08800093829631805, 0.2836809456348419, 0.7044326066970825, 0.02908926270902157, 0.011584341526031494, 0.011663789860904217], "count": [167]}, "action": {"min": [-0.4526785612106323, -0.4714285731315613, -0.6883928775787354, -0.03285714238882065, -0.029285714030265808, -0.15214285254478455, 0.0], "max": [0.4848214387893677, 0.44732141494750977, 0.9375, 0.012857142835855484, 0.041428569704294205, -0.0, 1.0], "mean": [-0.08658041059970856, -0.07585008442401886, -0.05130986496806145, -0.0004662104765884578, 0.00350299384444952, -0.0751839205622673, 0.31137725710868835], "std": [0.25643905997276306, 0.2511093020439148, 0.42243802547454834, 0.004729598760604858, 0.014162694104015827, 0.04342157393693924, 0.4630564749240875], "count": [167]}, "timestamp": {"min": [0.0], "max": [8.3], "mean": [4.1499999999999995], "std": [2.41039415863879], "count": [167]}, "frame_index": {"min": [0], "max": [166], "mean": [83.0], "std": [48.2078831727758], "count": [167]}, "episode_index": {"min": [227], "max": [227], "mean": [227.0], "std": [0.0], "count": [167]}, "index": {"min": [61247], "max": [61413], "mean": [61330.0], "std": [48.2078831727758], "count": [167]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [167]}}} +{"episode_index": 228, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.9725490196078431]], [[0.9803921568627451]]], "mean": [[[0.32656526273839614]], [[0.25486131735409007]], [[0.16397076655369178]]], "std": [[[0.2134255742696374]], [[0.15858811416048207]], [[0.10257703741968491]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9921568627450981]], [[0.9921568627450981]]], "mean": [[[0.3535797609815411]], [[0.29824103202071844]], [[0.2235005989822687]]], "std": [[[0.1426708211902304]], [[0.13352092354753187]], [[0.14273598614729907]]], "count": [100]}, "observation.state": {"min": [-0.451366662979126, -0.16018566489219666, 0.9868879318237305, 2.0608975887298584, -2.245319128036499, -0.3670440912246704, 0.008358822204172611, -0.03993554040789604], "max": [-0.20073701441287994, 0.1619967669248581, 1.274464726448059, 3.145319938659668, -0.0014508161693811417, 0.02623870223760605, 0.03992259129881859, -0.01501695066690445], "mean": [-0.27978259325027466, 0.010560988448560238, 1.1493070125579834, 2.8251662254333496, -1.1745078563690186, -0.16310802102088928, 0.023280195891857147, -0.02458043582737446], "std": [0.07281699031591415, 0.1282726526260376, 0.08763927966356277, 0.3372476100921631, 0.6796094179153442, 0.13738113641738892, 0.012253271415829659, 0.011351881548762321], "count": [167]}, "action": {"min": [-0.6267856955528259, -0.7151785492897034, -0.7767857313156128, -0.07857143133878708, -0.02500000037252903, -0.16285714507102966, 0.0], "max": [0.3455357253551483, 0.5169642567634583, 0.9375, 0.040714286267757416, 0.09000000357627869, -0.010714286006987095, 1.0], "mean": [-0.08544161915779114, -0.08114305883646011, -0.05682742968201637, -0.003430282697081566, 0.01538066565990448, -0.08070572465658188, 0.3353293538093567], "std": [0.2112400233745575, 0.3033372461795807, 0.4054015278816223, 0.022576360031962395, 0.024952447041869164, 0.04066725820302963, 0.4721055328845978], "count": [167]}, "timestamp": {"min": [0.0], "max": [8.3], "mean": [4.1499999999999995], "std": [2.41039415863879], "count": [167]}, "frame_index": {"min": [0], "max": [166], "mean": [83.0], "std": [48.2078831727758], "count": [167]}, "episode_index": {"min": [228], "max": [228], "mean": [228.0], "std": [0.0], "count": [167]}, "index": {"min": [61414], "max": [61580], "mean": [61497.0], "std": [48.2078831727758], "count": [167]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [167]}}} +{"episode_index": 229, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.996078431372549]], [[0.9921568627450981]]], "mean": [[[0.3225282568838082]], [[0.2503474869073606]], [[0.15957690010818779]]], "std": [[[0.2058431850773377]], [[0.1531782904733286]], [[0.10076975760771924]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9921568627450981]], [[1.0]]], "mean": [[[0.35529057222254135]], [[0.2985010160558364]], [[0.22141379621917126]]], "std": [[[0.13972720378204692]], [[0.13050646592572654]], [[0.14035253737394915]]], "count": [100]}, "observation.state": {"min": [-0.4828203022480011, -0.16112543642520905, 0.9891561269760132, 2.268770456314087, -2.358185291290283, -0.3413580358028412, 0.01132107526063919, -0.03981718793511391], "max": [-0.15741245448589325, 0.15224464237689972, 1.249129295349121, 3.1756227016448975, 0.012339131906628609, 0.22686351835727692, 0.03988692909479141, -0.01467976439744234], "mean": [-0.3047434985637665, -0.04149419814348221, 1.1551693677902222, 2.803069591522217, -1.0593366622924805, -0.13899123668670654, 0.019741646945476532, -0.021786928176879883], "std": [0.09395764768123627, 0.11215687543153763, 0.06717251241207123, 0.3525395095348358, 0.9288632869720459, 0.1633959412574768, 0.011066466569900513, 0.009884433820843697], "count": [216]}, "action": {"min": [-0.4124999940395355, -0.7982142567634583, -0.6910714507102966, -0.06428571790456772, -0.12857143580913544, -0.2014285773038864, 0.0], "max": [0.5705357193946838, 0.5866071581840515, 0.9375, 0.034285712987184525, 0.09142857044935226, 0.055714286863803864, 1.0], "mean": [-0.07808779180049896, -0.05279018357396126, -0.044258445501327515, -0.006590607110410929, -0.008455689065158367, -0.057602521032094955, 0.21759259700775146], "std": [0.21272973716259003, 0.268133282661438, 0.3280823528766632, 0.020269466564059258, 0.04360997676849365, 0.06883261352777481, 0.4126095771789551], "count": [216]}, "timestamp": {"min": [0.0], "max": [10.75], "mean": [5.375], "std": [3.1176580419710347], "count": [216]}, "frame_index": {"min": [0], "max": [215], "mean": [107.5], "std": [62.353160839420696], "count": [216]}, "episode_index": {"min": [229], "max": [229], "mean": [229.0], "std": [0.0], "count": [216]}, "index": {"min": [61581], "max": [61796], "mean": [61688.5], "std": [62.353160839420696], "count": [216]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [216]}}} +{"episode_index": 230, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5754410932952283]], [[0.5305223675896139]], [[0.4733988773121553]]], "std": [[[0.29703542838937214]], [[0.2684373897701915]], [[0.23891813655208227]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.51407152781767]], [[0.48235031726313576]], [[0.4359802473479626]]], "std": [[[0.3099812953906429]], [[0.2834258410686305]], [[0.26246900891036395]]], "count": [100]}, "observation.state": {"min": [-0.382662832736969, -0.07938714325428009, 0.9570441842079163, 1.8613649606704712, -3.0875771045684814, -0.7540262341499329, 0.003047836944460869, -0.03996416553854942], "max": [0.01252127904444933, 0.25789305567741394, 1.1741125583648682, 3.2663588523864746, 0.009583115577697754, -0.06502452492713928, 0.04001498594880104, -0.008402837440371513], "mean": [-0.0864892452955246, 0.09333445876836777, 1.0555046796798706, 2.5759122371673584, -2.1595518589019775, -0.4561907649040222, 0.03242023289203644, -0.032953038811683655], "std": [0.11023639142513275, 0.11806467175483704, 0.06889433413743973, 0.3964700996875763, 0.8032678961753845, 0.18598416447639465, 0.012990236282348633, 0.011846313253045082], "count": [278]}, "action": {"min": [-0.6776785850524902, -0.4660714268684387, -0.8303571343421936, -0.12321428209543228, -0.14571428298950195, -0.3642857074737549, 0.0], "max": [0.9375, 0.8892857432365417, 0.4982142746448517, 0.14142857491970062, 0.2014285773038864, 0.20999999344348907, 1.0], "mean": [0.030157990753650665, 0.12419705837965012, -0.05532500892877579, 0.003522613551467657, 0.00885277334600687, -0.03186534345149994, 0.7733812928199768], "std": [0.4044293463230133, 0.32521095871925354, 0.26207414269447327, 0.05550037696957588, 0.05687080696225166, 0.14165544509887695, 0.41864439845085144], "count": [278]}, "timestamp": {"min": [0.0], "max": [13.85], "mean": [6.925000000000001], "std": [4.012558410789804], "count": [278]}, "frame_index": {"min": [0], "max": [277], "mean": [138.5], "std": [80.25116821579608], "count": [278]}, "episode_index": {"min": [230], "max": [230], "mean": [230.0], "std": [0.0], "count": [278]}, "index": {"min": [61797], "max": [62074], "mean": [61935.5], "std": [80.25116821579608], "count": [278]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [278]}}} +{"episode_index": 231, "stats": {"observation.images.wrist_image": {"min": [[[0.011764705882352941]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3526560704848346]], [[0.2895520558076746]], [[0.2458780523561964]]], "std": [[[0.14927665972154988]], [[0.15243571749681753]], [[0.1591209092161042]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3171465579762178]], [[0.2690755687040441]], [[0.23626653155158547]]], "std": [[[0.15160127876059323]], [[0.16538576930156512]], [[0.17395943675645956]]], "count": [100]}, "observation.state": {"min": [-0.12295552343130112, -0.25616613030433655, 0.5107691884040833, 2.9991698265075684, -0.2310972362756729, -0.2408199906349182, 0.0013582620304077864, -0.03989623859524727], "max": [0.03919721767306328, 0.34807026386260986, 0.6790328621864319, 3.1396331787109375, 0.621177613735199, 0.2081155925989151, 0.039909910410642624, -0.003047381294891238], "mean": [-0.031740453094244, -0.013264086097478867, 0.5786517858505249, 3.067526340484619, 0.22808127105236053, -0.048625051975250244, 0.02122739888727665, -0.021531973034143448], "std": [0.03998527303338051, 0.20184162259101868, 0.04786892235279083, 0.03835127502679825, 0.33722779154777527, 0.1322941929101944, 0.017329631373286247, 0.016747385263442993], "count": [266]}, "action": {"min": [-0.47678571939468384, -0.7366071343421936, -0.768750011920929, -0.04821428656578064, -0.12535713613033295, -0.1307142823934555, 0.0], "max": [0.7339285612106323, 0.7633928656578064, 0.6723214387893677, 0.062142856419086456, 0.06750000268220901, 0.10821428894996643, 1.0], "mean": [0.016615206375718117, 0.09536116570234299, -0.046935416758060455, -0.004193073138594627, 0.0016111707082018256, -0.005139632616192102, 0.49248120188713074], "std": [0.24489358067512512, 0.34953394532203674, 0.32019317150115967, 0.014920549467206001, 0.035840027034282684, 0.04916964843869209, 0.49994394183158875], "count": [266]}, "timestamp": {"min": [0.0], "max": [13.25], "mean": [6.625], "std": [3.8393521588934765], "count": [266]}, "frame_index": {"min": [0], "max": [265], "mean": [132.5], "std": [76.78704317786953], "count": [266]}, "episode_index": {"min": [231], "max": [231], "mean": [231.0], "std": [0.0], "count": [266]}, "index": {"min": [62075], "max": [62340], "mean": [62207.5], "std": [76.78704317786953], "count": [266]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [266]}}} +{"episode_index": 232, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3476294029086244]], [[0.2778818640615426]], [[0.23029501761642157]]], "std": [[[0.14741530092913283]], [[0.14234455926589268]], [[0.13543835646008365]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3273885749368106]], [[0.28308256500842527]], [[0.25041703467275583]]], "std": [[[0.16847842802834379]], [[0.1834768490365064]], [[0.193329993374185]]], "count": [100]}, "observation.state": {"min": [-0.059476032853126526, -0.22796685993671417, 0.44665321707725525, 2.91432785987854, -0.30638861656188965, -0.3327746093273163, 0.009366683661937714, -0.03992176428437233], "max": [0.174544557929039, 0.2847997546195984, 0.6806508302688599, 3.1980535984039307, 0.19109317660331726, 0.4107864201068878, 0.03989637643098831, -0.005549255292862654], "mean": [0.07370461523532867, 0.039091791957616806, 0.5911205410957336, 3.1047511100769043, -0.03704727068543434, -0.041919734328985214, 0.026846976950764656, -0.025777339935302734], "std": [0.058201469480991364, 0.17813165485858917, 0.08005131781101227, 0.06859318166971207, 0.14361941814422607, 0.15890878438949585, 0.012273839674890041, 0.01414465717971325], "count": [272]}, "action": {"min": [-0.7848214507102966, -0.7151785492897034, -0.918749988079071, -0.11678571254014969, -0.20357142388820648, -0.09535714238882065, 0.0], "max": [0.7071428298950195, 0.8517857193946838, 0.9375, 0.08785714209079742, 0.17249999940395355, 0.10607142746448517, 1.0], "mean": [0.012142217718064785, 0.08599986881017685, -0.03655458986759186, -0.002816437976434827, -4.726735278381966e-05, -0.006369483657181263, 0.529411792755127], "std": [0.3226129114627838, 0.4329915940761566, 0.454334020614624, 0.03340290114283562, 0.08067812770605087, 0.036381855607032776, 0.4991345703601837], "count": [272]}, "timestamp": {"min": [0.0], "max": [13.55], "mean": [6.7749999999999995], "std": [3.9259552977587506], "count": [272]}, "frame_index": {"min": [0], "max": [271], "mean": [135.5], "std": [78.51910595517501], "count": [272]}, "episode_index": {"min": [232], "max": [232], "mean": [232.0], "std": [0.0], "count": [272]}, "index": {"min": [62341], "max": [62612], "mean": [62476.5], "std": [78.51910595517501], "count": [272]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [272]}}} +{"episode_index": 233, "stats": {"observation.images.wrist_image": {"min": [[[0.00784313725490196]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35190877697514555]], [[0.2849840656355315]], [[0.23875655230353862]]], "std": [[[0.13432151297187334]], [[0.13734892553008726]], [[0.1444886633832613]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.314433276606541]], [[0.26537557025984226]], [[0.23171479827282476]]], "std": [[[0.14928461440222382]], [[0.16310072900208733]], [[0.1715980765807366]]], "count": [100]}, "observation.state": {"min": [-0.1037139743566513, -0.2863357961177826, 0.5136690735816956, 3.0004212856292725, -0.29828697443008423, -0.08801140636205673, 0.0013335129478946328, -0.03994305804371834], "max": [0.05165235325694084, 0.3697582185268402, 0.6859477162361145, 3.14083194732666, 0.5829305648803711, 0.24911540746688843, 0.039884425699710846, -0.0030935851391404867], "mean": [-0.016254862770438194, 0.020141949877142906, 0.5817464590072632, 3.0621798038482666, 0.04273431375622749, 0.04938226193189621, 0.019525637850165367, -0.020187724381685257], "std": [0.041575413197278976, 0.21884098649024963, 0.049297165125608444, 0.03578779473900795, 0.2667555809020996, 0.08631543070077896, 0.017070498317480087, 0.01649007759988308], "count": [265]}, "action": {"min": [-0.4794642925262451, -0.6535714268684387, -0.5785714387893677, -0.06321428716182709, -0.0771428570151329, -0.08142857253551483, 0.0], "max": [0.5919643044471741, 0.8598214387893677, 0.7017857432365417, 0.07071428745985031, 0.06535714119672775, 0.14249999821186066, 1.0], "mean": [0.01985175348818302, 0.09192047268152237, -0.047557275742292404, -0.0010714285308495164, -0.0036873300559818745, -0.005506737623363733, 0.44528302550315857], "std": [0.22196605801582336, 0.38625451922416687, 0.32413122057914734, 0.01764444261789322, 0.022832205519080162, 0.04501689597964287, 0.49699699878692627], "count": [265]}, "timestamp": {"min": [0.0], "max": [13.2], "mean": [6.6], "std": [3.8249182997810554], "count": [265]}, "frame_index": {"min": [0], "max": [264], "mean": [132.0], "std": [76.49836599562111], "count": [265]}, "episode_index": {"min": [233], "max": [233], "mean": [233.0], "std": [0.0], "count": [265]}, "index": {"min": [62613], "max": [62877], "mean": [62745.0], "std": [76.49836599562111], "count": [265]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [265]}}} +{"episode_index": 234, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3207040991689645]], [[0.26405695896522674]], [[0.2288314244887408]]], "std": [[[0.14357472307868258]], [[0.1399591417874238]], [[0.14555690228004578]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3199465756883808]], [[0.2725492505840227]], [[0.237976333917356]]], "std": [[[0.16019970595825678]], [[0.1747346136322563]], [[0.18443324486603366]]], "count": [100]}, "observation.state": {"min": [-0.12570393085479736, -0.18447014689445496, 0.48357436060905457, 3.0492770671844482, -1.265238881111145, -0.3102702796459198, 0.027887439355254173, -0.039886023849248886], "max": [0.0012788909953087568, 0.3106265664100647, 0.7075845003128052, 3.2495100498199463, 0.37777388095855713, 0.31626516580581665, 0.0399993434548378, -0.03187044709920883], "mean": [-0.05288510397076607, 0.062472861260175705, 0.6149352192878723, 3.156965970993042, -0.17582501471042633, -0.01918225735425949, 0.034405943006277084, -0.03694736585021019], "std": [0.034428492188453674, 0.15899257361888885, 0.06911694258451462, 0.050011858344078064, 0.4220363199710846, 0.14272096753120422, 0.005297081544995308, 0.0026768187526613474], "count": [255]}, "action": {"min": [-0.3241071403026581, -0.8999999761581421, -0.7821428775787354, -0.07071428745985031, -0.2142857164144516, -0.09964285790920258, 0.0], "max": [0.6669642925262451, 0.7875000238418579, 0.9375, 0.12214285880327225, 0.1542857140302658, 0.06642857193946838, 1.0], "mean": [0.037542011588811874, 0.08238446712493896, 0.005346641410142183, 0.009033615700900555, 0.006079832091927528, -0.02289075031876564, 0.572549045085907], "std": [0.185951367020607, 0.4581899642944336, 0.4513033926486969, 0.028542201966047287, 0.07372879236936569, 0.03838968649506569, 0.4947080612182617], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [234], "max": [234], "mean": [234.0], "std": [0.0], "count": [255]}, "index": {"min": [62878], "max": [63132], "mean": [63005.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [255]}}} +{"episode_index": 235, "stats": {"observation.images.wrist_image": {"min": [[[0.00784313725490196]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35421707033643535]], [[0.29022111421472885]], [[0.2467068385703891]]], "std": [[[0.14388212004402431]], [[0.14856536740002224]], [[0.15691388405169077]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31371334958543967]], [[0.26452583163392307]], [[0.23089055618585325]]], "std": [[[0.14891665582802255]], [[0.16223929185122313]], [[0.17061143168169143]]], "count": [100]}, "observation.state": {"min": [-0.13736079633235931, -0.30489382147789, 0.5081534385681152, 3.015848159790039, -0.08395925164222717, -0.13421593606472015, 0.0013751687947660685, -0.03986309841275215], "max": [0.03689029812812805, 0.3312777280807495, 0.6848174929618835, 3.1738390922546387, 0.6693124771118164, 0.1752931773662567, 0.039981409907341, -0.003021481679752469], "mean": [-0.038401711732149124, -0.03393429145216942, 0.5847317576408386, 3.1111743450164795, 0.3056015968322754, -0.001513221999630332, 0.021984850987792015, -0.022315669804811478], "std": [0.04905031993985176, 0.20055972039699554, 0.05000648275017738, 0.039035338908433914, 0.22260510921478271, 0.10245329886674881, 0.017209140583872795, 0.01677144318819046], "count": [247]}, "action": {"min": [-0.5089285969734192, -0.6803571581840515, -0.5866071581840515, -0.029999999329447746, -0.0803571417927742, -0.09535714238882065, 0.0], "max": [0.8464285731315613, 0.7982142567634583, 0.65625, 0.04821428656578064, 0.055714286863803864, 0.15214285254478455, 1.0], "mean": [0.024443311616778374, 0.09360905736684799, -0.04956984519958496, 0.000793811515904963, -0.001795835210941732, -0.0020300731994211674, 0.5141700506210327], "std": [0.2781934440135956, 0.4006677269935608, 0.3307285010814667, 0.0111369788646698, 0.026226818561553955, 0.04932769387960434, 0.4997987449169159], "count": [247]}, "timestamp": {"min": [0.0], "max": [12.3], "mean": [6.1499999999999995], "std": [3.5651086939951773], "count": [247]}, "frame_index": {"min": [0], "max": [246], "mean": [123.0], "std": [71.30217387990355], "count": [247]}, "episode_index": {"min": [235], "max": [235], "mean": [235.0], "std": [0.0], "count": [247]}, "index": {"min": [63133], "max": [63379], "mean": [63256.0], "std": [71.30217387990355], "count": [247]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [247]}}} +{"episode_index": 236, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3438972736433441]], [[0.27653954060872393]], [[0.22962825939702053]]], "std": [[[0.14644817794051468]], [[0.14193094737689613]], [[0.1445180706749021]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31314027973249847]], [[0.26435394586301314]], [[0.2311867556104473]]], "std": [[[0.146821243809197]], [[0.16022076977063618]], [[0.16880213715802603]]], "count": [100]}, "observation.state": {"min": [-0.07970786094665527, -0.2622196078300476, 0.5089297294616699, 3.0197460651397705, -0.7787402868270874, -0.2780647575855255, 0.00302202720195055, -0.03993126004934311], "max": [0.054447393864393234, 0.3860228657722473, 0.684518575668335, 3.318626642227173, 0.386608749628067, 0.16074998676776886, 0.039916690438985825, -0.005390481557697058], "mean": [-0.010916355066001415, 0.0366755947470665, 0.5737845301628113, 3.109487771987915, -0.20182542502880096, -0.07534313201904297, 0.024070635437965393, -0.02477756328880787], "std": [0.04469027742743492, 0.2132810354232788, 0.05078669264912605, 0.0837118849158287, 0.27222588658332825, 0.1232973262667656, 0.014203185215592384, 0.013685664162039757], "count": [279]}, "action": {"min": [-0.5089285969734192, -0.5625, -0.6026785969734192, -0.09321428835391998, -0.12214285880327225, -0.10285714268684387, 0.0], "max": [0.6107142567634583, 0.8276785612106323, 0.5571428537368774, 0.15857142210006714, 0.09749999642372131, 0.11678571254014969, 1.0], "mean": [0.007450074888765812, 0.09601572155952454, -0.0716974213719368, 0.001812597387470305, 0.0003686636919155717, -0.015130567364394665, 0.4767025113105774], "std": [0.21903008222579956, 0.3568821847438812, 0.3022449314594269, 0.04196767136454582, 0.03914709389209747, 0.05289364233613014, 0.49945712089538574], "count": [279]}, "timestamp": {"min": [0.0], "max": [13.9], "mean": [6.95], "std": [4.0269922605670185], "count": [279]}, "frame_index": {"min": [0], "max": [278], "mean": [139.0], "std": [80.53984521134038], "count": [279]}, "episode_index": {"min": [236], "max": [236], "mean": [236.0], "std": [0.0], "count": [279]}, "index": {"min": [63380], "max": [63658], "mean": [63519.0], "std": [80.53984521134038], "count": [279]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [279]}}} +{"episode_index": 237, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3117008888394225]], [[0.2569991921817555]], [[0.22486864516314337]]], "std": [[[0.1501497199806137]], [[0.1452221422602211]], [[0.15034906152654792]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3174847555721507]], [[0.2728958261527267]], [[0.2400781244016161]]], "std": [[[0.15729661542646906]], [[0.17284993253002603]], [[0.1811166973606669]]], "count": [100]}, "observation.state": {"min": [-0.1824009120464325, -0.12641838192939758, 0.4494665563106537, 3.0755133628845215, -0.7773084044456482, -0.4203665852546692, 0.022735558450222015, -0.03996411710977554], "max": [0.10628467053174973, 0.27224764227867126, 0.686953604221344, 3.2062630653381348, 0.00037464677006937563, -0.0057666064240038395, 0.04032551124691963, -0.017700310796499252], "mean": [-0.031023379415273666, 0.0684901550412178, 0.6025046110153198, 3.1277410984039307, -0.3847818970680237, -0.24014195799827576, 0.03341992199420929, -0.03452707827091217], "std": [0.08147690445184708, 0.13038909435272217, 0.07822670787572861, 0.04290948808193207, 0.2330206334590912, 0.11499018222093582, 0.006760353222489357, 0.00793306715786457], "count": [264]}, "action": {"min": [-0.5089285969734192, -0.6642857193946838, -0.6589285731315613, -0.04821428656578064, -0.16607142984867096, -0.14571428298950195, 0.0], "max": [0.8303571343421936, 0.8785714507102966, 0.9375, 0.09535714238882065, 0.12964285910129547, 0.16607142984867096, 1.0], "mean": [0.007183455396443605, 0.07836848497390747, -0.021732976660132408, 0.004326297901570797, 0.001392047037370503, -0.001570619293488562, 0.5871211886405945], "std": [0.3102896213531494, 0.3788738548755646, 0.4287129044532776, 0.019638899713754654, 0.04659479111433029, 0.05598877742886543, 0.4923509657382965], "count": [264]}, "timestamp": {"min": [0.0], "max": [13.15], "mean": [6.575000000000001], "std": [3.810484439892999], "count": [264]}, "frame_index": {"min": [0], "max": [263], "mean": [131.5], "std": [76.20968879786], "count": [264]}, "episode_index": {"min": [237], "max": [237], "mean": [237.0], "std": [0.0], "count": [264]}, "index": {"min": [63659], "max": [63922], "mean": [63790.5], "std": [76.20968879786], "count": [264]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [264]}}} +{"episode_index": 238, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3104307789522059]], [[0.2467076888738894]], [[0.20702671963560815]]], "std": [[[0.1442064821380307]], [[0.1334525376461768]], [[0.13489412835015965]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3181943891936657]], [[0.2708580513748468]], [[0.2363084986069623]]], "std": [[[0.1576192989561115]], [[0.17190323010406383]], [[0.18172468777389753]]], "count": [100]}, "observation.state": {"min": [-0.10212735086679459, -0.1697772741317749, 0.4823034703731537, 2.9106595516204834, -1.3012415170669556, -0.19051316380500793, 0.001319119823165238, -0.039872437715530396], "max": [0.013338994234800339, 0.2887061834335327, 0.7135831713676453, 3.2395167350769043, -0.0023149994667619467, 0.24432195723056793, 0.03996240720152855, -0.0010472554713487625], "mean": [-0.04317891225218773, 0.0557897575199604, 0.6117129325866699, 3.0945844650268555, -0.6408945322036743, 0.00012568618694785982, 0.03431924059987068, -0.03381972387433052], "std": [0.02510627917945385, 0.14816373586654663, 0.07154183089733124, 0.09244983643293381, 0.3811931014060974, 0.1407681405544281, 0.0072834789752960205, 0.007568646688014269], "count": [340]}, "action": {"min": [-0.2919642925262451, -0.7714285850524902, -0.5035714507102966, -0.07500000298023224, -0.08142857253551483, -0.08142857253551483, 0.0], "max": [0.46875, 0.8276785612106323, 0.9375, 0.08250000327825546, 0.0835714265704155, 0.007499999832361937, 1.0], "mean": [0.023405978456139565, 0.06168592721223831, -0.0077363490127027035, 0.0022121856454759836, 0.0035262606106698513, -0.02078886143863201, 0.5323529243469238], "std": [0.13669069111347198, 0.3589242100715637, 0.3645804226398468, 0.022941945120692253, 0.03725700452923775, 0.02327781170606613, 0.49895262718200684], "count": [340]}, "timestamp": {"min": [0.0], "max": [16.95], "mean": [8.475000000000001], "std": [4.907456061953076], "count": [340]}, "frame_index": {"min": [0], "max": [339], "mean": [169.5], "std": [98.14912123906153], "count": [340]}, "episode_index": {"min": [238], "max": [238], "mean": [238.0], "std": [0.0], "count": [340]}, "index": {"min": [63923], "max": [64262], "mean": [64092.5], "std": [98.14912123906153], "count": [340]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [340]}}} +{"episode_index": 239, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5710643436207491]], [[0.5376711449716605]], [[0.49968582871380973]]], "std": [[[0.26600719916793464]], [[0.24495010686927024]], [[0.22519110268636292]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5421767015644148]], [[0.5069144843606388]], [[0.45845561188342526]]], "std": [[[0.2995403806715573]], [[0.2740499238764359]], [[0.2549556609616404]]], "count": [100]}, "observation.state": {"min": [-0.2259734570980072, -0.10269436240196228, 0.9278559684753418, 1.9895005226135254, 0.0024253088049590588, -0.13766150176525116, 0.006984103005379438, -0.040009524673223495], "max": [0.048226915299892426, 0.21142569184303284, 1.1778475046157837, 3.1601722240448, 3.2081313133239746, 1.386339545249939, 0.03995246812701225, -0.0052900235168635845], "mean": [-0.07707991451025009, 0.08512715995311737, 1.0670112371444702, 2.6597280502319336, 1.5994155406951904, 0.31219497323036194, 0.02509128674864769, -0.02416905015707016], "std": [0.10912980884313583, 0.11538127809762955, 0.08606687188148499, 0.38647013902664185, 1.083911418914795, 0.41694146394729614, 0.014889237470924854, 0.015482348389923573], "count": [323]}, "action": {"min": [-0.3107142746448517, -0.7767857313156128, -0.6910714507102966, -0.017142856493592262, -0.1371428519487381, -0.013928571715950966, 0.0], "max": [0.7178571224212646, 0.6401785612106323, 0.9375, 0.1907142847776413, 0.12642857432365417, 0.375, 1.0], "mean": [0.036139994859695435, 0.05218649283051491, -0.05658170208334923, 0.029532287269830704, 0.0004643957072403282, 0.054208289831876755, 0.5139318704605103], "std": [0.22427096962928772, 0.3010038137435913, 0.34946948289871216, 0.04863015562295914, 0.05626373365521431, 0.09526228904724121, 0.49980661273002625], "count": [323]}, "timestamp": {"min": [0.0], "max": [16.1], "mean": [8.049999999999999], "std": [4.662081080376017], "count": [323]}, "frame_index": {"min": [0], "max": [322], "mean": [161.0], "std": [93.24162160752032], "count": [323]}, "episode_index": {"min": [239], "max": [239], "mean": [239.0], "std": [0.0], "count": [323]}, "index": {"min": [64263], "max": [64585], "mean": [64424.0], "std": [93.24162160752032], "count": [323]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [323]}}} +{"episode_index": 240, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5675011931774663]], [[0.5326224377202052]], [[0.4973885689529718]]], "std": [[[0.25868588250426106]], [[0.23583055927634172]], [[0.2124847206109938]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5378718034332874]], [[0.5033369014964384]], [[0.4550001789167815]]], "std": [[[0.30087439374925695]], [[0.2752082001960414]], [[0.255919529202511]]], "count": [100]}, "observation.state": {"min": [-0.2042853981256485, -0.07627642899751663, 0.9290168285369873, 2.1140260696411133, -0.024090124294161797, -0.27428263425827026, -0.0005361997173167765, -0.04001391679048538], "max": [0.12128255516290665, 0.20326493680477142, 1.1827691793441772, 3.142465353012085, 2.685238838195801, 0.6577774882316589, 0.03991461545228958, -0.0037984922528266907], "mean": [-0.05921404808759689, 0.07993341982364655, 1.0497572422027588, 2.6220593452453613, 1.4405521154403687, 0.14698579907417297, 0.027745023369789124, -0.0292307548224926], "std": [0.11971066892147064, 0.10593215376138687, 0.08475009351968765, 0.4011899530887604, 1.0174318552017212, 0.30355384945869446, 0.014452187344431877, 0.013761979527771473], "count": [289]}, "action": {"min": [-0.4446428716182709, -0.7767857313156128, -0.7875000238418579, -0.06857142597436905, -0.22285714745521545, -0.02678571455180645, 0.0], "max": [0.9321428537368774, 0.6241071224212646, 0.8999999761581421, 0.14249999821186066, 0.11142857372760773, 0.36321428418159485, 1.0], "mean": [0.04225470870733261, 0.036980971693992615, -0.07770638912916183, 0.015463421121239662, 0.0002817597414832562, 0.056140653789043427, 0.6228373646736145], "std": [0.2869562804698944, 0.2931830585002899, 0.33029603958129883, 0.037811584770679474, 0.0560590922832489, 0.10307028889656067, 0.48467588424682617], "count": [289]}, "timestamp": {"min": [0.0], "max": [14.4], "mean": [7.200000000000001], "std": [4.171330722922843], "count": [289]}, "frame_index": {"min": [0], "max": [288], "mean": [144.0], "std": [83.42661445845684], "count": [289]}, "episode_index": {"min": [240], "max": [240], "mean": [240.0], "std": [0.0], "count": [289]}, "index": {"min": [64586], "max": [64874], "mean": [64730.0], "std": [83.42661445845684], "count": [289]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [289]}}} +{"episode_index": 241, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.298171101289637]], [[0.2378091879451976]], [[0.19934521304859834]]], "std": [[[0.15475724871978164]], [[0.1440418043689653]], [[0.14647448586411976]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31302980789483764]], [[0.2659276523964078]], [[0.23155363434436277]]], "std": [[[0.15639355634962449]], [[0.1689877138171221]], [[0.17774073590120182]]], "count": [100]}, "observation.state": {"min": [-0.1085459440946579, -0.15914462506771088, 0.4832857549190521, 2.900378704071045, -0.8375969529151917, -0.6461809277534485, 0.023826133459806442, -0.04047929123044014], "max": [0.025255130603909492, 0.26869240403175354, 0.7091085910797119, 3.1742048263549805, -0.0015793334459885955, -0.08774171769618988, 0.039941105991601944, -0.03332282975316048], "mean": [-0.03268570080399513, 0.05744105204939842, 0.6209533214569092, 3.061460494995117, -0.6390174627304077, -0.3944590985774994, 0.03349686414003372, -0.03758588060736656], "std": [0.04467177018523216, 0.1505722999572754, 0.06842268258333206, 0.08344902843236923, 0.23982983827590942, 0.19351273775100708, 0.006103017833083868, 0.0024129007942974567], "count": [274]}, "action": {"min": [-0.4446428716182709, -0.6535714268684387, -0.5464285612106323, -0.04392857104539871, -0.09214285761117935, -0.08142857253551483, 0.0], "max": [0.6107142567634583, 0.8062499761581421, 0.9375, 0.04178571328520775, 0.10499999672174454, 0.012857142835855484, 1.0], "mean": [0.028672443702816963, 0.07151001691818237, -0.005748171824961901, -0.0006100118043832481, 0.011410324834287167, -0.014960892498493195, 0.5364963412284851], "std": [0.21714015305042267, 0.378490686416626, 0.39500272274017334, 0.014731586910784245, 0.03728838264942169, 0.02426283061504364, 0.49866604804992676], "count": [274]}, "timestamp": {"min": [0.0], "max": [13.65], "mean": [6.825], "std": [3.9548230048890938], "count": [274]}, "frame_index": {"min": [0], "max": [273], "mean": [136.5], "std": [79.09646009778187], "count": [274]}, "episode_index": {"min": [241], "max": [241], "mean": [241.0], "std": [0.0], "count": [274]}, "index": {"min": [64875], "max": [65148], "mean": [65011.5], "std": [79.09646009778187], "count": [274]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [274]}}} +{"episode_index": 242, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3643981227500766]], [[0.2968949166092218]], [[0.2508991567574295]]], "std": [[[0.16649229602512697]], [[0.16509765755246078]], [[0.15935092087189034]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3268754643458946]], [[0.2805933054007736]], [[0.25037062162511486]]], "std": [[[0.1620371883456457]], [[0.17829384266260537]], [[0.18922528744863393]]], "count": [100]}, "observation.state": {"min": [-0.13925734162330627, -0.10994528979063034, 0.4467422664165497, 3.0157253742218018, -0.05999600142240524, -0.11562619358301163, 0.0015976050635799766, -0.03986957296729088], "max": [0.18196488916873932, 0.1298183649778366, 0.6783125996589661, 3.2115728855133057, 0.31267887353897095, 0.31816527247428894, 0.03977898880839348, -0.0020786335226148367], "mean": [-0.004288214258849621, 0.017212841659784317, 0.5632665157318115, 3.1031436920166016, 0.13597309589385986, 0.043707989156246185, 0.0192174781113863, -0.01943052187561989], "std": [0.09980253875255585, 0.08709199726581573, 0.07353022694587708, 0.051359061151742935, 0.10113540291786194, 0.13151811063289642, 0.017136454582214355, 0.01708749681711197], "count": [215]}, "action": {"min": [-0.4928571283817291, -0.5571428537368774, -0.5758928656578064, -0.06428571790456772, -0.0867857113480568, -0.09321428835391998, 0.0], "max": [0.8678571581840515, 0.43660715222358704, 0.6160714030265808, 0.07500000298023224, 0.15535713732242584, 0.055714286863803864, 1.0], "mean": [0.04041527584195137, 0.04356727749109268, -0.10922347009181976, 0.0021478396374732256, 0.0013455139705911279, 0.00408637709915638, 0.4372093081474304], "std": [0.4132288098335266, 0.18358036875724792, 0.3333403766155243, 0.022909408435225487, 0.05164925381541252, 0.02175774797797203, 0.49604177474975586], "count": [215]}, "timestamp": {"min": [0.0], "max": [10.7], "mean": [5.35], "std": [3.10322412983658], "count": [215]}, "frame_index": {"min": [0], "max": [214], "mean": [107.0], "std": [62.0644825967316], "count": [215]}, "episode_index": {"min": [242], "max": [242], "mean": [242.0], "std": [0.0], "count": [215]}, "index": {"min": [65149], "max": [65363], "mean": [65256.0], "std": [62.0644825967316], "count": [215]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [215]}}} +{"episode_index": 243, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5702031130323224]], [[0.5368881608551624]], [[0.5012785315420113]]], "std": [[[0.26143004956818894]], [[0.23952951513229234]], [[0.21750200285976556]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5406293699975107]], [[0.5063037899241728]], [[0.4584322814941406]]], "std": [[[0.30010106637319867]], [[0.27497904800182876]], [[0.2563600513311632]]], "count": [100]}, "observation.state": {"min": [-0.23460961878299713, -0.09604063630104065, 0.9237988591194153, 2.380826234817505, -0.0002405674458714202, -0.09286487847566605, 0.0072315712459385395, -0.0400090292096138], "max": [0.08473040908575058, 0.22848528623580933, 1.1689928770065308, 3.151495933532715, 2.504448413848877, 0.746724009513855, 0.04085902124643326, -0.005478375591337681], "mean": [-0.08398045599460602, 0.07803001254796982, 1.0206443071365356, 2.8193466663360596, 1.216646432876587, 0.24804434180259705, 0.0320131815969944, -0.028094541281461716], "std": [0.1271740347146988, 0.12560981512069702, 0.07860865443944931, 0.2379317432641983, 0.9123609662055969, 0.23218080401420593, 0.013057276606559753, 0.013314095325767994], "count": [299]}, "action": {"min": [-0.6267856955528259, -0.7633928656578064, -0.9375, -0.08142857253551483, -0.11357142776250839, -0.0503571443259716, 0.0], "max": [0.8839285969734192, 0.6937500238418579, 0.7794643044471741, 0.09964285790920258, 0.13607142865657806, 0.32678571343421936, 1.0], "mean": [0.005016732029616833, 0.0621178038418293, -0.14518935978412628, 0.009771854616701603, -0.007166747469455004, 0.04727543145418167, 0.5752508640289307], "std": [0.31427082419395447, 0.3036613166332245, 0.3702370524406433, 0.03283356875181198, 0.05328039452433586, 0.08421234786510468, 0.49430540204048157], "count": [299]}, "timestamp": {"min": [0.0], "max": [14.9], "mean": [7.45], "std": [4.315669125408017], "count": [299]}, "frame_index": {"min": [0], "max": [298], "mean": [149.0], "std": [86.31338250816034], "count": [299]}, "episode_index": {"min": [243], "max": [243], "mean": [243.0], "std": [0.0], "count": [299]}, "index": {"min": [65364], "max": [65662], "mean": [65513.0], "std": [86.31338250816034], "count": [299]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [299]}}} +{"episode_index": 244, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3360152569939109]], [[0.26788005754059435]], [[0.22386000629499847]]], "std": [[[0.14764593660109224]], [[0.14049145892678191]], [[0.13700736958552379]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32727603089575674]], [[0.28313444189931836]], [[0.25037182796702667]]], "std": [[[0.1688030351026193]], [[0.18359849352411958]], [[0.1934363754041966]]], "count": [100]}, "observation.state": {"min": [-0.05283958092331886, -0.23099760711193085, 0.4482327103614807, 2.9593095779418945, -0.45900532603263855, -0.3916982114315033, 0.01949681155383587, -0.03990516439080238], "max": [0.13304415345191956, 0.2655836343765259, 0.7251132130622864, 3.1722805500030518, 0.4157790541648865, 0.07976023107767105, 0.03983886167407036, -0.01922786980867386], "mean": [0.07745800912380219, 0.03746170178055763, 0.6052433252334595, 3.0977163314819336, -0.025489328429102898, -0.15566979348659515, 0.029518146067857742, -0.030117500573396683], "std": [0.043803390115499496, 0.1610487550497055, 0.08702143281698227, 0.0623730830848217, 0.2522713541984558, 0.1362980753183365, 0.009009097702801228, 0.008985485881567001], "count": [246]}, "action": {"min": [-0.47410714626312256, -0.7258928418159485, -0.8973214030265808, -0.10607142746448517, -0.10607142746448517, -0.13500000536441803, 0.0], "max": [0.7285714149475098, 0.8651785850524902, 0.9375, 0.06750000268220901, 0.11464285850524902, 0.18214285373687744, 1.0], "mean": [0.017976922914385796, 0.08567070215940475, -0.04928138479590416, -0.003780488157644868, 0.00620644586160779, 0.0037499985191971064, 0.5243902206420898], "std": [0.310629665851593, 0.44314703345298767, 0.5092092752456665, 0.030732201412320137, 0.03460753336548805, 0.06015240401029587, 0.4994046092033386], "count": [246]}, "timestamp": {"min": [0.0], "max": [12.25], "mean": [6.125], "std": [3.5506748184910806], "count": [246]}, "frame_index": {"min": [0], "max": [245], "mean": [122.5], "std": [71.01349636982161], "count": [246]}, "episode_index": {"min": [244], "max": [244], "mean": [244.0], "std": [0.0], "count": [246]}, "index": {"min": [65663], "max": [65908], "mean": [65785.5], "std": [71.01349636982161], "count": [246]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [246]}}} +{"episode_index": 245, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5306203649184283]], [[0.49095874801336553]], [[0.43799226469152114]]], "std": [[[0.3065659904465632]], [[0.2769597473125668]], [[0.24650877709630808]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5136180838790595]], [[0.4818255076688879]], [[0.43540939091701136]]], "std": [[[0.30959631081787903]], [[0.2828745859810828]], [[0.2617144513183437]]], "count": [100]}, "observation.state": {"min": [-0.2968536913394928, -0.07440442591905594, 0.9720568060874939, 2.1221513748168945, -2.7239019870758057, -1.0953152179718018, 0.008254950866103172, -0.040009792894124985], "max": [0.015773659572005272, 0.2891869843006134, 1.1842485666275024, 3.252413034439087, 0.004117825534194708, -0.057741522789001465, 0.04000852629542351, -0.009456385858356953], "mean": [-0.0786542296409607, 0.09158993512392044, 1.0862760543823242, 2.6741819381713867, -2.07478404045105, -0.6077613830566406, 0.03126385062932968, -0.029955698177218437], "std": [0.08203700929880142, 0.11505509167909622, 0.05844879522919655, 0.315639853477478, 0.7958793640136719, 0.2611490786075592, 0.013230080716311932, 0.012711901217699051], "count": [258]}, "action": {"min": [-0.8196428418159485, -0.7633928656578064, -0.5544642806053162, -0.1039285734295845, -0.17142857611179352, -0.29357144236564636, 0.0], "max": [0.9375, 0.8142856955528259, 0.7446428537368774, 0.16607142984867096, 0.1735714226961136, 0.3149999976158142, 1.0], "mean": [0.05797341465950012, 0.1063019335269928, -0.035921912640333176, 0.010627086274325848, 0.017055651172995567, -0.021773280575871468, 0.7286821603775024], "std": [0.3912346363067627, 0.34833824634552, 0.2429182529449463, 0.06106792762875557, 0.06736714392900467, 0.13926875591278076, 0.4446391761302948], "count": [258]}, "timestamp": {"min": [0.0], "max": [12.85], "mean": [6.425000000000001], "std": [3.723881263771264], "count": [258]}, "frame_index": {"min": [0], "max": [257], "mean": [128.5], "std": [74.47762527542528], "count": [258]}, "episode_index": {"min": [245], "max": [245], "mean": [245.0], "std": [0.0], "count": [258]}, "index": {"min": [65909], "max": [66166], "mean": [66037.5], "std": [74.47762527542528], "count": [258]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [258]}}} +{"episode_index": 246, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32882131718654256]], [[0.27120763860964303]], [[0.23588584271599267]]], "std": [[[0.14658144117420188]], [[0.1447778003509535]], [[0.15008956784013872]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3215511420754825]], [[0.2775453886144301]], [[0.24518328558229932]]], "std": [[[0.16005584043553114]], [[0.17633558299500857]], [[0.18529424629769964]]], "count": [100]}, "observation.state": {"min": [-0.1398317962884903, -0.10962583124637604, 0.4489890933036804, 3.107079029083252, -0.749172568321228, -0.3118287920951843, 0.022576602175831795, -0.040295038372278214], "max": [0.07824265956878662, 0.26308053731918335, 0.6856154799461365, 3.2659292221069336, 0.0013662382261827588, 0.352823406457901, 0.04000377282500267, -0.010316796600818634], "mean": [-0.0143296392634511, 0.08490784466266632, 0.5926381349563599, 3.1713242530822754, -0.4247123599052429, -0.04079403728246689, 0.03404320776462555, -0.03190101683139801], "std": [0.06712859123945236, 0.12787671387195587, 0.0712086409330368, 0.038519587367773056, 0.2318972796201706, 0.16440919041633606, 0.006131401285529137, 0.008837679401040077], "count": [277]}, "action": {"min": [-0.7419642806053162, -0.9375, -0.6696428656578064, -0.08892857283353806, -0.19928571581840515, -0.1039285734295845, 0.0], "max": [0.7607142925262451, 0.8732143044471741, 0.9375, 0.1007142886519432, 0.207857146859169, 0.2517857253551483, 1.0], "mean": [0.02197977341711521, 0.06688693165779114, -0.02146725170314312, 0.005306855775415897, 0.0013653944479301572, -0.009638984687626362, 0.5270758271217346], "std": [0.28643718361854553, 0.40365734696388245, 0.39266708493232727, 0.031690895557403564, 0.08117673546075821, 0.06318259984254837, 0.49926602840423584], "count": [277]}, "timestamp": {"min": [0.0], "max": [13.8], "mean": [6.8999999999999995], "std": [3.9981245603407602], "count": [277]}, "frame_index": {"min": [0], "max": [276], "mean": [138.0], "std": [79.96249120681522], "count": [277]}, "episode_index": {"min": [246], "max": [246], "mean": [246.0], "std": [0.0], "count": [277]}, "index": {"min": [66167], "max": [66443], "mean": [66305.0], "std": [79.96249120681522], "count": [277]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [277]}}} +{"episode_index": 247, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3530824357575061]], [[0.2873490385167739]], [[0.24158171290977326]]], "std": [[[0.1449136747609418]], [[0.1467005766061423]], [[0.15172227850378128]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3165165872012868]], [[0.2681833555932138]], [[0.2351546433392693]]], "std": [[[0.1503282367188433]], [[0.16434267158770627]], [[0.17292187193006295]]], "count": [100]}, "observation.state": {"min": [-0.13764534890651703, -0.2440289705991745, 0.5101881623268127, 2.989288568496704, -0.7942391037940979, -0.10233398526906967, 0.00275400304235518, -0.03985777497291565], "max": [0.047414761036634445, 0.3518010675907135, 0.6825439929962158, 3.1743149757385254, 0.5842980742454529, 0.1902182251214981, 0.04000234603881836, -0.002890487900003791], "mean": [-0.021377043798565865, -0.0008202499011531472, 0.594799816608429, 3.1146204471588135, -0.016300592571496964, 0.0161555465310812, 0.023548129945993423, -0.023568982258439064], "std": [0.05250633507966995, 0.19616715610027313, 0.04923785850405693, 0.05054188147187233, 0.39819881319999695, 0.08656656742095947, 0.016895277425646782, 0.016786476597189903], "count": [250]}, "action": {"min": [-0.39642858505249023, -0.7044642567634583, -0.5678571462631226, -0.04285714402794838, -0.11678571254014969, -0.13607142865657806, 0.0], "max": [0.8491071462631226, 0.7446428537368774, 0.7124999761581421, 0.09214285761117935, 0.08571428805589676, 0.13178572058677673, 1.0], "mean": [0.023507144302129745, 0.10995001345872879, -0.032742857933044434, -0.002537142252549529, -0.003162856912240386, -0.017211424186825752, 0.5559999942779541], "std": [0.2515450119972229, 0.3415060043334961, 0.3418976366519928, 0.019528964534401894, 0.032149236649274826, 0.05520382151007652, 0.49685388803482056], "count": [250]}, "timestamp": {"min": [0.0], "max": [12.45], "mean": [6.225], "std": [3.6084103148062305], "count": [250]}, "frame_index": {"min": [0], "max": [249], "mean": [124.5], "std": [72.16820629612461], "count": [250]}, "episode_index": {"min": [247], "max": [247], "mean": [247.0], "std": [0.0], "count": [250]}, "index": {"min": [66444], "max": [66693], "mean": [66568.5], "std": [72.16820629612461], "count": [250]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [250]}}} +{"episode_index": 248, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3634650196748621]], [[0.2974206896015242]], [[0.25256770713656557]]], "std": [[[0.17130451773372923]], [[0.17029897484061168]], [[0.16762475953557615]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3280019279928768]], [[0.2825560410443474]], [[0.2527942762187883]]], "std": [[[0.1638163973348988]], [[0.1793873532438401]], [[0.19018948813573694]]], "count": [100]}, "observation.state": {"min": [-0.10950963199138641, -0.15080317854881287, 0.4481595456600189, 2.995002269744873, -0.23665471374988556, -0.10235626250505447, 0.0010170796886086464, -0.03989657759666443], "max": [0.19358476996421814, 0.131303071975708, 0.6811359524726868, 3.2392737865448, 0.5698230266571045, 0.03328816220164299, 0.03986543044447899, -0.0028934557922184467], "mean": [0.025364389643073082, -0.0019348518690094352, 0.5748453140258789, 3.1280312538146973, 0.19489064812660217, -0.042507853358983994, 0.023027287796139717, -0.02343917265534401], "std": [0.10109153389930725, 0.09479799121618271, 0.06802670657634735, 0.0739811509847641, 0.2771293520927429, 0.03733363375067711, 0.01654573157429695, 0.015604793094098568], "count": [235]}, "action": {"min": [-0.5062500238418579, -0.5544642806053162, -0.6669642925262451, -0.055714286863803864, -0.06857142597436905, -0.07071428745985031, 0.0], "max": [0.7446428537368774, 0.4419642984867096, 0.4955357015132904, 0.06964285671710968, 0.056785713881254196, 0.13928571343421936, 1.0], "mean": [0.052203621715307236, 0.026284189894795418, -0.08493918925523758, -0.0009346514707431197, 0.00020516749646048993, -0.005220367107540369, 0.44680851697921753], "std": [0.3600696325302124, 0.2235223799943924, 0.2990640103816986, 0.027039755135774612, 0.02670714072883129, 0.04782949015498161, 0.4971632957458496], "count": [235]}, "timestamp": {"min": [0.0], "max": [11.7], "mean": [5.85], "std": [3.391902121229326], "count": [235]}, "frame_index": {"min": [0], "max": [234], "mean": [117.0], "std": [67.83804242458652], "count": [235]}, "episode_index": {"min": [248], "max": [248], "mean": [248.0], "std": [0.0], "count": [235]}, "index": {"min": [66694], "max": [66928], "mean": [66811.0], "std": [67.83804242458652], "count": [235]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [235]}}} +{"episode_index": 249, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35337068146350337]], [[0.2842481809129902]], [[0.23563136500938267]]], "std": [[[0.13537845229923057]], [[0.13377857827209635]], [[0.13292395131353962]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31759992292815564]], [[0.2685822634229473]], [[0.23509053368661917]]], "std": [[[0.1538388533412906]], [[0.16818596550444623]], [[0.1769293658382254]]], "count": [100]}, "observation.state": {"min": [-0.11289843171834946, -0.287445068359375, 0.5099043846130371, 2.9673376083374023, -0.6783341765403748, -0.10463102906942368, 0.004598707892000675, -0.039806388318538666], "max": [0.04022282361984253, 0.3446730375289917, 0.6785860061645508, 3.25365948677063, 0.24353966116905212, 0.4763058125972748, 0.0399969182908535, -0.005055937450379133], "mean": [-0.023787330836057663, -0.01316666230559349, 0.5909697413444519, 3.101316452026367, -0.21838849782943726, 0.14730773866176605, 0.0225810669362545, -0.022683730348944664], "std": [0.040835294872522354, 0.20197127759456635, 0.049436405301094055, 0.0726911798119545, 0.28901949524879456, 0.17073142528533936, 0.015497583895921707, 0.015266184695065022], "count": [233]}, "action": {"min": [-0.4258928596973419, -0.6187499761581421, -0.6910714507102966, -0.10607142746448517, -0.15000000596046448, -0.10285714268684387, 0.0], "max": [0.6857143044471741, 0.8705357313156128, 0.6642857193946838, 0.14249999821186066, 0.19499999284744263, 0.06535714119672775, 1.0], "mean": [0.023624300956726074, 0.10722330957651138, -0.053249530494213104, -0.0005610054940916598, 0.0003678714856505394, -0.015280504710972309, 0.4806866943836212], "std": [0.22091329097747803, 0.4147028923034668, 0.3200385868549347, 0.03862623870372772, 0.06674268841743469, 0.0340384803712368, 0.4996272623538971], "count": [233]}, "timestamp": {"min": [0.0], "max": [11.6], "mean": [5.8], "std": [3.363034344160048], "count": [233]}, "frame_index": {"min": [0], "max": [232], "mean": [116.0], "std": [67.26068688320095], "count": [233]}, "episode_index": {"min": [249], "max": [249], "mean": [249.0], "std": [0.0], "count": [233]}, "index": {"min": [66929], "max": [67161], "mean": [67045.0], "std": [67.26068688320095], "count": [233]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [233]}}} +{"episode_index": 250, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3098231913248698]], [[0.24781796384325214]], [[0.21086136522480087]]], "std": [[[0.12174831723951687]], [[0.1109252415921551]], [[0.11401458187358471]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31583113367417276]], [[0.27085769653320313]], [[0.23800850662530637]]], "std": [[[0.1554507416050887]], [[0.170846701655284]], [[0.17941397955047153]]], "count": [100]}, "observation.state": {"min": [-0.14170169830322266, -0.1210150271654129, 0.44690799713134766, 2.964334726333618, -0.6070507168769836, -0.3517838716506958, 0.01613333635032177, -0.04039460048079491], "max": [0.06535212695598602, 0.25951096415519714, 0.7136678695678711, 3.175161600112915, 0.09281934052705765, -0.08005760610103607, 0.03992209956049919, -0.022491132840514183], "mean": [-0.010808194987475872, 0.07440502196550369, 0.5977991819381714, 3.0832011699676514, -0.284678190946579, -0.20694957673549652, 0.031840335577726364, -0.03310225158929825], "std": [0.06230681762099266, 0.1246257945895195, 0.08887540549039841, 0.05018863081932068, 0.24887293577194214, 0.07055261731147766, 0.008514083921909332, 0.006897733546793461], "count": [261]}, "action": {"min": [-0.5196428298950195, -0.8812500238418579, -0.75, -0.10607142746448517, -0.09321428835391998, -0.1542857140302658, 0.0], "max": [0.8973214030265808, 0.8732143044471741, 0.9375, 0.10178571194410324, 0.10285714268684387, 0.14249999821186066, 1.0], "mean": [-0.0083435894921422, 0.05765600875020027, -0.04261080175638199, 0.0012151073897257447, 0.00453612394630909, -0.008764365687966347, 0.5823754668235779], "std": [0.30693578720092773, 0.4122878909111023, 0.44345179200172424, 0.03655069321393967, 0.035389434546232224, 0.058076780289411545, 0.493167906999588], "count": [261]}, "timestamp": {"min": [0.0], "max": [13.0], "mean": [6.5], "std": [3.7671828554858693], "count": [261]}, "frame_index": {"min": [0], "max": [260], "mean": [130.0], "std": [75.34365710971738], "count": [261]}, "episode_index": {"min": [250], "max": [250], "mean": [250.0], "std": [0.0], "count": [261]}, "index": {"min": [67162], "max": [67422], "mean": [67292.0], "std": [75.34365710971738], "count": [261]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [261]}}} +{"episode_index": 251, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33041272571040137]], [[0.26250635483685664]], [[0.21997222720875462]]], "std": [[[0.15223573672428717]], [[0.14720275360521182]], [[0.151590729311164]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3241605212641698]], [[0.2798802645814185]], [[0.24696622661515777]]], "std": [[[0.16773258160324545]], [[0.18171627790298311]], [[0.19135402603981072]]], "count": [100]}, "observation.state": {"min": [-0.05477885901927948, -0.21070383489131927, 0.44716697931289673, 2.91525936126709, -0.10104278475046158, -0.5251615643501282, 0.01914338394999504, -0.03985699266195297], "max": [0.14665715396404266, 0.2582479417324066, 0.7333167195320129, 3.20233416557312, 0.23574845492839813, -0.06425964087247849, 0.039825331419706345, -0.019484950229525566], "mean": [0.06726014614105225, 0.03777578845620155, 0.5982344150543213, 3.0758540630340576, 0.03571697697043419, -0.272316038608551, 0.02924571931362152, -0.029365302994847298], "std": [0.05198916792869568, 0.15906096994876862, 0.08289255201816559, 0.0780627503991127, 0.08487299084663391, 0.12722428143024445, 0.009049567393958569, 0.009240583516657352], "count": [234]}, "action": {"min": [-0.5142857432365417, -0.768750011920929, -0.824999988079071, -0.09000000357627869, -0.12964285910129547, -0.05464285612106323, 0.0], "max": [0.6214285492897034, 0.8678571581840515, 0.9375, 0.08142857253551483, 0.1274999976158142, 0.07928571105003357, 1.0], "mean": [0.0030105665791779757, 0.09500917047262192, -0.04427658021450043, -0.004752745386213064, 0.010929488576948643, 0.00364468852058053, 0.504273533821106], "std": [0.29057586193084717, 0.46276959776878357, 0.467651903629303, 0.03436814621090889, 0.04373849928379059, 0.025419574230909348, 0.499982088804245], "count": [234]}, "timestamp": {"min": [0.0], "max": [11.65], "mean": [5.825], "std": [3.377468233257963], "count": [234]}, "frame_index": {"min": [0], "max": [233], "mean": [116.5], "std": [67.54936466515926], "count": [234]}, "episode_index": {"min": [251], "max": [251], "mean": [251.0], "std": [0.0], "count": [234]}, "index": {"min": [67423], "max": [67656], "mean": [67539.5], "std": [67.54936466515926], "count": [234]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [234]}}} +{"episode_index": 252, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3502208305807675]], [[0.2862488798253676]], [[0.24618906417547487]]], "std": [[[0.15280996575405925]], [[0.15505434666577764]], [[0.16100140864440446]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32530535050934434]], [[0.27965396596871167]], [[0.2496697962143842]]], "std": [[[0.15885728889894113]], [[0.17445784264820044]], [[0.18529818870340098]]], "count": [100]}, "observation.state": {"min": [-0.15553253889083862, -0.14436328411102295, 0.44734135270118713, 3.067552328109741, -0.04360859468579292, -0.3550090789794922, 0.002902768785133958, -0.03986067324876785], "max": [0.17922990024089813, 0.14099211990833282, 0.6859062314033508, 3.196742534637451, 0.4598413109779358, 0.21378426253795624, 0.039906758815050125, -0.0024493711534887552], "mean": [0.00644488912075758, 0.009508996270596981, 0.5681097507476807, 3.1178836822509766, 0.21457408368587494, -0.07045431435108185, 0.02468843013048172, -0.025060074403882027], "std": [0.11029478907585144, 0.0918494462966919, 0.073331318795681, 0.036374904215335846, 0.13894768059253693, 0.16823874413967133, 0.015633661299943924, 0.015762249007821083], "count": [232]}, "action": {"min": [-0.6214285492897034, -0.65625, -0.5732142925262451, -0.05249999836087227, -0.12214285880327225, -0.04821428656578064, 0.0], "max": [0.9214285612106323, 0.47410714626312256, 0.581250011920929, 0.061071429401636124, 0.1007142886519432, 0.061071429401636124, 1.0], "mean": [0.04261466860771179, 0.031704131513834, -0.08952432125806808, 0.0009698275825940073, -0.0085067730396986, 0.0010160108795389533, 0.48275861144065857], "std": [0.4219953119754791, 0.22147800028324127, 0.32856470346450806, 0.017312588170170784, 0.04518976807594299, 0.026807254180312157, 0.4997026324272156], "count": [232]}, "timestamp": {"min": [0.0], "max": [11.55], "mean": [5.7749999999999995], "std": [3.3486004539210104], "count": [232]}, "frame_index": {"min": [0], "max": [231], "mean": [115.5], "std": [66.97200907842021], "count": [232]}, "episode_index": {"min": [252], "max": [252], "mean": [252.0], "std": [0.0], "count": [232]}, "index": {"min": [67657], "max": [67888], "mean": [67772.5], "std": [66.97200907842021], "count": [232]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [232]}}} +{"episode_index": 253, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5937963358561198]], [[0.5579329684388404]], [[0.5202125938265931]]], "std": [[[0.2597802545936999]], [[0.2408366095201344]], [[0.2219339022761574]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5464820239497167]], [[0.5112181181066177]], [[0.46271359013576135]]], "std": [[[0.3006351574408566]], [[0.27580826343701625]], [[0.25725947464912385]]], "count": [100]}, "observation.state": {"min": [-0.22413237392902374, -0.09837974607944489, 0.9262000322341919, 2.126502752304077, -9.027736814459786e-05, -0.14447113871574402, -0.0007326892227865756, -0.04004291445016861], "max": [0.07598907500505447, 0.21406425535678864, 1.1804488897323608, 3.184699058532715, 2.7052810192108154, 0.8900718688964844, 0.04013634845614433, -0.005223290529102087], "mean": [-0.06902468949556351, 0.06753220409154892, 1.049696445465088, 2.6653661727905273, 1.5785969495773315, 0.3517647385597229, 0.029607443138957024, -0.02965722791850567], "std": [0.11541618406772614, 0.1129540354013443, 0.08031140267848969, 0.34535878896713257, 0.9782336950302124, 0.42525404691696167, 0.014140699058771133, 0.013805074617266655], "count": [275]}, "action": {"min": [-0.38303571939468384, -0.7151785492897034, -0.8357142806053162, -0.05785714462399483, -0.1639285683631897, -0.02142857201397419, 0.0], "max": [0.731249988079071, 0.7258928418159485, 0.8008928298950195, 0.17142857611179352, 0.11571428924798965, 0.375, 1.0], "mean": [0.025558434426784515, 0.06565909832715988, -0.1091785728931427, 0.014957146719098091, -0.00515064736828208, 0.056914281100034714, 0.6727272868156433], "std": [0.25323566794395447, 0.32071688771247864, 0.39186331629753113, 0.04275668039917946, 0.05489640682935715, 0.10268853604793549, 0.4692177176475525], "count": [275]}, "timestamp": {"min": [0.0], "max": [13.7], "mean": [6.85], "std": [3.9692568573978684], "count": [275]}, "frame_index": {"min": [0], "max": [274], "mean": [137.0], "std": [79.38513714795737], "count": [275]}, "episode_index": {"min": [253], "max": [253], "mean": [253.0], "std": [0.0], "count": [275]}, "index": {"min": [67889], "max": [68163], "mean": [68026.0], "std": [79.38513714795737], "count": [275]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [275]}}} +{"episode_index": 254, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6007068714815027]], [[0.555723923627068]], [[0.5045769749061734]]], "std": [[[0.2771905877716416]], [[0.261690700313077]], [[0.2410615079130801]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5491298199821921]], [[0.5096430137484682]], [[0.4596626269770604]]], "std": [[[0.2996076232730126]], [[0.2784019546811103]], [[0.2640069090043043]]], "count": [100]}, "observation.state": {"min": [-0.1980636566877365, -0.06593309342861176, 0.925094485282898, 2.522428512573242, -2.1042284965515137, -0.9881542325019836, 0.0024611169937998056, -0.040148962289094925], "max": [0.018543003126978874, 0.19283907115459442, 1.1893271207809448, 3.141434669494629, 0.001925811287946999, 0.30096709728240967, 0.040392037481069565, -0.0016562782693654299], "mean": [-0.03153591230511665, 0.028066612780094147, 1.0386165380477905, 2.7159993648529053, -1.6086207628250122, -0.1832774132490158, 0.02709014341235161, -0.026637056842446327], "std": [0.05686747282743454, 0.08046580851078033, 0.08884648978710175, 0.19791239500045776, 0.5832365155220032, 0.4384027421474457, 0.016745494678616524, 0.01720626838505268], "count": [227]}, "action": {"min": [-0.3241071403026581, -0.6107142567634583, -0.6669642925262451, -0.03857142850756645, -0.16285714507102966, -0.3053571283817291, 0.0], "max": [0.5946428775787354, 0.7526785731315613, 0.9375, 0.22178570926189423, 0.12642857432365417, 0.07928571105003357, 1.0], "mean": [0.057524424046278, 0.11312541365623474, -0.087708480656147, 0.021258654072880745, 0.00684392498806119, -0.05084327608346939, 0.6563876867294312], "std": [0.21561582386493683, 0.33557188510894775, 0.38528120517730713, 0.04750703275203705, 0.058709122240543365, 0.09255637228488922, 0.4749133288860321], "count": [227]}, "timestamp": {"min": [0.0], "max": [11.3], "mean": [5.6499999999999995], "std": [3.2764309850811753], "count": [227]}, "frame_index": {"min": [0], "max": [226], "mean": [113.0], "std": [65.5286197016235], "count": [227]}, "episode_index": {"min": [254], "max": [254], "mean": [254.0], "std": [0.0], "count": [227]}, "index": {"min": [68164], "max": [68390], "mean": [68277.0], "std": [65.5286197016235], "count": [227]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [227]}}} +{"episode_index": 255, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5975640468223423]], [[0.5510358216528799]], [[0.49977340817918964]]], "std": [[[0.26947381099789064]], [[0.25445965724551584]], [[0.23342957083572272]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5496825453814339]], [[0.5106312010521983]], [[0.46164706899605545]]], "std": [[[0.30132750918019724]], [[0.2814197771644487]], [[0.26811697945534885]]], "count": [100]}, "observation.state": {"min": [-0.20732519030570984, -0.11508799344301224, 0.9215222001075745, 1.987023949623108, -2.545787811279297, -1.1057230234146118, 0.004052869975566864, -0.04028289020061493], "max": [0.10666818171739578, 0.17717161774635315, 1.1694623231887817, 3.139620304107666, 6.887035851832479e-05, 0.6352326273918152, 0.04085831716656685, -0.004108027555048466], "mean": [0.014854959212243557, 0.021450364962220192, 1.0405316352844238, 2.6161959171295166, -1.8278424739837646, -0.1929665505886078, 0.028308220207691193, -0.0280262790620327], "std": [0.07235904037952423, 0.0924997553229332, 0.07482210546731949, 0.37190207839012146, 0.666858434677124, 0.5257135033607483, 0.015967799350619316, 0.01628117449581623], "count": [291]}, "action": {"min": [-0.4580357074737549, -0.5973214507102966, -0.6723214387893677, -0.07178571075201035, -0.27642858028411865, -0.19821429252624512, 0.0], "max": [0.7660714387893677, 0.8196428418159485, 0.75, 0.2807142734527588, 0.21642857789993286, 0.0867857113480568, 1.0], "mean": [0.07598484307527542, 0.08840205520391464, -0.061174530535936356, 0.03005521558225155, -0.011597936972975731, -0.04738587513566017, 0.6735395193099976], "std": [0.27782946825027466, 0.3432616889476776, 0.33450576663017273, 0.0647009015083313, 0.08828812837600708, 0.07489877939224243, 0.46891725063323975], "count": [291]}, "timestamp": {"min": [0.0], "max": [14.5], "mean": [7.25], "std": [4.200198408012016], "count": [291]}, "frame_index": {"min": [0], "max": [290], "mean": [145.0], "std": [84.0039681602403], "count": [291]}, "episode_index": {"min": [255], "max": [255], "mean": [255.0], "std": [0.0], "count": [291]}, "index": {"min": [68391], "max": [68681], "mean": [68536.0], "std": [84.0039681602403], "count": [291]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [291]}}} +{"episode_index": 256, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31337529201133574]], [[0.26039788638844213]], [[0.22942759016448377]]], "std": [[[0.14470726535706185]], [[0.14039840950925775]], [[0.14728236983481705]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31744798428404564]], [[0.2733845543954887]], [[0.24106376917221967]]], "std": [[[0.15954480790272837]], [[0.1748083227885196]], [[0.18338232260921575]]], "count": [100]}, "observation.state": {"min": [-0.1573050171136856, -0.13433165848255157, 0.4477144479751587, 2.8521668910980225, -0.7189151644706726, -0.5262430310249329, 0.02208865061402321, -0.04000561684370041], "max": [0.10520485788583755, 0.2568381428718567, 0.70570969581604, 3.2080576419830322, 0.011621953919529915, 0.17136795818805695, 0.04007821902632713, -0.01989516243338585], "mean": [-0.006657877471297979, 0.0581086091697216, 0.5925150513648987, 3.076876163482666, -0.4009978771209717, -0.177163228392601, 0.03377850353717804, -0.03363371640443802], "std": [0.07038417458534241, 0.13714207708835602, 0.07142564654350281, 0.10335233062505722, 0.2464873194694519, 0.15719687938690186, 0.00681288493797183, 0.0074999514035880566], "count": [288]}, "action": {"min": [-0.5330356955528259, -0.7928571701049805, -0.5517857074737549, -0.09642857313156128, -0.1939285695552826, -0.12642857432365417, 0.0], "max": [0.7794643044471741, 0.8062499761581421, 0.9375, 0.13178572058677673, 0.18535713851451874, 0.1574999988079071, 1.0], "mean": [-0.002092637587338686, 0.06508561223745346, -0.030757060274481773, 0.0021949417423456907, -0.0012351191835477948, -0.0010974692413583398, 0.5833333134651184], "std": [0.2924128472805023, 0.391436904668808, 0.38516274094581604, 0.04042363911867142, 0.07612552493810654, 0.0511791966855526, 0.49300703406333923], "count": [288]}, "timestamp": {"min": [0.0], "max": [14.35], "mean": [7.174999999999999], "std": [4.156896879484343], "count": [288]}, "frame_index": {"min": [0], "max": [287], "mean": [143.5], "std": [83.13793758968686], "count": [288]}, "episode_index": {"min": [256], "max": [256], "mean": [256.0], "std": [0.0], "count": [288]}, "index": {"min": [68682], "max": [68969], "mean": [68825.5], "std": [83.13793758968686], "count": [288]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [288]}}} +{"episode_index": 257, "stats": {"observation.images.wrist_image": {"min": [[[0.00784313725490196]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3591124171836703]], [[0.29705432009229477]], [[0.2540477097455193]]], "std": [[[0.13801934039107489]], [[0.14501679268433906]], [[0.1549105963123781]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3103772642846201]], [[0.26038158461626837]], [[0.2264049467198989]]], "std": [[[0.14769488035501088]], [[0.16064898331484262]], [[0.16877667870170698]]], "count": [100]}, "observation.state": {"min": [-0.14808756113052368, -0.3196561634540558, 0.505010187625885, 2.944967269897461, -0.0042384108528494835, -0.0976049154996872, 0.002267814939841628, -0.039880238473415375], "max": [-0.0005211131065152586, 0.3575024902820587, 0.6864293217658997, 3.209946632385254, 0.6758068203926086, 0.3081475794315338, 0.040123336017131805, -0.001450580544769764], "mean": [-0.05311865359544754, -0.04668716713786125, 0.5703873634338379, 3.088850259780884, 0.39935117959976196, 0.050832297652959824, 0.022975753992795944, -0.022284315899014473], "std": [0.043549951165914536, 0.21113155782222748, 0.049247775226831436, 0.07333684712648392, 0.20260760188102722, 0.11210458725690842, 0.016562331467866898, 0.016786379739642143], "count": [298]}, "action": {"min": [-0.4151785671710968, -0.6910714507102966, -0.6000000238418579, -0.06535714119672775, -0.0803571417927742, -0.10285714268684387, 0.0], "max": [0.6214285492897034, 0.8116071224212646, 0.6107142567634583, 0.08464285731315613, 0.0803571417927742, 0.10285714268684387, 1.0], "mean": [0.0027504791505634785, 0.09198823571205139, -0.04704577475786209, -0.005091081839054823, -0.0028295775409787893, 0.002301054773852229, 0.5268456339836121], "std": [0.22370220720767975, 0.37123358249664307, 0.2943169176578522, 0.02646300196647644, 0.023702653124928474, 0.03361120447516441, 0.49927911162376404], "count": [298]}, "timestamp": {"min": [0.0], "max": [14.85], "mean": [7.424999999999999], "std": [4.301235287681901], "count": [298]}, "frame_index": {"min": [0], "max": [297], "mean": [148.5], "std": [86.024705753638], "count": [298]}, "episode_index": {"min": [257], "max": [257], "mean": [257.0], "std": [0.0], "count": [298]}, "index": {"min": [68970], "max": [69267], "mean": [69118.5], "std": [86.024705753638], "count": [298]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [298]}}} +{"episode_index": 258, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9764705882352941]], [[0.9686274509803922]], [[0.9803921568627451]]], "mean": [[[0.31785088632621017]], [[0.24765709790996476]], [[0.15908752381567862]]], "std": [[[0.21187335087215842]], [[0.15676249295369912]], [[0.10067796662306443]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3544963097665824]], [[0.2990359760359222]], [[0.22393705779430914]]], "std": [[[0.14276197774815022]], [[0.13393499073768006]], [[0.1435350997303036]]], "count": [100]}, "observation.state": {"min": [-0.46900492906570435, -0.13733962178230286, 0.9829267859458923, 2.047741413116455, -2.432141065597534, -0.09504522383213043, 0.001101793022826314, -0.03986397013068199], "max": [-0.1728932112455368, 0.15739096701145172, 1.2476083040237427, 3.1389665603637695, 0.004468895029276609, 0.306914746761322, 0.03983122482895851, -0.01714569516479969], "mean": [-0.2872864007949829, 0.013557866215705872, 1.1375395059585571, 2.671543836593628, -1.3725582361221313, 0.0789550319314003, 0.017363421618938446, -0.027494119480252266], "std": [0.09316977858543396, 0.11617769300937653, 0.07969897985458374, 0.40671876072883606, 0.8735626339912415, 0.09908395260572433, 0.01463807187974453, 0.00846575852483511], "count": [172]}, "action": {"min": [-0.6214285492897034, -0.4419642984867096, -0.6642857193946838, -0.06785714626312256, -0.07928571105003357, -0.18642857670783997, 0.0], "max": [0.4124999940395355, 0.5866071581840515, 0.7446428537368774, 0.08142857253551483, 0.17714285850524902, 0.059285715222358704, 1.0], "mean": [-0.10122508555650711, -0.06269724667072296, -0.09132061153650284, -0.00011627878848230466, -0.008691857568919659, -0.07965119183063507, 0.26744186878204346], "std": [0.25934699177742004, 0.28408679366111755, 0.3966631293296814, 0.02789829671382904, 0.034538716077804565, 0.07001698017120361, 0.4426251947879791], "count": [172]}, "timestamp": {"min": [0.0], "max": [8.55], "mean": [4.2749999999999995], "std": [2.4825641985656683], "count": [172]}, "frame_index": {"min": [0], "max": [171], "mean": [85.5], "std": [49.65128397131337], "count": [172]}, "episode_index": {"min": [258], "max": [258], "mean": [258.0], "std": [0.0], "count": [172]}, "index": {"min": [69268], "max": [69439], "mean": [69353.5], "std": [49.65128397131337], "count": [172]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [172]}}} +{"episode_index": 259, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5505568602318858]], [[0.5162601402133119]], [[0.48353701004327515]]], "std": [[[0.2674560920766986]], [[0.24455622842323851]], [[0.2220997242948538]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5356144050149356]], [[0.5010319752412684]], [[0.45286300300149357]]], "std": [[[0.2996337763329532]], [[0.27366492745899845]], [[0.254028876244451]]], "count": [100]}, "observation.state": {"min": [-0.20059409737586975, -0.09892530739307404, 0.9274480938911438, 1.8937572240829468, -0.07463553547859192, -0.19183695316314697, 0.011356711387634277, -0.03991875424981117], "max": [0.08368601649999619, 0.20698282122612, 1.1895945072174072, 3.1766629219055176, 2.6340231895446777, 0.5033777356147766, 0.03992534428834915, -0.0016187357250601053], "mean": [-0.07236798107624054, 0.065689817070961, 1.0436469316482544, 2.6660120487213135, 1.3661730289459229, 0.1390233188867569, 0.028749041259288788, -0.02582748606801033], "std": [0.10801278054714203, 0.11233683675527573, 0.08179149776697159, 0.46889814734458923, 1.0354019403457642, 0.20018745958805084, 0.012122890911996365, 0.014864236116409302], "count": [228]}, "action": {"min": [-0.4446428716182709, -0.7607142925262451, -0.8999999761581421, -0.04285714402794838, -0.1607142835855484, -0.05249999836087227, 0.0], "max": [0.7741071581840515, 0.7071428298950195, 0.7124999761581421, 0.07607142627239227, 0.13928571343421936, 0.375, 1.0], "mean": [0.01708177849650383, 0.06972508132457733, -0.12390738725662231, 0.007072368636727333, -0.01317199319601059, 0.07036653161048889, 0.5526315569877625], "std": [0.29261815547943115, 0.35308748483657837, 0.3783614933490753, 0.01867002621293068, 0.0548921637237072, 0.11104648560285568, 0.49722179770469666], "count": [228]}, "timestamp": {"min": [0.0], "max": [11.35], "mean": [5.675000000000001], "std": [3.2908648812533565], "count": [228]}, "frame_index": {"min": [0], "max": [227], "mean": [113.5], "std": [65.81729762506713], "count": [228]}, "episode_index": {"min": [259], "max": [259], "mean": [259.0], "std": [0.0], "count": [228]}, "index": {"min": [69440], "max": [69667], "mean": [69553.5], "std": [65.81729762506713], "count": [228]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [228]}}} +{"episode_index": 260, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.30716290283203124]], [[0.24420567830403644]], [[0.20459976674996172]]], "std": [[[0.14564983614890945]], [[0.13497981084381]], [[0.13856968343230724]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3166519224877451]], [[0.26943025536630666]], [[0.2349857141831342]]], "std": [[[0.15854056783344506]], [[0.1720866972314022]], [[0.1814820571619674]]], "count": [100]}, "observation.state": {"min": [-0.13248564302921295, -0.16120733320713043, 0.4805264472961426, 2.937272071838379, -0.9266460537910461, -0.6867049336433411, 0.000762703362852335, -0.03997701033949852], "max": [0.06525532901287079, 0.28372544050216675, 0.7254467010498047, 3.1620068550109863, 0.06166033446788788, 0.12605606019496918, 0.03992272540926933, -0.0008016201318241656], "mean": [-0.03848902881145477, 0.0683046504855156, 0.6139401793479919, 3.0871424674987793, -0.3811682462692261, -0.19073891639709473, 0.032925788313150406, -0.033908993005752563], "std": [0.05467642843723297, 0.1368139088153839, 0.07361894100904465, 0.053485456854104996, 0.3038223087787628, 0.18791744112968445, 0.008947868831455708, 0.008654369041323662], "count": [367]}, "action": {"min": [-0.3508928716182709, -0.6348214149475098, -0.7178571224212646, -0.0771428570151329, -0.17249999940395355, -0.06857142597436905, 0.0], "max": [0.5142857432365417, 0.7928571701049805, 0.9375, 0.051428571343421936, 0.18000000715255737, 0.035357143729925156, 1.0], "mean": [0.02170591801404953, 0.056067515164613724, -0.011290873400866985, 0.0006276764324866235, 0.0037894127890467644, -0.013546127825975418, 0.5449591279029846], "std": [0.21442322432994843, 0.3303237855434418, 0.4249019920825958, 0.022390583530068398, 0.0641477033495903, 0.020689047873020172, 0.497974693775177], "count": [367]}, "timestamp": {"min": [0.0], "max": [18.3], "mean": [9.149999999999999], "std": [5.297169055259611], "count": [367]}, "frame_index": {"min": [0], "max": [366], "mean": [183.0], "std": [105.94338110519222], "count": [367]}, "episode_index": {"min": [260], "max": [260], "mean": [260.0], "std": [0.0], "count": [367]}, "index": {"min": [69668], "max": [70034], "mean": [69851.0], "std": [105.94338110519222], "count": [367]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [367]}}} +{"episode_index": 261, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.996078431372549]], [[0.996078431372549]]], "mean": [[[0.3487107932894838]], [[0.273163293576708]], [[0.17697479307885264]]], "std": [[[0.20960966030649902]], [[0.15730261472237916]], [[0.1074006806625382]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.984313725490196]], [[0.984313725490196]]], "mean": [[[0.3560887134028416]], [[0.2998172930549173]], [[0.22373588651769302]]], "std": [[[0.13978051369449637]], [[0.1311049928835641]], [[0.1414666148320456]]], "count": [100]}, "observation.state": {"min": [-0.4006332457065582, -0.1784493774175644, 0.9976359009742737, 1.9229782819747925, -2.2544102668762207, -0.46156996488571167, 0.013851013034582138, -0.03991134837269783], "max": [-0.15756304562091827, 0.1487753689289093, 1.2779306173324585, 3.1475701332092285, 0.007062763907015324, -0.024508759379386902, 0.0399136021733284, -0.012887248769402504], "mean": [-0.24082279205322266, -0.001378848566673696, 1.1715611219406128, 2.8107848167419434, -0.8706174492835999, -0.21118836104869843, 0.022809568792581558, -0.022806460037827492], "std": [0.06449172645807266, 0.11417048424482346, 0.0851375088095665, 0.4151840806007385, 0.8146213889122009, 0.14612862467765808, 0.01151865255087614, 0.011506538838148117], "count": [197]}, "action": {"min": [-0.9375, -0.49017858505249023, -0.8035714030265808, -0.07000000029802322, -0.05000000074505806, -0.16357143223285675, 0.0], "max": [0.46875, 0.42053571343421936, 0.9026785492897034, 0.014999999664723873, 0.07214285433292389, 0.006428571417927742, 1.0], "mean": [-0.06458484381437302, -0.05143672972917557, -0.047412075102329254, -0.008364757522940636, 0.011569979600608349, -0.0705764964222908, 0.29949238896369934], "std": [0.26977744698524475, 0.22813846170902252, 0.37449607253074646, 0.018048392608761787, 0.02998208813369274, 0.05664459243416786, 0.4580352306365967], "count": [197]}, "timestamp": {"min": [0.0], "max": [9.8], "mean": [4.8999999999999995], "std": [2.843413441622586], "count": [197]}, "frame_index": {"min": [0], "max": [196], "mean": [98.0], "std": [56.868268832451726], "count": [197]}, "episode_index": {"min": [261], "max": [261], "mean": [261.0], "std": [0.0], "count": [197]}, "index": {"min": [70035], "max": [70231], "mean": [70133.0], "std": [56.868268832451726], "count": [197]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [197]}}} +{"episode_index": 262, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5940642987419578]], [[0.5457737731933594]], [[0.4933701620662913]]], "std": [[[0.2762001596738112]], [[0.26358510173785293]], [[0.24357982677612994]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5490030553481159]], [[0.5094275393018536]], [[0.4597399082557828]]], "std": [[[0.30040293667703644]], [[0.27987260075105314]], [[0.26586207806282164]]], "count": [100]}, "observation.state": {"min": [-0.21078461408615112, -0.09798318147659302, 0.9160870909690857, 2.1229889392852783, -2.215912103652954, -1.3394410610198975, 0.001957631204277277, -0.04099670797586441], "max": [0.01550507452338934, 0.1940356343984604, 1.168261170387268, 3.1402857303619385, 0.0027076820842921734, 0.24604159593582153, 0.0400938019156456, -0.0015401870477944613], "mean": [-0.03096706047654152, 0.017707666382193565, 1.0241882801055908, 2.5197694301605225, -1.7832823991775513, -0.23904135823249817, 0.028292331844568253, -0.02816544473171234], "std": [0.057343509048223495, 0.0898563414812088, 0.08438144624233246, 0.3235158920288086, 0.6268255114555359, 0.5288490653038025, 0.016386760398745537, 0.01661377027630806], "count": [228]}, "action": {"min": [-0.38303571939468384, -0.7526785731315613, -0.6187499761581421, -0.028928572311997414, -0.1371428519487381, -0.2710714340209961, 0.0], "max": [0.5383928418159485, 0.8598214387893677, 0.8276785612106323, 0.20999999344348907, 0.11892857402563095, 0.02678571455180645, 1.0], "mean": [0.04160007834434509, 0.12529370188713074, -0.0917527973651886, 0.03548402711749077, -0.001527255866676569, -0.061057329177856445, 0.6973684430122375], "std": [0.2221294343471527, 0.38870182633399963, 0.35346677899360657, 0.054054953157901764, 0.06490422040224075, 0.08727118372917175, 0.4593975841999054], "count": [228]}, "timestamp": {"min": [0.0], "max": [11.35], "mean": [5.675000000000001], "std": [3.2908648812533565], "count": [228]}, "frame_index": {"min": [0], "max": [227], "mean": [113.5], "std": [65.81729762506713], "count": [228]}, "episode_index": {"min": [262], "max": [262], "mean": [262.0], "std": [0.0], "count": [228]}, "index": {"min": [70232], "max": [70459], "mean": [70345.5], "std": [65.81729762506713], "count": [228]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [228]}}} +{"episode_index": 263, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5845485953536689]], [[0.5482947154325597]], [[0.5092259689031863]]], "std": [[[0.2550853489350155]], [[0.23385442745003696]], [[0.212938209359249]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5405312787224265]], [[0.5057094188017004]], [[0.4572305650898054]]], "std": [[[0.3007587166929199]], [[0.2753707678941781]], [[0.2563707018433176]]], "count": [100]}, "observation.state": {"min": [-0.23435626924037933, -0.08011525124311447, 0.9342746138572693, 2.1731221675872803, 0.003979667089879513, -0.16438566148281097, 0.0055824145674705505, -0.04001250118017197], "max": [0.088083915412426, 0.2178826928138733, 1.1890476942062378, 3.158952474594116, 2.8911173343658447, 0.9380003809928894, 0.03995416313409805, -0.0022428729571402073], "mean": [-0.08460766822099686, 0.07204047590494156, 1.061418890953064, 2.6988942623138428, 1.4567580223083496, 0.32299837470054626, 0.02656644582748413, -0.025342585518956184], "std": [0.12659429013729095, 0.10331004112958908, 0.08267723023891449, 0.37518009543418884, 1.0464189052581787, 0.32364892959594727, 0.014294872060418129, 0.015048465691506863], "count": [307]}, "action": {"min": [-0.5223214030265808, -0.5651785731315613, -0.7098214030265808, -0.062142856419086456, -0.22714285552501678, -0.027857143431901932, 0.0], "max": [0.6589285731315613, 0.6294642686843872, 0.6803571581840515, 0.13607142865657806, 0.1435714215040207, 0.375, 1.0], "mean": [0.057070206850767136, 0.04324975609779358, -0.045718930661678314, 0.013928571715950966, -0.0025337350089102983, 0.05345975235104561, 0.5374592542648315], "std": [0.23429042100906372, 0.24159085750579834, 0.3151412010192871, 0.03704923391342163, 0.06735000759363174, 0.09145882725715637, 0.49859508872032166], "count": [307]}, "timestamp": {"min": [0.0], "max": [15.3], "mean": [7.65], "std": [4.431139808220905], "count": [307]}, "frame_index": {"min": [0], "max": [306], "mean": [153.0], "std": [88.6227961644181], "count": [307]}, "episode_index": {"min": [263], "max": [263], "mean": [263.0], "std": [0.0], "count": [307]}, "index": {"min": [70460], "max": [70766], "mean": [70613.0], "std": [88.6227961644181], "count": [307]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [307]}}} +{"episode_index": 264, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3604867499856388]], [[0.29696753468232995]], [[0.2530243560192632]]], "std": [[[0.14579093814807845]], [[0.1517781450213121]], [[0.16076499872974673]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.314336150524663]], [[0.2653943738750383]], [[0.23204560223747703]]], "std": [[[0.14990073934749013]], [[0.16357557193801453]], [[0.17215804193732243]]], "count": [100]}, "observation.state": {"min": [-0.13593733310699463, -0.2752411663532257, 0.508297860622406, 2.982114315032959, -0.3874945342540741, -0.09067258983850479, 0.001170449540950358, -0.039833925664424896], "max": [0.019165264442563057, 0.37932857871055603, 0.6769713163375854, 3.2290737628936768, 0.5802471041679382, 0.29940685629844666, 0.039922092109918594, -0.0033152634277939796], "mean": [-0.033559270203113556, -0.012367053888738155, 0.5684792399406433, 3.11399507522583, 0.15290597081184387, 0.06177914887666702, 0.018636373803019524, -0.01911705732345581], "std": [0.040072862058877945, 0.22455818951129913, 0.04881458356976509, 0.05992276966571808, 0.23734478652477264, 0.1062898188829422, 0.016723882406949997, 0.016214046627283096], "count": [286]}, "action": {"min": [-0.4044642746448517, -0.7151785492897034, -0.5571428537368774, -0.06428571790456772, -0.10178571194410324, -0.09857142716646194, 0.0], "max": [0.8544642925262451, 0.84375, 0.65625, 0.15000000596046448, 0.1574999988079071, 0.1510714292526245, 1.0], "mean": [0.015818556770682335, 0.08843028545379639, -0.04941309243440628, -0.0030382112599909306, -0.0016108896816149354, -0.007728521712124348, 0.4160839021205902], "std": [0.24553950130939484, 0.3695782423019409, 0.2927776873111725, 0.030457885935902596, 0.03734024614095688, 0.04697684943675995, 0.49290791153907776], "count": [286]}, "timestamp": {"min": [0.0], "max": [14.25], "mean": [7.125], "std": [4.128029190788262], "count": [286]}, "frame_index": {"min": [0], "max": [285], "mean": [142.5], "std": [82.56058381576526], "count": [286]}, "episode_index": {"min": [264], "max": [264], "mean": [264.0], "std": [0.0], "count": [286]}, "index": {"min": [70767], "max": [71052], "mean": [70909.5], "std": [82.56058381576526], "count": [286]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [286]}}} +{"episode_index": 265, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3200125726438036]], [[0.2677981411803002]], [[0.2363638556985294]]], "std": [[[0.16392326796043513]], [[0.16393592319112327]], [[0.17038004559829695]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3136932510675169]], [[0.2686582689472273]], [[0.23578958070044423]]], "std": [[[0.15390555800021058]], [[0.16886407721473426]], [[0.17713666505263004]]], "count": [100]}, "observation.state": {"min": [-0.1665743738412857, -0.1298816055059433, 0.4503316283226013, 3.0194787979125977, -0.7065553665161133, -0.48271021246910095, 0.015701286494731903, -0.0400879941880703], "max": [0.08378062397241592, 0.26670339703559875, 0.68886399269104, 3.1457724571228027, 0.0008415410411544144, 0.21584714949131012, 0.039845991879701614, -0.0209181047976017], "mean": [-0.03443341329693794, 0.08553189784288406, 0.5939452648162842, 3.084117889404297, -0.4452342987060547, -0.21847887337207794, 0.03154369443655014, -0.03460787609219551], "std": [0.07035083323717117, 0.13695625960826874, 0.0642382800579071, 0.02948392555117607, 0.21383948624134064, 0.17405271530151367, 0.00834057480096817, 0.006102775223553181], "count": [252]}, "action": {"min": [-0.5544642806053162, -0.7741071581840515, -0.8357142806053162, -0.11249999701976776, -0.167142853140831, -0.14571428298950195, 0.0], "max": [0.6723214387893677, 0.8812500238418579, 0.9375, 0.09749999642372131, 0.10178571194410324, 0.1039285734295845, 1.0], "mean": [0.000552713347133249, 0.06467899680137634, -0.03176019713282585, 0.0002593536046333611, -0.0014965995214879513, -0.008235546760261059, 0.5317460298538208], "std": [0.28375303745269775, 0.4224940538406372, 0.44504615664482117, 0.028060197830200195, 0.04035387560725212, 0.05245305597782135, 0.49899065494537354], "count": [252]}, "timestamp": {"min": [0.0], "max": [12.55], "mean": [6.2749999999999995], "std": [3.6372780573756893], "count": [252]}, "frame_index": {"min": [0], "max": [251], "mean": [125.5], "std": [72.74556114751378], "count": [252]}, "episode_index": {"min": [265], "max": [265], "mean": [265.0], "std": [0.0], "count": [252]}, "index": {"min": [71053], "max": [71304], "mean": [71178.5], "std": [72.74556114751378], "count": [252]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [252]}}} +{"episode_index": 266, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3254141749961703]], [[0.27390413710650274]], [[0.245557160022212]]], "std": [[[0.14643553931079273]], [[0.14684118854777384]], [[0.1564222395171524]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31993023741479015]], [[0.2750950544768688]], [[0.2422415609920726]]], "std": [[[0.1596655863302953]], [[0.17587207551844997]], [[0.1845768138668776]]], "count": [100]}, "observation.state": {"min": [-0.15475133061408997, -0.1293000876903534, 0.4485904276371002, 3.0513713359832764, -0.6439383625984192, -0.5220615267753601, 0.021674461662769318, -0.04018013924360275], "max": [0.07158110290765762, 0.2683185040950775, 0.6904048323631287, 3.2693960666656494, -3.4145836252719164e-05, 0.135456845164299, 0.03986824303865433, -0.020376212894916534], "mean": [-0.03472207486629486, 0.09084291756153107, 0.6059457659721375, 3.140599489212036, -0.34231361746788025, -0.10103437304496765, 0.03229503333568573, -0.03305473551154137], "std": [0.06833861768245697, 0.1362275779247284, 0.07824476808309555, 0.05150272697210312, 0.1383076310157776, 0.18013352155685425, 0.007201021071523428, 0.007631858345121145], "count": [240]}, "action": {"min": [-0.5383928418159485, -0.7044642567634583, -0.7553571462631226, -0.0803571417927742, -0.18321429193019867, -0.14892856776714325, 0.0], "max": [0.6455357074737549, 0.9053571224212646, 0.9375, 0.0835714265704155, 0.24535714089870453, 0.08464285731315613, 1.0], "mean": [0.024709831923246384, 0.08594862371683121, -0.007109372410923243, 0.003888391423970461, 0.005477680824697018, -0.01083928532898426, 0.5416666865348816], "std": [0.24513521790504456, 0.40902769565582275, 0.4547775089740753, 0.03230377659201622, 0.0792902335524559, 0.04165662080049515, 0.49826088547706604], "count": [240]}, "timestamp": {"min": [0.0], "max": [11.95], "mean": [5.975], "std": [3.4640715446807193], "count": [240]}, "frame_index": {"min": [0], "max": [239], "mean": [119.5], "std": [69.2814308936144], "count": [240]}, "episode_index": {"min": [266], "max": [266], "mean": [266.0], "std": [0.0], "count": [240]}, "index": {"min": [71305], "max": [71544], "mean": [71424.5], "std": [69.2814308936144], "count": [240]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [240]}}} +{"episode_index": 267, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3546836440142463]], [[0.2908975668514476]], [[0.24747778918696386]]], "std": [[[0.1410464810482489]], [[0.14557478623980555]], [[0.15375450878038618]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3142898044960171]], [[0.2651828655168122]], [[0.231704002829159]]], "std": [[[0.1513775376371295]], [[0.16485192124001313]], [[0.17313875990682026]]], "count": [100]}, "observation.state": {"min": [-0.1269110143184662, -0.30470964312553406, 0.5049793720245361, 3.002331018447876, -0.005864948034286499, -0.09114839881658554, 0.0038150083273649216, -0.03985965996980667], "max": [0.010483120568096638, 0.362834095954895, 0.6742517352104187, 3.146183967590332, 0.6219228506088257, 0.1466967612504959, 0.0399274043738842, -0.00365005386993289], "mean": [-0.03354125842452049, -0.04922715574502945, 0.5763506293296814, 3.088557720184326, 0.2526547312736511, 0.02972324751317501, 0.021944057196378708, -0.021795734763145447], "std": [0.03622475266456604, 0.2095794528722763, 0.045706287026405334, 0.03192446753382683, 0.1461789309978485, 0.06609881669282913, 0.01653270609676838, 0.016330815851688385], "count": [232]}, "action": {"min": [-0.46071428060531616, -0.7392857074737549, -0.5571428537368774, -0.0771428570151329, -0.04500000178813934, -0.08250000327825546, 0.0], "max": [0.47678571939468384, 0.8678571581840515, 0.5625, 0.062142856419086456, 0.06964285671710968, 0.14571428298950195, 1.0], "mean": [0.020031550899147987, 0.12806344032287598, -0.05754310265183449, -0.0018103442853316665, 0.00012930914817843586, 0.0064285751432180405, 0.47413793206214905], "std": [0.20481956005096436, 0.4179023802280426, 0.31203004717826843, 0.014554280787706375, 0.01934930495917797, 0.04951652139425278, 0.49933120608329773], "count": [232]}, "timestamp": {"min": [0.0], "max": [11.55], "mean": [5.7749999999999995], "std": [3.3486004539210104], "count": [232]}, "frame_index": {"min": [0], "max": [231], "mean": [115.5], "std": [66.97200907842021], "count": [232]}, "episode_index": {"min": [267], "max": [267], "mean": [267.0], "std": [0.0], "count": [232]}, "index": {"min": [71545], "max": [71776], "mean": [71660.5], "std": [66.97200907842021], "count": [232]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [232]}}} +{"episode_index": 268, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6000249711578968]], [[0.5526374362122779]], [[0.49964607807234224]]], "std": [[[0.2750775198425822]], [[0.26079843261773333]], [[0.24007447619144]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5479671612907858]], [[0.5082342648973652]], [[0.4582486428653492]]], "std": [[[0.2989984499159434]], [[0.27781369595768296]], [[0.2632594330535056]]], "count": [100]}, "observation.state": {"min": [-0.2119426280260086, -0.06300681084394455, 0.9242589473724365, 2.2276172637939453, -2.1896517276763916, -0.7852998375892639, 0.0029526602011173964, -0.04032675176858902], "max": [0.07324406504631042, 0.19180643558502197, 1.1693705320358276, 3.1404805183410645, -0.0025695504155009985, 0.3327098488807678, 0.04050121828913689, -0.0023561555426567793], "mean": [-0.028006548061966896, 0.02428469806909561, 1.0426238775253296, 2.6968729496002197, -1.685617208480835, -0.07245006412267685, 0.027814004570245743, -0.02731909416615963], "std": [0.07593653351068497, 0.07937678694725037, 0.081748366355896, 0.24017053842544556, 0.5552176237106323, 0.3533647656440735, 0.015848252922296524, 0.016842635348439217], "count": [229]}, "action": {"min": [-0.46339285373687744, -0.6991071701049805, -0.65625, -0.06535714119672775, -0.13500000536441803, -0.2882142961025238, 0.0], "max": [0.5758928656578064, 0.8651785850524902, 0.7955357432365417, 0.17464286088943481, 0.1403571367263794, 0.07821428775787354, 1.0], "mean": [0.07080087810754776, 0.11942451447248459, -0.09480270743370056, 0.023697752505540848, -0.004809731617569923, -0.05132094398140907, 0.6681222915649414], "std": [0.2451011836528778, 0.3474216163158417, 0.3788561522960663, 0.048231787979602814, 0.06852144747972488, 0.09417038410902023, 0.4708872139453888], "count": [229]}, "timestamp": {"min": [0.0], "max": [11.4], "mean": [5.7], "std": [3.3052987762076818], "count": [229]}, "frame_index": {"min": [0], "max": [228], "mean": [114.0], "std": [66.10597552415364], "count": [229]}, "episode_index": {"min": [268], "max": [268], "mean": [268.0], "std": [0.0], "count": [229]}, "index": {"min": [71777], "max": [72005], "mean": [71891.0], "std": [66.10597552415364], "count": [229]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [229]}}} +{"episode_index": 269, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5554237407609528]], [[0.5128575744628906]], [[0.45699365832758887]]], "std": [[[0.3013158552948869]], [[0.27235376400401906]], [[0.2424513486777366]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.512570873784084]], [[0.48086552937825516]], [[0.4344409574620864]]], "std": [[[0.3076226177941077]], [[0.2807612185764349]], [[0.2594026589458643]]], "count": [100]}, "observation.state": {"min": [-0.3415084481239319, -0.09449977427721024, 0.9637398719787598, 1.864965796470642, -2.6947031021118164, -1.1888233423233032, 0.008648707531392574, -0.040009357035160065], "max": [0.020105158910155296, 0.2546856105327606, 1.1809940338134766, 3.3268346786499023, 0.00028629734879359603, -0.07183372229337692, 0.04000459611415863, -0.004539240151643753], "mean": [-0.08655770868062973, 0.08433333039283752, 1.0757297277450562, 2.5857017040252686, -1.8216997385025024, -0.6412511467933655, 0.031407102942466736, -0.03126285597681999], "std": [0.11016792058944702, 0.11944955587387085, 0.06288272887468338, 0.42736130952835083, 0.747789204120636, 0.3191065788269043, 0.01298495288938284, 0.013344827108085155], "count": [269]}, "action": {"min": [-0.8919642567634583, -0.5625, -0.4526785612106323, -0.1071428582072258, -0.10821428894996643, -0.26571428775787354, 0.0], "max": [0.7580357193946838, 0.8276785612106323, 0.5491071343421936, 0.1542857140302658, 0.2175000011920929, 0.3085714280605316, 1.0], "mean": [0.02675584889948368, 0.16198880970478058, -0.03632502257823944, -0.004851297475397587, 0.025447415187954903, 0.002142861718311906, 0.7286245226860046], "std": [0.35506847500801086, 0.3532125651836395, 0.22300072014331818, 0.049700502306222916, 0.07154855132102966, 0.14304743707180023, 0.4446703791618347], "count": [269]}, "timestamp": {"min": [0.0], "max": [13.4], "mean": [6.700000000000001], "std": [3.8826537316634355], "count": [269]}, "frame_index": {"min": [0], "max": [268], "mean": [134.0], "std": [77.6530746332687], "count": [269]}, "episode_index": {"min": [269], "max": [269], "mean": [269.0], "std": [0.0], "count": [269]}, "index": {"min": [72006], "max": [72274], "mean": [72140.0], "std": [77.6530746332687], "count": [269]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [269]}}} +{"episode_index": 270, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5790519002278646]], [[0.531260191674326]], [[0.48238822607900583]]], "std": [[[0.28865520610440265]], [[0.26157688693909736]], [[0.23192548864557777]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5693073742436427]], [[0.5307294287588082]], [[0.48058034380744485]]], "std": [[[0.2957785780768825]], [[0.2727082214866507]], [[0.25514176412202905]]], "count": [100]}, "observation.state": {"min": [-0.19476057589054108, -0.2564786374568939, 1.0093085765838623, 2.329164505004883, -2.722888946533203, -0.8342063426971436, 0.007628731429576874, -0.03986676409840584], "max": [0.0571507029235363, 0.22189609706401825, 1.1804008483886719, 3.1393556594848633, -0.0011194440303370357, -0.05133502557873726, 0.040078096091747284, -0.010504987090826035], "mean": [-0.032662250101566315, -0.009056705050170422, 1.0917717218399048, 2.598896026611328, -2.2889084815979004, -0.4343445599079132, 0.033097900450229645, -0.03211214393377304], "std": [0.06487876921892166, 0.15006862580776215, 0.04979187995195389, 0.18242935836315155, 0.5702046155929565, 0.2317962497472763, 0.01189383678138256, 0.011199722066521645], "count": [457]}, "action": {"min": [-0.4794642925262451, -0.8223214149475098, -0.4848214387893677, -0.05249999836087227, -0.09964285790920258, -0.2678571343421936, 0.0], "max": [0.46875, 0.6696428656578064, 0.4580357074737549, 0.11892857402563095, 0.1307142823934555, 0.08464285731315613, 1.0], "mean": [0.016423095017671585, -0.028338920325040817, -0.05294427275657654, 0.009771804325282574, -0.0019318531267344952, -0.02351750060915947, 0.6236323714256287], "std": [0.20807363092899323, 0.32322609424591064, 0.2304835468530655, 0.027870317921042442, 0.04309844225645065, 0.07827050983905792, 0.48447340726852417], "count": [457]}, "timestamp": {"min": [0.0], "max": [22.8], "mean": [11.4], "std": [6.596211033616193], "count": [457]}, "frame_index": {"min": [0], "max": [456], "mean": [228.0], "std": [131.92422067232386], "count": [457]}, "episode_index": {"min": [270], "max": [270], "mean": [270.0], "std": [0.0], "count": [457]}, "index": {"min": [72275], "max": [72731], "mean": [72503.0], "std": [131.92422067232386], "count": [457]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [457]}}} +{"episode_index": 271, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35394398947323075]], [[0.2891149010751762]], [[0.24961611878638176]]], "std": [[[0.16051296543946547]], [[0.16436778847656497]], [[0.17156007951104305]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32544879030713847]], [[0.28040565759995406]], [[0.2506624331006817]]], "std": [[[0.15814407853756127]], [[0.17457319404740076]], [[0.18564447879120813]]], "count": [100]}, "observation.state": {"min": [-0.11737427115440369, -0.11320042610168457, 0.4475833475589752, 3.033967971801758, -0.2997588515281677, -0.21895073354244232, 0.0023576614912599325, -0.03981955349445343], "max": [0.15787439048290253, 0.16588342189788818, 0.6755071878433228, 3.1945385932922363, 0.49245455861091614, 0.10992854088544846, 0.04037294536828995, -0.0028446046635508537], "mean": [0.02291223593056202, 0.05272357910871506, 0.5316395163536072, 3.109163284301758, 0.07652243971824646, -0.04714467376470566, 0.024949796497821808, -0.022363899275660515], "std": [0.08831556141376495, 0.08949756622314453, 0.07087244838476181, 0.05677744001150131, 0.29439952969551086, 0.09653341770172119, 0.014869900420308113, 0.014541233889758587], "count": [281]}, "action": {"min": [-0.6000000238418579, -0.38303571939468384, -0.6000000238418579, -0.062142856419086456, -0.061071429401636124, -0.09000000357627869, 0.0], "max": [0.8276785612106323, 0.5732142925262451, 0.49017858505249023, 0.07392857223749161, 0.03857142850756645, 0.12107142806053162, 1.0], "mean": [0.025498872622847557, 0.03358224406838417, -0.10293909162282944, -0.002543213777244091, -0.003519319463521242, -0.004556424915790558, 0.44483986496925354], "std": [0.33470308780670166, 0.19166283309459686, 0.28642717003822327, 0.022468270733952522, 0.016891388222575188, 0.04074036329984665, 0.4969486594200134], "count": [281]}, "timestamp": {"min": [0.0], "max": [14.0], "mean": [7.0], "std": [4.055859958134649], "count": [281]}, "frame_index": {"min": [0], "max": [280], "mean": [140.0], "std": [81.11719916269298], "count": [281]}, "episode_index": {"min": [271], "max": [271], "mean": [271.0], "std": [0.0], "count": [281]}, "index": {"min": [72732], "max": [73012], "mean": [72872.0], "std": [81.11719916269298], "count": [281]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [281]}}} +{"episode_index": 272, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5642276401893765]], [[0.5270610632802926]], [[0.489828384698606]]], "std": [[[0.26021832562019054]], [[0.2351170849307222]], [[0.20929911602426737]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.539796246696921]], [[0.5046408948711321]], [[0.45607534969554225]]], "std": [[[0.2997471725172048]], [[0.27404793237035513]], [[0.25473352546032857]]], "count": [100]}, "observation.state": {"min": [-0.20490150153636932, -0.07617689669132233, 0.9269028902053833, 2.31238055229187, -0.003223187057301402, -0.27296966314315796, 0.0016112100565806031, -0.04001317918300629], "max": [0.08617233484983444, 0.22021132707595825, 1.1834754943847656, 3.1478843688964844, 2.076692581176758, 0.5488966107368469, 0.03992220014333725, -0.005404657684266567], "mean": [-0.06187908723950386, 0.07002530992031097, 1.054732322692871, 2.7036783695220947, 1.2429434061050415, 0.11942974478006363, 0.027959419414401054, -0.028627784922719002], "std": [0.11626730859279633, 0.11466997116804123, 0.08206302672624588, 0.31614503264427185, 0.8136064410209656, 0.2691688537597656, 0.014056309126317501, 0.01363610289990902], "count": [272]}, "action": {"min": [-0.4285714328289032, -0.6053571701049805, -0.9294642806053162, -0.04714285582304001, -0.18214285373687744, -0.0535714291036129, 0.0], "max": [0.8089285492897034, 0.8223214149475098, 0.8008928298950195, 0.0503571443259716, 0.12857143580913544, 0.375, 1.0], "mean": [0.04284728690981865, 0.046008408069610596, -0.08746717870235443, 0.009004727005958557, -0.005132616497576237, 0.04838365316390991, 0.6066176295280457], "std": [0.2693295478820801, 0.31273022294044495, 0.36212649941444397, 0.018811069428920746, 0.05943847820162773, 0.10283573716878891, 0.4885004758834839], "count": [272]}, "timestamp": {"min": [0.0], "max": [13.55], "mean": [6.7749999999999995], "std": [3.9259552977587506], "count": [272]}, "frame_index": {"min": [0], "max": [271], "mean": [135.5], "std": [78.51910595517501], "count": [272]}, "episode_index": {"min": [272], "max": [272], "mean": [272.0], "std": [0.0], "count": [272]}, "index": {"min": [73013], "max": [73284], "mean": [73148.5], "std": [78.51910595517501], "count": [272]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [272]}}} +{"episode_index": 273, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3433706276089537]], [[0.27295483877144605]], [[0.22894224279067096]]], "std": [[[0.15226054746193776]], [[0.1430698628483232]], [[0.14140535153463132]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3250187276204427]], [[0.2799394261977252]], [[0.24682292624080882]]], "std": [[[0.16644903172554779]], [[0.18157562936758062]], [[0.1916317898148719]]], "count": [100]}, "observation.state": {"min": [-0.04701079800724983, -0.23624563217163086, 0.4471096992492676, 3.0497987270355225, -0.5318764448165894, -0.4995395541191101, 0.020579325035214424, -0.039979487657547], "max": [0.13263757526874542, 0.29186341166496277, 0.7702807784080505, 3.33697247505188, 0.03387656435370445, 0.1622042953968048, 0.03996645659208298, -0.015683898702263832], "mean": [0.0421745590865612, 0.04343569651246071, 0.5955159664154053, 3.170574188232422, -0.20419776439666748, -0.10061914473772049, 0.03084169141948223, -0.030775316059589386], "std": [0.04628601297736168, 0.15371906757354736, 0.10146237164735794, 0.07745558023452759, 0.16351690888404846, 0.1822279542684555, 0.008785630576312542, 0.009301139973104], "count": [322]}, "action": {"min": [-0.65625, -0.7526785731315613, -0.7741071581840515, -0.16178570687770844, -0.18642857670783997, -0.1039285734295845, 0.0], "max": [0.637499988079071, 0.8598214387893677, 0.9375, 0.15321429073810577, 0.18535713851451874, 0.1403571367263794, 1.0], "mean": [-0.0019049488473683596, 0.06712234020233154, -0.04648406058549881, 0.005580080207437277, 0.003277507144957781, -0.0029647245537489653, 0.5590062141418457], "std": [0.25768521428108215, 0.41597312688827515, 0.4546594023704529, 0.048538267612457275, 0.06131253391504288, 0.047463513910770416, 0.4965062141418457], "count": [322]}, "timestamp": {"min": [0.0], "max": [16.05], "mean": [8.025], "std": [4.647647254256717], "count": [322]}, "frame_index": {"min": [0], "max": [321], "mean": [160.5], "std": [92.95294508513435], "count": [322]}, "episode_index": {"min": [273], "max": [273], "mean": [273.0], "std": [0.0], "count": [322]}, "index": {"min": [73285], "max": [73606], "mean": [73445.5], "std": [92.95294508513435], "count": [322]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [322]}}} +{"episode_index": 274, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6071346758674173]], [[0.5626458076028262]], [[0.5093983004700904]]], "std": [[[0.2766754151251943]], [[0.25736299735246687]], [[0.23502050517215403]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5481860333610984]], [[0.5083788631663604]], [[0.45854592356962315]]], "std": [[[0.29998576160527796]], [[0.27919401716576564]], [[0.2647494269826343]]], "count": [100]}, "observation.state": {"min": [-0.2037961632013321, -0.057693056762218475, 0.9227483868598938, 2.511333703994751, -1.8902133703231812, -0.82228022813797, 0.0021411501802504063, -0.04008932784199715], "max": [0.05659022554755211, 0.1805724948644638, 1.177370309829712, 3.140927314758301, -0.003624546341598034, 0.2931792736053467, 0.040645793080329895, -0.0011999595444649458], "mean": [-0.02112029865384102, 0.022184723988175392, 1.0239611864089966, 2.7711703777313232, -1.5200974941253662, -0.16596776247024536, 0.02796717919409275, -0.02694806456565857], "std": [0.06470859050750732, 0.07905148714780807, 0.08362212777137756, 0.1846042424440384, 0.5104769468307495, 0.3521710932254791, 0.016466278582811356, 0.01702038384974003], "count": [230]}, "action": {"min": [-0.7767857313156128, -0.6723214387893677, -0.6187499761581421, -0.0771428570151329, -0.1307142823934555, -0.2582142949104309, 0.0], "max": [0.6294642686843872, 0.7848214507102966, 0.6669642925262451, 0.12214285880327225, 0.17571428418159485, 0.07392857223749161, 1.0], "mean": [0.044359441846609116, 0.10968167334794998, -0.08923136442899704, 0.012069870717823505, 0.012559004127979279, -0.041673921048641205, 0.6695652008056641], "std": [0.2992710769176483, 0.35067981481552124, 0.32846367359161377, 0.04312514141201973, 0.06555303186178207, 0.08937771618366241, 0.47037023305892944], "count": [230]}, "timestamp": {"min": [0.0], "max": [11.45], "mean": [5.725], "std": [3.319732669960038], "count": [230]}, "frame_index": {"min": [0], "max": [229], "mean": [114.5], "std": [66.39465339920075], "count": [230]}, "episode_index": {"min": [274], "max": [274], "mean": [274.0], "std": [0.0], "count": [230]}, "index": {"min": [73607], "max": [73836], "mean": [73721.5], "std": [66.39465339920075], "count": [230]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [230]}}} +{"episode_index": 275, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.331774429620481]], [[0.27064086136163445]], [[0.23192800125421262]]], "std": [[[0.13572821955942493]], [[0.12594730971807602]], [[0.12223041711266296]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3243149701286765]], [[0.2801765405991498]], [[0.24769815901214]]], "std": [[[0.16534395478286099]], [[0.1819728341554084]], [[0.19119456491665757]]], "count": [100]}, "observation.state": {"min": [-0.15131597220897675, -0.11816588789224625, 0.44573014974594116, 3.0333704948425293, -0.7759209871292114, -0.10009482502937317, 0.02074182778596878, -0.04025033488869667], "max": [0.09613099694252014, 0.25020647048950195, 0.7298070788383484, 3.142360210418701, 0.2076447457075119, 0.4130101799964905, 0.040468331426382065, -0.021286509931087494], "mean": [-0.0019280239939689636, 0.05386172607541084, 0.6012308597564697, 3.0806336402893066, -0.3536551594734192, 0.10291160643100739, 0.0351409986615181, -0.03567076101899147], "std": [0.0688028410077095, 0.12624451518058777, 0.0857481062412262, 0.030543990433216095, 0.3132796287536621, 0.13417139649391174, 0.007017052732408047, 0.006946520414203405], "count": [265]}, "action": {"min": [-0.6455357074737549, -0.8999999761581421, -0.7794643044471741, -0.07285714149475098, -0.11357142776250839, -0.18000000715255737, 0.0], "max": [0.8223214149475098, 0.8732143044471741, 0.9375, 0.0535714291036129, 0.09000000357627869, 0.260357141494751, 1.0], "mean": [-0.015070770867168903, 0.06027289107441902, -0.05563341826200485, -0.000234501640079543, -0.008340970613062382, -0.0030849063768982887, 0.6226415038108826], "std": [0.30705997347831726, 0.3868412375450134, 0.47190460562705994, 0.021318648010492325, 0.035668548196554184, 0.07552385330200195, 0.4847257435321808], "count": [265]}, "timestamp": {"min": [0.0], "max": [13.2], "mean": [6.6], "std": [3.8249182997810554], "count": [265]}, "frame_index": {"min": [0], "max": [264], "mean": [132.0], "std": [76.49836599562111], "count": [265]}, "episode_index": {"min": [275], "max": [275], "mean": [275.0], "std": [0.0], "count": [265]}, "index": {"min": [73837], "max": [74101], "mean": [73969.0], "std": [76.49836599562111], "count": [265]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [265]}}} +{"episode_index": 276, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5302362676882276]], [[0.4902285904229856]], [[0.43661283365885417]]], "std": [[[0.30688945256343547]], [[0.27729143569118064]], [[0.24757657310879974]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5054752233168658]], [[0.47532657039866727]], [[0.43063606710994945]]], "std": [[[0.31169870796304866]], [[0.28584447991316486]], [[0.26573361152891045]]], "count": [100]}, "observation.state": {"min": [-0.26420286297798157, -0.07872124016284943, 0.9705618023872375, 2.222872495651245, -2.9654314517974854, -1.0328553915023804, 0.008374810218811035, -0.03996666520833969], "max": [0.02984512969851494, 0.28168848156929016, 1.19927179813385, 3.27260684967041, -0.0011039817472919822, -0.07112845033407211, 0.040017686784267426, -0.009259449318051338], "mean": [-0.05610531568527222, 0.08609340339899063, 1.0730500221252441, 2.7253215312957764, -2.0875403881073, -0.6964276432991028, 0.030810076743364334, -0.03091192990541458], "std": [0.08538474142551422, 0.11285000294446945, 0.06630522012710571, 0.3344446122646332, 0.8496651649475098, 0.29324203729629517, 0.013655764982104301, 0.013330880552530289], "count": [291]}, "action": {"min": [-0.6508928537368774, -0.6883928775787354, -0.84375, -0.13500000536441803, -0.17142857611179352, -0.27214285731315613, 0.0], "max": [0.7633928656578064, 0.8062499761581421, 0.581250011920929, 0.1810714304447174, 0.2046428620815277, 0.3182142972946167, 1.0], "mean": [0.026030942797660828, 0.09186301380395889, -0.044136594980955124, 0.01273932121694088, 0.01569218561053276, -0.008258475922048092, 0.7147766351699829], "std": [0.3105992078781128, 0.32096269726753235, 0.2761000990867615, 0.06647744029760361, 0.06284039467573166, 0.13267925381660461, 0.45152080059051514], "count": [291]}, "timestamp": {"min": [0.0], "max": [14.5], "mean": [7.25], "std": [4.200198408012016], "count": [291]}, "frame_index": {"min": [0], "max": [290], "mean": [145.0], "std": [84.0039681602403], "count": [291]}, "episode_index": {"min": [276], "max": [276], "mean": [276.0], "std": [0.0], "count": [291]}, "index": {"min": [74102], "max": [74392], "mean": [74247.0], "std": [84.0039681602403], "count": [291]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [291]}}} +{"episode_index": 277, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5613039658490349]], [[0.52648737709195]], [[0.4919716940487132]]], "std": [[[0.264784483280723]], [[0.24227106971211368]], [[0.21978541569845497]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5373623519598268]], [[0.5027923925063189]], [[0.4546756819182751]]], "std": [[[0.2994672934486174]], [[0.2736766722188009]], [[0.2541380509377287]]], "count": [100]}, "observation.state": {"min": [-0.2090437114238739, -0.08903222531080246, 0.9256992340087891, 1.5120320320129395, 0.001336975721642375, -0.16960661113262177, 0.004562214016914368, -0.03994341194629669], "max": [0.08532632887363434, 0.2119312286376953, 1.179853081703186, 3.1449460983276367, 2.9828338623046875, 0.547391951084137, 0.04049794748425484, -0.0009107837686315179], "mean": [-0.0712464302778244, 0.07105686515569687, 1.0443904399871826, 2.660775899887085, 1.3910455703735352, 0.15364225208759308, 0.02969956398010254, -0.027209239080548286], "std": [0.11128441244363785, 0.1082928478717804, 0.0803237110376358, 0.5128191709518433, 1.074816346168518, 0.24887149035930634, 0.01260653417557478, 0.01494327187538147], "count": [238]}, "action": {"min": [-0.581250011920929, -0.8410714268684387, -0.9375, -0.07178571075201035, -0.19928571581840515, -0.017142856493592262, 0.0], "max": [0.8839285969734192, 0.824999988079071, 0.7875000238418579, 0.11785714328289032, 0.09535714238882065, 0.375, 1.0], "mean": [0.035384178161621094, 0.06975538283586502, -0.10843709856271744, 0.013199280016124249, -0.018979592248797417, 0.07794415950775146, 0.5714285969734192], "std": [0.31977832317352295, 0.3432121276855469, 0.3727284073829651, 0.036426182836294174, 0.055452678352594376, 0.09725477546453476, 0.49487173557281494], "count": [238]}, "timestamp": {"min": [0.0], "max": [11.85], "mean": [5.925], "std": [3.435203778526101], "count": [238]}, "frame_index": {"min": [0], "max": [237], "mean": [118.5], "std": [68.70407557052202], "count": [238]}, "episode_index": {"min": [277], "max": [277], "mean": [277.0], "std": [0.0], "count": [238]}, "index": {"min": [74393], "max": [74630], "mean": [74511.5], "std": [68.70407557052202], "count": [238]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [238]}}} +{"episode_index": 278, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5700519504921109]], [[0.5342114736519608]], [[0.49776958091586243]]], "std": [[[0.26066765723024765]], [[0.23819021036021865]], [[0.21467393747317293]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5398096301508886]], [[0.5045180682014017]], [[0.4557150603649663]]], "std": [[[0.29876404670957524]], [[0.27254199014067154]], [[0.25263702728852255]]], "count": [100]}, "observation.state": {"min": [-0.22198708355426788, -0.04270022734999657, 0.9274103045463562, 1.8768619298934937, -0.19806082546710968, -0.37315863370895386, 0.005112007725983858, -0.04000447690486908], "max": [0.05759750306606293, 0.21021847426891327, 1.1637330055236816, 3.148507833480835, 2.9379868507385254, 0.510910153388977, 0.039927888661623, -0.006364756263792515], "mean": [-0.08691859990358353, 0.09437400102615356, 1.053609848022461, 2.620802640914917, 1.4676164388656616, 0.13849864900112152, 0.032118815928697586, -0.0322587788105011], "std": [0.11583816260099411, 0.09684862941503525, 0.08190764486789703, 0.4354575276374817, 1.1285593509674072, 0.25546878576278687, 0.009520490653812885, 0.00992667954415083], "count": [261]}, "action": {"min": [-0.3991071283817291, -0.6321428418159485, -0.8357142806053162, -0.04714285582304001, -0.11999999731779099, -0.06857142597436905, 0.0], "max": [0.6455357074737549, 0.8062499761581421, 0.6857143044471741, 0.10928571224212646, 0.1703571379184723, 0.375, 1.0], "mean": [0.06639985740184784, 0.04715722054243088, -0.07591337710618973, 0.014302138239145279, -0.0032635461539030075, 0.06769701093435287, 0.5708812475204468], "std": [0.22148141264915466, 0.2909299433231354, 0.3572859764099121, 0.0315513014793396, 0.05445461347699165, 0.1124487817287445, 0.4949502646923065], "count": [261]}, "timestamp": {"min": [0.0], "max": [13.0], "mean": [6.5], "std": [3.7671828554858693], "count": [261]}, "frame_index": {"min": [0], "max": [260], "mean": [130.0], "std": [75.34365710971738], "count": [261]}, "episode_index": {"min": [278], "max": [278], "mean": [278.0], "std": [0.0], "count": [261]}, "index": {"min": [74631], "max": [74891], "mean": [74761.0], "std": [75.34365710971738], "count": [261]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [261]}}} +{"episode_index": 279, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9882352941176471]], [[0.9725490196078431]], [[0.9882352941176471]]], "mean": [[[0.36072814702052697]], [[0.2809484827378217]], [[0.178688440061083]]], "std": [[[0.20537690141809245]], [[0.15257612551169325]], [[0.10081867327124377]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.356604881735409]], [[0.3015031092026655]], [[0.22674929749731926]]], "std": [[[0.14276116629788177]], [[0.1349834460467964]], [[0.1456710807613526]]], "count": [100]}, "observation.state": {"min": [-0.4670982360839844, -0.16920040547847748, 0.9854989051818848, 2.0938422679901123, -2.3004751205444336, -0.09367005527019501, 0.006593631114810705, -0.03991615027189255], "max": [-0.14318597316741943, 0.14323832094669342, 1.243428111076355, 3.14060640335083, 0.010819646529853344, 0.21445025503635406, 0.03992462903261185, -0.014673138037323952], "mean": [-0.2609572112560272, -0.003303633537143469, 1.136375904083252, 2.8698410987854004, -1.0358991622924805, 0.04647938534617424, 0.02486756443977356, -0.02535630762577057], "std": [0.09587058424949646, 0.12311547994613647, 0.07729031145572662, 0.28760889172554016, 0.6915475726127625, 0.07474243640899658, 0.012105859816074371, 0.011783463880419731], "count": [162]}, "action": {"min": [-0.5249999761581421, -0.8598214387893677, -0.84375, -0.05428571254014969, -0.09857142716646194, -0.20428571105003357, 0.0], "max": [0.6187499761581421, 0.5008928775787354, 0.8330357074737549, 0.034285712987184525, 0.07285714149475098, -0.0, 1.0], "mean": [-0.09454364329576492, -0.0680224820971489, -0.0654100626707077, -0.0007186945294961333, -0.0029232825618237257, -0.08619488030672073, 0.37654322385787964], "std": [0.31216394901275635, 0.32507869601249695, 0.37759706377983093, 0.01404458936303854, 0.031084205955266953, 0.05613546445965767, 0.48451873660087585], "count": [162]}, "timestamp": {"min": [0.0], "max": [8.05], "mean": [4.0249999999999995], "std": [2.3382240411617246], "count": [162]}, "frame_index": {"min": [0], "max": [161], "mean": [80.5], "std": [46.76448082323449], "count": [162]}, "episode_index": {"min": [279], "max": [279], "mean": [279.0], "std": [0.0], "count": [162]}, "index": {"min": [74892], "max": [75053], "mean": [74972.5], "std": [46.76448082323449], "count": [162]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [162]}}} +{"episode_index": 280, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3416443074544271]], [[0.27199649287205113]], [[0.2274774409275429]]], "std": [[[0.14763804511064016]], [[0.13986208803490424]], [[0.13692480935556955]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3306777930166207]], [[0.2867717841653263]], [[0.2542141400505515]]], "std": [[[0.16680009760969403]], [[0.18265266856798795]], [[0.19318885907714042]]], "count": [100]}, "observation.state": {"min": [-0.04778734967112541, -0.19858795404434204, 0.4477072060108185, 3.082515239715576, -0.4800320565700531, -0.39356696605682373, 0.019447455182671547, -0.039839670062065125], "max": [0.13129739463329315, 0.2399069219827652, 0.7079624533653259, 3.2525179386138916, 0.0014861429808661342, 0.2620415687561035, 0.04038860276341438, -0.01933109387755394], "mean": [0.06419079750776291, 0.04169154912233353, 0.6002867817878723, 3.1624245643615723, -0.29842954874038696, -0.05472387373447418, 0.029221616685390472, -0.028836697340011597], "std": [0.04947990924119949, 0.15601913630962372, 0.07992415130138397, 0.04384337738156319, 0.12059054523706436, 0.12782983481884003, 0.008614652790129185, 0.009070899337530136], "count": [239]}, "action": {"min": [-0.5866071581840515, -0.7982142567634583, -0.84375, -0.12321428209543228, -0.13500000536441803, -0.13928571343421936, 0.0], "max": [0.7875000238418579, 0.8517857193946838, 0.9375, 0.1574999988079071, 0.18214285373687744, 0.1039285734295845, 1.0], "mean": [0.010456521064043045, 0.08450383692979813, -0.04429170861840248, 0.003528093919157982, 0.007903467863798141, -0.006684099789708853, 0.4686192572116852], "std": [0.3177410960197449, 0.43130719661712646, 0.4876922070980072, 0.0369698703289032, 0.05462322384119034, 0.04498523101210594, 0.4990141689777374], "count": [239]}, "timestamp": {"min": [0.0], "max": [11.9], "mean": [5.95], "std": [3.449637662132068], "count": [239]}, "frame_index": {"min": [0], "max": [238], "mean": [119.0], "std": [68.99275324264136], "count": [239]}, "episode_index": {"min": [280], "max": [280], "mean": [280.0], "std": [0.0], "count": [239]}, "index": {"min": [75054], "max": [75292], "mean": [75173.0], "std": [68.99275324264136], "count": [239]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [239]}}} +{"episode_index": 281, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3202691925647212]], [[0.26447232295017614]], [[0.23141331990559896]]], "std": [[[0.14626375049926965]], [[0.14436131234768196]], [[0.1512968377844631]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31557925833907785]], [[0.2707150124942555]], [[0.2379854072122013]]], "std": [[[0.15585739041290878]], [[0.17117899123099123]], [[0.17958624551988425]]], "count": [100]}, "observation.state": {"min": [-0.15927942097187042, -0.11429212987422943, 0.4469791054725647, 2.9811012744903564, -0.648854672908783, -0.5763089060783386, 0.02242528833448887, -0.040867917239665985], "max": [0.07127530872821808, 0.2824072539806366, 0.6994675993919373, 3.2229855060577393, 0.23485535383224487, 0.09716670215129852, 0.039967335760593414, -0.019184326753020287], "mean": [-0.0079933637753129, 0.1002444177865982, 0.6077419519424438, 3.1211187839508057, -0.3197726905345917, -0.23743478953838348, 0.0325867235660553, -0.03379402309656143], "std": [0.0629042237997055, 0.12451405078172684, 0.07140593975782394, 0.0725053921341896, 0.3030148148536682, 0.1929486095905304, 0.006663196720182896, 0.007458482403308153], "count": [281]}, "action": {"min": [-0.6214285492897034, -0.8276785612106323, -0.7178571224212646, -0.08250000327825546, -0.1071428582072258, -0.17892856895923615, 0.0], "max": [0.8357142806053162, 0.8169642686843872, 0.9375, 0.09321428835391998, 0.14571428298950195, 0.1778571456670761, 1.0], "mean": [0.006682136561721563, 0.07029107958078384, -0.035174138844013214, 0.004796644672751427, 0.0025050865951925516, -0.004316218197345734, 0.5017793774604797], "std": [0.27552762627601624, 0.35358667373657227, 0.40916797518730164, 0.02897070161998272, 0.04530773311853409, 0.05648699775338173, 0.4999964237213135], "count": [281]}, "timestamp": {"min": [0.0], "max": [14.0], "mean": [7.0], "std": [4.055859958134649], "count": [281]}, "frame_index": {"min": [0], "max": [280], "mean": [140.0], "std": [81.11719916269298], "count": [281]}, "episode_index": {"min": [281], "max": [281], "mean": [281.0], "std": [0.0], "count": [281]}, "index": {"min": [75293], "max": [75573], "mean": [75433.0], "std": [81.11719916269298], "count": [281]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [281]}}} +{"episode_index": 282, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5241006403904335]], [[0.4846382314644608]], [[0.43112112666111363]]], "std": [[[0.307675675165867]], [[0.27769629204905]], [[0.24792519107897856]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5154342495787377]], [[0.4839840099858303]], [[0.4381195026472503]]], "std": [[[0.3125030246128821]], [[0.2864901998783482]], [[0.2662274431299276]]], "count": [100]}, "observation.state": {"min": [-0.3527725636959076, -0.06257787346839905, 0.9688169360160828, 1.8591463565826416, -3.0502007007598877, -1.2230031490325928, 0.009523149579763412, -0.04001926630735397], "max": [0.012405887246131897, 0.2939862310886383, 1.1755939722061157, 3.2673120498657227, -0.0032249758951365948, -0.039978303015232086, 0.04001438990235329, 0.0013633022317662835], "mean": [-0.07286509871482849, 0.09761001914739609, 1.071000099182129, 2.5584607124328613, -2.3060176372528076, -0.7552370429039001, 0.031013324856758118, -0.02956375479698181], "std": [0.0971689447760582, 0.11326003819704056, 0.060597941279411316, 0.40950584411621094, 0.8285322189331055, 0.29252293705940247, 0.013179203495383263, 0.014127339236438274], "count": [268]}, "action": {"min": [-0.8598214387893677, -0.6910714507102966, -0.6455357074737549, -0.14785714447498322, -0.1574999988079071, -0.29249998927116394, 0.0], "max": [0.8491071462631226, 0.7392857074737549, 0.5491071343421936, 0.19607143104076385, 0.17571428418159485, 0.1735714226961136, 1.0], "mean": [0.01420243363827467, 0.1258329153060913, -0.040078602731227875, 0.020433099940419197, 0.02970016747713089, -0.02877666987478733, 0.7164179086685181], "std": [0.3534390926361084, 0.31994739174842834, 0.2359185516834259, 0.06302989274263382, 0.06916016340255737, 0.11056589335203171, 0.4507359266281128], "count": [268]}, "timestamp": {"min": [0.0], "max": [13.35], "mean": [6.675000000000001], "std": [3.868219874826145], "count": [268]}, "frame_index": {"min": [0], "max": [267], "mean": [133.5], "std": [77.36439749652291], "count": [268]}, "episode_index": {"min": [282], "max": [282], "mean": [282.0], "std": [0.0], "count": [268]}, "index": {"min": [75574], "max": [75841], "mean": [75707.5], "std": [77.36439749652291], "count": [268]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [268]}}} +{"episode_index": 283, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5854331180348116]], [[0.5363240147010954]], [[0.48611042396695003]]], "std": [[[0.2863689082693339]], [[0.26016019845664234]], [[0.23034949915968608]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5659513340370328]], [[0.5277228226007199]], [[0.4775796909706265]]], "std": [[[0.2959674794915437]], [[0.27264679556223886]], [[0.25473529631155517]]], "count": [100]}, "observation.state": {"min": [-0.19139619171619415, -0.287436306476593, 1.004479169845581, 2.159088134765625, -2.6444778442382812, -1.1459755897521973, 0.0022205528803169727, -0.04010600596666336], "max": [0.07502877712249756, 0.17364409565925598, 1.1786514520645142, 3.1429085731506348, -0.004250174853950739, -0.08350642025470734, 0.040005117654800415, -0.010713942348957062], "mean": [-0.02373628132045269, -0.03654179722070694, 1.093030571937561, 2.570190191268921, -2.1047232151031494, -0.6555598378181458, 0.029146553948521614, -0.030656201764941216], "std": [0.06492460519075394, 0.1360447257757187, 0.05715326964855194, 0.2861989140510559, 0.5993964076042175, 0.23412682116031647, 0.012835852801799774, 0.011546611785888672], "count": [408]}, "action": {"min": [-0.5062500238418579, -0.768750011920929, -0.4258928596973419, -0.034285712987184525, -0.10499999672174454, -0.335357129573822, 0.0], "max": [0.5116071701049805, 0.6321428418159485, 0.5571428537368774, 0.10178571194410324, 0.11999999731779099, 0.11678571254014969, 1.0], "mean": [0.03202464431524277, -0.029116300866007805, -0.0418526716530323, 0.012778359465301037, 0.012289914302527905, -0.018747394904494286, 0.6102941036224365], "std": [0.20695656538009644, 0.3397717773914337, 0.24121618270874023, 0.02636336348950863, 0.03677018731832504, 0.0998636931180954, 0.4876837432384491], "count": [408]}, "timestamp": {"min": [0.0], "max": [20.35], "mean": [10.174999999999999], "std": [5.888955057280253], "count": [408]}, "frame_index": {"min": [0], "max": [407], "mean": [203.5], "std": [117.77910114560505], "count": [408]}, "episode_index": {"min": [283], "max": [283], "mean": [283.0], "std": [0.0], "count": [408]}, "index": {"min": [75842], "max": [76249], "mean": [76045.5], "std": [117.77910114560505], "count": [408]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [408]}}} +{"episode_index": 284, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3388615920122932]], [[0.2690770299574908]], [[0.2255838934206495]]], "std": [[[0.13708471397154512]], [[0.1315474561426993]], [[0.1338370264897092]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3272929609710095]], [[0.28248743334003523]], [[0.24952400237438724]]], "std": [[[0.16693337724206056]], [[0.18191368679169231]], [[0.1919996248750881]]], "count": [100]}, "observation.state": {"min": [-0.04334254190325737, -0.20723949372768402, 0.4476524293422699, 3.0626285076141357, -0.41540199518203735, -0.25785771012306213, 0.019551601260900497, -0.0398731455206871], "max": [0.17417939007282257, 0.256438672542572, 0.7017521262168884, 3.2917323112487793, 0.41424065828323364, 0.1272929161787033, 0.03995329886674881, -0.01866419054567814], "mean": [0.06400636583566666, 0.041432518512010574, 0.6071512699127197, 3.1607515811920166, 0.00341326417401433, -0.10429348796606064, 0.030460571870207787, -0.02948777750134468], "std": [0.05291219428181648, 0.15719154477119446, 0.08460327982902527, 0.05583774670958519, 0.1853206753730774, 0.08705435693264008, 0.008871430531144142, 0.009758636355400085], "count": [272]}, "action": {"min": [-0.38303571939468384, -0.7339285612106323, -0.7982142567634583, -0.0771428570151329, -0.17571428418159485, -0.14678572118282318, 0.0], "max": [0.7205356955528259, 0.8839285969734192, 0.9375, 0.10607142746448517, 0.1371428519487381, 0.1639285683631897, 1.0], "mean": [0.023417824879288673, 0.07704834640026093, -0.032251156866550446, 0.0050853462889790535, 0.0009532555704936385, 0.0037106091622263193, 0.529411792755127], "std": [0.2708563208580017, 0.46180659532546997, 0.4910227656364441, 0.03289952129125595, 0.054824985563755035, 0.051376670598983765, 0.4991345703601837], "count": [272]}, "timestamp": {"min": [0.0], "max": [13.55], "mean": [6.7749999999999995], "std": [3.9259552977587506], "count": [272]}, "frame_index": {"min": [0], "max": [271], "mean": [135.5], "std": [78.51910595517501], "count": [272]}, "episode_index": {"min": [284], "max": [284], "mean": [284.0], "std": [0.0], "count": [272]}, "index": {"min": [76250], "max": [76521], "mean": [76385.5], "std": [78.51910595517501], "count": [272]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [272]}}} +{"episode_index": 285, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.481330155914905]], [[0.4487182527429917]], [[0.4043776251101026]]], "std": [[[0.30303354858803194]], [[0.27326295700453646]], [[0.24194529013413876]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5097905925675934]], [[0.47900022200042125]], [[0.4337977175245098]]], "std": [[[0.3100388752003953]], [[0.2838674692806468]], [[0.26327258653982877]]], "count": [100]}, "observation.state": {"min": [-0.20653508603572845, -0.05865877494215965, 0.976649820804596, 2.06689715385437, -3.198513984680176, -1.1681249141693115, 0.009178715758025646, -0.04102938249707222], "max": [0.0292658768594265, 0.28484317660331726, 1.1961356401443481, 3.3669400215148926, 2.0036470890045166, -0.08227279782295227, 0.040034208446741104, -0.008726338855922222], "mean": [-0.05894995853304863, 0.09975571185350418, 1.094760537147522, 2.8001692295074463, -1.5437895059585571, -0.6808923482894897, 0.031790148466825485, -0.03190721198916435], "std": [0.06669363379478455, 0.11220858991146088, 0.06116809695959091, 0.33807504177093506, 1.4644076824188232, 0.2904183566570282, 0.013062980957329273, 0.013012434355914593], "count": [295]}, "action": {"min": [-0.4982142746448517, -0.6133928298950195, -0.9375, -0.12964285910129547, -0.1639285683631897, -0.2849999964237213, 0.0], "max": [0.6107142567634583, 0.7366071343421936, 0.6964285969734192, 0.26249998807907104, 0.19928571581840515, 0.375, 1.0], "mean": [0.002950966591015458, 0.07686135917901993, -0.14194613695144653, 0.019064174965023994, 0.00011622907913988456, 0.05972396209836006, 0.7491525411605835], "std": [0.22449450194835663, 0.26769644021987915, 0.3721076548099518, 0.07443568855524063, 0.08293284475803375, 0.2147361934185028, 0.43350040912628174], "count": [295]}, "timestamp": {"min": [0.0], "max": [14.7], "mean": [7.35], "std": [4.257933771208753], "count": [295]}, "frame_index": {"min": [0], "max": [294], "mean": [147.0], "std": [85.15867542417507], "count": [295]}, "episode_index": {"min": [285], "max": [285], "mean": [285.0], "std": [0.0], "count": [295]}, "index": {"min": [76522], "max": [76816], "mean": [76669.0], "std": [85.15867542417507], "count": [295]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [295]}}} +{"episode_index": 286, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32037630806717216]], [[0.26258920228247545]], [[0.22758539356904872]]], "std": [[[0.14856518600485333]], [[0.14389310948968415]], [[0.14756157802457714]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31453654509899664]], [[0.26967032997280943]], [[0.2370253355736826]]], "std": [[[0.15438195800066265]], [[0.16963736977462113]], [[0.17818608667280217]]], "count": [100]}, "observation.state": {"min": [-0.12413743138313293, -0.12304271012544632, 0.4485265016555786, 2.924799680709839, -1.0953341722488403, -0.3418616056442261, 0.021050861105322838, -0.040622323751449585], "max": [0.08992989361286163, 0.2691965103149414, 0.710708498954773, 3.1869654655456543, 0.0002652381081134081, 0.12440557777881622, 0.03991863131523132, -0.020746786147356033], "mean": [-0.003863746067509055, 0.07803817838430405, 0.6140063405036926, 3.075181007385254, -0.6473256349563599, -0.11011572927236557, 0.03248059004545212, -0.03463016077876091], "std": [0.05854189023375511, 0.1340969204902649, 0.07152262330055237, 0.07953919470310211, 0.3634064495563507, 0.12057965993881226, 0.0072766514495015144, 0.007148401346057653], "count": [277]}, "action": {"min": [-0.39642858505249023, -0.7339285612106323, -0.7285714149475098, -0.046071428805589676, -0.1510714292526245, -0.16500000655651093, 0.0], "max": [0.8330357074737549, 0.84375, 0.9375, 0.062142856419086456, 0.1274999976158142, 0.2314285784959793, 1.0], "mean": [0.02115781232714653, 0.06752514839172363, -0.023613963276147842, 0.004482981748878956, -0.001342187519185245, -0.014257354661822319, 0.5415162444114685], "std": [0.25325989723205566, 0.3852854073047638, 0.4504942297935486, 0.019935905933380127, 0.05159841105341911, 0.07645692676305771, 0.4982735812664032], "count": [277]}, "timestamp": {"min": [0.0], "max": [13.8], "mean": [6.8999999999999995], "std": [3.9981245603407602], "count": [277]}, "frame_index": {"min": [0], "max": [276], "mean": [138.0], "std": [79.96249120681522], "count": [277]}, "episode_index": {"min": [286], "max": [286], "mean": [286.0], "std": [0.0], "count": [277]}, "index": {"min": [76817], "max": [77093], "mean": [76955.0], "std": [79.96249120681522], "count": [277]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [277]}}} +{"episode_index": 287, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5818593175551471]], [[0.545020082361558]], [[0.508411652209712]]], "std": [[[0.25698687868576453]], [[0.23541871365612974]], [[0.2130316146107677]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5376835327148438]], [[0.5030127563476563]], [[0.45450767666685815]]], "std": [[[0.2996703610507144]], [[0.2736949825921627]], [[0.25419022792654683]]], "count": [100]}, "observation.state": {"min": [-0.23585116863250732, -0.06390585750341415, 0.9269070029258728, 2.1866297721862793, 0.00038061875966377556, -0.10322541743516922, 0.007651074789464474, -0.039992451667785645], "max": [0.05969684571027756, 0.2135569304227829, 1.1752737760543823, 3.154590368270874, 2.3682100772857666, 0.6086280345916748, 0.040818147361278534, 0.00040545727824792266], "mean": [-0.09709623456001282, 0.08862567692995071, 1.0509778261184692, 2.792710304260254, 1.1675801277160645, 0.2056848406791687, 0.029875950887799263, -0.027502261102199554], "std": [0.11958875507116318, 0.10004013031721115, 0.08516363054513931, 0.3424224853515625, 0.9263952374458313, 0.2874028980731964, 0.012231404893100262, 0.014319423586130142], "count": [218]}, "action": {"min": [-0.5169642567634583, -0.7339285612106323, -0.9375, -0.07500000298023224, -0.1574999988079071, -0.05892857164144516, 0.0], "max": [0.8785714507102966, 0.8758928775787354, 0.7366071343421936, 0.10607142746448517, 0.14464285969734192, 0.375, 1.0], "mean": [0.04833715409040451, 0.09231241047382355, -0.1257699877023697, 0.008910550735890865, -0.013766378164291382, 0.06932338327169418, 0.60550457239151], "std": [0.3045324385166168, 0.3596663475036621, 0.44411247968673706, 0.03069159761071205, 0.046147141605615616, 0.10688528418540955, 0.48874178528785706], "count": [218]}, "timestamp": {"min": [0.0], "max": [10.85], "mean": [5.425000000000001], "std": [3.1465258619626826], "count": [218]}, "frame_index": {"min": [0], "max": [217], "mean": [108.5], "std": [62.930517239253646], "count": [218]}, "episode_index": {"min": [287], "max": [287], "mean": [287.0], "std": [0.0], "count": [218]}, "index": {"min": [77094], "max": [77311], "mean": [77202.5], "std": [62.930517239253646], "count": [218]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [218]}}} +{"episode_index": 288, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5829841972799862]], [[0.5343506541532629]], [[0.4853696899414063]]], "std": [[[0.286268968899098]], [[0.25944045152403256]], [[0.2296856213364249]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5681113047880285]], [[0.5294417431401272]], [[0.4788704594630821]]], "std": [[[0.2934988846378169]], [[0.26971820040107153]], [[0.25123635298766367]]], "count": [100]}, "observation.state": {"min": [-0.20743444561958313, -0.2688426673412323, 1.0040496587753296, 2.460794448852539, -2.5475218296051025, -1.141396164894104, 0.0008350871503353119, -0.040190305560827255], "max": [0.09961308538913727, 0.20368586480617523, 1.1890827417373657, 3.163132429122925, -0.0028490021359175444, -0.08715749531984329, 0.040006961673498154, -0.010897974483668804], "mean": [-0.03507455438375473, -0.025894444435834885, 1.1060017347335815, 2.7171101570129395, -1.935775637626648, -0.48861265182495117, 0.03030477650463581, -0.03216135501861572], "std": [0.06878295540809631, 0.1340281218290329, 0.054672013968229294, 0.20583081245422363, 0.6084533333778381, 0.23698583245277405, 0.01258664857596159, 0.010233746841549873], "count": [341]}, "action": {"min": [-0.40714284777641296, -0.9053571224212646, -0.4660714268684387, -0.019285714253783226, -0.06964285671710968, -0.2549999952316284, 0.0], "max": [0.5571428537368774, 0.7741071581840515, 0.5625, 0.10499999672174454, 0.13285714387893677, 0.17571428418159485, 1.0], "mean": [0.03736644610762596, -0.035064946860075, -0.05100283399224281, 0.015116250142455101, 0.01602744683623314, -0.017224567010998726, 0.5923753380775452], "std": [0.25206536054611206, 0.41029801964759827, 0.2817888557910919, 0.023639094084501266, 0.048053231090307236, 0.09459711611270905, 0.4913923144340515], "count": [341]}, "timestamp": {"min": [0.0], "max": [17.0], "mean": [8.500000000000002], "std": [4.921889880929885], "count": [341]}, "frame_index": {"min": [0], "max": [340], "mean": [170.0], "std": [98.4377976185977], "count": [341]}, "episode_index": {"min": [288], "max": [288], "mean": [288.0], "std": [0.0], "count": [341]}, "index": {"min": [77312], "max": [77652], "mean": [77482.0], "std": [98.4377976185977], "count": [341]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [341]}}} +{"episode_index": 289, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31920305917777264]], [[0.2694383610744102]], [[0.2410956630332797]]], "std": [[[0.15618575713727417]], [[0.15495097427207455]], [[0.16220275418603702]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31731960521024816]], [[0.2735121220607383]], [[0.24136978448606006]]], "std": [[[0.16013598984417501]], [[0.1752535755536632]], [[0.18371455758717467]]], "count": [100]}, "observation.state": {"min": [-0.15130025148391724, -0.13374249637126923, 0.4495338201522827, 2.9821431636810303, -0.43793946504592896, -0.47716224193573, 0.02277948707342148, -0.04015267267823219], "max": [0.08191230893135071, 0.29513102769851685, 0.6849868297576904, 3.275944948196411, -0.001517235767096281, -0.023849453777074814, 0.04018952697515488, -0.01867498643696308], "mean": [-0.006430057808756828, 0.07143937051296234, 0.5907503962516785, 3.1101555824279785, -0.2725887894630432, -0.19783581793308258, 0.0342114083468914, -0.03307574987411499], "std": [0.0679028183221817, 0.1465197652578354, 0.07048305124044418, 0.07506323605775833, 0.09619602560997009, 0.09664271026849747, 0.00582739757373929, 0.007977085188031197], "count": [246]}, "action": {"min": [-0.5571428537368774, -0.9375, -0.8812500238418579, -0.1403571367263794, -0.12428571283817291, -0.1007142886519432, 0.0], "max": [0.7473214268684387, 0.8785714507102966, 0.9375, 0.13285714387893677, 0.15000000596046448, 0.08250000327825546, 1.0], "mean": [-0.0011977473041042686, 0.07893073558807373, -0.07213631272315979, 0.008227352052927017, 0.007865852676331997, -0.004224742762744427, 0.5406504273414612], "std": [0.29763558506965637, 0.4358716607093811, 0.4941984713077545, 0.0409681610763073, 0.03957566246390343, 0.03022821433842182, 0.4983446002006531], "count": [246]}, "timestamp": {"min": [0.0], "max": [12.25], "mean": [6.125], "std": [3.5506748184910806], "count": [246]}, "frame_index": {"min": [0], "max": [245], "mean": [122.5], "std": [71.01349636982161], "count": [246]}, "episode_index": {"min": [289], "max": [289], "mean": [289.0], "std": [0.0], "count": [246]}, "index": {"min": [77653], "max": [77898], "mean": [77775.5], "std": [71.01349636982161], "count": [246]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [246]}}} +{"episode_index": 290, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.9764705882352941]], [[0.9803921568627451]]], "mean": [[[0.35584805537205116]], [[0.2757842945772059]], [[0.17395823519837622]]], "std": [[[0.20681918939168417]], [[0.15216980248389725]], [[0.09667912161775911]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.984313725490196]], [[0.984313725490196]]], "mean": [[[0.3564153191061581]], [[0.3005220306994868]], [[0.22498447552849266]]], "std": [[[0.1407687420276997]], [[0.1321616158152411]], [[0.1425392763118584]]], "count": [100]}, "observation.state": {"min": [-0.42780211567878723, -0.163313090801239, 0.9898090958595276, 2.410015106201172, -2.0024774074554443, -0.1893438696861267, 0.010138540528714657, -0.03990265727043152], "max": [-0.1354399472475052, 0.13490307331085205, 1.2858647108078003, 3.1399121284484863, 0.004179900977760553, -0.01036495715379715, 0.03982606530189514, -0.015002109110355377], "mean": [-0.2467881739139557, 0.004784290678799152, 1.160122036933899, 2.9068503379821777, -0.7574509978294373, -0.10704276710748672, 0.02240642160177231, -0.024970026686787605], "std": [0.08329278230667114, 0.1159454733133316, 0.0860089436173439, 0.20175686478614807, 0.6263658404350281, 0.05789732560515404, 0.012703567743301392, 0.010803334414958954], "count": [150]}, "action": {"min": [-0.5008928775787354, -0.5142857432365417, -0.8464285731315613, -0.08142857253551483, -0.06785714626312256, -0.12999999523162842, 0.0], "max": [0.6000000238418579, 0.4848214387893677, 0.8116071224212646, 0.029285714030265808, 0.06071428582072258, -0.004285714123398066, 1.0], "mean": [-0.09873218834400177, -0.09389286488294601, -0.08085715025663376, -0.004771428182721138, -0.0025476193986833096, -0.07635238021612167, 0.3266666531562805], "std": [0.3280629515647888, 0.27401870489120483, 0.46482083201408386, 0.017332347109913826, 0.02661202661693096, 0.03793506324291229, 0.4689939320087433], "count": [150]}, "timestamp": {"min": [0.0], "max": [7.45], "mean": [3.725], "std": [2.1650153964040686], "count": [150]}, "frame_index": {"min": [0], "max": [149], "mean": [74.5], "std": [43.300307928081374], "count": [150]}, "episode_index": {"min": [290], "max": [290], "mean": [290.0], "std": [0.0], "count": [150]}, "index": {"min": [77899], "max": [78048], "mean": [77973.5], "std": [43.300307928081374], "count": [150]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [150]}}} +{"episode_index": 291, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31617896465226714]], [[0.2635820426192938]], [[0.23286079376819085]]], "std": [[[0.14745383110162635]], [[0.14510433191517066]], [[0.15266591106301924]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3203156696394378]], [[0.2733409782858456]], [[0.23878559725892312]]], "std": [[[0.15867303721483125]], [[0.17337352384345628]], [[0.18299241210599754]]], "count": [100]}, "observation.state": {"min": [-0.12016580253839493, -0.17067207396030426, 0.48037347197532654, 3.0000033378601074, -0.5238206386566162, -0.2621610164642334, 0.023055994883179665, -0.04039699211716652], "max": [-0.02677118591964245, 0.2932674288749695, 0.7131137251853943, 3.270036220550537, 0.26219499111175537, 0.046542149037122726, 0.04056759923696518, -0.028885239735245705], "mean": [-0.06304311007261276, 0.061082758009433746, 0.6123972535133362, 3.118656635284424, -0.21859021484851837, -0.1078203096985817, 0.03322291746735573, -0.035666149109601974], "std": [0.0244444627314806, 0.15608298778533936, 0.06763424724340439, 0.0672386959195137, 0.2795087397098541, 0.1078050509095192, 0.006333907134830952, 0.004471226129680872], "count": [245]}, "action": {"min": [-0.47678571939468384, -0.7446428537368774, -0.7151785492897034, -0.08892857283353806, -0.1071428582072258, -0.14464285969734192, 0.0], "max": [0.4660714268684387, 0.7875000238418579, 0.9375, 0.11357142776250839, 0.09857142716646194, 0.08571428805589676, 1.0], "mean": [0.015535707585513592, 0.09579446911811829, -0.02081632986664772, -0.0007084538228809834, 0.002689503598958254, -0.01141399797052145, 0.5265306234359741], "std": [0.1773596704006195, 0.41808566451072693, 0.4212256968021393, 0.0369376502931118, 0.04042714834213257, 0.04578013718128204, 0.49929577112197876], "count": [245]}, "timestamp": {"min": [0.0], "max": [12.2], "mean": [6.1], "std": [3.5362409420173844], "count": [245]}, "frame_index": {"min": [0], "max": [244], "mean": [122.0], "std": [70.7248188403477], "count": [245]}, "episode_index": {"min": [291], "max": [291], "mean": [291.0], "std": [0.0], "count": [245]}, "index": {"min": [78049], "max": [78293], "mean": [78171.0], "std": [70.7248188403477], "count": [245]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [245]}}} +{"episode_index": 292, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.584216827990962]], [[0.5486392241833257]], [[0.5103554454130286]]], "std": [[[0.25876014298152133]], [[0.2381699181988643]], [[0.21782693160844777]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5429819605210248]], [[0.5085293626972274]], [[0.4605623779296875]]], "std": [[[0.3001132145701091]], [[0.2750917062226459]], [[0.25647673967538703]]], "count": [100]}, "observation.state": {"min": [-0.21118713915348053, -0.1140749603509903, 0.9287636876106262, 1.7748969793319702, -0.09392330795526505, -0.09162425249814987, 0.007202421315014362, -0.04000461474061012], "max": [0.09198851138353348, 0.21728023886680603, 1.1764464378356934, 3.178861379623413, 3.1366536617279053, 0.7705703377723694, 0.03999591991305351, -0.002047178102657199], "mean": [-0.0780075266957283, 0.055182430893182755, 1.0558815002441406, 2.574921131134033, 1.6187360286712646, 0.3514757752418518, 0.029036307707428932, -0.027979783713817596], "std": [0.1187991201877594, 0.12466779351234436, 0.07975391298532486, 0.4634866416454315, 1.1924726963043213, 0.32681432366371155, 0.013551204465329647, 0.014428171329200268], "count": [312]}, "action": {"min": [-0.32946428656578064, -0.7124999761581421, -0.6723214387893677, -0.0535714291036129, -0.11785714328289032, -0.04500000178813934, 0.0], "max": [0.5169642567634583, 0.637499988079071, 0.6187499761581421, 0.1403571367263794, 0.12321428209543228, 0.3653571307659149, 1.0], "mean": [0.049055613577365875, 0.04567307233810425, -0.05441281571984291, 0.011651786975562572, -0.000944367959164083, 0.05822456255555153, 0.625], "std": [0.19246810674667358, 0.3010103106498718, 0.2952042520046234, 0.038295574486255646, 0.04591771215200424, 0.0991734117269516, 0.4841229319572449], "count": [312]}, "timestamp": {"min": [0.0], "max": [15.55], "mean": [7.775], "std": [4.503308968599275], "count": [312]}, "frame_index": {"min": [0], "max": [311], "mean": [155.5], "std": [90.0661793719855], "count": [312]}, "episode_index": {"min": [292], "max": [292], "mean": [292.0], "std": [0.0], "count": [312]}, "index": {"min": [78294], "max": [78605], "mean": [78449.5], "std": [90.0661793719855], "count": [312]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [312]}}} +{"episode_index": 293, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3173746451583563]], [[0.2566936974618949]], [[0.21999389528760724]]], "std": [[[0.13364181919099868]], [[0.12680759100657352]], [[0.13026600521852527]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3171788048837699]], [[0.2725383073395374]], [[0.23995501349954043]]], "std": [[[0.15689814033650568]], [[0.1725130250014596]], [[0.18111652055317382]]], "count": [100]}, "observation.state": {"min": [-0.13009198009967804, -0.10100426524877548, 0.4464091956615448, 2.94822096824646, -1.0362075567245483, -0.35910260677337646, 0.022503091022372246, -0.04056647792458534], "max": [0.08815386146306992, 0.26616141200065613, 0.705058753490448, 3.145655632019043, 0.0239102803170681, 0.25330880284309387, 0.04021422564983368, -0.014039333909749985], "mean": [-0.006637214217334986, 0.07726059854030609, 0.5980148315429688, 3.0764665603637695, -0.5732805728912354, -0.09214761853218079, 0.03322025015950203, -0.03365273401141167], "std": [0.06348671019077301, 0.12741690874099731, 0.07232244312763214, 0.054982442408800125, 0.36412227153778076, 0.1700049340724945, 0.006902467459440231, 0.007859229110181332], "count": [305]}, "action": {"min": [-0.3991071283817291, -0.75, -0.5919643044471741, -0.055714286863803864, -0.13821429014205933, -0.18000000715255737, 0.0], "max": [0.6964285969734192, 0.8089285492897034, 0.9241071343421936, 0.07821428775787354, 0.12535713613033295, 0.2571428716182709, 1.0], "mean": [0.016519317403435707, 0.05989459156990051, -0.029578447341918945, 0.0030526926275342703, -0.003692038357257843, -0.010573778301477432, 0.5737704634666443], "std": [0.23648948967456818, 0.34052327275276184, 0.3676137328147888, 0.021843163296580315, 0.04886646941304207, 0.07143168151378632, 0.4945279061794281], "count": [305]}, "timestamp": {"min": [0.0], "max": [15.2], "mean": [7.6], "std": [4.402272140611028], "count": [305]}, "frame_index": {"min": [0], "max": [304], "mean": [152.0], "std": [88.04544281222056], "count": [305]}, "episode_index": {"min": [293], "max": [293], "mean": [293.0], "std": [0.0], "count": [305]}, "index": {"min": [78606], "max": [78910], "mean": [78758.0], "std": [88.04544281222056], "count": [305]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [305]}}} +{"episode_index": 294, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3584763381060432]], [[0.28609468407724414]], [[0.23639804555855545]]], "std": [[[0.1585689666241864]], [[0.15012090163703268]], [[0.1394758760219201]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3320777175005744]], [[0.2873476329130285]], [[0.2543115066827512]]], "std": [[[0.17083953483785716]], [[0.18694517458494272]], [[0.1972742006547029]]], "count": [100]}, "observation.state": {"min": [-0.047826897352933884, -0.21182408928871155, 0.4458785951137543, 3.0020413398742676, -0.45991507172584534, -0.321186363697052, 0.01932542957365513, -0.039898667484521866], "max": [0.17088602483272552, 0.2650354206562042, 0.7505024075508118, 3.2564406394958496, 0.057915471494197845, 0.209741473197937, 0.039817627519369125, -0.01949157752096653], "mean": [0.06344471871852875, 0.02965337224304676, 0.617399275302887, 3.133768081665039, -0.1930747926235199, 0.017477797344326973, 0.028570014983415604, -0.02928716503083706], "std": [0.05199584737420082, 0.15913733839988708, 0.08764766901731491, 0.07208509743213654, 0.1656288504600525, 0.11442821472883224, 0.009352833963930607, 0.008894052356481552], "count": [241]}, "action": {"min": [-0.6803571581840515, -0.7741071581840515, -0.8758928775787354, -0.11785714328289032, -0.1371428519487381, -0.15000000596046448, 0.0], "max": [0.8142856955528259, 0.8678571581840515, 0.9375, 0.11464285850524902, 0.16500000655651093, 0.0867857113480568, 1.0], "mean": [0.009291628375649452, 0.09445023536682129, -0.033810000866651535, -0.0011292238486930728, 0.008833729662001133, -0.010976587422192097, 0.4730290472507477], "std": [0.34375616908073425, 0.4459335505962372, 0.5076926946640015, 0.034494757652282715, 0.051030732691287994, 0.046761397272348404, 0.49927186965942383], "count": [241]}, "timestamp": {"min": [0.0], "max": [12.0], "mean": [6.0], "std": [3.4785054261852175], "count": [241]}, "frame_index": {"min": [0], "max": [240], "mean": [120.0], "std": [69.57010852370435], "count": [241]}, "episode_index": {"min": [294], "max": [294], "mean": [294.0], "std": [0.0], "count": [241]}, "index": {"min": [78911], "max": [79151], "mean": [79031.0], "std": [69.57010852370435], "count": [241]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [241]}}} +{"episode_index": 295, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34796153528550094]], [[0.2830410982019761]], [[0.23869001740100337]]], "std": [[[0.1361602644148548]], [[0.13693323300557383]], [[0.14318941539478391]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.310662068086512]], [[0.26133963431564033]], [[0.227736556707644]]], "std": [[[0.14729035372441013]], [[0.16021834546633154]], [[0.16832960344718773]]], "count": [100]}, "observation.state": {"min": [-0.11324696242809296, -0.27017131447792053, 0.5066540241241455, 2.9481847286224365, -0.015045336447656155, -0.18680061399936676, 0.002184565644711256, -0.03987369313836098], "max": [0.04004066437482834, 0.38883987069129944, 0.6791829466819763, 3.157611608505249, 0.4494539499282837, 0.10805558413267136, 0.03996545076370239, -0.0030027006287127733], "mean": [-0.02322464808821678, 0.019427595660090446, 0.574264645576477, 3.065162420272827, 0.2651890516281128, -0.044510625302791595, 0.02240539900958538, -0.021994132548570633], "std": [0.043743956834077835, 0.22255374491214752, 0.047349873930215836, 0.061437491327524185, 0.10985936969518661, 0.07909446209669113, 0.01672939397394657, 0.016994979232549667], "count": [271]}, "action": {"min": [-0.4446428716182709, -0.5785714387893677, -0.5839285850524902, -0.06750000268220901, -0.05999999865889549, -0.07285714149475098, 0.0], "max": [0.6160714030265808, 0.8223214149475098, 0.7607142925262451, 0.03214285895228386, 0.07607142627239227, 0.12321428209543228, 1.0], "mean": [0.026508962735533714, 0.10545268654823303, -0.04485371708869934, -0.0032538208179175854, 0.0021626250818371773, 0.006590672302991152, 0.5129151344299316], "std": [0.22060780227184296, 0.3747312128543854, 0.3219030499458313, 0.01834598369896412, 0.023300569504499435, 0.031622499227523804, 0.49983274936676025], "count": [271]}, "timestamp": {"min": [0.0], "max": [13.5], "mean": [6.75], "std": [3.911521443121589], "count": [271]}, "frame_index": {"min": [0], "max": [270], "mean": [135.0], "std": [78.23042886243178], "count": [271]}, "episode_index": {"min": [295], "max": [295], "mean": [295.0], "std": [0.0], "count": [271]}, "index": {"min": [79152], "max": [79422], "mean": [79287.0], "std": [78.23042886243178], "count": [271]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [271]}}} +{"episode_index": 296, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34016167853860296]], [[0.272275998583027]], [[0.22801906032188266]]], "std": [[[0.15741743800407174]], [[0.15257634337411727]], [[0.15309983841105126]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3283045193541284]], [[0.28402677528530945]], [[0.2508615052466299]]], "std": [[[0.16625846879297146]], [[0.18152551184114754]], [[0.19147244146248707]]], "count": [100]}, "observation.state": {"min": [-0.05199813097715378, -0.20356786251068115, 0.44673481583595276, 3.1100456714630127, -0.4944077432155609, -0.4106716513633728, 0.01969536580145359, -0.03991188481450081], "max": [0.1636514961719513, 0.25715556740760803, 0.6826540231704712, 3.2622549533843994, -0.0013251077616587281, 0.0964634120464325, 0.039829667657613754, -0.01902797445654869], "mean": [0.05270450562238693, 0.04612431302666664, 0.5931826829910278, 3.1745052337646484, -0.3250386118888855, -0.13763427734375, 0.02957112155854702, -0.02921018935739994], "std": [0.05727706104516983, 0.15830200910568237, 0.0727212131023407, 0.039819035679101944, 0.13929031789302826, 0.13937613368034363, 0.008598688058555126, 0.009204444475471973], "count": [254]}, "action": {"min": [-0.7124999761581421, -0.7580357193946838, -0.8919642567634583, -0.07285714149475098, -0.11571428924798965, -0.12214285880327225, 0.0], "max": [0.7526785731315613, 0.84375, 0.9375, 0.10499999672174454, 0.15000000596046448, 0.12964285910129547, 1.0], "mean": [-0.015396522358059883, 0.08585137873888016, -0.05523762106895447, 0.0031931945122778416, 0.0011431386228650808, -0.0013329582288861275, 0.4921259880065918], "std": [0.331600159406662, 0.43472054600715637, 0.45402196049690247, 0.024282297119498253, 0.04848257452249527, 0.04092758148908615, 0.49993741512298584], "count": [254]}, "timestamp": {"min": [0.0], "max": [12.65], "mean": [6.325], "std": [3.6661457963370743], "count": [254]}, "frame_index": {"min": [0], "max": [253], "mean": [126.5], "std": [73.32291592674149], "count": [254]}, "episode_index": {"min": [296], "max": [296], "mean": [296.0], "std": [0.0], "count": [254]}, "index": {"min": [79423], "max": [79676], "mean": [79549.5], "std": [73.32291592674149], "count": [254]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [254]}}} +{"episode_index": 297, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3762610707002528]], [[0.31558047485351565]], [[0.271786782059015]]], "std": [[[0.16698249321233993]], [[0.15892825804112257]], [[0.141080040799899]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3302034756529565]], [[0.2850279116163067]], [[0.25231212780522366]]], "std": [[[0.17538840905901806]], [[0.1929797164384675]], [[0.2031689634135578]]], "count": [100]}, "observation.state": {"min": [-0.16843070089817047, -0.10802410542964935, 0.4491857886314392, 3.0252959728240967, -0.32508599758148193, -0.09081882983446121, 0.015677623450756073, -0.03984132781624794], "max": [0.07113045454025269, 0.25694382190704346, 0.7122635245323181, 3.205411195755005, 0.0850893184542656, 0.6981907486915588, 0.03983539342880249, -0.022478869184851646], "mean": [-0.02365599386394024, 0.08387037366628647, 0.6038805246353149, 3.133319139480591, -0.12235049158334732, 0.35465556383132935, 0.030540896579623222, -0.031768642365932465], "std": [0.06782697886228561, 0.12247022986412048, 0.07214466482400894, 0.04540538415312767, 0.10892840474843979, 0.21742138266563416, 0.008369863964617252, 0.007004345301538706], "count": [236]}, "action": {"min": [-0.65625, -0.7392857074737549, -0.8116071224212646, -0.08250000327825546, -0.09964285790920258, -0.09214285761117935, 0.0], "max": [0.9375, 0.8491071462631226, 0.9375, 0.10499999672174454, 0.14571428298950195, 0.05892857164144516, 1.0], "mean": [0.03595642000436783, 0.10380598902702332, -0.007899506017565727, -0.002846549963578582, 0.00962469819933176, -0.007263923529535532, 0.5], "std": [0.35282573103904724, 0.4342879354953766, 0.4858282506465912, 0.029500942677259445, 0.057178035378456116, 0.024002758786082268, 0.5], "count": [236]}, "timestamp": {"min": [0.0], "max": [11.75], "mean": [5.875], "std": [3.406336008088456], "count": [236]}, "frame_index": {"min": [0], "max": [235], "mean": [117.5], "std": [68.12672016176913], "count": [236]}, "episode_index": {"min": [297], "max": [297], "mean": [297.0], "std": [0.0], "count": [236]}, "index": {"min": [79677], "max": [79912], "mean": [79794.5], "std": [68.12672016176913], "count": [236]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [236]}}} +{"episode_index": 298, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.984313725490196]], [[0.9882352941176471]], [[1.0]]], "mean": [[[0.3423391855277267]], [[0.2684498542336856]], [[0.17463408586090687]]], "std": [[[0.20289748986143202]], [[0.153745090087216]], [[0.10832799704424671]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9764705882352941]], [[0.9764705882352941]], [[0.9647058823529412]]], "mean": [[[0.35616059007831646]], [[0.29964530914905024]], [[0.22301479923023898]]], "std": [[[0.13909437784629283]], [[0.1300265225077803]], [[0.14035502147035228]]], "count": [100]}, "observation.state": {"min": [-0.4638766348361969, -0.18411752581596375, 0.9975252151489258, 2.080260992050171, -2.153820753097534, -0.4957335293292999, 0.0095934784039855, -0.03982079029083252], "max": [-0.15393732488155365, 0.11687382310628891, 1.2420490980148315, 3.1514689922332764, 0.007839472964406013, -0.06170779466629028, 0.039826445281505585, -0.01494828425347805], "mean": [-0.26573440432548523, -0.03714201971888542, 1.1608136892318726, 2.788466215133667, -0.965464174747467, -0.23676425218582153, 0.021831495687365532, -0.02247483655810356], "std": [0.074973925948143, 0.11466524004936218, 0.07433400303125381, 0.36277252435684204, 0.7226164937019348, 0.13020755350589752, 0.01095624640583992, 0.0106017692014575], "count": [170]}, "action": {"min": [-0.6348214149475098, -0.6428571343421936, -0.7875000238418579, -0.08214285969734192, -0.0771428570151329, -0.18357142806053162, 0.0], "max": [0.5625, 0.4714285731315613, 0.9026785492897034, 0.0, 0.09000000357627869, -0.0, 1.0], "mean": [-0.09063027799129486, -0.07504729181528091, -0.06226890906691551, -0.0199957974255085, 0.005004198290407658, -0.07623117417097092, 0.2705882489681244], "std": [0.29386526346206665, 0.2742830812931061, 0.38934189081192017, 0.024689970538020134, 0.032089460641145706, 0.04779866710305214, 0.44426319003105164], "count": [170]}, "timestamp": {"min": [0.0], "max": [8.45], "mean": [4.225], "std": [2.453696191462994], "count": [170]}, "frame_index": {"min": [0], "max": [169], "mean": [84.5], "std": [49.073923829259876], "count": [170]}, "episode_index": {"min": [298], "max": [298], "mean": [298.0], "std": [0.0], "count": [170]}, "index": {"min": [79913], "max": [80082], "mean": [79997.5], "std": [49.073923829259876], "count": [170]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [170]}}} +{"episode_index": 299, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35378687899720435]], [[0.27759249219707416]], [[0.1799840716193704]]], "std": [[[0.21219576832467324]], [[0.16063986357257665]], [[0.11144225741649218]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35566382494159776]], [[0.3000564706839767]], [[0.2248241487390855]]], "std": [[[0.14126354205241176]], [[0.13275294385787192]], [[0.1429704994338058]]], "count": [100]}, "observation.state": {"min": [-0.4178513288497925, -0.19865663349628448, 1.0037134885787964, 1.8228473663330078, -2.3083276748657227, -0.4170323312282562, 0.011746558360755444, -0.03987430781126022], "max": [-0.13384655117988586, 0.1337275505065918, 1.2918574810028076, 3.144779920578003, -0.0007730430224910378, -0.003519789082929492, 0.03987853229045868, -0.014655383303761482], "mean": [-0.21431538462638855, -0.005849427543580532, 1.1879284381866455, 2.6992835998535156, -1.0815176963806152, -0.21382538974285126, 0.021858014166355133, -0.022271346300840378], "std": [0.08179248869419098, 0.11232659220695496, 0.09247841686010361, 0.47775888442993164, 0.823979377746582, 0.13659138977527618, 0.011355549097061157, 0.011058625765144825], "count": [189]}, "action": {"min": [-0.6991071701049805, -0.5866071581840515, -0.8946428298950195, -0.05642857030034065, -0.03285714238882065, -0.21142856776714325, 0.0], "max": [0.5303571224212646, 0.4258928596973419, 0.9375, 0.037857141345739365, 0.06142857298254967, -0.0, 1.0], "mean": [-0.0748724564909935, -0.0606008879840374, -0.051275525242090225, -0.011156459338963032, 0.010143609717488289, -0.0772184357047081, 0.2698412835597992], "std": [0.30250057578086853, 0.22822965681552887, 0.41745102405548096, 0.01701328158378601, 0.016449209302663803, 0.05920151248574257, 0.4438777565956116], "count": [189]}, "timestamp": {"min": [0.0], "max": [9.4], "mean": [4.7], "std": [2.727941837112123], "count": [189]}, "frame_index": {"min": [0], "max": [188], "mean": [94.0], "std": [54.55883674224247], "count": [189]}, "episode_index": {"min": [299], "max": [299], "mean": [299.0], "std": [0.0], "count": [189]}, "index": {"min": [80083], "max": [80271], "mean": [80177.0], "std": [54.55883674224247], "count": [189]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [189]}}} +{"episode_index": 300, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5996764861462163]], [[0.5536360270182291]], [[0.5007522044462316]]], "std": [[[0.27874791808078603]], [[0.2601584164743304]], [[0.2371774629713972]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.548388245825674]], [[0.5083765713560815]], [[0.4581678520651425]]], "std": [[[0.29925669810621697]], [[0.2780109260616597]], [[0.2632753981363731]]], "count": [100]}, "observation.state": {"min": [-0.19682319462299347, -0.07684211432933807, 0.9489116072654724, 2.311006784439087, -2.1115055084228516, -1.2966724634170532, 0.002217057393863797, -0.040258802473545074], "max": [0.061644308269023895, 0.20604780316352844, 1.1763370037078857, 3.141707420349121, 0.001172369229607284, 0.14317797124385834, 0.04040733724832535, -0.001496153068728745], "mean": [-0.011748827062547207, 0.022639408707618713, 1.0431044101715088, 2.7319014072418213, -1.5529117584228516, -0.22642643749713898, 0.025749363005161285, -0.02542378380894661], "std": [0.05819607153534889, 0.08661071211099625, 0.07809494435787201, 0.23364362120628357, 0.5325741171836853, 0.41187259554862976, 0.017390375956892967, 0.017725134268403053], "count": [237]}, "action": {"min": [-0.5464285612106323, -0.6669642925262451, -0.5062500238418579, -0.05464285612106323, -0.09857142716646194, -0.24535714089870453, 0.0], "max": [0.6294642686843872, 0.8142856955528259, 0.675000011920929, 0.12428571283817291, 0.16285714507102966, 0.024642856791615486, 1.0], "mean": [0.04695975407958031, 0.10987794399261475, -0.08953435719013214, 0.022843580693006516, 0.006320071406662464, -0.051826391369104385, 0.6244725584983826], "std": [0.2599286437034607, 0.3286965489387512, 0.2946057915687561, 0.042871247977018356, 0.04875896871089935, 0.07580474019050598, 0.4842587411403656], "count": [237]}, "timestamp": {"min": [0.0], "max": [11.8], "mean": [5.8999999999999995], "std": [3.4207698938494335], "count": [237]}, "frame_index": {"min": [0], "max": [236], "mean": [118.0], "std": [68.41539787698868], "count": [237]}, "episode_index": {"min": [300], "max": [300], "mean": [300.0], "std": [0.0], "count": [237]}, "index": {"min": [80272], "max": [80508], "mean": [80390.0], "std": [68.41539787698868], "count": [237]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [237]}}} +{"episode_index": 301, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35048385739793964]], [[0.2878004874435126]], [[0.24534913485657936]]], "std": [[[0.16254862274406484]], [[0.16420349124993594]], [[0.17080815269104693]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3110852068732766]], [[0.26210848879346665]], [[0.22880009789560354]]], "std": [[[0.14700950417851713]], [[0.15966735503325646]], [[0.16770998886909932]]], "count": [100]}, "observation.state": {"min": [-0.11311284452676773, -0.2829635441303253, 0.5045189261436462, 3.0076653957366943, -0.057003702968358994, -0.4119431972503662, 0.002946610329672694, -0.03987324982881546], "max": [0.014330764301121235, 0.3390807807445526, 0.6715035438537598, 3.1591713428497314, 0.5256719589233398, -0.00900555495172739, 0.03997932747006416, -0.0014771644491702318], "mean": [-0.03652133420109749, -0.017935851588845253, 0.5819414258003235, 3.081339120864868, 0.2596466541290283, -0.18322433531284332, 0.02303769811987877, -0.021873395889997482], "std": [0.03745778650045395, 0.2057369351387024, 0.04855310916900635, 0.038856055587530136, 0.19310283660888672, 0.1482861191034317, 0.016643060371279716, 0.017224611714482307], "count": [236]}, "action": {"min": [-0.6026785969734192, -0.6776785850524902, -0.581250011920929, -0.04821428656578064, -0.10178571194410324, -0.06964285671710968, 0.0], "max": [0.7044642567634583, 0.7875000238418579, 0.8812500238418579, 0.0771428570151329, 0.11785714328289032, 0.11571428924798965, 1.0], "mean": [0.014788887463510036, 0.10887939482927322, -0.06374092400074005, -0.004276634193956852, 0.006723667494952679, -0.0010441899066790938, 0.5127118825912476], "std": [0.25154805183410645, 0.4026053547859192, 0.34987714886665344, 0.02042466588318348, 0.04072665423154831, 0.039812467992305756, 0.4998384714126587], "count": [236]}, "timestamp": {"min": [0.0], "max": [11.75], "mean": [5.875], "std": [3.406336008088456], "count": [236]}, "frame_index": {"min": [0], "max": [235], "mean": [117.5], "std": [68.12672016176913], "count": [236]}, "episode_index": {"min": [301], "max": [301], "mean": [301.0], "std": [0.0], "count": [236]}, "index": {"min": [80509], "max": [80744], "mean": [80626.5], "std": [68.12672016176913], "count": [236]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [236]}}} +{"episode_index": 302, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35112292300953585]], [[0.284547482958027]], [[0.24377182904411765]]], "std": [[[0.15760606579628114]], [[0.15943551676133555]], [[0.1653483840523165]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31995474243164057]], [[0.2734056905110677]], [[0.24275258801030178]]], "std": [[[0.1573504813464485]], [[0.1722838033133726]], [[0.1826863397028287]]], "count": [100]}, "observation.state": {"min": [-0.13734988868236542, -0.10708721727132797, 0.44671154022216797, 3.037871837615967, -0.5724784731864929, -0.2599620521068573, 0.005151801276952028, -0.03983471542596817], "max": [0.13712288439273834, 0.10676155239343643, 0.6867045760154724, 3.406550407409668, 0.5021048784255981, 0.08465132117271423, 0.04029977694153786, -0.00533004105091095], "mean": [-0.007587040308862925, 0.006681171711534262, 0.5568013191223145, 3.1855030059814453, 0.04969228059053421, -0.09491642564535141, 0.025987835600972176, -0.0240342915058136], "std": [0.08807291090488434, 0.0752715989947319, 0.06954944878816605, 0.09801970422267914, 0.3174210786819458, 0.0877022072672844, 0.014944403432309628, 0.014539512805640697], "count": [252]}, "action": {"min": [-0.4660714268684387, -0.46071428060531616, -0.5491071343421936, -0.0803571417927742, -0.07928571105003357, -0.15214285254478455, 0.0], "max": [0.6723214387893677, 0.3616071343421936, 0.3883928656578064, 0.11571428924798965, 0.12428571283817291, 0.12857143580913544, 1.0], "mean": [0.03219599276781082, 0.03504463657736778, -0.11271259933710098, 0.00048469522153027356, -0.0023044226691126823, -0.01271683257073164, 0.460317462682724], "std": [0.3055107295513153, 0.1558864861726761, 0.2583957016468048, 0.03758605569601059, 0.03891746327280998, 0.05449853464961052, 0.4984225034713745], "count": [252]}, "timestamp": {"min": [0.0], "max": [12.55], "mean": [6.2749999999999995], "std": [3.6372780573756893], "count": [252]}, "frame_index": {"min": [0], "max": [251], "mean": [125.5], "std": [72.74556114751378], "count": [252]}, "episode_index": {"min": [302], "max": [302], "mean": [302.0], "std": [0.0], "count": [252]}, "index": {"min": [80745], "max": [80996], "mean": [80870.5], "std": [72.74556114751378], "count": [252]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [252]}}} +{"episode_index": 303, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5636504223393459]], [[0.5299279641544118]], [[0.4945496897977941]]], "std": [[[0.26877439213117055]], [[0.24579543707384666]], [[0.22320555538971576]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5375183380725338]], [[0.5028008895574831]], [[0.4546345926920573]]], "std": [[[0.2998122695218036]], [[0.27405091460315356]], [[0.25448915171030956]]], "count": [100]}, "observation.state": {"min": [-0.21204257011413574, -0.09006356447935104, 0.9272628426551819, 1.4510234594345093, -0.06127942353487015, -0.31826069951057434, 0.004031549207866192, -0.04000038281083107], "max": [0.09758318960666656, 0.20614691078662872, 1.164934515953064, 3.1411828994750977, 2.905012369155884, 0.544158399105072, 0.039906926453113556, -0.007423369213938713], "mean": [-0.0702911913394928, 0.07353586703538895, 1.0504462718963623, 2.552932024002075, 1.4724222421646118, 0.12845487892627716, 0.0260696429759264, -0.026759274303913116], "std": [0.12139759212732315, 0.105417899787426, 0.08074365556240082, 0.5794536471366882, 1.120419979095459, 0.31496313214302063, 0.01489065308123827, 0.014177076518535614], "count": [244]}, "action": {"min": [-0.5303571224212646, -0.8544642925262451, -0.9026785492897034, -0.03214285895228386, -0.14892856776714325, -0.08250000327825546, 0.0], "max": [0.8276785612106323, 0.7714285850524902, 0.7258928418159485, 0.13178572058677673, 0.09535714238882065, 0.375, 1.0], "mean": [0.03280152007937431, 0.05846752971410751, -0.09390375018119812, 0.014306209981441498, -0.012264346703886986, 0.08078746497631073, 0.5655737519264221], "std": [0.2994050085544586, 0.34770655632019043, 0.3716602325439453, 0.03633612021803856, 0.04775617644190788, 0.11237910389900208, 0.4956812560558319], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [303], "max": [303], "mean": [303.0], "std": [0.0], "count": [244]}, "index": {"min": [80997], "max": [81240], "mean": [81118.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [244]}}} +{"episode_index": 304, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5821813581878064]], [[0.5368915136000689]], [[0.48599096978879447]]], "std": [[[0.28089546717089214]], [[0.2654097137790513]], [[0.2428081030733722]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5505709264418659]], [[0.5101239588120404]], [[0.4593180242800245]]], "std": [[[0.299083815745584]], [[0.27756933032738673]], [[0.26240617684335027]]], "count": [100]}, "observation.state": {"min": [-0.20177434384822845, -0.08503186702728271, 0.9129263758659363, 2.1062982082366943, -2.787870407104492, -1.3710850477218628, 0.00048481085104867816, -0.04002562165260315], "max": [0.004966998938471079, 0.21087107062339783, 1.1855100393295288, 3.1401607990264893, 0.0024975580163300037, 0.2037326693534851, 0.04160946607589722, -0.01137460395693779], "mean": [-0.041772402822971344, 0.05814061686396599, 1.0228270292282104, 2.4621286392211914, -1.792764663696289, -0.3263075053691864, 0.027158284559845924, -0.03130057454109192], "std": [0.054686788469552994, 0.09597600996494293, 0.07244516164064407, 0.31972259283065796, 0.7958629727363586, 0.3423781096935272, 0.017679860815405846, 0.011479789391160011], "count": [306]}, "action": {"min": [-0.34285715222358704, -0.7607142925262451, -0.6455357074737549, -0.08785714209079742, -0.12428571283817291, -0.23571428656578064, 0.0], "max": [0.6964285969734192, 0.7607142925262451, 0.6053571701049805, 0.17142857611179352, 0.1875, 0.1510714292526245, 1.0], "mean": [0.02343311905860901, 0.15393032133579254, -0.13683471083641052, 0.019607843831181526, -0.0035644276067614555, -0.034303218126297, 0.6633986830711365], "std": [0.21577952802181244, 0.34805408120155334, 0.28359001874923706, 0.053707804530858994, 0.06343387067317963, 0.09344688057899475, 0.47254765033721924], "count": [306]}, "timestamp": {"min": [0.0], "max": [15.25], "mean": [7.625], "std": [4.416705974667848], "count": [306]}, "frame_index": {"min": [0], "max": [305], "mean": [152.5], "std": [88.33411949335697], "count": [306]}, "episode_index": {"min": [304], "max": [304], "mean": [304.0], "std": [0.0], "count": [306]}, "index": {"min": [81241], "max": [81546], "mean": [81393.5], "std": [88.33411949335697], "count": [306]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [306]}}} +{"episode_index": 305, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3395084390079274]], [[0.2762328676709942]], [[0.23772422162224266]]], "std": [[[0.15892764857393615]], [[0.1604097976974559]], [[0.1703591355169821]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32576928770775887]], [[0.2812757670084636]], [[0.2481468188715916]]], "std": [[[0.16571138988265982]], [[0.18033620198326727]], [[0.1900805951539553]]], "count": [100]}, "observation.state": {"min": [-0.05489537492394447, -0.19012345373630524, 0.445506751537323, 3.0952603816986084, -0.2267301380634308, -0.443444162607193, 0.01958015188574791, -0.04058677703142166], "max": [0.11220045387744904, 0.29993078112602234, 0.7044312953948975, 3.192927598953247, 0.06682939827442169, 0.05126743018627167, 0.03979349508881569, -0.017010584473609924], "mean": [0.04020339995622635, 0.06494411081075668, 0.5924272537231445, 3.1434433460235596, -0.10460380464792252, -0.1949646919965744, 0.02843218483030796, -0.028997940942645073], "std": [0.05288773402571678, 0.16060860455036163, 0.07527151703834534, 0.02224910445511341, 0.10251761972904205, 0.12579596042633057, 0.009229792281985283, 0.00906819012016058], "count": [243]}, "action": {"min": [-0.7794643044471741, -0.7901785969734192, -0.9375, -0.12321428209543228, -0.1403571367263794, -0.0771428570151329, 0.0], "max": [0.7473214268684387, 0.8999999761581421, 0.9375, 0.04821428656578064, 0.15214285254478455, 0.14678572118282318, 1.0], "mean": [0.0026234518736600876, 0.09393742680549622, -0.04479718953371048, 0.0012389770708978176, 0.009149033576250076, -0.00037478029844351113, 0.4650205671787262], "std": [0.338245153427124, 0.45589175820350647, 0.5071949362754822, 0.021655112504959106, 0.05319845303893089, 0.040642961859703064, 0.4987744390964508], "count": [243]}, "timestamp": {"min": [0.0], "max": [12.1], "mean": [6.05], "std": [3.507373186113315], "count": [243]}, "frame_index": {"min": [0], "max": [242], "mean": [121.0], "std": [70.14746372226631], "count": [243]}, "episode_index": {"min": [305], "max": [305], "mean": [305.0], "std": [0.0], "count": [243]}, "index": {"min": [81547], "max": [81789], "mean": [81668.0], "std": [70.14746372226631], "count": [243]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [243]}}} +{"episode_index": 306, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5956648623021584]], [[0.5471406694610517]], [[0.49611433948625516]]], "std": [[[0.2815145822932874]], [[0.2551170369428768]], [[0.22599484969313616]]], "count": [106]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5659876245857828]], [[0.5273694076848569]], [[0.47682088216145835]]], "std": [[[0.29464872148042914]], [[0.27071562098901897]], [[0.25210414796159863]]], "count": [106]}, "observation.state": {"min": [-0.2023928165435791, -0.29011690616607666, 1.0037182569503784, 2.2576372623443604, -2.8297226428985596, -0.609967827796936, 0.006955866701900959, -0.04011404514312744], "max": [0.04657833278179169, 0.17131812870502472, 1.2294913530349731, 3.589416027069092, 0.001385373529046774, 0.08871693164110184, 0.040015023201704025, -0.0065013812854886055], "mean": [-0.031634632498025894, -0.022491374984383583, 1.098692774772644, 2.747687339782715, -1.8964232206344604, -0.306191623210907, 0.030365336686372757, -0.030400235205888748], "std": [0.061315182596445084, 0.14293943345546722, 0.05791844427585602, 0.3786878287792206, 0.8191129565238953, 0.17204810678958893, 0.0129847452044487, 0.013142322190105915], "count": [505]}, "action": {"min": [-0.6241071224212646, -0.9375, -0.6616071462631226, -0.11142857372760773, -0.17892856895923615, -0.3107142746448517, 0.0], "max": [0.5651785731315613, 0.7607142925262451, 0.7446428537368774, 0.11892857402563095, 0.1875, 0.20678570866584778, 1.0], "mean": [0.028488336130976677, -0.018399961292743683, -0.033479463309049606, -0.004315416794270277, 0.0002503525174688548, -0.005382597912102938, 0.6297029852867126], "std": [0.20032250881195068, 0.339219868183136, 0.2631931006908417, 0.03959590569138527, 0.05456196144223213, 0.09885905683040619, 0.48288387060165405], "count": [505]}, "timestamp": {"min": [0.0], "max": [25.2], "mean": [12.6], "std": [7.289032857656769], "count": [505]}, "frame_index": {"min": [0], "max": [504], "mean": [252.0], "std": [145.78065715313537], "count": [505]}, "episode_index": {"min": [306], "max": [306], "mean": [306.0], "std": [0.0], "count": [505]}, "index": {"min": [81790], "max": [82294], "mean": [82042.0], "std": [145.78065715313537], "count": [505]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [505]}}} +{"episode_index": 307, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34625573491115197]], [[0.2800378100825291]], [[0.2343218174354703]]], "std": [[[0.1467260618992633]], [[0.14579208792266385]], [[0.1487284012132505]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3132469602098652]], [[0.2641257695216758]], [[0.23053889914119946]]], "std": [[[0.14628972018814335]], [[0.15961271686345596]], [[0.1679044504087955]]], "count": [100]}, "observation.state": {"min": [-0.12436433136463165, -0.28243154287338257, 0.5263015627861023, 2.7744781970977783, -1.0466322898864746, -0.2451074868440628, 0.003572425339370966, -0.04017893224954605], "max": [0.048465877771377563, 0.34097182750701904, 0.6795162558555603, 3.173187732696533, 0.1292176991701126, 0.001204736065119505, 0.04068130999803543, -0.005333388224244118], "mean": [-0.018069429323077202, -0.01006990484893322, 0.5850563645362854, 3.0713415145874023, -0.16287162899971008, -0.09555186331272125, 0.022057106718420982, -0.022301534190773964], "std": [0.04868290573358536, 0.2005634307861328, 0.044233109802007675, 0.10645551234483719, 0.36134108901023865, 0.05929829925298691, 0.015656856819987297, 0.015367848798632622], "count": [330]}, "action": {"min": [-0.581250011920929, -0.5491071343421936, -0.5919643044471741, -0.051428571343421936, -0.11464285850524902, -0.11785714328289032, 0.0], "max": [0.6241071224212646, 0.8223214149475098, 0.6964285969734192, 0.04178571328520775, 0.06321428716182709, 0.03642857074737549, 1.0], "mean": [0.00279220356605947, 0.08401785045862198, -0.04448864236474037, -0.004441559314727783, -0.00019480557239148766, -0.01855844259262085, 0.47575756907463074], "std": [0.1968909353017807, 0.3175082504749298, 0.2765064537525177, 0.012763066217303276, 0.028163131326436996, 0.032135069370269775, 0.4994125962257385], "count": [330]}, "timestamp": {"min": [0.0], "max": [16.45], "mean": [8.225], "std": [4.763117851435829], "count": [330]}, "frame_index": {"min": [0], "max": [329], "mean": [164.5], "std": [95.26235702871658], "count": [330]}, "episode_index": {"min": [307], "max": [307], "mean": [307.0], "std": [0.0], "count": [330]}, "index": {"min": [82295], "max": [82624], "mean": [82459.5], "std": [95.26235702871658], "count": [330]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [330]}}} +{"episode_index": 308, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32305115643669574]], [[0.2624512005974265]], [[0.22365524411668966]]], "std": [[[0.14972522072991531]], [[0.1456982646080927]], [[0.149404701594603]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3207652581906786]], [[0.2736263577330346]], [[0.239189956964231]]], "std": [[[0.1599170409486261]], [[0.17459585439409717]], [[0.18452476518794805]]], "count": [100]}, "observation.state": {"min": [-0.1015174388885498, -0.1664469987154007, 0.4828048050403595, 3.0128791332244873, -0.5562236309051514, -0.32779639959335327, 0.028694121167063713, -0.03993209823966026], "max": [0.07178434729576111, 0.3312736451625824, 0.73586505651474, 3.2716569900512695, 0.28438371419906616, 0.40713825821876526, 0.04057183489203453, -0.020816631615161896], "mean": [-0.019013021141290665, 0.06952185928821564, 0.6263008713722229, 3.1707310676574707, -0.14553961157798767, -0.03658999875187874, 0.03456481173634529, -0.03287477418780327], "std": [0.043628156185150146, 0.1628550887107849, 0.07052116096019745, 0.06165914610028267, 0.23032693564891815, 0.19597353041172028, 0.004757179878652096, 0.005786624737083912], "count": [336]}, "action": {"min": [-0.4151785671710968, -0.6589285731315613, -0.6401785612106323, -0.09428571164608002, -0.2110714316368103, -0.08571428805589676, 0.0], "max": [0.4044642746448517, 0.7982142567634583, 0.9375, 0.07607142627239227, 0.13285714387893677, 0.0503571443259716, 1.0], "mean": [0.013464591465890408, 0.07633133977651596, -0.028085140511393547, 0.0031313758809119463, -0.0030165810603648424, -0.009072065353393555, 0.4642857015132904], "std": [0.19158539175987244, 0.3293175995349884, 0.3698199987411499, 0.03102983720600605, 0.06414677947759628, 0.027025673538446426, 0.4987228214740753], "count": [336]}, "timestamp": {"min": [0.0], "max": [16.75], "mean": [8.375000000000002], "std": [4.849720782340635], "count": [336]}, "frame_index": {"min": [0], "max": [335], "mean": [167.5], "std": [96.99441564681271], "count": [336]}, "episode_index": {"min": [308], "max": [308], "mean": [308.0], "std": [0.0], "count": [336]}, "index": {"min": [82625], "max": [82960], "mean": [82792.5], "std": [96.99441564681271], "count": [336]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [336]}}} +{"episode_index": 309, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3591938356885723]], [[0.2959861276663986]], [[0.24965193984087777]]], "std": [[[0.14901303435462307]], [[0.15215587893427965]], [[0.15602061300215087]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3182375440410539]], [[0.2690802875593597]], [[0.23548570640414368]]], "std": [[[0.1536753754661836]], [[0.168141172562574]], [[0.17692846036187573]]], "count": [100]}, "observation.state": {"min": [-0.11577297747135162, -0.2797611951828003, 0.5072442889213562, 2.9162869453430176, -0.5102747082710266, -0.11660993844270706, 0.0012395130470395088, -0.04000358283519745], "max": [0.06506121158599854, 0.35601988434791565, 0.665282666683197, 3.1768791675567627, 0.1174229308962822, 0.46359097957611084, 0.04103418067097664, -0.0029881498776376247], "mean": [-0.033097751438617706, 0.006100987084209919, 0.5749548673629761, 3.0545523166656494, -0.2064322680234909, 0.16010020673274994, 0.02477280981838703, -0.025012297555804253], "std": [0.04686227813363075, 0.20259083807468414, 0.04204566776752472, 0.0708557516336441, 0.1749258041381836, 0.18689648807048798, 0.016872672364115715, 0.016486870124936104], "count": [264]}, "action": {"min": [-0.6482142806053162, -0.6214285492897034, -0.6616071462631226, -0.0535714291036129, -0.09535714238882065, -0.07392857223749161, 0.0], "max": [0.5571428537368774, 0.8116071224212646, 0.7526785731315613, 0.05892857164144516, 0.11464285850524902, 0.04285714402794838, 1.0], "mean": [0.038321830332279205, 0.10379461199045181, -0.04284697771072388, -0.005836038384586573, -0.0037662291433662176, -0.010787337087094784, 0.5909090638160706], "std": [0.2563975751399994, 0.3729584217071533, 0.3326666057109833, 0.022220274433493614, 0.04138743877410889, 0.02425752952694893, 0.4916658103466034], "count": [264]}, "timestamp": {"min": [0.0], "max": [13.15], "mean": [6.575000000000001], "std": [3.810484439892999], "count": [264]}, "frame_index": {"min": [0], "max": [263], "mean": [131.5], "std": [76.20968879786], "count": [264]}, "episode_index": {"min": [309], "max": [309], "mean": [309.0], "std": [0.0], "count": [264]}, "index": {"min": [82961], "max": [83224], "mean": [83092.5], "std": [76.20968879786], "count": [264]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [264]}}} +{"episode_index": 310, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33151455329446233]], [[0.26678836717792587]], [[0.22848737350164675]]], "std": [[[0.14435371284478415]], [[0.14199809076544825]], [[0.15110702344123655]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3266689082126991]], [[0.2824517786362592]], [[0.2497957649978937]]], "std": [[[0.16791885610161883]], [[0.18249975183223177]], [[0.1919810243428564]]], "count": [100]}, "observation.state": {"min": [-0.05943647772073746, -0.23511691391468048, 0.44660913944244385, 3.083833694458008, -0.20770852267742157, -0.6829068660736084, 0.020336389541625977, -0.03989154100418091], "max": [0.1292952597141266, 0.24432486295700073, 0.6967889666557312, 3.251124143600464, 0.09526810050010681, 0.10844749212265015, 0.04072967916727066, -0.015865707769989967], "mean": [0.05878860875964165, 0.03427625447511673, 0.5930798053741455, 3.159538745880127, -0.051386717706918716, -0.2218209207057953, 0.03054134175181389, -0.028768591582775116], "std": [0.051717933267354965, 0.1657865345478058, 0.07852902263402939, 0.05120693892240524, 0.074668750166893, 0.19294926524162292, 0.008262568153440952, 0.009934992529451847], "count": [257]}, "action": {"min": [-0.6991071701049805, -0.75, -0.768750011920929, -0.0771428570151329, -0.11678571254014969, -0.11142857372760773, 0.0], "max": [0.6883928775787354, 0.9080356955528259, 0.9375, 0.055714286863803864, 0.14571428298950195, 0.061071429401636124, 1.0], "mean": [0.023554710671305656, 0.09367701411247253, -0.037114351987838745, 0.0013841020409017801, 0.013795163482427597, 0.00019594239711295813, 0.505836546421051], "std": [0.3060295581817627, 0.4447024166584015, 0.4420963227748871, 0.02378583699464798, 0.04727315902709961, 0.025896260514855385, 0.4999661147594452], "count": [257]}, "timestamp": {"min": [0.0], "max": [12.8], "mean": [6.399999999999999], "std": [3.7094473981982814], "count": [257]}, "frame_index": {"min": [0], "max": [256], "mean": [128.0], "std": [74.18894796396563], "count": [257]}, "episode_index": {"min": [310], "max": [310], "mean": [310.0], "std": [0.0], "count": [257]}, "index": {"min": [83225], "max": [83481], "mean": [83353.0], "std": [74.18894796396563], "count": [257]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [257]}}} +{"episode_index": 311, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.9764705882352941]], [[0.9921568627450981]]], "mean": [[[0.3503206667432598]], [[0.2748774785060509]], [[0.17853483671300552]]], "std": [[[0.2093264043782368]], [[0.15808085397307947]], [[0.10920703373221075]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9725490196078431]], [[0.9725490196078431]], [[0.9647058823529412]]], "mean": [[[0.3539223794376149]], [[0.2982267671472886]], [[0.22308547076056987]]], "std": [[[0.14192401993207834]], [[0.13241219460103124]], [[0.14176705046214955]]], "count": [100]}, "observation.state": {"min": [-0.43533217906951904, -0.17593425512313843, 0.9930062890052795, 2.028343915939331, -2.0879743099212646, -0.5219276547431946, 0.012828545644879341, -0.03995266556739807], "max": [-0.14340044558048248, 0.1443966180086136, 1.2839661836624146, 3.144017457962036, 0.0035564969293773174, -0.008857902139425278, 0.03994857519865036, -0.01494371984153986], "mean": [-0.24166521430015564, 0.0013947546249255538, 1.1652071475982666, 2.7372846603393555, -1.1668641567230225, -0.2200290709733963, 0.025020264089107513, -0.02539505809545517], "std": [0.07275961339473724, 0.12980002164840698, 0.08621794730424881, 0.37721309065818787, 0.617392897605896, 0.19901444017887115, 0.012179378420114517, 0.011844441294670105], "count": [186]}, "action": {"min": [-0.5464285612106323, -0.7875000238418579, -0.75, -0.0657142847776413, -0.011428571306169033, -0.15214285254478455, 0.0], "max": [0.4044642746448517, 0.4017857015132904, 0.9375, 0.022142857313156128, 0.09071428328752518, -0.0, 1.0], "mean": [-0.058482132852077484, -0.06952764838933945, -0.055789168924093246, -0.010234256274998188, 0.01436635758727789, -0.06950078159570694, 0.3870967626571655], "std": [0.25008419156074524, 0.28872624039649963, 0.401355117559433, 0.017010904848575592, 0.02560194581747055, 0.04634114354848862, 0.48708653450012207], "count": [186]}, "timestamp": {"min": [0.0], "max": [9.25], "mean": [4.625], "std": [2.6846399510300567], "count": [186]}, "frame_index": {"min": [0], "max": [185], "mean": [92.5], "std": [53.692799020601136], "count": [186]}, "episode_index": {"min": [311], "max": [311], "mean": [311.0], "std": [0.0], "count": [186]}, "index": {"min": [83482], "max": [83667], "mean": [83574.5], "std": [53.692799020601136], "count": [186]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [186]}}} +{"episode_index": 312, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5261712574678309]], [[0.4866304931640625]], [[0.4329704386393229]]], "std": [[[0.3083345356987135]], [[0.27865021875817036]], [[0.24854476044168655]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5117259090647979]], [[0.48046119959214156]], [[0.4346504606359145]]], "std": [[[0.3105091374835556]], [[0.2841844939157429]], [[0.2635179920658887]]], "count": [100]}, "observation.state": {"min": [-0.35069552063941956, -0.07065927237272263, 0.9699743390083313, 1.9100594520568848, -3.076091766357422, -0.9457147717475891, 0.0022731248755007982, -0.04000691697001457], "max": [0.024164708331227303, 0.2698635458946228, 1.2087236642837524, 3.3478305339813232, -6.082037361920811e-05, -0.054237041622400284, 0.04001164808869362, 0.000622027728240937], "mean": [-0.07911794632673264, 0.0960213765501976, 1.0885366201400757, 2.543694257736206, -2.2301182746887207, -0.6832816004753113, 0.03404752165079117, -0.03051055781543255], "std": [0.10127995163202286, 0.10699561983346939, 0.06505727767944336, 0.41437336802482605, 0.833692193031311, 0.24556638300418854, 0.011208344250917435, 0.01324990764260292], "count": [256]}, "action": {"min": [-0.7151785492897034, -0.5598214268684387, -0.5598214268684387, -0.12428571283817291, -0.11571428924798965, -0.29249998927116394, 0.0], "max": [0.9375, 0.9160714149475098, 0.3616071343421936, 0.15000000596046448, 0.1510714292526245, 0.1778571456670761, 1.0], "mean": [0.031148865818977356, 0.14326168596744537, -0.04137137904763222, 0.01476561464369297, 0.024575890973210335, -0.03256557881832123, 0.73046875], "std": [0.39917099475860596, 0.3423383831977844, 0.2347099930047989, 0.05716430023312569, 0.06546474993228912, 0.12203904241323471, 0.44371628761291504], "count": [256]}, "timestamp": {"min": [0.0], "max": [12.75], "mean": [6.375], "std": [3.6950135317749515], "count": [256]}, "frame_index": {"min": [0], "max": [255], "mean": [127.5], "std": [73.90027063549903], "count": [256]}, "episode_index": {"min": [312], "max": [312], "mean": [312.0], "std": [0.0], "count": [256]}, "index": {"min": [83668], "max": [83923], "mean": [83795.5], "std": [73.90027063549903], "count": [256]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [256]}}} +{"episode_index": 313, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[0.9882352941176471]], [[0.9921568627450981]]], "mean": [[[0.3121341451009115]], [[0.24564668722713695]], [[0.1615928207098269]]], "std": [[[0.21459640126802948]], [[0.16202589462846062]], [[0.11044488039856089]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9647058823529412]], [[0.9647058823529412]], [[0.9647058823529412]]], "mean": [[[0.35549368166456036]], [[0.29912152518478097]], [[0.22247877412683825]]], "std": [[[0.13933709851227988]], [[0.13022317506641257]], [[0.14038767395320592]]], "count": [100]}, "observation.state": {"min": [-0.4138263463973999, -0.13993090391159058, 0.9858377575874329, 1.8775945901870728, -2.1875712871551514, -0.45941340923309326, 0.011432303115725517, -0.039838969707489014], "max": [-0.18721427023410797, 0.12990456819534302, 1.2490819692611694, 3.1754908561706543, 0.0009291444439440966, -0.027991188690066338, 0.039889734238386154, -0.014481519348919392], "mean": [-0.28117531538009644, -0.030214792117476463, 1.1652729511260986, 2.7844672203063965, -1.005689263343811, -0.28918561339378357, 0.021502474322915077, -0.022049864754080772], "std": [0.06353627890348434, 0.10536162555217743, 0.07722264528274536, 0.4721246063709259, 0.8344056606292725, 0.14510256052017212, 0.011109919287264347, 0.01078085508197546], "count": [193]}, "action": {"min": [-0.6991071701049805, -0.8892857432365417, -0.9375, -0.0771428570151329, -0.05642857030034065, -0.24214285612106323, 0.0], "max": [0.44732141494750977, 0.40982142090797424, 0.9375, 0.033571429550647736, 0.1599999964237213, 0.033571429550647736, 1.0], "mean": [-0.08209195733070374, -0.04607698321342468, -0.06745003163814545, -0.008915617130696774, 0.020418213680386543, -0.07327532768249512, 0.25388601422309875], "std": [0.23148052394390106, 0.27405932545661926, 0.39541083574295044, 0.021435000002384186, 0.040873508900403976, 0.07995353639125824, 0.43523305654525757], "count": [193]}, "timestamp": {"min": [0.0], "max": [9.6], "mean": [4.8], "std": [2.785677655436824], "count": [193]}, "frame_index": {"min": [0], "max": [192], "mean": [96.0], "std": [55.71355310873648], "count": [193]}, "episode_index": {"min": [313], "max": [313], "mean": [313.0], "std": [0.0], "count": [193]}, "index": {"min": [83924], "max": [84116], "mean": [84020.0], "std": [55.71355310873648], "count": [193]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [193]}}} +{"episode_index": 314, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5873876169242112]], [[0.5394429046032475]], [[0.4891541765998392]]], "std": [[[0.28453360195095]], [[0.25802599042132035]], [[0.22833693793546422]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5673494412291284]], [[0.5290264892578125]], [[0.47890627513212314]]], "std": [[[0.2946458915548042]], [[0.2710740328314805]], [[0.2530735236205273]]], "count": [100]}, "observation.state": {"min": [-0.20129245519638062, -0.28110775351524353, 1.0104868412017822, 2.5251104831695557, -2.529543399810791, -0.6959367394447327, 0.004627616610378027, -0.039836663752794266], "max": [0.10292192548513412, 0.21905574202537537, 1.2033380270004272, 3.142045021057129, -0.004329327028244734, -0.052480995655059814, 0.04001067951321602, -0.010587930679321289], "mean": [0.0011850609444081783, -0.035389140248298645, 1.1100739240646362, 2.7470450401306152, -2.0236287117004395, -0.41829347610473633, 0.02753833495080471, -0.02860078774392605], "std": [0.06636495143175125, 0.15267574787139893, 0.059284716844558716, 0.18949173390865326, 0.6165920495986938, 0.17264917492866516, 0.012968629598617554, 0.012083740904927254], "count": [383]}, "action": {"min": [-0.4312500059604645, -0.8383928537368774, -0.4660714268684387, -0.10821428894996643, -0.06321428716182709, -0.23999999463558197, 0.0], "max": [0.6241071224212646, 0.8303571343421936, 0.6321428418159485, 0.11678571254014969, 0.09000000357627869, 0.2175000011920929, 1.0], "mean": [0.04247948154807091, -0.01721137762069702, -0.0426403284072876, 0.005712414626032114, 0.00454867584630847, -0.017187604680657387, 0.5456919074058533], "std": [0.24887818098068237, 0.3923596441745758, 0.2923693358898163, 0.03457225486636162, 0.029117779806256294, 0.08673415333032608, 0.49790823459625244], "count": [383]}, "timestamp": {"min": [0.0], "max": [19.1], "mean": [9.549999999999999], "std": [5.528109984434101], "count": [383]}, "frame_index": {"min": [0], "max": [382], "mean": [191.0], "std": [110.56219968868203], "count": [383]}, "episode_index": {"min": [314], "max": [314], "mean": [314.0], "std": [0.0], "count": [383]}, "index": {"min": [84117], "max": [84499], "mean": [84308.0], "std": [110.56219968868203], "count": [383]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [383]}}} +{"episode_index": 315, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35196913117053463]], [[0.28508455224130663]], [[0.23963450233609068]]], "std": [[[0.1468379279321129]], [[0.14671926879354988]], [[0.1508045867504117]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3181326946183747]], [[0.26992979161879593]], [[0.23702164653703278]]], "std": [[[0.15444990717191062]], [[0.16827923217508378]], [[0.17708973091868155]]], "count": [100]}, "observation.state": {"min": [-0.11405114084482193, -0.2508329451084137, 0.5115638971328735, 3.01261568069458, -0.7431809902191162, -0.4009937047958374, 0.003992876503616571, -0.039808034896850586], "max": [0.049667879939079285, 0.3337429463863373, 0.6804570555686951, 3.2335898876190186, 0.35953423380851746, 0.3886607587337494, 0.04000331461429596, -0.0056250859051942825], "mean": [-0.026098372414708138, -0.019092919304966927, 0.5943906903266907, 3.1391665935516357, 0.06205444037914276, -0.016410334035754204, 0.023010000586509705, -0.023890171200037003], "std": [0.043686773627996445, 0.1841830462217331, 0.04925524443387985, 0.06638836860656738, 0.29846563935279846, 0.2112744003534317, 0.015209205448627472, 0.014265919104218483], "count": [233]}, "action": {"min": [-0.4794642925262451, -0.5571428537368774, -0.6187499761581421, -0.0803571417927742, -0.09535714238882065, -0.1371428519487381, 0.0], "max": [0.7017857432365417, 0.7553571462631226, 0.7955357432365417, 0.12964285910129547, 0.12642857432365417, 0.07392857223749161, 1.0], "mean": [0.027981294319033623, 0.10129139572381973, -0.05731912702322006, -0.0033108540810644627, 0.0024831381160765886, -0.01581851951777935, 0.4763948619365692], "std": [0.24512816965579987, 0.37003812193870544, 0.375538170337677, 0.03462086617946625, 0.04559994861483574, 0.04363851994276047, 0.4994422495365143], "count": [233]}, "timestamp": {"min": [0.0], "max": [11.6], "mean": [5.8], "std": [3.363034344160048], "count": [233]}, "frame_index": {"min": [0], "max": [232], "mean": [116.0], "std": [67.26068688320095], "count": [233]}, "episode_index": {"min": [315], "max": [315], "mean": [315.0], "std": [0.0], "count": [233]}, "index": {"min": [84500], "max": [84732], "mean": [84616.0], "std": [67.26068688320095], "count": [233]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [233]}}} +{"episode_index": 316, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5900786138796339]], [[0.5407947728774126]], [[0.49081936166800705]]], "std": [[[0.28256798617093337]], [[0.2559368770264232]], [[0.22619587403669558]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5666958552341834]], [[0.528068021886489]], [[0.4774509283327589]]], "std": [[[0.2944908167439563]], [[0.27056957549053223]], [[0.25206980809836504]]], "count": [100]}, "observation.state": {"min": [-0.20083115994930267, -0.2993839979171753, 0.9990593194961548, 2.2706024646759033, -2.6756885051727295, -0.6532801389694214, 0.0015241160290315747, -0.040247250348329544], "max": [0.04018091410398483, 0.21769437193870544, 1.2089781761169434, 3.1396915912628174, -0.00035881323856301606, -0.07355783879756927, 0.04000869765877724, -0.006094651762396097], "mean": [-0.033853862434625626, -0.028124045580625534, 1.0977418422698975, 2.6182448863983154, -2.1258456707000732, -0.3950408697128296, 0.025459278374910355, -0.02694462053477764], "std": [0.05298754200339317, 0.15820133686065674, 0.06304384768009186, 0.20445649325847626, 0.6137061715126038, 0.14989884197711945, 0.01601928472518921, 0.015012169256806374], "count": [396]}, "action": {"min": [-0.3241071403026581, -0.6857143044471741, -0.4124999940395355, -0.040714286267757416, -0.06428571790456772, -0.3117857277393341, 0.0], "max": [0.5598214268684387, 0.7982142567634583, 0.6321428418159485, 0.07392857223749161, 0.10928571224212646, 0.11249999701976776, 1.0], "mean": [0.029092242941260338, -0.03158141300082207, -0.052306536585092545, 0.007656923960894346, 0.005405845120549202, -0.024964841082692146, 0.5732323527336121], "std": [0.1951259970664978, 0.34727635979652405, 0.2667667865753174, 0.021562710404396057, 0.02950471080839634, 0.09034162014722824, 0.494608074426651], "count": [396]}, "timestamp": {"min": [0.0], "max": [19.75], "mean": [9.875], "std": [5.715749440507926], "count": [396]}, "frame_index": {"min": [0], "max": [395], "mean": [197.5], "std": [114.31498881015851], "count": [396]}, "episode_index": {"min": [316], "max": [316], "mean": [316.0], "std": [0.0], "count": [396]}, "index": {"min": [84733], "max": [85128], "mean": [84930.5], "std": [114.31498881015851], "count": [396]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [396]}}} +{"episode_index": 317, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3206004429237515]], [[0.2587659397499234]], [[0.22091279153262866]]], "std": [[[0.13876347886132914]], [[0.13445816852523837]], [[0.1392196158057764]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31996581732058055]], [[0.2723845944872089]], [[0.23790757841222426]]], "std": [[[0.15909453421703676]], [[0.17380076372957945]], [[0.18378233039359843]]], "count": [100]}, "observation.state": {"min": [-0.11715439707040787, -0.1656244397163391, 0.48538637161254883, 3.005382776260376, -1.024062156677246, -0.16923992335796356, 0.026588888838887215, -0.0403774231672287], "max": [0.02056283876299858, 0.28830671310424805, 0.7255471348762512, 3.2178332805633545, 0.15748172998428345, 0.21044132113456726, 0.03993652015924454, -0.03162671625614166], "mean": [-0.038512732833623886, 0.06376657634973526, 0.6163915991783142, 3.1228034496307373, -0.30025187134742737, 0.03688032925128937, 0.03404134139418602, -0.03660350665450096], "std": [0.03903327137231827, 0.15258142352104187, 0.07022429257631302, 0.052825551480054855, 0.3602244555950165, 0.09174644947052002, 0.005566354840993881, 0.0031527322717010975], "count": [300]}, "action": {"min": [-0.40982142090797424, -0.7607142925262451, -0.6321428418159485, -0.04821428656578064, -0.07928571105003357, -0.07178571075201035, 0.0], "max": [0.5169642567634583, 0.8169642686843872, 0.9375, 0.06642857193946838, 0.1103571429848671, 0.046071428805589676, 1.0], "mean": [0.04016965627670288, 0.055982157588005066, 0.0017232211539521813, 0.0027464290615171194, 0.004039288032799959, -0.017767855897545815, 0.550000011920929], "std": [0.20341692864894867, 0.39082494378089905, 0.4091534912586212, 0.021669162437319756, 0.03882963955402374, 0.025159861892461777, 0.4974936544895172], "count": [300]}, "timestamp": {"min": [0.0], "max": [14.95], "mean": [7.475], "std": [4.330102962594154], "count": [300]}, "frame_index": {"min": [0], "max": [299], "mean": [149.5], "std": [86.60205925188308], "count": [300]}, "episode_index": {"min": [317], "max": [317], "mean": [317.0], "std": [0.0], "count": [300]}, "index": {"min": [85129], "max": [85428], "mean": [85278.5], "std": [86.60205925188308], "count": [300]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [300]}}} +{"episode_index": 318, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3241443289962469]], [[0.27055885464537377]], [[0.24051033229453891]]], "std": [[[0.148394361643139]], [[0.148702054359742]], [[0.15864010246405946]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31819695626053157]], [[0.2735449015299479]], [[0.2407699447332644]]], "std": [[[0.15670569768335657]], [[0.1726012046816172]], [[0.18106125284783528]]], "count": [100]}, "observation.state": {"min": [-0.20893990993499756, -0.09863903373479843, 0.4464641213417053, 2.898798942565918, -0.9617858529090881, -0.31301021575927734, 0.022861668840050697, -0.040771715342998505], "max": [0.09058388322591782, 0.26817798614501953, 0.6802040934562683, 3.21097731590271, 0.001144345966167748, 0.1964447796344757, 0.04107360541820526, -0.012378484010696411], "mean": [-0.03483962267637253, 0.10528579354286194, 0.5946612358093262, 3.0793254375457764, -0.4682027995586395, -0.10128429532051086, 0.032853685319423676, -0.031884267926216125], "std": [0.09024040400981903, 0.12123740464448929, 0.06970948725938797, 0.09840693324804306, 0.2878820300102234, 0.12671306729316711, 0.006512398831546307, 0.009057936258614063], "count": [290]}, "action": {"min": [-0.4955357015132904, -0.6669642925262451, -0.6455357074737549, -0.10178571194410324, -0.12321428209543228, -0.1371428519487381, 0.0], "max": [0.8116071224212646, 0.7848214507102966, 0.9375, 0.07071428745985031, 0.17892856895923615, 0.2817857265472412, 1.0], "mean": [0.03101601079106331, 0.06691810488700867, -0.02684112638235092, 0.004326355177909136, 0.010415026918053627, -0.007788179442286491, 0.4965517222881317], "std": [0.3091489374637604, 0.3318963944911957, 0.39668765664100647, 0.02508169412612915, 0.0508270189166069, 0.0648631602525711, 0.4999881684780121], "count": [290]}, "timestamp": {"min": [0.0], "max": [14.45], "mean": [7.225], "std": [4.185764565763344], "count": [290]}, "frame_index": {"min": [0], "max": [289], "mean": [144.5], "std": [83.7152913152669], "count": [290]}, "episode_index": {"min": [318], "max": [318], "mean": [318.0], "std": [0.0], "count": [290]}, "index": {"min": [85429], "max": [85718], "mean": [85573.5], "std": [83.7152913152669], "count": [290]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [290]}}} +{"episode_index": 319, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6296064536898744]], [[0.582131186690985]], [[0.5266959210564108]]], "std": [[[0.25528552070844407]], [[0.23526864758512975]], [[0.21274067891395976]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5517632757448683]], [[0.5113827269311045]], [[0.4610129885206036]]], "std": [[[0.29924637412071536]], [[0.27876571208425377]], [[0.26439071626767074]]], "count": [100]}, "observation.state": {"min": [-0.19473156332969666, -0.06267495453357697, 0.9114565849304199, 2.448246479034424, -2.24188232421875, -1.1233413219451904, 0.0017551167402416468, -0.03986339271068573], "max": [0.053058747202157974, 0.2066049575805664, 1.179147720336914, 3.140770673751831, -0.00273679057136178, 0.4707532525062561, 0.04062674939632416, -0.00165045284666121], "mean": [-0.0072768977843225, 0.04193410277366638, 1.0200097560882568, 2.737955331802368, -1.6621577739715576, 0.062306299805641174, 0.02758033759891987, -0.026951991021633148], "std": [0.05880596488714218, 0.09074757993221283, 0.08864833414554596, 0.17338061332702637, 0.5264191627502441, 0.37164226174354553, 0.01686786860227585, 0.017026759684085846], "count": [237]}, "action": {"min": [-0.38303571939468384, -0.6830357313156128, -0.6160714030265808, -0.07500000298023224, -0.1639285683631897, -0.3310714364051819, 0.0], "max": [0.5276785492897034, 0.8276785612106323, 0.6723214387893677, 0.1371428519487381, 0.20678570866584778, 0.06642857193946838, 1.0], "mean": [0.03838157653808594, 0.1864262968301773, -0.1639353632926941, 0.026776673272252083, 0.020745927467942238, -0.04789330065250397, 0.6751055121421814], "std": [0.23522967100143433, 0.37981486320495605, 0.33726513385772705, 0.05038122832775116, 0.07152567058801651, 0.09288209676742554, 0.46833544969558716], "count": [237]}, "timestamp": {"min": [0.0], "max": [11.8], "mean": [5.8999999999999995], "std": [3.4207698938494335], "count": [237]}, "frame_index": {"min": [0], "max": [236], "mean": [118.0], "std": [68.41539787698868], "count": [237]}, "episode_index": {"min": [319], "max": [319], "mean": [319.0], "std": [0.0], "count": [237]}, "index": {"min": [85719], "max": [85955], "mean": [85837.0], "std": [68.41539787698868], "count": [237]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [237]}}} +{"episode_index": 320, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35114562030867036]], [[0.2825383647843903]], [[0.23857158645929075]]], "std": [[[0.16150427529639702]], [[0.15669756003216265]], [[0.1562549387177155]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3288689270019531]], [[0.284017583510455]], [[0.250747802734375]]], "std": [[[0.16673914730219846]], [[0.18234921142317878]], [[0.19245648997069498]]], "count": [100]}, "observation.state": {"min": [-0.051307208836078644, -0.23705455660820007, 0.44705814123153687, 3.032400131225586, -0.23354317247867584, -0.6882088780403137, 0.019527416676282883, -0.03984139859676361], "max": [0.16024361550807953, 0.24662771821022034, 0.7343994975090027, 3.2683327198028564, 0.2429448515176773, 0.12060034275054932, 0.03982102498412132, -0.01903761550784111], "mean": [0.05597049370408058, 0.04525318741798401, 0.6060159206390381, 3.1312978267669678, -0.06816164404153824, -0.12912549078464508, 0.02843172289431095, -0.028709419071674347], "std": [0.05234754458069801, 0.16062194108963013, 0.08330577611923218, 0.047882601618766785, 0.12932506203651428, 0.21227890253067017, 0.00913534127175808, 0.009073236025869846], "count": [244]}, "action": {"min": [-0.6589285731315613, -0.8223214149475098, -0.8785714507102966, -0.0771428570151329, -0.10285714268684387, -0.08571428805589676, 0.0], "max": [0.637499988079071, 0.8517857193946838, 0.9375, 0.11785714328289032, 0.167142853140831, 0.11142857372760773, 1.0], "mean": [0.01882685348391533, 0.07513174414634705, -0.030902352184057236, 0.00785128679126501, 0.012435597367584705, 0.0030079041607677937, 0.46311476826667786], "std": [0.315784752368927, 0.46604740619659424, 0.49376988410949707, 0.0360364206135273, 0.04949289187788963, 0.04254047945141792, 0.49863749742507935], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [320], "max": [320], "mean": [320.0], "std": [0.0], "count": [244]}, "index": {"min": [85956], "max": [86199], "mean": [86077.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [244]}}} +{"episode_index": 321, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.564070276596967]], [[0.5269742988137638]], [[0.48993157659792436]]], "std": [[[0.2594256836305692]], [[0.23553421077976602]], [[0.21031582725057751]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5382744212431066]], [[0.5031664147470511]], [[0.45441273767807905]]], "std": [[[0.29885642683956487]], [[0.27259087276179667]], [[0.2525572264121365]]], "count": [100]}, "observation.state": {"min": [-0.21056517958641052, -0.057095400989055634, 0.9623647928237915, 1.5833876132965088, -0.033297348767519, -0.0913287103176117, -0.0005652789259329438, -0.040006399154663086], "max": [0.08467797935009003, 0.21882779896259308, 1.1842528581619263, 3.1815402507781982, 2.9053168296813965, 0.45667552947998047, 0.03996460139751434, -0.0006294299964793026], "mean": [-0.08495521545410156, 0.09150949865579605, 1.071325421333313, 2.5613110065460205, 1.3975372314453125, 0.1702120304107666, 0.030335044488310814, -0.03003889136016369], "std": [0.11707378178834915, 0.0996508076786995, 0.07778787612915039, 0.5707511901855469, 1.1003695726394653, 0.21122844517230988, 0.012838984839618206, 0.013126954436302185], "count": [240]}, "action": {"min": [-0.5249999761581421, -0.7821428775787354, -0.8785714507102966, -0.05785714462399483, -0.12107142806053162, -0.04285714402794838, 0.0], "max": [0.7178571224212646, 0.7285714149475098, 0.8571428656578064, 0.09321428835391998, 0.07392857223749161, 0.375, 1.0], "mean": [0.04628348723053932, 0.07208702713251114, -0.09804683178663254, 0.0037232148461043835, -0.009281249716877937, 0.08101336658000946, 0.6000000238418579], "std": [0.26573118567466736, 0.3378443419933319, 0.36360421776771545, 0.02394544892013073, 0.027390476316213608, 0.11610914021730423, 0.48989805579185486], "count": [240]}, "timestamp": {"min": [0.0], "max": [11.95], "mean": [5.975], "std": [3.4640715446807193], "count": [240]}, "frame_index": {"min": [0], "max": [239], "mean": [119.5], "std": [69.2814308936144], "count": [240]}, "episode_index": {"min": [321], "max": [321], "mean": [321.0], "std": [0.0], "count": [240]}, "index": {"min": [86200], "max": [86439], "mean": [86319.5], "std": [69.2814308936144], "count": [240]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [240]}}} +{"episode_index": 322, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34647446576286767]], [[0.28182261029411765]], [[0.23948901187672333]]], "std": [[[0.1727101029039531]], [[0.16881869531509064]], [[0.1671055895112619]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3245919710047105]], [[0.27927795350317863]], [[0.24943974693148743]]], "std": [[[0.1579659900277514]], [[0.17319783904744526]], [[0.18393146760635712]]], "count": [100]}, "observation.state": {"min": [-0.1359284520149231, -0.12232471257448196, 0.45044779777526855, 3.0160958766937256, -0.4109344780445099, -0.3434304893016815, 0.012758203782141209, -0.0398615263402462], "max": [0.19176720082759857, 0.15387919545173645, 0.6905096769332886, 3.324110507965088, 0.1343664675951004, 0.008948222734034061, 0.039921313524246216, -0.01262348797172308], "mean": [0.020728999748826027, 0.020609166473150253, 0.5686941742897034, 3.1609737873077393, -0.17093615233898163, -0.17792338132858276, 0.028242463245987892, -0.02651226334273815], "std": [0.10283759236335754, 0.08990595489740372, 0.06927091628313065, 0.08795671164989471, 0.16783224046230316, 0.0888812318444252, 0.010948714800179005, 0.011355873197317123], "count": [240]}, "action": {"min": [-0.7419642806053162, -0.44732141494750977, -0.5330356955528259, -0.07392857223749161, -0.15000000596046448, -0.10178571194410324, 0.0], "max": [0.8892857432365417, 0.5089285969734192, 0.5973214507102966, 0.1039285734295845, 0.09749999642372131, 0.061071429401636124, 1.0], "mean": [0.047645095735788345, 0.045747801661491394, -0.08809148520231247, 0.0011696419678628445, 0.00202232226729393, -0.007450892124325037, 0.4375], "std": [0.39967674016952515, 0.19961410760879517, 0.2684241831302643, 0.03787882626056671, 0.05353296548128128, 0.03407249599695206, 0.49607837200164795], "count": [240]}, "timestamp": {"min": [0.0], "max": [11.95], "mean": [5.975], "std": [3.4640715446807193], "count": [240]}, "frame_index": {"min": [0], "max": [239], "mean": [119.5], "std": [69.2814308936144], "count": [240]}, "episode_index": {"min": [322], "max": [322], "mean": [322.0], "std": [0.0], "count": [240]}, "index": {"min": [86440], "max": [86679], "mean": [86559.5], "std": [69.2814308936144], "count": [240]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [240]}}} +{"episode_index": 323, "stats": {"observation.images.wrist_image": {"min": [[[0.00392156862745098]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35397748520795036]], [[0.28902713611079195]], [[0.24480602847828584]]], "std": [[[0.1453492956758649]], [[0.149023551246646]], [[0.1559774339254285]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3100801445456112]], [[0.2603266284419041]], [[0.22630228857900583]]], "std": [[[0.14645282677454463]], [[0.15943460423148098]], [[0.1675138536476034]]], "count": [100]}, "observation.state": {"min": [-0.14974984526634216, -0.3018485903739929, 0.5075722336769104, 2.972114086151123, -0.056268539279699326, -0.09588512778282166, 0.0027390813920646906, -0.040002305060625076], "max": [0.03362254053354263, 0.3710698187351227, 0.681753933429718, 3.214190721511841, 0.34347906708717346, 0.18636304140090942, 0.03987386077642441, -0.0028666427824646235], "mean": [-0.036126840859651566, -0.018959976732730865, 0.5853493809700012, 3.0855493545532227, 0.23345746099948883, 0.014544162899255753, 0.021347222849726677, -0.02141246572136879], "std": [0.041723888367414474, 0.21898043155670166, 0.049235615879297256, 0.07680220156908035, 0.11072959005832672, 0.07932188361883163, 0.01709570363163948, 0.017034003511071205], "count": [266]}, "action": {"min": [-0.43392857909202576, -0.7017857432365417, -0.5839285850524902, -0.06857142597436905, -0.09642857313156128, -0.0835714265704155, 0.0], "max": [0.7366071343421936, 0.8464285731315613, 0.6803571581840515, 0.09749999642372131, 0.10285714268684387, 0.07821428775787354, 1.0], "mean": [0.01439984142780304, 0.1044139713048935, -0.04602915793657303, -0.003971535712480545, -0.0008337803301401436, -0.0007330825901590288, 0.49624061584472656], "std": [0.21530328691005707, 0.39147332310676575, 0.3133608400821686, 0.031771834939718246, 0.034969549626111984, 0.031052356585860252, 0.4999854266643524], "count": [266]}, "timestamp": {"min": [0.0], "max": [13.25], "mean": [6.625], "std": [3.8393521588934765], "count": [266]}, "frame_index": {"min": [0], "max": [265], "mean": [132.5], "std": [76.78704317786953], "count": [266]}, "episode_index": {"min": [323], "max": [323], "mean": [323.0], "std": [0.0], "count": [266]}, "index": {"min": [86680], "max": [86945], "mean": [86812.5], "std": [76.78704317786953], "count": [266]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [266]}}} +{"episode_index": 324, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5117811680214077]], [[0.4742110954733456]], [[0.42377826526118256]]], "std": [[[0.30932570822449834]], [[0.2791218073247502]], [[0.2476847371119255]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5145469192804075]], [[0.4828067902209712]], [[0.4362870692832797]]], "std": [[[0.31152619519970454]], [[0.28512212590901137]], [[0.26422430959062493]]], "count": [100]}, "observation.state": {"min": [-0.2872622013092041, -0.06814456731081009, 0.9718976020812988, 2.6818699836730957, -3.071955442428589, -1.0478880405426025, 0.0037221494130790234, -0.040164150297641754], "max": [0.03499678149819374, 0.2522333860397339, 1.1774113178253174, 3.5016274452209473, 0.8343510627746582, -0.08855046331882477, 0.040019337087869644, -0.0027091121301054955], "mean": [-0.08397649228572845, 0.08104933053255081, 1.0649192333221436, 3.0007030963897705, -1.7475478649139404, -0.6722461581230164, 0.031170764937996864, -0.029466843232512474], "std": [0.0858202874660492, 0.11088135093450546, 0.057679321616888046, 0.2908012568950653, 1.0502456426620483, 0.20675502717494965, 0.01305712852627039, 0.012847715057432652], "count": [307]}, "action": {"min": [-0.8758928775787354, -0.5196428298950195, -0.7607142925262451, -0.11571428924798965, -0.1307142823934555, -0.3085714280605316, 0.0], "max": [0.6937500238418579, 0.7955357432365417, 0.6857143044471741, 0.13928571343421936, 0.17464286088943481, 0.3557142913341522, 1.0], "mean": [0.0018671343568712473, 0.1321573555469513, -0.05047404021024704, 0.010417631827294827, -0.0029001766815781593, 0.009691722691059113, 0.723127007484436], "std": [0.3384475111961365, 0.29805824160575867, 0.2525893449783325, 0.05571598932147026, 0.06898753345012665, 0.1490570306777954, 0.44745367765426636], "count": [307]}, "timestamp": {"min": [0.0], "max": [15.3], "mean": [7.65], "std": [4.431139808220905], "count": [307]}, "frame_index": {"min": [0], "max": [306], "mean": [153.0], "std": [88.6227961644181], "count": [307]}, "episode_index": {"min": [324], "max": [324], "mean": [324.0], "std": [0.0], "count": [307]}, "index": {"min": [86946], "max": [87252], "mean": [87099.0], "std": [88.6227961644181], "count": [307]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [307]}}} +{"episode_index": 325, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.347235870959712]], [[0.2846132770613128]], [[0.2459020924287684]]], "std": [[[0.15361489277647425]], [[0.15625467536488163]], [[0.16368603532375328]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3228176119935279]], [[0.27610081511852785]], [[0.24551449405445772]]], "std": [[[0.15569245417335226]], [[0.17112783260103756]], [[0.1816051788573705]]], "count": [100]}, "observation.state": {"min": [-0.1986304521560669, -0.12692421674728394, 0.4476296305656433, 2.8458216190338135, -0.40036261081695557, -0.2184024453163147, 0.0024203688371926546, -0.0398925244808197], "max": [0.15229648351669312, 0.17367342114448547, 0.6903753876686096, 3.2287344932556152, 0.2233356386423111, 0.14254844188690186, 0.039895907044410706, -0.003012125613167882], "mean": [-0.027637355029582977, 0.006749428808689117, 0.5551217794418335, 3.0774526596069336, -0.048894479870796204, -0.04242260381579399, 0.022753870114684105, -0.023307528346776962], "std": [0.1074918732047081, 0.09908965975046158, 0.06944262981414795, 0.11208425462245941, 0.14479631185531616, 0.08938531577587128, 0.0156511589884758, 0.01550102885812521], "count": [265]}, "action": {"min": [-0.675000011920929, -0.6776785850524902, -0.637499988079071, -0.14678572118282318, -0.11464285850524902, -0.07178571075201035, 0.0], "max": [0.9375, 0.42053571343421936, 0.6830357313156128, 0.09535714238882065, 0.07071428745985031, 0.06857142597436905, 1.0], "mean": [0.014646225608885288, 0.030323445796966553, -0.09501348435878754, 0.0017628018977120519, -0.00438274908810854, -0.008490565232932568, 0.44528302550315857], "std": [0.42957133054733276, 0.1998009830713272, 0.3126606345176697, 0.04470892995595932, 0.031032560393214226, 0.027671361342072487, 0.4969971776008606], "count": [265]}, "timestamp": {"min": [0.0], "max": [13.2], "mean": [6.6], "std": [3.8249182997810554], "count": [265]}, "frame_index": {"min": [0], "max": [264], "mean": [132.0], "std": [76.49836599562111], "count": [265]}, "episode_index": {"min": [325], "max": [325], "mean": [325.0], "std": [0.0], "count": [265]}, "index": {"min": [87253], "max": [87517], "mean": [87385.0], "std": [76.49836599562111], "count": [265]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [265]}}} +{"episode_index": 326, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35056390321020986]], [[0.28688200109145223]], [[0.24967457909677543]]], "std": [[[0.14715160506218813]], [[0.15084317569386455]], [[0.16356674671438406]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3271701109643076]], [[0.2817097652659697]], [[0.24841081686580882]]], "std": [[[0.16784818182230996]], [[0.18300166500648454]], [[0.19311117844133285]]], "count": [100]}, "observation.state": {"min": [-0.0597604438662529, -0.21326173841953278, 0.4462546110153198, 3.0679445266723633, -0.28693172335624695, -0.09389057755470276, 0.01770208775997162, -0.03987095504999161], "max": [0.11585451662540436, 0.2912261486053467, 0.6914971470832825, 3.1904890537261963, 0.0022306509781628847, 0.31534239649772644, 0.040265824645757675, -0.019554030150175095], "mean": [0.023011865094304085, 0.061810337007045746, 0.5914710760116577, 3.127305746078491, -0.18579991161823273, 0.04819710552692413, 0.02875422313809395, -0.02946597710251808], "std": [0.04901016131043434, 0.17198079824447632, 0.0758068710565567, 0.03522840142250061, 0.07288838177919388, 0.12134407460689545, 0.00913980882614851, 0.008914203383028507], "count": [244]}, "action": {"min": [-0.4848214387893677, -0.7928571701049805, -0.9375, -0.08571428805589676, -0.15000000596046448, -0.05785714462399483, 0.0], "max": [0.5598214268684387, 0.8946428298950195, 0.9375, 0.04821428656578064, 0.12964285910129547, 0.05464285612106323, 1.0], "mean": [-0.0016027542296797037, 0.09492460638284683, -0.039267413318157196, -0.0003337234375067055, 0.00040837202686816454, -0.0028542152140289545, 0.49180328845977783], "std": [0.23135294020175934, 0.48877474665641785, 0.45183849334716797, 0.019275018945336342, 0.0566730722784996, 0.024838395416736603, 0.4999327063560486], "count": [244]}, "timestamp": {"min": [0.0], "max": [12.15], "mean": [6.075], "std": [3.521807064562169], "count": [244]}, "frame_index": {"min": [0], "max": [243], "mean": [121.5], "std": [70.43614129124337], "count": [244]}, "episode_index": {"min": [326], "max": [326], "mean": [326.0], "std": [0.0], "count": [244]}, "index": {"min": [87518], "max": [87761], "mean": [87639.5], "std": [70.43614129124337], "count": [244]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [244]}}} +{"episode_index": 327, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6006949032054228]], [[0.5527583157408471]], [[0.4995816494810815]]], "std": [[[0.2730241546780442]], [[0.26008725257079296]], [[0.23953014541953443]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5465154185575597]], [[0.506219617058249]], [[0.4555443982891008]]], "std": [[[0.2992405124399709]], [[0.27745889395872203]], [[0.26186362018754816]]], "count": [100]}, "observation.state": {"min": [-0.20462264120578766, -0.08539525419473648, 0.9194608926773071, 2.3880038261413574, -1.8650983572006226, -0.8302934169769287, 0.0024097440764307976, -0.04050452262163162], "max": [0.011270676739513874, 0.18073971569538116, 1.183842658996582, 3.1406285762786865, 0.00159350351896137, 0.2691880762577057, 0.04015979915857315, -0.002129217842593789], "mean": [-0.0352558009326458, 0.025256983935832977, 1.0241210460662842, 2.705761671066284, -1.487995982170105, -0.1545284390449524, 0.026574131101369858, -0.02656952105462551], "std": [0.04907313734292984, 0.08471682667732239, 0.0811300054192543, 0.241038978099823, 0.5236090421676636, 0.3471628725528717, 0.016969723626971245, 0.016416460275650024], "count": [235]}, "action": {"min": [-0.35357141494750977, -0.7901785969734192, -0.5491071343421936, -0.08892857283353806, -0.12321428209543228, -0.31928572058677673, 0.0], "max": [0.7098214030265808, 0.7580357193946838, 0.7928571701049805, 0.15321429073810577, 0.18964286148548126, 0.06428571790456772, 1.0], "mean": [0.03908434510231018, 0.08860944956541061, -0.11435795575380325, 0.017813075333833694, 0.008858665823936462, -0.04197721183300018, 0.6382978558540344], "std": [0.22877544164657593, 0.35761758685112, 0.3237234950065613, 0.044738661497831345, 0.06515560299158096, 0.09404084831476212, 0.48049354553222656], "count": [235]}, "timestamp": {"min": [0.0], "max": [11.7], "mean": [5.85], "std": [3.391902121229326], "count": [235]}, "frame_index": {"min": [0], "max": [234], "mean": [117.0], "std": [67.83804242458652], "count": [235]}, "episode_index": {"min": [327], "max": [327], "mean": [327.0], "std": [0.0], "count": [235]}, "index": {"min": [87762], "max": [87996], "mean": [87879.0], "std": [67.83804242458652], "count": [235]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [235]}}} +{"episode_index": 328, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34746277334175857]], [[0.27860415230545343]], [[0.23441461061963847]]], "std": [[[0.1477968414505897]], [[0.14562153377182777]], [[0.14891961302791318]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3276390775792739]], [[0.2828372575348499]], [[0.24989160634957108]]], "std": [[[0.16846245644564048]], [[0.1840020677077707]], [[0.19402740499501678]]], "count": [100]}, "observation.state": {"min": [-0.05624763295054436, -0.1938086450099945, 0.44643500447273254, 3.098672389984131, -0.29045045375823975, -0.44062328338623047, 0.019561562687158585, -0.039940040558576584], "max": [0.16990883648395538, 0.2800481617450714, 0.7392822504043579, 3.317362070083618, 0.15722209215164185, 0.16085480153560638, 0.039886701852083206, -0.019167406484484673], "mean": [0.05466483160853386, 0.05958157405257225, 0.611192524433136, 3.1606953144073486, -0.059792641550302505, -0.09321977198123932, 0.029322421178221703, -0.029423847794532776], "std": [0.06295429915189743, 0.16261090338230133, 0.08302830904722214, 0.05137928947806358, 0.12267649173736572, 0.17226268351078033, 0.009300070814788342, 0.009239519014954567], "count": [271]}, "action": {"min": [-0.6214285492897034, -0.731249988079071, -0.9375, -0.06642857193946838, -0.1875, -0.08892857283353806, 0.0], "max": [0.7901785969734192, 0.918749988079071, 0.9375, 0.0867857113480568, 0.18642857670783997, 0.10928571224212646, 1.0], "mean": [0.003607658203691244, 0.08950971812009811, -0.03560227155685425, 0.0035463892854750156, -5.534967567655258e-05, -0.0001976803905563429, 0.49815496802330017], "std": [0.31590551137924194, 0.4213528037071228, 0.486831933259964, 0.02373920939862728, 0.07267950475215912, 0.04017189145088196, 0.4999963939189911], "count": [271]}, "timestamp": {"min": [0.0], "max": [13.5], "mean": [6.75], "std": [3.911521443121589], "count": [271]}, "frame_index": {"min": [0], "max": [270], "mean": [135.0], "std": [78.23042886243178], "count": [271]}, "episode_index": {"min": [328], "max": [328], "mean": [328.0], "std": [0.0], "count": [271]}, "index": {"min": [87997], "max": [88267], "mean": [88132.0], "std": [78.23042886243178], "count": [271]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [271]}}} +{"episode_index": 329, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3451825232412301]], [[0.27485707361557904]], [[0.2294840016084559]]], "std": [[[0.1382831374292677]], [[0.13671204252657101]], [[0.13794245820791662]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32957542030484066]], [[0.28542842131969975]], [[0.25263283404181985]]], "std": [[[0.1675323199115925]], [[0.18292892604153133]], [[0.19323427708685229]]], "count": [100]}, "observation.state": {"min": [-0.04907801374793053, -0.19636249542236328, 0.4479144215583801, 3.0361132621765137, -0.43973180651664734, -0.31316354870796204, 0.01901574432849884, -0.04037545993924141], "max": [0.15237002074718475, 0.267593115568161, 0.6796005368232727, 3.179163932800293, 0.4626665711402893, 0.11048054695129395, 0.039858393371105194, -0.016373882070183754], "mean": [0.07127709686756134, 0.05153849720954895, 0.592868983745575, 3.091646671295166, -0.09303657710552216, -0.026011187583208084, 0.029187913984060287, -0.029865620657801628], "std": [0.055091165006160736, 0.15665391087532043, 0.07393690943717957, 0.03664953261613846, 0.21897508203983307, 0.08682283014059067, 0.009005732834339142, 0.008795392699539661], "count": [252]}, "action": {"min": [-0.6883928775787354, -0.9267857074737549, -0.7607142925262451, -0.0867857113480568, -0.17678570747375488, -0.14678572118282318, 0.0], "max": [0.7205356955528259, 0.8785714507102966, 0.9375, 0.05999999865889549, 0.1639285683631897, 0.1971428543329239, 1.0], "mean": [0.016283996403217316, 0.07976190000772476, -0.03423681482672691, 1.2754967428918462e-05, -0.0020790824200958014, -0.001556120696477592, 0.4920634925365448], "std": [0.29695960879325867, 0.4514015316963196, 0.4510451555252075, 0.027594828978180885, 0.05419117212295532, 0.06990023702383041, 0.49993696808815], "count": [252]}, "timestamp": {"min": [0.0], "max": [12.55], "mean": [6.2749999999999995], "std": [3.6372780573756893], "count": [252]}, "frame_index": {"min": [0], "max": [251], "mean": [125.5], "std": [72.74556114751378], "count": [252]}, "episode_index": {"min": [329], "max": [329], "mean": [329.0], "std": [0.0], "count": [252]}, "index": {"min": [88268], "max": [88519], "mean": [88393.5], "std": [72.74556114751378], "count": [252]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [252]}}} +{"episode_index": 330, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35424416755227484]], [[0.2879385962392769]], [[0.2454680881874234]]], "std": [[[0.15457204149967427]], [[0.1529562386957801]], [[0.15473166978253855]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3288141641055836]], [[0.283880235858992]], [[0.2507354161879596]]], "std": [[[0.1688663041200533]], [[0.18426524094832716]], [[0.19434324412451184]]], "count": [100]}, "observation.state": {"min": [-0.05682828649878502, -0.23243454098701477, 0.446407675743103, 2.9762094020843506, -0.3250654637813568, -0.27062952518463135, 0.01847856119275093, -0.03990723192691803], "max": [0.14454853534698486, 0.28858497738838196, 0.698688268661499, 3.1902499198913574, 0.26434236764907837, 0.3248889744281769, 0.039860572665929794, -0.019498253241181374], "mean": [0.04567953571677208, 0.04225539788603783, 0.5948057174682617, 3.115241527557373, -0.06470435112714767, -0.010730162262916565, 0.028975799679756165, -0.029993226751685143], "std": [0.05547596514225006, 0.17352910339832306, 0.07713691890239716, 0.04974906146526337, 0.1455291211605072, 0.1475982666015625, 0.00923933181911707, 0.008936193771660328], "count": [255]}, "action": {"min": [-0.4446428716182709, -0.8223214149475098, -0.8571428656578064, -0.11678571254014969, -0.0867857113480568, -0.17464286088943481, 0.0], "max": [0.6642857193946838, 0.9080356955528259, 0.9375, 0.062142856419086456, 0.18642857670783997, 0.16607142984867096, 1.0], "mean": [0.003739495761692524, 0.0903676301240921, -0.06131300702691078, -0.005584034137427807, -0.007668066769838333, 0.0012100826716050506, 0.5176470875740051], "std": [0.2638307511806488, 0.47369131445884705, 0.4627305269241333, 0.03133659437298775, 0.04184110462665558, 0.06196735054254532, 0.499688982963562], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [330], "max": [330], "mean": [330.0], "std": [0.0], "count": [255]}, "index": {"min": [88520], "max": [88774], "mean": [88647.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [255]}}} +{"episode_index": 331, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3258113181918275]], [[0.2716766327502681]], [[0.2388339771943934]]], "std": [[[0.14646108761681817]], [[0.14517549203642185]], [[0.15290410479242578]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3206422137092142]], [[0.2766379556094899]], [[0.24457094798368564]]], "std": [[[0.1622903894310695]], [[0.17813336033083407]], [[0.18721011520534622]]], "count": [100]}, "observation.state": {"min": [-0.16689574718475342, -0.10375423729419708, 0.4500666558742523, 3.051976442337036, -0.31455370783805847, -0.5712183713912964, 0.02264484018087387, -0.03982960060238838], "max": [0.10294073820114136, 0.2548759877681732, 0.6949286460876465, 3.2951886653900146, 0.4414474666118622, 0.49799519777297974, 0.03989928588271141, -0.005757629405707121], "mean": [-0.010564879514276981, 0.08424825221300125, 0.59535151720047, 3.182202100753784, 0.045519132167100906, -0.1426735371351242, 0.032784413546323776, -0.030919967219233513], "std": [0.08190198987722397, 0.1259792000055313, 0.07229099422693253, 0.05564787611365318, 0.2245289832353592, 0.3376629054546356, 0.006201035343110561, 0.0093919038772583], "count": [267]}, "action": {"min": [-0.6187499761581421, -0.7419642806053162, -0.8758928775787354, -0.06642857193946838, -0.19285714626312256, -0.10928571224212646, 0.0], "max": [0.8919642567634583, 0.8464285731315613, 0.9375, 0.06535714119672775, 0.16178570687770844, 0.1810714304447174, 1.0], "mean": [0.04401082918047905, 0.08468099683523178, -0.01893056184053421, 0.002351525239646435, 0.00532905338332057, 0.003703851718455553, 0.449438214302063], "std": [0.3809564411640167, 0.37507617473602295, 0.4236783981323242, 0.021158795803785324, 0.06411556154489517, 0.053948741406202316, 0.49743732810020447], "count": [267]}, "timestamp": {"min": [0.0], "max": [13.3], "mean": [6.65], "std": [3.8537860172389786], "count": [267]}, "frame_index": {"min": [0], "max": [266], "mean": [133.0], "std": [77.07572034477957], "count": [267]}, "episode_index": {"min": [331], "max": [331], "mean": [331.0], "std": [0.0], "count": [267]}, "index": {"min": [88775], "max": [89041], "mean": [88908.0], "std": [77.07572034477957], "count": [267]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [267]}}} +{"episode_index": 332, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.38691191849054074]], [[0.3150543829226026]], [[0.25979897413066794]]], "std": [[[0.17667300030021246]], [[0.1695354604505213]], [[0.1463117648645558]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33463338335822607]], [[0.2896139687930836]], [[0.2563847363041896]]], "std": [[[0.1770155134804035]], [[0.19342678567810354]], [[0.20389361710072385]]], "count": [100]}, "observation.state": {"min": [-0.06061415374279022, -0.22599810361862183, 0.4472392499446869, 3.0252935886383057, -0.0911618247628212, -0.10462425649166107, 0.01937805861234665, -0.039895571768283844], "max": [0.15820010006427765, 0.284422904253006, 0.7156401872634888, 3.1656808853149414, 0.22579286992549896, 0.5830539464950562, 0.0398489311337471, -0.019401200115680695], "mean": [0.06374882906675339, 0.050586920231580734, 0.6045185923576355, 3.1000967025756836, 0.05405315384268761, 0.16585613787174225, 0.02873041294515133, -0.029235882684588432], "std": [0.053225886076688766, 0.17079578340053558, 0.08125374466180801, 0.04015221819281578, 0.10432118922472, 0.20511466264724731, 0.009281383827328682, 0.00888715498149395], "count": [246]}, "action": {"min": [-0.4392857253551483, -0.8303571343421936, -0.8999999761581421, -0.06535714119672775, -0.12214285880327225, -0.07071428745985031, 0.0], "max": [0.6080357432365417, 0.8464285731315613, 0.9375, 0.062142856419086456, 0.14892856776714325, 0.11249999701976776, 1.0], "mean": [0.011901134625077248, 0.09198605269193649, -0.0409189909696579, -0.0026829284615814686, -0.0019817084539681673, 0.0035191636998206377, 0.4878048896789551], "std": [0.24798275530338287, 0.4837076961994171, 0.4678768217563629, 0.019635500386357307, 0.05708828940987587, 0.026475906372070312, 0.49985116720199585], "count": [246]}, "timestamp": {"min": [0.0], "max": [12.25], "mean": [6.125], "std": [3.5506748184910806], "count": [246]}, "frame_index": {"min": [0], "max": [245], "mean": [122.5], "std": [71.01349636982161], "count": [246]}, "episode_index": {"min": [332], "max": [332], "mean": [332.0], "std": [0.0], "count": [246]}, "index": {"min": [89042], "max": [89287], "mean": [89164.5], "std": [71.01349636982161], "count": [246]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [246]}}} +{"episode_index": 333, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3364771022422641]], [[0.27102092727960325]], [[0.23066535919787837]]], "std": [[[0.14243013959343884]], [[0.14188008890475626]], [[0.14883438008143907]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3282015291101792]], [[0.28403253173828125]], [[0.2511578297334559]]], "std": [[[0.16785237831930355]], [[0.1831698016107839]], [[0.19298938979585828]]], "count": [100]}, "observation.state": {"min": [-0.060620248317718506, -0.19108562171459198, 0.4461890161037445, 3.005856513977051, -0.22479760646820068, -0.40058502554893494, 0.01932964101433754, -0.03981054946780205], "max": [0.14071901142597198, 0.2622700035572052, 0.6849538683891296, 3.297987222671509, 0.03814569488167763, 0.02338731475174427, 0.03985374793410301, -0.019438933581113815], "mean": [0.06150992214679718, 0.044788673520088196, 0.5934512615203857, 3.1233623027801514, -0.0689222514629364, -0.13363058865070343, 0.02881460264325142, -0.029370974749326706], "std": [0.054061874747276306, 0.16201061010360718, 0.07819338142871857, 0.06431741267442703, 0.08301330357789993, 0.09538425505161285, 0.00900385994464159, 0.009085544385015965], "count": [238]}, "action": {"min": [-0.5089285969734192, -0.8812500238418579, -0.8946428298950195, -0.07821428775787354, -0.09214285761117935, -0.07178571075201035, 0.0], "max": [0.6428571343421936, 0.8678571581840515, 0.9375, 0.10499999672174454, 0.1403571367263794, 0.06964285671710968, 1.0], "mean": [0.018614977598190308, 0.08873046934604645, -0.027415985241532326, -0.0014045622665435076, 0.010363146662712097, -0.00186824647244066, 0.4957983195781708], "std": [0.27366870641708374, 0.48164498805999756, 0.48825132846832275, 0.03390977531671524, 0.04250163957476616, 0.02548868954181671, 0.49998193979263306], "count": [238]}, "timestamp": {"min": [0.0], "max": [11.85], "mean": [5.925], "std": [3.435203778526101], "count": [238]}, "frame_index": {"min": [0], "max": [237], "mean": [118.5], "std": [68.70407557052202], "count": [238]}, "episode_index": {"min": [333], "max": [333], "mean": [333.0], "std": [0.0], "count": [238]}, "index": {"min": [89288], "max": [89525], "mean": [89406.5], "std": [68.70407557052202], "count": [238]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [238]}}} +{"episode_index": 334, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3172112582337623]], [[0.25869821466184134]], [[0.2208792377546722]]], "std": [[[0.16662949720217948]], [[0.15936036012828936]], [[0.15942414433706367]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3207362533270144]], [[0.2734223872166054]], [[0.23876587931315105]]], "std": [[[0.15724559976998664]], [[0.17215284672996659]], [[0.18216737558980323]]], "count": [100]}, "observation.state": {"min": [-0.10365738719701767, -0.15464375913143158, 0.486457884311676, 2.943645715713501, -1.0745340585708618, -0.41765686869621277, 0.02755173109471798, -0.040493693202733994], "max": [-0.012884066440165043, 0.2518670856952667, 0.7176821827888489, 3.299798011779785, 0.008457805030047894, 0.6151306629180908, 0.04000047966837883, -0.030454378575086594], "mean": [-0.05292245000600815, 0.07841925323009491, 0.6123126745223999, 3.1056480407714844, -0.5591782927513123, -0.056840598583221436, 0.034731220453977585, -0.03609161078929901], "std": [0.026925617828965187, 0.1400764286518097, 0.0668245404958725, 0.09843561798334122, 0.37559354305267334, 0.25803446769714355, 0.004775669425725937, 0.003643130650743842], "count": [265]}, "action": {"min": [-0.6000000238418579, -0.7633928656578064, -0.5839285850524902, -0.10821428894996643, -0.2207142859697342, -0.1842857152223587, 0.0], "max": [0.5785714387893677, 0.7928571701049805, 0.9375, 0.08892857283353806, 0.20571428537368774, 0.13607142865657806, 1.0], "mean": [0.03454850986599922, 0.08246970176696777, -0.0006266822456382215, -0.000764150230679661, 0.01415902841836214, -0.016265494748950005, 0.5358490347862244], "std": [0.24865905940532684, 0.38682419061660767, 0.44339215755462646, 0.036071743816137314, 0.08238621056079865, 0.047086022794246674, 0.4987133741378784], "count": [265]}, "timestamp": {"min": [0.0], "max": [13.2], "mean": [6.6], "std": [3.8249182997810554], "count": [265]}, "frame_index": {"min": [0], "max": [264], "mean": [132.0], "std": [76.49836599562111], "count": [265]}, "episode_index": {"min": [334], "max": [334], "mean": [334.0], "std": [0.0], "count": [265]}, "index": {"min": [89526], "max": [89790], "mean": [89658.0], "std": [76.49836599562111], "count": [265]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [265]}}} +{"episode_index": 335, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32223986517214304]], [[0.2508255130543428]], [[0.2063566655177696]]], "std": [[[0.13996799587630013]], [[0.12815758056684193]], [[0.12869217740936978]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32712043373257504]], [[0.28342107795266547]], [[0.2508779207117417]]], "std": [[[0.16766094898897874]], [[0.18219241132438907]], [[0.19168250255129543]]], "count": [100]}, "observation.state": {"min": [-0.04583970829844475, -0.18167157471179962, 0.4479433596134186, 3.0450875759124756, -0.5603438019752502, -0.5568608641624451, 0.0011771211866289377, -0.04016636312007904], "max": [0.15898087620735168, 0.23579886555671692, 0.7099311947822571, 3.2461483478546143, -0.0023927500005811453, -0.03598844259977341, 0.03989905118942261, -0.0012540229363366961], "mean": [0.05281127616763115, 0.027911977842450142, 0.5796309113502502, 3.11599063873291, -0.3547321557998657, -0.2295970618724823, 0.027920149266719818, -0.028778251260519028], "std": [0.04668648540973663, 0.1322803646326065, 0.08984646946191788, 0.04722641780972481, 0.18128114938735962, 0.14022870361804962, 0.010408657602965832, 0.010617886669933796], "count": [288]}, "action": {"min": [-0.4312500059604645, -0.9375, -0.7366071343421936, -0.0835714265704155, -0.08892857283353806, -0.11142857372760773, 0.0], "max": [0.7098214030265808, 0.8464285731315613, 0.9375, 0.06857142597436905, 0.1403571367263794, 0.10285714268684387, 1.0], "mean": [-0.008621638640761375, 0.0611514188349247, -0.06415548920631409, -0.0023697903379797935, 0.0020014899782836437, -0.0003311056352686137, 0.5173611044883728], "std": [0.28787922859191895, 0.39166539907455444, 0.44936180114746094, 0.029003862291574478, 0.037868332117795944, 0.03997025266289711, 0.4996984004974365], "count": [288]}, "timestamp": {"min": [0.0], "max": [14.35], "mean": [7.174999999999999], "std": [4.156896879484343], "count": [288]}, "frame_index": {"min": [0], "max": [287], "mean": [143.5], "std": [83.13793758968686], "count": [288]}, "episode_index": {"min": [335], "max": [335], "mean": [335.0], "std": [0.0], "count": [288]}, "index": {"min": [89791], "max": [90078], "mean": [89934.5], "std": [83.13793758968686], "count": [288]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [288]}}} +{"episode_index": 336, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31106194170783547]], [[0.25047915529737286]], [[0.21319820269416362]]], "std": [[[0.14360389214248906]], [[0.13587911427546548]], [[0.14133981757601363]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3183994571461397]], [[0.27165788478477326]], [[0.23729306030273437]]], "std": [[[0.16057456373969445]], [[0.174434869262589]], [[0.18378799623063666]]], "count": [100]}, "observation.state": {"min": [-0.10023079812526703, -0.16615907847881317, 0.4807012379169464, 2.9271984100341797, -0.6334773302078247, -0.5559077858924866, 0.02615213580429554, -0.04063929617404938], "max": [0.04498011991381645, 0.2501271963119507, 0.6860533356666565, 3.209667444229126, 0.18614576756954193, 0.1508139669895172, 0.03982596844434738, -0.029477057978510857], "mean": [-0.03443070501089096, 0.04662460833787918, 0.6027058362960815, 3.0962400436401367, -0.07197447121143341, -0.17854972183704376, 0.03395573049783707, -0.03620542213320732], "std": [0.042819686233997345, 0.13707417249679565, 0.062156353145837784, 0.047320060431957245, 0.23609179258346558, 0.14336419105529785, 0.005652362946420908, 0.0041922274976968765], "count": [276]}, "action": {"min": [-0.5946428775787354, -0.8517857193946838, -0.6267856955528259, -0.07392857223749161, -0.1939285695552826, -0.10178571194410324, 0.0], "max": [0.6000000238418579, 0.8276785612106323, 0.9375, 0.07500000298023224, 0.20678570866584778, 0.05999999865889549, 1.0], "mean": [0.007414603605866432, 0.06033578887581825, -0.021496521309018135, -0.004883540794253349, -0.00041148983291350305, -0.01268245279788971, 0.5905796885490417], "std": [0.2528492212295532, 0.42950406670570374, 0.39457741379737854, 0.025717513635754585, 0.06829830259084702, 0.028272371739149094, 0.4917270839214325], "count": [276]}, "timestamp": {"min": [0.0], "max": [13.75], "mean": [6.875], "std": [3.983690709212585], "count": [276]}, "frame_index": {"min": [0], "max": [275], "mean": [137.5], "std": [79.6738141842517], "count": [276]}, "episode_index": {"min": [336], "max": [336], "mean": [336.0], "std": [0.0], "count": [276]}, "index": {"min": [90079], "max": [90354], "mean": [90216.5], "std": [79.6738141842517], "count": [276]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [276]}}} +{"episode_index": 337, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6003517414167815]], [[0.5551731938380821]], [[0.5037547834807752]]], "std": [[[0.26988018683188864]], [[0.25488074129795296]], [[0.23431629056371817]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5493884815889246]], [[0.5088092753092447]], [[0.4583555243997013]]], "std": [[[0.2973436037592744]], [[0.2762317325508237]], [[0.26112342960481427]]], "count": [100]}, "observation.state": {"min": [-0.19688406586647034, -0.0781029686331749, 0.917219340801239, 2.272331476211548, -2.200758695602417, -0.7595093250274658, 0.002491588471457362, -0.03992033004760742], "max": [0.06374756246805191, 0.2052990049123764, 1.1673766374588013, 3.141263723373413, -0.003587768878787756, 0.3951987326145172, 0.041441310197114944, -0.0022254260256886482], "mean": [-0.003913461230695248, 0.033642254769802094, 1.0370336771011353, 2.6061513423919678, -1.68345046043396, -0.04531446844339371, 0.025211233645677567, -0.025384243577718735], "std": [0.05728733167052269, 0.09057386219501495, 0.07577388733625412, 0.26808059215545654, 0.5731428861618042, 0.3124922215938568, 0.017265476286411285, 0.017491165548563004], "count": [227]}, "action": {"min": [-0.5866071581840515, -0.7928571701049805, -0.7232142686843872, -0.05249999836087227, -0.15857142210006714, -0.2571428716182709, 0.0], "max": [0.6991071701049805, 0.7875000238418579, 0.8973214030265808, 0.18857142329216003, 0.1339285671710968, 0.07500000298023224, 1.0], "mean": [0.06570173054933548, 0.12127909809350967, -0.1099984422326088, 0.02307111769914627, -0.004304594825953245, -0.05137195810675621, 0.6167401075363159], "std": [0.28560030460357666, 0.35702311992645264, 0.3951689898967743, 0.04673986881971359, 0.0634222999215126, 0.08041240274906158, 0.48618099093437195], "count": [227]}, "timestamp": {"min": [0.0], "max": [11.3], "mean": [5.6499999999999995], "std": [3.2764309850811753], "count": [227]}, "frame_index": {"min": [0], "max": [226], "mean": [113.0], "std": [65.5286197016235], "count": [227]}, "episode_index": {"min": [337], "max": [337], "mean": [337.0], "std": [0.0], "count": [227]}, "index": {"min": [90355], "max": [90581], "mean": [90468.0], "std": [65.5286197016235], "count": [227]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [227]}}} +{"episode_index": 338, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5947242138432521]], [[0.5464545264150582]], [[0.4942044797411152]]], "std": [[[0.28051437472431484]], [[0.268060793650105]], [[0.24831153955665644]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5488033124138327]], [[0.508727887321921]], [[0.4586466620950138]]], "std": [[[0.2999659415571991]], [[0.2792532199394208]], [[0.2648952183791763]]], "count": [100]}, "observation.state": {"min": [-0.19830608367919922, -0.07867623120546341, 0.9110177755355835, 2.285933017730713, -2.3040661811828613, -0.9089012742042542, 0.0019168272847309709, -0.03987739607691765], "max": [0.015276182442903519, 0.18946726620197296, 1.1769384145736694, 3.139878034591675, 0.003071221522986889, 0.27254846692085266, 0.040349021553993225, -0.0015536518767476082], "mean": [-0.0339713953435421, 0.02716168947517872, 1.020517110824585, 2.6654603481292725, -1.7838293313980103, -0.1892048865556717, 0.02704063430428505, -0.027031777426600456], "std": [0.04377364739775658, 0.0872599259018898, 0.08675587922334671, 0.24398130178451538, 0.6015377044677734, 0.3708289861679077, 0.016981784254312515, 0.01691889762878418], "count": [221]}, "action": {"min": [-0.2651785612106323, -0.8169642686843872, -0.5276785492897034, -0.0835714265704155, -0.13928571343421936, -0.3321428596973419, 0.0], "max": [0.7419642806053162, 0.7473214268684387, 0.8491071462631226, 0.21857142448425293, 0.09535714238882065, 0.06642857193946838, 1.0], "mean": [0.05885583907365799, 0.1147179827094078, -0.09748305380344391, 0.021292826160788536, -0.003514866577461362, -0.04863119497895241, 0.6696832776069641], "std": [0.1962137669324875, 0.37271445989608765, 0.3482375144958496, 0.05463383346796036, 0.052443474531173706, 0.10715782642364502, 0.4703264534473419], "count": [221]}, "timestamp": {"min": [0.0], "max": [11.0], "mean": [5.5], "std": [3.1898275815473163], "count": [221]}, "frame_index": {"min": [0], "max": [220], "mean": [110.0], "std": [63.796551630946325], "count": [221]}, "episode_index": {"min": [338], "max": [338], "mean": [338.0], "std": [0.0], "count": [221]}, "index": {"min": [90582], "max": [90802], "mean": [90692.0], "std": [63.796551630946325], "count": [221]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [221]}}} +{"episode_index": 339, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5269569839776731]], [[0.48880950927734373]], [[0.4400733367321538]]], "std": [[[0.29930679871613536]], [[0.2695192471516676]], [[0.23893099331853895]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5155241220511643]], [[0.4833232541551777]], [[0.4366775949515549]]], "std": [[[0.30906024685428135]], [[0.281968824542317]], [[0.2604245083432531]]], "count": [100]}, "observation.state": {"min": [-0.4469295144081116, -0.06630206108093262, 0.9338493347167969, 1.6108156442642212, -3.325606107711792, -1.1355290412902832, 0.00433674082159996, -0.040081363171339035], "max": [0.013116402551531792, 0.2863132357597351, 1.2906203269958496, 3.4341492652893066, 0.17490608990192413, 0.40984004735946655, 0.0400143526494503, -0.004946843720972538], "mean": [-0.13272689282894135, 0.11640222370624542, 1.087399959564209, 2.880420446395874, -1.4388799667358398, -0.4999159276485443, 0.03469551354646683, -0.03360246121883392], "std": [0.12042991071939468, 0.10429380089044571, 0.07209840416908264, 0.5131633877754211, 1.251405119895935, 0.41686591506004333, 0.010992064140737057, 0.011076541617512703], "count": [373]}, "action": {"min": [-0.8223214149475098, -0.7741071581840515, -0.9375, -0.15964286029338837, -0.14249999821186066, -0.2475000023841858, 0.0], "max": [0.8946428298950195, 0.8571428656578064, 0.9241071343421936, 0.19178570806980133, 0.207857146859169, 0.2946428656578064, 1.0], "mean": [-0.00024414609652012587, 0.1156022921204567, -0.05708301067352295, 0.008772505447268486, 0.0069915796630084515, -0.0017177214613184333, 0.8632707595825195], "std": [0.36053669452667236, 0.39784321188926697, 0.3725072741508484, 0.0684632956981659, 0.07495056837797165, 0.1281798630952835, 0.3435620069503784], "count": [373]}, "timestamp": {"min": [0.0], "max": [18.6], "mean": [9.299999999999999], "std": [5.3837719119591245], "count": [373]}, "frame_index": {"min": [0], "max": [372], "mean": [186.0], "std": [107.67543823918248], "count": [373]}, "episode_index": {"min": [339], "max": [339], "mean": [339.0], "std": [0.0], "count": [373]}, "index": {"min": [90803], "max": [91175], "mean": [90989.0], "std": [107.67543823918248], "count": [373]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [373]}}} +{"episode_index": 340, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32644687009325213]], [[0.26685614312863815]], [[0.2298841558718214]]], "std": [[[0.135845625977105]], [[0.13192004878024666]], [[0.13807198794736383]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3206559388403799]], [[0.27298345468558516]], [[0.23821322093290442]]], "std": [[[0.16137330951528286]], [[0.17613051310366806]], [[0.18608056700669123]]], "count": [100]}, "observation.state": {"min": [-0.12935394048690796, -0.16387717425823212, 0.48143282532691956, 2.801086902618408, -1.1001542806625366, -0.09067274630069733, 0.027943043038249016, -0.04007568955421448], "max": [0.0005557263502851129, 0.30170026421546936, 0.6954062581062317, 3.1429994106292725, 0.19384931027889252, 0.3786887526512146, 0.04011284187436104, -0.026619695127010345], "mean": [-0.06447021663188934, 0.08251989632844925, 0.5951201319694519, 3.064598798751831, -0.4483020007610321, 0.14610561728477478, 0.03499579429626465, -0.034189119935035706], "std": [0.04208822920918465, 0.14879435300827026, 0.06936701387166977, 0.06181672215461731, 0.4669436812400818, 0.1112944558262825, 0.004871483892202377, 0.005676226690411568], "count": [282]}, "action": {"min": [-0.5785714387893677, -0.7982142567634583, -0.8116071224212646, -0.09000000357627869, -0.1339285671710968, -0.1103571429848671, 0.0], "max": [0.7446428537368774, 0.8062499761581421, 0.9375, 0.08785714209079742, 0.1274999976158142, 0.0503571443259716, 1.0], "mean": [0.03626520186662674, 0.0904255360364914, -0.008330155164003372, 0.00022796362463850528, 0.007686168421059847, -0.024133749306201935, 0.585106372833252], "std": [0.25981712341308594, 0.4221135675907135, 0.42509669065475464, 0.030300341546535492, 0.045411255210638046, 0.035415567457675934, 0.4927041828632355], "count": [282]}, "timestamp": {"min": [0.0], "max": [14.05], "mean": [7.025], "std": [4.070293805939157], "count": [282]}, "frame_index": {"min": [0], "max": [281], "mean": [140.5], "std": [81.40587611878314], "count": [282]}, "episode_index": {"min": [340], "max": [340], "mean": [340.0], "std": [0.0], "count": [282]}, "index": {"min": [91176], "max": [91457], "mean": [91316.5], "std": [81.40587611878314], "count": [282]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [282]}}} +{"episode_index": 341, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5761760738597197]], [[0.5258029970655254]], [[0.47841953591739433]]], "std": [[[0.28618758292694746]], [[0.2599923842973569]], [[0.2300378038037046]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5678386475806142]], [[0.5295771580116422]], [[0.4799251583323759]]], "std": [[[0.29416787907990144]], [[0.27076504527274425]], [[0.2527874079094659]]], "count": [100]}, "observation.state": {"min": [-0.19924940168857574, -0.2987360656261444, 1.0045528411865234, 2.4308156967163086, -2.8087193965911865, -0.8856599926948547, 0.0013191807083785534, -0.04009481146931648], "max": [0.1119605153799057, 0.2106102555990219, 1.178918480873108, 3.207313060760498, 0.0015750392340123653, -0.0862346813082695, 0.04001184552907944, -0.010222197510302067], "mean": [-0.016912177205085754, -0.051265183836221695, 1.093553900718689, 2.714245319366455, -1.8893018960952759, -0.5559958219528198, 0.02703559398651123, -0.028784018009901047], "std": [0.0691327303647995, 0.14866141974925995, 0.05795682221651077, 0.2013857364654541, 0.6573920845985413, 0.19988256692886353, 0.013812130317091942, 0.012234663590788841], "count": [389]}, "action": {"min": [-0.4151785671710968, -0.8598214387893677, -0.5223214030265808, -0.0803571417927742, -0.11678571254014969, -0.2742857038974762, 0.0], "max": [0.5062500238418579, 0.8062499761581421, 0.6616071462631226, 0.0771428570151329, 0.16928571462631226, 0.32357141375541687, 1.0], "mean": [0.03200513496994972, -0.02830062061548233, -0.04895104840397835, 0.006114582065492868, 0.011953726410865784, -0.004572151694446802, 0.5578406453132629], "std": [0.2392677217721939, 0.3834209442138672, 0.26704317331314087, 0.026544993743300438, 0.056357789784669876, 0.1338273286819458, 0.4966433048248291], "count": [389]}, "timestamp": {"min": [0.0], "max": [19.4], "mean": [9.700000000000001], "std": [5.614712815451918], "count": [389]}, "frame_index": {"min": [0], "max": [388], "mean": [194.0], "std": [112.29425630903836], "count": [389]}, "episode_index": {"min": [341], "max": [341], "mean": [341.0], "std": [0.0], "count": [389]}, "index": {"min": [91458], "max": [91846], "mean": [91652.0], "std": [112.29425630903836], "count": [389]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [389]}}} +{"episode_index": 342, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.4893875774308747]], [[0.45517911065793504]], [[0.40579059436274506]]], "std": [[[0.3072673217049414]], [[0.2793420055196097]], [[0.2515165786006036]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5132952827004825]], [[0.4825528929467295]], [[0.437157294179879]]], "std": [[[0.31339289752971466]], [[0.28784656909363443]], [[0.26814680131557306]]], "count": [100]}, "observation.state": {"min": [-0.38246750831604004, -0.08474799245595932, 0.9570518732070923, 2.4733760356903076, -2.4656119346618652, -1.4425382614135742, 0.0014067711308598518, -0.04027601704001427], "max": [0.042908985167741776, 0.25839656591415405, 1.1737430095672607, 3.5357236862182617, 2.4875905513763428, 0.7559573650360107, 0.04058748483657837, -0.0010213605128228664], "mean": [-0.07369452714920044, 0.07403986155986786, 1.0415955781936646, 3.092987298965454, -1.200621485710144, -0.6688960194587708, 0.030555028468370438, -0.031359851360321045], "std": [0.10976730287075043, 0.12141479551792145, 0.06313556432723999, 0.23877592384815216, 1.3689260482788086, 0.6792465448379517, 0.013962293975055218, 0.012730631977319717], "count": [415]}, "action": {"min": [-0.9375, -0.5142857432365417, -0.731249988079071, -0.1607142835855484, -0.30321428179740906, -0.3675000071525574, 0.0], "max": [0.7366071343421936, 0.7419642806053162, 0.5008928775787354, 0.23892857134342194, 0.19821429252624512, 0.2978571355342865, 1.0], "mean": [-0.020847685635089874, 0.1266738474369049, -0.06169751286506653, -0.001835628761909902, -0.012030980549752712, 0.029656603932380676, 0.7156626582145691], "std": [0.3689286708831787, 0.27451181411743164, 0.23736780881881714, 0.0677320808172226, 0.09498737007379532, 0.13577169179916382, 0.45109859108924866], "count": [415]}, "timestamp": {"min": [0.0], "max": [20.7], "mean": [10.35], "std": [5.989991652748775], "count": [415]}, "frame_index": {"min": [0], "max": [414], "mean": [207.0], "std": [119.7998330549755], "count": [415]}, "episode_index": {"min": [342], "max": [342], "mean": [342.0], "std": [0.0], "count": [415]}, "index": {"min": [91847], "max": [92261], "mean": [92054.0], "std": [119.7998330549755], "count": [415]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [415]}}} +{"episode_index": 343, "stats": {"observation.images.wrist_image": {"min": [[[0.011764705882352941]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3523053529028799]], [[0.2867494602577359]], [[0.2415821916168811]]], "std": [[[0.1381203398304528]], [[0.14098473714297288]], [[0.1475763149662701]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3106895488664216]], [[0.2613844293332568]], [[0.2276364859786688]]], "std": [[[0.14597113252184243]], [[0.15903868199432983]], [[0.1671894208546191]]], "count": [100]}, "observation.state": {"min": [-0.10365492850542068, -0.28757405281066895, 0.5096290707588196, 2.985395908355713, -0.3201184570789337, -0.12613575160503387, 0.002730338368564844, -0.039889972656965256], "max": [0.04264343902468681, 0.3595941662788391, 0.6845410466194153, 3.2250351905822754, 0.4032600224018097, 0.2440667301416397, 0.03994617611169815, -0.001363746472634375], "mean": [-0.017549006268382072, -0.0044487169943749905, 0.5815373659133911, 3.1100728511810303, 0.14575234055519104, -0.015934299677610397, 0.02187933959066868, -0.021963361650705338], "std": [0.035562917590141296, 0.21374471485614777, 0.051501404494047165, 0.07194389402866364, 0.19008105993270874, 0.08948153257369995, 0.01670624315738678, 0.0165274515748024], "count": [242]}, "action": {"min": [-0.46071428060531616, -0.8839285969734192, -0.6000000238418579, -0.05892857164144516, -0.14785714447498322, -0.09107142686843872, 0.0], "max": [0.6455357074737549, 0.8116071224212646, 0.7633928656578064, 0.11785714328289032, 0.09107142686843872, 0.08464285731315613, 1.0], "mean": [0.02574528008699417, 0.11016453057527542, -0.06336701661348343, -0.0029087956063449383, -0.0012883711606264114, -0.00726977689191699, 0.5], "std": [0.19889944791793823, 0.40620750188827515, 0.3356306254863739, 0.029455838724970818, 0.03337976336479187, 0.037534598261117935, 0.5], "count": [242]}, "timestamp": {"min": [0.0], "max": [12.05], "mean": [6.0249999999999995], "std": [3.4929393066585055], "count": [242]}, "frame_index": {"min": [0], "max": [241], "mean": [120.5], "std": [69.85878613317011], "count": [242]}, "episode_index": {"min": [343], "max": [343], "mean": [343.0], "std": [0.0], "count": [242]}, "index": {"min": [92262], "max": [92503], "mean": [92382.5], "std": [69.85878613317011], "count": [242]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [242]}}} +{"episode_index": 344, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33985819139667583]], [[0.27579340138154873]], [[0.2362970012589997]]], "std": [[[0.15295987349467405]], [[0.14999911798938798]], [[0.1543460969434196]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32873776304955576]], [[0.28446165256874234]], [[0.25159865734623926]]], "std": [[[0.16749358814623105]], [[0.18268555049465623]], [[0.19239911446960015]]], "count": [100]}, "observation.state": {"min": [-0.05075860768556595, -0.23620088398456573, 0.4477088451385498, 3.0686798095703125, -0.3938417434692383, -0.3663000464439392, 0.01492160651832819, -0.03986572101712227], "max": [0.16248707473278046, 0.2430173009634018, 0.7041391134262085, 3.2287771701812744, 0.10654862225055695, 0.13967178761959076, 0.040198083966970444, -0.01927688904106617], "mean": [0.05302099511027336, 0.02530885860323906, 0.6013327240943909, 3.1559972763061523, -0.0867256224155426, -0.12281084805727005, 0.028698457404971123, -0.03029514104127884], "std": [0.060152288526296616, 0.1595645695924759, 0.07839806377887726, 0.033379100263118744, 0.11146251857280731, 0.1140640527009964, 0.009865224361419678, 0.008663282729685307], "count": [254]}, "action": {"min": [-0.6857143044471741, -0.75, -0.9267857074737549, -0.07285714149475098, -0.09964285790920258, -0.10928571224212646, 0.0], "max": [0.7392857074737549, 0.8919642567634583, 0.9375, 0.06642857193946838, 0.11464285850524902, 0.18000000715255737, 1.0], "mean": [-0.006664783228188753, 0.08552446961402893, -0.05330776423215866, 0.00117688428144902, 0.006411698646843433, 0.0002952767536044121, 0.5118110179901123], "std": [0.4074990153312683, 0.44410520792007446, 0.5271614193916321, 0.021692542359232903, 0.04659155383706093, 0.060403984040021896, 0.4998604953289032], "count": [254]}, "timestamp": {"min": [0.0], "max": [12.65], "mean": [6.325], "std": [3.6661457963370743], "count": [254]}, "frame_index": {"min": [0], "max": [253], "mean": [126.5], "std": [73.32291592674149], "count": [254]}, "episode_index": {"min": [344], "max": [344], "mean": [344.0], "std": [0.0], "count": [254]}, "index": {"min": [92504], "max": [92757], "mean": [92630.5], "std": [73.32291592674149], "count": [254]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [254]}}} +{"episode_index": 345, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5856138132132737]], [[0.5527467507755055]], [[0.5184500786276425]]], "std": [[[0.25842487051306606]], [[0.23913851585969031]], [[0.21995761819754953]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5412229733934589]], [[0.5064905497233073]], [[0.45832502776501227]]], "std": [[[0.29950173840695415]], [[0.2740647871651758]], [[0.2549227325887515]]], "count": [100]}, "observation.state": {"min": [-0.20831957459449768, -0.09695099294185638, 0.9406331181526184, 2.140578031539917, -0.004414200782775879, -0.1298392117023468, 0.01061567384749651, -0.03993409499526024], "max": [0.07450174540281296, 0.20610810816287994, 1.164748191833496, 3.1485462188720703, 2.8923683166503906, 0.6705378293991089, 0.04009666293859482, -0.012360738590359688], "mean": [-0.07122974842786789, 0.07705426961183548, 1.043260097503662, 2.7411231994628906, 1.4876989126205444, 0.17546258866786957, 0.029049145057797432, -0.028665924444794655], "std": [0.09796817600727081, 0.1081077829003334, 0.0708954930305481, 0.34967610239982605, 1.0823875665664673, 0.2665778696537018, 0.011109193786978722, 0.011381654068827629], "count": [295]}, "action": {"min": [-0.7741071581840515, -0.65625, -0.6937500238418579, -0.039642855525016785, -0.21642857789993286, -0.046071428805589676, 0.0], "max": [0.5357142686843872, 0.7392857074737549, 0.7151785492897034, 0.1339285671710968, 0.1403571367263794, 0.3310714364051819, 1.0], "mean": [0.012702764943242073, 0.034303851425647736, -0.06576572358608246, 0.012388620525598526, -0.011426148004829884, 0.0471101775765419, 0.5220338702201843], "std": [0.27590280771255493, 0.30957767367362976, 0.2913685142993927, 0.03527703136205673, 0.06831527501344681, 0.0892549604177475, 0.49951425194740295], "count": [295]}, "timestamp": {"min": [0.0], "max": [14.7], "mean": [7.35], "std": [4.257933771208753], "count": [295]}, "frame_index": {"min": [0], "max": [294], "mean": [147.0], "std": [85.15867542417507], "count": [295]}, "episode_index": {"min": [345], "max": [345], "mean": [345.0], "std": [0.0], "count": [295]}, "index": {"min": [92758], "max": [93052], "mean": [92905.0], "std": [85.15867542417507], "count": [295]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [295]}}} +{"episode_index": 346, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33276554242302386]], [[0.2659156338560815]], [[0.21994283758425245]]], "std": [[[0.14366502481605556]], [[0.1366944864810699]], [[0.1374684869581131]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3058459915460325]], [[0.2562161236931296]], [[0.22251641486672794]]], "std": [[[0.1413577233318416]], [[0.15330827393278212]], [[0.1610842577050262]]], "count": [100]}, "observation.state": {"min": [-0.10778096318244934, -0.25757959485054016, 0.5101521015167236, 2.934344530105591, -0.9710783958435059, -0.340189665555954, 0.003846587846055627, -0.03986474499106407], "max": [0.0330667719244957, 0.38924741744995117, 0.6783097386360168, 3.2066617012023926, 0.38667163252830505, -0.08074552565813065, 0.039911527186632156, -0.005075461231172085], "mean": [-0.018607402220368385, 0.03696779906749725, 0.5845591425895691, 3.085736036300659, -0.17969201505184174, -0.20452208817005157, 0.02069256640970707, -0.02096457965672016], "std": [0.04318559914827347, 0.22054244577884674, 0.04939813166856766, 0.0721459910273552, 0.3670669198036194, 0.0840165987610817, 0.015511703677475452, 0.015174486674368382], "count": [275]}, "action": {"min": [-0.4285714328289032, -0.5223214030265808, -0.7366071343421936, -0.061071429401636124, -0.06857142597436905, -0.09321428835391998, 0.0], "max": [0.637499988079071, 0.8303571343421936, 0.8303571343421936, 0.06321428716182709, 0.08892857283353806, 0.11142857372760773, 1.0], "mean": [0.02660064958035946, 0.09441230446100235, -0.04560388624668121, -0.0020142849534749985, 0.004211689345538616, -0.018093502148985863, 0.4290909171104431], "std": [0.1914314478635788, 0.3691001534461975, 0.3329993188381195, 0.02293950319290161, 0.02695057913661003, 0.0414518378674984, 0.4949461817741394], "count": [275]}, "timestamp": {"min": [0.0], "max": [13.7], "mean": [6.85], "std": [3.9692568573978684], "count": [275]}, "frame_index": {"min": [0], "max": [274], "mean": [137.0], "std": [79.38513714795737], "count": [275]}, "episode_index": {"min": [346], "max": [346], "mean": [346.0], "std": [0.0], "count": [275]}, "index": {"min": [93053], "max": [93327], "mean": [93190.0], "std": [79.38513714795737], "count": [275]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [275]}}} +{"episode_index": 347, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.36438387463139554]], [[0.29300652597464766]], [[0.24330162616804535]]], "std": [[[0.1551857947949446]], [[0.1502319703337019]], [[0.14073371771326212]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3347914745854397]], [[0.2909873477711397]], [[0.2584772799622779]]], "std": [[[0.17289711288106402]], [[0.18912209484935547]], [[0.20006582814107507]]], "count": [100]}, "observation.state": {"min": [-0.050487034022808075, -0.18915261328220367, 0.44589388370513916, 3.0158305168151855, -0.2630683183670044, -0.18893243372440338, 0.0007863574428483844, -0.04016904905438423], "max": [0.18236272037029266, 0.29406875371932983, 0.7213682532310486, 3.172960042953491, 0.09590418636798859, 0.1955542117357254, 0.03976184129714966, -0.0008263789350166917], "mean": [0.0739843100309372, 0.0715026706457138, 0.5832973718643188, 3.1139068603515625, 0.018672946840524673, 0.027010450139641762, 0.02603738196194172, -0.027792004868388176], "std": [0.06269729137420654, 0.15138381719589233, 0.08481773734092712, 0.039132148027420044, 0.06743417680263519, 0.10874642431735992, 0.011375987902283669, 0.01069207675755024], "count": [282]}, "action": {"min": [-0.6616071462631226, -0.8651785850524902, -0.9375, -0.08571428805589676, -0.14678572118282318, -0.08571428805589676, 0.0], "max": [0.7151785492897034, 0.8732143044471741, 0.9375, 0.10285714268684387, 0.11357142776250839, 0.04178571328520775, 1.0], "mean": [0.0005888950545340776, 0.08465995639562607, -0.037822939455509186, -0.0017971124034374952, -0.0033586625941097736, -0.004483283031731844, 0.45035460591316223], "std": [0.29761821031570435, 0.4144650995731354, 0.5162677764892578, 0.03140319883823395, 0.03955358266830444, 0.02179814875125885, 0.49752917885780334], "count": [282]}, "timestamp": {"min": [0.0], "max": [14.05], "mean": [7.025], "std": [4.070293805939157], "count": [282]}, "frame_index": {"min": [0], "max": [281], "mean": [140.5], "std": [81.40587611878314], "count": [282]}, "episode_index": {"min": [347], "max": [347], "mean": [347.0], "std": [0.0], "count": [282]}, "index": {"min": [93328], "max": [93609], "mean": [93468.5], "std": [81.40587611878314], "count": [282]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [282]}}} +{"episode_index": 348, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9764705882352941]], [[0.9803921568627451]]], "mean": [[[0.35712215588139556]], [[0.2795073822619868]], [[0.17999551271924785]]], "std": [[[0.20889922485006018]], [[0.15736319542230146]], [[0.10780133493955]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35548646575329346]], [[0.2997697831696155]], [[0.22440626077090994]]], "std": [[[0.1415666560878188]], [[0.13313713831182813]], [[0.1434068083224512]]], "count": [100]}, "observation.state": {"min": [-0.4416111409664154, -0.1862815022468567, 0.9870961308479309, 2.0388431549072266, -2.105830430984497, -0.3267069160938263, 0.010957489721477032, -0.039950259029865265], "max": [-0.12158943712711334, 0.15216583013534546, 1.2433581352233887, 3.1404335498809814, 0.005568814929574728, 0.10818910598754883, 0.03993695601820946, -0.014679084531962872], "mean": [-0.25580233335494995, -0.02010013721883297, 1.15437912940979, 2.7846531867980957, -1.1114503145217896, -0.11526035517454147, 0.02407994121313095, -0.024964354932308197], "std": [0.09215805679559708, 0.13459113240242004, 0.07429882138967514, 0.41056641936302185, 0.7162021398544312, 0.11192133277654648, 0.011471688747406006, 0.01095321774482727], "count": [208]}, "action": {"min": [-0.5008928775787354, -0.7151785492897034, -0.7419642806053162, -0.07785714417695999, -0.0714285746216774, -0.1971428543329239, 0.0], "max": [0.6428571343421936, 0.4419642984867096, 0.7633928656578064, 0.054999999701976776, 0.08142857253551483, 0.009285714477300644, 1.0], "mean": [-0.0709950402379036, -0.0684838742017746, -0.05547734722495079, -0.005491071380674839, 0.010580356232821941, -0.06256525218486786, 0.33173078298568726], "std": [0.24517299234867096, 0.2827259302139282, 0.3287164866924286, 0.0235141608864069, 0.03133976459503174, 0.06295166909694672, 0.4708353579044342], "count": [208]}, "timestamp": {"min": [0.0], "max": [10.35], "mean": [5.175000000000001], "std": [3.002186703054958], "count": [208]}, "frame_index": {"min": [0], "max": [207], "mean": [103.5], "std": [60.043734061099165], "count": [208]}, "episode_index": {"min": [348], "max": [348], "mean": [348.0], "std": [0.0], "count": [208]}, "index": {"min": [93610], "max": [93817], "mean": [93713.5], "std": [60.043734061099165], "count": [208]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [208]}}} +{"episode_index": 349, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9921568627450981]], [[1.0]]], "mean": [[[0.33304073318780636]], [[0.2602191736557904]], [[0.1677250156776578]]], "std": [[[0.21325256143715088]], [[0.1582750939753874]], [[0.1031756723274447]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9921568627450981]], [[0.9921568627450981]]], "mean": [[[0.35686548031077664]], [[0.3007809819240196]], [[0.22498162363089766]]], "std": [[[0.1400842766467594]], [[0.1318506696163]], [[0.1425115498155159]]], "count": [100]}, "observation.state": {"min": [-0.44875985383987427, -0.16759389638900757, 0.985569417476654, 2.024329662322998, -2.1024534702301025, -0.37202972173690796, 0.01207804773002863, -0.03988133370876312], "max": [-0.16515976190567017, 0.15424653887748718, 1.2476962804794312, 3.1479480266571045, 0.004297156818211079, 0.0010583063121885061, 0.039927806705236435, -0.014825345017015934], "mean": [-0.2692636251449585, -0.0012441943399608135, 1.14591646194458, 2.8500118255615234, -0.9532609581947327, -0.13983184099197388, 0.023247940465807915, -0.024019617587327957], "std": [0.07761522382497787, 0.12093648314476013, 0.08307284116744995, 0.35664108395576477, 0.7466745376586914, 0.1274515688419342, 0.011934859678149223, 0.011374150402843952], "count": [176]}, "action": {"min": [-0.44999998807907104, -0.5919643044471741, -0.8651785850524902, -0.16571427881717682, -0.026428570970892906, -0.1842857152223587, 0.0], "max": [0.4124999940395355, 0.5892857313156128, 0.824999988079071, 0.08071428537368774, 0.07571428269147873, 0.004285714123398066, 1.0], "mean": [-0.08158988505601883, -0.055839065462350845, -0.06475751847028732, -0.010389610193669796, 0.01616477593779564, -0.07288959622383118, 0.3238636255264282], "std": [0.257824569940567, 0.2970978021621704, 0.39266514778137207, 0.04254627600312233, 0.02196771465241909, 0.057052385061979294, 0.4679490029811859], "count": [176]}, "timestamp": {"min": [0.0], "max": [8.75], "mean": [4.375], "std": [2.540300179112697], "count": [176]}, "frame_index": {"min": [0], "max": [175], "mean": [87.5], "std": [50.806003582253936], "count": [176]}, "episode_index": {"min": [349], "max": [349], "mean": [349.0], "std": [0.0], "count": [176]}, "index": {"min": [93818], "max": [93993], "mean": [93905.5], "std": [50.806003582253936], "count": [176]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [176]}}} +{"episode_index": 350, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31953411625880823]], [[0.26727956614774817]], [[0.23633115880629596]]], "std": [[[0.1455322375172757]], [[0.1453037525950689]], [[0.15366179457093668]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32106215233896296]], [[0.274318473666322]], [[0.24001730526194853]]], "std": [[[0.1627749521826762]], [[0.17730135658850368]], [[0.18676024854067225]]], "count": [100]}, "observation.state": {"min": [-0.13188913464546204, -0.1506773978471756, 0.4811708629131317, 2.9792869091033936, -0.2317119538784027, -0.30258554220199585, 0.0009312059264630079, -0.0398341566324234], "max": [-0.005374888889491558, 0.309118390083313, 0.6990048885345459, 3.241549253463745, 0.28925034403800964, 0.14216665923595428, 0.040797580033540726, -0.0011782462242990732], "mean": [-0.06068862974643707, 0.05919979140162468, 0.6019845604896545, 3.1138060092926025, 0.0499989315867424, -0.07623184472322464, 0.03328787162899971, -0.03230322524905205], "std": [0.03679461404681206, 0.15789920091629028, 0.06628940999507904, 0.07896848022937775, 0.16227249801158905, 0.09361717849969864, 0.008444560691714287, 0.00853010918945074], "count": [278]}, "action": {"min": [-0.47678571939468384, -0.7285714149475098, -0.7205356955528259, -0.07821428775787354, -0.08250000327825546, -0.0803571417927742, 0.0], "max": [0.5732142925262451, 0.8571428656578064, 0.9375, 0.07392857223749161, 0.1007142886519432, 0.06750000268220901, 1.0], "mean": [0.014818860217928886, 0.08277551829814911, -0.018489839509129524, 0.0012448597699403763, 0.007160843815654516, -0.005083504132926464, 0.528777003288269], "std": [0.24534665048122406, 0.3945326805114746, 0.42981451749801636, 0.02805710956454277, 0.03679782524704933, 0.02670268341898918, 0.49917125701904297], "count": [278]}, "timestamp": {"min": [0.0], "max": [13.85], "mean": [6.925000000000001], "std": [4.012558410789804], "count": [278]}, "frame_index": {"min": [0], "max": [277], "mean": [138.5], "std": [80.25116821579608], "count": [278]}, "episode_index": {"min": [350], "max": [350], "mean": [350.0], "std": [0.0], "count": [278]}, "index": {"min": [93994], "max": [94271], "mean": [94132.5], "std": [80.25116821579608], "count": [278]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [278]}}} +{"episode_index": 351, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5582152883492264]], [[0.5256935352998622]], [[0.49029211964326747]]], "std": [[[0.26774337660547476]], [[0.2448513841233845]], [[0.221818197628733]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5380073415718826]], [[0.5031962112725951]], [[0.4546175417432598]]], "std": [[[0.2992063258154454]], [[0.273018921520078]], [[0.2531727651141211]]], "count": [100]}, "observation.state": {"min": [-0.2045779973268509, -0.0936923548579216, 0.9275124073028564, 1.7617290019989014, -0.09574597328901291, -0.25392651557922363, 0.007103113457560539, -0.03996264189481735], "max": [0.06352613121271133, 0.20810812711715698, 1.1754653453826904, 3.2271780967712402, 2.9533066749572754, 0.509127676486969, 0.0400034599006176, -0.0021542042959481478], "mean": [-0.09182664752006531, 0.07098265737295151, 1.045648455619812, 2.6359591484069824, 1.42522394657135, 0.09530947357416153, 0.027987653389573097, -0.02615075372159481], "std": [0.10571741312742233, 0.11215364187955856, 0.08304742723703384, 0.4987019896507263, 1.1952685117721558, 0.25115785002708435, 0.013688142411410809, 0.014948426745831966], "count": [265]}, "action": {"min": [-0.3375000059604645, -0.7071428298950195, -0.7526785731315613, -0.03642857074737549, -0.09107142686843872, -0.02678571455180645, 0.0], "max": [0.6455357074737549, 0.5866071581840515, 0.7794643044471741, 0.12535713613033295, 0.15214285254478455, 0.375, 1.0], "mean": [0.036388128995895386, 0.06413409858942032, -0.10059297829866409, 0.011106470599770546, -0.0017425880068913102, 0.06899189203977585, 0.5471698045730591], "std": [0.22400671243667603, 0.30505385994911194, 0.3471972942352295, 0.03337617218494415, 0.04950040951371193, 0.11101057380437851, 0.49777042865753174], "count": [265]}, "timestamp": {"min": [0.0], "max": [13.2], "mean": [6.6], "std": [3.8249182997810554], "count": [265]}, "frame_index": {"min": [0], "max": [264], "mean": [132.0], "std": [76.49836599562111], "count": [265]}, "episode_index": {"min": [351], "max": [351], "mean": [351.0], "std": [0.0], "count": [265]}, "index": {"min": [94272], "max": [94536], "mean": [94404.0], "std": [76.49836599562111], "count": [265]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [265]}}} +{"episode_index": 352, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3059927463905484]], [[0.24430105830173865]], [[0.2062097365435432]]], "std": [[[0.14053823526547102]], [[0.1302770307533762]], [[0.13250902150182278]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3209397720636106]], [[0.2741477750890395]], [[0.23989824182846967]]], "std": [[[0.15906605258306317]], [[0.17373974014403326]], [[0.1834978109378577]]], "count": [100]}, "observation.state": {"min": [-0.10753728449344635, -0.14961224794387817, 0.49176257848739624, 3.0276401042938232, -0.5421780943870544, -0.45034968852996826, 0.026905259117484093, -0.040515389293432236], "max": [0.019321903586387634, 0.2422308474779129, 0.7047994136810303, 3.268260955810547, 0.0030930594075471163, 0.27391210198402405, 0.039957694709300995, -0.03131930157542229], "mean": [-0.04357031360268593, 0.042270559817552567, 0.6180190443992615, 3.1498970985412598, -0.22306975722312927, -0.13744179904460907, 0.034397006034851074, -0.03709076717495918], "std": [0.03675485774874687, 0.13793663680553436, 0.06839807331562042, 0.06559201329946518, 0.11686741560697556, 0.16399772465229034, 0.00552504463121295, 0.0030486013274639845], "count": [282]}, "action": {"min": [-0.4553571343421936, -0.7017857432365417, -0.6348214149475098, -0.0803571417927742, -0.11142857372760773, -0.0835714265704155, 0.0], "max": [0.4392857253551483, 0.8062499761581421, 0.9375, 0.07285714149475098, 0.10499999672174454, 0.029999999329447746, 1.0], "mean": [0.014067246578633785, 0.06346883624792099, -0.008491641841828823, -0.003005318809300661, -0.0038905777037143707, -0.01036854274570942, 0.5780141949653625], "std": [0.1939924955368042, 0.36327266693115234, 0.3957228362560272, 0.022793903946876526, 0.04429088160395622, 0.02042677253484726, 0.4938763380050659], "count": [282]}, "timestamp": {"min": [0.0], "max": [14.05], "mean": [7.025], "std": [4.070293805939157], "count": [282]}, "frame_index": {"min": [0], "max": [281], "mean": [140.5], "std": [81.40587611878314], "count": [282]}, "episode_index": {"min": [352], "max": [352], "mean": [352.0], "std": [0.0], "count": [282]}, "index": {"min": [94537], "max": [94818], "mean": [94677.5], "std": [81.40587611878314], "count": [282]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [282]}}} +{"episode_index": 353, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6073699939204198]], [[0.5587068026673561]], [[0.504961524514591]]], "std": [[[0.26637106491146134]], [[0.25202829041515423]], [[0.23127240400862578]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5490522682339538]], [[0.5090060209386489]], [[0.45904250859279255]]], "std": [[[0.2997435648599472]], [[0.27918437526265377]], [[0.2647415007758927]]], "count": [100]}, "observation.state": {"min": [-0.1941886991262436, -0.09504824131727219, 0.9204943776130676, 2.261770486831665, -2.258185386657715, -1.1702055931091309, 0.001968796132132411, -0.040348608046770096], "max": [0.048731520771980286, 0.2048053741455078, 1.1830673217773438, 3.139477252960205, -0.0002443089324515313, 0.28809240460395813, 0.040183428674936295, -0.0016631021862849593], "mean": [-0.013248500414192677, 0.019690485671162605, 1.0332680940628052, 2.599928379058838, -1.6929054260253906, -0.12900176644325256, 0.02749238722026348, -0.02772386372089386], "std": [0.05218861252069473, 0.09227573871612549, 0.08893509209156036, 0.24317102134227753, 0.5624751448631287, 0.4965454339981079, 0.016844624653458595, 0.01688910648226738], "count": [261]}, "action": {"min": [-0.4124999940395355, -0.6241071224212646, -0.5517857074737549, -0.05464285612106323, -0.21857142448425293, -0.24321427941322327, 0.0], "max": [0.5571428537368774, 0.7178571224212646, 0.6830357313156128, 0.20999999344348907, 0.1607142835855484, 0.0803571417927742, 1.0], "mean": [0.02393268048763275, 0.10705051571130753, -0.07093596458435059, 0.027068961411714554, -0.012274219654500484, -0.04848930239677429, 0.6858237385749817], "std": [0.24257691204547882, 0.3246608376502991, 0.3400699496269226, 0.04974180832505226, 0.07325680553913116, 0.07564164698123932, 0.46418657898902893], "count": [261]}, "timestamp": {"min": [0.0], "max": [13.0], "mean": [6.5], "std": [3.7671828554858693], "count": [261]}, "frame_index": {"min": [0], "max": [260], "mean": [130.0], "std": [75.34365710971738], "count": [261]}, "episode_index": {"min": [353], "max": [353], "mean": [353.0], "std": [0.0], "count": [261]}, "index": {"min": [94819], "max": [95079], "mean": [94949.0], "std": [75.34365710971738], "count": [261]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [261]}}} +{"episode_index": 354, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5779714116115195]], [[0.5437500424852558]], [[0.5083860647164139]]], "std": [[[0.2644661813615561]], [[0.2442880551913043]], [[0.22410526683123788]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5413729110418581]], [[0.5065542105880437]], [[0.4583640621409697]]], "std": [[[0.30036121972289687]], [[0.27501477238928246]], [[0.25603524039896586]]], "count": [100]}, "observation.state": {"min": [-0.22198864817619324, -0.0800732895731926, 0.9273464679718018, 2.224975347518921, 0.0016228375025093555, -0.2285684198141098, -0.00047834301949478686, -0.04022306203842163], "max": [0.08948121964931488, 0.20660366117954254, 1.172067403793335, 3.140468120574951, 2.809215545654297, 0.6940212845802307, 0.039852749556303024, -0.00956649798899889], "mean": [-0.07813044637441635, 0.08253535628318787, 1.0375758409500122, 2.6701064109802246, 1.5556291341781616, 0.22205932438373566, 0.026709193363785744, -0.028098298236727715], "std": [0.12261010706424713, 0.10674039274454117, 0.07705701142549515, 0.32888197898864746, 1.0388699769973755, 0.32506507635116577, 0.013745125383138657, 0.012887537479400635], "count": [222]}, "action": {"min": [-0.6294642686843872, -0.8866071701049805, -0.8410714268684387, -0.046071428805589676, -0.1939285695552826, -0.05464285612106323, 0.0], "max": [0.8491071462631226, 0.65625, 0.8223214149475098, 0.15642857551574707, 0.12964285910129547, 0.375, 1.0], "mean": [0.07074080407619476, 0.04730934649705887, -0.10001211613416672, 0.020675674080848694, 0.0026061797980219126, 0.07341218739748001, 0.5720720887184143], "std": [0.2766515910625458, 0.3574672341346741, 0.4058763384819031, 0.041167862713336945, 0.0626661628484726, 0.1221306249499321, 0.4947783648967743], "count": [222]}, "timestamp": {"min": [0.0], "max": [11.05], "mean": [5.5249999999999995], "std": [3.2042614853764144], "count": [222]}, "frame_index": {"min": [0], "max": [221], "mean": [110.5], "std": [64.0852297075283], "count": [222]}, "episode_index": {"min": [354], "max": [354], "mean": [354.0], "std": [0.0], "count": [222]}, "index": {"min": [95080], "max": [95301], "mean": [95190.5], "std": [64.0852297075283], "count": [222]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [222]}}} +{"episode_index": 355, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.36438111668007045]], [[0.2994610404220282]], [[0.25486046286190256]]], "std": [[[0.18172060553374605]], [[0.1796062537656086]], [[0.17497785177152103]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3258980671003753]], [[0.2804119555903416]], [[0.25038656676049326]]], "std": [[[0.16145396534036008]], [[0.17723441037092638]], [[0.1881605612689256]]], "count": [100]}, "observation.state": {"min": [-0.11372049897909164, -0.14200174808502197, 0.44721928238868713, 3.074277877807617, -0.23572401702404022, -0.16982729732990265, 0.001410129014402628, -0.03985537961125374], "max": [0.1816721260547638, 0.12283310294151306, 0.6765559911727905, 3.254417896270752, 4.542309761745855e-05, 0.13129040598869324, 0.03991689160466194, -0.0028103715740144253], "mean": [0.019078021869063377, 0.0027356422506272793, 0.5686458349227905, 3.165760040283203, -0.15013496577739716, -0.04874280095100403, 0.024041486904025078, -0.02358679473400116], "std": [0.09831611812114716, 0.08694221079349518, 0.068680040538311, 0.05237340182065964, 0.06343673169612885, 0.06825784593820572, 0.015967853367328644, 0.01579289510846138], "count": [237]}, "action": {"min": [-0.5651785731315613, -0.5758928656578064, -0.5089285969734192, -0.03857142850756645, -0.09214285761117935, -0.040714286267757416, 0.0], "max": [0.7044642567634583, 0.4848214387893677, 0.5758928656578064, 0.07821428775787354, 0.10285714268684387, 0.009642857126891613, 1.0], "mean": [0.052463822066783905, 0.03684447333216667, -0.07581377774477005, -1.3563145330408588e-05, -0.0008499101968482137, -0.004276671912521124, 0.4556961953639984], "std": [0.33293408155441284, 0.2032601237297058, 0.2809421420097351, 0.024015920236706734, 0.030961301177740097, 0.01131668221205473, 0.4980340003967285], "count": [237]}, "timestamp": {"min": [0.0], "max": [11.8], "mean": [5.8999999999999995], "std": [3.4207698938494335], "count": [237]}, "frame_index": {"min": [0], "max": [236], "mean": [118.0], "std": [68.41539787698868], "count": [237]}, "episode_index": {"min": [355], "max": [355], "mean": [355.0], "std": [0.0], "count": [237]}, "index": {"min": [95302], "max": [95538], "mean": [95420.0], "std": [68.41539787698868], "count": [237]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [237]}}} +{"episode_index": 356, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.34514364803538605]], [[0.2768679426604626]], [[0.23411044670553768]]], "std": [[[0.14316247239356478]], [[0.14162374187899424]], [[0.14470199685237042]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32688393267463234]], [[0.2819091904584099]], [[0.2521869656431909]]], "std": [[[0.16176631211875384]], [[0.1781588116152071]], [[0.18924170466403004]]], "count": [100]}, "observation.state": {"min": [-0.14143510162830353, -0.12549985945224762, 0.44771161675453186, 2.859337568283081, -0.9994959235191345, -0.4671427607536316, 0.0009080763556994498, -0.040453359484672546], "max": [0.14620724320411682, 0.14157184958457947, 0.6798690557479858, 3.231731414794922, 0.7957429885864258, 0.4188753664493561, 0.040446002036333084, -0.0007146384450607002], "mean": [0.00011002673272741958, 0.04757462814450264, 0.526308000087738, 3.0836524963378906, 0.15949766337871552, -0.02905455231666565, 0.026738621294498444, -0.026134975254535675], "std": [0.07291407883167267, 0.08242957293987274, 0.06553062796592712, 0.08582083135843277, 0.4214700162410736, 0.17630347609519958, 0.015178358182311058, 0.01545931026339531], "count": [342]}, "action": {"min": [-0.6455357074737549, -0.4955357015132904, -0.6482142806053162, -0.03857142850756645, -0.21214285492897034, -0.3117857277393341, 0.0], "max": [0.862500011920929, 0.42321428656578064, 0.5919643044471741, 0.07928571105003357, 0.15000000596046448, 0.2785714268684387, 1.0], "mean": [0.029370300471782684, 0.014473690651357174, -0.07546994090080261, 0.008330202661454678, 0.004476815462112427, -0.018483707681298256, 0.5730994343757629], "std": [0.359355092048645, 0.19836871325969696, 0.2924591898918152, 0.02062396891415119, 0.07064816355705261, 0.11885504424571991, 0.4946276545524597], "count": [342]}, "timestamp": {"min": [0.0], "max": [17.05], "mean": [8.525], "std": [4.936323699542673], "count": [342]}, "frame_index": {"min": [0], "max": [341], "mean": [170.5], "std": [98.72647399085346], "count": [342]}, "episode_index": {"min": [356], "max": [356], "mean": [356.0], "std": [0.0], "count": [342]}, "index": {"min": [95539], "max": [95880], "mean": [95709.5], "std": [98.72647399085346], "count": [342]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [342]}}} +{"episode_index": 357, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5105935662961473]], [[0.47411602364334404]], [[0.4254720267501532]]], "std": [[[0.3047654128820409]], [[0.27477842014309845]], [[0.2440591570259605]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5092894526462929]], [[0.4780606366325827]], [[0.4322653114468443]]], "std": [[[0.3089328873817728]], [[0.2821124164626813]], [[0.2606752321359585]]], "count": [100]}, "observation.state": {"min": [-0.2807709276676178, -0.032749611884355545, 0.9678649306297302, 1.8972878456115723, -2.8294894695281982, -1.1340781450271606, 0.00844195019453764, -0.04001783952116966], "max": [-0.004342574626207352, 0.277749627828598, 1.2154173851013184, 3.3039305210113525, 1.0101170539855957, -0.05695381760597229, 0.04000861570239067, -0.009210511110723019], "mean": [-0.09215369820594788, 0.09699670970439911, 1.082862138748169, 2.6899986267089844, -1.6326018571853638, -0.6718176007270813, 0.032973941415548325, -0.03219105675816536], "std": [0.08773790299892426, 0.09900039434432983, 0.0664319321513176, 0.40351566672325134, 1.1735247373580933, 0.29354390501976013, 0.01224086806178093, 0.01186595018953085], "count": [256]}, "action": {"min": [-0.6803571581840515, -0.6642857193946838, -0.675000011920929, -0.12321428209543228, -0.167142853140831, -0.3310714364051819, 0.0], "max": [0.5946428775787354, 0.8276785612106323, 0.5598214268684387, 0.2646428644657135, 0.20678570866584778, 0.375, 1.0], "mean": [0.03053152747452259, 0.12908415496349335, -0.05291224271059036, 0.029828406870365143, 0.024383356794714928, 0.023178016766905785, 0.7890625], "std": [0.30699077248573303, 0.34370020031929016, 0.2851421535015106, 0.08791973441839218, 0.06730637699365616, 0.18005582690238953, 0.40797409415245056], "count": [256]}, "timestamp": {"min": [0.0], "max": [12.75], "mean": [6.375], "std": [3.6950135317749515], "count": [256]}, "frame_index": {"min": [0], "max": [255], "mean": [127.5], "std": [73.90027063549903], "count": [256]}, "episode_index": {"min": [357], "max": [357], "mean": [357.0], "std": [0.0], "count": [256]}, "index": {"min": [95881], "max": [96136], "mean": [96008.5], "std": [73.90027063549903], "count": [256]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [256]}}} +{"episode_index": 358, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5790038685518152]], [[0.5459886438706342]], [[0.5107790533327589]]], "std": [[[0.2592761666561882]], [[0.23897547951863915]], [[0.21961314794244166]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5403137248918122]], [[0.5056649744370405]], [[0.45735066133386953]]], "std": [[[0.3010980609208565]], [[0.27574248772385335]], [[0.2567604318746219]]], "count": [100]}, "observation.state": {"min": [-0.20890095829963684, -0.056654129177331924, 0.9275332093238831, 1.799558162689209, 0.001615511137060821, -0.3577738106250763, -0.0001427601237082854, -0.0399942584335804], "max": [0.06496544927358627, 0.20336712896823883, 1.16726553440094, 3.1457839012145996, 3.1557400226593018, 0.8290289640426636, 0.04006081819534302, -0.00951644591987133], "mean": [-0.0629882961511612, 0.08034989982843399, 1.0454246997833252, 2.5431759357452393, 1.7180498838424683, 0.25840482115745544, 0.028308190405368805, -0.02916099689900875], "std": [0.10724548995494843, 0.09602479636669159, 0.07674586772918701, 0.4778951406478882, 1.1919565200805664, 0.33729761838912964, 0.012463366612792015, 0.011367203667759895], "count": [250]}, "action": {"min": [-0.6616071462631226, -0.7526785731315613, -0.8973214030265808, -0.09749999642372131, -0.1607142835855484, -0.056785713881254196, 0.0], "max": [0.7660714387893677, 0.7794643044471741, 0.862500011920929, 0.17678570747375488, 0.29035714268684387, 0.36964285373687744, 1.0], "mean": [0.05273571237921715, 0.049928560853004456, -0.06739283353090286, 0.02135571651160717, 0.00228428328409791, 0.06904713809490204, 0.5680000185966492], "std": [0.27482038736343384, 0.3021453619003296, 0.3732436001300812, 0.054538268595933914, 0.08362837135791779, 0.10359964519739151, 0.4953542947769165], "count": [250]}, "timestamp": {"min": [0.0], "max": [12.45], "mean": [6.225], "std": [3.6084103148062305], "count": [250]}, "frame_index": {"min": [0], "max": [249], "mean": [124.5], "std": [72.16820629612461], "count": [250]}, "episode_index": {"min": [358], "max": [358], "mean": [358.0], "std": [0.0], "count": [250]}, "index": {"min": [96137], "max": [96386], "mean": [96261.5], "std": [72.16820629612461], "count": [250]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [250]}}} +{"episode_index": 359, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31582727170458025]], [[0.2595554552265242]], [[0.22575183883367803]]], "std": [[[0.1500040909039151]], [[0.14701800978460877]], [[0.1535480718567423]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32021396113376993]], [[0.2735657899145987]], [[0.2393023645737592]]], "std": [[[0.16174686135340052]], [[0.17599089456440292]], [[0.18520261378500344]]], "count": [100]}, "observation.state": {"min": [-0.10437418520450592, -0.1527632176876068, 0.4806620180606842, 3.01835560798645, -0.9726181626319885, -0.4412173628807068, 0.0006682190578430891, -0.04063120484352112], "max": [0.022279363125562668, 0.27527111768722534, 0.71063232421875, 3.1417760848999023, 0.16878817975521088, 0.2765814960002899, 0.03991351276636124, -0.0008745917584747076], "mean": [-0.04652395844459534, 0.03850516676902771, 0.6067026853561401, 3.095233678817749, -0.22470101714134216, -0.06732270121574402, 0.031115561723709106, -0.03492021933197975], "std": [0.030339160934090614, 0.14951376616954803, 0.06741614639759064, 0.02984079159796238, 0.30996447801589966, 0.1595887988805771, 0.00954891461879015, 0.008905269205570221], "count": [342]}, "action": {"min": [-0.3883928656578064, -0.675000011920929, -0.7366071343421936, -0.062142856419086456, -0.1703571379184723, -0.0835714265704155, 0.0], "max": [0.6723214387893677, 0.8035714030265808, 0.9375, 0.061071429401636124, 0.1435714215040207, 0.05785714462399483, 1.0], "mean": [0.01945488713681698, 0.055451132357120514, -0.021961165592074394, 0.001162280677817762, 0.00014097748498898, -0.01499059610068798, 0.5146198868751526], "std": [0.17712117731571198, 0.3455881178379059, 0.39577776193618774, 0.01796138286590576, 0.06433761864900589, 0.032620467245578766, 0.4997866153717041], "count": [342]}, "timestamp": {"min": [0.0], "max": [17.05], "mean": [8.525], "std": [4.936323699542673], "count": [342]}, "frame_index": {"min": [0], "max": [341], "mean": [170.5], "std": [98.72647399085346], "count": [342]}, "episode_index": {"min": [359], "max": [359], "mean": [359.0], "std": [0.0], "count": [342]}, "index": {"min": [96387], "max": [96728], "mean": [96557.5], "std": [98.72647399085346], "count": [342]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [342]}}} +{"episode_index": 360, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3382975374109605]], [[0.2685008215810738]], [[0.2244722074620864]]], "std": [[[0.14705878917823376]], [[0.14338751415144607]], [[0.1478015016717078]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3274783151663986]], [[0.28267573337928925]], [[0.2496789820053998]]], "std": [[[0.1661863539692531]], [[0.181442105148674]], [[0.191409447648668]]], "count": [100]}, "observation.state": {"min": [-0.072249636054039, -0.20921537280082703, 0.44606414437294006, 3.0468595027923584, -0.6067051291465759, -0.2668607831001282, 0.009074391797184944, -0.04038795456290245], "max": [0.13979260623455048, 0.29243701696395874, 0.6996771097183228, 3.312757730484009, -0.0015067729400470853, 0.03789269179105759, 0.0404571071267128, -0.008239646442234516], "mean": [0.05679960921406746, 0.05157967284321785, 0.6006543040275574, 3.17454195022583, -0.25806745886802673, -0.14214563369750977, 0.026465747505426407, -0.025738900527358055], "std": [0.06305883824825287, 0.16585686802864075, 0.08322999626398087, 0.05861791968345642, 0.1920163631439209, 0.07867436110973358, 0.012765985913574696, 0.013325567357242107], "count": [246]}, "action": {"min": [-0.5758928656578064, -0.8008928298950195, -0.862500011920929, -0.05892857164144516, -0.09214285761117935, -0.2207142859697342, 0.0], "max": [0.7848214507102966, 0.8196428418159485, 0.9375, 0.0835714265704155, 0.1810714304447174, 0.12428571283817291, 1.0], "mean": [-0.01349087804555893, 0.10648952424526215, -0.04804007709026337, 0.005039199721068144, 0.002469513798132539, -0.008236061781644821, 0.5040650367736816], "std": [0.3246261775493622, 0.4364812672138214, 0.47710487246513367, 0.027784613892436028, 0.042073965072631836, 0.053399935364723206, 0.49998387694358826], "count": [246]}, "timestamp": {"min": [0.0], "max": [12.25], "mean": [6.125], "std": [3.5506748184910806], "count": [246]}, "frame_index": {"min": [0], "max": [245], "mean": [122.5], "std": [71.01349636982161], "count": [246]}, "episode_index": {"min": [360], "max": [360], "mean": [360.0], "std": [0.0], "count": [246]}, "index": {"min": [96729], "max": [96974], "mean": [96851.5], "std": [71.01349636982161], "count": [246]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [246]}}} +{"episode_index": 361, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6044255155675552]], [[0.5672844328038833]], [[0.5264005180807675]]], "std": [[[0.25491139991473805]], [[0.23544749025196177]], [[0.21575901772779954]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5468888124952129]], [[0.5122693637025122]], [[0.4649687870998009]]], "std": [[[0.30037422683540055]], [[0.2763143414746555]], [[0.258495517157318]]], "count": [100]}, "observation.state": {"min": [-0.2352677285671234, -0.10240078717470169, 0.9281110167503357, 1.4981286525726318, 0.002331928815692663, -0.15718041360378265, 0.005569693632423878, -0.039981696754693985], "max": [0.12994298338890076, 0.20839565992355347, 1.1914315223693848, 3.159609079360962, 3.3287267684936523, 0.6873019337654114, 0.040470898151397705, -0.006968911737203598], "mean": [-0.050694335252046585, 0.05060548707842827, 1.0577104091644287, 2.6361212730407715, 1.7678231000900269, 0.2693793475627899, 0.029873549938201904, -0.02912808395922184], "std": [0.14583955705165863, 0.11711706221103668, 0.0832047164440155, 0.44995880126953125, 1.0468404293060303, 0.3006039261817932, 0.01336102094501257, 0.014014755375683308], "count": [301]}, "action": {"min": [-0.5008928775787354, -0.5946428775787354, -0.6508928537368774, -0.0771428570151329, -0.18857142329216003, -0.07821428775787354, 0.0], "max": [0.8892857432365417, 0.7607142925262451, 0.8035714030265808, 0.10607142746448517, 0.20571428537368774, 0.375, 1.0], "mean": [0.02734634093940258, 0.06890425831079483, -0.07324691116809845, 0.011814190074801445, -0.01704675331711769, 0.05843023210763931, 0.6611295938491821], "std": [0.34233492612838745, 0.31490880250930786, 0.38186007738113403, 0.0310073085129261, 0.07351754605770111, 0.09486445784568787, 0.4733259379863739], "count": [301]}, "timestamp": {"min": [0.0], "max": [15.0], "mean": [7.5], "std": [4.344536799245692], "count": [301]}, "frame_index": {"min": [0], "max": [300], "mean": [150.0], "std": [86.89073598491383], "count": [301]}, "episode_index": {"min": [361], "max": [361], "mean": [361.0], "std": [0.0], "count": [301]}, "index": {"min": [96975], "max": [97275], "mean": [97125.0], "std": [86.89073598491383], "count": [301]}, "task_index": {"min": [3], "max": [3], "mean": [3.0], "std": [0.0], "count": [301]}}} +{"episode_index": 362, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.00392156862745098]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3606509172028186]], [[0.2961219177246094]], [[0.2517822145948223]]], "std": [[[0.1502302077364717]], [[0.15525083050864355]], [[0.1631806074867428]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31577579154220287]], [[0.2671064106062347]], [[0.2339955815333946]]], "std": [[[0.14979462710308]], [[0.16378955464212877]], [[0.17258478618255774]]], "count": [100]}, "observation.state": {"min": [-0.13415853679180145, -0.2505537271499634, 0.5081029534339905, 3.029897689819336, -0.23909324407577515, -0.08754351735115051, 0.0020078683737665415, -0.03989114984869957], "max": [0.05882646143436432, 0.3589880168437958, 0.6896001100540161, 3.2011592388153076, 0.49885210394859314, 0.2606675624847412, 0.03996793180704117, -0.0028785017784684896], "mean": [-0.023265494033694267, 0.0004738887946587056, 0.5883108377456665, 3.1253368854522705, 0.11764127016067505, 0.039986856281757355, 0.02143607847392559, -0.02172444388270378], "std": [0.05054168775677681, 0.19891022145748138, 0.0566641129553318, 0.04841845482587814, 0.22071298956871033, 0.10074708610773087, 0.01727193593978882, 0.016860026866197586], "count": [260]}, "action": {"min": [-0.6910714507102966, -0.6294642686843872, -0.6026785969734192, -0.05249999836087227, -0.09428571164608002, -0.09428571164608002, 0.0], "max": [0.8410714268684387, 0.8116071224212646, 0.6776785850524902, 0.08142857253551483, 0.12857143580913544, 0.11785714328289032, 1.0], "mean": [0.01691620796918869, 0.10444363951683044, -0.061122920364141464, -0.0035398348700255156, -0.0026373635046184063, -0.005245877429842949, 0.4692307710647583], "std": [0.2939976751804352, 0.34802836179733276, 0.36123785376548767, 0.021133456379175186, 0.0381782092154026, 0.041522689163684845, 0.4990518093109131], "count": [260]}, "timestamp": {"min": [0.0], "max": [12.95], "mean": [6.475], "std": [3.7527489924054342], "count": [260]}, "frame_index": {"min": [0], "max": [259], "mean": [129.5], "std": [75.05497984810869], "count": [260]}, "episode_index": {"min": [362], "max": [362], "mean": [362.0], "std": [0.0], "count": [260]}, "index": {"min": [97276], "max": [97535], "mean": [97405.5], "std": [75.05497984810869], "count": [260]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [260]}}} +{"episode_index": 363, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.315939385507621]], [[0.2582388921999464]], [[0.22287386307061888]]], "std": [[[0.14680705314258594]], [[0.1426247929724389]], [[0.14867141392746158]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3179943823720895]], [[0.270525037578508]], [[0.23599647731407014]]], "std": [[[0.15695116946828117]], [[0.17115308200952808]], [[0.18069320516483128]]], "count": [100]}, "observation.state": {"min": [-0.11672096699476242, -0.13586288690567017, 0.4802107810974121, 3.0086989402770996, -0.9185408353805542, -0.34238097071647644, 0.027261432260274887, -0.039909377694129944], "max": [0.003111825557425618, 0.3023121654987335, 0.7079384922981262, 3.174966812133789, 0.046017661690711975, 0.0672442615032196, 0.03990144655108452, -0.03132055699825287], "mean": [-0.04613414779305458, 0.0754532665014267, 0.6147732734680176, 3.1270227432250977, -0.2845788896083832, -0.10203243792057037, 0.034550368785858154, -0.035573601722717285], "std": [0.0352851040661335, 0.1492871195077896, 0.06933258473873138, 0.03977033123373985, 0.26356056332588196, 0.11087916791439056, 0.00473021762445569, 0.00371828256174922], "count": [275]}, "action": {"min": [-0.3910714387893677, -0.7955357432365417, -0.7258928418159485, -0.05892857164144516, -0.08892857283353806, -0.0771428570151329, 0.0], "max": [0.5517857074737549, 0.8276785612106323, 0.9375, 0.046071428805589676, 0.1574999988079071, 0.035357143729925156, 1.0], "mean": [0.012866868637502193, 0.0638376921415329, -0.028198035433888435, 0.0009974029380828142, 0.0010129878064617515, -0.017793506383895874, 0.5199999809265137], "std": [0.21616628766059875, 0.394313782453537, 0.449214369058609, 0.014303641393780708, 0.04783795028924942, 0.025088295340538025, 0.4995999038219452], "count": [275]}, "timestamp": {"min": [0.0], "max": [13.7], "mean": [6.85], "std": [3.9692568573978684], "count": [275]}, "frame_index": {"min": [0], "max": [274], "mean": [137.0], "std": [79.38513714795737], "count": [275]}, "episode_index": {"min": [363], "max": [363], "mean": [363.0], "std": [0.0], "count": [275]}, "index": {"min": [97536], "max": [97810], "mean": [97673.0], "std": [79.38513714795737], "count": [275]}, "task_index": {"min": [5], "max": [5], "mean": [5.0], "std": [0.0], "count": [275]}}} +{"episode_index": 364, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9882352941176471]], [[0.9764705882352941]], [[0.984313725490196]]], "mean": [[[0.34365387381759344]], [[0.26595926082835475]], [[0.16761808447744334]]], "std": [[[0.21504973491329235]], [[0.15943916793362709]], [[0.10120855185186682]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9725490196078431]], [[0.9725490196078431]], [[0.9647058823529412]]], "mean": [[[0.3536348128973269]], [[0.2978481415393306]], [[0.22248126579733457]]], "std": [[[0.14234418289006484]], [[0.13303912929873377]], [[0.14221238984628037]]], "count": [100]}, "observation.state": {"min": [-0.441851407289505, -0.16383901238441467, 0.9966583251953125, 2.334873914718628, -2.3132898807525635, -0.30336013436317444, 0.01137014664709568, -0.03990130499005318], "max": [-0.16100609302520752, 0.18414337933063507, 1.2712408304214478, 3.1483123302459717, 0.003981803078204393, 0.06131310388445854, 0.039899732917547226, -0.014642417430877686], "mean": [-0.2660602629184723, 0.010135750286281109, 1.163635492324829, 2.921241283416748, -1.0824466943740845, -0.13858117163181305, 0.02336663194000721, -0.02397311106324196], "std": [0.08280684053897858, 0.13148200511932373, 0.08261489868164062, 0.22872895002365112, 0.6809739470481873, 0.09665010124444962, 0.011811600998044014, 0.011373798362910748], "count": [174]}, "action": {"min": [-0.5223214030265808, -0.8571428656578064, -0.7526785731315613, -0.04214285686612129, -0.07285714149475098, -0.19428572058677673, 0.0], "max": [0.5383928418159485, 0.4419642984867096, 0.9375, 0.030714286491274834, 0.054999999701976776, 0.04571428522467613, 1.0], "mean": [-0.09482758492231369, -0.05612684786319733, -0.06128387898206711, -0.001921182731166482, -0.0007348103681579232, -0.07406400889158249, 0.3218390941619873], "std": [0.272624135017395, 0.334659218788147, 0.41666379570961, 0.013191605918109417, 0.024638058617711067, 0.0622638501226902, 0.46718159317970276], "count": [174]}, "timestamp": {"min": [0.0], "max": [8.65], "mean": [4.325], "std": [2.51143219431994], "count": [174]}, "frame_index": {"min": [0], "max": [173], "mean": [86.5], "std": [50.22864388639879], "count": [174]}, "episode_index": {"min": [364], "max": [364], "mean": [364.0], "std": [0.0], "count": [174]}, "index": {"min": [97811], "max": [97984], "mean": [97897.5], "std": [50.22864388639879], "count": [174]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [174]}}} +{"episode_index": 365, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5442963783413757]], [[0.5026854858398437]], [[0.44724936690984984]]], "std": [[[0.304503484790257]], [[0.2752326179277741]], [[0.2457636316577803]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5082589368633196]], [[0.47754429357192096]], [[0.4323826186236213]]], "std": [[[0.3100338908513576]], [[0.2838366527288903]], [[0.2631068621864423]]], "count": [100]}, "observation.state": {"min": [-0.32972773909568787, -0.08971082419157028, 0.9750517010688782, 2.3575022220611572, -2.7664737701416016, -1.1634994745254517, 0.009153109975159168, -0.04000813886523247], "max": [0.04246849939227104, 0.26652809977531433, 1.1862528324127197, 3.338977575302124, 0.0006235002656467259, -0.10220127552747726, 0.04000907018780708, -0.006775692570954561], "mean": [-0.07135935872793198, 0.0719684362411499, 1.066554069519043, 2.809917688369751, -1.8525253534317017, -0.662497341632843, 0.03252852335572243, -0.031901802867650986], "std": [0.09851211309432983, 0.11178575456142426, 0.060983870178461075, 0.29249000549316406, 0.8261629343032837, 0.2622891068458557, 0.012262447737157345, 0.012939938344061375], "count": [267]}, "action": {"min": [-0.7660714387893677, -0.6133928298950195, -0.7553571462631226, -0.12857143580913544, -0.12535713613033295, -0.3449999988079071, 0.0], "max": [0.9375, 0.7071428298950195, 0.5919643044471741, 0.14678572118282318, 0.25928571820259094, 0.21321429312229156, 1.0], "mean": [0.02418738231062889, 0.09163321554660797, -0.04193418473005295, -0.006083462852984667, 0.017921345308423042, -0.013796135783195496, 0.7528089880943298], "std": [0.3965338170528412, 0.2879865765571594, 0.2519044280052185, 0.05625826492905617, 0.07386842370033264, 0.12868632376194, 0.43137896060943604], "count": [267]}, "timestamp": {"min": [0.0], "max": [13.3], "mean": [6.65], "std": [3.8537860172389786], "count": [267]}, "frame_index": {"min": [0], "max": [266], "mean": [133.0], "std": [77.07572034477957], "count": [267]}, "episode_index": {"min": [365], "max": [365], "mean": [365.0], "std": [0.0], "count": [267]}, "index": {"min": [97985], "max": [98251], "mean": [98118.0], "std": [77.07572034477957], "count": [267]}, "task_index": {"min": [2], "max": [2], "mean": [2.0], "std": [0.0], "count": [267]}}} +{"episode_index": 366, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.996078431372549]], [[1.0]], [[1.0]]], "mean": [[[0.33552174886067704]], [[0.26325332880955116]], [[0.17147699333639707]]], "std": [[[0.21281808522468945]], [[0.1595966234835335]], [[0.1073828340627821]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9882352941176471]], [[0.984313725490196]]], "mean": [[[0.3550416654698989]], [[0.2989571156221278]], [[0.22319629803825827]]], "std": [[[0.14061642875565905]], [[0.13150142858332522]], [[0.14130906535417273]]], "count": [100]}, "observation.state": {"min": [-0.45324188470840454, -0.14940643310546875, 0.9849329590797424, 1.8948405981063843, -2.290894031524658, -0.5163076519966125, 0.013180975802242756, -0.03988661244511604], "max": [-0.17072956264019012, 0.16359764337539673, 1.2791519165039062, 3.1424224376678467, 0.002576185390353203, -0.027100158855319023, 0.03990528732538223, -0.014807901345193386], "mean": [-0.23824068903923035, 0.007662095595151186, 1.167961597442627, 2.802022695541382, -0.9365047216415405, -0.32018959522247314, 0.023061003535985947, -0.023542724549770355], "std": [0.07207367569208145, 0.11908835917711258, 0.09407959878444672, 0.42749714851379395, 0.790608286857605, 0.181173637509346, 0.011552393436431885, 0.011236298829317093], "count": [180]}, "action": {"min": [-0.7982142567634583, -0.5517857074737549, -0.7366071343421936, -0.06499999761581421, -0.007857142947614193, -0.18928571045398712, 0.0], "max": [0.42321428656578064, 0.4660714268684387, 0.9375, 0.02428571507334709, 0.07071428745985031, -0.0, 1.0], "mean": [-0.08653269708156586, -0.06958331167697906, -0.051770828664302826, -0.015753967687487602, 0.01810714416205883, -0.07860317081212997, 0.3055555522441864], "std": [0.2751144766807556, 0.25063449144363403, 0.40872180461883545, 0.02202165313065052, 0.021204186603426933, 0.057574983686208725, 0.46064257621765137], "count": [180]}, "timestamp": {"min": [0.0], "max": [8.95], "mean": [4.475], "std": [2.598036117275252], "count": [180]}, "frame_index": {"min": [0], "max": [179], "mean": [89.5], "std": [51.96072234550504], "count": [180]}, "episode_index": {"min": [366], "max": [366], "mean": [366.0], "std": [0.0], "count": [180]}, "index": {"min": [98252], "max": [98431], "mean": [98341.5], "std": [51.96072234550504], "count": [180]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [180]}}} +{"episode_index": 367, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.35044363522997085]], [[0.28564527683632046]], [[0.24125803150850184]]], "std": [[[0.14333159373158771]], [[0.14495588356453562]], [[0.1512068118866353]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3147076685288373]], [[0.2661988327923943]], [[0.2330157554476869]]], "std": [[[0.14868346463872054]], [[0.16252142002119074]], [[0.17112432944531525]]], "count": [100]}, "observation.state": {"min": [-0.11325455456972122, -0.26216593384742737, 0.5066525340080261, 3.036548137664795, -0.09059306234121323, -0.20277243852615356, 0.001061267452314496, -0.039851635694503784], "max": [0.020761772990226746, 0.3656150698661804, 0.6837630867958069, 3.264369249343872, 0.31789880990982056, 0.149941086769104, 0.03996836766600609, -0.00304015027359128], "mean": [-0.031475916504859924, -0.010872257873415947, 0.5825943946838379, 3.133768081665039, 0.10765176266431808, -0.0352705717086792, 0.022199293598532677, -0.022539446130394936], "std": [0.03754210099577904, 0.19577737152576447, 0.050699520856142044, 0.06250184774398804, 0.11533892154693604, 0.09567221999168396, 0.01720033958554268, 0.016644353047013283], "count": [225]}, "action": {"min": [-0.5464285612106323, -0.7339285612106323, -0.6482142806053162, -0.08571428805589676, -0.09535714238882065, -0.09214285761117935, 0.0], "max": [0.6026785969734192, 0.8383928537368774, 0.7366071343421936, 0.1307142823934555, 0.05999999865889549, 0.08785714209079742, 1.0], "mean": [0.013940485194325447, 0.11860711127519608, -0.07058332115411758, -0.003014283487573266, 0.0011571426875889301, -0.002599999075755477, 0.5066666603088379], "std": [0.24674908816814423, 0.4117961525917053, 0.35379183292388916, 0.03358177840709686, 0.027049142867326736, 0.0315377414226532, 0.4999553859233856], "count": [225]}, "timestamp": {"min": [0.0], "max": [11.2], "mean": [5.6], "std": [3.2475631890182934], "count": [225]}, "frame_index": {"min": [0], "max": [224], "mean": [112.0], "std": [64.95126378036586], "count": [225]}, "episode_index": {"min": [367], "max": [367], "mean": [367.0], "std": [0.0], "count": [225]}, "index": {"min": [98432], "max": [98656], "mean": [98544.0], "std": [64.95126378036586], "count": [225]}, "task_index": {"min": [0], "max": [0], "mean": [0.0], "std": [0.0], "count": [225]}}} +{"episode_index": 368, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.9725490196078431]], [[0.984313725490196]]], "mean": [[[0.35691297703163294]], [[0.27667649213005513]], [[0.17486454862706802]]], "std": [[[0.20847059084992361]], [[0.15506562034263316]], [[0.10058205800898729]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[1.0]], [[0.9882352941176471]]], "mean": [[[0.35586140950520834]], [[0.30034380505131736]], [[0.2253826545266544]]], "std": [[[0.1411127600021963]], [[0.13256209466446667]], [[0.14294132369035986]]], "count": [100]}, "observation.state": {"min": [-0.40774160623550415, -0.18384844064712524, 0.986586332321167, 2.1578454971313477, -2.091951370239258, -0.3852209150791168, 0.008805006742477417, -0.03991921991109848], "max": [-0.1545620858669281, 0.16921575367450714, 1.21556556224823, 3.1404552459716797, -0.0005989344208501279, -0.002717509400099516, 0.039907265454530716, -0.015303210355341434], "mean": [-0.24003688991069794, 0.00931124109774828, 1.1420937776565552, 2.7768406867980957, -1.1123627424240112, -0.16272826492786407, 0.022907312959432602, -0.025404250249266624], "std": [0.08579590916633606, 0.1384361833333969, 0.07170043885707855, 0.32808205485343933, 0.6457308530807495, 0.13917414844036102, 0.012967239134013653, 0.01098515372723341], "count": [169]}, "action": {"min": [-0.6857143044471741, -0.7044642567634583, -0.5892857313156128, -0.0714285746216774, -0.013571428135037422, -0.1721428632736206, 0.0], "max": [0.44999998807907104, 0.5249999761581421, 0.8839285969734192, 0.030714286491274834, 0.0657142847776413, -0.004999999888241291, 1.0], "mean": [-0.0910080224275589, -0.08690297603607178, -0.06298604607582092, -0.008351648226380348, 0.007324599660933018, -0.07391796261072159, 0.3491124212741852], "std": [0.2978459894657135, 0.3139817416667938, 0.36371690034866333, 0.023592110723257065, 0.0188000351190567, 0.041492216289043427, 0.4766896069049835], "count": [169]}, "timestamp": {"min": [0.0], "max": [8.4], "mean": [4.199999999999999], "std": [2.4392621835300936], "count": [169]}, "frame_index": {"min": [0], "max": [168], "mean": [84.0], "std": [48.78524367060187], "count": [169]}, "episode_index": {"min": [368], "max": [368], "mean": [368.0], "std": [0.0], "count": [169]}, "index": {"min": [98657], "max": [98825], "mean": [98741.0], "std": [48.78524367060187], "count": [169]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [169]}}} +{"episode_index": 369, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3425192942899816]], [[0.27846662932751226]], [[0.23967967134363513]]], "std": [[[0.1545147402110151]], [[0.15655654135571367]], [[0.1642498694417828]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.31931221038219976]], [[0.2732674913593367]], [[0.2429118604473039]]], "std": [[[0.1556001905314122]], [[0.1703537428961629]], [[0.18069020662224258]]], "count": [100]}, "observation.state": {"min": [-0.14252454042434692, -0.11060509830713272, 0.4459989368915558, 3.0636892318725586, -0.15259060263633728, -0.35904327034950256, 0.0029031927697360516, -0.03977397084236145], "max": [0.1575317680835724, 0.11218493431806564, 0.679855227470398, 3.2147068977355957, 0.5700351595878601, -0.02474992722272873, 0.04050920903682709, -0.002752342727035284], "mean": [-0.0034110511187464, 0.007009160704910755, 0.5547877550125122, 3.130053758621216, 0.15642453730106354, -0.16349855065345764, 0.02447861060500145, -0.023791400715708733], "std": [0.09746143966913223, 0.08073628693819046, 0.06670932471752167, 0.03255520015954971, 0.2649550437927246, 0.10418706387281418, 0.015508528798818588, 0.015514567494392395], "count": [207]}, "action": {"min": [-0.6348214149475098, -0.5223214030265808, -0.6133928298950195, -0.03321428596973419, -0.08464285731315613, -0.12964285910129547, 0.0], "max": [0.9348214268684387, 0.3642857074737549, 0.5892857313156128, 0.056785713881254196, 0.07821428775787354, 0.0803571417927742, 1.0], "mean": [0.0381728820502758, 0.04386645182967186, -0.10372667759656906, 0.0024948243517428637, -0.0034316780511289835, -0.006821947172284126, 0.4396135210990906], "std": [0.4271422326564789, 0.17419381439685822, 0.33178091049194336, 0.01573539525270462, 0.03476417437195778, 0.05448426678776741, 0.49634024500846863], "count": [207]}, "timestamp": {"min": [0.0], "max": [10.3], "mean": [5.1499999999999995], "std": [2.987752778706208], "count": [207]}, "frame_index": {"min": [0], "max": [206], "mean": [103.0], "std": [59.75505557412416], "count": [207]}, "episode_index": {"min": [369], "max": [369], "mean": [369.0], "std": [0.0], "count": [207]}, "index": {"min": [98826], "max": [99032], "mean": [98929.0], "std": [59.75505557412416], "count": [207]}, "task_index": {"min": [1], "max": [1], "mean": [1.0], "std": [0.0], "count": [207]}}} +{"episode_index": 370, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3633264800427007]], [[0.2908799414541207]], [[0.24035031606636795]]], "std": [[[0.16138511921497675]], [[0.15261716949324183]], [[0.13901960128339239]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.33348514152975645]], [[0.28985554414636944]], [[0.2574643662396599]]], "std": [[[0.17292747888107202]], [[0.1889750066462876]], [[0.19919107386479973]]], "count": [100]}, "observation.state": {"min": [-0.05574039742350578, -0.20813827216625214, 0.4463454782962799, 3.019850730895996, -0.45930513739585876, -0.23226489126682281, 0.019545700401067734, -0.03987154737114906], "max": [0.17644625902175903, 0.259123831987381, 0.7119212746620178, 3.189199209213257, 0.28986111283302307, 0.19366848468780518, 0.03991447016596794, -0.016628369688987732], "mean": [0.07139372080564499, 0.0314561128616333, 0.6036500930786133, 3.124907970428467, -0.004174447152763605, 0.012308040633797646, 0.030042830854654312, -0.029582206159830093], "std": [0.05762237310409546, 0.16507840156555176, 0.0831708312034607, 0.04820229113101959, 0.22882618010044098, 0.1159188374876976, 0.008484145626425743, 0.009326869621872902], "count": [247]}, "action": {"min": [-0.8062499761581421, -0.9375, -0.7821428775787354, -0.13928571343421936, -0.1103571429848671, -0.13928571343421936, 0.0], "max": [0.6080357432365417, 0.8946428298950195, 0.9375, 0.05249999836087227, 0.19928571581840515, 0.1007142886519432, 1.0], "mean": [0.021970786154270172, 0.0919172540307045, -0.02840152382850647, -0.001808849861845374, 0.004090514965355396, 0.009109312668442726, 0.5141700506210327], "std": [0.2933454215526581, 0.4619835913181305, 0.4767349362373352, 0.028445137664675713, 0.052141640335321426, 0.048378556966781616, 0.4997987151145935], "count": [247]}, "timestamp": {"min": [0.0], "max": [12.3], "mean": [6.1499999999999995], "std": [3.5651086939951773], "count": [247]}, "frame_index": {"min": [0], "max": [246], "mean": [123.0], "std": [71.30217387990355], "count": [247]}, "episode_index": {"min": [370], "max": [370], "mean": [370.0], "std": [0.0], "count": [247]}, "index": {"min": [99033], "max": [99279], "mean": [99156.0], "std": [71.30217387990355], "count": [247]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [247]}}} +{"episode_index": 371, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6135310238108915]], [[0.5680477199180454]], [[0.5148195322074142]]], "std": [[[0.27398139882972766]], [[0.2550999191404182]], [[0.2329808746787407]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5503040939031862]], [[0.5102267850988051]], [[0.4598540266448376]]], "std": [[[0.300821009968028]], [[0.2799256588471141]], [[0.26538860714333984]]], "count": [100]}, "observation.state": {"min": [-0.20879903435707092, -0.062281057238578796, 0.9121676087379456, 2.2946066856384277, -2.3555877208709717, -0.8204366564750671, 0.002289372496306896, -0.04018215835094452], "max": [0.03543590009212494, 0.20530492067337036, 1.179405927658081, 3.140909194946289, -0.0017235014820471406, 0.30565929412841797, 0.04051652178168297, -0.0018735608318820596], "mean": [-0.015961049124598503, 0.039950836449861526, 1.0227597951889038, 2.7164628505706787, -1.8122758865356445, -0.15711241960525513, 0.027958320453763008, -0.027682987973093987], "std": [0.06248931586742401, 0.08443303406238556, 0.0891968235373497, 0.24866192042827606, 0.598774790763855, 0.3370648920536041, 0.016817348077893257, 0.01690496690571308], "count": [251]}, "action": {"min": [-0.3857142925262451, -0.7821428775787354, -0.5383928418159485, -0.07285714149475098, -0.11999999731779099, -0.30964285135269165, 0.0], "max": [0.6455357074737549, 0.7848214507102966, 0.7875000238418579, 0.1971428543329239, 0.10928571224212646, 0.0771428570151329, 1.0], "mean": [0.03434125706553459, 0.1545247882604599, -0.1036318689584732, 0.020993173122406006, -0.00740608898922801, -0.04580250009894371, 0.6852589845657349], "std": [0.25288623571395874, 0.39055222272872925, 0.33425724506378174, 0.050068486481904984, 0.05459892377257347, 0.09681012481451035, 0.4644120931625366], "count": [251]}, "timestamp": {"min": [0.0], "max": [12.5], "mean": [6.25], "std": [3.6228441865473595], "count": [251]}, "frame_index": {"min": [0], "max": [250], "mean": [125.0], "std": [72.4568837309472], "count": [251]}, "episode_index": {"min": [371], "max": [371], "mean": [371.0], "std": [0.0], "count": [251]}, "index": {"min": [99280], "max": [99530], "mean": [99405.0], "std": [72.4568837309472], "count": [251]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [251]}}} +{"episode_index": 372, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9921568627450981]], [[0.9607843137254902]], [[0.9607843137254902]]], "mean": [[[0.35096338967715995]], [[0.27406484805836395]], [[0.177013489966299]]], "std": [[[0.20986519702218934]], [[0.15731513484054596]], [[0.10700529790789103]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3556078347598805]], [[0.29909380983838846]], [[0.2225796215580959]]], "std": [[[0.14084414325466266]], [[0.13214347154621894]], [[0.1422317029686948]]], "count": [100]}, "observation.state": {"min": [-0.4661499559879303, -0.18249483406543732, 1.0010251998901367, 1.7364767789840698, -2.3993120193481445, -0.4567900002002716, 0.012469295412302017, -0.03991934657096863], "max": [-0.16662754118442535, 0.17180177569389343, 1.2995721101760864, 3.146911859512329, 0.009099515154957771, 0.19359265267848969, 0.03992713615298271, -0.014690660871565342], "mean": [-0.2460661232471466, -0.022849366068840027, 1.1880278587341309, 2.6223692893981934, -1.1922543048858643, -0.10357964783906937, 0.02098003961145878, -0.02192024141550064], "std": [0.08497671782970428, 0.1260710209608078, 0.08817563951015472, 0.5429612994194031, 0.970038652420044, 0.1703825443983078, 0.010911001823842525, 0.010571836493909359], "count": [259]}, "action": {"min": [-0.7928571701049805, -0.5464285612106323, -0.5517857074737549, -0.12357142567634583, -0.0771428570151329, -0.2199999988079071, 0.0], "max": [0.7205356955528259, 0.6214285492897034, 0.7794643044471741, 0.06142857298254967, 0.14642857015132904, 0.17000000178813934, 1.0], "mean": [-0.05845284461975098, -0.05396442115306854, -0.03457321226596832, -0.00686983298510313, 0.014307775534689426, -0.0444897823035717, 0.23938223719596863], "std": [0.2963819205760956, 0.2649320960044861, 0.2941451668739319, 0.03416621685028076, 0.0495532788336277, 0.09782596677541733, 0.42670685052871704], "count": [259]}, "timestamp": {"min": [0.0], "max": [12.9], "mean": [6.449999999999999], "std": [3.7383151285037486], "count": [259]}, "frame_index": {"min": [0], "max": [258], "mean": [129.0], "std": [74.76630257007497], "count": [259]}, "episode_index": {"min": [372], "max": [372], "mean": [372.0], "std": [0.0], "count": [259]}, "index": {"min": [99531], "max": [99789], "mean": [99660.0], "std": [74.76630257007497], "count": [259]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [259]}}} +{"episode_index": 373, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.3173045492733226]], [[0.2504107187308517]], [[0.20932198797487744]]], "std": [[[0.11858884455031422]], [[0.10655755078603073]], [[0.10780073787062996]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.320600404028799]], [[0.27626955757889093]], [[0.24379580090092678]]], "std": [[[0.15888978578615884]], [[0.17504389440382226]], [[0.18402169001598245]]], "count": [100]}, "observation.state": {"min": [-0.13448242843151093, -0.09644277393817902, 0.44805508852005005, 2.971879720687866, -1.0733691453933716, -0.5134414434432983, 0.0009370627230964601, -0.03992421180009842], "max": [0.10679525882005692, 0.2441345602273941, 0.704617977142334, 3.2017388343811035, 0.0810190960764885, 0.1706022024154663, 0.04011194780468941, -0.000822714704554528], "mean": [0.005522180814296007, 0.0708223283290863, 0.5938977599143982, 3.1230955123901367, -0.3071097731590271, -0.13564106822013855, 0.030827127397060394, -0.031465351581573486], "std": [0.07365594804286957, 0.10865460336208344, 0.08062918484210968, 0.05806904658675194, 0.3475809395313263, 0.17870891094207764, 0.009957320056855679, 0.009997188113629818], "count": [312]}, "action": {"min": [-0.43392857909202576, -0.824999988079071, -0.6830357313156128, -0.10285714268684387, -0.2175000011920929, -0.10821428894996643, 0.0], "max": [0.8892857432365417, 0.6803571581840515, 0.9375, 0.09749999642372131, 0.11142857372760773, 0.3117857277393341, 1.0], "mean": [0.030794987455010414, 0.05891142040491104, -0.008636673912405968, 0.005298763047903776, -0.0040109907276928425, -0.00492788664996624, 0.5320512652397156], "std": [0.2672272324562073, 0.3225606381893158, 0.3937760591506958, 0.03249769285321236, 0.05288286134600639, 0.0777767226099968, 0.49897170066833496], "count": [312]}, "timestamp": {"min": [0.0], "max": [15.55], "mean": [7.775], "std": [4.503308968599275], "count": [312]}, "frame_index": {"min": [0], "max": [311], "mean": [155.5], "std": [90.0661793719855], "count": [312]}, "episode_index": {"min": [373], "max": [373], "mean": [373.0], "std": [0.0], "count": [312]}, "index": {"min": [99790], "max": [100101], "mean": [99945.5], "std": [90.0661793719855], "count": [312]}, "task_index": {"min": [4], "max": [4], "mean": [4.0], "std": [0.0], "count": [312]}}} +{"episode_index": 374, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[0.9882352941176471]], [[1.0]]], "mean": [[[0.3504894786161535]], [[0.2713469411812577]], [[0.1706359671798407]]], "std": [[[0.2145642992259328]], [[0.15959952244058984]], [[0.10178914971957621]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[0.9803921568627451]], [[0.9803921568627451]], [[0.9764705882352941]]], "mean": [[[0.35453823912377447]], [[0.29911094396254595]], [[0.22441549802293967]]], "std": [[[0.1417030732582241]], [[0.13268501046263673]], [[0.14250775340752253]]], "count": [100]}, "observation.state": {"min": [-0.4335973858833313, -0.18311576545238495, 0.9880093336105347, 2.295675277709961, -2.1255202293395996, -0.30914658308029175, 0.014153028838336468, -0.03994927555322647], "max": [-0.12917745113372803, 0.18204614520072937, 1.2398414611816406, 3.1484577655792236, 0.010357418097555637, -0.07497807592153549, 0.03996805101633072, -0.014510761946439743], "mean": [-0.24240873754024506, 0.034456562250852585, 1.1442513465881348, 2.899897813796997, -1.0577319860458374, -0.17509077489376068, 0.026432445272803307, -0.026555826887488365], "std": [0.09366501122713089, 0.12844905257225037, 0.06978841871023178, 0.22378060221672058, 0.5857986211776733, 0.0710316151380539, 0.012298841029405594, 0.012132537551224232], "count": [173]}, "action": {"min": [-0.6616071462631226, -0.8732143044471741, -0.6857143044471741, -0.062142856419086456, -0.034285712987184525, -0.22857142984867096, 0.0], "max": [0.5651785731315613, 0.5008928775787354, 0.9107142686843872, 0.023571427911520004, 0.06428571790456772, -0.0, 1.0], "mean": [-0.10407721251249313, -0.057566046714782715, -0.07592899352312088, -0.006560693494975567, 0.005057801026850939, -0.07132124155759811, 0.4393063485622406], "std": [0.3103521466255188, 0.3406890034675598, 0.3905787765979767, 0.012590602040290833, 0.02148689329624176, 0.06660359352827072, 0.49630218744277954], "count": [173]}, "timestamp": {"min": [0.0], "max": [8.6], "mean": [4.3], "std": [2.4969981978367546], "count": [173]}, "frame_index": {"min": [0], "max": [172], "mean": [86.0], "std": [49.93996395673509], "count": [173]}, "episode_index": {"min": [374], "max": [374], "mean": [374.0], "std": [0.0], "count": [173]}, "index": {"min": [100102], "max": [100274], "mean": [100188.0], "std": [49.93996395673509], "count": [173]}, "task_index": {"min": [9], "max": [9], "mean": [9.0], "std": [0.0], "count": [173]}}} +{"episode_index": 375, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6161939607508041]], [[0.5703513363108915]], [[0.5177598553825827]]], "std": [[[0.2589116349444336]], [[0.24433257043692766]], [[0.2240414681155608]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5515960962632123]], [[0.5118990197275198]], [[0.4620217973297717]]], "std": [[[0.29801112505354743]], [[0.2772450940816339]], [[0.2630180165635937]]], "count": [100]}, "observation.state": {"min": [-0.21722707152366638, -0.08003262430429459, 0.9196580052375793, 2.2256686687469482, -2.5262091159820557, -0.8063331842422485, 0.002554242964833975, -0.039831340312957764], "max": [0.04555954784154892, 0.19436874985694885, 1.1660218238830566, 3.142340898513794, 0.0010159985395148396, 0.42403870820999146, 0.040009595453739166, -0.00159188371617347], "mean": [-0.026884881779551506, 0.03828271105885506, 1.0173836946487427, 2.577035903930664, -1.821410059928894, 0.003710092743858695, 0.026212308555841446, -0.025172609835863113], "std": [0.06268990784883499, 0.08444951474666595, 0.07546611875295639, 0.30885860323905945, 0.6138872504234314, 0.37368541955947876, 0.01630137488245964, 0.017670955508947372], "count": [255]}, "action": {"min": [-0.21964286267757416, -0.7660714387893677, -0.6348214149475098, -0.04928571358323097, -0.15321429073810577, -0.23571428656578064, 0.0], "max": [0.5249999761581421, 0.7767857313156128, 0.9133928418159485, 0.22285714745521545, 0.12964285910129547, 0.09214285761117935, 1.0], "mean": [0.05913864076137543, 0.12009453028440475, -0.10318280756473541, 0.029558828100562096, -0.003689076751470566, -0.0466848686337471, 0.615686297416687], "std": [0.18309368193149567, 0.37987983226776123, 0.3450070917606354, 0.05826553329825401, 0.05853331834077835, 0.082918681204319, 0.4864329695701599], "count": [255]}, "timestamp": {"min": [0.0], "max": [12.7], "mean": [6.35], "std": [3.68057966449127], "count": [255]}, "frame_index": {"min": [0], "max": [254], "mean": [127.0], "std": [73.6115932898254], "count": [255]}, "episode_index": {"min": [375], "max": [375], "mean": [375.0], "std": [0.0], "count": [255]}, "index": {"min": [100275], "max": [100529], "mean": [100402.0], "std": [73.6115932898254], "count": [255]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [255]}}} +{"episode_index": 376, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5903232966404335]], [[0.541775416953891]], [[0.49180775481579353]]], "std": [[[0.2822420251567746]], [[0.2555344971366194]], [[0.22613851903768653]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5652012233360141]], [[0.5264248956418505]], [[0.4758643451765472]]], "std": [[[0.2956827602344095]], [[0.27180178433139746]], [[0.2534683408915837]]], "count": [100]}, "observation.state": {"min": [-0.20559380948543549, -0.31070590019226074, 0.98494553565979, 2.313927173614502, -2.6793951988220215, -0.6947075128555298, 0.0010970650473609567, -0.03990457206964493], "max": [0.08157409727573395, 0.19973503053188324, 1.1838241815567017, 3.149949073791504, 0.0013156140921637416, -0.08859855681657791, 0.04001409560441971, -0.005877828225493431], "mean": [-0.05112933740019798, -0.02523627132177353, 1.0852181911468506, 2.7055881023406982, -2.1227211952209473, -0.3623446226119995, 0.02759465202689171, -0.028945162892341614], "std": [0.06873384118080139, 0.15528176724910736, 0.06318055093288422, 0.23524263501167297, 0.648576557636261, 0.15312142670154572, 0.015445227734744549, 0.014081837609410286], "count": [458]}, "action": {"min": [-0.4285714328289032, -0.8544642925262451, -0.4419642984867096, -0.12857143580913544, -0.10607142746448517, -0.3621428608894348, 0.0], "max": [0.5410714149475098, 0.7633928656578064, 0.5678571462631226, 0.08892857283353806, 0.1274999976158142, 0.2571428716182709, 1.0], "mean": [0.04092131927609444, -0.02960466779768467, -0.032072678208351135, 0.003574546193704009, 0.004369931295514107, -0.010590300895273685, 0.6266375780105591], "std": [0.218021959066391, 0.3584488034248352, 0.2538016736507416, 0.034594736993312836, 0.035545025020837784, 0.11787339299917221, 0.48369741439819336], "count": [458]}, "timestamp": {"min": [0.0], "max": [22.85], "mean": [11.425], "std": [6.6106448248260925], "count": [458]}, "frame_index": {"min": [0], "max": [457], "mean": [228.5], "std": [132.21289649652186], "count": [458]}, "episode_index": {"min": [376], "max": [376], "mean": [376.0], "std": [0.0], "count": [458]}, "index": {"min": [100530], "max": [100987], "mean": [100758.5], "std": [132.21289649652186], "count": [458]}, "task_index": {"min": [6], "max": [6], "mean": [6.0], "std": [0.0], "count": [458]}}} +{"episode_index": 377, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.6055065846162684]], [[0.5584886247223498]], [[0.5054609380983839]]], "std": [[[0.2653880126678343]], [[0.2506938680934818]], [[0.2305052709865522]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.5506669197830499]], [[0.5104059137082568]], [[0.4598532529344746]]], "std": [[[0.2997873232888551]], [[0.27854343112021673]], [[0.2639850846594196]]], "count": [100]}, "observation.state": {"min": [-0.21089908480644226, -0.08869048953056335, 0.9154967665672302, 2.445324182510376, -2.0357513427734375, -0.9719405770301819, -0.00010909121192526072, -0.039792176336050034], "max": [0.0027180155739188194, 0.18078242242336273, 1.1717876195907593, 3.139587163925171, 0.00018940067093353719, 0.7720076441764832, 0.0406825877726078, -0.0013717622496187687], "mean": [-0.05532144010066986, 0.01843017339706421, 1.0194827318191528, 2.80841326713562, -1.558537244796753, 0.04138337820768356, 0.026525137946009636, -0.02631402760744095], "std": [0.05057195946574211, 0.0897904559969902, 0.08182061463594437, 0.20072269439697266, 0.5645824074745178, 0.5041216015815735, 0.01730717346072197, 0.016914144158363342], "count": [229]}, "action": {"min": [-0.18214285373687744, -0.7419642806053162, -0.5651785731315613, -0.10821428894996643, -0.15964286029338837, -0.261428564786911, 0.0], "max": [0.6000000238418579, 0.7392857074737549, 0.8999999761581421, 0.22499999403953552, 0.14892856776714325, 0.2410714328289032, 1.0], "mean": [0.08836948126554489, 0.10473329573869705, -0.08197129517793655, 0.025714289397001266, 0.013718031346797943, -0.035450760275125504, 0.6506550312042236], "std": [0.15732429921627045, 0.3423983156681061, 0.34511932730674744, 0.06374964863061905, 0.05857843905687332, 0.09679687768220901, 0.47676342725753784], "count": [229]}, "timestamp": {"min": [0.0], "max": [11.4], "mean": [5.7], "std": [3.3052987762076818], "count": [229]}, "frame_index": {"min": [0], "max": [228], "mean": [114.0], "std": [66.10597552415364], "count": [229]}, "episode_index": {"min": [377], "max": [377], "mean": [377.0], "std": [0.0], "count": [229]}, "index": {"min": [100988], "max": [101216], "mean": [101102.0], "std": [66.10597552415364], "count": [229]}, "task_index": {"min": [8], "max": [8], "mean": [8.0], "std": [0.0], "count": [229]}}} +{"episode_index": 378, "stats": {"observation.images.wrist_image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.36101932121725644]], [[0.2933023442287071]], [[0.24694469556621476]]], "std": [[[0.16401965848568453]], [[0.15931327928711606]], [[0.1540587227415071]]], "count": [100]}, "observation.images.image": {"min": [[[0.0]], [[0.0]], [[0.0]]], "max": [[[1.0]], [[1.0]], [[1.0]]], "mean": [[[0.32848914471794577]], [[0.28438352697035846]], [[0.2514075532801011]]], "std": [[[0.16960849290605215]], [[0.18488840698585265]], [[0.19526501954498807]]], "count": [100]}, "observation.state": {"min": [-0.04665942117571831, -0.2284785658121109, 0.44603675603866577, 3.0767292976379395, -0.4171762764453888, -0.330203115940094, 0.019626585766673088, -0.04049881547689438], "max": [0.19563879072666168, 0.29308846592903137, 0.6880397200584412, 3.239165782928467, 0.4342692494392395, 0.20232413709163666, 0.03984415531158447, -0.018590785562992096], "mean": [0.07315496355295181, 0.05557345598936081, 0.6014407277107239, 3.1408956050872803, -0.059750523418188095, -0.03263572230935097, 0.029070384800434113, -0.02943652682006359], "std": [0.06224516034126282, 0.16985787451267242, 0.07554927468299866, 0.03931428864598274, 0.25186270475387573, 0.10841144621372223, 0.009086396545171738, 0.009120682254433632], "count": [252]}, "action": {"min": [-0.6991071701049805, -0.7848214507102966, -0.8678571581840515, -0.08571428805589676, -0.10178571194410324, -0.09642857313156128, 0.0], "max": [0.6830357313156128, 0.8651785850524902, 0.9375, 0.055714286863803864, 0.11571428924798965, 0.09964285790920258, 1.0], "mean": [-0.009406890720129013, 0.09832055121660233, -0.06319092214107513, -2.9762186386506073e-05, 0.008031461387872696, -0.0034481300972402096, 0.4960317313671112], "std": [0.3311055302619934, 0.4535048007965088, 0.49768906831741333, 0.022017084062099457, 0.04164794459939003, 0.0516410768032074, 0.4999840557575226], "count": [252]}, "timestamp": {"min": [0.0], "max": [12.55], "mean": [6.2749999999999995], "std": [3.6372780573756893], "count": [252]}, "frame_index": {"min": [0], "max": [251], "mean": [125.5], "std": [72.74556114751378], "count": [252]}, "episode_index": {"min": [378], "max": [378], "mean": [378.0], "std": [0.0], "count": [252]}, "index": {"min": [101217], "max": [101468], "mean": [101342.5], "std": [72.74556114751378], "count": [252]}, "task_index": {"min": [7], "max": [7], "mean": [7.0], "std": [0.0], "count": [252]}}} diff --git a/demo_data/libero_demo/meta/info.json b/demo_data/libero_demo/meta/info.json new file mode 100644 index 000000000..3d1994a23 --- /dev/null +++ b/demo_data/libero_demo/meta/info.json @@ -0,0 +1,134 @@ +{ + "codebase_version": "v2.1", + "robot_type": "franka", + "total_episodes": 5, + "total_frames": 1406, + "total_tasks": 3, + "total_videos": 10, + "total_chunks": 1, + "chunks_size": 1000, + "fps": 20, + "splits": { + "train": "0:5" + }, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "features": { + "observation.images.wrist_image": { + "dtype": "video", + "shape": [ + 256, + 256, + 3 + ], + "names": [ + "height", + "width", + "rgb" + ], + "info": { + "video.height": 256, + "video.width": 256, + "video.codec": "av1", + "video.pix_fmt": "yuv420p", + "video.is_depth_map": false, + "video.fps": 20, + "video.channels": 3, + "has_audio": false + } + }, + "observation.images.image": { + "dtype": "video", + "shape": [ + 256, + 256, + 3 + ], + "names": [ + "height", + "width", + "rgb" + ], + "info": { + "video.height": 256, + "video.width": 256, + "video.codec": "av1", + "video.pix_fmt": "yuv420p", + "video.is_depth_map": false, + "video.fps": 20, + "video.channels": 3, + "has_audio": false + } + }, + "observation.state": { + "dtype": "float32", + "shape": [ + 8 + ], + "names": { + "motors": [ + "x", + "y", + "z", + "axis_angle1", + "axis_angle2", + "axis_angle3", + "gripper", + "gripper" + ] + } + }, + "action": { + "dtype": "float32", + "shape": [ + 7 + ], + "names": { + "motors": [ + "x", + "y", + "z", + "axis_angle1", + "axis_angle2", + "axis_angle3", + "gripper" + ] + } + }, + "timestamp": { + "dtype": "float32", + "shape": [ + 1 + ], + "names": null + }, + "frame_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + }, + "episode_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + }, + "index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + }, + "task_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + } + } +} \ No newline at end of file diff --git a/demo_data/libero_demo/meta/modality.json b/demo_data/libero_demo/meta/modality.json new file mode 100644 index 000000000..a54063ee5 --- /dev/null +++ b/demo_data/libero_demo/meta/modality.json @@ -0,0 +1,75 @@ +{ + "state": { + "x": { + "start": 0, + "end": 1 + }, + "y": { + "start": 1, + "end": 2 + }, + "z": { + "start": 2, + "end": 3 + }, + "roll": { + "start": 3, + "end": 4 + }, + "pitch": { + "start": 4, + "end": 5 + }, + "yaw": { + "start": 5, + "end": 6 + }, + "gripper": { + "start": 6, + "end": 8 + } + }, + "action": { + "x": { + "start": 0, + "end": 1 + }, + "y": { + "start": 1, + "end": 2 + }, + "z": { + "start": 2, + "end": 3 + }, + "roll": { + "start": 3, + "end": 4 + }, + "pitch": { + "start": 4, + "end": 5 + }, + "yaw": { + "start": 5, + "end": 6 + }, + "gripper": { + "start": 6, + "end": 7 + } + }, + "video": { + "image": { + "original_key": "observation.images.image" + }, + "wrist_image": { + "original_key": "observation.images.wrist_image" + } + }, + "annotation": { + "human.action.task_description": { + "original_key": "task_index" + } + } +} diff --git a/demo_data/libero_demo/meta/stats.json b/demo_data/libero_demo/meta/stats.json new file mode 100644 index 000000000..3a5947255 --- /dev/null +++ b/demo_data/libero_demo/meta/stats.json @@ -0,0 +1,145 @@ +{ + "observation.state": { + "mean": [ + -0.04190658777952194, + 0.03539430722594261, + 0.8257141709327698, + 2.908308267593384, + -0.5562185049057007, + -0.16649018228054047, + 0.028316624462604523, + -0.028561657294631004 + ], + "std": [ + 0.10743364691734314, + 0.14424669742584229, + 0.2572328448295593, + 0.3441362977027893, + 1.234421730041504, + 0.3579835891723633, + 0.013308707624673843, + 0.013174631632864475 + ], + "min": [ + -0.4828203022480011, + -0.3255046010017395, + 0.445506751537323, + 1.1321442127227783, + -3.641430377960205, + -1.842738389968872, + -0.0010040868073701859, + -0.04111652821302414 + ], + "max": [ + 0.21031762659549713, + 0.39128610491752625, + 1.3332009315490723, + 3.6714255809783936, + 3.560650587081909, + 1.386339545249939, + 0.04160946607589722, + 0.0013633022317662835 + ], + "q01": [ + -0.3899900782108307, + -0.2838300323486328, + 0.44795057058334353, + 1.8810229921340942, + -2.886677579879761, + -1.1599004411697387, + 0.002066459748893976, + -0.04001387819647789 + ], + "q99": [ + 0.1530261474847791, + 0.32915401458740223, + 1.2546923208236693, + 3.303542451858519, + 2.7496529006957933, + 0.6893712210655194, + 0.040048558115959164, + -0.0017598449345678235 + ] + }, + "action": { + "mean": [ + 0.01820324920117855, + 0.05858374014496803, + -0.05592384561896324, + 0.004626928828656673, + 0.00289608770981431, + -0.007673131301999092, + 0.5457824468612671 + ], + "std": [ + 0.2825464606285095, + 0.35904666781425476, + 0.3673802614212036, + 0.03770702704787254, + 0.05429719388484955, + 0.08725254982709885, + 0.49815231561660767 + ], + "min": [ + -0.9375, + -0.9375, + -0.9375, + -0.23642857372760773, + -0.3053571283817291, + -0.3675000071525574, + 0.0 + ], + "max": [ + 0.9375, + 0.9375, + 0.9375, + 0.30000001192092896, + 0.29357144236564636, + 0.375, + 1.0 + ], + "q01": [ + -0.6348214149475098, + -0.7741071581840515, + -0.7633928656578064, + -0.09749999642372131, + -0.14819999992847435, + -0.2742857038974762, + 0.0 + ], + "q99": [ + 0.7714285850524902, + 0.8464285731315613, + 0.9375, + 0.13928571343421936, + 0.15964286029338837, + 0.3246428668498993, + 1.0 + ] + }, + "timestamp": { + "mean": [ + 6.968811511993408 + ], + "std": [ + 4.4205851554870605 + ], + "min": [ + 0.0 + ], + "max": [ + 25.200000762939453 + ], + "q01": [ + 0.10000000149011612 + ], + "q99": [ + 18.950000762939453 + ] + }, + "__fingerprints__": { + "observation.state": "sha256:cdd88a979a931bb5fa6173e45c09227ad312fdce23b82d46bc5b8804625e20f2", + "action": "sha256:d2f8f5abe287ccf4b95d35ca2e77bbd90271614529d6a07400cf6e1744952d42", + "timestamp": "sha256:f1ad41afdf47f1d901e4135b7d796d673d4aab32fba5472e282251bdaa1df87a" + } +} \ No newline at end of file diff --git a/demo_data/libero_demo/meta/tasks.jsonl b/demo_data/libero_demo/meta/tasks.jsonl new file mode 100644 index 000000000..d9fcdc5e2 --- /dev/null +++ b/demo_data/libero_demo/meta/tasks.jsonl @@ -0,0 +1,3 @@ +{"task_index": 0, "task": "put the white mug on the left plate and put the yellow and white mug on the right plate"} +{"task_index": 1, "task": "put the white mug on the plate and put the chocolate pudding to the right of the plate"} +{"task_index": 2, "task": "put the yellow and white mug in the microwave and close it"} diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000000.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000000.mp4 new file mode 100644 index 000000000..fef447059 --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c931377658e4dc3fd1412bf3fdf1034cae3f3314975d13769fe1e6afa4d63400 +size 694308 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000001.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000001.mp4 new file mode 100644 index 000000000..2bba15d2c --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000001.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39a8a52b6cd0d6b6782bf5b0379d794cbb3fb1591ccfb58fee2fadec2521a61f +size 968717 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000002.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000002.mp4 new file mode 100644 index 000000000..b0eb536b4 --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000002.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78a3e51504a08559e3491a3ccf4b5813511c23c6b92c1b63fe421a4a8ef4dee7 +size 1230789 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000003.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000003.mp4 new file mode 100644 index 000000000..6e706caea --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000003.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21012088a511afc32c0b290651852b193204cd6e7f8aaa1d2b6ecc03b90a9dc3 +size 1011324 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000004.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000004.mp4 new file mode 100644 index 000000000..870ef2383 --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.image/episode_000004.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1628ead60e38bcaaac3aa54f80fb3a2dbd65dcd57b2aeca3567f8b0bc026df0a +size 901710 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000000.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000000.mp4 new file mode 100644 index 000000000..0443e50ce --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbc756399adbd9a61f2e27d45a0be71f7761e27cc862cfd13303e318be290c30 +size 459971 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000001.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000001.mp4 new file mode 100644 index 000000000..a0d21b587 --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000001.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba29005129c92ecbac7db91bbcc089b6eb3e9072a8a72255aa353d9f0c6c74dd +size 663981 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000002.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000002.mp4 new file mode 100644 index 000000000..8766ebdfb --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000002.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86dfa08a45a3330adf4bcbbaa0555f9950d945ea5ab516db0c7464296504fd77 +size 653890 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000003.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000003.mp4 new file mode 100644 index 000000000..fe3f480ae --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000003.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3014e9283eb3923ff5396de35e2d0c3ed0c59e74b1885ac043df3d3e6b9de26c +size 479327 diff --git a/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000004.mp4 b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000004.mp4 new file mode 100644 index 000000000..cadf82dc1 --- /dev/null +++ b/demo_data/libero_demo/videos/chunk-000/observation.images.wrist_image/episode_000004.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74fb454476943866d9d5fb0792d28f99b04c68d7c2a855ef52e263d465ed2eb7 +size 648644 diff --git a/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000000.parquet b/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000000.parquet new file mode 100644 index 000000000..e2bc7d53e --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000000.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14ef3d742724ad34701136e1dd4709c965ae98066b2fc88a7a26e960d55520a8 +size 5733 diff --git a/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000001.parquet b/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000001.parquet new file mode 100644 index 000000000..cd270bb52 --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000001.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3abcb7f3f611a415afe5acd5e4b7d0d10e83726db76a1f9f24aacd3397a7c0af +size 7329 diff --git a/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000002.parquet b/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000002.parquet new file mode 100644 index 000000000..6c865c949 --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/data/chunk-000/episode_000002.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df1d7c6118a0042c9087a4670b795fe34760390fbc9f34ba2a4d422607d47b7b +size 7315 diff --git a/demo_data/simplerenv_bridge_sample/meta/episodes.jsonl b/demo_data/simplerenv_bridge_sample/meta/episodes.jsonl new file mode 100644 index 000000000..691a20a2a --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/meta/episodes.jsonl @@ -0,0 +1,3 @@ +{"episode_index": 0, "tasks": ["put small spoon from basket to tray"], "length": 26} +{"episode_index": 1, "tasks": ["put the blue cube on the right side of the table on top of the rectangular block"], "length": 45} +{"episode_index": 2, "tasks": ["put the red object into the pot"], "length": 45} diff --git a/demo_data/simplerenv_bridge_sample/meta/info.json b/demo_data/simplerenv_bridge_sample/meta/info.json new file mode 100644 index 000000000..10bec09f4 --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/meta/info.json @@ -0,0 +1,80 @@ +{ + "codebase_version": "v2.1", + "robot_type": "widowx", + "total_episodes": 3, + "total_frames": 116, + "fps": 5, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "chunks_size": 1000, + "splits": { + "train": "0:3" + }, + "features": { + "observation.images.image_0": { + "dtype": "video", + "shape": [ + 256, + 256, + 3 + ], + "names": [ + "height", + "width", + "rgb" + ], + "info": { + "video.fps": 5.0, + "video.height": 256, + "video.width": 256, + "video.channels": 3, + "video.codec": "av1", + "video.pix_fmt": "yuv420p", + "video.is_depth_map": false, + "has_audio": false + } + }, + "observation.state": { + "dtype": "float32", + "shape": [ + 8 + ], + "names": { + "motors": [ + "x", + "y", + "z", + "roll", + "pitch", + "yaw", + "pad", + "gripper" + ] + } + }, + "action": { + "dtype": "float32", + "shape": [ + 7 + ], + "names": { + "motors": [ + "x", + "y", + "z", + "roll", + "pitch", + "yaw", + "gripper" + ] + } + }, + "task_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + } + } +} \ No newline at end of file diff --git a/demo_data/simplerenv_bridge_sample/meta/modality.json b/demo_data/simplerenv_bridge_sample/meta/modality.json new file mode 100644 index 000000000..4a10aa6e6 --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/meta/modality.json @@ -0,0 +1,77 @@ +{ + "state": { + "x": { + "start": 0, + "end": 1 + }, + "y": { + "start": 1, + "end": 2 + }, + "z": { + "start": 2, + "end": 3 + }, + "roll": { + "start": 3, + "end": 4 + }, + "pitch": { + "start": 4, + "end": 5 + }, + "yaw": { + "start": 5, + "end": 6 + }, + "pad": { + "start": 6, + "end": 7 + }, + "gripper": { + "start": 7, + "end": 8 + } + }, + "action": { + "x": { + "start": 0, + "end": 1 + }, + "y": { + "start": 1, + "end": 2 + }, + "z": { + "start": 2, + "end": 3 + }, + "roll": { + "start": 3, + "end": 4 + }, + "pitch": { + "start": 4, + "end": 5 + }, + "yaw": { + "start": 5, + "end": 6 + }, + "gripper": { + "start": 6, + "end": 7 + } + }, + "video": { + "image_0": { + "original_key": "observation.images.image_0" + } + }, + "annotation": { + "human.action.task_description": { + "original_key": "task_index" + }, + "human.validity": {} + } +} diff --git a/demo_data/simplerenv_bridge_sample/meta/stats.json b/demo_data/simplerenv_bridge_sample/meta/stats.json new file mode 100644 index 000000000..d66ecaae4 --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/meta/stats.json @@ -0,0 +1,166 @@ +{ + "observation.images.image_0": { + "mean": [ + [ + [ + 0.4863039255142212 + ] + ], + [ + [ + 0.4242129623889923 + ] + ], + [ + [ + 0.38514387607574463 + ] + ] + ], + "std": [ + [ + [ + 0.2516295909881592 + ] + ], + [ + [ + 0.22463570535182953 + ] + ], + [ + [ + 0.22487124800682068 + ] + ] + ], + "max": [ + [ + [ + 1.0 + ] + ], + [ + [ + 1.0 + ] + ], + [ + [ + 1.0 + ] + ] + ], + "min": [ + [ + [ + 0.0 + ] + ], + [ + [ + 0.0 + ] + ], + [ + [ + 0.0 + ] + ] + ] + }, + "observation.state": { + "mean": [ + 0.3094516694545746, + 0.030725326389074326, + 0.06443972140550613, + 0.006490672472864389, + -0.07720066606998444, + 0.10766016691923141, + 0.0, + 0.7081289887428284 + ], + "std": [ + 0.060603249818086624, + 0.09195369482040405, + 0.05159375071525574, + 0.13121765851974487, + 0.16923990845680237, + 0.5787228941917419, + 0.0, + 0.3536507487297058 + ], + "max": [ + 0.5862360596656799, + 0.4034728705883026, + 0.3568263053894043, + 1.3517684936523438, + 1.570796251296997, + 3.141204357147217, + 0.0, + 1.1121242046356201 + ], + "min": [ + -0.04167502000927925, + -0.3563207685947418, + -0.15537554025650024, + -3.141592502593994, + -1.4992541074752808, + -3.14153790473938, + 0.0, + 0.04637829214334488 + ] + }, + "action": { + "mean": [ + 0.00022731945500709116, + 0.00013112067244946957, + -0.000126416256534867, + -0.00014410920266527683, + -0.0003903077158611268, + 0.00024063372984528542, + 0.5766201019287109 + ], + "std": [ + 0.009782361797988415, + 0.013714045286178589, + 0.012687387876212597, + 0.02848990075290203, + 0.030552811920642853, + 0.0775114968419075, + 0.4940855801105499 + ], + "max": [ + 0.41691166162490845, + 0.25864794850349426, + 0.21218234300613403, + 3.122201919555664, + 1.8618112802505493, + 6.272472858428955, + 1.0 + ], + "min": [ + -0.4007510244846344, + -0.13874775171279907, + -0.22553899884223938, + -3.2010786533355713, + -1.8618112802505493, + -6.279075622558594, + 0.0 + ] + }, + "task_index": { + "mean": [ + 4086.207275390625 + ], + "std": [ + 5938.9375 + ], + "max": [ + 19973.0 + ], + "min": [ + 0.0 + ] + } +} \ No newline at end of file diff --git a/demo_data/simplerenv_bridge_sample/meta/tasks.jsonl b/demo_data/simplerenv_bridge_sample/meta/tasks.jsonl new file mode 100644 index 000000000..684475b85 --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/meta/tasks.jsonl @@ -0,0 +1,3 @@ +{"task_index": 0, "task": "put small spoon from basket to tray"} +{"task_index": 1, "task": "put the blue cube on the right side of the table on top of the rectangular block"} +{"task_index": 2, "task": "put the red object into the pot"} diff --git a/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000000.mp4 b/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000000.mp4 new file mode 100644 index 000000000..d1898700d --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12b0e84423d31ff615262dc4943f56aa293cb0b4c0d193fc188916e629006ed1 +size 254345 diff --git a/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000001.mp4 b/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000001.mp4 new file mode 100644 index 000000000..c2399c17e --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000001.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7f9653cb282d67d1dde50c356dd5a0fdefee0777f7767232b04c7bde1e94a4e +size 292606 diff --git a/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000002.mp4 b/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000002.mp4 new file mode 100644 index 000000000..086a1d79b --- /dev/null +++ b/demo_data/simplerenv_bridge_sample/videos/chunk-000/observation.images.image_0/episode_000002.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ac0ebe099566dae4f41a83c67d215ac2dc47baabb8c5a4728c1b82273feb416 +size 258747 diff --git a/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000000.parquet b/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000000.parquet new file mode 100644 index 000000000..1d136c5d4 --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000000.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0679463c6513239667705989291dc789da672662eb89f4acb6074aa6c928540 +size 13330 diff --git a/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000001.parquet b/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000001.parquet new file mode 100644 index 000000000..ca179de13 --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000001.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60c6d685d3b49980d8a356296577d68358366a1f7df9e699eeef7013d2d4d155 +size 9068 diff --git a/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000002.parquet b/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000002.parquet new file mode 100644 index 000000000..9250c9eec --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/data/chunk-000/episode_000002.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eac136e2d6e0357c64cb267875c83553b1c30f9a0054a2257d205cd7844bcfcd +size 5697 diff --git a/demo_data/simplerenv_fractal_sample/meta/episodes.jsonl b/demo_data/simplerenv_fractal_sample/meta/episodes.jsonl new file mode 100644 index 000000000..e00d38408 --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/meta/episodes.jsonl @@ -0,0 +1,3 @@ +{"episode_index": 0, "tasks": ["pick rxbar chocolate from bottom drawer and place on counter"], "length": 115} +{"episode_index": 1, "tasks": ["close middle drawer"], "length": 66} +{"episode_index": 2, "tasks": ["pick apple from white bowl"], "length": 25} diff --git a/demo_data/simplerenv_fractal_sample/meta/info.json b/demo_data/simplerenv_fractal_sample/meta/info.json new file mode 100644 index 000000000..50d1a5718 --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/meta/info.json @@ -0,0 +1,80 @@ +{ + "codebase_version": "v2.1", + "robot_type": "google_robot", + "total_episodes": 3, + "total_frames": 206, + "fps": 3, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "chunks_size": 1000, + "splits": { + "train": "0:3" + }, + "features": { + "observation.images.image": { + "dtype": "video", + "shape": [ + 256, + 320, + 3 + ], + "names": [ + "height", + "width", + "rgb" + ], + "info": { + "video.fps": 3.0, + "video.height": 256, + "video.width": 320, + "video.channels": 3, + "video.codec": "av1", + "video.pix_fmt": "yuv420p", + "video.is_depth_map": false, + "has_audio": false + } + }, + "observation.state": { + "dtype": "float32", + "shape": [ + 8 + ], + "names": { + "motors": [ + "x", + "y", + "z", + "rx", + "ry", + "rz", + "rw", + "gripper" + ] + } + }, + "action": { + "dtype": "float32", + "shape": [ + 7 + ], + "names": { + "motors": [ + "x", + "y", + "z", + "roll", + "pitch", + "yaw", + "gripper" + ] + } + }, + "task_index": { + "dtype": "int64", + "shape": [ + 1 + ], + "names": null + } + } +} \ No newline at end of file diff --git a/demo_data/simplerenv_fractal_sample/meta/modality.json b/demo_data/simplerenv_fractal_sample/meta/modality.json new file mode 100644 index 000000000..838de09b9 --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/meta/modality.json @@ -0,0 +1,77 @@ +{ + "state": { + "x": { + "start": 0, + "end": 1 + }, + "y": { + "start": 1, + "end": 2 + }, + "z": { + "start": 2, + "end": 3 + }, + "rx": { + "start": 3, + "end": 4 + }, + "ry": { + "start": 4, + "end": 5 + }, + "rz": { + "start": 5, + "end": 6 + }, + "rw": { + "start": 6, + "end": 7 + }, + "gripper": { + "start": 7, + "end": 8 + } + }, + "action": { + "x": { + "start": 0, + "end": 1 + }, + "y": { + "start": 1, + "end": 2 + }, + "z": { + "start": 2, + "end": 3 + }, + "roll": { + "start": 3, + "end": 4 + }, + "pitch": { + "start": 4, + "end": 5 + }, + "yaw": { + "start": 5, + "end": 6 + }, + "gripper": { + "start": 6, + "end": 7 + } + }, + "video": { + "image": { + "original_key": "observation.images.image" + } + }, + "annotation": { + "human.action.task_description": { + "original_key": "task_index" + }, + "human.validity": {} + } +} \ No newline at end of file diff --git a/demo_data/simplerenv_fractal_sample/meta/stats.json b/demo_data/simplerenv_fractal_sample/meta/stats.json new file mode 100644 index 000000000..bd9a0ad7d --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/meta/stats.json @@ -0,0 +1,204 @@ +{ + "observation.images.image": { + "mean": [ + [ + [ + 0.3916258215904236 + ] + ], + [ + [ + 0.2810230851173401 + ] + ], + [ + [ + 0.20288515090942383 + ] + ] + ], + "std": [ + [ + [ + 0.23658353090286255 + ] + ], + [ + [ + 0.18645426630973816 + ] + ], + [ + [ + 0.15353208780288696 + ] + ] + ], + "max": [ + [ + [ + 1.0 + ] + ], + [ + [ + 1.0 + ] + ], + [ + [ + 1.0 + ] + ] + ], + "min": [ + [ + [ + 0.0 + ] + ], + [ + [ + 0.0 + ] + ], + [ + [ + 0.0 + ] + ] + ] + }, + "observation.state": { + "mean": [ + 0.5582137703895569, + -0.08324320614337921, + 0.7708260416984558, + -0.24752581119537354, + 0.4959894120693207, + 0.09255821257829666, + 0.2094191163778305, + 0.4261956214904785 + ], + "std": [ + 0.1244034469127655, + 0.1157137006521225, + 0.24589404463768005, + 0.5132336616516113, + 0.5223421454429626, + 0.1666596233844757, + 0.27617162466049194, + 0.4538723826408386 + ], + "max": [ + 1.0534898042678833, + 0.48018959164619446, + 1.6896663904190063, + 0.9999993443489075, + 0.9999874830245972, + 0.9554369449615479, + 0.9914546012878418, + 1.0 + ], + "min": [ + -0.4436439275741577, + -0.9970501065254211, + -0.006579156965017319, + -0.8643477559089661, + -0.7079970240592957, + -0.7688722014427185, + -0.4999994933605194, + 0.0 + ], + "q01": [ + 0.32481380939483645, + -0.28334290891885755, + 0.14107070609927178, + -0.686474204659462, + -0.6808923494815826, + -0.36045596331357954, + -0.454380963742733, + 0.0 + ], + "q99": [ + 0.8750156319141384, + 0.21247054174542404, + 1.0727112340927123, + 0.9377871316671368, + 0.9563051050901409, + 0.45990042358636823, + 0.7216041100025177, + 1.0 + ] + }, + "action": { + "mean": [ + 0.006986717693507671, + 0.006266412790864706, + -0.012625569477677345, + 0.04333455115556717, + -0.005755839869379997, + 0.0009133723797276616, + 0.5352957248687744 + ], + "std": [ + 0.06943319737911224, + 0.05987567827105522, + 0.07384292781352997, + 0.1569768637418747, + 0.1319238394498825, + 0.14632175862789154, + 0.49868619441986084 + ], + "max": [ + 2.9984593391418457, + 22.09052848815918, + 2.7507524490356445, + 1.570636510848999, + 1.5321086645126343, + 1.5691522359848022, + 1.0 + ], + "min": [ + -2.0204520225524902, + -5.497899532318115, + -2.031663417816162, + -1.569917917251587, + -1.569892168045044, + -1.570419430732727, + 0.0 + ], + "q01": [ + -0.22453527510166169, + -0.14820013284683228, + -0.231589707583189, + -0.3517994859814644, + -0.4193011274933815, + -0.43643461108207704, + 0.0 + ], + "q99": [ + 0.17824687153100965, + 0.14938379630446405, + 0.21842354819178575, + 0.5892666035890578, + 0.35272657424211445, + 0.44796681255102094, + 1.0 + ] + }, + "task_index": { + "mean": [ + 143.40396118164062 + ], + "std": [ + 132.5878143310547 + ], + "max": [ + 598.0 + ], + "min": [ + 0.0 + ] + } +} \ No newline at end of file diff --git a/demo_data/simplerenv_fractal_sample/meta/tasks.jsonl b/demo_data/simplerenv_fractal_sample/meta/tasks.jsonl new file mode 100644 index 000000000..b51998a6e --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/meta/tasks.jsonl @@ -0,0 +1,3 @@ +{"task_index": 0, "task": "pick rxbar chocolate from bottom drawer and place on counter"} +{"task_index": 1, "task": "close middle drawer"} +{"task_index": 2, "task": "pick apple from white bowl"} diff --git a/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000000.mp4 b/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000000.mp4 new file mode 100644 index 000000000..88e4397cc --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000000.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6c2199ba73efdf77fce1584073009837efba58adff350d55033a008c2e38483 +size 594362 diff --git a/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000001.mp4 b/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000001.mp4 new file mode 100644 index 000000000..b2218701d --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000001.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e8bf7a11323bb8b0f24827f246107bcaff72127b24c1822a48c0352abf718e8 +size 405098 diff --git a/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000002.mp4 b/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000002.mp4 new file mode 100644 index 000000000..6e3cf55e7 --- /dev/null +++ b/demo_data/simplerenv_fractal_sample/videos/chunk-000/observation.images.image/episode_000002.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:175e78e5bcb6ae165dbce5bb40de3c92947df4a555e62eb20d1225b6c6c96244 +size 122317 diff --git a/docker/.dockerignore b/docker/.dockerignore new file mode 100644 index 000000000..94e9edce6 --- /dev/null +++ b/docker/.dockerignore @@ -0,0 +1,17 @@ +# Exclude large/unnecessary files from the Docker build context. +# The build context is docker/, and build.sh copies the repo into docker/src/gr00t/. +# These patterns filter out junk that gets copied in. + +src/gr00t/.venv/ +src/gr00t/.git/ +src/gr00t/.pytest_cache/ +src/gr00t/.mypy_cache/ +src/gr00t/.ruff_cache/ +src/gr00t/logs/ +src/gr00t/dist/ +src/gr00t/docker/src/ +src/gr00t/gr00t_trt_deployment/ +src/gr00t/gr00tmetricbenchmarks/ +**/__pycache__/ +**/*.pyc +**/*.egg-info/ diff --git a/docker/Dockerfile b/docker/Dockerfile index e2fe28ac8..34fe6d6f1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,37 +1,212 @@ -FROM nvcr.io/nvidia/pytorch:25.04-py3 +# syntax=docker/dockerfile:1 +# GR00T Docker image (x86_64 + aarch64) +# +# Single Dockerfile for both architectures. flash-attn is installed from +# official cu12torch2.9 cp312 release wheels (x86_64 + aarch64); on aarch64 +# (GB200, Grace Hopper) torchcodec is installed from the prebuilt wheel under +# scripts/deployment/dgpu/wheels/ via a pyproject.toml path source. If that +# wheel is missing, the Docker build bootstraps it from source first. +# +# Build: +# docker build -f docker/Dockerfile -t gr00t . +# +# Run: +# docker run -it --rm --gpus all --ipc=host gr00t -ENV NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute +FROM nvidia/cuda:12.8.0-devel-ubuntu24.04 -RUN apt-get update && apt-get install -y \ - build-essential yasm cmake libtool git pkg-config \ - libass-dev libfreetype6-dev libvorbis-dev \ - autoconf automake texinfo tmux ffmpeg +SHELL ["/bin/bash", "-c"] -RUN pip install --upgrade pip setuptools -RUN pip install uv -RUN sed -i s/dill==0.3.9/dill==0.3.8/g /etc/pip/constraint.txt -RUN sed -i s/scipy==1.15.2/scipy==1.15.3/g /etc/pip/constraint.txt -RUN pip install imageio h5py boto3 transformers[torch] deepspeed timm peft diffusers wandb tianshou dm_tree openai albumentations==1.4.18 decord==0.6.0 torchcodec==0.4.0 -RUN mkdir -p /opt -RUN cd /opt && git clone https://github.com/facebookresearch/pytorch3d.git -RUN cd /opt/pytorch3d && pip install . +ENV DEBIAN_FRONTEND=noninteractive \ + NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute \ + GR00T_GLOBAL_VENV=/opt/gr00t-venv \ + UV_PROJECT_ENVIRONMENT=/opt/gr00t-venv \ + PYTHON=/usr/bin/python \ + CUDA_HOME=/usr/local/cuda \ + PATH=/usr/local/cuda/bin:${PATH} \ + LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH} -COPY src/gr00t/ /workspace/gr00t/ -RUN cd /workspace/gr00t && uv sync && uv pip install -e . +# System dependencies +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked < deadsnakes. +add_python310_retry() { + for attempt in 1 2 3 4 5; do + if add-apt-repository -y ppa:deadsnakes/ppa \ + && apt_update \ + && apt-get "${APT_RETRY_OPTS[@]}" install -y --no-install-recommends \ + python3.10 \ + python3.10-venv \ + python3.10-dev; then + return 0 + fi + if [ "$attempt" != "5" ]; then + rm -rf /var/lib/apt/lists/* + apt_update || true + sleep $((attempt * 10)) + fi + done + return 1 +} + +add_python310_retry + +pip_install_retry() { + for attempt in 1 2 3 4 5; do + # Ubuntu 24.04's system Python is PEP 668 "externally managed"; this only + # bootstraps pip/setuptools/wheel before uv builds its own venv, so opting + # out is safe inside the image. --ignore-installed avoids trying to + # uninstall debian's pip 24.0 (no RECORD file -> "Cannot uninstall"). + if python -m pip install --upgrade --retries 5 --break-system-packages --ignore-installed pip setuptools wheel; then + return 0 + fi + sleep $((attempt * 10)) + done + return 1 +} + +pip_install_retry + +curl --retry 5 --retry-delay 10 --retry-max-time 300 -LsSf https://astral.sh/uv/0.8.14/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh +INNEREOF + +WORKDIR /tmp/gr00t-venv-build + +# Install Python dependencies from lockfile +# The wheels/ dir must be present before `uv sync` because pyproject.toml +# references the aarch64 torchcodec wheel there as a path source. +COPY pyproject.toml uv.lock ./ +COPY scripts/deployment/dgpu/bootstrap_wheels.sh ./scripts/deployment/dgpu/bootstrap_wheels.sh +COPY scripts/deployment/dgpu/wheels/ ./scripts/deployment/dgpu/wheels/ + +RUN < "${GR00T_GLOBAL_VENV}/.gr00t-uv-lock.sha256" +mkdir -p /opt/gr00t-image-metadata +cp pyproject.toml uv.lock /opt/gr00t-image-metadata/ +cd / +rm -rf /tmp/gr00t-venv-build +INNEREOF + +WORKDIR / +RUN mkdir -p /workspace && ln -sfn "${GR00T_GLOBAL_VENV}" /workspace/.venv +WORKDIR /workspace + +ENV PATH="${GR00T_GLOBAL_VENV}/bin:${PATH}" \ + VIRTUAL_ENV="${GR00T_GLOBAL_VENV}" + +# EGL/Vulkan setup for headless rendering (MuJoCo, PyOpenGL) RUN mkdir -p /usr/share/glvnd/egl_vendor.d && \ - cat >/usr/share/glvnd/egl_vendor.d/10_nvidia.json <<'EOF' + cat >/usr/share/glvnd/egl_vendor.d/10_nvidia.json <<'JSONEOF' { "file_format_version" : "1.0.0", "ICD" : { "library_path" : "libEGL_nvidia.so.0" } } -EOF +JSONEOF RUN mkdir -p /usr/share/vulkan/icd.d && \ - cat >/usr/share/vulkan/icd.d/nvidia_icd.json <<'EOF' + cat >/usr/share/vulkan/icd.d/nvidia_icd.json <<'JSONEOF' { "file_format_version": "1.0.0", "ICD": { @@ -39,4 +214,15 @@ RUN mkdir -p /usr/share/vulkan/icd.d && \ "api_version": "1.2.140" } } -EOF \ No newline at end of file +JSONEOF + +ENV MUJOCO_GL="egl" \ + PYOPENGL_PLATFORM="egl" \ + __EGL_VENDOR_LIBRARY_FILENAMES="/usr/share/glvnd/egl_vendor.d/10_nvidia.json" + +# aarch64 torchcodec is installed from the repo-local wheel by `uv sync` above +# via a pyproject.toml path source; the wheel is built from source by +# bootstrap_wheels.sh before sync (then committed back) if missing. flash-attn +# comes from official release URLs — no source build needed. + +CMD ["/bin/bash"] diff --git a/docker/Dockerfile.groot b/docker/Dockerfile.groot deleted file mode 100644 index 164de82c4..000000000 --- a/docker/Dockerfile.groot +++ /dev/null @@ -1,64 +0,0 @@ -FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04 - -# Copy uv for fast Python package management -COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ - -# Install minimal system dependencies -RUN apt-get update && apt-get install -y \ - build-essential \ - curl \ - git \ - ffmpeg \ - libturbojpeg \ - libsm6 \ - libxext6 \ - libegl1 \ - libgles2 \ - libosmesa6-dev \ - libglew-dev \ - && rm -rf /var/lib/apt/lists/* - -# Create NVIDIA EGL vendor configuration file -# This is required for libglvnd to find NVIDIA's EGL implementation -RUN mkdir -p /usr/share/glvnd/egl_vendor.d/ && \ -echo '{\n "file_format_version" : "1.0.0",\n "ICD" : {\n "library_path" : "libEGL_nvidia.so.0"\n }\n}' \ -> /usr/share/glvnd/egl_vendor.d/10_nvidia.json - -# Configure uv and pip timeouts -ENV UV_LINK_MODE=copy -ENV PIP_DEFAULT_TIMEOUT=600 -ENV UV_HTTP_TIMEOUT=600 - -# Create Python virtual environment for Python 3.10 (required by gr00t N1.6) -RUN uv venv --python 3.10 - -# Activate venv for all subsequent commands and docker run -ENV VIRTUAL_ENV=/.venv -ENV PATH=$VIRTUAL_ENV/bin:$PATH - -WORKDIR /gr00t - -# Copy only pyproject.toml first for dependency installation -COPY pyproject.toml . - -# Install all dependencies in a single layer: -# 1. Main deps from pyproject.toml (includes torch) -# 2. flash-attn needs torch at build time, so --no-build-isolation -# 3. pytorch3d from git also needs torch at build time -RUN --mount=type=cache,target=/root/.cache/uv \ - uv pip install -e . && \ - uv pip install --no-build-isolation flash-attn && \ - uv pip install --no-build-isolation "git+https://github.com/facebookresearch/pytorch3d.git@stable" - -# Copy the entire gr00t directory (overwrites the minimal structure) -# This won't invalidate pytorch3d unless pyproject.toml changed -COPY . . - -# Reinstall in editable mode to ensure proper linking with the full source code -RUN uv pip install --no-deps -e . - -# Set Python path -ENV PYTHONPATH=/gr00t - -# Default command -CMD ["bash"] diff --git a/docker/Makefile b/docker/Makefile deleted file mode 100644 index b3d82dad8..000000000 --- a/docker/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -.PHONY: all build tag push clean prune help - -# Image configuration -IMAGE_NAME_GROOT := positro/gr00t-base - -# Extract version from pyproject.toml (first literal version entry) -VERSION := $(shell sed -n 's/^version = "\([^"]*\)"/\1/p' ../pyproject.toml | head -n 1) - -GIT_SHA := $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown") - -REGISTRY_URL ?= docker.io - -TAG_GROOT_LATEST := $(IMAGE_NAME_GROOT):latest -TAG_GROOT_VERSION := $(IMAGE_NAME_GROOT):v$(VERSION) -TAG_GROOT_SHA := $(IMAGE_NAME_GROOT):$(GIT_SHA) -LOCAL_TAG_GROOT := $(IMAGE_NAME_GROOT):local - -help: - @echo "gr00t Groot Docker Build System" - @echo "" - @echo "Configuration:" - @echo " Groot Image: $(IMAGE_NAME_GROOT)" - @echo " Version: $(VERSION)" - @echo " Git SHA: $(GIT_SHA)" - @echo " Registry URL: $(REGISTRY_URL)" - @echo "" - @echo "Targets:" - @echo " make build Build the groot image" - @echo " make tag Tag the groot image" - @echo " make push Push groot tags to Docker Hub" - @echo " make clean Remove local groot images" - @echo " make prune Remove dangling/unused Docker images" - @echo " make help Show this help message" - @echo "" - -build: - @echo "Building $(IMAGE_NAME_GROOT) image..." - @if [ -z "$(VERSION)" ]; then \ - echo "Error: Could not extract version from pyproject.toml"; \ - exit 1; \ - fi - docker build --platform linux/amd64 \ - -f Dockerfile.groot \ - -t $(LOCAL_TAG_GROOT) .. - -tag: build - @echo "Tagging groot image with multiple tags..." - docker tag $(LOCAL_TAG_GROOT) $(TAG_GROOT_LATEST) - docker tag $(LOCAL_TAG_GROOT) $(TAG_GROOT_VERSION) - docker tag $(LOCAL_TAG_GROOT) $(TAG_GROOT_SHA) - @echo "Tagged with:" - @echo " - $(TAG_GROOT_LATEST)" - @echo " - $(TAG_GROOT_VERSION)" - @echo " - $(TAG_GROOT_SHA)" - -push: tag - @echo "Pushing groot images to Docker Hub..." - docker push $(TAG_GROOT_LATEST) - docker push $(TAG_GROOT_VERSION) - docker push $(TAG_GROOT_SHA) - @echo "" - @echo "Successfully pushed groot images to Docker Hub!" - @echo "To use on cloud instances, set:" - @echo " export IMAGE_REGISTRY=$(REGISTRY_URL)/" - -all: push - -clean: - @echo "Removing local groot images..." - -docker rmi $(LOCAL_TAG_GROOT) - -docker rmi $(TAG_GROOT_LATEST) - -docker rmi $(TAG_GROOT_VERSION) - -docker rmi $(TAG_GROOT_SHA) - @echo "Cleanup complete." - -prune: - @echo "Pruning dangling and unused Docker images..." - docker image prune -f - @echo "Prune complete." diff --git a/docker/README.md b/docker/README.md index 600ee7620..e4c62d7c7 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,10 +1,10 @@ # Docker Setup for NVIDIA Isaac GR00T -Docker configuration for building and running a containerized GR00T environment with all dependencies pre-installed. The image (`gr00t-dev`) is based on NVIDIA's PyTorch container and includes CUDA support, Python dependencies, PyTorch3D, and the GR00T codebase. +Docker configuration for building and running a containerized GR00T environment with all dependencies pre-installed. A single `Dockerfile` supports both x86_64 and aarch64 (GB200, Grace Hopper) architectures. On aarch64, `torchcodec` is installed from the prebuilt wheel shipped under `scripts/deployment/dgpu/wheels/`; the build falls back to a source compile only if the wheel is missing. ## Prerequisites -- Docker (version 20.10+) +- Docker (version 20.10+) and [perform post-installation setup](https://docs.docker.com/engine/install/linux-postinstall/) so you can run Docker commands without sudo. If you skip this setup, prefix the Docker commands below with `sudo`. - NVIDIA Container Toolkit ([installation guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html)) - NVIDIA GPU with compatible drivers - Bash shell @@ -12,29 +12,88 @@ Docker configuration for building and running a containerized GR00T environment ## Building the Docker Image -Make sure you are using a bash environment: +From the repository root: ```bash -sudo bash build.sh +bash docker/build.sh ``` -The build process uses `nvcr.io/nvidia/pytorch:25.04-py3` as the base image, installs all dependencies, and sets up the GR00T codebase at `/workspace/gr00t/`. +This builds from `nvidia/cuda:12.8.0-devel-ubuntu24.04` and installs all dependencies into `/opt/gr00t-venv`. The image does not include a working source checkout; for normal use, start the image and then clone or pull the repo you want to run inside the container. ## Running the Container -**Interactive shell (uses code baked into image):** +**Recommended workflow: run the image, then clone or update the repo inside it.** + +Start an interactive shell: + +```bash +docker run -it --rm --gpus all \ + --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \ + gr00t +``` + +Then, inside the container: + +```bash +git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T /workspace/Isaac-GR00T +cd /workspace/Isaac-GR00T +export PYTHONPATH="$PWD${PYTHONPATH:+:$PYTHONPATH}" +python -c "import gr00t; print('GR00T ready')" +``` + +The image venv is active by default (`/opt/gr00t-venv`; `/workspace/.venv` is a compatibility symlink), and uv is configured with `UV_PROJECT_ENVIRONMENT=/opt/gr00t-venv`. After setting `PYTHONPATH` to the checked-out repo, both `python ...` and `uv run ...` use the global image venv instead of creating a checkout-local `.venv`. If you are working on an existing checkout in the container, run `git pull --ff-only` from that checkout instead of cloning again. + +The global venv records the `uv.lock` hash it was built from. If your checked-out repo uses a different lockfile, create a checkout-local venv before running commands. Reusing a uv cache keeps this path from starting cold: + +```bash +export UV_CACHE_DIR="${UV_CACHE_DIR:-/workspace/uv-cache}" +export UV_LINK_MODE=copy +UV_PROJECT_ENVIRONMENT="$PWD/.venv" uv sync +source .venv/bin/activate +``` + +Do not run a bare `uv sync` unless you intend to update the global image venv. Use `UV_PROJECT_ENVIRONMENT="$PWD/.venv" uv sync` when you want an isolated per-checkout environment. + +Avoid bind-mounting over `/workspace`, because that can hide the image's `/workspace/.venv` compatibility symlink. If you need to mount local source for live editing, mount it under a subdirectory: + ```bash -sudo docker run -it --rm --gpus all gr00t-dev /bin/bash +docker run -it --rm --gpus all \ + --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \ + -v "$(pwd):/workspace/Isaac-GR00T" \ + gr00t bash -c 'cd /workspace/Isaac-GR00T && export PYTHONPATH="$PWD${PYTHONPATH:+:$PYTHONPATH}" && bash' ``` -**Development mode (mounts local codebase for live editing):** +## Edge Device Containers + +### Thor Container (Jetson Thor / CUDA 13) + +The `gr00t-thor` image is built from `scripts/deployment/thor/Dockerfile` for Jetson Thor with CUDA 13 support: + +```bash +bash docker/build.sh --profile=thor +``` + +For full Thor usage instructions (inference, benchmarks, bare metal setup), see the [Deployment & Inference Guide](../scripts/deployment/README.md#jetson-thor-setup). + +### Spark Container (DGX Spark / CUDA 13) + +The `gr00t-spark` image is built from `scripts/deployment/spark/Dockerfile` for DGX Spark with CUDA 13 support: + +```bash +bash docker/build.sh --profile=spark +``` + +For full Spark usage instructions (inference, benchmarks, bare metal setup), see the [Deployment & Inference Guide](../scripts/deployment/README.md#dgx-spark-setup). + +### Orin Container (Jetson Orin / CUDA 13.2) + +The `gr00t-orin` image is built from `scripts/deployment/orin/Dockerfile` for Jetson Orin (JetPack 7.2, CUDA 13.2, Python 3.12): + ```bash -sudo docker run -it --rm --gpus all \ - -v $(pwd)/..:/workspace/gr00t \ - gr00t-dev /bin/bash +bash docker/build.sh --profile=orin ``` -**Run this from the `docker/` directory. Changes to your local GR00T code will be immediately reflected inside the container.** +For full Orin usage instructions (inference, benchmarks, bare metal setup), see the [Deployment & Inference Guide](../scripts/deployment/README.md#jetson-orin-setup). ## Troubleshooting @@ -49,4 +108,4 @@ sudo docker run -it --rm --gpus all \ **Build failures:** - Check disk space: `df -h` - Clean Docker: `docker system prune -a` -- Rebuild: `sudo bash build.sh --no-cache` +- Rebuild: `bash docker/build.sh --no-cache` diff --git a/docker/build.sh b/docker/build.sh old mode 100644 new mode 100755 index db80f085a..6dcddfd76 --- a/docker/build.sh +++ b/docker/build.sh @@ -2,26 +2,18 @@ set -x -image_name="gr00t-dev" - export DOCKER_BUILDKIT=1 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +REPO_ROOT="$DIR/.." -# Copy gr00t directory to src/gr00t -mkdir -p $DIR/src -rm -rf /tmp/gr00t - -echo $DIR - -cp -r $DIR/../ /tmp/gr00t -cp -r /tmp/gr00t $DIR/src/ - -export DOCKER_BUILDKIT=1 - -# Filter out --fix flag and other script-specific flags before passing to docker +# Parse --profile and filter script-specific flags before passing to docker +profile="default" docker_args=() for arg in "$@"; do case $arg in + --profile=*) + profile="${arg#--profile=}" + ;; --fix) # Skip --fix flag as it's not a valid docker build flag ;; @@ -31,10 +23,32 @@ for arg in "$@"; do esac done -docker build "${docker_args[@]}" \ - --platform linux/amd64 \ - --network host \ - -t $image_name $DIR \ - && echo Image $image_name BUILT SUCCESSFULLY - -rm -rf $DIR/src/ \ No newline at end of file +if [ "$profile" = "thor" ]; then + image_name="gr00t-thor" + docker build "${docker_args[@]}" \ + --network host \ + -f "$REPO_ROOT/scripts/deployment/thor/Dockerfile" \ + -t "$image_name" "$REPO_ROOT" \ + && echo "Image $image_name BUILT SUCCESSFULLY" +elif [ "$profile" = "spark" ]; then + image_name="gr00t-spark" + docker build "${docker_args[@]}" \ + --network host \ + -f "$REPO_ROOT/scripts/deployment/spark/Dockerfile" \ + -t "$image_name" "$REPO_ROOT" \ + && echo "Image $image_name BUILT SUCCESSFULLY" +elif [ "$profile" = "orin" ]; then + image_name="gr00t-orin" + docker build "${docker_args[@]}" \ + --network host \ + -f "$REPO_ROOT/scripts/deployment/orin/Dockerfile" \ + -t "$image_name" "$REPO_ROOT" \ + && echo "Image $image_name BUILT SUCCESSFULLY" +else + image_name="gr00t" + docker build "${docker_args[@]}" \ + --network host \ + -f "$DIR/Dockerfile" \ + -t "$image_name" "$REPO_ROOT" \ + && echo "Image $image_name BUILT SUCCESSFULLY" +fi diff --git a/examples/BEHAVIOR/README.md b/examples/BEHAVIOR/README.md deleted file mode 100644 index eea9f3b10..000000000 --- a/examples/BEHAVIOR/README.md +++ /dev/null @@ -1,196 +0,0 @@ -# BEHAVIOR Benchmark Results - -
- -
- -This is a benchmark of behavior1k from https://behavior.stanford.edu/ - -We provide a checkpoint: `nvidia/GR00T-N1.6-BEHAVIOR1k` which is post-trained on all 50 tasks. You can use this checkpoint for evaluation. - -## Multi-task (50 tasks) performance -We provide a base model pre-trained on all 50 tasks. It can do reasonably good on all tasks and serves as a good starting point for post-training. Here we use the metric `Task Progress`, which is a denser metric than `Q Score`. - -| Task Name | Task Progress N1.6 | Task Progress Pi0.5 | -| --- | --- | --- | -| sim_behavior_r1_pro/clean_a_trumpet | 60.00% | 8.00% | -| sim_behavior_r1_pro/getting_organized_for_work | 53.57% | 18.57% | -| sim_behavior_r1_pro/boxing_books_up_for_storage | 51.54% | 50.00% | -| sim_behavior_r1_pro/attach_a_camera_to_a_tripod | 46.00% | 34.00% | -| sim_behavior_r1_pro/make_microwave_popcorn | 45.00% | 17.50% | -| sim_behavior_r1_pro/picking_up_trash | 44.87% | 31.54% | -| sim_behavior_r1_pro/turning_on_radio | 43.33% | 16.67% | -| sim_behavior_r1_pro/clearing_food_from_table_into_fridge | 42.31% | 0.00% | -| sim_behavior_r1_pro/canning_food | 37.65% | 0.00% | -| sim_behavior_r1_pro/putting_away_Halloween_decorations | 34.74% | 0.00% | -| sim_behavior_r1_pro/set_up_a_coffee_station_in_your_kitchen | 34.55% | 7.27% | -| sim_behavior_r1_pro/collecting_childrens_toys | 33.81% | 20.48% | -| sim_behavior_r1_pro/preparing_lunch_box | 33.75% | 5.62% | -| sim_behavior_r1_pro/cook_bacon | 33.57% | 20.71% | -| sim_behavior_r1_pro/can_meat | 32.50% | 28.50% | -| sim_behavior_r1_pro/cook_cabbage | 30.67% | 13.33% | -| sim_behavior_r1_pro/carrying_in_groceries | 30.00% | 6.00% | -| sim_behavior_r1_pro/freeze_pies | 28.12% | 13.75% | -| sim_behavior_r1_pro/spraying_for_bugs | 27.50% | 18.75% | -| sim_behavior_r1_pro/bringing_water | 27.50% | 18.75% | -| sim_behavior_r1_pro/clean_boxing_gloves | 27.27% | 10.91% | -| sim_behavior_r1_pro/loading_the_car | 26.28% | 10.83% | -| sim_behavior_r1_pro/spraying_fruit_trees | 26.25% | 13.75% | -| sim_behavior_r1_pro/bringing_in_wood | 24.44% | 1.11% | -| sim_behavior_r1_pro/sorting_household_items | 24.12% | 0.00% | -| sim_behavior_r1_pro/clean_a_patio | 23.33% | 10.00% | -| sim_behavior_r1_pro/sorting_vegetables | 22.78% | 8.33% | -| sim_behavior_r1_pro/wash_a_baseball_cap | 22.73% | 20.00% | -| sim_behavior_r1_pro/setting_the_fire | 22.50% | 5.00% | -| sim_behavior_r1_pro/cleaning_up_plates_and_food | 22.00% | 15.33% | -| sim_behavior_r1_pro/putting_up_Christmas_decorations_inside | 21.49% | 3.68% | -| sim_behavior_r1_pro/hanging_pictures | 20.00% | 5.00% | -| sim_behavior_r1_pro/rearranging_kitchen_furniture | 20.00% | 5.00% | -| sim_behavior_r1_pro/putting_dishes_away_after_cleaning | 19.48% | 8.10% | -| sim_behavior_r1_pro/wash_dog_toys | 19.44% | 6.67% | -| sim_behavior_r1_pro/setting_mousetraps | 19.17% | 4.17% | -| sim_behavior_r1_pro/tidying_bedroom | 18.18% | 11.82% | -| sim_behavior_r1_pro/make_pizza | 18.00% | 0.00% | -| sim_behavior_r1_pro/outfit_a_basic_toolbox | 17.69% | 11.54% | -| sim_behavior_r1_pro/putting_shoes_on_rack | 16.67% | 20.67% | -| sim_behavior_r1_pro/chop_an_onion | 16.36% | 7.27% | -| sim_behavior_r1_pro/assembling_gift_baskets | 15.75% | 4.29% | -| sim_behavior_r1_pro/clean_up_your_desk | 15.05% | 12.17% | -| sim_behavior_r1_pro/moving_boxes_to_storage | 14.44% | 0.00% | -| sim_behavior_r1_pro/hiding_Easter_eggs | 13.64% | 0.00% | -| sim_behavior_r1_pro/picking_up_toys | 13.33% | 5.33% | -| sim_behavior_r1_pro/storing_food | 12.50% | 9.50% | -| sim_behavior_r1_pro/chopping_wood | 10.67% | 1.33% | -| sim_behavior_r1_pro/cook_hot_dogs | 0.28% | 23.85% | -| sim_behavior_r1_pro/slicing_vegetables | 0.14% | 0.00% | -| Average | 26.30% | 11.30% | - -## 1. Individual task post-training (Optional) -Starting from the base checkpoint, we post-train on individual tasks and report results for some of them. - -| Task Name | Task Progress | Q Score | -| --- | --- | --- | -| sim_behavior_r1_pro/turning_on_radio | 80.56% | 0.70 | -| sim_behavior_r1_pro/chopping_wood | 20.00% | 0.125 | -| sim_behavior_r1_pro/cleaning_up_plates_and_food | 22.00% | 0.11 | -| sim_behavior_r1_pro/setting_mousetraps | 19.17% | 0.10 | - -# Fine-tune on BEHAVIOR dataset -First, download our converted BEHAVIOR dataset from HuggingFace -``` -huggingface-cli download nvidia/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim \ - --repo-type dataset \ - --include "sim_behavior_r1_pro.*" \ - --local-dir $HOME/gr00t_dataset -``` -Using `sim_behavior_r1_pro.*` will download datasets for all 50 tasks. You can replace `sim_behavior_r1_pro.*` with a specific task. - -To launch training, run -``` -uv run bash examples/BEHAVIOR/finetune_BEHAVIOR.sh -``` -Notice the use of `BEHAVIOR_R1_PRO` embodiment tag. - - -# 2. Evaluate checkpoint - -First, follow these steps to setup the BEHAVIOR simulation OmniGibson. -```bash -git clone https://github.com/StanfordVL/BEHAVIOR-1K.git -cd BEHAVIOR-1K -# checkout to the branch with task progress as metric -git checkout feat/task-progress -# activate the uv env setup by gr00t, if not setup yet, run `cd PATH_TO_GR00T && uv sync --python 3.10 && uv pip install -e .` -source PATH_TO_GR00T/.venv/bin/activate -# Headless/automated installation (auto-accepts NVIDIA Isaac Sim EULA, and BEHAVIOR Dataset License) -bash ./setup_uv.sh -``` - -Because our evaluation was performed on test cases of [BEHAVIOR Challenge](https://behavior.stanford.edu/challenge/index.html), run the following script to download test cases from their [official HF repo](https://huggingface.co/datasets/behavior-1k/2025-challenge-hidden-instances/). -```bash -python gr00t/eval/sim/BEHAVIOR/prepare_test_instances.py -``` - -Note that BEHAVIOR sim is built on top of Omniverse and Isaac Sim, it inherits their spec dependencies. For example, GPUs without RT cores (A100, H100) are not supported. We tested on L40 and L40s. See [here](https://docs.isaacsim.omniverse.nvidia.com/latest/installation/requirements.html) for more information. - -Then, run client server evaluation under the project root directory in separate terminals: - -**Terminal 1 - Server:** -```bash -uv sync --python 3.10 -uv pip install -e . - -# replace the model path with the path to your finetuned checkpoint or use the provided checkpoint -uv run gr00t/eval/run_gr00t_server.py \ - --model-path nvidia/GR00T-N1.6-BEHAVIOR1k \ - --embodiment-tag BEHAVIOR_R1_PRO \ - --use-sim-policy-wrapper -``` - -**Terminal 2 - Client:** -```bash -uv run python gr00t/eval/rollout_policy.py \ - --n_episodes 10 \ - --policy_client_host 127.0.0.1 \ - --policy_client_port 5555 \ - --max_episode_steps=999999999 \ - --env_name sim_behavior_r1_pro/turning_on_radio \ - --n_action_steps 8 \ - --n_envs 1 -``` -Note that we set `max_episode_steps` to a large value, this is because the BEHAVIOR sim will by default use 2x human steps as the horizon. Setting `max_episode_steps` to a smaller value if you want the evaluation to finish quicker, e.g., for debug purpose. Also, we disable video recording because we found the sim will crash if `decord` is imported in `video_utils.py`. - -# Full task list -- sim_behavior_r1_pro/turning_on_radio -- sim_behavior_r1_pro/hanging_pictures -- sim_behavior_r1_pro/make_microwave_popcorn -- sim_behavior_r1_pro/attach_a_camera_to_a_tripod -- sim_behavior_r1_pro/picking_up_trash -- sim_behavior_r1_pro/clean_a_trumpet -- sim_behavior_r1_pro/set_up_a_coffee_station_in_your_kitchen -- sim_behavior_r1_pro/chop_an_onion -- sim_behavior_r1_pro/spraying_for_bugs -- sim_behavior_r1_pro/hiding_Easter_eggs -- sim_behavior_r1_pro/cook_bacon -- sim_behavior_r1_pro/putting_shoes_on_rack -- sim_behavior_r1_pro/clean_boxing_gloves -- sim_behavior_r1_pro/preparing_lunch_box -- sim_behavior_r1_pro/spraying_fruit_trees -- sim_behavior_r1_pro/wash_a_baseball_cap -- sim_behavior_r1_pro/rearranging_kitchen_furniture -- sim_behavior_r1_pro/setting_the_fire -- sim_behavior_r1_pro/bringing_water -- sim_behavior_r1_pro/cook_hot_dogs -- sim_behavior_r1_pro/setting_mousetraps -- sim_behavior_r1_pro/outfit_a_basic_toolbox -- sim_behavior_r1_pro/chopping_wood -- sim_behavior_r1_pro/putting_dishes_away_after_cleaning -- sim_behavior_r1_pro/tidying_bedroom -- sim_behavior_r1_pro/wash_dog_toys -- sim_behavior_r1_pro/can_meat -- sim_behavior_r1_pro/sorting_vegetables -- sim_behavior_r1_pro/clean_a_patio -- sim_behavior_r1_pro/freeze_pies -- sim_behavior_r1_pro/clearing_food_from_table_into_fridge -- sim_behavior_r1_pro/bringing_in_wood -- sim_behavior_r1_pro/cleaning_up_plates_and_food -- sim_behavior_r1_pro/putting_up_Christmas_decorations_inside -- sim_behavior_r1_pro/putting_away_Halloween_decorations -- sim_behavior_r1_pro/cook_cabbage -- sim_behavior_r1_pro/carrying_in_groceries -- sim_behavior_r1_pro/moving_boxes_to_storage -- sim_behavior_r1_pro/getting_organized_for_work -- sim_behavior_r1_pro/sorting_household_items -- sim_behavior_r1_pro/picking_up_toys -- sim_behavior_r1_pro/collecting_childrens_toys -- sim_behavior_r1_pro/make_pizza -- sim_behavior_r1_pro/loading_the_car -- sim_behavior_r1_pro/storing_food -- sim_behavior_r1_pro/clean_up_your_desk -- sim_behavior_r1_pro/canning_food -- sim_behavior_r1_pro/boxing_books_up_for_storage -- sim_behavior_r1_pro/assembling_gift_baskets -- sim_behavior_r1_pro/slicing_vegetables diff --git a/examples/BEHAVIOR/finetune_BEHAVIOR.sh b/examples/BEHAVIOR/finetune_BEHAVIOR.sh deleted file mode 100644 index d89ec8a82..000000000 --- a/examples/BEHAVIOR/finetune_BEHAVIOR.sh +++ /dev/null @@ -1,22 +0,0 @@ -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-BEHAVIOR1k \ - --dataset_path PATH_TO_BEHAVIOR_INDIVIDUAL_TASK_DATASET \ - --embodiment_tag BEHAVIOR_R1_PRO \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/BEHAVIOR_finetune \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 150000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 1024 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 \ - --state_dropout_prob 0 diff --git a/examples/DROID/README.md b/examples/DROID/README.md new file mode 100644 index 000000000..94fcc7cff --- /dev/null +++ b/examples/DROID/README.md @@ -0,0 +1,110 @@ +# GR00T DROID + +The N1.7 base model supports DROID inference out of the box via the `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` pretrain tag. A finetuned checkpoint is also available at [`nvidia/GR00T-N1.7-DROID`](https://huggingface.co/nvidia/GR00T-N1.7-DROID). + +> **Note:** The DROID dataset contains multiple language instruction paraphrases per episode (`language_instruction`, `language_instruction_2`, `language_instruction_3`). These are used for language augmentation during training. At inference time, only the first language key is used. + +## Data Format + +The DROID embodiment expects the following modality structure: + +| Modality | Keys | Dimensions | +|----------|------|------------| +| Video | `exterior_image_1_left`, `wrist_image_left` | 2 cameras | +| State | `eef_9d`, `gripper_position`, `joint_position` | 9D + 1D + 7D = 17D | +| Action | `eef_9d`, `gripper_position`, `joint_position` | 9D + 1D + 7D = 17D | +| Language | `annotation.language.language_instruction` | text | + +Action representations: +- `eef_9d`: relative end-effector (XYZ + rotation 6D) +- `gripper_position`: absolute (1D) +- `joint_position`: relative joint positions (7D) + +### Preparing DROID Demo Data + +The full DROID dataset ([lerobot/droid_1.0.1](https://huggingface.co/datasets/lerobot/droid_1.0.1)) is ~358 GB with 95k+ episodes in LeRobot v3.0 format. To create a small sample for testing: + +```bash +uv pip install jsonlines # one-time dependency +python scripts/download_droid_sample.py +``` + +This downloads the first data/video chunk (~170 MB) and extracts 3 episodes into `demo_data/droid_sample/` in GR00T LeRobot v2.0 format. + +**Key conversion notes:** +- Source is LeRobot v3.0 (consolidated parquet + concatenated videos) — the script converts to v2.0 (per-episode parquet + per-episode mp4). +- Video keys in the raw dataset (`exterior_1_left`, `wrist_left`) differ from the model config keys (`exterior_image_1_left`, `wrist_image_left`). The data loader auto-maps by position — no manual renaming needed. +- Language instructions are loaded via the `task_index` column mapped through `tasks.jsonl`. + +## 1. Standalone Inference (with demo data) + +After preparing demo data, run inference directly (no server needed): + +```bash +uv run python scripts/deployment/standalone_inference_script.py \ + --model-path nvidia/GR00T-N1.7-3B \ + --dataset-path demo_data/droid_sample \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --traj-ids 0 1 \ + --inference-mode pytorch \ + --execution-horizon 8 +``` + +> **Note:** Episode 0 may have an empty language instruction. If inference fails on episode 0, try `--traj-ids 1 2`. + +Expected zero-shot performance on the base model (not finetuned): + +| Metric | Value | +|--------|-------| +| Average MSE | ~0.0149 | +| Average MAE | ~0.0753 | +| Inference per step (base) | ~262 ms (H100) | +| Inference per step (finetuned) | ~253 ms (H100) | + +## 2. Inference Server (for real-world deployment) + +### Using the base model (zero-shot): + +```bash +uv run python gr00t/eval/run_gr00t_server.py \ + --model-path nvidia/GR00T-N1.7-3B \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT +``` + +### Using the finetuned model: + +```bash +uv run python gr00t/eval/run_gr00t_server.py \ + --model-path nvidia/GR00T-N1.7-DROID \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT +``` + +## 3. Fine-tuning + +Fine-tune the base model on DROID data using the shared launcher: + +```bash +NUM_GPUS=8 MAX_STEPS=20000 GLOBAL_BATCH_SIZE=640 SAVE_STEPS=1000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path demo_data/droid_sample \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --output-dir /tmp/droid_finetune +``` + +> **Note:** The above uses the small `demo_data/droid_sample` (3 episodes) for quick validation. For production training, replace `--dataset-path` with the full DROID dataset. + +## 4. Robot Control Script + +1. Install the DROID package on the robot control laptop/workstation — [instructions](https://droid-dataset.github.io/droid/software-setup/host-installation.html#configuring-the-laptopworkstation) + +2. Install dependencies for the GR00T control script in the environment from step 1: +```bash +pip install tyro pydantic numpy==1.26.4 +``` + +3. Enter the camera IDs for your ZED cameras in `examples/DROID/main_gr00t.py`. + +4. Start the control script: +```bash +python examples/DROID/main_gr00t.py --external-camera="left" # or "right" +``` diff --git a/examples/DROID/main_gr00t.py b/examples/DROID/main_gr00t.py new file mode 100644 index 000000000..e56ca6fc3 --- /dev/null +++ b/examples/DROID/main_gr00t.py @@ -0,0 +1,503 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +# ruff: noqa +# NOTE: this requires installation of the droid repo. +# Adapted from https://github.com/Physical-Intelligence/openpi/blob/main/examples/droid/main.py + +from __future__ import annotations + +import contextlib +import dataclasses +import datetime +import faulthandler +import os +import signal +import time +from collections import deque + +import cv2 +import numpy as np +import pandas as pd +import tqdm +import tyro +from PIL import Image + +from scipy.spatial.transform import Rotation + +faulthandler.enable() + +# DROID data collection frequency -- we slow down execution to match this frequency +DROID_CONTROL_FREQUENCY = 15 +RESOLUTION = (180, 320) # resize images to this resolution before sending to the policy server + +# Egocentric frame correction: R_euler is post-multiplied by this matrix +# to match the OXE DROID training pipeline (TFG convention). +# audit: mirror of gr00t/data/state_action/droid_frame.py — this example runs on +# a slim DROID install without the gr00t package, so it cannot import the +# canonical source. Keep this matrix and compute_eef_9d in sync with it. +DROID_EEF_ROTATION_CORRECT = np.array( + [[0, 0, -1], [-1, 0, 0], [0, 1, 0]], + dtype=np.float64, +) + + +def compute_eef_9d(cartesian_position: np.ndarray) -> np.ndarray: + """Convert cartesian_position (XYZ + euler 3D) to eef_9d (XYZ + rot6d). + + Uses extrinsic XYZ Euler convention (scipy ``"XYZ"``, equivalent to + ``tfg.rotation_matrix_3d.from_euler``) and post-multiplies by + ``DROID_EEF_ROTATION_CORRECT`` to match the pretrained model. + """ + c = np.asarray(cartesian_position, dtype=np.float64).reshape(6) + xyz = c[:3] + euler = c[3:6] + rot_robot = Rotation.from_euler("XYZ", euler).as_matrix() + rot_mat = rot_robot @ DROID_EEF_ROTATION_CORRECT + rot6d = rot_mat[:2, :].reshape(6) + return np.concatenate([xyz, rot6d]).astype(np.float32) + + +@dataclasses.dataclass +class Args: + # Hardware parameters + + left_camera_id: str = "" # e.g., "24259877" + right_camera_id: str = "" # e.g., "24514023" + wrist_camera_id: str = "" # e.g., "13062452" + + # Policy parameters + policy_host: str = "localhost" + policy_port: int = 5555 + policy_api_token: str = None + + results_dir: str = None # if None, will use the current timestamp as the results directory + + # Rollout parameters + max_timesteps: int = 600 # how many steps to run each rollout + + # How many actions to execute from a predicted action chunk before querying policy server again + open_loop_horizon: int = 15 + external_camera: str = ( + "left" # which exterior camera to use for the policy server, choose from ["left", "right"] + ) + render_camera: str = "left" # which camera to render saved video from + render_fps: int = 50 + + debug: bool = False + vis_cameras: bool = False + + delay_seconds: int = 5 + + +def _load_runtime_deps(): + """Load robot-only dependencies after CLI parsing so --help stays usable.""" + try: + import imageio + from droid.robot_env import RobotEnv + from server_client import PolicyClient + from utils import resize_with_pad + except ModuleNotFoundError as exc: + raise ModuleNotFoundError( + "examples/DROID/main_gr00t.py requires the DROID robot-control environment. " + "Follow examples/DROID/README.md and install the DROID package plus " + "`pip install tyro pydantic numpy==1.26.4` before running." + ) from exc + + return RobotEnv, PolicyClient, imageio, resize_with_pad + + +# We are using Ctrl+C to optionally terminate rollouts early -- however, if we press Ctrl+C while the policy server is +# waiting for a new action chunk, it will raise an exception and the server connection dies. +# This context manager temporarily prevents Ctrl+C and delays it after the server call is complete. +@contextlib.contextmanager +def prevent_keyboard_interrupt(): + """Temporarily prevent keyboard interrupts by delaying them until after the protected code.""" + interrupted = False + original_handler = signal.getsignal(signal.SIGINT) + + def handler(signum, frame): + nonlocal interrupted + interrupted = True + + signal.signal(signal.SIGINT, handler) + try: + yield + finally: + signal.signal(signal.SIGINT, original_handler) + if interrupted: + raise KeyboardInterrupt + + +def main(args: Args): + RobotEnv, PolicyClient, imageio, resize_with_pad = _load_runtime_deps() + + assert args.external_camera in ["left", "right"], ( + f"Invalid exterior camera: {args.exterior_camera}" + ) + + if args.results_dir is None: + results_dir = f"results_gr00t_{datetime.datetime.now().strftime('%Y_%m_%d')}" + else: + results_dir = args.results_dir + + # Initialize the Panda environment. + env = RobotEnv(action_space="joint_position", gripper_action_space="position") + print("Created the droid env!") + + os.makedirs(results_dir, exist_ok=True) + + policy_client = PolicyClient( + host=args.policy_host, port=args.policy_port, api_token=args.policy_api_token + ) + + modality_config = policy_client.get_modality_config() + video_delta = modality_config["video"].delta_indices + video_T = len(video_delta) + video_history_len = max(-min(video_delta), 0) + 1 if video_delta else 1 + video_keys = modality_config["video"].modality_keys + state_keys = modality_config["state"].modality_keys + state_T = len(modality_config["state"].delta_indices) + # Action chunk size is dictated by the policy (server) side. open_loop_horizon + # is the only locally-authored horizon; it is a deliberate receding-horizon + # choice and MAY be < the chunk, but it must never exceed it, otherwise + # `pred_action_chunk[actions_from_chunk_completed]` indexes past the + # predicted chunk and IndexErrors mid-rollout. Source the chunk size from + # the policy and validate the contract up-front instead of crashing deep in + # the loop. + action_chunk_size = len(modality_config["action"].delta_indices) + if not (1 <= args.open_loop_horizon <= action_chunk_size): + raise ValueError( + f"open_loop_horizon={args.open_loop_horizon} must satisfy " + f"1 <= open_loop_horizon <= action_chunk_size={action_chunk_size} " + "(= len(policy.action.delta_indices)). A larger value would index " + "past the predicted action chunk and IndexError mid-rollout." + ) + print( + f"Model config — video T={video_T} (delta={video_delta}), " + f"state T={state_T}, action chunk={action_chunk_size}, " + f"open_loop_horizon={args.open_loop_horizon}, " + f"keys: video={video_keys}, state={state_keys}" + ) + + df = pd.DataFrame(columns=["success", "duration", "video_filename"]) + + if args.debug: + debug_dir = os.path.join(results_dir, "debug_data") + os.makedirs(debug_dir, exist_ok=True) + os.makedirs(os.path.join(debug_dir, "videos/wrist_image/"), exist_ok=True) + os.makedirs(os.path.join(debug_dir, "videos/exterior_image_1_left/"), exist_ok=True) + + instruction = None + while True: + if instruction is None: + instruction = input("Enter instruction: ") + else: + if input("Change instruction? (enter y or n) ").lower() == "y": + instruction = input("Enter instruction: ") + + time.sleep(args.delay_seconds) + + # Rollout parameters + actions_from_chunk_completed = 0 + pred_action_chunk = None + + # Prepare to save video of rollout + timestamp = datetime.datetime.now().strftime("%Y_%m_%d_%H:%M:%S") + video = [] + if args.debug: + model_wrist_image_writer = imageio.get_writer( + os.path.join( + debug_dir, "videos/wrist_image/", f"model_wrist_image_{timestamp}.mp4" + ), + fps=5, + ) + model_exterior_image_1_left_writer = imageio.get_writer( + os.path.join( + debug_dir, + "videos/exterior_image_1_left/", + f"model_exterior_image_1_left_{timestamp}.mp4", + ), + fps=5, + ) + + bar = tqdm.tqdm(range(args.max_timesteps)) + print("Running rollout... press Ctrl+C to stop early.") + + # Profiling variables (reset for each rollout) + rollout_start_time = time.time() + obs_times = deque(maxlen=50) # Track observation collection times + server_times = deque(maxlen=50) # Track server response times + action_count = 0 + frame_buffer = deque(maxlen=video_history_len) + + for t_step in bar: + step_start_time = time.time() + try: + # Get the current observation + obs_start_time = time.time() + curr_obs = _extract_observation( + args, + env.get_observation(), + # Save the first observation to disk + save_to_disk=t_step == 0, + ) + obs_time = time.time() - obs_start_time + obs_times.append(obs_time) + + video.append(curr_obs[f"{args.render_camera}_image"]) + + # Resize every step so the rolling frame buffer stays current. + left_image = resize_with_pad(curr_obs["left_image"], RESOLUTION[0], RESOLUTION[1]) + right_image = resize_with_pad(curr_obs["right_image"], RESOLUTION[0], RESOLUTION[1]) + wrist_image = resize_with_pad(curr_obs["wrist_image"], RESOLUTION[0], RESOLUTION[1]) + + if args.external_camera == "left": + ext_image = left_image + elif args.external_camera == "right": + ext_image = right_image + + frame_buffer.append({"ext": ext_image, "wrist": wrist_image}) + + # Send websocket request to policy server if it's time to predict a new chunk + if ( + actions_from_chunk_completed == 0 + or actions_from_chunk_completed >= args.open_loop_horizon + ): + actions_from_chunk_completed = 0 + + if args.debug: + model_wrist_image_writer.append_data(wrist_image) + model_exterior_image_1_left_writer.append_data(ext_image) + + # Build video tensor with T frames derived from the model's + # delta_indices (e.g. [-15, 0] -> T=2, [0] -> T=1). + if video_T == 1: + video_dict = { + "exterior_image_1_left": ext_image[None, None, ...], + "wrist_image_left": wrist_image[None, None, ...], + } # (B=1, T=1, H, W, C) + else: + hist_frame = frame_buffer[0] + cur_frame = frame_buffer[-1] + video_dict = { + "exterior_image_1_left": np.stack( + [hist_frame["ext"], cur_frame["ext"]] + )[None, ...], + "wrist_image_left": np.stack([hist_frame["wrist"], cur_frame["wrist"]])[ + None, ... + ], + } # (B=1, T=video_T, H, W, C) + + # Build state dict from the model's reported state keys. + state_dict = {} + state_source = { + "eef_9d": curr_obs["eef_9d"], + "gripper_position": curr_obs["gripper_position"], + "joint_position": curr_obs["joint_position"], + } + for key in state_keys: + state_dict[key] = state_source[key][None, None, ...].astype( + np.float32 + ) # (B=1, T=1, D) + + lang_key = modality_config["language"].modality_keys[0] + request_data = { + "video": video_dict, + "state": state_dict, + "language": {lang_key: [[instruction]]}, + } + + if args.vis_cameras: + # viz the left image 1 and wrist image and use cv2 to display them side by side + left_image_display = cv2.resize( + left_image, (wrist_image.shape[1], wrist_image.shape[0]) + ) + combined_display = np.concatenate([left_image_display, wrist_image], axis=1) + # convert to bgr + combined_display = combined_display[..., ::-1] + cv2.imshow("Camera Views", combined_display) + cv2.waitKey(1) + + # Wrap the server call in a context manager to prevent Ctrl+C from interrupting it + # Ctrl+C will be handled after the server call is complete + server_start_time = time.time() + with prevent_keyboard_interrupt(): + # this returns action chunk [N, 8] of joint position actions (7) + gripper position (1) + response = policy_client.get_action(request_data) + server_time = time.time() - server_start_time + server_times.append(server_time) + + pred_action_chunk = np.concatenate( + ( + response[0]["joint_position"][0], + response[0]["gripper_position"][0], + ), + axis=1, + ) + + # Select current action to execute from chunk + action = pred_action_chunk[actions_from_chunk_completed] + actions_from_chunk_completed += 1 + + # Binarize gripper action + if action[-1].item() > 0.5: + action = np.concatenate([action[:-1], np.ones((1,))]) + else: + action = np.concatenate([action[:-1], np.zeros((1,))]) + + env.step(action) + action_count += 1 + + # Sleep to match DROID data collection frequency + elapsed_time = time.time() - step_start_time + if elapsed_time < 1 / DROID_CONTROL_FREQUENCY: + time.sleep(1 / DROID_CONTROL_FREQUENCY - elapsed_time) + + # profiling stats + if obs_times: + avg_obs_time = np.mean(obs_times) * 1000 + min_obs_time = np.min(obs_times) * 1000 + max_obs_time = np.max(obs_times) * 1000 + else: + avg_obs_time = min_obs_time = max_obs_time = 0 + + if server_times: + avg_server_time = np.mean(server_times) * 1000 + min_server_time = np.min(server_times) * 1000 + max_server_time = np.max(server_times) * 1000 + else: + avg_server_time = min_server_time = max_server_time = 0 + + total_elapsed = time.time() - rollout_start_time + actions_per_sec = action_count / total_elapsed if total_elapsed > 0 else 0 + + bar.set_description( + f"Obs: {avg_obs_time:.1f}ms [{min_obs_time:.1f}-{max_obs_time:.1f}] | " + f"Server: {avg_server_time:.1f}ms [{min_server_time:.1f}-{max_server_time:.1f}] | " + f"Actions/sec: {actions_per_sec:.2f}" + ) + except KeyboardInterrupt: + break + + os.makedirs(os.path.join(results_dir, "videos"), exist_ok=True) + video = np.stack(video) + # replace whitespace with underscores in instruction + sanitized_instruction = instruction.replace(" ", "_") + save_filename = os.path.join( + results_dir, "videos", f"{sanitized_instruction}_video_" + timestamp + ) + with imageio.get_writer(save_filename + ".mp4", fps=args.render_fps) as writer: + for frame in video: + writer.append_data(frame) + + if args.debug: + model_wrist_image_writer.close() + model_exterior_image_1_left_writer.close() + + success: str | float | None = None + while not isinstance(success, float): + success = input( + "Did the rollout succeed? (enter y for 100%, n for 0%), or a numeric value 0-100 based on the evaluation spec" + ) + if success == "y": + success = 1.0 + elif success == "n": + success = 0.0 + + success = float(success) / 100 + if not (0 <= success <= 1): + print(f"Success must be a number in [0, 100] but got: {success * 100}") + + new_row = { + "success": success, + "duration": t_step, + "video_filename": save_filename, + } + new_index = len(df) + df.loc[new_index] = new_row + + if input("Do one more eval? (enter y or n) ").lower() != "y": + break + env.reset(randomize=False) + + timestamp = datetime.datetime.now().strftime("%I:%M%p_%B_%d_%Y") + csv_filename = os.path.join(results_dir, f"eval_{timestamp}.csv") + df.to_csv(csv_filename) + print(f"Results saved to {csv_filename}") + + +def _extract_observation(args: Args, obs_dict, *, stereo_camera="left", save_to_disk=False): + image_observations = obs_dict["image"] + key_left = f"{args.left_camera_id}_{stereo_camera}" + key_right = f"{args.right_camera_id}_{stereo_camera}" + key_wrist = f"{args.wrist_camera_id}_{stereo_camera}" + + left_image = image_observations.get(key_left) + right_image = image_observations.get(key_right) + wrist_image = image_observations.get(key_wrist) + + available = list(image_observations.keys()) + assert left_image is not None, ( + f"Left camera not found for key {key_left!r}. Available keys: {available}. " + "Set --left-camera-id to the ZED serial used in observation keys." + ) + assert right_image is not None, ( + f"Right camera not found for key {key_right!r}. Available keys: {available}. " + "Set --right-camera-id to the ZED serial used in observation keys." + ) + assert wrist_image is not None, ( + f"Wrist camera not found for key {key_wrist!r}. Available keys: {available}. " + "Set --wrist-camera-id to the ZED serial used in observation keys." + ) + + # Drop the alpha dimension + left_image = left_image[..., :3] + right_image = right_image[..., :3] + wrist_image = wrist_image[..., :3] + + # Convert to RGB + left_image = left_image[..., ::-1] + right_image = right_image[..., ::-1] + wrist_image = wrist_image[..., ::-1] + + # In addition to image observations, also capture the proprioceptive state + robot_state = obs_dict["robot_state"] + cartesian_position = np.array(robot_state["cartesian_position"]) + joint_position = np.array(robot_state["joint_positions"]) + gripper_position = np.array([robot_state["gripper_position"]]) + eef_9d = compute_eef_9d(cartesian_position) + + # Save the images to disk so that they can be viewed live while the robot is running + # Create one combined image to make live viewing easy + if save_to_disk: + combined_image = np.concatenate([left_image, wrist_image, right_image], axis=1) + combined_image = Image.fromarray(combined_image) + combined_image.save("robot_camera_views.png") + + return { + "left_image": left_image, + "right_image": right_image, + "wrist_image": wrist_image, + "cartesian_position": cartesian_position, + "eef_9d": eef_9d, + "joint_position": joint_position, + "gripper_position": gripper_position, + } + + +if __name__ == "__main__": + args: Args = tyro.cli(Args) + main(args) diff --git a/examples/DROID/server_client.py b/examples/DROID/server_client.py new file mode 100644 index 000000000..51a4c149d --- /dev/null +++ b/examples/DROID/server_client.py @@ -0,0 +1,395 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +from abc import ABC, abstractmethod +from dataclasses import asdict, dataclass, is_dataclass +from enum import Enum +import io +from typing import Any + +import msgpack +import numpy as np +import zmq + + +def to_json_serializable(obj: Any) -> Any: + """ + Recursively convert dataclasses and numpy arrays to JSON-serializable format. + + Args: + obj: Object to convert (can be dataclass, numpy array, dict, list, etc.) + + Returns: + JSON-serializable representation of the object + """ + if is_dataclass(obj) and not isinstance(obj, type): + # Convert dataclass to dict, then recursively process the dict + return to_json_serializable(asdict(obj)) + elif isinstance(obj, np.ndarray): + # Convert numpy array to list + return obj.tolist() + elif isinstance(obj, np.integer): + # Convert numpy integers to Python int + return int(obj) + elif isinstance(obj, np.floating): + # Convert numpy floats to Python float + return float(obj) + elif isinstance(obj, np.bool_): + # Convert numpy bool to Python bool + return bool(obj) + elif isinstance(obj, dict): + # Recursively process dictionary values + return {key: to_json_serializable(value) for key, value in obj.items()} + elif isinstance(obj, (list, tuple)): + # Recursively process list/tuple elements + return [to_json_serializable(item) for item in obj] + elif isinstance(obj, set): + # Convert set to list + return [to_json_serializable(item) for item in obj] + elif isinstance(obj, (str, int, float, bool, type(None))): + # Already JSON-serializable + return obj + elif isinstance(obj, Enum): + return obj.name + else: + # For other types, try to convert to string as fallback + # You might want to handle specific types differently + return str(obj) + + +class MessageType(Enum): + START_OF_EPISODE = "start_of_episode" + END_OF_EPISODE = "end_of_episode" + EPISODE_STEP = "episode_step" + IMAGE = "image" + TEXT = "text" + + +class ActionRepresentation(Enum): + RELATIVE = "relative" + DELTA = "delta" + ABSOLUTE = "absolute" + + +class ActionType(Enum): + EEF = "eef" + NON_EEF = "non_eef" + + +class ActionFormat(Enum): + DEFAULT = "default" + XYZ_ROT6D = "xyz+rot6d" + XYZ_ROTVEC = "xyz+rotvec" + + +@dataclass +class ActionConfig: + rep: ActionRepresentation + type: ActionType + format: ActionFormat + state_key: str | None = None + + +@dataclass +class ModalityConfig: + """Configuration for a modality defining how data should be sampled and loaded. + + This class specifies which indices to sample relative to a base index and which + keys to load for a particular modality (e.g., video, state, action). + """ + + delta_indices: list[int] + """Delta indices to sample relative to the current index. The returned data will correspond to the original data at a sampled base index + delta indices.""" + modality_keys: list[str] + """The keys to load for the modality in the dataset.""" + sin_cos_embedding_keys: list[str] | None = None + """Optional list of keys to apply sin/cos encoding. If None or empty, use min/max normalization for all keys.""" + mean_std_embedding_keys: list[str] | None = None + """Optional list of keys to apply mean/std normalization. If None or empty, use min/max normalization for all keys.""" + action_configs: list[ActionConfig] | None = None + + def __post_init__(self): + """Set default values for action-related fields if not specified.""" + if self.action_configs is not None: + assert len(self.action_configs) == len(self.modality_keys), ( + f"Number of action configs ({len(self.action_configs)}) must match number of modality keys ({len(self.modality_keys)})" + ) + parsed_action_configs = [] + for action_config in self.action_configs: + if isinstance(action_config, dict): + action_config = ActionConfig( + rep=ActionRepresentation[action_config["rep"]], + type=ActionType[action_config["type"]], + format=ActionFormat[action_config["format"]], + state_key=action_config.get("state_key", None), + ) + parsed_action_configs.append(action_config) + self.action_configs = parsed_action_configs + + +class MsgSerializer: + @staticmethod + def to_bytes(data: Any) -> bytes: + return msgpack.packb(data, default=MsgSerializer.encode_custom_classes) + + @staticmethod + def from_bytes(data: bytes) -> Any: + return msgpack.unpackb(data, object_hook=MsgSerializer.decode_custom_classes) + + @staticmethod + def decode_custom_classes(obj): + if not isinstance(obj, dict): + return obj + if "__ModalityConfig_class__" in obj: + return ModalityConfig(**obj["as_json"]) + if "__ndarray_class__" in obj: + return np.load(io.BytesIO(obj["as_npy"]), allow_pickle=False) + return obj + + @staticmethod + def encode_custom_classes(obj): + if isinstance(obj, ModalityConfig): + # Convert to dict and let msgpack recursively handle nested objects + return {"__ModalityConfig_class__": True, "as_json": to_json_serializable(obj)} + if isinstance(obj, np.ndarray): + output = io.BytesIO() + np.save(output, obj, allow_pickle=False) + return {"__ndarray_class__": True, "as_npy": output.getvalue()} + return obj + + +class BasePolicy(ABC): + """Abstract base class for robotic control policies. + + This class defines the interface that all policies must implement, including + methods for action computation, input/output validation, and state management. + + Subclasses must implement: + - check_observation(): Validate observation format + - check_action(): Validate action format + - _get_action(): Core action computation logic + - reset(): Reset policy to initial state + """ + + def __init__(self, *, strict: bool = True): + self.strict = strict + + @abstractmethod + def check_observation(self, observation: dict[str, Any]) -> None: + """Check if the observation is valid. + + Args: + observation: Dictionary containing the current state/observation of the environment + + Raises: + AssertionError: If the observation is invalid. + """ + pass + + @abstractmethod + def check_action(self, action: dict[str, Any]) -> None: + """Check if the action is valid. + + Args: + action: Dictionary containing the action to be executed + + Raises: + AssertionError: If the action is invalid. + """ + pass + + @abstractmethod + def _get_action( + self, observation: dict[str, Any], options: dict[str, Any] | None = None + ) -> tuple[dict[str, Any], dict[str, Any]]: + """Compute and return the next action based on current observation. + + This method should be overridden by subclasses to implement policy-specific + action computation. Input validation is handled by the public get_action() method. + + Args: + observation: Dictionary containing the current state/observation + options: Optional configuration dict for action computation + + Returns: + Tuple of (action, info): + - action: Dictionary containing the action to be executed + - info: Dictionary containing additional metadata (e.g., confidence scores) + """ + pass + + def get_action( + self, observation: dict[str, Any], options: dict[str, Any] | None = None + ) -> tuple[dict[str, Any], dict[str, Any]]: + """Compute and return the next action based on current observation with validation. + + This is the main public interface. It validates the observation, calls + the internal _get_action(), and validates the resulting action. + + Args: + observation: Dictionary containing the current state/observation + options: Optional configuration dict for action computation + + Returns: + Tuple of (action, info): + - action: Dictionary containing the validated action + - info: Dictionary containing additional metadata + + Raises: + AssertionError/ValueError: If observation or action validation fails + """ + if self.strict: + self.check_observation(observation) + action, info = self._get_action(observation, options) + if self.strict: + self.check_action(action) + return action, info + + @abstractmethod + def reset(self, options: dict[str, Any] | None = None) -> dict[str, Any]: + """Reset the policy to its initial state. + + Args: + options: Dictionary containing the options for the reset + + Returns: + Dictionary containing the info after resetting the policy + """ + pass + + +class PolicyClient(BasePolicy): + def __init__( + self, + host: str = "localhost", + port: int = 5555, + timeout_ms: int = 15000, + api_token: str = None, + strict: bool = False, + ): + super().__init__(strict=strict) + self._closed = False + self.context = zmq.Context() + self.host = host + self.port = port + self.timeout_ms = timeout_ms + self.api_token = api_token + self._init_socket() + + def _init_socket(self): + """Initialize or reinitialize the socket with current settings""" + self.socket = self.context.socket(zmq.REQ) + self.socket.connect(f"tcp://{self.host}:{self.port}") + + def ping(self) -> bool: + try: + self.call_endpoint("ping", requires_input=False) + return True + except zmq.error.ZMQError: + self._init_socket() # Recreate socket for next attempt + return False + + def kill_server(self): + """ + Kill the server. + """ + self.call_endpoint("kill", requires_input=False) + + def call_endpoint( + self, endpoint: str, data: dict | None = None, requires_input: bool = True + ) -> Any: + """ + Call an endpoint on the server. + + Args: + endpoint: The name of the endpoint. + data: The input data for the endpoint. + requires_input: Whether the endpoint requires input data. + """ + request: dict = {"endpoint": endpoint} + if requires_input: + request["data"] = data + if self.api_token: + request["api_token"] = self.api_token + + self.socket.send(MsgSerializer.to_bytes(request)) + message = self.socket.recv() + if message == b"ERROR": + raise RuntimeError("Server error. Make sure we are running the correct policy server.") + response = MsgSerializer.from_bytes(message) + + if isinstance(response, dict) and "error" in response: + raise RuntimeError(f"Server error: {response['error']}") + return response + + def close(self) -> None: + """Release the REQ socket and ZMQ context. Idempotent. + + Mirrors ``gr00t.policy.server_client.PolicyClient.close()`` so the + DROID example demonstrates the explicit-lifecycle pattern. + """ + if getattr(self, "_closed", True): + return + self._closed = True + socket = getattr(self, "socket", None) + if socket is not None: + try: + socket.close(linger=0) + except Exception: + pass + context = getattr(self, "context", None) + if context is not None: + try: + context.term() + except Exception: + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, tb): + self.close() + + def __del__(self): + try: + self.close() + except Exception: + pass + + def _get_action( + self, observation: dict[str, Any], options: dict[str, Any] | None = None + ) -> tuple[dict[str, Any], dict[str, Any]]: + response = self.call_endpoint( + "get_action", {"observation": observation, "options": options} + ) + return tuple(response) # Convert list (from msgpack) to tuple of (action, info) + + def reset(self, options: dict[str, Any] | None = None) -> dict[str, Any]: + return self.call_endpoint("reset", {"options": options}) + + def get_modality_config(self) -> dict[str, ModalityConfig]: + return self.call_endpoint("get_modality_config", requires_input=False) + + def check_observation(self, observation: dict[str, Any]) -> None: + raise NotImplementedError( + "check_observation is not implemented. Please use `strict=False` to disable strict mode or implement this method in the subclass." + ) + + def check_action(self, action: dict[str, Any]) -> None: + raise NotImplementedError( + "check_action is not implemented. Please use `strict=False` to disable strict mode or implement this method in the subclass." + ) diff --git a/examples/DROID/utils.py b/examples/DROID/utils.py new file mode 100644 index 000000000..f62e7494e --- /dev/null +++ b/examples/DROID/utils.py @@ -0,0 +1,81 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Taken from https://github.com/Physical-Intelligence/openpi/tree/main/packages/openpi-client/src/openpi_client +""" + +import numpy as np +from PIL import Image + + +def convert_to_uint8(img: np.ndarray) -> np.ndarray: + """Converts an image to uint8 if it is a float image. + + This is important for reducing the size of the image when sending it over the network. + """ + if np.issubdtype(img.dtype, np.floating): + img = (255 * img).astype(np.uint8) + return img + + +def resize_with_pad( + images: np.ndarray, height: int, width: int, method=Image.BILINEAR +) -> np.ndarray: + """Replicates tf.image.resize_with_pad for multiple images using PIL. Resizes a batch of images to a target height. + + Args: + images: A batch of images in [..., height, width, channel] format. + height: The target height of the image. + width: The target width of the image. + method: The interpolation method to use. Default is bilinear. + + Returns: + The resized images in [..., height, width, channel]. + """ + # If the images are already the correct size, return them as is. + if images.shape[-3:-1] == (height, width): + return images + + original_shape = images.shape + + images = images.reshape(-1, *original_shape[-3:]) + resized = np.stack( + [_resize_with_pad_pil(Image.fromarray(im), height, width, method=method) for im in images] + ) + return resized.reshape(*original_shape[:-3], *resized.shape[-3:]) + + +def _resize_with_pad_pil(image: Image.Image, height: int, width: int, method: int) -> Image.Image: + """Replicates tf.image.resize_with_pad for one image using PIL. Resizes an image to a target height and + width without distortion by padding with zeros. + + Unlike the jax version, note that PIL uses [width, height, channel] ordering instead of [batch, h, w, c]. + """ + cur_width, cur_height = image.size + if cur_width == width and cur_height == height: + return image # No need to resize if the image is already the correct size. + + ratio = max(cur_width / width, cur_height / height) + resized_height = int(cur_height / ratio) + resized_width = int(cur_width / ratio) + resized_image = image.resize((resized_width, resized_height), resample=method) + + zero_image = Image.new(resized_image.mode, (width, height), 0) + pad_height = max(0, int((height - resized_height) / 2)) + pad_width = max(0, int((width - resized_width) / 2)) + zero_image.paste(resized_image, (pad_width, pad_height)) + assert zero_image.size == (width, height) + return zero_image diff --git a/examples/GR00T-WholeBodyControl/README.md b/examples/GR00T-WholeBodyControl/README.md deleted file mode 100644 index 63c4ece7b..000000000 --- a/examples/GR00T-WholeBodyControl/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# G1 LocoManipulation Benchmark - -This is our in-house loco-manipulation task built on MuJoCo, using the Unitree G1 humanoid robot with whole-body control. The task requires the robot to navigate, pick up objects, and place them at target locations while maintaining balance and coordination across the entire body. - ---- - -# G1 LocoManipulation evaluation benchmark result - -| Task | Success Rate | -|-------------------|--------------| -| PnPAppleToPlate | 58% | - -**Note:** This task has high evaluation variance. Fluctuations of **±15%** are expected. - -You can skip (1) and directly evaluate with a trained checkpoint: `https://huggingface.co/nvidia/GR00T-N1.6-G1-PnPAppleToPlate` - -# 1. (Optional) Finetune model on the GR00T WholeBodyControl example dataset - -To reproduce our finetune results, use the following commands to setup dataset and launch finetune experiments: - -```bash -cd examples/GR00T-WholeBodyControl - -# Clone the dataset repo without downloading files -git clone --filter=blob:none --no-checkout https://huggingface.co/datasets/nvidia/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim -cd PhysicalAI-Robotics-GR00T-X-Embodiment-Sim - -# Initialize sparse-checkout FIRST -git sparse-checkout init --cone - -# Set which folder to download -git sparse-checkout set unitree_g1.LMPnPAppleToPlateDC - -# Now checkout the files -git checkout - -# Pull the LFS files -git lfs pull - -cd ../../../ -uv run bash examples/GR00T-WholeBodyControl/finetune_g1.sh -``` - -# 2. Evaluate checkpoint - -First, setup the evaluation simulation environment. This only needs to run once for each simulation benchmark. After it's done, we only need to launch server and client. - -```bash -apt-get update -apt-get install libegl1-mesa-dev libglu1-mesa -bash gr00t/eval/sim/GR00T-WholeBodyControl/setup_GR00T_WholeBodyControl.sh -``` - -Then, run client server evaluation under the project root directory in separate terminals: - -**Terminal 1 - Server:** - -You can use either a local finetuned checkpoint path or the remote finetuned checkpoint (provided by us): - -**Option 1: Local finetuned checkpoint** -```bash -uv run python gr00t/eval/run_gr00t_server.py \ - --model-path /tmp/g1_finetune/checkpoint-10000/ \ - --embodiment-tag UNITREE_G1 \ - --use-sim-policy-wrapper -``` - -**Option 2: Remote finetuned checkpoint (directly runnable)** -```bash -uv run python gr00t/eval/run_gr00t_server.py \ - --model-path nvidia/GR00T-N1.6-G1-PnPAppleToPlate \ - --embodiment-tag UNITREE_G1 \ - --use-sim-policy-wrapper -``` - -**Terminal 2 - Client:** -```bash -gr00t/eval/sim/GR00T-WholeBodyControl/GR00T-WholeBodyControl_uv/.venv/bin/python gr00t/eval/rollout_policy.py \ - --n_episodes 10 \ - --max_episode_steps=1440 \ - --env_name gr00tlocomanip_g1_sim/LMPnPAppleToPlateDC_G1_gear_wbc \ - --n_action_steps 20 \ - --n_envs 5 -``` - -# Full task list - -- `gr00tlocomanip_g1_sim/LMPnPAppleToPlateDC_G1_gear_wbc` - - - -# Real-robot Fine-tuning - -When working with real-robot data, you have two options depending on your setup: - -**Option 1: Using GR00T-WholeBodyControl repo for data collection** - -If you collected your data using the [GR00T-WholeBodyControl](https://github.com/NVlabs/GR00T-WholeBodyControl), you can leverage the `UNITREE_G1` embodiment tag. This is a pre-trained embodiment that comes with models already trained on in-the-wild Unitree G1 datasets. - -**Option 2: Using a different whole-body controller** - -If your data was collected using a different whole-body controller, we strongly recommend creating and finetuning with a `NEW_EMBODIMENT` tag. This allows you to define a custom embodiment tag tailored to your specific controller setup. Detailed instructions can be found in the [finetune new embodiment guide](../../getting_started/finetune_new_embodiment.md). diff --git a/examples/GR00T-WholeBodyControl/finetune_g1.sh b/examples/GR00T-WholeBodyControl/finetune_g1.sh deleted file mode 100644 index 33bbb6f96..000000000 --- a/examples/GR00T-WholeBodyControl/finetune_g1.sh +++ /dev/null @@ -1,21 +0,0 @@ - -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/GR00T-WholeBodyControl/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim/unitree_g1.LMPnPAppleToPlateDC \ - --embodiment_tag UNITREE_G1 \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/g1_finetune \ - --save_total_limit 5 \ - --max_steps 10000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 1024 \ - --dataloader_num_workers 6 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 diff --git a/examples/GR00TWholeBodyControl/README.md b/examples/GR00TWholeBodyControl/README.md new file mode 100644 index 000000000..7f1d35e80 --- /dev/null +++ b/examples/GR00TWholeBodyControl/README.md @@ -0,0 +1,115 @@ +# GR00T Whole-Body Control Real-World Benchmark + +This example reports a real-world Unitree G1 evaluation using **Isaac GR00T N1.7** together with **GR00T Whole-Body Control / GEAR-SONIC**. The benchmark focuses on everyday mobile-manipulation tasks that require walking, table approach, grasping, foot placement, and whole-body pickup motions. + +## Summary + +GR00T N1.7 with SONIC can execute closed-loop whole-body skills on a real humanoid robot. The main targeted task is **walk to a table and pick up an object**. A single mixed-object policy was trained from demonstrations covering about 50 table-top objects, then evaluated systematically across 8 representative objects in the training set. This follows the object-pickup setting studied in the [SONIC paper](https://nvlabs.github.io/GEAR-SONIC/static/pdf/sonic_paper.pdf), where the robot walks to a table, locates a target object, and grasps it under randomized table heights and object positions. A second task-specific policy was trained for walking to a small table, picking up a soda can, stepping on a trash-can trigger, and dropping the can inside. + +For more GR00T Whole-Body Control task examples, see the [GEAR-SONIC project page](https://nvlabs.github.io/GEAR-SONIC/). + +## Evaluation Results + +| Task Family | Policy Setup | Task Specification | Logged Trials | Successes | Success Rate | +| --- | --- | --- | ---: | ---: | ---: | +| Walk to table and pick up object | Single mixed-object pickup policy | Walk to the table, localize a target object, grasp it, and lift it. Evaluated on 8 objects across 3 table heights and 9 object placements. Autonomous retries count as success. | 216 | 159 | 73.6% | +| Soda can from small table to trash can | Task-specific soda-can policy | Walk toward a small table, pick up a soda can, rotate toward the trash can, step on the trigger, and drop the can inside. | 12 | 8 | 66.7% | + +For object pickup, each object was evaluated with 27 trials: 3 table heights (24, 27, and 30 inches) crossed with a 3 by 3 grid of object placements on the table (left/middle/right and front/middle/back). The failures were mostly grasp failures: the gripper missed the object, contacted it from an unstable grasp point, pushed it out of reach, or dropped it into a pose that the policy could not recover from. The soda-can failures were similarly dominated by missed grasps, unstable grasps, or missed trigger steps. + +### Object Pickup Breakdown + +| Object | Trials | Successes | Success Rate | +| --- | ---: | ---: | ---: | +| Towel | 27 | 24 | 88.9% | +| Shoe | 27 | 14 | 51.9% | +| Apple | 27 | 19 | 70.4% | +| Scoop | 27 | 18 | 66.7% | +| Lamp | 27 | 17 | 63.0% | +| Flashlight | 27 | 20 | 74.1% | +| Fruit | 27 | 26 | 96.3% | +| Sock | 27 | 21 | 77.8% | + +## Demo Videos + +The MP4 samples below are attached as video files in this repository. Click any preview image to open the corresponding MP4. The source tree intentionally keeps only a curated sample set; full per-trial review videos are better shared as supplementary material through a stable gallery or archive. For more task demos beyond these two quantified results, see the [GEAR-SONIC project page](https://nvlabs.github.io/GEAR-SONIC/). + +### Walk To Table And Pick Up Objects + +Representative examples are included for the evaluated object pickup task. Captions describe the behavior visible in the clip; some successful clips include retries, regrasping, object contact, or small recovery motions because autonomous recovery was counted as success during evaluation. A trial is considered failure when it stucks for over 30s without progress. + +| Object | Example 1 | Example 2 | +| --- | --- | --- | +| Lamp | [Lamp pickup from a 24-inch table placement](media/g1_real_eval/videos/mixed_pickup_lamp_01_pickup_success.mp4)
Picks up the lamp from a 24-inch table | [Lamp base grasp after contact at a 30-inch table placement](media/g1_real_eval/videos/mixed_pickup_lamp_02_base_grasp_success.mp4)
Contacts the lamp, then grasps the base | +| Towel | [Towel pickup from a 24-inch table placement](media/g1_real_eval/videos/mixed_pickup_towel_01_pickup_success.mp4)
Picks up the towel | [Towel grasp, drop, and regrasp sequence](media/g1_real_eval/videos/mixed_pickup_towel_02_regrasp_success.mp4)
Grasps, drops, and regrasps | +| Apple | [Apple pickup after a retry grasp](media/g1_real_eval/videos/mixed_pickup_apple_01_retry_success.mp4)
Retries the grasp and succeeds | [Apple pickup after gripper adjustment over the object](media/g1_real_eval/videos/mixed_pickup_apple_02_adjust_success.mp4)
Adjusts over the apple before lifting | +| Shoe | [Shoe pickup after multiple grasp attempts](media/g1_real_eval/videos/mixed_pickup_shoe_01_many_attempts_success.mp4)
Succeeds after several attempts | [Shoe drop and regrasp success](media/g1_real_eval/videos/mixed_pickup_shoe_02_regrasp_success.mp4)
Drops the shoe, then regrasps | +| Scoop | [Scoop pickup from a 27-inch table placement](media/g1_real_eval/videos/mixed_pickup_scoop_01_pickup_success.mp4)
Picks up the scoop | [Scoop pickup with noisy approach motion](media/g1_real_eval/videos/mixed_pickup_scoop_02_noisy_success.mp4)
Noisy approach, successful pickup | +| Flashlight | [Smooth flashlight pickup](media/g1_real_eval/videos/mixed_pickup_flashlight_01_smooth_success.mp4)
Smooth pickup | [Flashlight pickup from a 27-inch table placement](media/g1_real_eval/videos/mixed_pickup_flashlight_02_pickup_success.mp4)
Picks up the flashlight | +| Fruit | [Fruit pickup from a 24-inch table placement](media/g1_real_eval/videos/mixed_pickup_fruit_01_pickup_success.mp4)
Picks up the fruit | [Fruit grasp, drop, and regrasp success](media/g1_real_eval/videos/mixed_pickup_fruit_02_regrasp_success.mp4)
Grasps, drops, and regrasps | +| Sock | [Sock top-down grasp success](media/g1_real_eval/videos/mixed_pickup_sock_01_top_grasp_success.mp4)
Top-down grasp succeeds | [Sock grasp, drop, and regrasp success](media/g1_real_eval/videos/mixed_pickup_sock_02_regrasp_success.mp4)
Drops once, then regrasps | + +### Soda Can From Small Table To Trash Can + +| Task | Example 1 | Example 2 | Example 3 | +| --- | --- | --- | --- | +| Soda can to trash | [Soda can picked up and dropped into the trash can in one smooth sequence](media/g1_real_eval/videos/soda_can_table_trash_01_smooth_success.mp4)
Smooth full sequence | [Soda can succeeds after a second grasp and second trigger step](media/g1_real_eval/videos/soda_can_table_trash_02_second_grasp_step_success.mp4)
Second grasp and trigger step | [Soda can picked up and dropped into the trash can without a visible retry](media/g1_real_eval/videos/soda_can_table_trash_03_clean_success.mp4)
Single-attempt full sequence | + +## Data Collection Experience + +We followed the [GR00T Whole-Body Control data collection tutorial](https://nvlabs.github.io/GR00T-WholeBodyControl/tutorials/data_collection.html) to collect G1 whole-body manipulation datasets. + +Training a good policy depends on both collecting high-quality data and configuring training properly. Each demonstration should ideally complete the task on the first attempt, without corrective motions such as re-grasping after a failed grasp or redoing a missed stepping trigger. For the mixed object pickup policy, we trained for 60k iterations at batch size 256 on roughly 18k episodes covering about 50 different objects; for the soda-can-to-trash policy, we trained for 20k iterations at batch size 32 on roughly 150 episodes of this single task. + +### Notes + +1. The mixed pickup result uses one policy trained from a combined object dataset and evaluated across multiple table-top objects. +2. For the pickup task, we used an in-house UMI gripper design. Similar tasks may require users to build task-appropriate gripper designs for their own hardware setup. + +## Data-Train-Eval Workflow + +This benchmark used the public GR00T N1.7 and GR00T Whole-Body Control workflow: + +1. Collect G1 demonstrations with SONIC teleoperation. +2. Fine-tune GR00T N1.7 with `UNITREE_G1_SONIC`. +3. Run the GR00T policy server and the SONIC robot-side controller. +4. Evaluate in closed loop on the real robot with video recording. + +Fine-tuning used the SONIC embodiment tag: + +```bash +bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path /path/to/your/lerobot_dataset \ + --embodiment-tag UNITREE_G1_SONIC \ + --output-dir /path/to/output_checkpoint \ + --experiment-name g1-sonic-task +``` + +Closed-loop evaluation used a GR00T policy server: + +```bash +python gr00t/eval/run_gr00t_server.py \ + --model-path /path/to/output_checkpoint/checkpoint- \ + --embodiment-tag UNITREE_G1_SONIC \ + --device cuda:0 \ + --host 0.0.0.0 \ + --port 5550 +``` + +The robot-side controller follows the GR00T Whole-Body Control VLA inference workflow. + +### Notes + +- The data format should be LeRobot V2 already and ready to train the model. +- It would be beneficial to check open-loop robot joint trajectory matching against training set/validation set before deploying on real robot. +- As suggested in Data Collection Experience, data quality is preferred than quantity during post-training. + +## References + +- [NVIDIA Isaac GR00T](https://github.com/NVIDIA/Isaac-GR00T) +- [SONIC paper](https://nvlabs.github.io/GEAR-SONIC/static/pdf/sonic_paper.pdf) +- [GR00T Whole-Body Control documentation](https://nvlabs.github.io/GR00T-WholeBodyControl/) +- [GEAR-SONIC project page](https://nvlabs.github.io/GEAR-SONIC/) +- [GR00T data preparation guide](../../getting_started/data_preparation.md) +- [GR00T policy server/client guide](../../getting_started/policy.md) diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_apple_01_retry_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_apple_01_retry_success.jpg new file mode 100644 index 000000000..f6da6db91 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_apple_01_retry_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_apple_02_adjust_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_apple_02_adjust_success.jpg new file mode 100644 index 000000000..caf56915d Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_apple_02_adjust_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_flashlight_01_smooth_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_flashlight_01_smooth_success.jpg new file mode 100644 index 000000000..7fbfd229c Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_flashlight_01_smooth_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_flashlight_02_pickup_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_flashlight_02_pickup_success.jpg new file mode 100644 index 000000000..f876346b9 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_flashlight_02_pickup_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_fruit_01_pickup_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_fruit_01_pickup_success.jpg new file mode 100644 index 000000000..e7c3dd63b Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_fruit_01_pickup_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_fruit_02_regrasp_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_fruit_02_regrasp_success.jpg new file mode 100644 index 000000000..4c1c0bb7d Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_fruit_02_regrasp_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_lamp_01_pickup_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_lamp_01_pickup_success.jpg new file mode 100644 index 000000000..5d35e82b5 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_lamp_01_pickup_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_lamp_02_base_grasp_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_lamp_02_base_grasp_success.jpg new file mode 100644 index 000000000..d4aa61719 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_lamp_02_base_grasp_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_scoop_01_pickup_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_scoop_01_pickup_success.jpg new file mode 100644 index 000000000..de4bdda4f Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_scoop_01_pickup_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_scoop_02_noisy_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_scoop_02_noisy_success.jpg new file mode 100644 index 000000000..308413e2b Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_scoop_02_noisy_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_shoe_01_many_attempts_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_shoe_01_many_attempts_success.jpg new file mode 100644 index 000000000..8d0444f25 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_shoe_01_many_attempts_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_shoe_02_regrasp_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_shoe_02_regrasp_success.jpg new file mode 100644 index 000000000..4a29be37a Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_shoe_02_regrasp_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_sock_01_top_grasp_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_sock_01_top_grasp_success.jpg new file mode 100644 index 000000000..d63333af3 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_sock_01_top_grasp_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_sock_02_regrasp_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_sock_02_regrasp_success.jpg new file mode 100644 index 000000000..ebf104cd5 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_sock_02_regrasp_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_towel_01_pickup_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_towel_01_pickup_success.jpg new file mode 100644 index 000000000..e43e03a35 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_towel_01_pickup_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_towel_02_regrasp_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_towel_02_regrasp_success.jpg new file mode 100644 index 000000000..f90501135 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/mixed_pickup_towel_02_regrasp_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_01_smooth_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_01_smooth_success.jpg new file mode 100644 index 000000000..e2ee2f3d3 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_01_smooth_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_02_second_grasp_step_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_02_second_grasp_step_success.jpg new file mode 100644 index 000000000..b89208ad9 Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_02_second_grasp_step_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_03_clean_success.jpg b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_03_clean_success.jpg new file mode 100644 index 000000000..0efeaeffb Binary files /dev/null and b/examples/GR00TWholeBodyControl/media/g1_real_eval/posters/soda_can_table_trash_03_clean_success.jpg differ diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_apple_01_retry_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_apple_01_retry_success.mp4 new file mode 100644 index 000000000..1dc439c30 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_apple_01_retry_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0824648e9da9b7fd018b518b42266c71c9916b30f8d3c8ab1cc9b7086a482d51 +size 10306269 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_apple_02_adjust_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_apple_02_adjust_success.mp4 new file mode 100644 index 000000000..3f8ffe92a --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_apple_02_adjust_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f94953bbc770f7f8514b01504d08ce971a7c56eb279573078f5074a63771b7c +size 8049751 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_flashlight_01_smooth_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_flashlight_01_smooth_success.mp4 new file mode 100644 index 000000000..6d0de19bf --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_flashlight_01_smooth_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:590bd392e58bb794f50cca008bba8675db755ee3ccb277d2e3ae8ec350c3cce7 +size 2094409 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_flashlight_02_pickup_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_flashlight_02_pickup_success.mp4 new file mode 100644 index 000000000..2ecb80699 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_flashlight_02_pickup_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:246105c9b18dc81d0bf45364314cb67e6efe638c8a07d55e57d31ed49d4cd2a6 +size 3865485 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_fruit_01_pickup_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_fruit_01_pickup_success.mp4 new file mode 100644 index 000000000..580e7828a --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_fruit_01_pickup_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:577147b4ad1f3c4174dd8ec3f81ad8868c592ce031f0e5d3613c55a1e3a976eb +size 2490885 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_fruit_02_regrasp_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_fruit_02_regrasp_success.mp4 new file mode 100644 index 000000000..eb4605ce0 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_fruit_02_regrasp_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aa929eb22d25c4d84f5ac6067fff3918a230db0c71a1c4750917520c4ed0294 +size 2567365 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_lamp_01_pickup_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_lamp_01_pickup_success.mp4 new file mode 100644 index 000000000..391eda02b --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_lamp_01_pickup_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75207cf68b802ede873eebfc91d7e84f7348a4fe6e05b65314d890ee1464c918 +size 2180902 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_lamp_02_base_grasp_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_lamp_02_base_grasp_success.mp4 new file mode 100644 index 000000000..fdd947944 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_lamp_02_base_grasp_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb0b755bfce56a759cffd266ce4832c40fa624e87bbfe31be17d54aeaf7c17c9 +size 2604089 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_scoop_01_pickup_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_scoop_01_pickup_success.mp4 new file mode 100644 index 000000000..7b667b034 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_scoop_01_pickup_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fea87eda69a980b3ba5da05365e16fce3d013d364bb94f487a192142b3aaa9a +size 5620943 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_scoop_02_noisy_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_scoop_02_noisy_success.mp4 new file mode 100644 index 000000000..f94d8fea1 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_scoop_02_noisy_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3193c34ea103f53ddf35b1f5e280a9214037e07d1dea262dd2f043aeaa616a5a +size 16169924 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_shoe_01_many_attempts_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_shoe_01_many_attempts_success.mp4 new file mode 100644 index 000000000..483c49f32 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_shoe_01_many_attempts_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97ca1be038d0510837747c7a65909d71e1ff40b11f912715f2ea392d9432164e +size 5782494 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_shoe_02_regrasp_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_shoe_02_regrasp_success.mp4 new file mode 100644 index 000000000..d165b2ae5 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_shoe_02_regrasp_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8f4eb012f978e530f1b4c005a0ba3676ab897352ca66f6319fe84885963cbf0 +size 4266768 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_sock_01_top_grasp_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_sock_01_top_grasp_success.mp4 new file mode 100644 index 000000000..91a3829f0 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_sock_01_top_grasp_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d05bc4b0b86df1ff6381bef5ad3a890981bf564f4f07fdf796687665e5bccc9 +size 3050386 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_sock_02_regrasp_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_sock_02_regrasp_success.mp4 new file mode 100644 index 000000000..6eca6158f --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_sock_02_regrasp_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcdc8ecf9c520a0bd9e89bcaccacf660a1b3a73968f7f71f1c27351cd416d942 +size 6146885 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_towel_01_pickup_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_towel_01_pickup_success.mp4 new file mode 100644 index 000000000..0c09dd341 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_towel_01_pickup_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d17d549a2b50e7e2b05c33898a857a8b4f7edec3996ec49aa145734a4f31f42f +size 6054056 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_towel_02_regrasp_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_towel_02_regrasp_success.mp4 new file mode 100644 index 000000000..a9e8b8e2a --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/mixed_pickup_towel_02_regrasp_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a48ceba09c7951f97d3f3f3b4c7c2e77a0feccb482486cf6e4aa48ba0cee78bf +size 22114503 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_01_smooth_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_01_smooth_success.mp4 new file mode 100644 index 000000000..eeba94dd7 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_01_smooth_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe6a9e90e3bcfc9f6296fc7267032f20a41b7defb33503e06f6435ce2d677477 +size 794522 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_02_second_grasp_step_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_02_second_grasp_step_success.mp4 new file mode 100644 index 000000000..cd6c2e154 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_02_second_grasp_step_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c86e07a945a4d4695abdfbbb6cf7a8ee7c3ec8172ea272c503013ea76375ccb2 +size 1277472 diff --git a/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_03_clean_success.mp4 b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_03_clean_success.mp4 new file mode 100644 index 000000000..428874fe9 --- /dev/null +++ b/examples/GR00TWholeBodyControl/media/g1_real_eval/videos/soda_can_table_trash_03_clean_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02340cec59b8b2bd8976da851387e6d4b7fbc3c1f903632cce65b04702d30fb5 +size 901484 diff --git a/examples/LIBERO/README.md b/examples/LIBERO/README.md index b130133ae..1b992c845 100644 --- a/examples/LIBERO/README.md +++ b/examples/LIBERO/README.md @@ -10,6 +10,10 @@ For more information, see the [official website](https://libero-project.github.i > **Note:** The full task list is attached at the end of this document. +All four suites were finetuned with the same hyper-parameters, including +`--state-dropout-prob 0.2` (the finetune CLI default from +`gr00t/configs/finetune_config.py`). + | Task | Success rate | max_steps | grad_accum_steps | batch_size | |-----------|--------------------|-----------|------------------|------------| | Spatial | 195/200 (97.65%) | 20K | 1 | 640 | @@ -19,10 +23,10 @@ For more information, see the [official website](https://libero-project.github.i # Fine-tune LIBERO 10 (long) -To reproduce our finetune results, use the following commands to setup dataset and launch finetune experiments. Please remember to set `WANDB_API_KEY` since `--use-wandb` is turned on by default. If you don't have a WANDB account, please remove this argument: +To reproduce our finetune results, use the following commands to setup dataset and launch finetune experiments. Please remember to set `WANDB_API_KEY` since W&B logging is on by default (`USE_WANDB=1` in `examples/finetune.sh`). If you don't have a WANDB account, prepend `USE_WANDB=0` to the launch command to disable it: ```bash -huggingface-cli download \ +uv run hf download \ --repo-type dataset IPEC-COMMUNITY/libero_10_no_noops_1.0.0_lerobot \ --local-dir examples/LIBERO/libero_10_no_noops_1.0.0_lerobot/ @@ -30,15 +34,20 @@ huggingface-cli download \ cp -r examples/LIBERO/modality.json examples/LIBERO/libero_10_no_noops_1.0.0_lerobot/meta/ ``` -Run the finetune script: +Run the shared finetune launcher: ```bash -uv run bash examples/LIBERO/finetune_libero_10.sh +NUM_GPUS=8 MAX_STEPS=20000 GLOBAL_BATCH_SIZE=640 SAVE_STEPS=1000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path examples/LIBERO/libero_10_no_noops_1.0.0_lerobot/ \ + --embodiment-tag LIBERO_PANDA \ + --output-dir /tmp/libero_10 \ + --state-dropout-prob 0.2 ``` # Fine-tune LIBERO goal ```bash -huggingface-cli download \ +uv run hf download \ --repo-type dataset IPEC-COMMUNITY/libero_goal_no_noops_1.0.0_lerobot \ --local-dir examples/LIBERO/libero_goal_no_noops_1.0.0_lerobot/ @@ -48,15 +57,19 @@ cp -r examples/LIBERO/modality.json examples/LIBERO/libero_goal_no_noops_1.0.0_l cp examples/LIBERO/patches/episode_000082.mp4 examples/LIBERO/libero_goal_no_noops_1.0.0_lerobot/videos/chunk-000/observation.images.wrist_image/ ``` -Run the finetune script: +Run the shared finetune launcher: ```bash -uv run bash examples/LIBERO/finetune_libero_goal.sh +NUM_GPUS=8 MAX_STEPS=20000 GLOBAL_BATCH_SIZE=640 SAVE_STEPS=1000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path examples/LIBERO/libero_goal_no_noops_1.0.0_lerobot/ \ + --embodiment-tag LIBERO_PANDA \ + --output-dir /tmp/libero_goal ``` # Fine-tune LIBERO object ```bash -huggingface-cli download \ +uv run hf download \ --repo-type dataset IPEC-COMMUNITY/libero_object_no_noops_1.0.0_lerobot \ --local-dir examples/LIBERO/libero_object_no_noops_1.0.0_lerobot/ @@ -64,15 +77,19 @@ huggingface-cli download \ cp -r examples/LIBERO/modality.json examples/LIBERO/libero_object_no_noops_1.0.0_lerobot/meta/ ``` -Run the finetune script: +Run the shared finetune launcher: ```bash -uv run bash examples/LIBERO/finetune_libero_object.sh +NUM_GPUS=8 MAX_STEPS=20000 GLOBAL_BATCH_SIZE=640 SAVE_STEPS=1000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path examples/LIBERO/libero_object_no_noops_1.0.0_lerobot/ \ + --embodiment-tag LIBERO_PANDA \ + --output-dir /tmp/libero_object ``` # Fine-tune LIBERO spatial ```bash -huggingface-cli download \ +uv run hf download \ --repo-type dataset IPEC-COMMUNITY/libero_spatial_no_noops_1.0.0_lerobot \ --local-dir examples/LIBERO/libero_spatial_no_noops_1.0.0_lerobot/ @@ -80,41 +97,50 @@ huggingface-cli download \ cp -r examples/LIBERO/modality.json examples/LIBERO/libero_spatial_no_noops_1.0.0_lerobot/meta/ ``` -Run the finetune script: +Run the shared finetune launcher: ```bash -uv run bash examples/LIBERO/finetune_libero_spatial.sh +NUM_GPUS=8 MAX_STEPS=20000 GLOBAL_BATCH_SIZE=640 SAVE_STEPS=1000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path examples/LIBERO/libero_spatial_no_noops_1.0.0_lerobot/ \ + --embodiment-tag LIBERO_PANDA \ + --output-dir /tmp/libero_spatial ``` # Evaluate checkpoint -First, setup the evaluation simulation environment. This only needs to run once for each simulation benchmark. After it's done, we only need to launch server and client. +First, complete the [one-time simulation environment setup](../../README.md#one-time-simulation-environment-setup), then run this benchmark's setup script (only needed once per benchmark): ```bash -sudo apt update -sudo apt install libegl1-mesa-dev libglu1-mesa bash gr00t/eval/sim/LIBERO/setup_libero.sh ``` -Then, run client server evaluation under the project root directory in separate terminals: +Then, download the finetuned model to a local directory (HuggingFace does not support nested repo paths directly): +```bash +uv run hf download nvidia/GR00T-N1.7-LIBERO --include "libero_10/config.json" "libero_10/embodiment_id.json" "libero_10/model-*.safetensors" "libero_10/model.safetensors.index.json" "libero_10/processor_config.json" "libero_10/statistics.json" --local-dir checkpoints/GR00T-N1.7-LIBERO +``` + +Run client server evaluation under the project root directory in separate terminals: **Terminal 1 - Server:** ```bash uv run python gr00t/eval/run_gr00t_server.py \ - --model-path /tmp/libero_spatial/checkpoint-20000/ \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ --embodiment-tag LIBERO_PANDA \ --use-sim-policy-wrapper ``` +> **Note:** Replace `checkpoints/GR00T-N1.7-LIBERO/libero_10` with your own checkpoint path (e.g., `/tmp/libero_10/checkpoint-20000/`) if evaluating a locally finetuned model. + **Terminal 2 - Client:** ```bash gr00t/eval/sim/LIBERO/libero_uv/.venv/bin/python gr00t/eval/rollout_policy.py \ - --n_episodes 10 \ - --policy_client_host 127.0.0.1 \ - --policy_client_port 5555 \ - --max_episode_steps=720 \ - --env_name libero_sim/KITCHEN_SCENE3_turn_on_the_stove_and_put_the_moka_pot_on_it \ - --n_action_steps 8 \ - --n_envs 5 + --n-episodes 10 \ + --policy-client-host 127.0.0.1 \ + --policy-client-port 5555 \ + --max-episode-steps 720 \ + --env-name libero_sim/KITCHEN_SCENE3_turn_on_the_stove_and_put_the_moka_pot_on_it \ + --n-action-steps 8 \ + --n-envs 5 ``` # Full task list diff --git a/examples/LIBERO/finetune_libero_10.sh b/examples/LIBERO/finetune_libero_10.sh deleted file mode 100644 index cbaea8fcf..000000000 --- a/examples/LIBERO/finetune_libero_10.sh +++ /dev/null @@ -1,22 +0,0 @@ -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/LIBERO/libero_10_no_noops_1.0.0_lerobot/ \ - --embodiment_tag LIBERO_PANDA \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/libero_10 \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 20000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 640 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 \ - --state_dropout_prob 0.8 diff --git a/examples/LIBERO/finetune_libero_goal.sh b/examples/LIBERO/finetune_libero_goal.sh deleted file mode 100644 index 2e4cbb555..000000000 --- a/examples/LIBERO/finetune_libero_goal.sh +++ /dev/null @@ -1,21 +0,0 @@ -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/LIBERO/libero_goal_no_noops_1.0.0_lerobot/ \ - --embodiment_tag LIBERO_PANDA \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/libero_goal \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 20000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 640 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 diff --git a/examples/LIBERO/finetune_libero_object.sh b/examples/LIBERO/finetune_libero_object.sh deleted file mode 100644 index 5b53326dd..000000000 --- a/examples/LIBERO/finetune_libero_object.sh +++ /dev/null @@ -1,21 +0,0 @@ -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/LIBERO/libero_object_no_noops_1.0.0_lerobot/ \ - --embodiment_tag LIBERO_PANDA \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/libero_object \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 20000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 640 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 diff --git a/examples/LIBERO/finetune_libero_spatial.sh b/examples/LIBERO/finetune_libero_spatial.sh deleted file mode 100644 index ec645da3b..000000000 --- a/examples/LIBERO/finetune_libero_spatial.sh +++ /dev/null @@ -1,21 +0,0 @@ -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/LIBERO/libero_spatial_no_noops_1.0.0_lerobot/ \ - --embodiment_tag LIBERO_PANDA \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/libero_spatial \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 20000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 640 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 diff --git a/examples/PointNav/README.md b/examples/PointNav/README.md deleted file mode 100644 index 17777ff6c..000000000 --- a/examples/PointNav/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Finetuning GR00T for Point Navigation - -This guide shows how to finetune GR00T for point navigation tasks using datasets generated by [COMPASS](https://github.com/NVlabs/COMPASS). - -## Dataset - -To generate and prepare the dataset, follow the [COMPASS GR00T Post-training Guide](https://github.com/NVlabs/COMPASS?tab=readme-ov-file#gr00t-post-training-with-compass-datasets): - -1. Train residual RL specialists -2. Collect specialist distillation data -3. Convert HDF5 dataset to GR00T LeRobot format using `scripts/hdf5_to_lerobot_episodic.py` - -For a quick start, a pre-collected G1 robot dataset is available on [HuggingFace](https://huggingface.co/nvidia/COMPASS/blob/main/gr00t_post_training_g1.zip). - -## Modality Configuration - -The point navigation task uses the following input and output modalities defined in `modality.json`: - -### Inputs - -| Modality | Key | Indices | Dimension | Description | -|----------|-----|---------|-----------|-------------| -| Video | `ego_view` | - | H×W×3 | Ego-centric RGB camera image | -| State | `speed` | [0, 1) | 1 | Robot forward speed | -| State | `route` | [1, 41) | 40 | Route segments in robot frame (10 segments × 4 values: x_start, y_start, x_end, y_end) | -| State | `goal_heading` | [41, 43) | 2 | Goal heading direction (cos θ, sin θ) | -| Language | `task_description` | - | - | Robot Navigation Task | - -### Outputs - -| Modality | Key | Indices | Dimension | Description | -|----------|-----|---------|-----------|-------------| -| Action | `vel_cmd` | [0, 3) | 3 | Velocity command (vx, vy, ωz) | - -## Finetuning - -Run the finetuning script: - -```bash -uv run bash examples/PointNav/finetune_point_nav.sh -``` - -Remember to update the script with your dataset and output paths: -- `--dataset-path`: Path to the converted LeRobot format dataset -- `--output-dir`: Directory to save checkpoints - -## Evaluation - -**Step 1**: Launch the GR00T inference server: - -```bash -uv run python gr00t/eval/run_gr00t_server.py \ - --model-path \ - --embodiment-tag NEW_EMBODIMENT \ - --device cuda:0 \ - --host 0.0.0.0 \ - --port 8888 -``` - -**Step 2**: Run the COMPASS evaluation following the [evaluation instructions](https://github.com/NVlabs/COMPASS?tab=readme-ov-file#gr00t-post-training-with-compass-datasets). - -### Results - -Task success rate on 640 randomized test cases: - -| Model | In-Distribution | Out-of-Distribution | -|:------|:---------------:|:-------------------:| -| GR00T N1.6 | 86.3% | 76.5% | -| GR00T N1.5 | 86.1% | 77.6% | -| COMPASS (baseline) | 84.7% | 45.6% | diff --git a/examples/PointNav/finetune_point_nav.sh b/examples/PointNav/finetune_point_nav.sh deleted file mode 100644 index da5163fa4..000000000 --- a/examples/PointNav/finetune_point_nav.sh +++ /dev/null @@ -1,22 +0,0 @@ -set -x -e - -export NUM_GPUS=1 - -CUDA_VISIBLE_DEVICES=0 python \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path \ - --modality_config_path examples/PointNav/modality_config.py \ - --embodiment_tag NEW_EMBODIMENT \ - --num_gpus $NUM_GPUS \ - --output_dir \ - --save_steps 2000 \ - --save_total_limit 5 \ - --max_steps 40000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 32 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 diff --git a/examples/PointNav/modality.json b/examples/PointNav/modality.json deleted file mode 100644 index ba43e28c8..000000000 --- a/examples/PointNav/modality.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "state": { - "speed": { - "start": 0, - "end": 1 - }, - "route": { - "start": 1, - "end": 41 - }, - "goal_heading": { - "start": 41, - "end": 43 - } - }, - "action": { - "vel_cmd": { - "start": 0, - "end": 3 - } - }, - "video": { - "ego_view": { - "original_key": "observation.images.ego_view" - } - }, - "annotation": { - "human.action.task_description": { - "original_key": "annotation.human.action.task_description" - }, - "human.validity": { - "original_key": "annotation.human.validity" - } - } -} \ No newline at end of file diff --git a/examples/PointNav/modality_config.py b/examples/PointNav/modality_config.py deleted file mode 100644 index 7cb8022b1..000000000 --- a/examples/PointNav/modality_config.py +++ /dev/null @@ -1,48 +0,0 @@ -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.data.embodiment_tags import EmbodimentTag -from gr00t.data.types import ModalityConfig - - -point_nav_config = { - "video": ModalityConfig( - delta_indices=[0], - modality_keys=["ego_view"], - ), - "state": ModalityConfig( - delta_indices=[0], - modality_keys=[ - "speed", - "route", - "goal_heading", - ], - ), - "action": ModalityConfig( - delta_indices=[ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - ], - modality_keys=[ - "vel_cmd", - ], - ), - "language": ModalityConfig( - delta_indices=[0], - modality_keys=["annotation.human.action.task_description"], - ), -} - -register_modality_config(point_nav_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/examples/RoboLab/README.md b/examples/RoboLab/README.md new file mode 100644 index 000000000..ee6467d4e --- /dev/null +++ b/examples/RoboLab/README.md @@ -0,0 +1,276 @@ +# GR00T N1.7 on RoboLab + +This guide shows the validated path for running the finetuned GR00T N1.7 DROID checkpoint on RoboLab tasks through the GR00T policy server. + +## Why the DROID Checkpoint + +RoboLab directly uses the DROID checkpoint published with the GR00T N1.7 General Availability (GA) release, without any RoboLab-specific finetuning. + +## Validation Snapshot + +The current release baseline uses the public GR00T N1.7 DROID checkpoint and RoboLab's built-in GR00T client: + +- GR00T model: `nvidia/GR00T-N1.7-DROID` +- Embodiment tag: `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` +- RoboLab execution horizon: `--open-loop-horizon 8` +- Diffusion inference timesteps: model/release default, 4 denoising steps +- Episodes: 40 per task, 120 tasks + +| Setup | Tasks | Episodes | Successes | Success rate | +| --- | ---: | ---: | ---: | ---: | +| GR00T N1.7 DROID + RoboLab ([client](https://github.com/NVlabs/RoboLab/tree/main/policies/gr00t)) | 120 | 4,800 | 412 | 8.58% | +| N1.6 reference ([branch](https://github.com/nadunRanawaka1/Isaac-GR00T-n16-droid)) | 120 | 1,200 | 87 | 7.25% | + +`--open-loop-horizon 8` is part of the reproduced result. It controls how many rows from each predicted action chunk RoboLab executes before querying the GR00T server again. It is separate from the model checkpoint action horizon. + +## Successful Tasks + +The N1.7 full-suite wins are concentrated in visually clear pick/place and short-horizon manipulation tasks: + +| Task | Successes | +| --- | ---: | +| `BananaOnPlateTask` | 40/40 | +| `BananasInBinThreeTotalTask` | 38/40 | +| `UnstackRubiksCubeTask` | 38/40 | +| `SauceBottlesCrateTask` | 33/40 | +| `RubiksCubeOrBananaTask` | 32/40 | +| `BananaInBowlTask` | 31/40 | +| `BananasInBinOneMoreTask` | 31/40 | +| `RubiksCubeTask` | 25/40 | +| `RubiksCubeThenBananaTask` | 19/40 | +| `BananasInCrateTask` | 18/40 | +| `FoodPacking1CansTask` | 16/40 | +| `RedDishesInBinTask` | 15/40 | +| `TakeMeasuringSpoonOutTask` | 12/40 | + +Failures are more common on cluttered scenes, long-horizon packing, precise shelf placement, and sequential tasks that need recovery after a poor grasp. + +## Video Showcases + +The final full-suite run used `--video-mode none`, so the success-rate table above is the authoritative quantitative result but not the source of MP4s. The videos below are all unique task families with at least one confirmed successful trial in the recovered diagnostic video runs. Some high-success tasks from the final table are not shown because their video shards were not recoverable. + +Click any preview image to open the corresponding MP4. + +| Task | Demo | +| --- | --- | +| Rubik's Cube in Bowl | [Rubik's cube is picked and placed into the bowl](media/robolab/videos/robolab_rubiks_cube_success.mp4)
Fast single-object grasp and bowl placement. | +| Unstack Rubik's Cubes | [Rubik's cube tower is unstacked](media/robolab/videos/robolab_unstack_rubiks_cube_success.mp4)
Short-horizon unstacking behavior. | +| Sauce Bottle to Crate | [Red sauce bottle is moved into the crate](media/robolab/videos/robolab_sauce_bottle_crate_success.mp4)
Bottle grasp and placement into a constrained crate. | +| Rubik's Cube and Banana | [Rubik's cube and banana are placed into the bowl](media/robolab/videos/robolab_rubiks_cube_and_banana_success.mp4)
Two-object bowl placement. | +| Rubik's Cube then Banana | [Rubik's cube and banana are placed into the bowl in sequence](media/robolab/videos/robolab_rubiks_cube_then_banana_success.mp4)
Sequential cube-and-banana bowl placement. | +| Red Dishware to Bin | [Red dishware is moved into the grey bin](media/robolab/videos/robolab_red_dishes_bin_success.mp4)
Color-conditioned dishware sorting. | +| Measuring Spoon Out | [Measuring spoon is taken out of the bowl and placed on the table](media/robolab/videos/robolab_take_measuring_spoon_out_success.mp4)
Extracts the measuring spoon from the bowl and places it on the table. | +| Butter on Raisin Box | [Butter box is placed on top of the raisin box](media/robolab/videos/robolab_butter_above_raisin_success.mp4)
Places one boxed object on top of another. | +| Mustard on Raisin Box | [Mustard bottle is placed on top of the raisin box](media/robolab/videos/robolab_mustard_above_raisin_success.mp4)
Longer placement sequence with a tall object. | +| Plastic Bottles to Pail | [Small plastic bottles are placed into the square pail](media/robolab/videos/robolab_plastic_bottles_square_pail_success.mp4)
Multi-object pail placement. | +| Bowl to Shelf | [Serving bowl is placed on the shelf](media/robolab/videos/robolab_put_bowl_on_shelf_success.mp4)
Places a bowl onto the shelf. | + +## N1.6 Reference + +The N1.6 comparison used the RoboLab author's N1.6 DROID branch: + +- Code reference: [`nadunRanawaka1/Isaac-GR00T-n16-droid`](https://github.com/nadunRanawaka1/Isaac-GR00T-n16-droid) +- Model: [`nvidia/GR00T-N1.6-DROID`](https://huggingface.co/nvidia/GR00T-N1.6-DROID) +- Embodiment: `OXE_DROID` / `oxe_droid:16` +- Dashboard reference: `87/1200 = 7.25%` +- Local reproduction: `94/1200 = 7.83%` + +The N1.6 runs used 10 trials per task. The N1.7 release run above used 40 trials per task, so compare success rates rather than raw success counts. + +## Reproduction Steps + +### Parameters + +| Setting | Value | +| --- | --- | +| Model | `nvidia/GR00T-N1.7-DROID` | +| Embodiment tag | `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` | +| GR00T server wrapper | `--use-sim-policy-wrapper` | +| Inference timesteps | Release default, 4, tried 8, giving similar result | +| RoboLab execution horizon | `--open-loop-horizon 8` | +| Observation cameras | left exterior + left wrist | +| Image transport | HWC `uint8`, no letterbox or black padding, `180x320` | + +### Install + +Set up Isaac-GR00T and RoboLab in separate environments. First, install Isaac-GR00T for the policy server. See the main [environment setup guide](../../README.md#set-up-the-environment) for platform-specific system requirements: + +```bash +git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T.git +cd Isaac-GR00T +curl -LsSf https://astral.sh/uv/install.sh | sh +uv sync --python 3.12 +``` + +GR00T N1.7 requires access to the gated [`nvidia/Cosmos-Reason2-2B`](https://huggingface.co/nvidia/Cosmos-Reason2-2B) backbone. Request access on the model page, then authenticate: + +```bash +uv run huggingface-cli login +``` + +In a separate terminal, install RoboLab for the simulation client. RoboLab's `uv sync` installs Isaac Sim, Isaac Lab, and the GR00T client dependencies: + +```bash +git clone https://github.com/NVlabs/RoboLab.git +cd RoboLab +sudo apt install ffmpeg +uv venv --python 3.11 +source .venv/bin/activate +uv sync +``` + +RoboLab should provide the GR00T runner: + +```bash +uv run python policies/gr00t/run.py --help +``` + +### Start GR00T + +Start one GR00T server: + +```bash +cd Isaac-GR00T + +CUDA_VISIBLE_DEVICES=0 uv run python gr00t/eval/run_gr00t_server.py \ + --model-path nvidia/GR00T-N1.7-DROID \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --device cuda \ + --host 127.0.0.1 \ + --port 5555 \ + --use-sim-policy-wrapper +``` + +The server is ready when it prints: + +```text +Server is ready and listening on tcp://127.0.0.1:5555 +``` + +The command above assumes the server and client run on the same host. For a separate server host, bind the server to an appropriate private interface, pass its reachable hostname to RoboLab's `--remote-host`, and restrict port `5555` to the intended network boundary. + +### Run RoboLab + +Isaac Sim checks EULA acceptance when the process starts. Export the variable in every new terminal before launching RoboLab: + +```bash +export OMNI_KIT_ACCEPT_EULA=Y +``` + +To avoid repeating this command, persist it in your shell startup file (for example, `~/.bashrc`) or environment launcher. + +Run a smoke test first: + +```bash +cd RoboLab + +CUDA_VISIBLE_DEVICES=0 uv run python policies/gr00t/run.py \ + --headless \ + --remote-host 127.0.0.1 \ + --remote-port 5555 \ + --task BananaOnPlateTask \ + --num-envs 10 \ + --num-runs 1 \ + --open-loop-horizon 8 \ + --instruction-type default \ + --video-mode none +``` + +For a more stable estimate, use the largest `--num-envs` that fits GPU memory: + +```bash +CUDA_VISIBLE_DEVICES=0 uv run python policies/gr00t/run.py \ + --headless \ + --remote-host 127.0.0.1 \ + --remote-port 5555 \ + --task BananaOnPlateTask \ + --num-envs 40 \ + --num-runs 1 \ + --open-loop-horizon 8 \ + --instruction-type default \ + --video-mode none +``` + +Useful setup-smoke tasks: + +- `BananaOnPlateTask` +- `BananaInBowlTask` +- `BananasInBinThreeTotalTask` +- `UnstackRubiksCubeTask` +- `SauceBottlesCrateTask` + +### Example 4-GPU Layout + +For faster evaluation on a 4-GPU node, run two GR00T servers and two RoboLab workers: + +| GPU | Process | +| --- | --- | +| 0 | GR00T server A | +| 1 | GR00T server B | +| 2 | RoboLab eval worker A | +| 3 | RoboLab eval worker B | + +Each RoboLab worker should point to a different server port and receive a disjoint task shard. Keep the same model, embodiment tag, horizon, camera, image, and video settings across shards. + +The GR00T server and Robolab client can also share a GPU, with smaller `--num-envs` parallel environments. + +## RoboLab Observation Contract + +The N1.7 DROID client sends this request shape to the policy server: + +| Group | Key | Shape | Dtype | +| --- | --- | --- | --- | +| Video | `video.exterior_image_1_left` | `[B, T, H, W, 3]` | `uint8` | +| Video | `video.wrist_image_left` | `[B, T, H, W, 3]` | `uint8` | +| State | `state.eef_9d` | `[B, T, 9]` | `float32` | +| State | `state.joint_position` | `[B, T, 7]` | `float32` | +| State | `state.gripper_position` | `[B, T, 1]` | `float32` | +| Language | `annotation.language.language_instruction` | `[B]` | string | + +Use `T=1` for the current baseline. Map RoboLab `over_shoulder_left_camera` to GR00T `exterior_image_1_left`, and RoboLab `wrist_cam` to GR00T `wrist_image_left`. + +The GR00T response contains chunked `action.joint_position` and `action.gripper_position`. Concatenate those actions and execute only the first 8 rows before querying the server again. + +## Image Handling + +Do not letterbox. Do not add black bars. + +The validated RoboLab client sends 16:9 HWC `uint8` images at `180x320`. This is only the transport size; the N1.7 processor still applies its model-side image transform after receiving the image. + +Avoid square client images unless deliberately running an ablation. Square stretching changes scene geometry, and square padding reintroduces letterbox bars. + +## Ablation Notes + +Useful checks from the validation sweep: + +| Factor | Outcome | +| --- | --- | +| 8 denoising steps instead of 4 | No meaningful full-suite improvement; roughly doubles DiT inference work. | +| Additional camera inputs | No stable improvement over left exterior + left wrist in the tested configs. | +| History frames | No stable improvement in the tested configs. | + +## Outputs And Dashboard + +For throughput sweeps, use `--video-mode none`. RoboLab still writes run summaries, task logs, HDF5 trajectories, timing, and per-task result rows. + +For inspectable diagnostic runs, use: + +```bash +--video-mode all --enable-subtask +``` + +`--video-mode all` writes both policy/sensor and viewport mp4s beside the task outputs. `--enable-subtask` populates score and failure-reason fields when task subtask tracking is available. + +The RoboLab dashboard reads an output directory containing run folders: + +```bash +robolab-dashboard --output-dir RoboLab/output --port 8080 +``` + +The dashboard uses `episode_results.jsonl` as the canonical per-episode summary and discovers mp4s, per-env logs, and HDF5 files from each task directory. + +## Troubleshooting + +If the server returns `SVD did not converge`, save the task name and server log. This is a numerical robustness issue in the action decode path, not a RoboLab installation problem. + +If RoboLab crashes before launching IsaacSim, check for duplicate argparse flags between RoboLab and IsaacLab's `AppLauncher`. diff --git a/examples/RoboLab/media/robolab/posters/robolab_butter_above_raisin_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_butter_above_raisin_success.jpg new file mode 100644 index 000000000..18352c161 Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_butter_above_raisin_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_mustard_above_raisin_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_mustard_above_raisin_success.jpg new file mode 100644 index 000000000..ff422e894 Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_mustard_above_raisin_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_plastic_bottles_square_pail_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_plastic_bottles_square_pail_success.jpg new file mode 100644 index 000000000..ddab7c42c Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_plastic_bottles_square_pail_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_put_bowl_on_shelf_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_put_bowl_on_shelf_success.jpg new file mode 100644 index 000000000..ff614920f Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_put_bowl_on_shelf_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_red_dishes_bin_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_red_dishes_bin_success.jpg new file mode 100644 index 000000000..23938d71c Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_red_dishes_bin_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_and_banana_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_and_banana_success.jpg new file mode 100644 index 000000000..f007de452 Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_and_banana_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_success.jpg new file mode 100644 index 000000000..865669d9a Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_then_banana_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_then_banana_success.jpg new file mode 100644 index 000000000..a21bd6ec2 Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_rubiks_cube_then_banana_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_sauce_bottle_crate_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_sauce_bottle_crate_success.jpg new file mode 100644 index 000000000..745522dbd Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_sauce_bottle_crate_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_take_measuring_spoon_out_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_take_measuring_spoon_out_success.jpg new file mode 100644 index 000000000..1deea8367 Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_take_measuring_spoon_out_success.jpg differ diff --git a/examples/RoboLab/media/robolab/posters/robolab_unstack_rubiks_cube_success.jpg b/examples/RoboLab/media/robolab/posters/robolab_unstack_rubiks_cube_success.jpg new file mode 100644 index 000000000..abc2d1977 Binary files /dev/null and b/examples/RoboLab/media/robolab/posters/robolab_unstack_rubiks_cube_success.jpg differ diff --git a/examples/RoboLab/media/robolab/videos/robolab_butter_above_raisin_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_butter_above_raisin_success.mp4 new file mode 100644 index 000000000..dd209c45c --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_butter_above_raisin_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8f4920d330306499a0146c5139d23afd4e9f4e0bba9370dba96da679be4478c +size 2671847 diff --git a/examples/RoboLab/media/robolab/videos/robolab_mustard_above_raisin_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_mustard_above_raisin_success.mp4 new file mode 100644 index 000000000..c52ceeb9b --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_mustard_above_raisin_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a907b9ac4d8a380080f2a1e433ec86b6fa739e2a9e67b170cf8ac120e3a1025 +size 8778425 diff --git a/examples/RoboLab/media/robolab/videos/robolab_plastic_bottles_square_pail_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_plastic_bottles_square_pail_success.mp4 new file mode 100644 index 000000000..0c1d90bc7 --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_plastic_bottles_square_pail_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66fcf9cfa774a2eb4971292204c02e47890f06b024929bdfb34cd3af7db98fb9 +size 10919263 diff --git a/examples/RoboLab/media/robolab/videos/robolab_put_bowl_on_shelf_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_put_bowl_on_shelf_success.mp4 new file mode 100644 index 000000000..48a53c8fe --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_put_bowl_on_shelf_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:185b277fd9e19183b4fa9d17ead99f6935d78e3596cc6dd576e866443ec775da +size 7000750 diff --git a/examples/RoboLab/media/robolab/videos/robolab_red_dishes_bin_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_red_dishes_bin_success.mp4 new file mode 100644 index 000000000..5d0abcf5f --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_red_dishes_bin_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac75e1ab00b1c742d08ba31501145840dd8785bcb5030a47ed915b754fda288d +size 7880229 diff --git a/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_and_banana_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_and_banana_success.mp4 new file mode 100644 index 000000000..96013b170 --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_and_banana_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:893d5184b29e7d219b51736f758ca68e2d192fea71575791e8b13475cab220ee +size 4618361 diff --git a/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_success.mp4 new file mode 100644 index 000000000..929a340f1 --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94c286b00efdf46248ad7b9bf02c32f0119a67b98c08137ffc4776d24fc80cbc +size 2101980 diff --git a/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_then_banana_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_then_banana_success.mp4 new file mode 100644 index 000000000..d395e4235 --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_rubiks_cube_then_banana_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c95ddf1450417831df34d8b331aa253fe389d3e7241c0c3a198459fca442e09 +size 4177565 diff --git a/examples/RoboLab/media/robolab/videos/robolab_sauce_bottle_crate_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_sauce_bottle_crate_success.mp4 new file mode 100644 index 000000000..1f9d31a16 --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_sauce_bottle_crate_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a611178d5c21374976c9a53aaffffd49b30ad3a24f3aefd5099d520363751ba +size 3239867 diff --git a/examples/RoboLab/media/robolab/videos/robolab_take_measuring_spoon_out_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_take_measuring_spoon_out_success.mp4 new file mode 100644 index 000000000..c44f92d28 --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_take_measuring_spoon_out_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75f59763533fd9eceb34d1baaf23d2564bec372aeb26e6b42f0f30e50e89ca5c +size 5065565 diff --git a/examples/RoboLab/media/robolab/videos/robolab_unstack_rubiks_cube_success.mp4 b/examples/RoboLab/media/robolab/videos/robolab_unstack_rubiks_cube_success.mp4 new file mode 100644 index 000000000..8681c5993 --- /dev/null +++ b/examples/RoboLab/media/robolab/videos/robolab_unstack_rubiks_cube_success.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47e73928b980508558fa2f74eb8ca0642f475bb046e6390081acdcb026e17b41 +size 688486 diff --git a/examples/SO100/README.md b/examples/SO100/README.md index bb3a6b11c..4981c1d2a 100644 --- a/examples/SO100/README.md +++ b/examples/SO100/README.md @@ -1,79 +1,124 @@ -# Finetuning SO100 Model +# Finetuning Models for the SO100/SO101 Robot -This guide shows how to finetune dataset collected from [SO100](https://huggingface.co/docs/lerobot/en/so101) robot, and evaluate the model on the real robot. +This guide shows how to finetune a dataset collected from the [SO101](https://huggingface.co/docs/lerobot/en/so101) robot, and evaluate the model on the real robot. +## Setup + +Set an environment variable pointing at your local clone of this repository, then `cd` into it. Every step below references `$GR00T_REPO`, so export it in each terminal you open (or add it to your shell profile). + +```bash +export GR00T_REPO=~/Isaac-GR00T # update to match your path +cd "$GR00T_REPO" +``` ## Dataset -To collect the dataset via teleoperation, please refer to the official documentation in lerobot: https://huggingface.co/docs/lerobot/il_robots?teleoperate_so101=Command +To collect the dataset via teleoperation, calibrate the robot, and determine camera indices, please refer to the official documentation in lerobot: https://huggingface.co/docs/lerobot/il_robots + +If you do not have a dataset, you can use this one as a basic test of the workflow. **Dataset Path:** [izuluaga/finish_sandwich](https://huggingface.co/datasets/izuluaga/finish_sandwich) Visualize it with this [link](https://huggingface.co/spaces/lerobot/visualize_dataset?path=%2Fizuluaga%2Ffinish_sandwich%2Fepisode_0) -## Handling the dataset +## Converting the Dataset + +1. From the repository root, run the following command to convert the dataset to the LeRobot v2 format necessary for finetuning. ```bash -uv run python scripts/lerobot_conversion/convert_v3_to_v2.py --repo-id izuluaga/finish_sandwich \ +cd "$GR00T_REPO" +uv run --project scripts/lerobot_conversion \ + python scripts/lerobot_conversion/convert_v3_to_v2.py \ + --repo-id izuluaga/finish_sandwich \ --root examples/SO100/finish_sandwich_lerobot ``` -Then move the `modality.json` file to the root of the dataset. +2. Copy the `modality.json` file for the SO100 to the root of the dataset. ```bash -cp modality.json examples/SO100/finish_sandwich_lerobot/meta/modality.json +cp examples/SO100/modality.json examples/SO100/finish_sandwich_lerobot/izuluaga/finish_sandwich/meta/modality.json ``` -## Finetuning +## Finetuning the Model -Run the finetuning script using absolute joint positions (feel free to experiment with relative positions): +1. Run the shared finetune launcher directly, this will use relative actions by default for all axes except the gripper. ```bash -uv run bash examples/SO100/finetune_so100.sh +CUDA_VISIBLE_DEVICES=0 NUM_GPUS=1 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path examples/SO100/finish_sandwich_lerobot/izuluaga/finish_sandwich \ + --modality-config-path examples/SO100/so100_config.py \ + --embodiment-tag NEW_EMBODIMENT \ + --output-dir /tmp/so100_finetune ``` ## Open-Loop Evaluation -Evaluate the finetuned model with the following command: +1. Evaluate the finetuned model with the following command: + ```bash uv run python gr00t/eval/open_loop_eval.py \ - --dataset-path examples/SO100/finish_sandwich_lerobot \ + --dataset-path examples/SO100/finish_sandwich_lerobot/izuluaga/finish_sandwich/ \ --embodiment-tag NEW_EMBODIMENT \ --model-path /tmp/so100_finetune/checkpoint-10000 \ --traj-ids 0 \ - --action-horizon 16 \ + --execution-horizon 16 \ --steps 400 ``` +2. The script saves one plot per trajectory to `/tmp/open_loop_eval/traj_.jpeg` by default (pass `--save-plot-path` to override). Open the output directory to view the results: + +```bash +xdg-open /tmp/open_loop_eval # macOS: open /tmp/open_loop_eval +``` + ### Evaluation Results The evaluation produces visualizations comparing predicted actions against ground truth trajectories: -Open-loop evaluation results showing predicted vs ground truth trajectories +Open-loop evaluation results showing predicted vs ground truth trajectories + +To read these numbers and decide whether your fine-tune is working, see [Interpreting the Result: Is My Fine-tune Working?](../../getting_started/finetune_new_embodiment.md#interpreting-the-result-is-my-fine-tune-working). ## Closed-Loop Evaluation Please refer to [eval_so100.py](../../gr00t/eval/real_robot/SO100/eval_so100.py) for how to write SO100 deployment code using Policy API. -1. set up client side deps +1. From the `gr00t/eval/real_robot/SO100` directory, set up client side dependencies: ```bash -cd gr00t/eval/real_robot/SO100 -uv venv -source .venv/bin/activate -uv pip install -e . --verbose +cd "$GR00T_REPO/gr00t/eval/real_robot/SO100" +uv sync uv pip install --no-deps -e ../../../../ ``` -2. Start policy server +2. Start the policy server: ```bash +cd "$GR00T_REPO" uv run python gr00t/eval/run_gr00t_server.py \ --model-path /tmp/so100_finetune/checkpoint-10000 \ --embodiment-tag NEW_EMBODIMENT ``` -3. Run the eval script, as client. +3. In a second terminal, navigate to the `gr00t/eval/real_robot/SO100` directory. +```bash +cd "$GR00T_REPO/gr00t/eval/real_robot/SO100" +``` + +4. Run the eval script as the client from the `gr00t/eval/real_robot/SO100` environment created above: ```bash -uv run python gr00t/eval/real_robot/SO100/eval_so100.py - --robot.type=so101_follower --robot.port=/dev/ttyACM2 \ - --robot.id=orange_follower \ - --robot.cameras="{ wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}, front: {type: opencv, index_or_path: 6, width: 640, height: 480, fps: 30}}" --policy_host=localhost --policy_port=5555 --lang_instruction="cube into green bowl" +# Update these to match the address and indices assigned by your OS +ROBOT_PORT=/dev/ttyACM2 +ROBOT_ID=orange_follower +WRIST_CAM_IDX=2 +FRONT_CAM_IDX=6 +# Task specific prompt +PROMPT="finish the ham cheese olives sandwich" + +uv run --no-sync python eval_so100.py \ + --robot.type=so101_follower \ + --robot.port="$ROBOT_PORT" \ + --robot.id="$ROBOT_ID" \ + --robot.cameras="{ front: {type: opencv, index_or_path: $FRONT_CAM_IDX, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: $WRIST_CAM_IDX, width: 640, height: 480, fps: 30}}" \ + --policy_host=localhost \ + --policy_port=5555 \ + --lang_instruction="$PROMPT" ``` diff --git a/examples/SO100/finetune_so100.sh b/examples/SO100/finetune_so100.sh deleted file mode 100644 index ab62c806f..000000000 --- a/examples/SO100/finetune_so100.sh +++ /dev/null @@ -1,23 +0,0 @@ -set -x -e - -export NUM_GPUS=1 - -# torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ -CUDA_VISIBLE_DEVICES=0 python \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/SO100/finish_sandwich_lerobot \ - --modality_config_path examples/SO100/so100_config.py \ - --embodiment_tag NEW_EMBODIMENT \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/so100_finetune \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 10000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 32 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 diff --git a/examples/SO100/modality.json b/examples/SO100/modality.json index a17db608d..0bd3a0883 100644 --- a/examples/SO100/modality.json +++ b/examples/SO100/modality.json @@ -20,8 +20,11 @@ } }, "video": { - "webcam": { - "original_key": "observation.images.webcam" + "front": { + "original_key": "observation.images.front" + }, + "wrist": { + "original_key": "observation.images.wrist" } }, "annotation": { diff --git a/examples/SO100/so100_config.py b/examples/SO100/so100_config.py index 38eefc408..36b5f5c63 100644 --- a/examples/SO100/so100_config.py +++ b/examples/SO100/so100_config.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from gr00t.configs.data.embodiment_configs import register_modality_config from gr00t.data.embodiment_tags import EmbodimentTag from gr00t.data.types import ( @@ -10,46 +25,34 @@ so100_config = { + # Video: current frame only; keys must match "video" entries in meta/modality.json "video": ModalityConfig( delta_indices=[0], - modality_keys=["front", "wrist"], + modality_keys=["front", "wrist"], # front third-person view + wrist egocentric ), + # State: current proprioceptive reading; keys must match "state" entries in meta/modality.json "state": ModalityConfig( delta_indices=[0], modality_keys=[ - "single_arm", - "gripper", + "single_arm", # joint positions + "gripper", # gripper state ], ), + # Action: 16-step prediction horizon; one ActionConfig per modality key "action": ModalityConfig( - delta_indices=[ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - ], + delta_indices=list(range(0, 16)), # predict 16 future steps modality_keys=[ "single_arm", "gripper", ], action_configs=[ + # single_arm: RELATIVE = delta from current state (better generalization) ActionConfig( rep=ActionRepresentation.RELATIVE, - type=ActionType.NON_EEF, + type=ActionType.NON_EEF, # joint-space, not end-effector format=ActionFormat.DEFAULT, ), + # gripper: ABSOLUTE = target position (binary open/close works better absolute) ActionConfig( rep=ActionRepresentation.ABSOLUTE, type=ActionType.NON_EEF, @@ -57,6 +60,7 @@ ), ], ), + # Language: task instruction from annotation field in the dataset "language": ModalityConfig( delta_indices=[0], modality_keys=["annotation.human.task_description"], diff --git a/examples/SimplerEnv/README.md b/examples/SimplerEnv/README.md index 0900434b5..1e5762273 100644 --- a/examples/SimplerEnv/README.md +++ b/examples/SimplerEnv/README.md @@ -6,73 +6,98 @@ For more information, see the [official repository](https://github.com/simpler-e --- -# SimplerEnv Bridge (WidowX robot) evaluation benchmark result -Provided checkpoint: [nvidia/GR00T-N1.6-bridge](https://huggingface.co/nvidia/GR00T-N1.6-bridge) - -| Task | Success rate n1.6 (200) | -| --------------------------------- | ------------------ | -| widowx\_spoon\_on\_towel | 129/200 (64.5%) | -| widowx\_carrot\_on\_plate | 131/200 (65.5%) | -| widowx\_put\_eggplant\_in\_basket | 186/200 (93%) | -| widowx\_stack\_cube | 11/200 (5.5%) | -| widowx\_put\_eggplant\_in\_sink** | 80/200 (40%) | -| widowx\_close\_drawer** | 141/200 (70.5%) | -| widowx\_open\_drawer** | 191/200 (95.5%) | -| **Average** | **62.07%** | - -# SimplerEnv Fractal (Google robot) evaluation benchmark result -Provided checkpoint: [nvidia/GR00T-N1.6-fractal](https://huggingface.co/nvidia/GR00T-N1.6-fractal) -| Task | Success Rate (200) | -| ---------------------------------------- | ------------------ | -| google\_robot\_pick\_coke\_can | 195/200 (97.5%) | -| google\_robot\_pick\_object | 174/200 (87%) | -| google\_robot\_move\_near | 151/200 (75.5%) | -| google\_robot\_open\_drawer | 88/200 (44%) | -| google\_robot\_close\_drawer | 175/200 (87.5%) | -| google\_robot\_place\_in\_closed\_drawer | 29/200 (14.5%) | -| **Average** | **67.66%** | - +# Benchmark results + +These values come from the default SimplerEnv evaluation runs (the per-task success rates are listed below). + +## Bridge (WidowX robot) + +Provided checkpoints: +- [nvidia/GR00T-N1.6-bridge](https://huggingface.co/nvidia/GR00T-N1.6-bridge) +- [nvidia/GR00T-N1.7-SimplerEnv-Bridge](https://huggingface.co/nvidia/GR00T-N1.7-SimplerEnv-Bridge) + +| Task | N1.6 success rate | N1.7 success rate | +| --- | ---: | ---: | +| `widowx_spoon_on_towel` | 56/101 (55.4%) | 78/100 (78.0%) | +| `widowx_carrot_on_plate` | 46/100 (46.0%) | 58/100 (58.0%) | +| `widowx_put_eggplant_in_basket` | 89/100 (89.0%) | 53/100 (53.0%) | +| `widowx_stack_cube` | 5/100 (5.0%) | 48/100 (48.0%) | +| `widowx_put_eggplant_in_sink` | 33/100 (33.0%) | 2/100 (2.0%) | +| `widowx_close_drawer` | 73/100 (73.0%) | 97/100 (97.0%) | +| `widowx_open_drawer` | 95/100 (95.0%) | 100/100 (100.0%) | +| **Average** | **56.6%** | **62.3%** | + +## Fractal (Google Robot) + +Provided checkpoints: +- [nvidia/GR00T-N1.6-fractal](https://huggingface.co/nvidia/GR00T-N1.6-fractal) +- [nvidia/GR00T-N1.7-SimplerEnv-Fractal](https://huggingface.co/nvidia/GR00T-N1.7-SimplerEnv-Fractal) + +| Task | N1.6 success rate | N1.7 success rate | +| --- | ---: | ---: | +| `google_robot_pick_coke_can` | 95/100 (95.0%) | 100/100 (100.0%) | +| `google_robot_pick_object` | 87/100 (87.0%) | 94/100 (94.0%) | +| `google_robot_move_near` | 81/100 (81.0%) | 100/100 (100.0%) | +| `google_robot_open_drawer` | 0/100 (0.0%) | 65/100 (65.0%) | +| `google_robot_close_drawer` | 44/100 (44.0%) | 69/100 (69.0%) | +| `google_robot_place_in_closed_drawer` | 5/100 (5.0%) | 7/100 (7.0%) | +| **Average** | **52.0%** | **72.5%** | # Fine-tune Simpler Env bridge dataset (WidowX robot) -To reproduce our finetune results, use the following commands to setup dataset and launch finetune experiments. Please remember to set `WANDB_API_KEY` since `--use-wandb` is turned on by default. If you don't have a WANDB account, please remove this argument: +To reproduce our finetune results, use the following commands to setup dataset and launch finetune experiments. Please remember to set `WANDB_API_KEY` since W&B logging is on by default (`USE_WANDB=1` in `examples/finetune.sh`). If you don't have a WANDB account, prepend `USE_WANDB=0` to the launch command to disable it: ```bash -huggingface-cli download \ +uv run hf download \ --repo-type dataset IPEC-COMMUNITY/bridge_orig_lerobot \ --local-dir examples/SimplerEnv/bridge_orig_lerobot/ # Copy the patches and run the finetune script -cp -r examples/SimplerEnv/bridge_modality.json examples/SimplerEnv/bridge_orig_lerobot/meta/modality.json -uv run bash examples/SimplerEnv/finetune_bridge.sh +cp examples/SimplerEnv/bridge_modality.json examples/SimplerEnv/bridge_orig_lerobot/meta/modality.json +``` + +```bash +NUM_GPUS=8 MAX_STEPS=20000 GLOBAL_BATCH_SIZE=1024 SAVE_STEPS=1000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path examples/SimplerEnv/bridge_orig_lerobot/ \ + --embodiment-tag SIMPLER_ENV_WIDOWX \ + --output-dir /tmp/bridge_finetune \ + --state-dropout-prob 0.8 ``` # Fine-tune Simpler Env fractal dataset (Google robot) ```bash -cd examples/SimplerEnv -huggingface-cli download \ +uv run hf download \ --repo-type dataset IPEC-COMMUNITY/fractal20220817_data_lerobot \ --local-dir examples/SimplerEnv/fractal20220817_data_lerobot/ # Copy the patches and run the finetune script cp -r examples/SimplerEnv/fractal_modality.json examples/SimplerEnv/fractal20220817_data_lerobot/meta/modality.json -uv run python convert_av1_to_h264.py --root fractal20220817_data_lerobot --jobs 16 # (Optional) if AV1 doesn't work on your machine -uv run bash examples/SimplerEnv/finetune_fractal.sh +uv run python examples/SimplerEnv/convert_av1_to_h264.py --root examples/SimplerEnv/fractal20220817_data_lerobot --jobs 16 +``` + +```bash +NUM_GPUS=8 MAX_STEPS=20000 GLOBAL_BATCH_SIZE=1024 SAVE_STEPS=1000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path examples/SimplerEnv/fractal20220817_data_lerobot/ \ + --embodiment-tag SIMPLER_ENV_GOOGLE \ + --output-dir /tmp/fractal_finetune \ + --state-dropout-prob 0.5 ``` # Evaluate checkpoint -First, setup the evaluation simulation environment. This only needs to run once for each simulation benchmark. After it's done, we only need to launch server and client. +First, complete the [one-time simulation environment setup](../../README.md#one-time-simulation-environment-setup), then run this benchmark's setup script (only needed once per benchmark): ```bash -sudo apt update -sudo apt install libegl1-mesa-dev libglu1-mesa bash gr00t/eval/sim/SimplerEnv/setup_SimplerEnv.sh ``` Then, run client server evaluation under the project root directory in separate terminals: +## Fractal (Google Robot) Evaluation + **Terminal 1 - Server:** You can use either a local finetuned checkpoint path or the remote finetuned checkpoint (provided by us): @@ -81,28 +106,60 @@ You can use either a local finetuned checkpoint path or the remote finetuned che ```bash uv run python gr00t/eval/run_gr00t_server.py \ --model-path /tmp/fractal_finetune/checkpoint-30000 \ - --embodiment-tag OXE_GOOGLE \ + --embodiment-tag SIMPLER_ENV_GOOGLE \ + --use-sim-policy-wrapper +``` + +**Option 2: Remote finetuned checkpoint (directly runnable)** +```bash +uv run python gr00t/eval/run_gr00t_server.py \ + --model-path nvidia/GR00T-N1.7-SimplerEnv-Fractal \ + --embodiment-tag SIMPLER_ENV_GOOGLE \ + --use-sim-policy-wrapper +``` + +**Terminal 2 - Client:** +```bash +gr00t/eval/sim/SimplerEnv/simpler_uv/.venv/bin/python gr00t/eval/rollout_policy.py \ + --n-episodes 10 \ + --policy-client-host 127.0.0.1 \ + --policy-client-port 5555 \ + --max-episode-steps 300 \ + --env-name simpler_env_google/google_robot_pick_coke_can \ + --n-action-steps 1 \ + --n-envs 5 +``` + +## Bridge (WidowX) Evaluation + +**Terminal 1 - Server:** + +**Option 1: Local finetuned checkpoint** +```bash +uv run python gr00t/eval/run_gr00t_server.py \ + --model-path /tmp/bridge_finetune/checkpoint-30000 \ + --embodiment-tag SIMPLER_ENV_WIDOWX \ --use-sim-policy-wrapper ``` **Option 2: Remote finetuned checkpoint (directly runnable)** ```bash uv run python gr00t/eval/run_gr00t_server.py \ - --model-path nvidia/GR00T-N1.6-fractal \ - --embodiment-tag OXE_GOOGLE \ + --model-path nvidia/GR00T-N1.7-SimplerEnv-Bridge \ + --embodiment-tag SIMPLER_ENV_WIDOWX \ --use-sim-policy-wrapper ``` **Terminal 2 - Client:** ```bash gr00t/eval/sim/SimplerEnv/simpler_uv/.venv/bin/python gr00t/eval/rollout_policy.py \ - --n_episodes 10 \ - --policy_client_host 127.0.0.1 \ - --policy_client_port 5555 \ - --max_episode_steps=300 \ - --env_name simpler_env_google/google_robot_pick_coke_can \ - --n_action_steps 1 \ - --n_envs 5 + --n-episodes 10 \ + --policy-client-host 127.0.0.1 \ + --policy-client-port 5555 \ + --max-episode-steps 300 \ + --env-name simpler_env_widowx/widowx_spoon_on_towel \ + --n-action-steps 4 \ + --n-envs 5 ``` Other supported tasks are: @@ -116,4 +173,4 @@ simpler_env_widowx/widowx_carrot_on_plate simpler_env_widowx/widowx_stack_cube ``` -you can replace the env_name with the corresponding tasks listed in https://github.com/youliangtan/SimplerEnv +you can replace the env_name with the corresponding tasks listed in the SimplerEnv fork this repo pins at `external_dependencies/SimplerEnv` (see `.gitmodules`). diff --git a/examples/SimplerEnv/convert_av1_to_h264.py b/examples/SimplerEnv/convert_av1_to_h264.py index b9d5e7f09..89b80d1b9 100644 --- a/examples/SimplerEnv/convert_av1_to_h264.py +++ b/examples/SimplerEnv/convert_av1_to_h264.py @@ -1,4 +1,20 @@ #!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 argparse from concurrent.futures import ThreadPoolExecutor import os diff --git a/examples/SimplerEnv/finetune_bridge.sh b/examples/SimplerEnv/finetune_bridge.sh deleted file mode 100644 index 40e771818..000000000 --- a/examples/SimplerEnv/finetune_bridge.sh +++ /dev/null @@ -1,22 +0,0 @@ -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/SimplerEnv/bridge_orig_lerobot/ \ - --embodiment_tag OXE_WIDOWX \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/bridge_finetune \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 20000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 1024 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 \ - --state_dropout_prob 0.8 diff --git a/examples/SimplerEnv/finetune_fractal.sh b/examples/SimplerEnv/finetune_fractal.sh deleted file mode 100644 index dce22c4a2..000000000 --- a/examples/SimplerEnv/finetune_fractal.sh +++ /dev/null @@ -1,22 +0,0 @@ -set -x -e - -export NUM_GPUS=8 - -torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ - gr00t/experiment/launch_finetune.py \ - --base_model_path nvidia/GR00T-N1.6-3B \ - --dataset_path examples/SimplerEnv/fractal20220817_data_lerobot/ \ - --embodiment_tag OXE_GOOGLE \ - --num_gpus $NUM_GPUS \ - --output_dir /tmp/bridge_finetune \ - --save_steps 1000 \ - --save_total_limit 5 \ - --max_steps 20000 \ - --warmup_ratio 0.05 \ - --weight_decay 1e-5 \ - --learning_rate 1e-4 \ - --use_wandb \ - --global_batch_size 1024 \ - --color_jitter_params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \ - --dataloader_num_workers 4 \ - --state_dropout_prob 0.5 diff --git a/examples/finetune.sh b/examples/finetune.sh new file mode 100644 index 000000000..8c2dd0396 --- /dev/null +++ b/examples/finetune.sh @@ -0,0 +1,223 @@ +#!/usr/bin/env bash + +set -x -euo pipefail + +NUM_GPUS="${NUM_GPUS:-1}" +MASTER_PORT="${MASTER_PORT:-29500}" +SAVE_STEPS="${SAVE_STEPS:-1000}" +MAX_STEPS="${MAX_STEPS:-10000}" +USE_WANDB="${USE_WANDB:-1}" +DATALOADER_NUM_WORKERS="${DATALOADER_NUM_WORKERS:-4}" +GLOBAL_BATCH_SIZE="${GLOBAL_BATCH_SIZE:-32}" +SHARD_SIZE="${SHARD_SIZE:-1024}" +NUM_SHARDS_PER_EPOCH="${NUM_SHARDS_PER_EPOCH:-100000}" +EPISODE_SAMPLING_RATE="${EPISODE_SAMPLING_RATE:-0.1}" +DS_WEIGHTS_ALPHA="${DS_WEIGHTS_ALPHA:-}" + +BASE_MODEL_PATH="" +DATASET_PATH="" +MODALITY_CONFIG_PATH="" +EMBODIMENT_TAG="" +OUTPUT_DIR="" +EXPERIMENT_NAME="" +WANDB_PROJECT="" +STATE_DROPOUT_PROB="" +COLOR_JITTER_PARAMS="${COLOR_JITTER_PARAMS:-brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08}" +USE_PERCENTILES="" +SHORTEST_IMAGE_EDGE="" +CROP_FRACTION="" +EXTRA_ARGS=() + +usage() { + cat <<'EOF' +Usage: bash examples/finetune.sh \ + --base-model-path \ + --dataset-path \ + --embodiment-tag \ + --output-dir \ + [--modality-config-path ] \ + [--state-dropout-prob ] \ + [--color-jitter-params "brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08"] \ + [--use-percentiles ] \ + [--shortest-image-edge ] \ + [--crop-fraction ] \ + [--ds-weights-alpha ] \ + [--save-only-model] \ + [--resume-from-checkpoint] \ + [-- ...] +EOF +} + +while [ "$#" -gt 0 ]; do + case "$1" in + --base-model-path) + BASE_MODEL_PATH="$2" + shift 2 + ;; + --dataset-path) + DATASET_PATH="$2" + shift 2 + ;; + --modality-config-path) + MODALITY_CONFIG_PATH="$2" + shift 2 + ;; + --embodiment-tag) + EMBODIMENT_TAG="$2" + shift 2 + ;; + --output-dir) + OUTPUT_DIR="$2" + shift 2 + ;; + --experiment-name) + EXPERIMENT_NAME="$2" + shift 2 + ;; + --wandb-project) + WANDB_PROJECT="$2" + shift 2 + ;; + --state-dropout-prob) + STATE_DROPOUT_PROB="$2" + shift 2 + ;; + --color-jitter-params) + COLOR_JITTER_PARAMS="$2" + shift 2 + ;; + --use-percentiles) + USE_PERCENTILES="$2" + shift 2 + ;; + --shortest-image-edge) + SHORTEST_IMAGE_EDGE="$2" + shift 2 + ;; + --crop-fraction) + CROP_FRACTION="$2" + shift 2 + ;; + --ds-weights-alpha) + DS_WEIGHTS_ALPHA="$2" + shift 2 + ;; + --save-only-model) + SAVE_ONLY_MODEL=1 + shift + ;; + --resume-from-checkpoint) + RESUME_FROM_CHECKPOINT=1 + shift + ;; + --help|-h) + usage + exit 0 + ;; + --) + shift + EXTRA_ARGS=("$@") + break + ;; + *) + echo "Unknown argument: $1" >&2 + usage >&2 + exit 1 + ;; + esac +done + +for required_var in BASE_MODEL_PATH DATASET_PATH EMBODIMENT_TAG OUTPUT_DIR; do + if [ -z "${!required_var}" ]; then + echo "Missing required argument: ${required_var}" >&2 + usage >&2 + exit 1 + fi +done + +WANDB_FLAG=() +if [ "$USE_WANDB" = "1" ]; then + WANDB_FLAG+=(--use_wandb) +fi + +LAUNCH_CMD=( + gr00t/experiment/launch_finetune.py + --base_model_path "$BASE_MODEL_PATH" + --dataset_path "$DATASET_PATH" + --embodiment_tag "$EMBODIMENT_TAG" + --num_gpus "$NUM_GPUS" + --output_dir "$OUTPUT_DIR" + --save_steps "$SAVE_STEPS" + --save_total_limit 5 + --max_steps "$MAX_STEPS" + --warmup_ratio 0.05 + --weight_decay 1e-5 + --learning_rate 1e-4 + "${WANDB_FLAG[@]}" + --global_batch_size "$GLOBAL_BATCH_SIZE" + --dataloader_num_workers "$DATALOADER_NUM_WORKERS" + --shard_size "$SHARD_SIZE" + --num_shards_per_epoch "$NUM_SHARDS_PER_EPOCH" + --episode_sampling_rate "$EPISODE_SAMPLING_RATE" +) + +if [ -n "$MODALITY_CONFIG_PATH" ]; then + LAUNCH_CMD+=(--modality_config_path "$MODALITY_CONFIG_PATH") +fi +if [ -n "$EXPERIMENT_NAME" ]; then + LAUNCH_CMD+=(--experiment_name "$EXPERIMENT_NAME") +fi +if [ -n "$WANDB_PROJECT" ]; then + LAUNCH_CMD+=(--wandb_project "$WANDB_PROJECT") +fi + +if [ -n "$STATE_DROPOUT_PROB" ]; then + LAUNCH_CMD+=(--state_dropout_prob "$STATE_DROPOUT_PROB") +fi +if [ -n "$COLOR_JITTER_PARAMS" ]; then + read -r -a COLOR_JITTER_ARGS <<< "$COLOR_JITTER_PARAMS" + LAUNCH_CMD+=(--color_jitter_params "${COLOR_JITTER_ARGS[@]}") +fi +if [ -n "$USE_PERCENTILES" ]; then + USE_PERCENTILES_NORMALIZED="$(printf '%s' "$USE_PERCENTILES" | tr '[:upper:]' '[:lower:]')" + case "$USE_PERCENTILES_NORMALIZED" in + 1|true|yes|on) + LAUNCH_CMD+=(--use-percentiles) + ;; + 0|false|no|off) + LAUNCH_CMD+=(--no-use-percentiles) + ;; + *) + echo "Invalid --use-percentiles value: $USE_PERCENTILES" >&2 + exit 1 + ;; + esac +fi +if [ -n "$SHORTEST_IMAGE_EDGE" ]; then + LAUNCH_CMD+=(--shortest-image-edge "$SHORTEST_IMAGE_EDGE") +fi +if [ -n "$CROP_FRACTION" ]; then + LAUNCH_CMD+=(--crop-fraction "$CROP_FRACTION") +fi +if [ -n "$DS_WEIGHTS_ALPHA" ]; then + LAUNCH_CMD+=(--ds_weights_alpha "$DS_WEIGHTS_ALPHA") +fi +if [ -n "${SAVE_ONLY_MODEL:-}" ]; then + LAUNCH_CMD+=(--save_only_model) +fi +if [ -n "${RESUME_FROM_CHECKPOINT:-}" ]; then + LAUNCH_CMD+=(--resume_from_checkpoint) +fi + +if [ "${#EXTRA_ARGS[@]}" -gt 0 ]; then + LAUNCH_CMD+=("${EXTRA_ARGS[@]}") +fi + +if [ "$NUM_GPUS" = "1" ]; then + # Restrict to a single GPU so HF Trainer doesn't wrap the model in DataParallel, + # which crashes with a StopIteration error in the model's device property. + export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0}" + exec python "${LAUNCH_CMD[@]}" +fi + +exec torchrun --nproc_per_node="$NUM_GPUS" --master_port="$MASTER_PORT" "${LAUNCH_CMD[@]}" diff --git a/examples/mask-guided-background-suppression/README.md b/examples/mask-guided-background-suppression/README.md new file mode 100644 index 000000000..cdc846fa8 --- /dev/null +++ b/examples/mask-guided-background-suppression/README.md @@ -0,0 +1,203 @@ +# Mask-Guided Background Suppression + +Mask-guided augmentations leverage per-frame segmentation masks to apply targeted image transformations during training. This enables **domain randomization** on specific regions (e.g., replacing backgrounds with noise, tinting foreground objects) without affecting the rest of the image. + +This feature is controlled via the `--extra-augmentation-config` argument (the finetune CLI uses tyro, so the flag is hyphenated), which accepts a JSON string specifying which mask regions to augment and how. + +--- + +## Prerequisites + +1. **Segmentation masks** must be pre-generated and stored alongside your dataset. The dataset's `info.json` must include a `mask_path` template, and `modality.json` must define a `"mask"` section mapping camera views. + +2. **Albumentations transforms** are enabled by default in N1.7 (`use_albumentations_transforms=True` in model config). No extra flag is needed. + +--- + +## Supported Augmentation Types + +### 1. Background Noise Transform + +Replaces pixels in specified mask regions with **random RGB noise**. Useful for sim-to-real transfer or preventing the model from overfitting to static backgrounds. + +| Parameter | Type | Description | +|-----------|------|-------------| +| `target_mask_values` | `list[int]` | Mask label values to replace with noise (e.g., `[0]` for background) | +| `p` | `float` | Probability of applying the transform per frame (0.0 to 1.0) | + +### 2. Masked Region Color Transform + +Applies a **random color tint** to pixels in specified mask regions. Useful for augmenting the appearance of specific objects (e.g., tables, tools) to improve color generalization. + +| Parameter | Type | Description | +|-----------|------|-------------| +| `target_mask_values` | `list[int]` | Mask label values to apply the tint to (e.g., `[4]`, `[5]`) | +| `p` | `float` | Probability of applying the transform per frame (0.0 to 1.0) | +| `alpha_range` | `[min, max]` | Range for blending intensity between original and tint color (default: `[0.3, 1.0]`) | + +--- + +## Configuration Format + +The `--extra-augmentation-config` argument takes a JSON string with two optional keys: + +```json +{ + "background_noise_transforms": [ + {"target_mask_values": [0], "p": 0.9} + ], + "masked_region_transforms": [ + {"target_mask_values": [4], "p": 1.0, "alpha_range": [0.0, 1.0]} + ] +} +``` + +Multiple transforms of each type can be specified (e.g., different mask values with different probabilities). + +--- + +## Quick Start with Demo Data + +The included demo dataset `demo_data/cube_to_bowl_5_with_mask` contains a single episode with front and wrist camera views, along with pre-generated segmentation masks. The masks were generated using [SAM 3](https://github.com/facebookresearch/sam3) with the text prompt `"background"`, then converted so that background pixels = `0` and foreground pixels = `1` (see [Generating mask files](#generating-mask-files) below). + +### 1. Background noise only + +Replace background (mask=0) with random noise: + +```bash +uv run python test_extra_augmentation.py \ + --dataset_path ../../demo_data/cube_to_bowl_5_with_mask \ + --embodiment_tag NEW_EMBODIMENT \ + --modality_config_path so101_config.py \ + --extra_augmentation_config '{"background_noise_transforms": [{"target_mask_values": [0], "p": 1.0}]}' +``` + +### 2. Background noise + foreground color tint + +Apply both transforms together: + +```bash +uv run python test_extra_augmentation.py \ + --dataset_path ../../demo_data/cube_to_bowl_5_with_mask \ + --embodiment_tag NEW_EMBODIMENT \ + --modality_config_path so101_config.py \ + --extra_augmentation_config '{"background_noise_transforms": [{"target_mask_values": [0], "p": 1.0}], "masked_region_transforms": [{"target_mask_values": [1], "p": 1.0, "alpha_range": [0.3, 1.0]}]}' \ + --output_dir /tmp/augmentation_vis --num_frames 5 +``` + +Both commands save side-by-side comparison images (**Original | Augmented | Mask**) under `output_dir//`, with frames sampled evenly across the episode. + +### 3. Fine-tune with mask-guided augmentation + +```bash +export NUM_GPUS=8 + +torchrun --nproc_per_node=$NUM_GPUS --master_port=29500 \ + gr00t/experiment/launch_finetune.py \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path \ + --embodiment-tag \ + --num-gpus $NUM_GPUS \ + --output-dir /tmp/mask_augmentation_run \ + --save-steps 1000 \ + --save-total-limit 5 \ + --max-steps 20000 \ + --warmup-ratio 0.05 \ + --weight-decay 1e-5 \ + --learning-rate 1e-4 \ + --use-wandb \ + --global-batch-size 640 \ + --dataloader-num-workers 4 \ + --extra-augmentation-config '{"background_noise_transforms": [{"target_mask_values": [0], "p": 0.9}], "masked_region_transforms": [{"target_mask_values": [4], "p": 1.0, "alpha_range": [0, 1]}]}' +``` + +--- + +## Dataset Setup + +To use mask-guided augmentation with your own dataset, ensure: + +1. **Mask files** are stored as `.npz` files under a `masks/` directory, following the same chunk/episode structure as videos. Each `.npz` contains a single `uint8` array of shape `(num_frames, H, W)` where each pixel holds an integer semantic label (e.g., `0` = background, `1` = object A, `2` = object B). + + ``` + masks/ + └── chunk-000/ + └── observation.images.front/ + └── episode_000000_masks.npz + ``` + + See [Generating mask files](#generating-mask-files) below for how to produce these files. + +2. **`info.json`** includes a `mask_path` template: + + ```json + { + "mask_path": "masks/chunk-{episode_chunk:03d}/{mask_key}/episode_{episode_index:06d}_masks.npz" + } + ``` + +3. **`modality.json`** includes a `"mask"` section mapping view names to their original keys. The keys should match the actual camera view names in your dataset: + + ```json + { + "mask": { + "": { + "original_key": "" + } + } + } + ``` + + For example, if your dataset has `front` and `wrist` cameras: + + ```json + { + "mask": { + "front": { + "original_key": "observation.images.front" + }, + "wrist": { + "original_key": "observation.images.wrist" + } + } + } + ``` + +--- + +## Generating Mask Files + +You can generate mask files using any video segmentation model that produces per-pixel labels. The demo masks in this example were created with [SAM 3](https://github.com/facebookresearch/sam3) (see the [video predictor example](https://github.com/facebookresearch/sam3/blob/main/examples/sam3_video_predictor_example.ipynb) for SAM 3 usage). The workflow was: + +1. Run SAM 3 on each episode video with a text prompt such as `"background"`. SAM 3 returns per-frame binary masks via `propagate_in_video`. +2. Convert the binary masks into the label format expected by this pipeline (`0` = background, non-zero = foreground categories) and save as `.npz`: + +```python +import numpy as np + +# sam3_binary_masks: (num_frames, H, W) bool array from SAM 3 (True where prompt matched) +# For a "background" prompt, invert so that background=0 and foreground=1: +label_masks = (~sam3_binary_masks).astype(np.uint8) + +# For multiple prompts, merge into one label array instead: +# label_masks = np.zeros((num_frames, H, W), dtype=np.uint8) +# label_masks[prompt_0_masks] = 1 +# label_masks[prompt_1_masks] = 2 + +np.savez_compressed("episode_000000_masks.npz", label_masks) +``` + +The pipeline loads the array from the `.npz` file (it expects the key `arr_0`, which is the default for `np.savez_compressed`). A single `.npy` file containing the `(num_frames, H, W)` array also works. + +--- + +## How It Works + +The augmentation pipeline applies mask-based transforms **per-frame** before the standard augmentations (crop, resize, color jitter, etc.): + +1. For each frame, the corresponding segmentation mask is loaded. +2. `BackgroundNoiseTransform` replaces all pixels where `mask == target_value` with random RGB noise. +3. `MaskedColorTransform` blends a random color into all pixels where `mask == target_value`, controlled by `alpha_range`. +4. Standard augmentations (shared across views via replay) are then applied on top. + +This ordering ensures that mask-guided augmentations are applied independently per frame, while standard augmentations remain consistent across camera views within the same timestep. diff --git a/examples/mask-guided-background-suppression/so101_config.py b/examples/mask-guided-background-suppression/so101_config.py new file mode 100644 index 000000000..64ad59746 --- /dev/null +++ b/examples/mask-guided-background-suppression/so101_config.py @@ -0,0 +1,62 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from gr00t.configs.data.embodiment_configs import register_modality_config +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.types import ( + ActionConfig, + ActionFormat, + ActionRepresentation, + ActionType, + ModalityConfig, +) + + +so101_config = { + "video": ModalityConfig( + delta_indices=[0], + modality_keys=["front", "wrist"], + ), + "mask": ModalityConfig( + delta_indices=[0], + modality_keys=["front", "wrist"], + ), + "state": ModalityConfig( + delta_indices=[0], + modality_keys=["single_arm", "gripper"], + ), + "action": ModalityConfig( + delta_indices=list(range(16)), + modality_keys=["single_arm", "gripper"], + action_configs=[ + ActionConfig( + rep=ActionRepresentation.RELATIVE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + ), + ActionConfig( + rep=ActionRepresentation.ABSOLUTE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + ), + ], + ), + "language": ModalityConfig( + delta_indices=[0], + modality_keys=["annotation.human.task_description"], + ), +} + +register_modality_config(so101_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/examples/mask-guided-background-suppression/test_extra_augmentation.py b/examples/mask-guided-background-suppression/test_extra_augmentation.py new file mode 100644 index 000000000..43eef5f70 --- /dev/null +++ b/examples/mask-guided-background-suppression/test_extra_augmentation.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Smoke test: apply extra_augmentation_config to raw frames and save comparison images.""" + +from __future__ import annotations + +import argparse +import importlib +import json +import os +from pathlib import Path +import sys + +from gr00t.configs.data.embodiment_configs import MODALITY_CONFIGS +from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.model.gr00t_n1d7.image_augmentations import ( + apply_with_replay, + build_image_transformations_albumentations, +) +import numpy as np +from PIL import Image + + +def save_comparison(original, augmented, mask, output_path): + orig_arr = np.array(original) + aug_arr = augmented.transpose(1, 2, 0) if augmented.shape[0] == 3 else augmented + + panels = [orig_arr, aug_arr] + if mask is not None: + mask_vis = np.where(mask[..., None] > 0, 255, 0).astype(np.uint8) + mask_vis = np.broadcast_to(mask_vis, (*mask.shape[:2], 3)).copy() + if mask_vis.shape[:2] != orig_arr.shape[:2]: + mask_vis = np.array( + Image.fromarray(mask_vis).resize( + (orig_arr.shape[1], orig_arr.shape[0]), Image.NEAREST + ) + ) + panels.append(mask_vis) + + h = panels[0].shape[0] + resized = [] + for p in panels: + if p.shape[0] != h: + new_w = int(p.shape[1] * h / p.shape[0]) + p = np.array(Image.fromarray(p).resize((new_w, h), Image.BILINEAR)) + resized.append(p) + + Image.fromarray(np.concatenate(resized, axis=1)).save(output_path) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset_path", required=True) + parser.add_argument("--embodiment_tag", required=True) + parser.add_argument("--modality_config_path", default=None) + parser.add_argument("--extra_augmentation_config", type=str, required=True) + parser.add_argument("--output_dir", type=str, default="/tmp/augmentation_vis") + parser.add_argument("--num_frames", type=int, default=5) + args = parser.parse_args() + + if args.modality_config_path: + path = Path(args.modality_config_path) + sys.path.append(str(path.parent)) + importlib.import_module(path.stem) + + embodiment_tag = EmbodimentTag[args.embodiment_tag].value + modality_configs = MODALITY_CONFIGS[embodiment_tag] + extra_aug_config = json.loads(args.extra_augmentation_config) + + train_transform, _ = build_image_transformations_albumentations( + image_target_size=[224, 224], + image_crop_size=[224, 224], + random_rotation_angle=0, + color_jitter_params=None, + shortest_image_edge=512, + crop_fraction=0.95, + extra_augmentation_config=extra_aug_config, + ) + + loader = LeRobotEpisodeLoader( + dataset_path=args.dataset_path, + modality_configs=modality_configs, + ) + episode_df = loader[0] + + video_cols = [c for c in episode_df.columns if c.startswith("video.")] + mask_cols = [c for c in episode_df.columns if c.startswith("mask.")] + print(f"Video columns: {video_cols}") + print(f"Mask columns: {mask_cols}") + + num_frames = min(args.num_frames, len(episode_df)) + frame_indices = np.linspace(0, len(episode_df) - 1, num_frames, dtype=int) + + os.makedirs(args.output_dir, exist_ok=True) + + for vcol in video_cols: + view_name = vcol.replace("video.", "") + mcol = f"mask.{view_name}" + has_mask = mcol in mask_cols + + view_dir = os.path.join(args.output_dir, view_name.replace(".", "_")) + os.makedirs(view_dir, exist_ok=True) + + for fidx in frame_indices: + orig_img = episode_df[vcol].iloc[fidx] + mask_arr = np.array(episode_df[mcol].iloc[fidx]) if has_mask else None + masks_list = [mask_arr] if mask_arr is not None else None + + transformed, _ = apply_with_replay(train_transform, [orig_img], masks_list) + aug_arr = transformed[0].numpy() + + out_path = os.path.join(view_dir, f"frame_{fidx:04d}.png") + save_comparison(orig_img, aug_arr, mask_arr, out_path) + print(f" Saved: {out_path}") + + print(f"\nDone! {num_frames} frames x {len(video_cols)} views saved to {args.output_dir}") + + print("\n" + "=" * 60) + print("Testing full training pipeline (processor + dataloader) ...") + print("=" * 60) + + from gr00t.configs.base_config import get_default_config + from gr00t.data.dataset.factory import DatasetFactory + from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import Gr00tN1d7Processor + + config = get_default_config() + config = config.load_dict( + { + "data": { + "download_cache": False, + "datasets": [ + { + "dataset_paths": [args.dataset_path], + "mix_ratio": 1.0, + "embodiment_tag": embodiment_tag, + } + ], + } + } + ) + config.model.extra_augmentation_config = extra_aug_config + config.model.use_albumentations_transforms = True + + processor = Gr00tN1d7Processor( + modality_configs=config.data.modality_configs, + statistics=None, + image_crop_size=config.model.image_crop_size, + image_target_size=config.model.image_target_size, + random_rotation_angle=config.model.random_rotation_angle, + color_jitter_params=config.model.color_jitter_params, + model_name=config.model.model_name, + model_type=config.model.backbone_model_type, + formalize_language=config.model.formalize_language, + max_state_dim=config.model.max_state_dim, + max_action_dim=config.model.max_action_dim, + apply_sincos_state_encoding=config.model.apply_sincos_state_encoding, + max_action_horizon=config.model.action_horizon, + use_albumentations=config.model.use_albumentations_transforms, + extra_augmentation_config=config.model.extra_augmentation_config, + shortest_image_edge=config.model.shortest_image_edge, + crop_fraction=config.model.crop_fraction, + use_relative_action=config.model.use_relative_action, + ) + processor.train() + + dataset_factory = DatasetFactory(config=config) + train_dataset, _ = dataset_factory.build(processor=processor) + sample = next(iter(train_dataset)) + + print(f"Sample keys: {list(sample.keys())}") + print(f"VLM keys: {list(sample['vlm_content'].keys())}") + for k, v in sample.items(): + if hasattr(v, "shape"): + print(f" {k}: shape={v.shape}, dtype={v.dtype}") + print("\nPipeline test PASSED!") + + +if __name__ == "__main__": + main() diff --git a/examples/rebot-arm-dm/README.md b/examples/rebot-arm-dm/README.md new file mode 100644 index 000000000..58925ef3b --- /dev/null +++ b/examples/rebot-arm-dm/README.md @@ -0,0 +1,93 @@ +# Finetuning GR00T N1.7 Model for Seeed reBot Arm B601 DM + +This guide shows how to finetune dataset collected from [rebot arm b601 dm](https://www.seeedstudio.com/reBot-Arm-B601-DM-Bundle.html) robot, and evaluate the model on the real robot. + + +## Dataset + +To collect the dataset via teleoperation, please refer to the official documentation in lerobot: https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/#calibrate-the-robotic-arm + +The commands below use the test tube organization dataset as an example + +[youjiang97/organize_test_tube_0](https://huggingface.co/datasets/youjiang97/organize_test_tube_0) + +## Handling the dataset + +```bash +uv run --project scripts/lerobot_conversion \ + python scripts/lerobot_conversion/convert_v3_to_v2.py \ + --repo-id youjiang97/organize_test_tube_0 \ + --root +``` + +Then move the `modality.json` file to the root of the dataset. +```bash +cp examples/rebot-arm-dm/modality.json /meta/modality.json +``` + +## Finetuning + +Run the shared finetune launcher directly. The provided modality config trains the six arm joints as relative actions and the gripper as an absolute action: +```bash +CUDA_VISIBLE_DEVICES=0 NUM_GPUS=1 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path \ + --modality-config-path examples/rebot-arm-dm/rebot_config.py \ + --embodiment-tag NEW_EMBODIMENT \ + --output-dir /tmp/rebot-arm-dm_finetune +``` + +## Open-Loop Evaluation + +Evaluate the finetuned model with the following command: +```bash +uv run python gr00t/eval/open_loop_eval.py \ + --dataset-path \ + --embodiment-tag NEW_EMBODIMENT \ + --model-path /tmp/rebot-arm-dm_finetune/checkpoint-10000 \ + --traj-ids 0 \ + --action-horizon 16 \ + --steps 400 +``` + +### Evaluation Results + +The evaluation produces visualizations comparing predicted actions against ground truth trajectories: + +Open-loop evaluation results showing predicted vs ground truth trajectories + +To read these numbers and decide whether your fine-tune is working, see [Interpreting the Result: Is My Fine-tune Working?](../../getting_started/finetune_new_embodiment.md#interpreting-the-result-is-my-fine-tune-working). + +## Closed-Loop Evaluation + +Please refer to [eval_rebot_arm_dm.py](./eval_rebot_arm_dm.py) for how to write rebot arm deployment code using Policy API. + +1. set up client side deps + +```bash +cd examples/rebot-arm-dm +uv venv +source .venv/bin/activate +uv pip install -e . --verbose +uv pip install --no-deps -e ../../ +``` + +2. Start policy server from the repository root in a separate terminal: +```bash +uv run python gr00t/eval/run_gr00t_server.py \ + --model-path /tmp/rebot-arm-dm_finetune/checkpoint-10000 \ + --embodiment-tag NEW_EMBODIMENT +``` + +3. Run the eval script as the client from the `examples/rebot-arm-dm` environment created above: +```bash +uv run python eval_rebot_arm_dm.py \ + --robot.type=seeed_b601_dm_follower \ + --robot.id=b601_dm_follower \ + --robot.port=/dev/ttyACM0 \ + --robot.can_adapter=damiao \ + --robot.cameras="{ front: {type: opencv, index_or_path: /dev/video0, width: 640, height: 480, fps: 30}, side: {type: opencv, index_or_path: /dev/video2, width: 640, height: 480, fps: 30}}" \ + --policy_host=localhost \ + --policy_port=5555 \ + --lang_instruction="organize test tube" +``` diff --git a/examples/rebot-arm-dm/eval_rebot_arm_dm.py b/examples/rebot-arm-dm/eval_rebot_arm_dm.py new file mode 100644 index 000000000..9a168354c --- /dev/null +++ b/examples/rebot-arm-dm/eval_rebot_arm_dm.py @@ -0,0 +1,254 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Seeed reBot Arm B601-DM real-robot GR00T policy evaluation. + +This entry point is intentionally standalone because the B601-DM arm has +different joints and a plugin-provided LeRobot robot class. +""" + +from dataclasses import asdict, dataclass +import importlib +import logging +from pprint import pformat +import time +from typing import Any + +import draccus +from gr00t.policy.server_client import PolicyClient +from lerobot.cameras.opencv.configuration_opencv import OpenCVCameraConfig # noqa: F401 +from lerobot.cameras.realsense.configuration_realsense import RealSenseCameraConfig # noqa: F401 +from lerobot.robots import RobotConfig, make_robot_from_config + + +try: + from lerobot.utils.import_utils import register_third_party_plugins +except ImportError: + from lerobot.utils.import_utils import ( + register_third_party_devices as register_third_party_plugins, + ) +from lerobot.utils.utils import init_logging, log_say +import numpy as np + + +for module_name in ["lerobot_robot_seeed_b601"]: + try: + importlib.import_module(module_name) + except ImportError: + pass + + +ROBOT_TYPE = "seeed_b601_dm_follower" +ROBOT_STATE_KEYS = [ + "shoulder_pan.pos", + "shoulder_lift.pos", + "elbow_flex.pos", + "wrist_flex.pos", + "wrist_yaw.pos", + "wrist_roll.pos", + "gripper.pos", +] + +# Matches B601-DM datasets with six arm joints plus one physical gripper: +# state/action.single_arm = [0:6], state/action.gripper = [6:7]. +DEFAULT_POLICY_STATE_KEYS = [ + "shoulder_pan.pos", + "shoulder_lift.pos", + "elbow_flex.pos", + "wrist_flex.pos", + "wrist_yaw.pos", + "wrist_roll.pos", + "gripper.pos", +] + +# Map the policy's 6-D single_arm output to the six B601-DM arm joints and +# the policy's gripper output to the physical gripper motor. +DEFAULT_ACTION_OUTPUT_KEYS = [ + "shoulder_pan.pos", + "shoulder_lift.pos", + "elbow_flex.pos", + "wrist_flex.pos", + "wrist_yaw.pos", + "wrist_roll.pos", + "gripper.pos", +] + +DEFAULT_CAMERA_KEYS = ["front", "side"] + + +def recursive_add_extra_dim(obs: dict) -> dict: + for key, val in obs.items(): + if isinstance(val, np.ndarray): + obs[key] = val[np.newaxis, ...] + elif isinstance(val, dict): + obs[key] = recursive_add_extra_dim(val) + else: + obs[key] = [val] + return obs + + +class RebotArmDMAdapter: + def __init__( + self, + policy_client: PolicyClient, + camera_keys: list[str] | None = None, + policy_state_keys: list[str] | None = None, + action_output_keys: list[str] | None = None, + ): + self.policy = policy_client + self.camera_keys = camera_keys or DEFAULT_CAMERA_KEYS + self.policy_state_keys = policy_state_keys or DEFAULT_POLICY_STATE_KEYS + self.action_output_keys = action_output_keys or DEFAULT_ACTION_OUTPUT_KEYS + + self._validate_keys("policy_state_keys", self.policy_state_keys) + self._validate_keys("action_output_keys", self.action_output_keys) + if len(self.policy_state_keys) < 2: + raise ValueError("policy_state_keys must include arm keys plus one gripper key") + if len(self.action_output_keys) != len(self.policy_state_keys): + raise ValueError( + "action_output_keys must have the same length as policy_state_keys " + "so policy outputs can be mapped unambiguously" + ) + + self.arm_dof = len(self.policy_state_keys) - 1 + + @staticmethod + def _validate_keys(field_name: str, keys: list[str]) -> None: + if len(keys) != len(set(keys)): + raise ValueError(f"{field_name} must not contain duplicate keys") + if not keys or keys[-1] != "gripper.pos": + raise ValueError(f"{field_name} must end with gripper.pos") + + unknown = [key for key in keys if key not in ROBOT_STATE_KEYS] + if unknown: + raise ValueError(f"{field_name} contains unsupported B601-DM keys: {unknown}") + + def obs_to_policy_inputs(self, obs: dict[str, Any]) -> dict: + missing_camera_keys = [key for key in self.camera_keys if key not in obs] + if missing_camera_keys: + raise KeyError( + f"Robot observation is missing camera keys {missing_camera_keys}. " + f"Available keys: {sorted(obs.keys())}" + ) + + missing_state_keys = [key for key in self.policy_state_keys if key not in obs] + if missing_state_keys: + raise KeyError( + f"Robot observation is missing state keys {missing_state_keys}. " + f"Available keys: {sorted(obs.keys())}" + ) + + state = np.array([obs[key] for key in self.policy_state_keys], dtype=np.float32) + model_obs = { + "video": {key: obs[key] for key in self.camera_keys}, + "state": { + "single_arm": state[: self.arm_dof], + "gripper": state[self.arm_dof : self.arm_dof + 1], + }, + "language": {"annotation.human.task_description": obs["lang"]}, + } + model_obs = recursive_add_extra_dim(model_obs) + model_obs = recursive_add_extra_dim(model_obs) + return model_obs + + def decode_action_chunk(self, chunk: dict, t: int) -> dict[str, float]: + single_arm = chunk["single_arm"][0][t] + gripper = chunk["gripper"][0][t] + if single_arm.shape[-1] != self.arm_dof: + raise ValueError( + f"Policy returned single_arm dim {single_arm.shape[-1]}, expected {self.arm_dof}. " + "Use policy_state_keys/action_output_keys that match the checkpoint modality." + ) + + full = np.concatenate([single_arm, gripper], axis=0) + return {key: float(full[i]) for i, key in enumerate(self.action_output_keys)} + + def get_action(self, obs: dict) -> list[dict[str, float]]: + model_input = self.obs_to_policy_inputs(obs) + action_chunk, info = self.policy.get_action(model_input) + any_key = next(iter(action_chunk.keys())) + horizon = action_chunk[any_key].shape[1] + return [self.decode_action_chunk(action_chunk, t) for t in range(horizon)] + + +@dataclass +class EvalConfig: + robot: RobotConfig + policy_host: str = "localhost" + policy_port: int = 5555 + action_horizon: int = 8 + lang_instruction: str = "Grab markers and place into pen holder." + camera_keys: list[str] | None = None + policy_state_keys: list[str] | None = None + action_output_keys: list[str] | None = None + play_sounds: bool = False + timeout: int = 60 + + +@draccus.wrap() +def eval(cfg: EvalConfig): + init_logging() + logging.info(pformat(asdict(cfg))) + + if cfg.robot.type != ROBOT_TYPE: + raise ValueError(f"eval_rebot_arm_dm.py only supports --robot.type={ROBOT_TYPE}") + + robot = make_robot_from_config(cfg.robot) + robot.connect() + + log_say("Initializing robot", cfg.play_sounds, blocking=True) + + policy_client = PolicyClient(host=cfg.policy_host, port=cfg.policy_port) + policy = RebotArmDMAdapter( + policy_client, + cfg.camera_keys, + cfg.policy_state_keys, + cfg.action_output_keys, + ) + + log_say( + f'Policy ready with instruction: "{cfg.lang_instruction}"', + cfg.play_sounds, + blocking=True, + ) + + try: + while True: + obs = robot.get_observation() + obs["lang"] = cfg.lang_instruction + + actions = policy.get_action(obs) + for i, action_dict in enumerate(actions[: cfg.action_horizon]): + tic = time.time() + print(f"action[{i}]: {action_dict}") + robot.send_action(action_dict) + toc = time.time() + if toc - tic < 1.0 / 30: + time.sleep(1.0 / 30 - (toc - tic)) + finally: + try: + robot.disconnect() + finally: + policy_client.close() + + +def main(): + register_third_party_plugins() + eval() + + +if __name__ == "__main__": + main() diff --git a/examples/rebot-arm-dm/modality.json b/examples/rebot-arm-dm/modality.json new file mode 100644 index 000000000..50c6937d7 --- /dev/null +++ b/examples/rebot-arm-dm/modality.json @@ -0,0 +1,35 @@ +{ + "state": { + "single_arm": { + "start": 0, + "end": 6 + }, + "gripper": { + "start": 6, + "end": 7 + } + }, + "action": { + "single_arm": { + "start": 0, + "end": 6 + }, + "gripper": { + "start": 6, + "end": 7 + } + }, + "video": { + "front": { + "original_key": "observation.images.front" + }, + "side": { + "original_key": "observation.images.side" + } + }, + "annotation": { + "human.task_description": { + "original_key": "task_index" + } + } +} \ No newline at end of file diff --git a/examples/rebot-arm-dm/pyproject.toml b/examples/rebot-arm-dm/pyproject.toml new file mode 100644 index 000000000..9d5924b9b --- /dev/null +++ b/examples/rebot-arm-dm/pyproject.toml @@ -0,0 +1,23 @@ +[build-system] +requires = ["setuptools>=61", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "eval_rebot_arm_dm" +version = "0.1.0" +requires-python = ">=3.10" + +dependencies = [ + "draccus", + "matplotlib", + "ipython", + "msgpack==1.1.0", + "msgpack-numpy==0.4.8", + "zmq", + "transformers", + "lerobot @ git+https://github.com/Seeed-Projects/lerobot.git@0f392484458cb5ebca0310c0c4c47390a31c80ed", + "lerobot-robot-seeed-b601 @ git+https://github.com/Seeed-Projects/lerobot-robot-seeed-b601.git@5d36bef6e352ddfc4cefc40a16db02772e25655c", + "motorbridge", +] + +# Please also manually install `uv pip install --no-deps -e ../../` diff --git a/examples/rebot-arm-dm/rebot_config.py b/examples/rebot-arm-dm/rebot_config.py new file mode 100644 index 000000000..27aa3b173 --- /dev/null +++ b/examples/rebot-arm-dm/rebot_config.py @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from gr00t.configs.data.embodiment_configs import register_modality_config +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.types import ( + ActionConfig, + ActionFormat, + ActionRepresentation, + ActionType, + ModalityConfig, +) + + +rebot_config = { + # Video: current frame only; keys must match "video" entries in meta/modality.json + "video": ModalityConfig( + delta_indices=[0], + modality_keys=["front", "side"], # front third-person view + side egocentric + ), + # State: current proprioceptive reading; keys must match "state" entries in meta/modality.json + "state": ModalityConfig( + delta_indices=[0], + modality_keys=[ + "single_arm", # joint positions + "gripper", # gripper state + ], + ), + # Action: 16-step prediction horizon; one ActionConfig per modality key + "action": ModalityConfig( + delta_indices=list(range(0, 16)), # predict 16 future steps + modality_keys=[ + "single_arm", + "gripper", + ], + action_configs=[ + # single_arm: RELATIVE = delta from current state (better generalization) + ActionConfig( + rep=ActionRepresentation.RELATIVE, + type=ActionType.NON_EEF, # joint-space, not end-effector + format=ActionFormat.DEFAULT, + ), + # gripper: ABSOLUTE = target position (binary open/close works better absolute) + ActionConfig( + rep=ActionRepresentation.ABSOLUTE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + ), + ], + ), + # Language: task instruction from annotation field in the dataset + "language": ModalityConfig( + delta_indices=[0], + modality_keys=["annotation.human.task_description"], + ), +} + +register_modality_config(rebot_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/examples/robocasa-gr1-tabletop-tasks/README.md b/examples/robocasa-gr1-tabletop-tasks/README.md index d27a4a420..875ba5acf 100644 --- a/examples/robocasa-gr1-tabletop-tasks/README.md +++ b/examples/robocasa-gr1-tabletop-tasks/README.md @@ -8,41 +8,59 @@ For more information, see the [official repository](https://github.com/robocasa/ # RoboCasa GR1 Tabletop Tasks evaluation benchmark result -| Task | Success rate | -| ---- | ------------ | -| `gr1_unified/PnPBottleToCabinetClose_GR1ArmsAndWaistFourierHands_Env` | 51.5% | -| `gr1_unified/PnPCanToDrawerClose_GR1ArmsAndWaistFourierHands_Env` | 13.0% | -| `gr1_unified/PnPCupToDrawerClose_GR1ArmsAndWaistFourierHands_Env` | 8.5% | -| `gr1_unified/PnPMilkToMicrowaveClose_GR1ArmsAndWaistFourierHands_Env` | 14.0% | -| `gr1_unified/PnPPotatoToMicrowaveClose_GR1ArmsAndWaistFourierHands_Env` | 41.5% | -| `gr1_unified/PnPWineToCabinetClose_GR1ArmsAndWaistFourierHands_Env` | 16.5% | -| `gr1_unified/PosttrainPnPNovelFromCuttingboardToBasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 58.0% | -| `gr1_unified/PosttrainPnPNovelFromCuttingboardToCardboardboxSplitA_GR1ArmsAndWaistFourierHands_Env` | 46.5% | -| `gr1_unified/PosttrainPnPNovelFromCuttingboardToPanSplitA_GR1ArmsAndWaistFourierHands_Env` | 68.5% | -| `gr1_unified/PosttrainPnPNovelFromCuttingboardToPotSplitA_GR1ArmsAndWaistFourierHands_Env` | 65.0% | -| `gr1_unified/PosttrainPnPNovelFromCuttingboardToTieredbasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 46.5% | -| `gr1_unified/PosttrainPnPNovelFromPlacematToBasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 58.5% | -| `gr1_unified/PosttrainPnPNovelFromPlacematToBowlSplitA_GR1ArmsAndWaistFourierHands_Env` | 57.5% | -| `gr1_unified/PosttrainPnPNovelFromPlacematToPlateSplitA_GR1ArmsAndWaistFourierHands_Env` | 63.0% | -| `gr1_unified/PosttrainPnPNovelFromPlacematToTieredshelfSplitA_GR1ArmsAndWaistFourierHands_Env` | 28.5% | -| `gr1_unified/PosttrainPnPNovelFromPlateToBowlSplitA_GR1ArmsAndWaistFourierHands_Env` | 57.0% | -| `gr1_unified/PosttrainPnPNovelFromPlateToCardboardboxSplitA_GR1ArmsAndWaistFourierHands_Env` | 43.5% | -| `gr1_unified/PosttrainPnPNovelFromPlateToPanSplitA_GR1ArmsAndWaistFourierHands_Env` | 51.0% | -| `gr1_unified/PosttrainPnPNovelFromPlateToPlateSplitA_GR1ArmsAndWaistFourierHands_Env` | 78.7% | -| `gr1_unified/PosttrainPnPNovelFromTrayToCardboardboxSplitA_GR1ArmsAndWaistFourierHands_Env` | 51.5% | -| `gr1_unified/PosttrainPnPNovelFromTrayToPlateSplitA_GR1ArmsAndWaistFourierHands_Env` | 71.0% | -| `gr1_unified/PosttrainPnPNovelFromTrayToPotSplitA_GR1ArmsAndWaistFourierHands_Env` | 64.5% | -| `gr1_unified/PosttrainPnPNovelFromTrayToTieredbasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 57.0% | -| `gr1_unified/PosttrainPnPNovelFromTrayToTieredshelfSplitA_GR1ArmsAndWaistFourierHands_Env` | 31.5% | -| **Average** | 47.6% | +Checkpoint: finetuned N1.7 `ROBOCASA_GR1_TABLETOP` checkpoint + +| Task | Success rate | Trials | +| ---- | ------------ | ------ | +| `gr1_unified/PnPBottleToCabinetClose_GR1ArmsAndWaistFourierHands_Env` | 70.0% | 20 | +| `gr1_unified/PnPCanToDrawerClose_GR1ArmsAndWaistFourierHands_Env` | 70.0% | 20 | +| `gr1_unified/PnPCupToDrawerClose_GR1ArmsAndWaistFourierHands_Env` | 35.0% | 20 | +| `gr1_unified/PnPMilkToMicrowaveClose_GR1ArmsAndWaistFourierHands_Env` | 45.0% | 20 | +| `gr1_unified/PnPPotatoToMicrowaveClose_GR1ArmsAndWaistFourierHands_Env` | 40.0% | 20 | +| `gr1_unified/PnPWineToCabinetClose_GR1ArmsAndWaistFourierHands_Env` | 65.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromCuttingboardToBasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 10.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromCuttingboardToCardboardboxSplitA_GR1ArmsAndWaistFourierHands_Env` | 30.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromCuttingboardToPanSplitA_GR1ArmsAndWaistFourierHands_Env` | 40.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromCuttingboardToPotSplitA_GR1ArmsAndWaistFourierHands_Env` | 45.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromCuttingboardToTieredbasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 25.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromPlacematToBasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 40.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromPlacematToBowlSplitA_GR1ArmsAndWaistFourierHands_Env` | 40.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromPlacematToPlateSplitA_GR1ArmsAndWaistFourierHands_Env` | 40.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromPlacematToTieredshelfSplitA_GR1ArmsAndWaistFourierHands_Env` | 18.2% | 22 | +| `gr1_unified/PosttrainPnPNovelFromPlateToBowlSplitA_GR1ArmsAndWaistFourierHands_Env` | 50.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromPlateToCardboardboxSplitA_GR1ArmsAndWaistFourierHands_Env` | 35.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromPlateToPanSplitA_GR1ArmsAndWaistFourierHands_Env` | 40.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromPlateToPlateSplitA_GR1ArmsAndWaistFourierHands_Env` | 75.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromTrayToCardboardboxSplitA_GR1ArmsAndWaistFourierHands_Env` | 60.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromTrayToPlateSplitA_GR1ArmsAndWaistFourierHands_Env` | 50.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromTrayToPotSplitA_GR1ArmsAndWaistFourierHands_Env` | 45.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromTrayToTieredbasketSplitA_GR1ArmsAndWaistFourierHands_Env` | 55.0% | 20 | +| `gr1_unified/PosttrainPnPNovelFromTrayToTieredshelfSplitA_GR1ArmsAndWaistFourierHands_Env` | 45.0% | 20 | +| **Average** | 44.5% | - | + +The average is the mean of per-task success rates. Trials are the per-task closed-loop episode counts. + +# Finetune + +To finetune from the N1.7 base model on the RoboCasa GR1 Tabletop Tasks dataset, convert the demonstrations to the GR00T LeRobot format and launch the shared finetune script: + +```bash +NUM_GPUS=8 MAX_STEPS=60000 GLOBAL_BATCH_SIZE=512 SAVE_STEPS=2000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path \ + --embodiment-tag ROBOCASA_GR1_TABLETOP \ + --output-dir /tmp/gr1_tabletop_finetune +``` + +The original N1.6 `gr1_unified` embodiment tag was retired with the N1.7 release. Use the N1.7 `ROBOCASA_GR1_TABLETOP` finetuning tag for this dataset. + +`ROBOCASA_GR1_TABLETOP` uses an 8-step action target to match the closed-loop RoboCasa GR1 evaluation setting. # Evaluate checkpoint -First, setup the evaluation simulation environment. This only needs to run once for each simulation benchmark. After it's done, we only need to launch server and client. +First, complete the [one-time simulation environment setup](../../README.md#one-time-simulation-environment-setup), then run this benchmark's setup script (only needed once per benchmark): ```bash -sudo apt update -sudo apt install libegl1-mesa-dev libglu1-mesa bash gr00t/eval/sim/robocasa-gr1-tabletop-tasks/setup_RoboCasaGR1TabletopTasks.sh ``` @@ -51,19 +69,19 @@ Then, run client server evaluation under the project root directory in separate **Terminal 1 - Server:** ```bash uv run python gr00t/eval/run_gr00t_server.py \ - --model-path nvidia/GR00T-N1.6-3B \ - --embodiment-tag GR1 \ + --model-path \ + --embodiment-tag ROBOCASA_GR1_TABLETOP \ --use-sim-policy-wrapper ``` **Terminal 2 - Client:** ```bash gr00t/eval/sim/robocasa-gr1-tabletop-tasks/robocasa_uv/.venv/bin/python gr00t/eval/rollout_policy.py \ - --n_episodes 10 \ - --policy_client_host 127.0.0.1 \ - --policy_client_port 5555 \ - --max_episode_steps=720 \ - --env_name gr1_unified/PnPBottleToCabinetClose_GR1ArmsAndWaistFourierHands_Env \ - --n_action_steps 8 \ - --n_envs 5 + --n-episodes 10 \ + --policy-client-host 127.0.0.1 \ + --policy-client-port 5555 \ + --max-episode-steps 720 \ + --env-name gr1_unified/PnPBottleToCabinetClose_GR1ArmsAndWaistFourierHands_Env \ + --n-action-steps 8 \ + --n-envs 5 ``` diff --git a/examples/robocasa/README.md b/examples/robocasa/README.md index 4da442be6..94209844a 100644 --- a/examples/robocasa/README.md +++ b/examples/robocasa/README.md @@ -2,55 +2,117 @@ [RoboCasa](https://robocasa.ai/) is a large-scale simulation framework for training generally capable robots to perform everyday tasks, featuring realistic kitchen environments with over 2,500 3D assets and 100 diverse manipulation tasks. This evaluation benchmark uses RoboCasa with the Panda robot equipped with an Omron gripper to test household manipulation tasks including operating kitchen appliances, pick-and-place operations, and interacting with doors, drawers, and various objects. +To run it on N1.7, finetune from the base model (`nvidia/GR00T-N1.7-3B`) using the instructions below — RoboCasa is not in the N1.7 pretrained embodiment set, so finetuning is required before evaluation. + +--- + +## Checkpoint Results + +- GR00T 1.6: [nvidia/GR00T-N1.6-3B](https://huggingface.co/nvidia/GR00T-N1.6-3B) +- GR00T 1.7: finetuned checkpoint + +| Task | GR00T 1.6 | GR00T 1.7 | +| ---- | --------- | --------- | +| `robocasa_panda_omron/CoffeeSetupMug_PandaOmron_Env` | 31.0% | 30.0% | +| `robocasa_panda_omron/CoffeeServeMug_PandaOmron_Env` | 63.5% | 85.0% | +| `robocasa_panda_omron/CoffeePressButton_PandaOmron_Env` | 98.5% | 100.0% | +| `robocasa_panda_omron/OpenSingleDoor_PandaOmron_Env` | 81.5% | 90.0% | +| `robocasa_panda_omron/OpenDoubleDoor_PandaOmron_Env` | 39.0% | 25.0% | +| `robocasa_panda_omron/CloseSingleDoor_PandaOmron_Env` | 96.0% | 95.0% | +| `robocasa_panda_omron/CloseDoubleDoor_PandaOmron_Env` | 88.5% | 80.0% | +| `robocasa_panda_omron/OpenDrawer_PandaOmron_Env` | 81.1% | 95.0% | +| `robocasa_panda_omron/CloseDrawer_PandaOmron_Env` | 100.0% | 100.0% | +| `robocasa_panda_omron/TurnOnMicrowave_PandaOmron_Env` | 91.5% | 95.0% | +| `robocasa_panda_omron/TurnOffMicrowave_PandaOmron_Env` | 96.0% | 95.0% | +| `robocasa_panda_omron/PnPCounterToCab_PandaOmron_Env` | 47.5% | 60.0% | +| `robocasa_panda_omron/PnPCabToCounter_PandaOmron_Env` | 41.0% | 65.0% | +| `robocasa_panda_omron/PnPCounterToSink_PandaOmron_Env` | 46.0% | 60.0% | +| `robocasa_panda_omron/PnPSinkToCounter_PandaOmron_Env` | 50.0% | 65.0% | +| `robocasa_panda_omron/PnPCounterToMicrowave_PandaOmron_Env` | 19.0% | 30.0% | +| `robocasa_panda_omron/PnPMicrowaveToCounter_PandaOmron_Env` | 24.5% | 19.0% | +| `robocasa_panda_omron/PnPCounterToStove_PandaOmron_Env` | 63.2% | 60.0% | +| `robocasa_panda_omron/PnPStoveToCounter_PandaOmron_Env` | 54.5% | 65.0% | +| `robocasa_panda_omron/TurnOnSinkFaucet_PandaOmron_Env` | 89.0% | 95.0% | +| `robocasa_panda_omron/TurnOffSinkFaucet_PandaOmron_Env` | 93.5% | 100.0% | +| `robocasa_panda_omron/TurnSinkSpout_PandaOmron_Env` | 87.0% | 80.0% | +| `robocasa_panda_omron/TurnOnStove_PandaOmron_Env` | 76.5% | 85.0% | +| `robocasa_panda_omron/TurnOffStove_PandaOmron_Env` | 31.0% | 25.0% | +| **Average** | 66.22% | 70.8% | + + --- -# RoboCasa evaluation benchmark result -Checkpoint: [nvidia/GR00T-N1.6-3B](https://huggingface.co/nvidia/GR00T-N1.6-3B) - -| Task | Success rate | -| ---- | ------------ | -| `robocasa_panda_omron/CoffeeSetupMug_PandaOmron_Env` | 31.0% | -| `robocasa_panda_omron/CoffeeServeMug_PandaOmron_Env` | 63.5% | -| `robocasa_panda_omron/CoffeePressButton_PandaOmron_Env` | 98.5% | -| `robocasa_panda_omron/OpenSingleDoor_PandaOmron_Env` | 81.5% | -| `robocasa_panda_omron/OpenDoubleDoor_PandaOmron_Env` | 39.0% | -| `robocasa_panda_omron/CloseSingleDoor_PandaOmron_Env` | 96.0% | -| `robocasa_panda_omron/CloseDoubleDoor_PandaOmron_Env` | 88.5% | -| `robocasa_panda_omron/OpenDrawer_PandaOmron_Env` | 81.1% | -| `robocasa_panda_omron/CloseDrawer_PandaOmron_Env` | 100.0% | -| `robocasa_panda_omron/TurnOnMicrowave_PandaOmron_Env` | 91.5% | -| `robocasa_panda_omron/TurnOffMicrowave_PandaOmron_Env` | 96.0% | -| `robocasa_panda_omron/PnPCounterToCab_PandaOmron_Env` | 47.5% | -| `robocasa_panda_omron/PnPCabToCounter_PandaOmron_Env` | 41.0% | -| `robocasa_panda_omron/PnPCounterToSink_PandaOmron_Env` | 46.0% | -| `robocasa_panda_omron/PnPSinkToCounter_PandaOmron_Env` | 50.0% | -| `robocasa_panda_omron/PnPCounterToMicrowave_PandaOmron_Env` | 19.0% | -| `robocasa_panda_omron/PnPMicrowaveToCounter_PandaOmron_Env` | 24.5% | -| `robocasa_panda_omron/PnPCounterToStove_PandaOmron_Env` | 63.2% | -| `robocasa_panda_omron/PnPStoveToCounter_PandaOmron_Env` | 54.5% | -| `robocasa_panda_omron/TurnOnSinkFaucet_PandaOmron_Env` | 89.0% | -| `robocasa_panda_omron/TurnOffSinkFaucet_PandaOmron_Env` | 93.5% | -| `robocasa_panda_omron/TurnSinkSpout_PandaOmron_Env` | 87.0% | -| `robocasa_panda_omron/TurnOnStove_PandaOmron_Env` | 76.5% | -| `robocasa_panda_omron/TurnOffStove_PandaOmron_Env` | 31.0% | -| **Average** | 66.22% | +# Finetune + +Use the RoboCasa Panda Omron LeRobot datasets from Hugging Face, then launch the shared finetune script. These datasets already include the LeRobot metadata and statistics expected by GR00T and match the built-in N1.7 `ROBOCASA_PANDA_OMRON` finetuning tag. + +For a small local smoke-test dataset, download one task: + +```bash +uv run hf download nvidia/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim \ + --repo-type dataset \ + --include "single_panda_gripper.OpenDrawer/**" \ + --local-dir /root/.cache/g00t/datasets/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim + +DATASET_PATH=/root/.cache/g00t/datasets/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim/single_panda_gripper.OpenDrawer +uv run python scripts/repair_lerobot_metadata.py "$DATASET_PATH" \ + --embodiment-tag ROBOCASA_PANDA_OMRON +``` + +For the full benchmark training set, download the `single_panda_gripper.*` task directories and pass an `os.pathsep`-separated list of dataset directories to `--dataset-path`: + +```bash +uv run hf download nvidia/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim \ + --repo-type dataset \ + --include "single_panda_gripper.*/**" \ + --local-dir /root/.cache/g00t/datasets/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim + +DATASET_PATH=$(find /root/.cache/g00t/datasets/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim \ + -maxdepth 1 -type d -name "single_panda_gripper.*" | sort | paste -sd: -) +uv run python scripts/repair_lerobot_metadata.py "$DATASET_PATH" \ + --embodiment-tag ROBOCASA_PANDA_OMRON +``` + +```bash +NUM_GPUS=8 MAX_STEPS=60000 GLOBAL_BATCH_SIZE=512 SAVE_STEPS=2000 uv run bash examples/finetune.sh \ + --base-model-path nvidia/GR00T-N1.7-3B \ + --dataset-path "$DATASET_PATH" \ + --embodiment-tag ROBOCASA_PANDA_OMRON \ + --output-dir /tmp/robocasa_finetune +``` + +RoboCasa Panda Omron is not present in the base model checkpoint; use a checkpoint finetuned with `ROBOCASA_PANDA_OMRON` for evaluation. # Evaluate checkpoint -First, setup the evaluation simulation environment. This only needs to run once for each simulation benchmark. After it's done, we only need to launch server and client. +First, complete the [one-time simulation environment setup](../../README.md#one-time-simulation-environment-setup), then run this benchmark's setup script (only needed once per benchmark): ```bash -sudo apt update -sudo apt install libegl1-mesa-dev libglu1-mesa bash gr00t/eval/sim/robocasa/setup_RoboCasa.sh ``` +#### Downloading RoboCasa Datasets (Optional) + +To download RoboCasa demonstration datasets, you **must** use the robocasa venv created by the setup script above (the main project venv does not have `robosuite` installed, which `robocasa` requires at import time): + +```bash +# Download human demonstration datasets +gr00t/eval/sim/robocasa/robocasa_uv/.venv/bin/python \ + external_dependencies/robocasa/robocasa/scripts/download_datasets.py --ds_types human_im + +# Download machine-generated datasets +gr00t/eval/sim/robocasa/robocasa_uv/.venv/bin/python \ + external_dependencies/robocasa/robocasa/scripts/download_datasets.py --ds_types mg +``` + +> **Note:** Running `python -m robocasa.scripts.download_datasets` from the main project environment will fail because `robocasa` depends on `robosuite`, which is only installed in the robocasa venv. + Then, run client server evaluation under the project root directory in separate terminals: **Terminal 1 - Server:** ```bash uv run python gr00t/eval/run_gr00t_server.py \ - --model-path nvidia/GR00T-N1.6-3B \ + --model-path \ --embodiment-tag ROBOCASA_PANDA_OMRON \ --use-sim-policy-wrapper ``` @@ -58,11 +120,11 @@ uv run python gr00t/eval/run_gr00t_server.py \ **Terminal 2 - Client:** ```bash gr00t/eval/sim/robocasa/robocasa_uv/.venv/bin/python gr00t/eval/rollout_policy.py \ - --n_episodes 10 \ - --policy_client_host 127.0.0.1 \ - --policy_client_port 5555 \ - --max_episode_steps=720 \ - --env_name robocasa_panda_omron/OpenDrawer_PandaOmron_Env \ - --n_action_steps 8 \ - --n_envs 5 + --n-episodes 10 \ + --policy-client-host 127.0.0.1 \ + --policy-client-port 5555 \ + --max-episode-steps 720 \ + --env-name robocasa_panda_omron/OpenDrawer_PandaOmron_Env \ + --n-action-steps 8 \ + --n-envs 5 ``` diff --git a/external_dependencies/GR00T-WholeBodyControl b/external_dependencies/GR00T-WholeBodyControl deleted file mode 160000 index 3966393ed..000000000 --- a/external_dependencies/GR00T-WholeBodyControl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3966393ed7a37612af16c9b77e7aaed91231c407 diff --git a/getting_started/GR00T_inference.ipynb b/getting_started/GR00T_inference.ipynb index 954718150..79750ecc5 100644 --- a/getting_started/GR00T_inference.ipynb +++ b/getting_started/GR00T_inference.ipynb @@ -6,23 +6,16 @@ "source": [ "# GR00T Inference\n", "\n", - "This tutorial shows how to use the GR00T inference model to predict the actions from the observations, given a test dataset." + "This tutorial shows how to use the GR00T inference model to predict the actions from the observations, given a test dataset.\n", + "\n", + "> **Note:** Select the Python kernel from the project virtual environment (`.venv`) before running. In Jupyter, go to **Kernel > Change Kernel** and select the `.venv` Python 3.10 environment." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.12/dist-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "import os\n", "import torch\n", @@ -41,12 +34,12 @@ "outputs": [], "source": [ "# change the following paths\n", - "MODEL_PATH = \"nvidia/GR00T-N1.6-3B\"\n", + "MODEL_PATH = \"nvidia/GR00T-N1.7-3B\"\n", "\n", "# REPO_PATH is the path of the pip install gr00t repo and one level up\n", "REPO_PATH = os.path.dirname(os.path.dirname(gr00t.__file__))\n", - "DATASET_PATH = os.path.join(REPO_PATH, \"demo_data/gr1.PickNPlace\")\n", - "EMBODIMENT_TAG = \"gr1\"\n", + "DATASET_PATH = os.path.join(REPO_PATH, \"demo_data/droid_sample\")\n", + "EMBODIMENT_TAG = \"OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT\"\n", "\n", "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"" ] @@ -68,17 +61,43 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total number of DiT parameters: 1091722240\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 2/2 [00:00<00:00, 2.26it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total parameters: 2,942,124,032\n", + "Trainable parameters: 2,942,124,032 (100.0%)\n" + ] + } + ], "source": [ "policy = Gr00tPolicy(\n", " model_path=MODEL_PATH,\n", - " embodiment_tag=EmbodimentTag(EMBODIMENT_TAG),\n", + " embodiment_tag=EmbodimentTag.resolve(EMBODIMENT_TAG),\n", " device=device,\n", " strict=True,\n", ")\n", "\n", - "# print out the policy model architecture\n", - "print(policy.model)" + "# Print parameter count summary\n", + "total = sum(p.numel() for p in policy.model.parameters())\n", + "trainable = sum(p.numel() for p in policy.model.parameters() if p.requires_grad)\n", + "print(f\"Total parameters: {total:,}\")\n", + "print(f\"Trainable parameters: {trainable:,} ({100*trainable/total:.1f}%)\")" ] }, { @@ -97,14 +116,13 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dict_keys(['video', 'state', 'action', 'language'])\n", "video ModalityConfig(delta_indices=[0], modality_keys=['ego_view_bg_crop_pad_res256_freq20'], sin_cos_embedding_keys=None, mean_std_embedding_keys=None, action_configs=None)\n", "state ModalityConfig(delta_indices=[0], modality_keys=['left_arm', 'right_arm', 'left_hand', 'right_hand', 'waist'], sin_cos_embedding_keys=['left_arm', 'right_arm', 'left_hand', 'right_hand', 'waist'], mean_std_embedding_keys=None, action_configs=None)\n", "action ModalityConfig(delta_indices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], modality_keys=['left_arm', 'right_arm', 'left_hand', 'right_hand', 'waist'], sin_cos_embedding_keys=None, mean_std_embedding_keys=None, action_configs=[ActionConfig(rep=, type=, format=, state_key=None), ActionConfig(rep=, type=, format=, state_key=None), ActionConfig(rep=, type=, format=, state_key=None), ActionConfig(rep=, type=, format=, state_key=None), ActionConfig(rep=, type=, format=, state_key=None)])\n", @@ -128,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -136,11 +154,49 @@ "dataset = LeRobotEpisodeLoader(\n", " dataset_path=DATASET_PATH,\n", " modality_configs=modality_config,\n", - " video_backend=\"torchcodec\",\n", - " video_backend_kwargs=None,\n", ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "state: OK (5 keys used, 3 extra in dataset ignored)\n", + "action: OK (5 keys used, 3 extra in dataset ignored)\n", + "video: OK (1 keys, exact match)\n" + ] + } + ], + "source": [ + "# Validate that dataset contains all modality keys expected by the model.\n", + "# A mismatch here (e.g., from using a different model version) causes\n", + "# dimension errors later. See: https://github.com/NVIDIA/Isaac-GR00T/issues/305\n", + "import json as _json\n", + "_modality_path = os.path.join(DATASET_PATH, \"meta\", \"modality.json\")\n", + "with open(_modality_path) as _f:\n", + " _dataset_modality = _json.load(_f)\n", + "\n", + "for _mod in [\"state\", \"action\", \"video\"]:\n", + " _dataset_keys = set(_dataset_modality.get(_mod, {}).keys())\n", + " _model_keys = set(modality_config[_mod].modality_keys)\n", + " _missing = _model_keys - _dataset_keys\n", + " if _missing:\n", + " print(f\"ERROR: {_mod} \u2014 model requires keys not in dataset: {sorted(_missing)}\")\n", + " print(f\" Dataset keys: {sorted(_dataset_keys)}\")\n", + " print(f\" Model keys: {sorted(_model_keys)}\")\n", + " raise ValueError(f\"Dataset is missing required {_mod} keys: {sorted(_missing)}\")\n", + " _extra = _dataset_keys - _model_keys\n", + " if _extra:\n", + " print(f\"{_mod}: OK ({len(_model_keys)} keys used, {len(_extra)} extra in dataset ignored)\")\n", + " else:\n", + " print(f\"{_mod}: OK ({len(_model_keys)} keys, exact match)\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -150,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -186,7 +242,7 @@ "\n", "episode_data = dataset[0]\n", "step_data = extract_step_data(\n", - " episode_data, step_index=0, modality_configs=modality_config, embodiment_tag=EmbodimentTag(EMBODIMENT_TAG), allow_padding=False\n", + " episode_data, step_index=0, modality_configs=modality_config, embodiment_tag=EmbodimentTag.resolve(EMBODIMENT_TAG), allow_padding=False\n", ")\n", "\n", "# print(step_data)\n", @@ -216,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -251,7 +307,7 @@ "import matplotlib.pyplot as plt\n", "\n", "episode_index = 0\n", - "max_steps = 400\n", + "max_steps = min(400, len(dataset[episode_index]))\n", "joint_name = \"right_arm\"\n", "image_key = \"ego_view_bg_crop_pad_res256_freq20\"\n", "\n", @@ -265,7 +321,7 @@ "\n", "for step_count in range(max_steps):\n", " data_point = extract_step_data(\n", - " episode_data, step_index=step_count, modality_configs=modality_config, embodiment_tag=EmbodimentTag(EMBODIMENT_TAG), allow_padding=False\n", + " episode_data, step_index=step_count, modality_configs=modality_config, embodiment_tag=EmbodimentTag.resolve(EMBODIMENT_TAG), allow_padding=False\n", " )\n", " state_joints = data_point.states[joint_name][0]\n", " gt_action_joints = data_point.actions[joint_name][0]\n", @@ -314,7 +370,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -331,7 +387,7 @@ ], "source": [ "observation = {\n", - " \"video\": {k: np.stack(step_data.images[k])[None] for k in step_data.images}, # stach images and add batch dimension\n", + " \"video\": {k: np.stack(step_data.images[k])[None] for k in step_data.images}, # stack images and add batch dimension\n", " \"state\": {k: step_data.states[k][None] for k in step_data.states}, # add batch dimension\n", " \"action\": {k: step_data.actions[k][None] for k in step_data.actions}, # add batch dimension\n", " \"language\": {\n", @@ -353,7 +409,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -367,7 +423,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.10.20" } }, "nbformat": 4, diff --git a/getting_started/data_config.md b/getting_started/data_config.md index c517286a2..8927fa75d 100644 --- a/getting_started/data_config.md +++ b/getting_started/data_config.md @@ -18,6 +18,7 @@ Here's the [SO-100 example](../examples/SO100/so100_config.py): ```python from gr00t.configs.data.embodiment_configs import register_modality_config +from gr00t.data.embodiment_tags import EmbodimentTag from gr00t.data.types import ModalityConfig, ActionConfig, ActionRepresentation, ActionType, ActionFormat so100_config = { @@ -27,7 +28,7 @@ so100_config = { "language": ModalityConfig(...), } -register_modality_config(so100_config) +register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) ``` ## Understanding `ModalityConfig` @@ -38,23 +39,59 @@ Each `ModalityConfig` specifies two required fields and several optional ones: **1. `delta_indices` (list[int])** -Defines which temporal offsets to sample relative to the current timestep. This enables: -- **Historical context**: Use negative indices (e.g., `[-2, -1, 0]`) to include past observations -- **Current observation**: Use `[0]` for the current timestep -- **Future actions**: Use positive indices (e.g., `list(range(0, 16))`) for action prediction horizons +Defines which temporal offsets to sample relative to the current timestep: +- Current observation: Use [0] for the current timestep (recommended for video and state) +- Future actions: Use positive indices (e.g., list(range(0, 16))) for action prediction horizons + +> **Note:** Negative indices (e.g., [-2, -1, 0]) are supported by the data loader for historical context, but no current N1.7 embodiment config uses them. Stick with [0] for video and state unless you have a specific reason to stack frames. Examples: ```python # Single current frame for video delta_indices=[0] -# Last 3 frames for video (temporal stacking) -delta_indices=[-2, -1, 0] # 16-step action prediction horizon delta_indices=list(range(0, 16)) ``` +> **Note:** If you modify `delta_indices` for the action modality (e.g., changing the action horizon from 16 to 8), you **must** regenerate the dataset statistics by re-running `python gr00t/data/stats.py --dataset-path --embodiment-tag `. For a custom embodiment (e.g. `NEW_EMBODIMENT`), also pass `--modality-config-path ` (e.g. `examples/SO100/so100_config.py`), which registers the tag's modality config. The normalization statistics (especially `meta/relative_stats.json`) are computed based on the original `delta_indices` length, and a mismatch will cause errors during training. + +
+Example: What happens if you change delta_indices without regenerating stats? + +Suppose your action config originally uses a 16-step horizon: + +```python +"action": ModalityConfig( + delta_indices=list(range(0, 16)), # 16 steps + ... +) +``` + +Running `python gr00t/data/stats.py` generates `meta/relative_stats.json` with per-step statistics of shape `(16, D)`, where `D` is the action dimension. + +If you later change the horizon to 8 steps: + +```python +"action": ModalityConfig( + delta_indices=list(range(0, 8)), # 8 steps + ... +) +``` + +The training data will now have shape `(8, D)`, but the normalization parameters from `relative_stats.json` still have shape `(16, D)`. This dimension mismatch causes an `IndexError` during normalization: + +``` +IndexError: boolean index did not match indexed array along dimension 0; +dimension is 8 but corresponding boolean dimension is 16 +``` + +**Fix:** Re-run `python gr00t/data/stats.py --dataset-path --embodiment-tag ` (add `--modality-config-path ` for custom embodiments) after changing `delta_indices` to regenerate matching statistics. + +
+ + **2. `modality_keys` (list[str])** Specifies which keys to load from your dataset. These keys **must match** the keys defined in your `meta/modality.json` file. @@ -63,7 +100,7 @@ For the SO-100 example: - **Video keys**: Must match keys in `meta/modality.json` under `"video"` (e.g., `"front"`, `"wrist"`) - **State keys**: Must match keys in `meta/modality.json` under `"state"` (e.g., `"single_arm"`, `"gripper"`) - **Action keys**: Must match keys in `meta/modality.json` under `"action"` (e.g., `"single_arm"`, `"gripper"`) -- **Language keys**: Must match keys in `meta/modality.json` under `"annotation"` (e.g., `"annotation.human.action.task_description"`) +- **Language keys**: Must match keys in `meta/modality.json` under `"annotation"` (e.g., `"annotation.human.task_description"` for SO-100). The key is dataset-specific — see [Annotation Column Naming](data_preparation.md#annotation-column-naming). ### Optional Fields @@ -85,7 +122,7 @@ Specifies which keys should use mean/standard deviation normalization instead of **5. `action_configs` (list[ActionConfig] | None)** -Required for the `"action"` modality. Defines how each action modality should be interpreted and transformed. The list must have the same length as `modality_keys`, and each element corresponds to the action modality for the corresponding `modality_key`. See more details in the [Action Modality](#understanding-actionconfig) section. +Required for the `"action"` modality. Defines how each action modality should be interpreted and transformed. The list must have the **same length and same order** as `modality_keys` — `action_configs[0]` applies to `modality_keys[0]`, `action_configs[1]` to `modality_keys[1]`, etc. A mismatch in ordering will silently apply the wrong representation (e.g., RELATIVE to a gripper that should be ABSOLUTE). See more details in the [Action Modality](#understanding-actionconfig) section. ## Configuring Each Modality @@ -199,7 +236,7 @@ Defines which language annotations to use: ```python "language": ModalityConfig( delta_indices=[0], - modality_keys=["annotation.human.action.task_description"], # Must match annotation keys in meta/modality.json + modality_keys=["annotation.human.task_description"], # Must match annotation keys in meta/modality.json ) ``` @@ -289,7 +326,7 @@ your_modality_config = { ... } -register_modality_config(your_modality_config) +register_modality_config(your_modality_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) ``` Save your configuration to a Python file and pass the path to the `modality_config_path` argument when running the finetuning script. diff --git a/getting_started/data_preparation.md b/getting_started/data_preparation.md index 785f4776a..a16930ccc 100644 --- a/getting_started/data_preparation.md +++ b/getting_started/data_preparation.md @@ -2,7 +2,7 @@ ## Overview -This guide shows how to convert your robot data to work with our flavor of the [LeRobot dataset V2 format](https://github.com/huggingface/lerobot?tab=readme-ov-file#the-lerobotdataset-format) -- `GR00T LeRobot`. While we have added additional structure, our schema maintains full compatibility with the upstream LeRobot v2. The additional metadata and structure allow for more detailed specification and language annotations for your robot data. +This guide shows how to convert your robot data to work with our flavor of the [LeRobot dataset V2 format](https://github.com/huggingface/lerobot?tab=readme-ov-file#the-lerobotdataset-format) ([LeRobot docs](https://huggingface.co/docs/lerobot)) -- `GR00T LeRobot`. While we have added additional structure, our schema maintains full compatibility with the upstream LeRobot v2. The additional metadata and structure allow for more detailed specification and language annotations for your robot data. > The TLDR: Add a `meta/modality.json` file to your LeRobot v2 dataset and follow the schema below. @@ -12,6 +12,8 @@ If you already have a dataset in the LeRobot v2 format, you can skip this sectio If you have a dataset in the LeRobot v3.0 format, please use [this script](../scripts/lerobot_conversion/convert_v3_to_v2.py) to convert it to the LeRobot v2 format. +> **Why LeRobot v2?** GR00T currently uses the LeRobot v2 data format because many upstream datasets (DROID, LIBERO, Bridge, etc.) are published in v2. We plan to support both v2 and v3 formats natively in a future release. For now, please convert v3 datasets to v2 using the script above. + If you have a dataset in another format, please convert it to the LeRobot v2 format satisfying the following requirements. ### Structure Requirements @@ -52,22 +54,33 @@ Each parquet file will contain: - Annotations: stored as annotation..(.) (see the annotation field in the example configuration for example naming.). No other columns should have the annotation prefix, see the (multiple-annotation-support) if interested in adding multiple annotations. #### Example Parquet File -Here is a sample of the `cube_to_bowl` dataset that is present in the [demo_data](../demo_data/cube_to_bowl_5/) directory. +Here is an illustrative parquet row. The language annotation column uses the same key as the [`cube_to_bowl`](../demo_data/cube_to_bowl_5/) demo dataset (`annotation.human.task_description`). ``` { - "observation.state":[-0.01147082911843003,...,0], // concatenated state array based on the modality.json file - "action":[-0.010770668025204974,...0], // concatenated action array based on the modality.json file - "timestamp":0.04999995231628418, // timestamp of the observation - "annotation.human.action.task_description":0, // index of the task description in the meta/tasks.jsonl file - "task_index":0, // index of the task in the meta/tasks.jsonl file - "annotation.human.validity":1, // index of the task in the meta/tasks.jsonl file - "episode_index":0, // index of the episode - "index":0, // index of the observation. This is a global index across all observations in the dataset. - "next.reward":0, // reward of the next observation - "next.done":false // whether the episode is done + "observation.state":[-0.01,...,0], // 1D array: all state modalities concatenated per modality.json order + "action":[-0.010,...,0], // 1D array: all action modalities concatenated per modality.json order + "timestamp":0.049, // float: wall-clock time of this observation (seconds) + "annotation.human.task_description":0, // int: index into meta/tasks.jsonl for the language instruction + "task_index":0, // int: task identifier (same as annotation index for single-task) + "episode_index":0, // int: which episode this frame belongs to + "index":0, // int: global frame index across all episodes in the dataset + "next.reward":0, // float: reward at the next timestep (0 if unused) + "next.done":false // bool: true if this is the last frame of the episode } ``` +#### Annotation Column Naming + +A language annotation appears in three places that must all agree. The segments after `annotation.` are chosen by the dataset author following `annotation..(.)`, so different datasets use different keys — always match the exact key your dataset uses: + +| Layer | Where it lives | `cube_to_bowl` / SO-100 | LIBERO / SimplerEnv | +|-------|----------------|-------------------------|---------------------| +| Parquet column | `data/chunk-*/*.parquet` | `annotation.human.task_description` | `annotation.human.action.task_description` | +| `modality.json` key | under `"annotation"` (no `annotation.` prefix) | `human.task_description` | `human.action.task_description` | +| `modality_keys` in the data config | `ModalityConfig(...)`, see [data_config.md](data_config.md#language-modality) | `annotation.human.task_description` | `annotation.human.action.task_description` | + +Both forms above are valid; these docs use the SO-100 form (`annotation.human.task_description`) in examples. See [Multiple Annotation Support](#multiple-annotation-support) for adding more than one annotation channel. + ### Meta - `episodes.jsonl` contains a list of all the episodes in the entire dataset. Each episode contains a list of tasks and the length of the episode. @@ -77,13 +90,13 @@ Here is a sample of the `cube_to_bowl` dataset that is present in the [demo_data #### meta/tasks.jsonl Here is a sample of the `meta/tasks.jsonl` file that contains the task descriptions. ``` -{"task_index": 0, "task": "pick the squash from the counter and place it in the plate"} -{"task_index": 1, "task": "valid"} +{"task_index": 0, "task": "cube into yellow bowl"} +{"task_index": 1, "task": "cube into green bowl"} ``` -You can refer the task index in the parquet file to get the task description. So in this case, the `annotation.human.action.task_description` for the first observation is "pick the squash from the counter and place it in the plate" and `annotation.human.validity` is "valid". +You can refer the task index in the parquet file to get the task description. So in this case, the `annotation.human.task_description` for the first observation is "cube into yellow bowl". -`tasks.json` contains a list of all the tasks in the entire dataset. +`tasks.jsonl` contains a list of all the tasks in the entire dataset. #### meta/episodes.jsonl @@ -94,7 +107,7 @@ Here is a sample of the `meta/episodes.jsonl` file that contains the episode inf {"episode_index": 1, "tasks": [...], "length": 470} ``` -`episodes.json` contains a list of all the episodes in the entire dataset. Each episode contains a list of tasks and the length of the episode. +`episodes.jsonl` contains a list of all the episodes in the entire dataset. Each episode contains a list of tasks and the length of the episode. ## GR00T LeRobot Specific Requirements @@ -137,6 +150,13 @@ We require an additional metadata file `meta/modality.json` that is not present } ``` +#### Example + +For a concrete example of `modality.json` and the full dataset structure, see the publicly available datasets on HuggingFace: +[nvidia/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim](https://huggingface.co/datasets/nvidia/PhysicalAI-Robotics-GR00T-X-Embodiment-Sim/tree/main). + +You can also find a working example in the included demo data at [`demo_data/cube_to_bowl_5/meta/modality.json`](../demo_data/cube_to_bowl_5/meta/modality.json). + #### Notes - All indices are zero-based and follow Python's array slicing convention (`[start:end]`). diff --git a/getting_started/finetune_new_embodiment.md b/getting_started/finetune_new_embodiment.md index d7cc9f574..707e893c3 100644 --- a/getting_started/finetune_new_embodiment.md +++ b/getting_started/finetune_new_embodiment.md @@ -11,10 +11,18 @@ Prepare your data in **GR00T-flavored LeRobot v2 format** by following the [data Define your own modality configuration by following the [modality config guide](data_config.md). Below is an example configuration that corresponds to the demo data: ```python from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.data.types import ModalityConfig +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.types import ( + ActionConfig, + ActionFormat, + ActionRepresentation, + ActionType, + ModalityConfig, +) so100_config = { + # Video: use current frame only ([0]); list camera view names matching modality.json "video": ModalityConfig( delta_indices=[0], modality_keys=[ @@ -22,6 +30,7 @@ so100_config = { "wrist", ], ), + # State: current proprioceptive reading; keys must match modality.json "state" entries "state": ModalityConfig( delta_indices=[0], modality_keys=[ @@ -29,20 +38,21 @@ so100_config = { "gripper", ], ), + # Action: 16-step prediction horizon; each key needs an ActionConfig "action": ModalityConfig( - delta_indices=list(range(0, 16)), + delta_indices=list(range(0, 16)), # predict 16 future steps modality_keys=[ "single_arm", "gripper", ], action_configs=[ - # single_arm + # single_arm: RELATIVE = delta from current state (better generalization) ActionConfig( rep=ActionRepresentation.RELATIVE, - type=ActionType.NON_EEF, + type=ActionType.NON_EEF, # joint-space, not end-effector format=ActionFormat.DEFAULT, ), - # gripper + # gripper: ABSOLUTE = target position (binary open/close works better absolute) ActionConfig( rep=ActionRepresentation.ABSOLUTE, type=ActionType.NON_EEF, @@ -50,37 +60,43 @@ so100_config = { ), ], ), + # Language: task-instruction annotation. The key is dataset-specific and must + # match meta/modality.json (see data_preparation.md#annotation-column-naming). "language": ModalityConfig( delta_indices=[0], - modality_keys=["annotation.human.action.task_description"], + modality_keys=["annotation.human.task_description"], ), } -register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) -``` - -**Important:** Register your modality configuration under the `EmbodimentTag.NEW_EMBODIMENT` tag: -```python +# Important: always register under EmbodimentTag.NEW_EMBODIMENT for custom embodiments register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) ``` ## Step 3: Run Fine-tuning + +> ⚠️ **aarch64 users (Spark / Thor / Orin):** After running `install_deps.sh`, always +> activate the venv with `source .venv/bin/activate && source scripts/activate_.sh` +> (e.g. `activate_spark.sh`, `activate_thor.sh`, or `activate_orin.sh`) +> and run the example commands in this guide with **plain `python`** / `torchrun`, not `uv run python` / `uv run torchrun`. The latter will +> re-sync against the root `pyproject.toml` (which targets x86_64 Python 3.12) and +> destroy the platform-specific environment. + We'll use `gr00t/experiment/launch_finetune.py` as the entry point. Ensure that the uv environment is enabled before launching. You can do this by running the command `uv run bash `. ### View Available Arguments ```bash # Display all available arguments -python gr00t/experiment/launch_finetune.py --help +uv run python gr00t/experiment/launch_finetune.py --help ``` ### Execute Fine-tuning ```bash # Configure for single GPU export NUM_GPUS=1 -CUDA_VISIBLE_DEVICES=0 python \ +CUDA_VISIBLE_DEVICES=0 uv run python \ gr00t/experiment/launch_finetune.py \ - --base-model-path nvidia/GR00T-N1.6-3B \ + --base-model-path nvidia/GR00T-N1.7-3B \ --dataset-path ./demo_data/cube_to_bowl_5 \ --embodiment-tag NEW_EMBODIMENT \ --modality-config-path examples/SO100/so100_config.py \ @@ -108,22 +124,69 @@ CUDA_VISIBLE_DEVICES=0 python \ | `--max-steps` | Total number of training steps | | `--use-wandb` | Enable Weights & Biases logging for experiment tracking | +> **Note:** Validation during fine-tuning is disabled by default (`eval_strategy="no"` in the training config). To enable periodic validation, pass `--eval-strategy steps --eval-steps 500` (runs validation every 500 steps) or `--eval-strategy epoch` (runs validation every epoch). You can also adjust `--eval-batch-size` (default: 2). + ## Step 4: Open Loop Evaluation After finetuning, evaluate the model's performance using open loop evaluation: ```bash -python gr00t/eval/open_loop_eval.py \ +uv run python gr00t/eval/open_loop_eval.py \ --dataset-path ./demo_data/cube_to_bowl_5 \ --embodiment-tag NEW_EMBODIMENT \ --model-path /tmp/so100/checkpoint-2000 \ --traj-ids 0 \ - --action-horizon 16 \ + --execution-horizon 16 \ --steps 400 \ --modality-keys single_arm gripper ``` +### `open_loop_eval.py` Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `--dataset-path` | `demo_data/cube_to_bowl_5/` | Path to LeRobot-format dataset | +| `--embodiment-tag` | `new_embodiment` | Robot embodiment tag (case-insensitive) | +| `--model-path` | `None` | Path to checkpoint. If omitted, connects to a running server via `--host`/`--port` | +| `--traj-ids` | `[0]` | Episode indices to evaluate (space-separated, e.g., `0 1 2`) | +| `--execution-horizon` | `16` | Steps of each predicted chunk to execute per inference (old `--action-horizon` deprecated) | +| `--steps` | `200` | Max steps per trajectory (capped by actual trajectory length) | +| `--denoising-steps` | `4` | Diffusion denoising iterations | +| `--save-plot-path` | `None` | Directory to save GT-vs-predicted comparison plots | +| `--modality-keys` | `None` | Action keys to plot. If omitted, plots all action dimensions | +| `--host` / `--port` | `127.0.0.1` / `5555` | Server address when `--model-path` is omitted | + ### Example Evaluation Result The evaluation generates visualizations comparing predicted actions against ground truth trajectories: -Open loop evaluation results showing predicted vs ground truth trajectories \ No newline at end of file +Open loop evaluation results showing predicted vs ground truth trajectories + +## Interpreting the Result: Is My Fine-tune Working? + +`open_loop_eval.py` logs `Average MSE across all trajs` and `Average MAE across all trajs` (unnormalized action error; referred to below as `Average MSE`/`MAE`) and saves a ground-truth-vs-predicted plot. Unlike the simulation benchmarks (LIBERO, SimplerEnv, DROID), this tutorial intentionally does **not** publish a single target MSE: the demo set is only 5 episodes and your own dataset and task will differ, so a fixed number would not transfer and could mislead. Use these checks instead, in order: + +1. **Plot overlap on a training trajectory (primary).** `--traj-ids 0` is part of the training set, so a model that has fit the data should track the ground-truth curves closely. Flat or constant predictions, or curves that ignore the GT shape, point to a setup problem rather than merely an under-trained model. +2. **Error decreases with training (reproducible trend).** Save intermediate checkpoints (e.g. add `--save-steps 500`) and run the eval on each. `Average MSE`/`MAE` on `traj 0` should fall steadily as steps increase. A flat or rising curve means training is not learning from your data. +3. **Record your own baseline.** Note the `Average MSE`/`MAE` from your first clean run on the unmodified `cube_to_bowl_5` command above, and treat it as your reference point. After you change dataset size, modality config, or hyper-parameters, re-run and compare against it. + +For reference, one run of the command above — with `--save-steps` lowered to `500` so intermediate checkpoints are kept (1× H100, `--max-steps 2000`, eval on `--traj-ids 0`) — produced the trend below. The **shape** — error falling steadily as steps increase — is the signal; the absolute values are not a target and will differ with GPU, seed, and data. + +| Checkpoint | `Average MSE` (traj 0) | `Average MAE` (traj 0) | +|-----------:|-----------------------:|-----------------------:| +| 500 | 87.5 | 5.63 | +| 1000 | 25.4 | 3.30 | +| 1500 | 13.2 | 2.18 | +| 2000 | 10.0 | 1.76 | + +Averaged over all 5 training episodes, the final checkpoint scored `Average MSE` ≈ 7.5 / `Average MAE` ≈ 1.5. + +When a run looks off, this table maps the common symptoms to causes that are operational (your setup) rather than a model bug: + +| Symptom | Likely cause (operational, not a model bug) | +|---------|---------------------------------------------| +| MSE flat or rising across checkpoints | Learning rate too low, or data not loading — check `--dataset-path` and dataloader workers | +| Prediction curve is flat/constant | `modality.json` keys or `--modality-config-path` mismatch — action keys are not mapped | +| MSE extremely large or `NaN` (or `NaN` loss during training) | Action/state normalization — verify `meta/stats` and that action ranges are sane | +| Good on `traj 0` but poor on held-out episodes | Expected with only 5 demo episodes — this is data scarcity, not a bug | + +> Establish this baseline on the **as-shipped** command before changing anything. Reproducing a known-good run first is the fastest way to separate setup mistakes from genuine issues when you scale to a larger dataset. diff --git a/getting_started/hardware_recommendation.md b/getting_started/hardware_recommendation.md index 32dc981bd..f97efd48b 100644 --- a/getting_started/hardware_recommendation.md +++ b/getting_started/hardware_recommendation.md @@ -1,43 +1,95 @@ -# Isaac GR00T N Model Post-Training and Deployment +# Hardware Recommendations -GR00T N models are the open foundation models for generalized humanoid reasoning and skills. These models take multi-modal input, including language and images, to perform manipulation tasks in diverse environments. These models are adaptable through post-training for specific embodiments, tasks and environments. To address the challenge of data scarcity for training, synthetic data generation frameworks like Isaac GR00T-Mimic and GR00T-Dreams provide blueprints for creating rich training datasets that augment limited human-collected data. This approach enhances the post-training process, enabling GR00T N models to achieve improved performance on downstream tasks. -This reference architecture outlines the comprehensive workflow for post-training GR00T N Models using NVIDIA RTX PRO Servers, followed by optimized deployment on the NVIDIA Jetson AGX Thor Developer Kit. -

+GR00T N1.7 has two hardware profiles: **fine-tuning** (needs GPU VRAM and compute) and **inference/deployment** (needs low latency). This guide helps you choose the right hardware for each. +![Workflow Diagram](../media/GR00T-reference-arch-diagram.png "Post-training and deployment workflow") -![Workflow Diagram](../media/GR00T-reference-arch-diagram.png "Workflow Diagram") +--- -
+## Inference Hardware -## Bill of Materials -### Recommended Starter Kit: -**System Specifications for RTX Pro Server** -| **Component** | **Specification** | -|---|---| -| **RTX PRO SERVER** | 8x RTX PRO 6000 Blackwell Server Edition GPUs; 800 GB GPU Memory | -| **Virtualization** | VMware RedHat | -| **Containerization** | Kubernetes | -| **Storage** | Scalable; Interoperable; Secure | +**Minimum:** 1 GPU with 16 GB+ VRAM, CUDA 12.6+. -
**System Specifications for Jetson** +The table below summarizes end-to-end inference frequency across tested platforms (GR00T N1.7, 4 denoising steps, 1 camera): -| **Platform** | **Specification** | -|---|---| -| **Jetson AGX Thor Developer Kit** | Blackwell GPU with 2560 CUDA cores; 14-core Arm® Neoverse®-V3AE CPU; 128GB LP5 memory | +| Platform | VRAM | PyTorch Eager | With TensorRT | Use Case | +|----------|------|---------------|---------------|----------| +| H100 80GB HBM3 | 80 GB | 11.7 Hz | 35.9 Hz | High-frequency control, multi-env batch inference | +| H20 96GB HBM3 | 96 GB | 12.0 Hz | 29.4 Hz | Cost-effective datacenter inference | +| RTX Pro 6000 Blackwell | 96 GB | 12.8 Hz | 35.9 Hz | Workstation inference, development | +| RTX Pro 5000 72GB | 72 GB | 7.9 Hz | 24.7 Hz | Workstation inference | +| L40 | 48 GB | 7.8 Hz | 26.0 Hz | Cloud inference | +| L20 | 48 GB | 7.1 Hz | 23.3 Hz | Cloud inference | +| DGX Spark | 128 GB shared | 7.9 Hz | 10.1 Hz | Desktop edge, prototyping | +| AGX Thor | 128 GB shared | 8.9 Hz | 12.4 Hz | Robot-mounted edge deployment | +| Orin | 64 GB shared | 2.9 Hz | 6.6 Hz | Legacy Jetson edge | -
+> **Which frequency is this?** The rates above are the **model inference (replanning) rate** — how often the policy produces a new action *chunk*. This is not the same as the robot's **action-execution rate** or **camera-capture rate** (both ~30 FPS in the [real-world deployment guide](real_world_deployment.md#robot-platform)). Because each inference returns a multi-step action chunk, a ~10 Hz inference rate can sustain ~30 FPS execution via action chunking + asynchronous inference — you do **not** need 30 Hz inference to execute at 30 FPS. -### Center of Excellence: -**System Specifications for DGX B300 Server** -| **Component** | **Specification** | -|---|---| -| **NVIDIA DGX B300** | NVIDIA Blackwell Ultra GPUs; 2.3 TB GPU Memory | -| **Virtualization** | VMware RedHat | -| **Containerization** | Kubernetes | -| **Storage** | Scalable; Interoperable; Secure | +### Key Insights -
**System Specifications for Jetson Thor** +- **30+ Hz — high-frequency** (H100, RTX Pro 6000 with TensorRT): headroom for reactive, low-latency closed-loop control where sub-30 ms per-step latency matters. +- **10+ Hz — recommended minimum** (Thor, Spark with TRT; most dGPUs with torch.compile): sufficient inference rate for typical manipulation tasks (paired with action chunking to reach ~30 FPS execution). +- **< 10 Hz** (Orin with TensorRT): only suitable for slow, non-reactive tasks. +- **TensorRT Full Pipeline** provides 1.5--3.3x speedup over PyTorch Eager depending on platform. Biggest gains are on datacenter GPUs where backbone acceleration is significant. +- **torch.compile** is a good zero-effort middle ground (no engine build step), achieving 1.1--1.9x speedup across all platforms. -| **Platform** | **Specification** | -|---|---| -| **Jetson AGX Thor Developer Kit** | Blackwell GPU with 2560 CUDA cores; 14-core Arm® Neoverse®-V3AE CPU; 128GB LP5 memory | +> For full per-component latency breakdown, see the [Deployment Benchmark Results](../scripts/deployment/README.md#benchmark-results). + +--- + +## Fine-Tuning Hardware + +**Minimum:** 1 GPU with 40 GB+ VRAM. GR00T N1.7 is a ~3B parameter model (bfloat16). + +| Setup | GPUs | VRAM per GPU | Global Batch Size | Notes | +|-------|------|-------------|-------------------|-------| +| Quick start / prototyping | 1x H100, L40, or A100 | 40--80 GB | 32 | Single GPU; sufficient for demo datasets | +| Recommended | 4--8x H100 or L40 | 40--80 GB each | 64--640 | Multi-GPU via torchrun; faster convergence | +| Full scale | 8x RTX Pro 6000 or DGX | 96 GB each | 640 | Large datasets, production fine-tuning | + +### Key Details + +- **Default fine-tuning** tunes the projector + diffusion action head (not the full LLM backbone), keeping peak VRAM under ~35 GB per GPU. +- **Enabling `--tune-llm` or `--tune-visual`** significantly increases VRAM — 80 GB+ per GPU recommended. +- **`--gradient-accumulation-steps`** can compensate for fewer GPUs. For example, 4 GPUs with 8 accumulation steps and per-GPU batch of 8 gives an effective global batch size of 256. +- **Reduce `--num-shards-per-epoch`** if host memory (not VRAM) is limited — this controls how much dataset is preloaded into RAM. + +--- + +## Software Requirements + +| Requirement | Version | +|-------------|---------| +| Python | 3.12 | +| CUDA | 12.6+ (dGPU) / 13.2 (Thor, Orin) / 13.0 (Spark) | +| PyTorch | 2.7+ | +| OS | Ubuntu 22.04+ (dGPU), JetPack 7.2 (Orin), Ubuntu 24.04 (Thor, Spark) | +| Package manager | [uv](https://docs.astral.sh/uv/) (recommended) | + +Platform-specific installation instructions: see the [Deployment Guide](../scripts/deployment/README.md). + +--- + +## Recommended Configurations + +### Starter Kit + +For development, small-scale fine-tuning, and edge deployment: + +| Component | Recommendation | +|-----------|---------------| +| Training | 1--4x L40 (48 GB) or RTX Pro 5000/6000 workstation | +| Edge Deployment | [Jetson AGX Thor](https://developer.nvidia.com/embedded/jetson) Developer Kit (128 GB shared memory, Blackwell GPU) | +| Storage | 500 GB+ SSD (datasets + checkpoints) | + +### Center of Excellence + +For production fine-tuning and high-throughput inference: + +| Component | Recommendation | +|-----------|---------------| +| Training | DGX with 8x H100/B200, or RTX Pro Server with 8x RTX Pro 6000 Blackwell | +| Inference Server | H100 or H20 node with TensorRT Full Pipeline (35+ Hz per GPU) | +| Edge Deployment | [Jetson AGX Thor](https://developer.nvidia.com/embedded/jetson) or [DGX Spark](https://developer.nvidia.com/dgx-spark) | +| Storage | Scalable networked storage (NFS/S3) for large-scale datasets | diff --git a/getting_started/policy.md b/getting_started/policy.md index 91f8cd25a..cf1020b9e 100644 --- a/getting_started/policy.md +++ b/getting_started/policy.md @@ -20,10 +20,96 @@ policy = Gr00tPolicy( ``` **Parameters:** -- `model_path`: Path to your trained model checkpoint directory -- `embodiment_tag`: The embodiment tag you used during training (e.g., `EmbodimentTag.NEW_EMBODIMENT`) -- `device`: Device to run inference on (`"cuda:0"`, `"cpu"`, or integer device index) -- `strict`: Whether to validate inputs/outputs (recommended during development, can disable in production) + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `embodiment_tag` | `EmbodimentTag \| str` | *(required)* | Robot type; accepts enum or case-insensitive string (e.g., `"NEW_EMBODIMENT"`) | +| `model_path` | `str` | *(required)* | Path to model checkpoint directory (local path or HuggingFace model ID) | +| `device` | `str \| int` | *(required)* | Inference device: `"cuda:0"`, `0`, or `"cpu"` | +| `strict` | `bool` | `True` | Validates observation shapes and dtypes at runtime. Recommended during development; disable in production for speed | + +## Inference Parameter Guide + +When running inference scripts (e.g., `standalone_inference_script.py`, `open_loop_eval.py`), the key parameters are: + +### `--embodiment-tag` + +Determines which modality config the model uses (state/action keys, normalization). **Must match the robot type of your dataset.** + +The tag is **case-insensitive** and accepts either the enum name or the string value. +For example, `--embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` and `--embodiment-tag LIBERO_PANDA` all resolve correctly. An unknown tag will produce an error listing all known options. + +- **Pretrain tags** (e.g., `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT`, `XDOF`, `REAL_G1`) — use for zero-shot inference on datasets that match the pretrained embodiment. The modality config is loaded from the base model checkpoint. +- **Posttrain tags** (`OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT`, `UNITREE_G1_SONIC`, `LIBERO_PANDA`, `SIMPLER_ENV_GOOGLE`, `SIMPLER_ENV_WIDOWX`) — require a finetuned checkpoint. Passing these to the base model will produce an error. +- **`NEW_EMBODIMENT`** — use for custom robots. Requires a `--modality-config-path` during finetuning. After finetuning, the config is saved in the checkpoint and loaded automatically during inference. + - Only one `NEW_EMBODIMENT` modality config may be registered per Python process. Examples like [`examples/SO100/so100_config.py`](../examples/SO100/so100_config.py) and [`examples/mask-guided-background-suppression/so101_config.py`](../examples/mask-guided-background-suppression/so101_config.py) each register under this tag; importing both in the same process will fail. In normal CLI use the selected `--modality-config-path` is the only one imported, so this is not an issue — just don't wire both configs into the same script. + +#### Known Embodiment Tags + +**Pretrain tags** — baked into the base model (`nvidia/GR00T-N1.7-3B`), ready for zero-shot inference: + +| Tag | Robot / Data Source | Value | +|-----|---------------------|-------| +| `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` | DROID (relative EEF + joint) | `oxe_droid_relative_eef_relative_joint` | +| `XDOF` | Generic X-DOF (relative EEF + joint) | `xdof_relative_eef_relative_joint` | +| `XDOF_SUBTASK` | Generic X-DOF (subtask variant) | `xdof_relative_eef_relative_joint_subtask` | +| `REAL_G1` | Real-world Unitree G1 (relative EEF + joint) | `real_g1_relative_eef_relative_joints` | +| `REAL_R1_PRO_SHARPA` | Real-world R1 Pro Sharpa (relative EEF) | `real_r1_pro_sharpa_relative_eef` | +| `REAL_R1_PRO_SHARPA_HUMAN` | R1 Pro Sharpa — human teleop data | `real_r1_pro_sharpa_relative_eef_human` | +| `REAL_R1_PRO_SHARPA_MAXINSIGHTS` | R1 Pro Sharpa — MaxInsights (single-cam) | `real_r1_pro_sharpa_relative_eef_maxinsights` | +| `REAL_R1_PRO_SHARPA_MECKA` | R1 Pro Sharpa — Mecka (single-cam) | `real_r1_pro_sharpa_relative_eef_mecka` | + +**Posttrain tags** — require a finetuned checkpoint (not usable with the base model directly): + +| Tag | Robot | Value | Checkpoint | +|-----|-------|-------|------------| +| `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` | DROID (relative EEF + joint) | `oxe_droid_relative_eef_relative_joint` | `nvidia/GR00T-N1.7-DROID` | +| `UNITREE_G1_SONIC` | Unitree G1 with [GEAR-SONIC](https://github.com/NVlabs/GR00T-WholeBodyControl) WBC (latent actions) | `unitree_g1_sonic` | [See GEAR-SONIC VLA Workflow](https://nvlabs.github.io/GR00T-WholeBodyControl/tutorials/vla_workflow.html) | +| `LIBERO_PANDA` | LIBERO Panda | `libero_sim` | `nvidia/GR00T-N1.7-LIBERO` | +| `SIMPLER_ENV_GOOGLE` | SimplerEnv Google Robot | `simpler_env_google` | `nvidia/GR00T-N1.7-SimplerEnv-Fractal` | +| `SIMPLER_ENV_WIDOWX` | SimplerEnv WidowX | `simpler_env_widowx` | `nvidia/GR00T-N1.7-SimplerEnv-Bridge` | + +**Generic tag** for any new robot: `NEW_EMBODIMENT` (requires `--modality-config-path`) + +> **`OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` appears in both tables by design.** DROID is supported both zero-shot (via the base model) and via the finetuned `nvidia/GR00T-N1.7-DROID` checkpoint. Pass the tag with either `--model-path nvidia/GR00T-N1.7-3B` (zero-shot) or `--model-path nvidia/GR00T-N1.7-DROID` (finetuned); see `examples/DROID/README.md`. + +> **Important:** Pretrain tags work with the base model for zero-shot inference. Posttrain tags require a finetuned checkpoint — using them with the base model will fail with an error listing the supported tags. You also cannot mix embodiment tags and datasets (e.g., `--embodiment-tag LIBERO_PANDA` expects LIBERO state keys and will fail on an SO100 dataset). + +### `--traj-ids` + +Which episode indices to evaluate. Check your dataset's `meta/episodes.jsonl` to see available episodes. For example, `--traj-ids 0 1 2` runs on the first 3 episodes. + +### `--execution-horizon` + +How many steps of each predicted action chunk are **executed** before the script re-plans (calls the model again) — i.e. the receding/execution horizon, *not* how many the model predicts. It must be `≤` the model's configured `action_horizon` (the predicted chunk length); the base `nvidia/GR00T-N1.7-3B` checkpoint uses `action_horizon: 40`, so `≤ 40` for that checkpoint — finetuned checkpoints may differ. Common values: +- `16` — default execution horizon for open-loop evaluation +- `8` — shorter horizon, common for real-time deployment where actions are re-planned frequently + +Because the base checkpoint already predicts 40 steps, it satisfies Real-Time Chunking (RTC), which recommends a chunk size of `≥ 32` (see the [real-world deployment guide](real_world_deployment.md#real-time-chunking-rtc-details)). + +> The former name `--action-horizon` is deprecated (it collided with the model-config `action_horizon`, the predicted chunk length) but still accepted with a warning. + +This parameter is robot-agnostic — the same value works across different datasets and embodiments. + +### `--inference-mode` + +- `pytorch` — standard PyTorch inference (default, no setup required) +- `tensorrt` — accelerated inference using TensorRT engine (requires ONNX export + engine build first, see [Deployment Guide](../scripts/deployment/README.md)) + +### Expected Output (PyTorch mode) + +The inference scripts produce: +- Per-trajectory **MSE** and **MAE** (unnormalized action prediction error vs ground truth) +- **Timing stats**: model load time, avg/min/max/P90 inference time per step +- **Summary**: average MSE/MAE across all trajectories + +### Example: Matching Parameters to Dataset + +| Dataset | Embodiment Tag | Notes | +|---------|---------------|-------| +| `demo_data/droid_sample` | `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` | DROID — works with base model (zero-shot) or finetuned `nvidia/GR00T-N1.7-DROID` | +| `demo_data/libero_demo` | `LIBERO_PANDA` | LIBERO Panda — uses finetuned checkpoint from `nvidia/GR00T-N1.7-LIBERO` (must be downloaded locally first, see [README](../README.md)) | +| `demo_data/cube_to_bowl_5` | `NEW_EMBODIMENT` | SO100 arm — only works with a finetuned checkpoint, not the base model | ## Understanding the Observation Format @@ -187,18 +273,32 @@ For many use cases, especially when working with real robots or distributed syst - **Separate compute resources**: Run policy inference on a GPU server while controlling the robot from a different machine - **Dependency isolation**: Avoid dependency issues with the client policy +```mermaid +sequenceDiagram + participant Robot as Robot / Sim Client + participant Client as PolicyClient (ZMQ REQ) + participant Server as PolicyServer (ZMQ REP) + participant Policy as Gr00tPolicy (GPU) + + Robot->>Client: observation dict + Client->>Server: msgpack(endpoint="get_action", data=obs) + Server->>Policy: policy.get_action(obs) + Policy-->>Server: (action_dict, info_dict) + Server-->>Client: msgpack(action, info) + Client-->>Robot: action dict +``` + #### Starting the Policy Server Launch the server using the `run_gr00t_server.py` script: ```bash -python gr00t/eval/run_gr00t_server.py \ +uv run python gr00t/eval/run_gr00t_server.py \ --embodiment-tag NEW_EMBODIMENT \ --model-path /path/to/your/checkpoint \ --device cuda:0 \ --host 0.0.0.0 \ - --port 5555 \ - --strict True + --port 5555 ``` **Parameters:** @@ -207,7 +307,7 @@ python gr00t/eval/run_gr00t_server.py \ - `--device`: Device to run inference on (`cuda:0`, `cuda:1`, `cpu`, etc.) - `--host`: Host address (`127.0.0.1` for local only, `0.0.0.0` to accept external connections) - `--port`: Port number (default: 5555) -- `--strict`: Enable input/output validation (default: True) +- `--strict` / `--no-strict`: Enable or disable input/output validation (default: True) - `--use-sim-policy-wrapper`: Whether to use `Gr00tSimPolicyWrapper` for GR00T simulation environments (default: False) Once started, the server will display: @@ -257,22 +357,41 @@ action, info = policy.get_action(observation) The `PolicyClient` implements the same `BasePolicy` interface, so it's a drop-in replacement: ```python -# Get modality configuration +# Get modality configuration from the server modality_configs = policy.get_modality_config() -# Get action +# Get action — returns (action_dict, info_dict) action, info = policy.get_action(observation, options=None) -# Reset policy state +# Reset policy state (e.g., switch episode in ReplayPolicy) info = policy.reset(options=None) -# Check server health +# Check server health — returns True if server responds is_alive = policy.ping() -# Shutdown the server (optional) +# Shutdown the server remotely (optional) policy.kill_server() ``` +#### Server API Reference + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `policy` | `BasePolicy` | *(required)* | The policy instance to serve (e.g., `Gr00tPolicy`, `ReplayPolicy`) | +| `host` | `str` | `"*"` | Bind address. `"*"` accepts connections on all interfaces | +| `port` | `int` | `5555` | TCP port for ZMQ REP socket | +| `api_token` | `str` | `None` | If set, clients must include a matching token in every request | + +**Built-in endpoints:** `get_action`, `reset`, `get_modality_config`, `ping`, `kill`. Custom endpoints can be added via `server.register_endpoint(name, handler)`. + +#### Error Handling + +The server-client uses ZeroMQ REQ/REP sockets over TCP with msgpack serialization. + +- **Timeout:** If the server does not respond within `timeout_ms`, the ZMQ socket will raise `zmq.error.Again`. The default 15 s timeout accommodates cold-start model loading on the first call. +- **Connection loss:** If `ping()` returns `False`, the client automatically recreates its ZMQ socket for the next attempt. Your control loop should retry or halt. +- **Server-side errors:** Exceptions in the policy are caught, serialized as `{"error": "..."}`, and re-raised as `RuntimeError` on the client side. + #### Debugging with ReplayPolicy When developing a new environment integration or debugging your inference loop, running a full model inference can be cumbersome. `ReplayPolicy` allows you to **replay recorded actions from an existing dataset**, helping you verify that: @@ -289,7 +408,7 @@ This eliminates the need for a trained model during the development phase. Instead of providing `--model-path`, use `--dataset-path` to start the server in replay mode: ```bash -python gr00t/eval/run_gr00t_server.py \ +uv run python gr00t/eval/run_gr00t_server.py \ --dataset-path /path/to/lerobot_dataset \ --embodiment-tag NEW_EMBODIMENT \ --host 0.0.0.0 \ @@ -301,7 +420,7 @@ python gr00t/eval/run_gr00t_server.py \ - `--dataset-path`: Path to a LeRobot-compatible dataset directory - `--embodiment-tag`: The embodiment tag for modality configuration - `--execution-horizon`: Number of steps to advance the dataset per `get_action()` call. Should match the number of executed action steps in the environment. -- `--modality-config-path`: (Optional) Path to custom modality config JSON file. If not provided, uses the config from `embodiment-tag` +- `--modality-config-path`: (Optional) Path to a custom modality config — either a Python module (`.py`, e.g. `examples/SO100/so100_config.py`) or a ModalityConfig JSON (`.json`). If not provided, uses the config from `embodiment-tag` - `--use-sim-policy-wrapper`: Apply `Gr00tSimPolicyWrapper` for GR00T simulation environments ##### Using ReplayPolicy from the Client @@ -337,25 +456,25 @@ The number of available episodes can be queried via the `info` dict returned fro ##### Example: Validating a LIBERO Environment -Here's a complete example of using ReplayPolicy to validate a LIBERO simulation setup: +Here's a complete example of using ReplayPolicy to validate a simulation setup: ```bash # Terminal 1: Start the replay server -python gr00t/eval/run_gr00t_server.py \ - --dataset-path examples/LIBERO/libero_10_no_noops_1.0.0_lerobot \ - --embodiment-tag LIBERO_PANDA \ - --action-horizon 8 \ +uv run python gr00t/eval/run_gr00t_server.py \ + --dataset-path \ + --embodiment-tag \ + --execution-horizon 8 \ --use-sim-policy-wrapper # Terminal 2: Run evaluation with the replay policy -python gr00t/eval/rollout_policy.py \ - --n_episodes 1 \ - --policy_client_host 127.0.0.1 \ - --policy_client_port 5555 \ - --max_episode_steps 720 \ - --env_name libero_sim/KITCHEN_SCENE3_turn_on_the_stove_and_put_the_moka_pot_on_it \ - --n_action_steps 8 \ - --n_envs 1 +uv run python gr00t/eval/rollout_policy.py \ + --n-episodes 1 \ + --policy-client-host 127.0.0.1 \ + --policy-client-port 5555 \ + --max-episode-steps 720 \ + --env-name / \ + --n-action-steps 8 \ + --n-envs 1 ``` If your environment is set up correctly, replaying ground-truth actions should achieve high (often 100%) success rates. Low success rates indicate issues with: @@ -365,7 +484,7 @@ If your environment is set up correctly, replaying ground-truth actions should a > **Tip:** ReplayPolicy is an excellent first step when integrating a new environment. Debug with replay first, then switch to model inference once the pipeline is validated. -#### Integrating the GR00T 1.6 Client Into Your Deployment Pipeline +#### Integrating the GR00T N1.7 Client Into Your Deployment Pipeline GR00T's server–client architecture allows you to keep the **client side extremely lightweight**, making it easy to embed into any custom deployment pipeline without pulling in the full dependency stack. @@ -440,7 +559,7 @@ When training a model, you can optimize the dataloading speed vs memory usage vi examples: ```bash -python gr00t/experiment/launch_finetune.py \ +uv run python gr00t/experiment/launch_finetune.py \ .... \ --num-shards-per-epoch 100 \ --dataloader-num-workers 2 diff --git a/getting_started/real_world_deployment.md b/getting_started/real_world_deployment.md new file mode 100644 index 000000000..d85da41ff --- /dev/null +++ b/getting_started/real_world_deployment.md @@ -0,0 +1,464 @@ +# GR00T Real-World Deployment Guide + +This guide covers building an end-to-end real-world VLA pipeline—from data collection and training to deployment—with practical engineering recommendations. + +## Overview + +A typical GR00T real-world deployment workflow includes: + +1. **[Hardware Preparation](#1-hardware-and-environment-preparation-device-requirements)**: Verify that the robot platform, sensors, and compute resources are ready. +2. **[Data Collection](#2-data-collection)**: Choose an appropriate teleoperation setup and collect at least 100 valid episodes. +3. **[Data Preprocessing](#3-data-preprocessing)**: Clean data, align timestamps, and convert to LeRobot format. +4. **[Model Training](#4-vla-model-training)**: Fine-tune GR00T N1.*. +5. **[Model Evaluation](#validation)**: Run open-loop evaluation to validate convergence and model quality. +6. **[Deployment Setup](#5-deployment-and-closed-loop-control)**: Build a ZMQ Server-Client architecture. +7. **[Closed-Loop Testing](#5-deployment-and-closed-loop-control)**: Run closed-loop control on real hardware and monitor jittering and stop-and-go behavior. +8. **[Optimization](#6-common-issues-jittering-and-stop-and-go)**: Tune RTC parameters and trajectory smoothing strategies based on real-world performance. + +## 1. Hardware and Environment Preparation (Device Requirements) + +Ensure your robot hardware, sensor pipeline, and control interfaces are stable and available. + +### Robot Platform + +- **Recommended platforms**: Robotic arms with SDK-level control support (e.g., Franka, UR, Piper, SO101). +- **Basic requirements**: + - Real-time joint state feedback. + - High-frequency action execution (30 FPS recommended). + - Stable control interface. + +> **30 FPS vs inference rate:** The 30 FPS here (and for the cameras below) is the robot's **action-execution** and **camera-capture** rate — not the model **inference** rate. The policy returns a multi-step action *chunk* per inference, so a ~10 Hz inference rate can drive 30 FPS execution via action chunking + asynchronous inference. See the [inference-frequency guidance](hardware_recommendation.md#key-insights) for what each platform sustains. + +### Multimodal Sensors + +| Sensor Type | Specification | Purpose | +|-------------|---------------|---------| +| **Wrist-mounted camera** | 30 FPS, RGB | Capture close-range manipulation visuals | +| **Third-person camera (3rd view)** | 30 FPS, RGB | Capture global scene context | +| **Robot proprioceptive state** | Real-time acquisition | Joint states and gripper state | + +### Compute Resources + +- **Training phase**: NVIDIA GPU servers (e.g., H100 or H20) are recommended for larger batch sizes. +- **Deployment phase**: Edge hardware such as Jetson AGX Thor supports on-device inference. + +> For details, see the [hardware recommendation guide](hardware_recommendation.md). + +### Teleoperation Devices + +Teleoperation device selection is critical for data quality. + +### Teleoperation Device Comparison + +In the table below: +- **Embodiment dependency**: how similar the teleoperation device and target robot must be in joint topology, degrees of freedom (DoF), and workspace. Higher dependency implies harder cross-embodiment transfer. +- **Operational intuition**: how naturally operator inputs map to robot motion. Higher intuition means faster onboarding and lower demonstration error. + +| Device Type | Cost Level (Reference) | Embodiment Dependency | Operational Intuition | Notes | +|-------------|------------------------|-----------------------|-----------------------|-------| +| **Keyboard/Gamepad/SpaceMouse/Joylo** | Low | Low: command mapping via keys/controls | Medium: requires adaptation to key-motion mapping | Low entry cost; a good starting point and useful in mobile scenarios | +| **Master-Slave arm systems** | Medium | High: master/slave arms usually require similar kinematics and workspace | High: near one-to-one human-robot mapping | Suitable for single-robot setups; commonly used by robot OEMs; can reduce the risk of reaching joint limits during demonstrations | +| **UMI / Fast-UMI / Pika Sense** | Medium | Low: hardware-agnostic action representation reusable across arms | High: after calibration, end-effector (EEF) following is intuitive | Suitable for training general VLA models; low-DoF arms may still hit joint limits | +| **VR-based teleoperation** | Medium (headset + rendering + network) | Low: mainly depends on software integration | Medium: depends on immersive visual feedback and tracking quality | A flexible solution, but with higher integration overhead | +| **Glove / Motion Capture** | High (commercial mocap suite + data gloves) | Low: retarget through kinematic mapping to different embodiments | High: intuitive full-hand/full-body control | Suitable for full-body control and dexterous-hand tasks | +| **Exoskeleton** | High | High: usually requires matched joint structure | High: natural action correspondence | Extendable to multi-joint humanoid control | + +## 2. Data Collection + +Key considerations for data collection: + +### Timestamp Synchronization + +- The FPS of both camera streams should be strictly matched, and capture triggers should be as synchronized as possible. +- Joint state sampling frequency should exceed camera FPS to enable accurate downsampling. +- Record full timestamps during collection for downstream temporal alignment. + +### Action Representation + +- If training and collection use the same embodiment (e.g., master-slave arms), log joint-space `Joint States` during collection. For task-space models, compute EEF pose via forward kinematics (FK) in post-processing. +- If embodiments differ (e.g., collect with UMI, deploy on Piper), directly record task-space EEF pose during collection. + +### Data Distribution + +- Current imitation-learning-based models perform more reliably in previously seen scenarios. In early-stage experiments, start with data collection and validation in a limited domain. +- After pipeline validation, gradually expand the domain by varying lighting, object placement, and initial robot poses to improve generalization. + +### Scene Consistency + +- Keep third-person camera extrinsics fixed and ensure a rigid wrist-camera mount. +- In early experiments, prioritize scene consistency; avoid varying lighting, object placement, or initial robot poses. + +### Joint Limits + +- If collecting joint-space data, avoid operating near joint limits to reduce the number of samples in those regions. + +## 3. Data Preprocessing + +Raw data must be cleaned, synchronized, and converted before training. + +### Trajectory Filtering + +Data filtering is recommended in two stages: script-based filtering and manual review. + +#### Script Filtering + +- Check image timestamps and remove samples with: + 1. Excessive latency in a single camera stream. + 2. Excessive timestamp difference between the two camera streams. +- Detect and remove abnormal jumps in robot state sequences. + +#### Manual Filtering + +Replay trajectories with synchronized visualization to catch issues missed by scripts: + +- Remove samples with poor synchronization between image and action sequences. +- Remove blurry frames. +- Remove failed task executions. +- Remove low-quality trajectories (e.g., redundant paths, discontinuous actions). + +### Trajectory Preprocessing + +1. Timestamp alignment: align camera frames and robot joint states to a shared time base. +2. Head-tail trimming: remove idle segments at the start and end of trajectories. +3. Split long trajectories (several minutes) into multiple subtasks. + +### Format Conversion + +Convert all data to a standard format (e.g., LeRobot) for GR00T compatibility: + +- See the [data preparation guide](data_preparation.md) for format requirements. +- Use the provided conversion scripts to convert data to GR00T LeRobot format. + +## 4. VLA Model Training + +### Training Parameter Configuration + +**Dataset size recommendations** + +For single-task `finetune`: + +- **Minimum data size**: Prepare at least **100 valid episodes**. For very narrow task domains, ~30 episodes may suffice. A capture frequency of 20–50 Hz is recommended for manipulation tasks. +- **Episode length**: No hard limit, but each episode must contain a complete action cycle with idle frames removed. Split overly long episodes into subtasks. +- **Recommended data size**: 200+ episodes usually provide more stable performance. + +**Core parameters** + +- **Input/output mode**: Default to `State-relative Action Prediction`. Compared with `Absolute Action`, it converges more easily and improves inter-chunk consistency. +- **Training space**: Both joint space and task space are valid. For low-DoF arms, joint space is often preferred to reduce singularity-related risks. +- **Action Chunk Size**: Default is 16. If combined with RTC to mitigate stop-and-go, set it to at least 32. +- **Batch Size**: Increase the batch size as much as GPU memory allows. + +> For additional training options, see the [fine-tuning guide](finetune_new_embodiment.md). + +**Compute resources** + +- Fine-tuning requires significantly less compute than pretraining. +- You can start on a **single GPU** (40 GB+ VRAM). See the [hardware recommendation guide](hardware_recommendation.md#fine-tuning-hardware) for the minimum and quick-start configurations. +- A single compute node (8 x H100 or 8 x H20) is a **production-scale** setup for faster convergence on larger datasets — not a minimum requirement. + +### Validation + +After training, run open-loop validation to confirm convergence, then proceed to closed-loop deployment validation. + +> Open-loop validation is only a preliminary check. Final performance must be verified with closed-loop testing on real robots. For details, see the [fine-tuning guide](finetune_new_embodiment.md). + +## 5. Deployment and Closed-Loop Control + +### System Architecture + +GR00T supports two inference modes: + +1. **Direct `Gr00tPolicy` usage**: Suitable when model inference and robot control run on the same machine. +2. **ZMQ Server-Client architecture**: Suitable for real-world deployment and decouples local robot control (`Local Client`) from remote inference (`Model Server`). + +For real-world deployment, **ZMQ inference service** is recommended: + +- Move compute-intensive inference to GPU servers. +- Keep robot-side control code lightweight. +- Avoid installing the full inference dependency stack on the robot side. + +### On-Device Deployment Logic + +Deployment code has two phases: **initialization** and the **main control loop**. +The pseudo-code below uses a synchronous workflow, which may cause stop-and-go. See later sections for mitigation via asynchronous execution + RTC. + +**Pseudo-code workflow:** + +```python +# ========== Initialization ========== +# 1. Initialize and test cameras +hand_camera = initialize_hand_camera() # e.g., OrbbecSDK +env_camera = initialize_env_camera() # e.g., RealSense +test_cameras() # Show preview and verify normal operation + +# 2. Connect and test robot +robot = connect_robot() # e.g., Piper SDK +robot.enable() +robot.reset_to_initial_position() +test_robot() # Send test command and verify robot response + +# 3. Connect and test GR00T model server +gr00t_client = connect_to_gr00t_server(host, port) +if not gr00t_client.ping(): + raise ConnectionError("Failed to connect to model server") +test_model() # Send test observation and verify inference + +# ========== Main control loop ========== +while True: + # 1. Acquire sensor data + hand_image = hand_camera.get_frame() + env_image = env_camera.get_frame() + joint_states = robot.get_joint_states() + gripper_state = robot.get_gripper_state() + + # 2. Format observation + observation = format_observation( + hand_image, + env_image, + joint_states, + gripper_state, + task_description, + ) + + # 3. Model inference (via ZMQ) + actions = gr00t_client.get_action(observation) + + # 4. Trajectory post-processing + actions_arm = actions["joint_states"] + actions_arm = smooth_trajectory(actions_arm) # smoothing + actions_arm = check_safety_limits(actions_arm) # safety checks + + # 5. Execute actions + for action_step in actions_arm: + robot.execute_action(action_step) + sleep(1.0 / 30.0) # 30 FPS +``` + +### Key Implementation Notes + +**Important notes:** + +- **Image format**: Use compressed formats such as JPG to reduce transmission bandwidth. +- **Safe operation**: + - **Soft Limits**: Add joint-angle and EEF pose range checks. If a predicted action exceeds workspace bounds, raise an alarm and stop immediately. + - **E-Stop logic**: Bind an emergency stop hotkey (e.g., Space) on the control PC, or use a physical E-Stop switch. +- **Action smoothing**: Apply interpolation and smoothing to predicted action sequences. + +> For more deployment details, see the [policy API guide](policy.md). + +## 6. Common Issues: Jittering and Stop-and-Go + +The most common issues in real-world deployment are **jittering** and **stop-and-go**. + +### Fixing Jittering + +**Jittering** here refers to visible shaking or vibration of the end-effector or joints during task execution. + +Jittering typically originates from **inconsistent model outputs** or **insufficient robot-side control quality**. Analyze these two components separately to localize the issue. The suggestions below are general guidelines and may not apply to every robot platform or control stack — always verify against your own hardware and environment. + +```mermaid +flowchart TD + A[Jittering observed] --> B[Save & visualize action chunks in 3D] + B --> C{Where is the jitter?} + C -->|Inside each chunk| D[Case A: Model undertrained or poor data quality] + C -->|Between consecutive chunks| E[Case B: Inconsistent chunk predictions] + C -->|Chunks look smooth| F[Case C: Robot hardware / low-level control issue] + D --> D1[Add more data, train longer, check train/eval consistency] + E --> E1[Use state-relative actions + RTC chunking strategy] + F --> F1[Check drive control, interpolation, hardware status] +``` + +**Diagnosis and mitigation** + +1. **Save and visualize Action Chunks** + - Save all predicted `Action Chunks`. + - Visualize continuous TCP (tool center point) trajectories in 3D. + - **Note**: Convert joint-space outputs to task space via FK before visualization. + +2. **Analyze visualization results** + + **Case A: Significant jitter inside each chunk** + - **Cause**: The model is undertrained, or data quality is insufficient. + - **Solution**: Improve data quality, add more training data, or train longer. Keep training and validation environments consistent. + + **Case B: Significant jitter between chunks** + - **Cause**: Inconsistent adjacent `Action Chunk` predictions. + - **Solution**: + - Use `State-relative Action Prediction`. Predicting actions relative to the current state produces a more uniform output distribution, making the network easier to train. + - Use RTC (`Real-Time Chunking`) or similar strategies. + + **Case C: Little jitter after visualization** + - **Cause**: Likely a robot hardware or low-level control issue. + - **Solution**: Check drive control, interpolation, and hardware status. + +**Quantitative diagnostic metrics** + +Trajectory jitter can also be quantified using these three metrics: + +**Metric 1: Mean intra-chunk acceleration magnitude** + +Measures intra-chunk smoothness. Only valid under fixed sampling frequency. + +Formula: $a_t = pos_{t+1} - 2 \cdot pos_t + pos_{t-1}$ + +```python +def metric_intra_accel(chunks): + """ + Args: + chunks: numpy array with shape (N_chunks, Chunk_Length, Joint_Dim) + + Returns: + float: Mean acceleration magnitude + """ + velocity = np.diff(chunks, axis=1) # first-order difference + acceleration = np.diff(velocity, axis=1) # second-order difference + acc_magnitude = np.linalg.norm(acceleration, axis=-1) # L2 norm per step + return np.mean(acc_magnitude) +``` + +**Metric 2: Position jump at chunk boundary (L2 distance)** + +Measures position continuity between chunks by comparing the last executed step of `Chunk[i]` with step 0 of `Chunk[i+1]`. + +```python +def metric_boundary_jump(chunks, execute_steps=None): + """ + Args: + chunks: numpy array with shape (N_chunks, Chunk_Length, Joint_Dim) + execute_steps: number of executed steps per chunk; if None, use full chunk length + + Returns: + float: Mean position jump + """ + chunks = np.array(chunks) + exec_steps = chunks.shape[1] if execute_steps is None else execute_steps + + last_frame_prev = chunks[:-1, exec_steps - 1, :] # last frame of previous chunk + first_frame_curr = chunks[1:, 0, :] # first frame of current chunk + jumps = np.linalg.norm(first_frame_curr - last_frame_prev, axis=-1) # Euclidean distance + return np.mean(jumps) +``` + +**Metric 3: Cosine similarity of velocity direction at chunk boundary** + +Measures velocity-direction consistency between chunks. Values closer to 1 indicate better consistency. + +```python +def metric_momentum_shift(chunks, execute_steps=None): + """ + Args: + chunks: numpy array with shape (N_chunks, Chunk_Length, Joint_Dim) + execute_steps: number of executed steps per chunk; if None, use full chunk length + + Returns: + float: Mean cosine similarity + """ + chunks = np.array(chunks) + exec_steps = chunks.shape[1] if execute_steps is None else execute_steps + + # velocity at the end of previous chunk + idx = exec_steps - 1 + if idx < 1: + raise ValueError("execute_steps must be >= 2 to compute end velocity") + v_end = chunks[:-1, idx, :] - chunks[:-1, idx - 1, :] + + # velocity at the start of current chunk + v_start = chunks[1:, 1, :] - chunks[1:, 0, :] + + # cosine similarity + dot_product = np.sum(v_end * v_start, axis=-1) + norm_prev = np.linalg.norm(v_end, axis=-1) + norm_curr = np.linalg.norm(v_start, axis=-1) + epsilon = 1e-8 + cosine_sim = dot_product / (norm_prev * norm_curr + epsilon) + + return np.mean(cosine_sim) +``` + +### Fixing Stop-and-Go +Stop-and-Go here refers to a behavior in which the robot intermittently pauses during motion, producing periodic stop-and-go behavior. + +#### Root Cause + +In **synchronous single-step closed-loop** control, stop-and-go occurs when the **end-to-end latency** (observation capture → VLA inference → action conversion) exceeds control-frequency requirements. + +- **Control-frequency requirement**: At 30 FPS, latency must stay below ~33 ms. +- **Typical latency sources**: Data capture, network transfer, model inference, and post-processing often exceed 33 ms combined. +- **Consequence**: The next prediction is not ready when the current action finishes, causing pauses. + +#### Solutions + +**Option 1: Optimize the inference pipeline (direct but difficult)** + +Reduce full workflow latency below 33 ms: + +- Optimize network bandwidth (reduce transfer time). +- Use edge inference (reduce network latency). +- Quantize the VLA model (speed up inference). +- Use a smaller model (e.g., ACT). + +**Limitation**: For VLA models, meeting strict real-time requirements through optimization alone is often impractical. + +**Option 2: Use algorithmic scheduling strategies (recommended)** + +When direct optimization is insufficient, use one or more of the following: + +- **Asynchronous Inference**: A background thread runs inference while the main thread executes actions. +- **Receding Horizon**: Execute only the first few steps of each `Action Chunk` before triggering a new inference. +- **Temporal Ensemble**: Aggregate predictions across multiple timesteps. +- **Real-Time Chunking (RTC)**: Overlap the start of the current prediction with unexecuted steps from the previous one. + +**Recommended strategy**: `Asynchronous Inference + RTC` is usually the most effective. + +> **RTC status (experimental):** Asynchronous inference is supported today. RTC is currently only a low-level model primitive: `action_head.get_action(..., options={"rtc_overlap_steps": ..., "rtc_frozen_steps": ..., "rtc_ramp_rate": ...})` with the previous action fed back in (`gr00t/model/gr00t_n1d7/gr00t_n1d7.py`). It is **not wired into `Gr00tPolicy` or the server-client path** (there `options` is currently unused), and it has no tests or ready-made example — so the RTC steps below require manual integration. + +#### Real-Time Chunking (RTC) Details + +**Principle** + +RTC treats action prediction as an inpainting problem: overlapping the start of the new prediction with unexecuted steps from the previous one ensures smooth transitions. + +**Applicability** + +- Validated for **diffusion / flow-based** VLA policies. +- Requires `Action Chunk` length ≥ 32 steps. +- Should be combined with asynchronous inference. + +**Implementation essentials** + +1. **Predict longer Action Chunks**: + - Increase from the default 16 steps to at least 32. + - Provide a larger soft fusion window. + +2. **Asynchronous inference architecture**: + - **Background thread**: Continuously infer, capture observations, and prepare action batches. + - **Main thread**: Execute the current action sequence. + - Buffer predictions in a queue to avoid blocking. + +3. **Action fusion mechanism**: + - Use RTC for soft fusion in the overlap region. + - Ensure smooth transitions between adjacent chunks. + +**Pseudocode: Async Inference + RTC** + +In the RTC (Real-Time Chunking) framework, two key parameters control how adjacent action chunks overlap and transition: + +- **`overlap`**: The number of action steps retained from the previous prediction to constrain the current one, ensuring temporal consistency between consecutive chunks. +- **`frozen`**: The number of steps that remain completely frozen (i.e., not updated by the new prediction), typically set to match the inference latency. + +Below is a simplified async inference + RTC loop. Note that official RTC support for GR00T is coming soon; the current implementation may require manual adaptation. + +``` +actions = policy.infer(obs) # blocking first call + +loop: + for i in range(action_horizon): + if i == action_horizon - overlap - 1: + future = async policy.infer(new_obs) # non-blocking + robot.execute(actions[i]) + if i == action_horizon - frozen - 1: + actions = future.get() # swap in next chunk + break # discard frozen tail +``` + + diff --git a/gr00t/__init__.py b/gr00t/__init__.py index e69de29bb..e9d017c3b 100644 --- a/gr00t/__init__.py +++ b/gr00t/__init__.py @@ -0,0 +1,388 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 + + +_FALSEY_ENV_VALUES = {"", "0", "false", "no", "off"} + + +def _env_flag_enabled(name: str) -> bool: + return os.environ.get(name, "").strip().lower() not in _FALSEY_ENV_VALUES + + +def _hf_env_repr() -> str: + """Human-readable HF cache env (for log lines).""" + hf_home = os.environ.get("HF_HOME") + hf_hub = os.environ.get("HUGGINGFACE_HUB_CACHE") + return f"HF_HOME={hf_home} HUGGINGFACE_HUB_CACHE={hf_hub}" + + +def _torch_dtype_from_arg(dtype): + """Resolve a transformers dtype argument into a torch dtype, if concrete.""" + if dtype is None or dtype == "auto": + return None + + try: + import torch + except Exception: + return None + + if isinstance(dtype, torch.dtype): + return dtype + if isinstance(dtype, str): + name = dtype.removeprefix("torch.") + candidate = getattr(torch, name, None) + if isinstance(candidate, torch.dtype): + return candidate + return None + + +def _zero_no_weight_model_parameters(model) -> None: + """Zero no-init params/persistent buffers so tests see finite values. + + Non-persistent buffers are intentionally skipped: they are analytic derived + state (e.g. RoPE ``inv_freq``) the module recomputes in ``__init__``, not + checkpoint data. Zeroing them makes RoPE degenerate to no rotation. + """ + try: + import torch + except Exception: + return + + # Identify non-persistent buffers (registered with persistent=False); these + # are not part of state_dict and must keep their analytic values. + non_persistent_ids = set() + modules = getattr(model, "modules", None) + if callable(modules): + for module in modules(): + for buf_name in getattr(module, "_non_persistent_buffers_set", ()) or (): + buf = getattr(module, "_buffers", {}).get(buf_name) + if buf is not None: + non_persistent_ids.add(id(buf)) + + parameters = getattr(model, "parameters", None) + buffers = getattr(model, "buffers", None) + tensors = [] + if callable(parameters): + tensors.extend(parameters()) + if callable(buffers): + tensors.extend(buffers()) + + with torch.no_grad(): + for tensor in tensors: + if id(tensor) in non_persistent_ids: + continue + if getattr(tensor, "device", None) is not None and tensor.device.type == "meta": + continue + try: + tensor.zero_() + except Exception: + pass + + +def _hf_no_weight_model_call(orig_func, klass, pretrained_model_name_or_path, *args, **kwargs): + """Instantiate a HF model from config without resolving checkpoint weight files. + + This is intentionally test-only and gated by ``GROOT_SKIP_HF_MODEL_WEIGHTS``. + It keeps the architecture, processor/config loading, and model code paths + alive while avoiding multi-GB safetensor reads in tests that only need shape + and integration coverage. + """ + if kwargs.get("state_dict") is not None: + return orig_func(klass, pretrained_model_name_or_path, *args, **kwargs) + + import copy + + import torch + from transformers import PretrainedConfig + from transformers.modeling_utils import no_init_weights + + name_str = str(pretrained_model_name_or_path) + output_loading_info = kwargs.pop("output_loading_info", False) + config = kwargs.pop("config", None) + requested_dtype = kwargs.pop("dtype", None) + requested_torch_dtype = kwargs.pop("torch_dtype", None) + if requested_dtype is None: + requested_dtype = requested_torch_dtype + attn_implementation = kwargs.pop("attn_implementation", None) + + loader_kwargs = {} + config_loader_keys = { + "cache_dir", + "force_download", + "proxies", + "local_files_only", + "token", + "revision", + "subfolder", + } + loader_only_keys = { + "_commit_hash", + "_fast_init", + "_from_auto", + "_from_pipeline", + "adapter_kwargs", + "adapter_name", + "device_map", + "distributed_config", + "from_flax", + "from_tf", + "generation_config", + "gguf_file", + "ignore_mismatched_sizes", + "key_mapping", + "load_in_4bit", + "load_in_8bit", + "low_cpu_mem_usage", + "max_memory", + "mirror", + "offload_buffers", + "offload_folder", + "offload_state_dict", + "quantization_config", + "resume_download", + "state_dict", + "tp_plan", + "tp_size", + "trust_remote_code", + "use_auth_token", + "use_kernels", + "use_safetensors", + "variant", + "weights_only", + } + for key in sorted(config_loader_keys | loader_only_keys): + if key in kwargs: + loader_kwargs[key] = kwargs.pop(key) + + token = loader_kwargs.get("token") + use_auth_token = loader_kwargs.get("use_auth_token") + if token is None and use_auth_token is not None: + loader_kwargs["token"] = use_auth_token + + if not isinstance(config, PretrainedConfig): + config_path = config if config is not None else pretrained_model_name_or_path + config_kwargs = {k: loader_kwargs[k] for k in config_loader_keys if k in loader_kwargs} + config, model_kwargs = klass.config_class.from_pretrained( + config_path, + return_unused_kwargs=True, + **config_kwargs, + **kwargs, + ) + else: + config = copy.deepcopy(config) + model_kwargs = kwargs + + if attn_implementation is not None: + config._attn_implementation = attn_implementation + + torch_dtype = _torch_dtype_from_arg(requested_dtype) + previous_dtype = None + if torch_dtype is not None: + previous_dtype = torch.get_default_dtype() + torch.set_default_dtype(torch_dtype) + try: + with no_init_weights(): + model = klass(config, *args, **model_kwargs) + finally: + if previous_dtype is not None: + torch.set_default_dtype(previous_dtype) + + if torch_dtype is not None: + model.to(dtype=torch_dtype) + _zero_no_weight_model_parameters(model) + model.eval() + print(f"[groot/hf] skip model weights: {name_str} | {_hf_env_repr()}", flush=True) + + if output_loading_info: + return model, { + "missing_keys": [], + "unexpected_keys": [], + "mismatched_keys": [], + "error_msgs": [], + } + return model + + +def _hf_local_first_call( + orig_func, + klass, + pretrained_model_name_or_path, + *args, + skip_model_weights: bool = False, + **kwargs, +): + """Invoke ``orig_func`` (an unwrapped from_pretrained) preferring the local cache. + + Strategy: + + 1. Local filesystem path → call ``orig_func`` unchanged. + 2. Caller already passed ``local_files_only=True`` → honor it. + 3. Otherwise probe the cache by calling ``orig_func`` with + ``local_files_only=True`` first. If it succeeds, the cache had every + file ``from_pretrained`` needed — no network traffic at all. If it + raises (cache empty, partial snapshot, missing shard), fall through + to a normal call which lets HF Hub download the missing pieces. + + This mirrors exactly what ``transformers.from_pretrained`` itself uses + to decide cache hit vs miss, so we never get a false miss from a + stricter probe (the original implementation called + ``snapshot_download(local_files_only=True)``, which requires a fully + populated ``refs/main`` + ``snapshots//`` tree that + ``from_pretrained`` does not always create — observed to cause 100% + false-miss rate in CI Job 308778931). + """ + if skip_model_weights and _env_flag_enabled("GROOT_SKIP_HF_MODEL_WEIGHTS"): + return _hf_no_weight_model_call( + orig_func, klass, pretrained_model_name_or_path, *args, **kwargs + ) + + name_str = str(pretrained_model_name_or_path) + if os.path.isdir(name_str): + print(f"[groot/hf] local path: {name_str} | {_hf_env_repr()}", flush=True) + return orig_func(klass, pretrained_model_name_or_path, *args, **kwargs) + if kwargs.get("local_files_only", False): + return orig_func(klass, pretrained_model_name_or_path, *args, **kwargs) + try: + result = orig_func( + klass, + pretrained_model_name_or_path, + *args, + **{**kwargs, "local_files_only": True}, + ) + print(f"[groot/hf] cache hit: {name_str} | {_hf_env_repr()}", flush=True) + return result + except Exception: + print( + f"[groot/hf] cache miss (will download): {name_str} | {_hf_env_repr()}", + flush=True, + ) + return orig_func(klass, pretrained_model_name_or_path, *args, **kwargs) + + +def _patch_hf_local_first() -> None: + """Patch from_pretrained to prefer the local HF cache over network calls. + + When a HF repo ID is passed we first invoke ``from_pretrained`` with + ``local_files_only=True``; on any error we fall through to a normal + download. This avoids the per-file etag roundtrip that + ``transformers.from_pretrained`` does on every load and the 429 + rate-limit storm when many CI jobs run concurrently. + + Covers: PreTrainedModel, PretrainedConfig, ProcessorMixin, AutoConfig, + AutoProcessor — every transformers from_pretrained entrypoint. + + Triggered by GROOT_HF_LOCAL_FIRST (set by conftest.py, survives uv run) or + PYTEST_CURRENT_TEST (set automatically by pytest). + """ + + def _wrap(cls: type) -> None: + if "from_pretrained" not in cls.__dict__: + return + original = cls.from_pretrained + if getattr(original, "_groot_hf_local_patched", False): + return + + orig_func = original.__func__ + + @classmethod # type: ignore[misc] + def patched(klass, pretrained_model_name_or_path, *args, **kwargs): + return _hf_local_first_call( + orig_func, + klass, + pretrained_model_name_or_path, + *args, + skip_model_weights=cls.__name__ == "PreTrainedModel", + **kwargs, + ) + + patched._groot_hf_local_patched = True # type: ignore[attr-defined] + cls.from_pretrained = patched + + try: + import transformers as _transformers + + for _attr in ( + "PreTrainedModel", + "PretrainedConfig", + "ProcessorMixin", + "AutoConfig", + "AutoProcessor", + ): + _cls = getattr(_transformers, _attr, None) + if _cls is not None: + _wrap(_cls) + except Exception: + pass + + +def _patch_mistral() -> None: + """Suppress 429 / connection errors / hangs from the HuggingFace Hub in mistral regex patching. + + transformers calls model_info() inside a nested is_base_mistral() function + unconditionally even when loading from a fully local checkpoint. Qwen3VL / + Cosmos is never Mistral, so returning the tokenizer unchanged on any network + failure is correct. + + NOTE: is_base_mistral is a *nested* function inside _patch_mistral_regex, so + it is not accessible as a module-level attribute — we must wrap the classmethod. + + The wrapper short-circuits before _orig for two cases that should never need + a network roundtrip: + + 1. Local filesystem path — can't be a Hub repo ID at all. + 2. Repo ID that doesn't even mention "mistral" — the underlying check exists + solely to recognize Mistral-derived tokenizers; on any other ID the + network call is wasted at best. + + The short-circuit also closes a hang the surrounding ``except Exception`` + cannot catch: when a TCP connection to huggingface.co succeeds but the + server stops sending bytes, ``socket.recv_into()`` blocks in the kernel + with no Python-level exception, eventually breaching pytest-timeout (e.g. + job 309584593: ``test_trt_full_pipeline[1]`` hung 600 s here while loading + the tokenizer for ``nvidia/Cosmos-Reason2-2B``). + + Triggered by GROOT_PATCH_MISTRAL (set by conftest.py, survives uv run) or + PYTEST_CURRENT_TEST (set automatically by pytest, belt-and-suspenders). + """ + try: + import transformers.tokenization_utils_base as _tub + + _cls = _tub.PreTrainedTokenizerBase + _orig = _cls._patch_mistral_regex.__func__ + if getattr(_orig, "_groot_patched", False): + return + + def _safe(cls, tokenizer, pretrained_model_name_or_path, **kwargs): + name_str = str(pretrained_model_name_or_path) + if os.path.isdir(name_str) or "mistral" not in name_str.lower(): + return tokenizer + try: + return _orig(cls, tokenizer, pretrained_model_name_or_path, **kwargs) + except Exception: + return tokenizer + + _safe._groot_patched = True # type: ignore[attr-defined] + _cls._patch_mistral_regex = classmethod(_safe) + except Exception: + pass + + +if os.environ.get("PYTEST_CURRENT_TEST") or os.environ.get("GROOT_HF_LOCAL_FIRST"): + _patch_hf_local_first() + +if os.environ.get("PYTEST_CURRENT_TEST") or os.environ.get("GROOT_PATCH_MISTRAL"): + _patch_mistral() diff --git a/gr00t/configs/__init__.py b/gr00t/configs/__init__.py index e69de29bb..467079831 100644 --- a/gr00t/configs/__init__.py +++ b/gr00t/configs/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/configs/base_config.py b/gr00t/configs/base_config.py index 7864cf539..5e1406f02 100755 --- a/gr00t/configs/base_config.py +++ b/gr00t/configs/base_config.py @@ -1,7 +1,23 @@ -from dataclasses import dataclass, field +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from dataclasses import asdict, dataclass, field +from enum import Enum import json from pathlib import Path -from typing import List, Optional +from typing import Any, List, Optional import yaml @@ -9,10 +25,56 @@ from .data.data_config import DataConfig, SingleDatasetConfig from .model import create_model_union_type -from .model.gr00t_n1d6 import Gr00tN1d6Config +from .model.gr00t_n1d7 import Gr00tN1d7Config from .training.training_config import TrainingConfig +def _build_safe_tree(obj: Any) -> Any: + """Convert an ``asdict()`` tree into one that ``yaml.safe_dump`` accepts. + + ``yaml.safe_dump`` only knows how to write plain primitives (str / int / + bool / None / list / dict); it raises ``RepresenterError`` on anything + else. The only "anything else" we hit today is ``Enum`` values — + ``MODALITY_CONFIGS`` carries ``ActionConfig`` fields holding + ``ActionRepresentation`` / ``ActionType`` / ``ActionFormat`` enums — so we + walk the tree once and replace each ``Enum`` with its ``.value`` string + (e.g. ``ActionRepresentation.RELATIVE`` -> ``"relative"``). An explicit + walk is easier to audit than a custom ``SafeDumper`` and leaves no global + YAML state behind. + """ + if isinstance(obj, Enum): + return obj.value + if isinstance(obj, dict): + return {k: _build_safe_tree(v) for k, v in obj.items()} + if isinstance(obj, (list, tuple)): + return [_build_safe_tree(v) for v in obj] + return obj + + +def _load_safe_yaml(path: Path): + """Load YAML with ``yaml.safe_load`` (never the object-constructing + ``yaml.Loader``), turning the safe loader's rejection of legacy + ``!!python/object`` tags into a friendly migration error. + + ``yaml.safe_load`` refuses those tags with a ``ConstructorError``; we + re-raise it as a ``ValueError`` that explains the old config can't load + and needs a one-time re-save, instead of leaking a cryptic PyYAML + traceback. + """ + text = path.read_text() + try: + return yaml.safe_load(text) + except yaml.constructor.ConstructorError as e: + raise ValueError( + f"{path}: rejected unsafe legacy config YAML (contains " + f"{e.problem!r}). The pre-2026-05 Config.save() emitted " + "PyYAML !!python/object tags which the loader is no longer " + "willing to instantiate — that path was an arbitrary-code-" + "execution gadget. Re-save the config via the current " + "Config.save() to migrate to the plain-dict YAML format." + ) from e + + ModelUnionType = create_model_union_type() @@ -21,28 +83,40 @@ class Config: """Complete configuration.""" load_config_path: Optional[str] = None - model: ModelUnionType = field(default_factory=lambda: Gr00tN1d6Config()) + model: ModelUnionType = field(default_factory=lambda: Gr00tN1d7Config()) data: DataConfig = field(default_factory=DataConfig) training: TrainingConfig = field(default_factory=TrainingConfig) def save(self, path: Path): - """Save configuration to YAML file.""" + """Save the config as plain key/value YAML (no Python-object tags). + + Writes ``asdict(self)`` with ``yaml.safe_dump``, so the file is human + readable, diffable, and — crucially — builds no Python objects when + read back. ``_build_safe_tree`` first lowers any ``Enum`` fields to + plain strings, which ``yaml.safe_dump`` would otherwise refuse to + write. Replaces the old ``yaml.dump(self)``, which embedded + ``!!python/object`` tags that made loading a config able to run code. + """ path = Path(path) path.parent.mkdir(parents=True, exist_ok=True) with open(path, "w") as f: - yaml.dump(self, f) + yaml.safe_dump(_build_safe_tree(asdict(self)), f, sort_keys=False) def load(self, path: Path): - """Load configuration from YAML file.""" - data = yaml.load(path.read_text(), Loader=yaml.Loader) - if isinstance(data, dict): # for training - self.load_dict(data) - elif isinstance(data, self.__class__): - self = data - else: - raise ValueError(f"Invalid config file: {path}") - # config = cls(**config) # if yaml.dump(self.__dict__, ...) is used + """Load config from a plain key/value YAML file into ``self``. + + Reads via the safe loader (so a malicious or legacy + ``!!python/object`` file is refused with a migration error, never + executed) and rebuilds the nested dataclasses with :meth:`load_dict`. + """ + data = _load_safe_yaml(path) + if not isinstance(data, dict): + raise ValueError( + f"Invalid config file: {path}. Expected a YAML mapping at " + f"the top level (saved by Config.save()); got {type(data).__name__}." + ) + self.load_dict(data) return self def load_dict(self, data: dict): @@ -64,9 +138,19 @@ def load_dict(self, data: dict): @classmethod def from_pretrained(cls, path: Path) -> "Config": - """Load configuration from YAML file.""" - data = yaml.load(path.read_text(), Loader=yaml.Loader) - return data + """Build a fresh ``Config`` from a YAML file saved by :meth:`save`. + + Same safe-load contract as :meth:`load` (no object construction from + disk), but returns a new instance via ``cls().load_dict(data)`` instead + of mutating an existing one. + """ + data = _load_safe_yaml(Path(path)) + if not isinstance(data, dict): + raise ValueError( + f"Invalid config file: {path}. Expected a YAML mapping at " + f"the top level (saved by Config.save()); got {type(data).__name__}." + ) + return cls().load_dict(data) def get_deepspeed_config(self) -> dict: """Generate DeepSpeed configuration.""" @@ -97,7 +181,15 @@ def validate(self): stripped_modality_configs = {} for embodiment_tag in embodiment_tags: - stripped_modality_configs[embodiment_tag] = self.data.modality_configs[embodiment_tag] + modality_cfg = self.data.modality_configs.get(embodiment_tag) + if modality_cfg is None: + raise ValueError( + f"No modality config registered for embodiment tag '{embodiment_tag}'. " + f"Available tags: {sorted(self.data.modality_configs.keys())}. " + f"Provide --modality-config-path to register a custom modality config, " + f"or use one of the pre-registered tags." + ) + stripped_modality_configs[embodiment_tag] = modality_cfg self.data.modality_configs = stripped_modality_configs # ensure mix ratios are valid @@ -117,19 +209,6 @@ def validate(self): ) ] * len(self.data.modality_configs[embodiment_tag]["action"].modality_keys) - if isinstance(self.model, Gr00tN1d6Config): - import warnings - - if self.model.eagle_collator: - warnings.warn( - 'eagle_collator is deprecated. Please use backbone_model_type "eagle" in the future.', - DeprecationWarning, - ) - self.model.backbone_model_type = "eagle" - assert self.model.backbone_model_type in [ - "eagle", - ], f"Invalid backbone model type: {self.model.backbone_model_type}" - # Validate precision settings if self.training.fp16 and self.training.bf16: raise ValueError("Cannot use both fp16 and bf16") diff --git a/gr00t/configs/data/__init__.py b/gr00t/configs/data/__init__.py index e69de29bb..467079831 100644 --- a/gr00t/configs/data/__init__.py +++ b/gr00t/configs/data/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/configs/data/data_config.py b/gr00t/configs/data/data_config.py index dbf334246..ec4289cdc 100755 --- a/gr00t/configs/data/data_config.py +++ b/gr00t/configs/data/data_config.py @@ -1,5 +1,22 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from dataclasses import dataclass, field -from typing import Any, List, Optional +from typing import Annotated, Any, List, Optional + +import tyro from gr00t.data.types import ModalityConfig @@ -47,7 +64,10 @@ class DataConfig: # 2. Modality configs supplied through command line: --data.modality_configs (although rare and inconvenient) # 1 and 2 are unified through `config.data.modality_configs`. # 3. modality configs saved in the pretrained checkpoint. - modality_configs: dict[str, dict[str, ModalityConfig]] = field( + # + # Supplied via code defaults / a `--load-config-path` YAML / the pretrained + # checkpoint, not typed on the CLI, so it is hidden from tyro with Suppress. + modality_configs: Annotated[dict[str, dict[str, ModalityConfig]], tyro.conf.Suppress] = field( default_factory=lambda: MODALITY_CONFIGS ) @@ -56,9 +76,11 @@ class DataConfig: shard_size: int = 2**10 episode_sampling_rate: float = 0.1 num_shards_per_epoch: int = int(1e5) + # When set, replaces per-dataset mix_ratio weights with len(dataset)^alpha weights. + ds_weights_alpha: float | None = None # Override statistics from the pretrained checkpoint - override_pretraining_statistics: bool = False + override_pretraining_statistics: bool = True # General task / mode config (shared across datasets) mode: str = "single_turn" @@ -77,4 +99,3 @@ class DataConfig: # DP Image Config image_crop_size: List[int] = field(default_factory=lambda: [244, 244]) image_target_size: List[int] = field(default_factory=lambda: [224, 224]) - video_backend: str = "torchcodec" diff --git a/gr00t/configs/data/embodiment_configs.py b/gr00t/configs/data/embodiment_configs.py index f3b53226b..8a1189a75 100644 --- a/gr00t/configs/data/embodiment_configs.py +++ b/gr00t/configs/data/embodiment_configs.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from gr00t.data.embodiment_tags import EmbodimentTag from gr00t.data.types import ( ActionConfig, @@ -9,8 +24,95 @@ MODALITY_CONFIGS = { + ##### Pre-registered pretrain configurations ##### + "oxe_droid_relative_eef_relative_joint": { + "video": ModalityConfig( + delta_indices=[-15, 0], + modality_keys=["exterior_image_1_left", "wrist_image_left"], + ), + "state": ModalityConfig( + delta_indices=[0], + modality_keys=["eef_9d", "gripper_position", "joint_position"], + ), + "action": ModalityConfig( + delta_indices=list(range(40)), + modality_keys=["eef_9d", "gripper_position", "joint_position"], + action_configs=[ + ActionConfig( + rep=ActionRepresentation.RELATIVE, + type=ActionType.EEF, + format=ActionFormat.XYZ_ROT6D, + state_key="eef_9d", + ), + ActionConfig( + rep=ActionRepresentation.ABSOLUTE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + state_key="gripper_position", + ), + ActionConfig( + rep=ActionRepresentation.RELATIVE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + state_key="joint_position", + ), + ], + ), + "language": ModalityConfig( + delta_indices=[0], + modality_keys=["annotation.language.language_instruction"], + ), + }, ##### Pre-registered posttrain configurations ##### - "unitree_g1": { + "unitree_g1_sonic": { + "video": ModalityConfig( + delta_indices=[0], + modality_keys=["ego_view"], + ), + "state": ModalityConfig( + delta_indices=[0], + modality_keys=[ + "left_leg", + "right_leg", + "waist", + "left_arm", + "right_arm", + "left_hand", + "right_hand", + "projected_gravity", + ], + ), + "action": ModalityConfig( + delta_indices=list(range(40)), + modality_keys=[ + "motion_token", + "left_hand_joints", + "right_hand_joints", + ], + action_configs=[ + ActionConfig( + rep=ActionRepresentation.ABSOLUTE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + ), + ActionConfig( + rep=ActionRepresentation.ABSOLUTE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + ), + ActionConfig( + rep=ActionRepresentation.ABSOLUTE, + type=ActionType.NON_EEF, + format=ActionFormat.DEFAULT, + ), + ], + ), + "language": ModalityConfig( + delta_indices=[0], + modality_keys=["annotation.human.task_description"], + ), + }, + "unitree_g1_full_body_with_waist_height_nav_cmd": { "video": ModalityConfig( delta_indices=[0], modality_keys=["ego_view"], @@ -28,7 +130,7 @@ ], ), "action": ModalityConfig( - delta_indices=list(range(30)), + delta_indices=list(range(50)), modality_keys=[ "left_arm", "right_arm", @@ -88,119 +190,94 @@ modality_keys=["annotation.human.task_description"], ), }, - "libero_panda": { + "libero_sim": { "video": ModalityConfig( delta_indices=[0], modality_keys=["image", "wrist_image"], ), "state": ModalityConfig( delta_indices=[0], - modality_keys=[ - "x", - "y", - "z", - "roll", - "pitch", - "yaw", - "gripper", - ], + modality_keys=["x", "y", "z", "roll", "pitch", "yaw", "gripper"], ), "action": ModalityConfig( - delta_indices=list(range(0, 16)), - modality_keys=[ - "x", - "y", - "z", - "roll", - "pitch", - "yaw", - "gripper", - ], + delta_indices=list(range(16)), + modality_keys=["x", "y", "z", "roll", "pitch", "yaw", "gripper"], ), "language": ModalityConfig( delta_indices=[0], modality_keys=["annotation.human.action.task_description"], ), }, - "oxe_widowx": { + "simpler_env_widowx": { "video": ModalityConfig( delta_indices=[0], modality_keys=["image_0"], ), "state": ModalityConfig( delta_indices=[0], - modality_keys=[ - "x", - "y", - "z", - "roll", - "pitch", - "yaw", - "pad", - "gripper", - ], + modality_keys=["x", "y", "z", "roll", "pitch", "yaw", "pad", "gripper"], ), "action": ModalityConfig( - delta_indices=list(range(0, 8)), - modality_keys=[ - "x", - "y", - "z", - "roll", - "pitch", - "yaw", - "gripper", - ], - mean_std_embedding_keys=[ - "x", - "y", - "z", - "roll", - "pitch", - "yaw", - ], + delta_indices=list(range(8)), + modality_keys=["x", "y", "z", "roll", "pitch", "yaw", "gripper"], ), "language": ModalityConfig( delta_indices=[0], modality_keys=["annotation.human.action.task_description"], ), }, - "oxe_google": { + "simpler_env_google": { "video": ModalityConfig( delta_indices=[0], modality_keys=["image"], ), "state": ModalityConfig( + delta_indices=[0], + modality_keys=["x", "y", "z", "rx", "ry", "rz", "rw", "gripper"], + ), + "action": ModalityConfig( + delta_indices=list(range(8)), + modality_keys=["x", "y", "z", "roll", "pitch", "yaw", "gripper"], + ), + "language": ModalityConfig( + delta_indices=[0], + modality_keys=["annotation.human.action.task_description"], + ), + }, + "robocasa_panda_omron": { + "video": ModalityConfig( delta_indices=[0], modality_keys=[ - "x", - "y", - "z", - "rx", - "ry", - "rz", - "rw", - "gripper", + "res256_image_side_0", + "res256_image_side_1", + "res256_image_wrist_0", ], ), - "action": ModalityConfig( - delta_indices=list(range(0, 8)), + "state": ModalityConfig( + delta_indices=[0], modality_keys=[ - "x", - "y", - "z", - "roll", - "pitch", - "yaw", - "gripper", + "gripper_qpos", + "base_position", + "base_rotation", + "end_effector_position_relative", + "end_effector_rotation_relative", + "gripper_qvel", + "end_effector_position_absolute", + "end_effector_rotation_absolute", + "joint_position", + "joint_position_cos", + "joint_position_sin", + "joint_velocity", ], - mean_std_embedding_keys=[ - "x", - "y", - "z", - "roll", - "pitch", - "yaw", + ), + "action": ModalityConfig( + delta_indices=list(range(8)), + modality_keys=[ + "gripper_close", + "end_effector_position", + "end_effector_rotation", + "base_motion", + "control_mode", ], ), "language": ModalityConfig( @@ -208,86 +285,58 @@ modality_keys=["annotation.human.action.task_description"], ), }, - "behavior_r1_pro": { + "robocasa_gr1_tabletop": { "video": ModalityConfig( delta_indices=[0], - modality_keys=[ - "observation.images.rgb.head_256_256", - "observation.images.rgb.left_wrist_256_256", - "observation.images.rgb.right_wrist_256_256", - ], + modality_keys=["ego_view_bg_crop_pad_res256_freq20"], ), "state": ModalityConfig( delta_indices=[0], modality_keys=[ - "robot_pos", # 3 - "robot_ori_cos", # 3 - "robot_ori_sin", # 3 - "robot_2d_ori", # 1 - "robot_2d_ori_cos", # 1 - "robot_2d_ori_sin", # 1 - "robot_lin_vel", # 3 - "robot_ang_vel", # 3 - "arm_left_qpos", # 7 - "arm_left_qpos_sin", # 7 - "arm_left_qpos_cos", # 7 - "eef_left_pos", # 3 - "eef_left_quat", # 4 - "gripper_left_qpos", # 2 - "arm_right_qpos", # 7 - "arm_right_qpos_sin", # 7 - "arm_right_qpos_cos", # 7 - "eef_right_pos", # 3 - "eef_right_quat", # 4 - "gripper_right_qpos", # 2 - "trunk_qpos", # 4 + "left_arm", + "right_arm", + "left_hand", + "right_hand", + "waist", + ], + sin_cos_embedding_keys=[ + "left_arm", + "right_arm", + "left_hand", + "right_hand", + "waist", ], - ), # dim = 82 + ), "action": ModalityConfig( - delta_indices=list(range(0, 32)), + delta_indices=list(range(8)), modality_keys=[ - "base", - "torso", "left_arm", - "left_gripper", "right_arm", - "right_gripper", + "left_hand", + "right_hand", + "waist", ], action_configs=[ - # base - ActionConfig( - rep=ActionRepresentation.ABSOLUTE, - type=ActionType.NON_EEF, - format=ActionFormat.DEFAULT, - ), - # torso ActionConfig( rep=ActionRepresentation.RELATIVE, type=ActionType.NON_EEF, format=ActionFormat.DEFAULT, - state_key="trunk_qpos", ), - # left_arm ActionConfig( rep=ActionRepresentation.RELATIVE, type=ActionType.NON_EEF, format=ActionFormat.DEFAULT, - state_key="arm_left_qpos", ), - # left_gripper ActionConfig( - rep=ActionRepresentation.ABSOLUTE, + rep=ActionRepresentation.RELATIVE, type=ActionType.NON_EEF, format=ActionFormat.DEFAULT, ), - # right_arm ActionConfig( rep=ActionRepresentation.RELATIVE, type=ActionType.NON_EEF, format=ActionFormat.DEFAULT, - state_key="arm_right_qpos", ), - # right_gripper ActionConfig( rep=ActionRepresentation.ABSOLUTE, type=ActionType.NON_EEF, @@ -297,7 +346,7 @@ ), "language": ModalityConfig( delta_indices=[0], - modality_keys=["annotation.human.coarse_action"], + modality_keys=["task"], ), }, } diff --git a/gr00t/configs/data/positronic_configs.py b/gr00t/configs/data/positronic_configs.py deleted file mode 100644 index 2c34f2955..000000000 --- a/gr00t/configs/data/positronic_configs.py +++ /dev/null @@ -1,123 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 Positronic Robotics Inc. -# SPDX-License-Identifier: Apache-2.0 -""" -Positronic embodiment configurations for GR00T N1.6. - -Two action spaces: - EE (end-effector): action key is 'ee_pose' (7D quat or 9D rot6d) - Joints: action key is 'joint_position' (7D joint positions) - -EE variants: - - POSITRONIC_EE_CONFIG: 7D ee_pose, absolute - - POSITRONIC_EE_JOINTS_CONFIG: 7D ee_pose + joint obs, absolute - - POSITRONIC_EE_ROT6D_CONFIG: 9D ee_pose, absolute - - POSITRONIC_EE_ROT6D_REL_CONFIG: 9D ee_pose, relative - - POSITRONIC_EE_ROT6D_JOINTS_CONFIG: 9D ee_pose + joint obs, absolute - - POSITRONIC_EE_ROT6D_JOINTS_REL_CONFIG: 9D ee_pose + joint obs, relative - -Joint variants: - - POSITRONIC_JOINTS_CONFIG: joint_position actions + joint/ee obs - -Usage: - python -m gr00t.experiment.launch_finetune \\ - --modality_config_path gr00t/configs/data/positronic_ee_rot6d_rel.py \\ - --embodiment_tag NEW_EMBODIMENT \\ - ... -""" - -from gr00t.data.types import ( - ActionConfig, - ActionFormat, - ActionRepresentation, - ActionType, - ModalityConfig, -) - - -# All configs share this video/language structure -_VIDEO = ModalityConfig(delta_indices=[0], modality_keys=["exterior_image_1", "wrist_image"]) -_LANGUAGE = ModalityConfig( - delta_indices=[0], modality_keys=["annotation.language.language_instruction"] -) - -# IMPORTANT: ActionType and ActionFormat selection for relative actions -# -# For RELATIVE actions, we use NON_EEF + DEFAULT intentionally: -# - Positronic computes relative actions in its own data pipeline using proper -# SE(3) math (rotation composition, not element-wise subtraction) -# - The pre-computed relative values are fed to GR00T as action data -# - NON_EEF + DEFAULT ensures GR00T treats these as raw arrays without -# applying additional SE(3) transformations -# -# DO NOT "fix" this to EEF + XYZ_ROT6D for relative actions: -# - That would make GR00T interpret already-relative values as absolute EE poses -# - GR00T would then apply its own relative conversion (double transformation) -# - Result: incorrect rotation deltas and training failure -# -# For ABSOLUTE actions, format selection is less critical since no relative -# conversion happens, but we use XYZ_ROT6D for rot6d to match the data format. - -_GRIP_ACTION = ActionConfig( - rep=ActionRepresentation.ABSOLUTE, - type=ActionType.NON_EEF, - format=ActionFormat.DEFAULT, -) - - -def _make_action_config(action_key, rep, fmt): - return ModalityConfig( - delta_indices=list(range(16)), - modality_keys=[action_key, "grip"], - action_configs=[ - ActionConfig(rep=rep, type=ActionType.NON_EEF, format=fmt, state_key=action_key), - _GRIP_ACTION, - ], - ) - - -def make_positronic_ee_config(include_joints=False, use_rot6d=False, use_relative=False): - """EE action space config. Action key is 'ee_pose'.""" - action_rep = ActionRepresentation.RELATIVE if use_relative else ActionRepresentation.ABSOLUTE - action_fmt = ( - ActionFormat.DEFAULT - if use_relative - else (ActionFormat.XYZ_ROT6D if use_rot6d else ActionFormat.DEFAULT) - ) - - state_keys = ["ee_pose", "grip"] - if include_joints: - state_keys.append("joint_position") - - return { - "video": _VIDEO, - "state": ModalityConfig(delta_indices=[0], modality_keys=state_keys), - "action": _make_action_config("ee_pose", action_rep, action_fmt), - "language": _LANGUAGE, - } - - -def make_positronic_joints_config(): - """Joint action space config. Action key is 'joint_position'.""" - return { - "video": _VIDEO, - "state": ModalityConfig( - delta_indices=[0], modality_keys=["ee_pose", "grip", "joint_position"] - ), - "action": _make_action_config( - "joint_position", ActionRepresentation.ABSOLUTE, ActionFormat.DEFAULT - ), - "language": _LANGUAGE, - } - - -POSITRONIC_EE_CONFIG = make_positronic_ee_config() -POSITRONIC_EE_JOINTS_CONFIG = make_positronic_ee_config(include_joints=True) - -POSITRONIC_EE_ROT6D_CONFIG = make_positronic_ee_config(use_rot6d=True) -POSITRONIC_EE_ROT6D_REL_CONFIG = make_positronic_ee_config(use_rot6d=True, use_relative=True) -POSITRONIC_EE_ROT6D_JOINTS_CONFIG = make_positronic_ee_config(include_joints=True, use_rot6d=True) -POSITRONIC_EE_ROT6D_JOINTS_REL_CONFIG = make_positronic_ee_config( - include_joints=True, use_rot6d=True, use_relative=True -) - -POSITRONIC_JOINTS_CONFIG = make_positronic_joints_config() diff --git a/gr00t/configs/data/positronic_ee.py b/gr00t/configs/data/positronic_ee.py deleted file mode 100644 index ad6047081..000000000 --- a/gr00t/configs/data/positronic_ee.py +++ /dev/null @@ -1,6 +0,0 @@ -# Positronic EE config (without joint feedback) -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.configs.data.positronic_configs import POSITRONIC_EE_CONFIG -from gr00t.data.embodiment_tags import EmbodimentTag - -register_modality_config(POSITRONIC_EE_CONFIG, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/gr00t/configs/data/positronic_ee_joints.py b/gr00t/configs/data/positronic_ee_joints.py deleted file mode 100644 index 9182271f0..000000000 --- a/gr00t/configs/data/positronic_ee_joints.py +++ /dev/null @@ -1,6 +0,0 @@ -# Positronic EE config with joint position feedback -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.configs.data.positronic_configs import POSITRONIC_EE_JOINTS_CONFIG -from gr00t.data.embodiment_tags import EmbodimentTag - -register_modality_config(POSITRONIC_EE_JOINTS_CONFIG, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/gr00t/configs/data/positronic_ee_rot6d.py b/gr00t/configs/data/positronic_ee_rot6d.py deleted file mode 100644 index 8cc33337c..000000000 --- a/gr00t/configs/data/positronic_ee_rot6d.py +++ /dev/null @@ -1,6 +0,0 @@ -# Positronic EE config with 9D xyz+rot6d format (ABSOLUTE) -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.configs.data.positronic_configs import POSITRONIC_EE_ROT6D_CONFIG -from gr00t.data.embodiment_tags import EmbodimentTag - -register_modality_config(POSITRONIC_EE_ROT6D_CONFIG, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/gr00t/configs/data/positronic_ee_rot6d_joints.py b/gr00t/configs/data/positronic_ee_rot6d_joints.py deleted file mode 100644 index a70d909cb..000000000 --- a/gr00t/configs/data/positronic_ee_rot6d_joints.py +++ /dev/null @@ -1,6 +0,0 @@ -# Positronic EE config with 9D xyz+rot6d format and joint feedback (ABSOLUTE) -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.configs.data.positronic_configs import POSITRONIC_EE_ROT6D_JOINTS_CONFIG -from gr00t.data.embodiment_tags import EmbodimentTag - -register_modality_config(POSITRONIC_EE_ROT6D_JOINTS_CONFIG, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/gr00t/configs/data/positronic_ee_rot6d_joints_rel.py b/gr00t/configs/data/positronic_ee_rot6d_joints_rel.py deleted file mode 100644 index 5320d79b6..000000000 --- a/gr00t/configs/data/positronic_ee_rot6d_joints_rel.py +++ /dev/null @@ -1,6 +0,0 @@ -# Positronic EE config with 9D xyz+rot6d format and joint feedback (RELATIVE actions) -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.configs.data.positronic_configs import POSITRONIC_EE_ROT6D_JOINTS_REL_CONFIG -from gr00t.data.embodiment_tags import EmbodimentTag - -register_modality_config(POSITRONIC_EE_ROT6D_JOINTS_REL_CONFIG, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/gr00t/configs/data/positronic_ee_rot6d_rel.py b/gr00t/configs/data/positronic_ee_rot6d_rel.py deleted file mode 100644 index d680b91f6..000000000 --- a/gr00t/configs/data/positronic_ee_rot6d_rel.py +++ /dev/null @@ -1,6 +0,0 @@ -# Positronic EE config with 9D xyz+rot6d format (RELATIVE actions) -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.configs.data.positronic_configs import POSITRONIC_EE_ROT6D_REL_CONFIG -from gr00t.data.embodiment_tags import EmbodimentTag - -register_modality_config(POSITRONIC_EE_ROT6D_REL_CONFIG, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/gr00t/configs/data/positronic_joints.py b/gr00t/configs/data/positronic_joints.py deleted file mode 100644 index 582146e43..000000000 --- a/gr00t/configs/data/positronic_joints.py +++ /dev/null @@ -1,7 +0,0 @@ -# Positronic joint-space action config (for IK-derived targets) -from gr00t.configs.data.embodiment_configs import register_modality_config -from gr00t.configs.data.positronic_configs import POSITRONIC_JOINTS_CONFIG -from gr00t.data.embodiment_tags import EmbodimentTag - - -register_modality_config(POSITRONIC_JOINTS_CONFIG, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) diff --git a/gr00t/configs/finetune_config.py b/gr00t/configs/finetune_config.py index 61a650f61..15918e206 100644 --- a/gr00t/configs/finetune_config.py +++ b/gr00t/configs/finetune_config.py @@ -1,7 +1,21 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + # Finetune config used for single node post-training. from dataclasses import dataclass - -from gr00t.data.embodiment_tags import EmbodimentTag +import warnings @dataclass @@ -20,10 +34,10 @@ class FinetuneConfig: """Path to the pretrained base model checkpoint (e.g., Hugging Face model hub or local directory).""" dataset_path: str - """Path to the dataset root directory containing trajectory data for fine-tuning.""" + """Path to one dataset root, or an os.pathsep-separated list of dataset roots.""" - embodiment_tag: EmbodimentTag - """Identifier specifying which embodiment (robot configuration) this fine-tuning run targets.""" + embodiment_tag: str + """Embodiment tag (name or value, case-insensitive). See EmbodimentTag for known tags.""" modality_config_path: str | None = None """ @@ -44,7 +58,7 @@ class FinetuneConfig: tune_diffusion_model: bool = True """If True, fine-tune the diffusion-based action decoder (if present in the model).""" - state_dropout_prob: float = 0.0 + state_dropout_prob: float = 0.2 """ Dropout probability applied to state inputs for regularization during training. """ @@ -67,9 +81,49 @@ class FinetuneConfig: If None, applying the default color jitter augmentation from the pretrained model. """ + use_percentiles: bool = True + """ + If True, use q01/q99 percentile statistics for state/action min-max normalization. + If False, use full min/max statistics. + """ + + shortest_image_edge: int | None = None + """ + Resize images so the shortest edge has this size before fractional cropping. + If set, crop_fraction must also be set and legacy image_crop_size/image_target_size + preprocessing is disabled. + """ + + crop_fraction: float | None = None + """ + Fraction of the resized image retained by the random/center crop. + If set, shortest_image_edge must also be set and legacy image_crop_size/image_target_size + preprocessing is disabled. + """ + + extra_augmentation_config: str | None = None + """ + JSON string for extra image augmentations (mask-based and others). + + Expected keys include: + - "background_noise_transforms": list of dicts for noise on mask regions + - "target_mask_values": list of int (e.g., [0]) + - "p": float (probability of applying) + - "masked_region_transforms": list of dicts for color tint on mask regions + - "target_mask_values": list of int (e.g., [4] or [5]) + - "p": float (probability of applying) + - "alpha_range": [min, max] for random_tint intensity + + Example: {"background_noise_transforms": [{"target_mask_values": [0], "p": 0.9}], + "masked_region_transforms": [{"target_mask_values": [4], "p": 1.0, "alpha_range": [0, 1]}]} + + If None, no extra augmentations are applied. + """ + # --- Training Configuration --- global_batch_size: int = 64 - """Total effective batch size across all GPUs and accumulation steps.""" + """Total batch summed across all GPUs in one forward/backward, BEFORE + gradient accumulation.""" dataloader_num_workers: int = 2 """Number of parallel worker processes used for data loading.""" @@ -78,11 +132,18 @@ class FinetuneConfig: """Initial learning rate for optimizer.""" gradient_accumulation_steps: int = 1 - """Number of forward passes to accumulate before performing a backward/update step.""" + """Forward passes per optimizer step. Multiplies ``global_batch_size`` to + produce the post-accumulation per-optimizer-step batch.""" output_dir: str = "./outputs" """Directory where model checkpoints, logs, and outputs are saved.""" + experiment_name: str | None = None + """Optional experiment name used as the W&B run name. Defaults to the output directory basename.""" + + wandb_project: str = "finetune-gr00t-n1d7" + """W&B project name to log runs to.""" + save_steps: int = 1000 """Frequency (in training steps) at which to save checkpoints.""" @@ -95,7 +156,7 @@ class FinetuneConfig: use_wandb: bool = False """ If True, log metrics and artifacts to Weights & Biases (wandb). - The project is `finetune-gr00t-n1d6`. + The project is `finetune-gr00t-n1d7`. You need to login to wandb to view the logs. """ @@ -108,6 +169,10 @@ class FinetuneConfig: warmup_ratio: float = 0.05 """Proportion of total training steps used for learning rate warm-up.""" + ds_weights_alpha: float | None = None + """Power-law exponent for dataset soup weighting. When set, each dataset's + sampling weight is len(dataset)^alpha and per-dataset mix_ratio values are ignored.""" + shard_size: int = 2**10 """Size of the shard to use for the dataset during preloading.""" @@ -116,3 +181,31 @@ class FinetuneConfig: num_shards_per_epoch: int = int(1e5) """Number of shards to use for the dataset. reduce this number if vram is limited.""" + + save_only_model: bool = False + """If True, save only model weights (skip optimizer/scheduler/RNG states). Cannot resume training from these checkpoints.""" + + resume_from_checkpoint: bool = False + """If True, resume from the latest ``checkpoint-*`` in ``output_dir``. Default + False so a rerun against an existing ``output_dir`` starts fresh instead of + silently merging with a previous experiment. Incompatible with + ``save_only_model=True`` (enforced by ``experiment.run``).""" + + skip_weight_loading: bool = False + """If True, skip loading model weights from base_model_path (architecture only). + The processor (tokenizer/config) is still loaded from base_model_path. + Useful for CI/testing to skip the slow checkpoint shard loading.""" + + def __post_init__(self) -> None: + if self.gradient_accumulation_steps < 1: + raise ValueError( + f"gradient_accumulation_steps must be >= 1, got {self.gradient_accumulation_steps}" + ) + if self.gradient_accumulation_steps > 1: + accumulated_batch_size = self.global_batch_size * self.gradient_accumulation_steps + warnings.warn( + f"global_batch_size={self.global_batch_size} is pre-accumulation; " + f"accumulated_batch_size={accumulated_batch_size} " + f"(× gradient_accumulation_steps={self.gradient_accumulation_steps}).", + stacklevel=2, + ) diff --git a/gr00t/configs/model/__init__.py b/gr00t/configs/model/__init__.py index ef0a4a694..3e5086192 100644 --- a/gr00t/configs/model/__init__.py +++ b/gr00t/configs/model/__init__.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 importlib from pathlib import Path import typing @@ -28,6 +43,12 @@ def create_model_union_type(): # A Union of no types is invalid, so just return None return None + if len(MODEL_CONFIG_TYPES) == 1: + # A single-element Union collapses to its sole member; return the plain + # type so it parses as a normal nested config rather than a subcommand. + (model_type,) = MODEL_CONFIG_TYPES.values() + return model_type + annotated_types = tuple( typing.Annotated[model_type, tyro.conf.subcommand(model_shortname)] for model_shortname, model_type in MODEL_CONFIG_TYPES.items() diff --git a/gr00t/configs/model/gr00t_n1d6.py b/gr00t/configs/model/gr00t_n1d7.py old mode 100755 new mode 100644 similarity index 63% rename from gr00t/configs/model/gr00t_n1d6.py rename to gr00t/configs/model/gr00t_n1d7.py index a91d9f769..6026b1f14 --- a/gr00t/configs/model/gr00t_n1d6.py +++ b/gr00t/configs/model/gr00t_n1d7.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from dataclasses import MISSING, asdict, dataclass, field, is_dataclass from enum import Enum import json @@ -10,68 +25,73 @@ @dataclass -class Gr00tN1d6Config(PretrainedConfig): - """Unified configuration for Gr00tN1d6 model with backbone and action head.""" +class Gr00tN1d7Config(PretrainedConfig): + """Unified configuration for Gr00tN1d7 model with backbone and action head. + + Gr00tN1d7 uses the Cosmos-Reason2-2B (Qwen3-VL architecture) VLM backbone, + replacing the Eagle backbone used in Gr00tN1d6. + """ # Model identification - model_type: str = "Gr00tN1d6" + model_type: str = "Gr00tN1d7" model_dtype: str = "bfloat16" # Use bfloat16 for Flash Attention compatibility - # backbone configuration - model_name: str = "nvidia/Eagle-Block2A-2B-v2" - backbone_model_type: str = "eagle" + # Backbone configuration + model_name: str = "nvidia/Cosmos-Reason2-2B" + backbone_model_type: str = "qwen" model_revision: str | None = None - tune_top_llm_layers: int = 4 # Number of top LLM layers to tune - backbone_embedding_dim: int = 2048 # project_to_dim + tune_top_llm_layers: int = 0 # Number of top LLM layers to tune + backbone_embedding_dim: int = 2048 # project_to_dim; must match Cosmos-Reason2-2B hidden size tune_llm: bool = False tune_visual: bool = False - select_layer: int = 16 + select_layer: int = 12 reproject_vision: bool = False use_flash_attention: bool = True - load_bf16: bool = True # Enable BF16 loading - collator_overwrite_image_inputs: bool = False # Deprecated; use eagle_collator. - eagle_collator: bool = ( - False # this allows model to change image size in collator, needed for eagle any-res - ) + load_bf16: bool = False # Enable BF16 loading backbone_trainable_params_fp32: bool = True ### Processing parameters - image_crop_size: tuple[int, int] | None = None - image_target_size: tuple[int, int] | None = None + image_crop_size: tuple[int, int] | None = (230, 230) + image_target_size: tuple[int, int] | None = (256, 256) - shortest_image_edge: int | None = 256 - crop_fraction: float | None = 0.95 + shortest_image_edge: int | None = None + crop_fraction: float | None = None random_rotation_angle: int | None = None color_jitter_params: dict[str, float] | None = None use_albumentations_transforms: bool = True + letter_box_transform: bool = False + # Extra augmentation config (mask-based and others). + extra_augmentation_config: dict | None = None formalize_language: bool = True apply_sincos_state_encoding: bool = ( False # Global flag to enable per-embodiment sin/cos encoding ) + use_percentiles: bool = True use_relative_action: bool = False # Action head configuration parameters - max_state_dim: int = 29 # Default from state_shape - max_action_dim: int = 29 # Default from action_shape - action_horizon: int = 16 + max_state_dim: int = 132 # Default from state_shape + max_action_dim: int = 132 # Default from action_shape + action_horizon: int = 40 hidden_size: int = 1024 input_embedding_dim: int = 1536 - # Global parameters from YAML + # State history: number of consecutive state timesteps fed to the state encoder + state_history_length: int = 1 + + # Global parameters add_pos_embed: bool = True attn_dropout: float = 0.2 use_vlln: bool = True max_seq_len: int = 1024 - # Diffusion model type selection use_alternate_vl_dit: bool = True # True for AlternateVLDiT, False for DiT attend_text_every_n_blocks: int = 2 - # Diffusion model configuration with 32 layers (main difference from N15) diffusion_model_cfg: dict = field( default_factory=lambda: { "positional_embeddings": None, - "num_layers": 32, # 32 layers instead of 16 + "num_layers": 16, "num_attention_heads": 32, "attention_head_dim": 48, "norm_type": "ada_norm", @@ -94,9 +114,10 @@ class Gr00tN1d6Config(PretrainedConfig): tune_diffusion_model: bool = True tune_vlln: bool = True - # State Augmentation parameters - state_dropout_prob: float = 0.0 # State dropout probability - state_additive_noise_scale: float = 0.0 # Scale for additive Gaussian noise on state features + # State augmentation parameters + state_dropout_prob: float = 0.8 # State dropout probability + exclude_state: bool = False # Zero out all state inputs (ablation) + use_mean_std: bool = False # Use mean/std normalization instead of min/max # Multi-embodiment parameters max_num_embodiments: int = 32 @@ -104,10 +125,6 @@ class Gr00tN1d6Config(PretrainedConfig): def __init__(self, **kwargs): super().__init__(**kwargs) for key, value in kwargs.items(): - # PATCH: Backward compatibility for legacy argument "collator_overwrite_image_inputs" - if key == "collator_overwrite_image_inputs": - setattr(self, "eagle_collator", value) - # /PATCH setattr(self, key, value) # Ensures that all dataclass defaults (including those using default_factory) @@ -160,4 +177,4 @@ def default(o): ) -register_model_config("GrootN1d6", Gr00tN1d6Config) +register_model_config("Gr00tN1d7", Gr00tN1d7Config) diff --git a/gr00t/configs/training/__init__.py b/gr00t/configs/training/__init__.py index e69de29bb..467079831 100644 --- a/gr00t/configs/training/__init__.py +++ b/gr00t/configs/training/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/configs/training/training_config.py b/gr00t/configs/training/training_config.py index da488ebb7..f6f41018d 100755 --- a/gr00t/configs/training/training_config.py +++ b/gr00t/configs/training/training_config.py @@ -1,5 +1,21 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from dataclasses import dataclass, field from typing import Optional +import warnings @dataclass @@ -12,9 +28,18 @@ class TrainingConfig: # Basic training max_steps: int = 30000 # this will override num_epochs + global_batch_size: int = 1024 - batch_size: Optional[int] = None + """Total batch summed across all GPUs in one forward/backward, BEFORE + gradient accumulation. See :attr:`accumulated_batch_size` for the + post-accumulation per-optimizer-step value.""" + + per_gpu_batch_size: Optional[int] = None + """Deprecated. When set, overrides ``global_batch_size`` as the per-GPU batch.""" + gradient_accumulation_steps: int = 1 + """Forward passes per optimizer step. Passed through to HuggingFace + ``TrainingArguments``; see :attr:`accumulated_batch_size`.""" # Optimization learning_rate: float = 1e-4 @@ -30,6 +55,7 @@ class TrainingConfig: optim: str = "adamw_torch_fused" start_from_checkpoint: Optional[str] = None + skip_weight_loading: bool = False # skip loading checkpoint weights (architecture only) # Mixed precision tf32: bool = True @@ -44,6 +70,10 @@ class TrainingConfig: # Model saving save_vl_model: bool = False # Control whether to save VL model and processor in callbacks + save_only_model: bool = False # Skip optimizer/scheduler/RNG states — cannot resume training + + # Default False so a rerun against an existing output_dir starts fresh. + resume_from_checkpoint: bool = False # Checkpoint uploading upload_checkpoints: bool = False @@ -82,7 +112,7 @@ class TrainingConfig: # Experiment tracking use_wandb: bool = False - wandb_project: str = "finetune-gr00t-n1d6" + wandb_project: str = "finetune-gr00t-n1d7" # Profiling enable_profiling: bool = False @@ -108,3 +138,41 @@ class TrainingConfig: open_loop_eval_plot_indices: Optional[list[int]] = None """List of action indices to plot. If None, plots all indices.""" + + @property + def accumulated_batch_size(self) -> int: + """Total samples per optimizer step, after gradient accumulation.""" + if self.per_gpu_batch_size is not None: + global_batch = self.per_gpu_batch_size * self.num_gpus + else: + global_batch = self.global_batch_size + return global_batch * self.gradient_accumulation_steps + + def __post_init__(self) -> None: + if self.gradient_accumulation_steps < 1: + raise ValueError( + f"gradient_accumulation_steps must be >= 1, got {self.gradient_accumulation_steps}" + ) + if self.gradient_accumulation_steps > 1 and self.per_gpu_batch_size is None: + warnings.warn( + f"global_batch_size={self.global_batch_size} is pre-accumulation; " + f"accumulated_batch_size={self.accumulated_batch_size} " + f"(× gradient_accumulation_steps={self.gradient_accumulation_steps}).", + stacklevel=2, + ) + + +def check_resume_compatibility(training: TrainingConfig) -> None: + """Reject ``save_only_model=True`` + ``resume_from_checkpoint=True``. + + HF Trainer would otherwise restore ``global_step`` from + ``trainer_state.json`` and silently re-init optimizer / LR schedule. + """ + if training.save_only_model and training.resume_from_checkpoint: + raise ValueError( + "save_only_model=True is incompatible with resume_from_checkpoint=True: " + "the checkpoint lacks optimizer/scheduler/RNG state, so resuming " + "silently re-initializes the optimizer and LR schedule, degrading " + "training quality. Either disable save_only_model, or start fresh " + "(set resume_from_checkpoint=False or use a different output_dir)." + ) diff --git a/gr00t/data/__init__.py b/gr00t/data/__init__.py index e69de29bb..467079831 100644 --- a/gr00t/data/__init__.py +++ b/gr00t/data/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/data/collator/__init__.py b/gr00t/data/collator/__init__.py index d0c99398a..42890c37c 100644 --- a/gr00t/data/collator/__init__.py +++ b/gr00t/data/collator/__init__.py @@ -1 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from .collators import BasicDataCollator diff --git a/gr00t/data/collator/collators.py b/gr00t/data/collator/collators.py index 7a528d1a9..c4d26c7f9 100755 --- a/gr00t/data/collator/collators.py +++ b/gr00t/data/collator/collators.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from typing import Any, Dict, List import torch diff --git a/gr00t/data/dataset/__init__.py b/gr00t/data/dataset/__init__.py index e69de29bb..467079831 100644 --- a/gr00t/data/dataset/__init__.py +++ b/gr00t/data/dataset/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/data/dataset/factory.py b/gr00t/data/dataset/factory.py index 37185f9b5..f1c684377 100644 --- a/gr00t/data/dataset/factory.py +++ b/gr00t/data/dataset/factory.py @@ -1,5 +1,19 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 numpy as np -import torch from tqdm import tqdm from gr00t.configs.base_config import Config @@ -8,6 +22,7 @@ from gr00t.data.embodiment_tags import EmbodimentTag from gr00t.data.interfaces import BaseProcessor from gr00t.data.stats import generate_rel_stats, generate_stats +from gr00t.utils.dist_utils import run_or_wait_on_rank0 class DatasetFactory: @@ -38,19 +53,15 @@ def build( embodiment_tag = dataset_spec.embodiment_tag assert embodiment_tag is not None, "Embodiment tag is required" assert self.config.data.mode == "single_turn", "Only single turn mode is supported" - if torch.distributed.is_initialized(): - if torch.distributed.get_rank() == 0: + # rank-0 writes stats; helper barriers before peers read them. + with run_or_wait_on_rank0(label=f"generate_stats({dataset_path})") as is_rank0: + if is_rank0: generate_stats(dataset_path) generate_rel_stats(dataset_path, EmbodimentTag(embodiment_tag)) - torch.distributed.barrier() - else: - generate_stats(dataset_path) - generate_rel_stats(dataset_path, EmbodimentTag(embodiment_tag)) dataset = ShardedSingleStepDataset( dataset_path=dataset_path, embodiment_tag=EmbodimentTag(embodiment_tag), modality_configs=self.config.data.modality_configs[embodiment_tag], - video_backend=self.config.data.video_backend, shard_size=self.config.data.shard_size, episode_sampling_rate=self.config.data.episode_sampling_rate, seed=self.config.data.seed, @@ -64,6 +75,15 @@ def build( all_datasets.append(dataset) all_weights.append(weight) + alpha = self.config.data.ds_weights_alpha + if alpha is not None and len(all_datasets) > 1: + ds_lengths = np.array([len(dataset) for dataset in all_datasets], dtype=np.float64) + all_weights = (np.power(ds_lengths, alpha) / np.power(ds_lengths[0], alpha)).tolist() + print( + f"Applied ds_weights_alpha={alpha} across {len(all_datasets)} datasets; " + "this overrides per-dataset mix_ratio sampling weights." + ) + return ( ShardedMixtureDataset( datasets=all_datasets, diff --git a/gr00t/data/dataset/lerobot_episode_loader.py b/gr00t/data/dataset/lerobot_episode_loader.py index 654b406c9..8c5c4acb3 100755 --- a/gr00t/data/dataset/lerobot_episode_loader.py +++ b/gr00t/data/dataset/lerobot_episode_loader.py @@ -1,4 +1,20 @@ #!/usr/bin/env python + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """ LeRobot Dataset Loader @@ -18,6 +34,7 @@ from collections import defaultdict import json +import logging from pathlib import Path import random from typing import Any @@ -39,7 +56,7 @@ LEROBOT_STATS_FILE_NAME = "stats.json" LEROBOT_RELATIVE_STATS_FILE_NAME = "relative_stats.json" -ALLOWED_MODALITIES = ["video", "state", "action", "language"] +ALLOWED_MODALITIES = ["video", "state", "action", "language", "mask"] DEFAULT_COLUMN_NAMES = { "state": "observation.state", "action": "action", @@ -79,8 +96,7 @@ class LeRobotEpisodeLoader: dataset_path: Path to dataset root directory containing meta/ and data files modality_configs: Dictionary mapping modality names to ModalityConfig objects that specify temporal sampling and data keys to load - video_backend: Video decoding backend ('torchcodec', 'decord', etc.) - video_backend_kwargs: Additional arguments for the video backend + decoder_kwargs: Additional arguments for the video decoder Example: >>> loader = LeRobotEpisodeLoader( @@ -100,8 +116,7 @@ def __init__( self, dataset_path: str | Path, modality_configs: dict[str, ModalityConfig], - video_backend: str = "torchcodec", - video_backend_kwargs: dict[str, Any] | None = None, + decoder_kwargs: dict[str, Any] | None = None, ) -> None: """ Initialize LeRobot episode loader with dataset path and modality configurations. @@ -112,8 +127,7 @@ def __init__( 3. Computing effective episode lengths based on action horizon """ self.dataset_path = Path(dataset_path) - self.video_backend = video_backend - self.video_backend_kwargs = video_backend_kwargs + self.decoder_kwargs = decoder_kwargs if not self.dataset_path.is_dir(): raise FileNotFoundError(f"Dataset path does not exist: {self.dataset_path}") @@ -172,12 +186,18 @@ def _load_metadata(self) -> None: relative_stats_path = meta_dir / LEROBOT_RELATIVE_STATS_FILE_NAME if relative_stats_path.exists(): with open(relative_stats_path, "r") as f: - self.stats["relative_action"] = json.load(f) + relative_stats = json.load(f) + # Drop the cache-invalidation sidecar written by gr00t.data.stats + # (mirrors STATS_FINGERPRINTS_KEY there). Consumers index by + # feature name and would otherwise treat it as a stats group. + relative_stats.pop("__fingerprints__", None) + self.stats["relative_action"] = relative_stats # Extract key configuration parameters self.feature_config = self.info_meta.get("features", {}) self.data_path_pattern = self.info_meta["data_path"] self.video_path_pattern = self.info_meta.get("video_path") + self.mask_path_pattern = self.info_meta.get("mask_path") self.chunk_size = self.info_meta["chunks_size"] self.fps = self.info_meta.get("fps", 30) @@ -220,19 +240,62 @@ def _parse_and_validate_modality_configs( ValueError: If invalid modalities are specified AssertionError: If language modality configuration is invalid """ - # Validate all modality configurations + # Filter out any modalities not handled by the dataset loader. + unknown_modalities = [m for m in modality_configs if m not in ALLOWED_MODALITIES] + if unknown_modalities: + logging.debug( + f"Skipping modalities not supported by dataset loader: {unknown_modalities}" + ) + modality_configs = { + k: v for k, v in modality_configs.items() if k in ALLOWED_MODALITIES + } for modality in modality_configs: - if modality not in ALLOWED_MODALITIES: - raise ValueError(f"Invalid modality: {modality}") if modality == "language": - # Language modality has special constraints - assert len(modality_configs[modality].modality_keys) == 1, ( - "Language modality must have exactly one key" + # Language modality has special constraints. + # Some embodiments (e.g. OXE_DROID) define multiple language keys for + # training-time augmentation. At inference we only use the first key. + assert len(modality_configs[modality].modality_keys) >= 1, ( + "Language modality must have at least one key" ) + if len(modality_configs[modality].modality_keys) > 1: + logging.warning( + f"Language modality has {len(modality_configs[modality].modality_keys)} keys, " + f"only the first key will be used: {modality_configs[modality].modality_keys[0]}" + ) + modality_configs[modality] = ModalityConfig( + delta_indices=modality_configs[modality].delta_indices, + modality_keys=[modality_configs[modality].modality_keys[0]], + sin_cos_embedding_keys=modality_configs[modality].sin_cos_embedding_keys, + mean_std_embedding_keys=modality_configs[modality].mean_std_embedding_keys, + action_configs=modality_configs[modality].action_configs[:1] + if modality_configs[modality].action_configs is not None + else None, + ) assert modality_configs[modality].delta_indices == [0], ( "Only single timestep is supported for language modality" ) + # Build mapping from config video keys to dataset modality_meta video keys. + # This handles the case where the model's pretrained config uses different + # video key names than the dataset's modality.json (e.g., N1.6 vs N1.7 naming). + self._video_key_mapping: dict[str, str] = {} + if "video" in modality_configs and "video" in self.modality_meta: + config_keys = modality_configs["video"].modality_keys + meta_keys = list(self.modality_meta["video"].keys()) + needs_mapping = any(k not in self.modality_meta["video"] for k in config_keys) + if needs_mapping: + assert len(config_keys) == len(meta_keys), ( + f"Cannot auto-map video keys: config has {len(config_keys)} keys " + f"{config_keys} but dataset modality meta has {len(meta_keys)} keys " + f"{meta_keys}. Counts must match for positional mapping." + ) + for config_key, meta_key in zip(config_keys, meta_keys): + self._video_key_mapping[config_key] = meta_key + logging.warning( + f"Video key mismatch between model config and dataset. " + f"Auto-mapping by position: {self._video_key_mapping}" + ) + return modality_configs def __len__(self) -> int: @@ -325,7 +388,9 @@ def _load_parquet_data(self, episode_index: int) -> pd.DataFrame: if modality_type not in self.modality_configs: continue joint_groups_df = self._extract_joint_groups( - original_df, self.modality_configs[modality_type].modality_keys, modality_type + original_df, + self.modality_configs[modality_type].modality_keys, + modality_type, ) for joint_group in joint_groups_df.columns: loaded_df[f"{modality_type}.{joint_group}"] = joint_groups_df[joint_group] @@ -355,9 +420,11 @@ def _load_video_data(self, episode_index: int, indices: np.ndarray) -> dict[str, image_keys = self.modality_configs["video"].modality_keys for image_key in image_keys: - # Resolve the original key used in video file naming - original_key = self.modality_meta["video"][image_key].get( - "original_key", f"observation.images.{image_key}" + # Resolve the original key used in video file naming. + # Use the video key mapping if the config key differs from the dataset meta key. + meta_key = self._video_key_mapping.get(image_key, image_key) + original_key = self.modality_meta["video"][meta_key].get( + "original_key", f"observation.images.{meta_key}" ) assert original_key in self.feature_config, ( f"Original key {original_key} not found in feature config" @@ -365,7 +432,9 @@ def _load_video_data(self, episode_index: int, indices: np.ndarray) -> dict[str, # Construct video file path using pattern video_filename = self.video_path_pattern.format( - episode_chunk=chunk_idx, video_key=original_key, episode_index=episode_index + episode_chunk=chunk_idx, + video_key=original_key, + episode_index=episode_index, ) video_path = self.dataset_path / video_filename @@ -373,12 +442,61 @@ def _load_video_data(self, episode_index: int, indices: np.ndarray) -> dict[str, video_data[image_key] = get_frames_by_indices( str(video_path), indices, - video_backend=self.video_backend, - video_backend_kwargs=self.video_backend_kwargs or {}, + decoder_kwargs=self.decoder_kwargs or {}, ) return video_data + def _load_mask_file(self, mask_path: Path, indices: np.ndarray) -> np.ndarray: + """Load masks from npz/npy file at specified indices.""" + if not mask_path.exists(): + raise FileNotFoundError(f"Mask file does not exist: {mask_path}") + suffix = mask_path.suffix.lower() + if suffix not in {".npz", ".npy"}: + raise ValueError(f"Only .npz or .npy mask files are supported: {mask_path}") + + if suffix == ".npy": + masks = np.load(mask_path) + else: + npz_data = np.load(mask_path) + if "arr_0" in npz_data: + masks = npz_data["arr_0"] + elif len(npz_data.files) == 1: + masks = npz_data[npz_data.files[0]] + else: + raise ValueError(f"Mask npz must contain a single array or 'arr_0': {mask_path}") + + if masks.ndim == 2: + masks = masks[None, ...] + + return masks[indices] + + def _load_mask_data(self, episode_index: int, indices: np.ndarray) -> dict[str, np.ndarray]: + """ + Load mask data for all configured mask views at specified indices. + """ + mask_data = {} + + if not self.mask_path_pattern or "mask" not in self.modality_configs: + return mask_data + + chunk_idx = episode_index // self.chunk_size + mask_keys = self.modality_configs["mask"].modality_keys + + for mask_key in mask_keys: + mask_meta = self.modality_meta.get("mask", {}).get(mask_key, {}) + original_key = mask_meta.get("original_key", mask_key) + mask_filename = self.mask_path_pattern.format( + episode_chunk=chunk_idx, + episode_index=episode_index, + mask_key=original_key, + video_key=original_key, + ) + mask_path = self.dataset_path / mask_filename + mask_data[mask_key] = self._load_mask_file(mask_path, indices) + + return mask_data + def get_dataset_statistics(self) -> dict[str, Any]: """ Extract dataset statistics for normalization from loaded metadata. @@ -428,7 +546,11 @@ def create_language_from_meta( new_languages = [[] for _ in range(nframes)] sub_tasks = episode_meta["sub_tasks"] for sub_task in sub_tasks: - start_idx, end_idx, sub_text = sub_task["start"], sub_task["end"], sub_task["text"] + start_idx, end_idx, sub_text = ( + sub_task["start"], + sub_task["end"], + sub_task["text"], + ) horizon = action_horizon // 2 for i in range(start_idx - horizon, end_idx): if i < 0: @@ -488,6 +610,14 @@ def __getitem__(self, idx: int) -> pd.DataFrame: ) df[f"video.{key}"] = [frame for frame in video_data[key]] + # Load synchronized mask data + mask_data = self._load_mask_data(episode_id, np.arange(actual_length)) + for key in mask_data.keys(): + assert len(mask_data[key]) == len(df), ( + f"Mask data for {key} has length {len(mask_data[key])} but dataframe has length {len(df)}" + ) + df[f"mask.{key}"] = [mask for mask in mask_data[key]] + return df def get_initial_actions(self): diff --git a/gr00t/data/dataset/sharded_mixture_dataset.py b/gr00t/data/dataset/sharded_mixture_dataset.py index 7fce6dc39..9100ce221 100755 --- a/gr00t/data/dataset/sharded_mixture_dataset.py +++ b/gr00t/data/dataset/sharded_mixture_dataset.py @@ -1,13 +1,46 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from concurrent.futures import Future, ThreadPoolExecutor import time import numpy as np +import torch import torch.distributed as dist from torch.utils.data import IterableDataset, get_worker_info from gr00t.data.interfaces import BaseProcessor, ShardedDataset +def _get_default_pg_tensor_device() -> torch.device: + """Return a tensor device supported by the default process-group backend.""" + try: + backend = dist.get_backend() + except (AssertionError, RuntimeError, ValueError): + return torch.device("cpu") + + if str(backend).lower() == "nccl": + if not torch.cuda.is_available(): + raise RuntimeError( + "ShardedMixtureDataset seed check requires CUDA tensors when the " + "distributed process group uses NCCL, but CUDA is not available." + ) + return torch.device("cuda", torch.cuda.current_device()) + return torch.device("cpu") + + def merge_statistics( per_dataset_stats: list[dict[str, dict[str, list[float] | np.ndarray]]], dataset_sampling_weights: list[float] | np.ndarray, @@ -42,13 +75,20 @@ def merge_statistics( # Initialize overall statistics dict overall_stats: dict[str, dict[str, list[float]]] = {} - # Process each modality (e.g., "state", "action") - for modality in per_dataset_stats[0]: + # Process each modality (e.g., "state", "action"). An entry is a real + # stats group iff it carries a "mean" field; anything else is sidecar + # metadata that producers may co-locate at the top level (e.g. the + # __fingerprints__ cache map written by generate_rel_stats) and must be + # skipped rather than merged. Structural duck-typing keeps this consumer + # decoupled from whatever sidecar names the producer adopts. + for modality, modality_stats in per_dataset_stats[0].items(): + if not isinstance(modality_stats, dict) or "mean" not in modality_stats: + continue # Get dimensionality from first dataset (assumed consistent) dim = ( - [len(per_dataset_stats[0][modality]["mean"])] + [len(modality_stats["mean"])] if not is_relative_stats - else np.array(per_dataset_stats[0][modality]["mean"]).shape + else np.array(modality_stats["mean"]).shape ) # Initialize accumulators for weighted mean and variance computation @@ -128,11 +168,38 @@ class ShardedMixtureDataset(IterableDataset): weights while accounting for differences in shard sizes, preventing bias toward datasets with smaller shards. + Distributed seeding invariant: + ``seed`` MUST be identical on every rank. ``generate_shard_sampling_schedule`` + is called from ``__init__`` on every rank and consumes ``np.random.default_rng(self.seed + self.epoch)``; + every rank therefore produces a byte-identical ``shard_sampling_schedule``. + Disjoint partitioning across ranks is then performed by index in + ``filter_shard_sample_schedule``: + + ``i % (world_size * num_workers) == rank * num_workers + worker_id`` + + Using a per-rank seed (e.g. ``set_seed(seed + global_rank)`` in the entry + point, or ``self.seed = base_seed + self.rank`` here) silently breaks + partitioning: each rank's filter targets a different schedule, so the + same physical shard is processed on multiple ranks (duplicate work) + and other shards are never processed (unseen training data). Training + losses look fine — the corruption only surfaces as degraded eval / + deployment performance. + + See ``gr00t/experiment/experiment.py`` (``set_seed(config.data.seed)``) + and ``gr00t/experiment/trainer.py`` (``reset_seed`` callsite during + resume) for the two places this invariant is established. + + ``__init__`` and ``reset_seed`` enforce the invariant at runtime via + ``_assert_seed_rank_symmetric``: a cross-rank ``all_gather`` that + raises ``ValueError`` on mismatch. The check is a no-op in + single-rank / non-distributed contexts. + Args: datasets: List of ShardedDataset instances to combine weights: Mixing weights for each dataset (will be normalized) processor: Data processor to apply to all datasets - seed: Random seed for reproducible sampling + seed: Random seed for reproducible sampling. Must be identical on every + rank — see "Distributed seeding invariant" above. training: Whether in training mode (affects sampling strategy) num_shards_per_epoch: Number of shards to sample per epoch during training @@ -189,6 +256,8 @@ def __init__( self._executor = None self._cache_job: Future | None = None + self._assert_seed_rank_symmetric(self.seed) + def merge_statistics(self): """ Merge dataset statistics across all datasets, grouped by embodiment. @@ -421,8 +490,18 @@ def reset_seed(self, seed: int): Used for deterministic training restarts or seed changes during training. + Distributed seeding invariant: ``seed`` MUST be identical on every rank + for the same reason it must be at construction time — see the + "Distributed seeding invariant" section in this class's docstring. + ``Gr00tTrainer.get_train_dataloader`` honors this by computing + ``new_seed = self.train_dataset.seed + curr_global_step`` (a quantity that + is the same on every rank because both ``self.train_dataset.seed`` and + ``self.state.global_step`` are rank-symmetric). Do not change that + formula to include ``rank`` / ``global_rank`` / ``local_rank`` without + also redesigning ``filter_shard_sample_schedule``'s partitioning. + Args: - seed: New random seed to use + seed: New random seed to use. Must be identical on every rank. """ self.seed = seed self.epoch = 0 @@ -430,6 +509,32 @@ def reset_seed(self, seed: int): self.curr_shard_index = -1 self.curr_shard = None self._cache_job = None + self._assert_seed_rank_symmetric(self.seed) + + def _assert_seed_rank_symmetric(self, seed: int) -> None: + """Verify ``seed`` is identical on every rank. + + See the "Distributed seeding invariant" section of the class + docstring for the partition mechanism this guards. A rank-asymmetric + seed silently corrupts the shard partition; this assertion turns + that silent failure into a fail-fast at construction (or + ``reset_seed``) time. No-op when not distributed or + ``world_size == 1``. + """ + if self.world_size <= 1 or not dist.is_initialized(): + return + device = _get_default_pg_tensor_device() + seed_t = torch.tensor([seed], dtype=torch.long, device=device) + gathered = [torch.zeros_like(seed_t) for _ in range(self.world_size)] + dist.all_gather(gathered, seed_t) + seeds = [int(s.item()) for s in gathered] + if any(s != seed for s in seeds): + raise ValueError( + f"ShardedMixtureDataset: seed must be identical on every rank, " + f"got {seeds} (this rank passed {seed}). A rank-asymmetric seed " + f"silently breaks the shard partition — see this class's " + f'"Distributed seeding invariant" docstring section.' + ) def print_dataset_statistics(self): """Print formatted dataset statistics for debugging and monitoring.""" diff --git a/gr00t/data/dataset/sharded_single_step_dataset.py b/gr00t/data/dataset/sharded_single_step_dataset.py index f38896132..1b7db73d3 100644 --- a/gr00t/data/dataset/sharded_single_step_dataset.py +++ b/gr00t/data/dataset/sharded_single_step_dataset.py @@ -1,5 +1,19 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from pathlib import Path -from typing import Any import numpy as np import pandas as pd @@ -47,6 +61,7 @@ def extract_step_data( # Parse extracted data into VLAStepData structure video_data = step_data.get("video", {}) + mask_data = step_data.get("mask", {}) state_data = step_data.get("state", {}) action_data = step_data.get("action", {}) language_data = step_data.get("language", {}) @@ -55,6 +70,7 @@ def extract_step_data( vla_step_data = VLAStepData( images=video_data, + masks=mask_data if mask_data else None, states=state_data, actions=action_data, text=text, @@ -88,8 +104,6 @@ class ShardedSingleStepDataset(ShardedDataset): dataset_path: Path to LeRobot format dataset directory embodiment_tag: Embodiment identifier for cross-embodiment training modality_configs: Configuration for each modality (sampling, keys) - video_backend: Video decoding backend ('torchcodec', 'decord', etc.) - video_backend_kwargs: Additional arguments for video backend shard_size: Target number of timesteps per shard episode_sampling_rate: Fraction of episode timesteps to use (for efficiency) seed: Random seed for reproducible sharding and sampling @@ -117,8 +131,6 @@ def __init__( dataset_path: str | Path, embodiment_tag: EmbodimentTag, modality_configs: dict[str, ModalityConfig], - video_backend: str = "torchcodec", - video_backend_kwargs: dict[str, Any] | None = None, shard_size: int = 2**10, # 1024 steps episode_sampling_rate: float = 0.1, seed: int = 42, @@ -128,8 +140,6 @@ def __init__( super().__init__(dataset_path) self.embodiment_tag = embodiment_tag self.modality_configs = modality_configs - self.video_backend = video_backend - self.video_backend_kwargs = video_backend_kwargs self.shard_size = shard_size self.episode_sampling_rate = episode_sampling_rate self.seed = seed @@ -142,8 +152,6 @@ def __init__( self.episode_loader = LeRobotEpisodeLoader( dataset_path=dataset_path, modality_configs=modality_configs, - video_backend=video_backend, - video_backend_kwargs=video_backend_kwargs, ) # Create balanced shards from episode timesteps @@ -171,27 +179,44 @@ def shard_dataset(self): f"No valid trajectories found for dataset {self.dataset_path}" ) - # Calculate total timesteps and required number of shards - total_steps = np.sum( - [self.get_effective_episode_length(idx) for idx in shuffled_episode_indices] - ).astype(int) - num_shards = np.ceil(total_steps / self.shard_size).astype(int) + # Build non-empty episode sub-sequences first. Small datasets can have fewer + # non-empty sub-sequences than the shard count implied by shard_size. + episode_splits = [] + total_steps = 0 + for ep_idx in shuffled_episode_indices: + step_indices = np.arange(0, self.get_effective_episode_length(ep_idx)) + self.rng.shuffle(step_indices) + total_steps += len(step_indices) + for i in range(num_splits): + split_step_indices = step_indices[i::num_splits] + if len(split_step_indices) > 0: + episode_splits.append((ep_idx, split_step_indices)) + + assert total_steps > 0 and len(episode_splits) > 0, ( + f"No valid timesteps found for dataset {self.dataset_path}; " + f"episode lengths may be shorter than action horizon {self.action_horizon}" + ) + + # Calculate num_shards: bounded by total_steps/shard_size and episode_splits count + # Never more shards than episode_splits to ensure all shards are non-empty + num_shards = min(np.ceil(total_steps / self.shard_size).astype(int), len(episode_splits)) # Initialize shard containers sharded_episodes = [[] for _ in range(num_shards)] shard_lengths = np.zeros(num_shards, dtype=int) # Distribute episode sub-sequences across shards - for ep_idx in shuffled_episode_indices: - # Split episode timesteps into multiple sub-sequences - step_indices = np.arange(0, self.get_effective_episode_length(ep_idx)) - self.rng.shuffle(step_indices) - for i in range(num_splits): - split_step_indices = step_indices[i::num_splits] - # Assign to shard with minimum current length (greedy balancing) + # First pass: ensure each shard gets at least one episode_split (round-robin) + # This guarantees no shard is empty when num_shards <= len(episode_splits) + for i, (ep_idx, split_step_indices) in enumerate(episode_splits): + if i < num_shards: + # First num_shards items: one per shard (guarantees non-empty) + shard_index = i + else: + # Remaining items: assign to shard with minimum current length (greedy balancing) shard_index = np.argmin(shard_lengths) - sharded_episodes[shard_index].append((ep_idx, split_step_indices)) - shard_lengths[shard_index] += len(split_step_indices) + sharded_episodes[shard_index].append((ep_idx, split_step_indices)) + shard_lengths[shard_index] += len(split_step_indices) # Validate shard creation assert all(shard_lengths[i] > 0 for i in range(num_shards)), ( @@ -233,7 +258,11 @@ def get_datapoint(self, episode_data: pd.DataFrame, step_index: int) -> dict: """ assert self.processor is not None, "Processor must be set before getting datapoints" vla_step_data = extract_step_data( - episode_data, step_index, self.modality_configs, self.embodiment_tag, self.allow_padding + episode_data, + step_index, + self.modality_configs, + self.embodiment_tag, + self.allow_padding, ) # Apply processor to convert to model inputs messages = [{"type": MessageType.EPISODE_STEP.value, "content": vla_step_data}] diff --git a/gr00t/data/embodiment_tags.py b/gr00t/data/embodiment_tags.py index 1ced403e3..3424b4e83 100755 --- a/gr00t/data/embodiment_tags.py +++ b/gr00t/data/embodiment_tags.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from enum import Enum @@ -12,41 +27,101 @@ class EmbodimentTag(Enum): - ##### Pretrain embodiment tags ##### - ROBOCASA_PANDA_OMRON = "robocasa_panda_omron" + """Embodiment tags supported by the GR00T N1.7 checkpoint. + + Pretrain tags (baked into the base model nvidia/GR00T-N1.7-3B, inference-ready): + - OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT -> "oxe_droid_relative_eef_relative_joint" + - XDOF -> "xdof_relative_eef_relative_joint" + - XDOF_SUBTASK -> "xdof_relative_eef_relative_joint_subtask" + - REAL_G1 -> "real_g1_relative_eef_relative_joints" + - REAL_R1_PRO_SHARPA -> "real_r1_pro_sharpa_relative_eef" + - REAL_R1_PRO_SHARPA_HUMAN -> "real_r1_pro_sharpa_relative_eef_human" + - REAL_R1_PRO_SHARPA_MAXINSIGHTS -> "real_r1_pro_sharpa_relative_eef_maxinsights" + - REAL_R1_PRO_SHARPA_MECKA -> "real_r1_pro_sharpa_relative_eef_mecka" + + Pre-registered posttrain tags (require finetuned checkpoint): + - UNITREE_G1 -> "unitree_g1_full_body_with_waist_height_nav_cmd" + - UNITREE_G1_SONIC -> "unitree_g1_sonic" + - SIMPLER_ENV_GOOGLE -> "simpler_env_google" + - SIMPLER_ENV_WIDOWX -> "simpler_env_widowx" + - LIBERO_PANDA -> "libero_sim" + + Finetuning tag (for custom robots): + - NEW_EMBODIMENT -> "new_embodiment" + - ROBOCASA_PANDA_OMRON -> "robocasa_panda_omron" + - ROBOCASA_GR1_TABLETOP -> "robocasa_gr1_tabletop" + + Use ``EmbodimentTag.resolve(s)`` to look up a tag by name or value, + case-insensitively. + """ + + ##### Pretrain embodiment tags (in base model processor_config.json) ##### + + OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT = "oxe_droid_relative_eef_relative_joint" + """ + The Open-X-Embodiment DROID robot with relative EEF and relative joint position actions. + """ + + XDOF = "xdof_relative_eef_relative_joint" """ - The RoboCasa Panda robot with omron mobile base. + The generic X-DOF robot with relative EEF and relative joint position actions. """ - GR1 = "gr1" + XDOF_SUBTASK = "xdof_relative_eef_relative_joint_subtask" """ - The Fourier GR1 robot. + The generic X-DOF robot (subtask variant). + """ + + REAL_G1 = "real_g1_relative_eef_relative_joints" + """ + Real-world Unitree G1 with relative EEF and relative joint actions. + """ + + REAL_R1_PRO_SHARPA = "real_r1_pro_sharpa_relative_eef" + """ + Real-world R1 Pro Sharpa with relative EEF actions. + """ + + REAL_R1_PRO_SHARPA_HUMAN = "real_r1_pro_sharpa_relative_eef_human" + """ + Real-world R1 Pro Sharpa with relative EEF actions (human teleop data). + """ + + REAL_R1_PRO_SHARPA_MAXINSIGHTS = "real_r1_pro_sharpa_relative_eef_maxinsights" + """ + Real-world R1 Pro Sharpa with relative EEF actions (MaxInsights data, single-cam). + """ + + REAL_R1_PRO_SHARPA_MECKA = "real_r1_pro_sharpa_relative_eef_mecka" + """ + Real-world R1 Pro Sharpa with relative EEF actions (Mecka data, single-cam). """ ##### Pre-registered posttrain embodiment tags ##### - UNITREE_G1 = "unitree_g1" + + UNITREE_G1 = "unitree_g1_full_body_with_waist_height_nav_cmd" """ - The Unitree G1 robot. + The Unitree G1 robot (sim, full-body with waist height and nav commands). """ - LIBERO_PANDA = "libero_panda" + UNITREE_G1_SONIC = "unitree_g1_sonic" """ - The Libero panda robot. + The Unitree G1 robot with SONIC whole-body controller. VLA action space is SONIC latents. """ - OXE_GOOGLE = "oxe_google" + SIMPLER_ENV_GOOGLE = "simpler_env_google" """ - The Open-X-Embodiment Google robot. + The SimplerEnv Google robot. """ - OXE_WIDOWX = "oxe_widowx" + SIMPLER_ENV_WIDOWX = "simpler_env_widowx" """ - The Open-X-Embodiment WidowX robot. + The SimplerEnv WidowX robot. """ - BEHAVIOR_R1_PRO = "behavior_r1_pro" + LIBERO_PANDA = "libero_sim" """ - The Behavior R1 Pro robot. + The LIBERO Panda robot (used for LIBERO-Goal, LIBERO-Object, LIBERO-Spatial, LIBERO-10). """ # New embodiment during post-training @@ -54,3 +129,96 @@ class EmbodimentTag(Enum): """ Any new embodiment. """ + + ROBOCASA_GR1_TABLETOP = "robocasa_gr1_tabletop" + """ + RoboCasa GR1 tabletop tasks with arms, waist, and Fourier hands. + Uses the custom-embodiment finetuning projector slot. + """ + + ROBOCASA_PANDA_OMRON = "robocasa_panda_omron" + """ + RoboCasa Panda arm tasks with an Omron gripper. + Uses the custom-embodiment finetuning projector slot. + """ + + @classmethod + def resolve(cls, tag: "str | EmbodimentTag") -> "EmbodimentTag": + """Resolve a string to an EmbodimentTag, case-insensitively. + + Matches by enum **name** first (e.g. ``"xdof"`` -> ``XDOF``), then by + enum **value** (e.g. ``"xdof_relative_eef_relative_joint"`` -> ``XDOF``). + + Raises: + ValueError: If *tag* does not match any known embodiment. + """ + if isinstance(tag, cls): + return tag + key = tag.strip() + key_lower = key.lower() + # Match by enum name (case-insensitive) + for member in cls: + if member.name.lower() == key_lower: + return member + # Match by enum value (case-insensitive) + for member in cls: + if member.value.lower() == key_lower: + return member + + def _fmt(tags): + return "\n".join(f" {m.name:40s} -> {m.value}" for m in tags) + + msg = ( + f"Unknown embodiment tag: {tag!r}\n\n" + f" Base model tags (work with nvidia/GR00T-N1.7-3B):\n" + f"{_fmt(PRETRAIN_TAGS)}\n\n" + f" Posttrain tags (require a finetuned checkpoint):\n" + f"{_fmt(POSTTRAIN_TAGS)}\n\n" + f" Finetuning-only tags (for custom robots):\n" + f"{_fmt(FINETUNE_ONLY_TAGS)}" + ) + raise ValueError(msg) + + @classmethod + def reverse_lookup(cls, value: str) -> "str": + """Map a tag value string back to its enum name, or return the value as-is.""" + for member in cls: + if member.value == value: + return member.name + return value + + +# Module-level tag category sets (cannot be Enum class attributes). +PRETRAIN_TAGS: frozenset[EmbodimentTag] = frozenset( + { + EmbodimentTag.OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT, + EmbodimentTag.XDOF, + EmbodimentTag.XDOF_SUBTASK, + EmbodimentTag.REAL_G1, + EmbodimentTag.REAL_R1_PRO_SHARPA, + EmbodimentTag.REAL_R1_PRO_SHARPA_HUMAN, + EmbodimentTag.REAL_R1_PRO_SHARPA_MAXINSIGHTS, + EmbodimentTag.REAL_R1_PRO_SHARPA_MECKA, + } +) +"""Tags baked into the base model (nvidia/GR00T-N1.7-3B) — usable without finetuning.""" + +POSTTRAIN_TAGS: frozenset[EmbodimentTag] = frozenset( + { + EmbodimentTag.UNITREE_G1, + EmbodimentTag.UNITREE_G1_SONIC, + EmbodimentTag.SIMPLER_ENV_GOOGLE, + EmbodimentTag.SIMPLER_ENV_WIDOWX, + EmbodimentTag.LIBERO_PANDA, + } +) +"""Tags that require a finetuned checkpoint.""" + +FINETUNE_ONLY_TAGS: frozenset[EmbodimentTag] = frozenset( + { + EmbodimentTag.NEW_EMBODIMENT, + EmbodimentTag.ROBOCASA_PANDA_OMRON, + EmbodimentTag.ROBOCASA_GR1_TABLETOP, + } +) +"""Tags for custom robots (finetuning only, not in any shipped checkpoint).""" diff --git a/gr00t/data/interfaces.py b/gr00t/data/interfaces.py index 126672eb8..697dd35e8 100644 --- a/gr00t/data/interfaces.py +++ b/gr00t/data/interfaces.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from abc import ABC, abstractmethod from typing import Any diff --git a/gr00t/data/state_action/action_chunking.py b/gr00t/data/state_action/action_chunking.py index 0c838be43..a77755512 100644 --- a/gr00t/data/state_action/action_chunking.py +++ b/gr00t/data/state_action/action_chunking.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from typing import Generic, List, Optional, Sequence, TypeVar, Union from gr00t.data.state_action.pose import EndEffectorPose, JointPose, Pose @@ -145,7 +160,9 @@ def to_absolute_chunking(self, reference_frame: PoseType) -> "ActionChunk[PoseTy raise NotImplementedError("Subclasses must implement to_absolute_chunking") def interpolate( - self, num_points: Optional[int] = None, times: Optional[NDArray[np.float64]] = None + self, + num_points: Optional[int] = None, + times: Optional[NDArray[np.float64]] = None, ) -> "ActionChunk": """ Interpolate the action chunking to generate intermediate poses. @@ -248,7 +265,9 @@ def __init__( super().__init__(poses, times) def interpolate( - self, num_points: Optional[int] = None, times: Optional[NDArray[np.float64]] = None + self, + num_points: Optional[int] = None, + times: Optional[NDArray[np.float64]] = None, ) -> "JointActionChunk": """ Interpolate the joint action chunking to generate intermediate configurations. @@ -455,8 +474,27 @@ def __init__( super().__init__(poses, times) + @classmethod + def from_array(cls, data: np.ndarray, action_format: ActionFormat) -> "EndEffectorActionChunk": + """ + Create an EndEffectorActionChunk from a 2-D array using the specified action format. + + This is the inverse of ``.to(action_format)``. + + Args: + data: Array of shape (N, D) where D depends on the action_format. + action_format: The format that describes the layout of each row. + + Returns: + EndEffectorActionChunk with N poses. + """ + poses = [EndEffectorPose.from_action_format(row, action_format) for row in data] + return cls(poses) + def interpolate( - self, num_points: Optional[int] = None, times: Optional[NDArray[np.float64]] = None + self, + num_points: Optional[int] = None, + times: Optional[NDArray[np.float64]] = None, ) -> "EndEffectorActionChunk": """ Interpolate the action chunking to generate intermediate poses. diff --git a/gr00t/data/state_action/droid_frame.py b/gr00t/data/state_action/droid_frame.py new file mode 100644 index 000000000..4d804b517 --- /dev/null +++ b/gr00t/data/state_action/droid_frame.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""DROID end-effector frame correction — single source of truth. + +The pretrained OXE DROID model expects eef rotations in the egocentric TFG +convention: the robot's euler->matrix rotation is post-multiplied by +``DROID_EEF_ROTATION_CORRECT`` before the rot6d is taken. The dataset builder, +the rotation-verify script, and the real-robot client must all agree on this +matrix; a drifted copy silently produces wrong eef rotations with no crash. + +``examples/DROID/main_gr00t.py`` runs on a slim robot install without the +``gr00t`` package and cannot import this module, so it vendors a tagged mirror. +""" + +from __future__ import annotations + +import numpy as np +from scipy.spatial.transform import Rotation + + +# Egocentric frame correction applied after euler->matrix conversion to match +# the OXE DROID training pipeline (TFG convention). +DROID_EEF_ROTATION_CORRECT = np.array( + [[0, 0, -1], [-1, 0, 0], [0, 1, 0]], + dtype=np.float64, +) + + +def euler_to_rot6d(euler_angles: np.ndarray) -> np.ndarray: + """Convert euler angles (3D) to rotation 6D representation. + + Uses extrinsic XYZ Euler convention (scipy ``"XYZ"``, equivalent to + ``tfg.rotation_matrix_3d.from_euler``) and post-multiplies by + ``DROID_EEF_ROTATION_CORRECT`` to match the pretrained model. + + Args: + euler_angles: (..., 3) array of euler angles + + Returns: + (..., 6) array of rot6d representation + """ + shape = euler_angles.shape[:-1] + flat = euler_angles.reshape(-1, 3) + rot_matrices = Rotation.from_euler("XYZ", flat).as_matrix() # (N, 3, 3) + rot_matrices = rot_matrices @ DROID_EEF_ROTATION_CORRECT + rot6d = rot_matrices[:, :2, :].reshape(-1, 6) # (N, 6) + return rot6d.reshape(*shape, 6) + + +def compute_eef_9d(cartesian_position: np.ndarray) -> np.ndarray: + """Convert cartesian_position (XYZ + euler 3D) to eef_9d (XYZ + rot6d). + + Args: + cartesian_position: (..., 6) array [x, y, z, euler_x, euler_y, euler_z] + + Returns: + (..., 9) array [x, y, z, rot6d_0..5] + """ + xyz = cartesian_position[..., :3] + euler = cartesian_position[..., 3:] + rot6d = euler_to_rot6d(euler) + return np.concatenate([xyz, rot6d], axis=-1) diff --git a/gr00t/data/state_action/pose.py b/gr00t/data/state_action/pose.py index 3ac020e7d..a0d679fa2 100644 --- a/gr00t/data/state_action/pose.py +++ b/gr00t/data/state_action/pose.py @@ -1,6 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + from enum import Enum from typing import Optional, TypeVar, Union +from gr00t.data.types import ActionFormat import numpy as np from numpy.typing import NDArray from scipy.spatial.transform import Rotation @@ -258,7 +276,7 @@ def _compute_relative(self, other): # type: ignore[override] relative_joints = self.joints - other.joints return JointPose(joints=relative_joints, joint_names=self.joint_names) - def copy(self) -> "JointPose": + def copy(self) -> JointPose: """ Create a deep copy of this joint pose. @@ -561,7 +579,10 @@ def _compute_homogeneous(self) -> np.ndarray: return H def to_rotation( - self, rotation_type: str, rotation_order: Optional[str] = None, degrees: bool = True + self, + rotation_type: str, + rotation_order: Optional[str] = None, + degrees: bool = True, ) -> np.ndarray: """ Get rotation in specified representation. @@ -656,7 +677,30 @@ def _compute_relative(self, other): # type: ignore[override] # Create new EndEffectorPose from relative transformation return EndEffectorPose(homogeneous=T_relative) - def copy(self) -> "EndEffectorPose": + @classmethod + def from_action_format(cls, data: np.ndarray, action_format: ActionFormat) -> EndEffectorPose: + """ + Create an EndEffectorPose from a flat array using the specified action format. + + This is the inverse of the xyz_rot6d / xyz_rotvec / homogeneous properties. + + Args: + data: Flat array whose layout depends on action_format. + action_format: One of ActionFormat.XYZ_ROT6D, XYZ_ROTVEC, or DEFAULT. + + Returns: + EndEffectorPose instance. + """ + if action_format == ActionFormat.XYZ_ROT6D: + return cls(translation=data[:3], rotation=data[3:], rotation_type="rot6d") + elif action_format == ActionFormat.XYZ_ROTVEC: + return cls(translation=data[:3], rotation=data[3:], rotation_type="rotvec") + elif action_format == ActionFormat.DEFAULT: + return cls(homogeneous=data.reshape(4, 4)) + else: + raise ValueError(f"Unsupported ActionFormat: {action_format}") + + def copy(self) -> EndEffectorPose: """ Create a deep copy of this end-effector pose. diff --git a/gr00t/data/state_action/state_action_processor.py b/gr00t/data/state_action/state_action_processor.py index 53486bf2f..3bebaca6d 100644 --- a/gr00t/data/state_action/state_action_processor.py +++ b/gr00t/data/state_action/state_action_processor.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """ Unified processor for robot state and action data. @@ -9,6 +24,7 @@ """ from copy import deepcopy +import logging from gr00t.configs.data.embodiment_configs import ( ActionFormat, @@ -30,6 +46,9 @@ import numpy as np +logger = logging.getLogger(__name__) + + class StateActionProcessor: """ Unified processor for robot state and action data. @@ -44,7 +63,7 @@ class StateActionProcessor: def __init__( self, modality_configs: dict[str, dict[str, ModalityConfig]], - statistics: dict[str, dict[str, dict[str, dict[str, list[float]]]]] | None = None, + statistics: (dict[str, dict[str, dict[str, dict[str, list[float]]]]] | None) = None, use_percentiles: bool = False, clip_outliers: bool = True, apply_sincos_state_encoding: bool = False, @@ -106,7 +125,21 @@ def set_statistics( if key not in self.statistics or override: self.statistics[key] = deepcopy(statistics[key]) else: - print(f"Embodiment tag {key} already in statistics, skipping updating") + # Surfaced as a warning (not print) because callers running with + # override_pretraining_statistics=False on a mixture dataset will + # otherwise silently keep the pre-existing pretraining stats and + # discard newly-merged per-dataset stats — training proceeds with + # the wrong mean/std and only an easy-to-miss stdout line records + # the drop. + logger.warning( + "Statistics for embodiment %r already present; new stats " + "DISCARDED (override=False). If the new data differs from " + "the existing distribution this will cause silent " + "normalization mismatch — pass override=True (or " + "override_pretraining_statistics=True at the dataset level) " + "to use the merged stats instead.", + key, + ) self._compute_normalization_parameters() def _compute_normalization_parameters(self) -> None: @@ -210,7 +243,10 @@ def apply_state( # Strategy 2: Mean/std normalization elif ( - hasattr(self.modality_configs[embodiment_tag]["state"], "mean_std_embedding_keys") + hasattr( + self.modality_configs[embodiment_tag]["state"], + "mean_std_embedding_keys", + ) and self.modality_configs[embodiment_tag]["state"].mean_std_embedding_keys and joint_group in self.modality_configs[embodiment_tag]["state"].mean_std_embedding_keys @@ -273,7 +309,10 @@ def unapply_state( # Reverse mean/std normalization elif ( - hasattr(self.modality_configs[embodiment_tag]["state"], "mean_std_embedding_keys") + hasattr( + self.modality_configs[embodiment_tag]["state"], + "mean_std_embedding_keys", + ) and self.modality_configs[embodiment_tag]["state"].mean_std_embedding_keys and joint_group in self.modality_configs[embodiment_tag]["state"].mean_std_embedding_keys @@ -609,21 +648,8 @@ def _convert_to_relative_action( assert reference_state.ndim == 1, f"Expected state shape (D,), got {reference_state.shape}" if action_type == ActionType.EEF: - assert action.shape[1] == 9, ( - f"Expected action dim 9 (xyz + rot6d) for EEF, got {action.shape[1]}" - ) - - action_chunking = EndEffectorActionChunk( - [ - EndEffectorPose(translation=m[:3], rotation=m[3:], rotation_type="rot6d") - for m in action - ] - ) - reference_frame = EndEffectorPose( - translation=reference_state[:3], - rotation=reference_state[3:], - rotation_type="rot6d", - ) + action_chunking = EndEffectorActionChunk.from_array(action, action_format) + reference_frame = EndEffectorPose.from_action_format(reference_state, action_format) elif action_type == ActionType.NON_EEF: action_chunking = JointActionChunk([JointPose(m) for m in action]) @@ -652,21 +678,8 @@ def _convert_to_absolute_action( ) if action_type == ActionType.EEF: - assert action.shape[1] == 9, ( - f"Expected action dim 9 (xyz + rot6d) for EEF, got {action.shape[1]}" - ) - - rel_action = EndEffectorActionChunk( - [ - EndEffectorPose(translation=m[:3], rotation=m[3:], rotation_type="rot6d") - for m in action - ] - ) - reference_frame = EndEffectorPose( - translation=reference_state[:3], - rotation=reference_state[3:], - rotation_type="rot6d", - ) + rel_action = EndEffectorActionChunk.from_array(action, action_format) + reference_frame = EndEffectorPose.from_action_format(reference_state, action_format) elif action_type == ActionType.NON_EEF: rel_action = JointActionChunk([JointPose(pose) for pose in action]) diff --git a/gr00t/data/stats.py b/gr00t/data/stats.py index f30d25f14..7f97c0ee9 100644 --- a/gr00t/data/stats.py +++ b/gr00t/data/stats.py @@ -1,18 +1,40 @@ #!/usr/bin/env python + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """ Calculate dataset statistics for LeRobot datasets. -Note: Please update the `gr00t/configs/data/embodiment_configs.py` file with the correct modality configurations for the dataset you are using before running this script. Usage: - python gr00t/data/stats.py + python gr00t/data/stats.py --dataset-path --embodiment-tag + python gr00t/data/stats.py --dataset-path --embodiment-tag --modality-config-path Args: dataset_path: Path to the dataset. - embodiment_tag: Embodiment tag to use to load modality configurations from `gr00t/configs/data/embodiment_configs.py`. + embodiment_tag: Embodiment tag to use to load modality configurations. + modality_config_path: Optional path to a .py config file for custom embodiment tags not in the built-in registry. """ +import hashlib import json +import logging +import os from pathlib import Path +import tempfile +from typing import Any import numpy as np import pandas as pd @@ -31,6 +53,86 @@ LE_ROBOT_STATS_FILENAME = "meta/stats.json" LE_ROBOT_REL_STATS_FILENAME = "meta/relative_stats.json" +logger = logging.getLogger(__name__) + +# Reserved top-level key, used inside both ``relative_stats.json`` and +# ``stats.json``, mapping ``entry_name -> fingerprint``. Sits next to the +# per-entry stat dicts; in-tree consumers always look up entries by name, so +# the reserved key does not collide. +STATS_FINGERPRINTS_KEY = "__fingerprints__" + + +def _load_stats_cache(path: Path) -> dict[str, Any]: + """Load a stats JSON cache, treating any unreadable state as "no cache". + + A stats file becomes unreadable when a previous writer was killed mid-flush + (ENOSPC, SIGKILL, runner reboot) and left a 0-byte / truncated file behind. + Without this guard, the leftover file traps every subsequent caller in a + ``json.JSONDecodeError`` until a human deletes it — observed taking down 6 + of 8 retried test.unit.gpu jobs after a /shared NFS ENOSPC event. + + Empty file, missing file, JSON parse error, and OSError are all treated + equivalently: regenerate from scratch. Callers MUST then write back via + :func:`_dump_stats_cache_atomic` so the same partial-write scenario does + not recur on the very next ENOSPC. + """ + try: + if not path.exists() or path.stat().st_size == 0: + return {} + with open(path, "r") as f: + return json.load(f) + except (json.JSONDecodeError, OSError) as exc: + logger.warning("[stats] discarding unreadable cache %s: %s; regenerating", path, exc) + return {} + + +def _dump_stats_cache_atomic(path: Path, data: dict[str, Any], *, indent: int | None = 4) -> None: + """Atomically write *data* as JSON to *path* via tmp-file + ``os.replace``. + + Avoids the leave-a-0-byte-file failure mode that motivates + :func:`_load_stats_cache`: ``open(path, "w")`` truncates immediately, so a + SIGKILL between truncate and the final ``write()`` poisons the cache for + every future caller. Writing to a unique sibling temp file and then + ``os.replace`` guarantees that *path* either points to the previous valid + content (writer killed) or to the new fully-flushed content (writer + succeeded) — never to a partial intermediate. + + The temp filename must be unique per writer. CI can run multiple GPU jobs + against the same cached dataset path, and a fixed ``.tmp`` lets one + writer rename or clean up another writer's temp file. + + Best-effort cleanup of the tmp file on exception so we don't litter + ``meta/`` with abandoned ``*.tmp`` shards. + + NFS durability: explicitly ``flush`` + ``fsync`` before ``os.replace`` so + the tmp file's bytes are forced from the page cache to the storage + backend before the rename makes the new name visible. Without this, a + SIGKILL between a successful ``os.replace`` and the kernel's writeback + can still leave a 0-byte file on NFS after a client reconnect — the + very failure mode this helper exists to prevent. + """ + tmp: Path | None = None + try: + with tempfile.NamedTemporaryFile( + "w", + dir=path.parent, + prefix=f".{path.name}.", + suffix=".tmp", + delete=False, + ) as f: + tmp = Path(f.name) + json.dump(data, f, indent=indent) + f.flush() + os.fsync(f.fileno()) + os.replace(tmp, path) + except BaseException: + if tmp is not None: + try: + tmp.unlink() + except OSError: + pass + raise + def calculate_dataset_statistics( parquet_paths: list[Path], features: list[str] | None = None @@ -78,40 +180,115 @@ def calculate_dataset_statistics( return dataset_statistics +def _compute_stats_fingerprint(feature_name: str, feature_meta: dict) -> str: + """Hash the per-feature schema in ``info.json`` that drives ``calculate_dataset_statistics``. + + Without this, ``meta/stats.json`` was reused whenever every feature name was + still present, even if the underlying ``dtype`` / ``shape`` had changed + (e.g. column dim grew, dtype widened). Result: silently wrong normalization + at training/eval time. Hashing the per-feature schema makes any such change + invalidate just that feature's cached entry. + """ + payload = { + "feature": feature_name, + "dtype": feature_meta.get("dtype"), + "shape": feature_meta.get("shape"), + } + canonical = json.dumps(payload, sort_keys=True, separators=(",", ":")) + return "sha256:" + hashlib.sha256(canonical.encode("utf-8")).hexdigest() + + +def _stale_features(stats: dict | None, le_features: dict, lowdim_features: list[str]) -> list[str]: + """Return the subset of ``lowdim_features`` whose cached entry is missing or stale. + + A feature is considered fresh iff its stat-dict has all six fields and its + fingerprint in ``__fingerprints__`` matches the canonical hash for its + current ``info.json`` schema. Anything else (missing info entry, missing + stat entry, missing stat field, missing fingerprint, mismatched + fingerprint) is treated as stale and recomputed. + """ + if stats is None: + return list(lowdim_features) + fingerprints = stats.get(STATS_FINGERPRINTS_KEY) + if not isinstance(fingerprints, dict): + fingerprints = {} + stale = [] + for feature in lowdim_features: + feature_meta = le_features.get(feature) + if feature_meta is None: + stale.append(feature) + continue + if feature not in stats or not isinstance(stats[feature], dict): + stale.append(feature) + continue + if any(k not in stats[feature] for k in ("mean", "std", "min", "max", "q01", "q99")): + stale.append(feature) + continue + if fingerprints.get(feature) != _compute_stats_fingerprint(feature, feature_meta): + stale.append(feature) + return stale + + def check_stats_validity(dataset_path: Path | str, features: list[str]): - stats_path = Path(dataset_path) / LE_ROBOT_STATS_FILENAME - if not stats_path.exists(): + """Return True iff every feature in ``features`` has a fingerprint-matching cached entry. + + A True result means ``generate_stats`` can skip recomputation entirely. We + re-derive the expected fingerprint from the *current* ``info.json`` so any + schema drift since the cache was written invalidates it. + """ + dataset_path = Path(dataset_path) + stats = _load_stats_cache(dataset_path / LE_ROBOT_STATS_FILENAME) + if not stats: + return False + info_path = dataset_path / LE_ROBOT_INFO_FILENAME + if not info_path.exists(): return False - with open(stats_path, "r") as f: - stats = json.load(f) - for feature in features: - if feature not in stats: - return False - if not isinstance(stats[feature], dict): - return False - for stat in ["mean", "std", "min", "max", "q01", "q99"]: - if stat not in stats[feature]: - return False - return True + with open(info_path, "r") as f: + le_features = json.load(f).get("features", {}) + return not _stale_features(stats, le_features, features) def generate_stats(dataset_path: Path | str): dataset_path = Path(dataset_path) print(f"Generating stats for {str(dataset_path)}") - lowdim_features = [] with open(dataset_path / LE_ROBOT_INFO_FILENAME, "r") as f: le_features = json.load(f)["features"] - for feature in le_features: - if "float" in le_features[feature]["dtype"]: - lowdim_features.append(feature) - if check_stats_validity(dataset_path, lowdim_features): + lowdim_features = [f for f in le_features if "float" in le_features[f]["dtype"]] + + stats_path = dataset_path / LE_ROBOT_STATS_FILENAME + existing = _load_stats_cache(stats_path) + stale = _stale_features(existing, le_features, lowdim_features) + + # Pull the reserved sidecar aside so the cleanup pass below can iterate + # ``existing`` cleanly. Drop entries for features that no longer exist in + # info.json (e.g. a sensor / DOF was removed in an upstream dataset rev) + # so the on-disk file stays consistent with info.json under feature + # churn — otherwise stale stat dicts accumulate without bound on shared + # NFS. Any non-stat-dict, non-sidecar key is owned by an external writer + # and is left untouched. + fingerprints = existing.pop(STATS_FINGERPRINTS_KEY, None) + if not isinstance(fingerprints, dict): + fingerprints = {} + lowdim_set = set(lowdim_features) + dropped = False + for f in [k for k in list(existing) if k not in lowdim_set and isinstance(existing[k], dict)]: + del existing[f] + dropped = True + for f in [k for k in list(fingerprints) if k not in lowdim_set]: + del fingerprints[f] + dropped = True + + if not stale and not dropped: return parquet_files = list(dataset_path.glob(LE_ROBOT_DATA_FILENAME)) - stats = calculate_dataset_statistics(parquet_files, lowdim_features) - stats_path = dataset_path / LE_ROBOT_STATS_FILENAME - with open(stats_path, "w") as f: - json.dump(stats, f, indent=4) + fresh = calculate_dataset_statistics(parquet_files, stale) if stale else {} + for feature, values in fresh.items(): + existing[feature] = values + fingerprints[feature] = _compute_stats_fingerprint(feature, le_features[feature]) + + existing[STATS_FINGERPRINTS_KEY] = fingerprints + _dump_stats_cache_atomic(stats_path, existing) class RelativeActionLoader: @@ -166,26 +343,12 @@ def load_relative_actions(self, trajectory_id: int) -> list[np.ndarray]: last_state = state_data[state_ind] actions = action_data[action_inds] if self.action_config.type == ActionType.EEF: - # raise NotImplementedError("EEF action is not yet supported") - assert len(last_state) == 9 # xyz + rot6d - assert actions.shape[1] == 9 # xyz + rot6d - - reference_frame = EndEffectorPose( - translation=last_state[:3], - rotation=last_state[3:], - rotation_type="rot6d", - ) - - traj = EndEffectorActionChunk( - [ - EndEffectorPose(translation=m[:3], rotation=m[3:], rotation_type="rot6d") - for m in actions - ] - ).relative_chunking(reference_frame=reference_frame) - - raise NotImplementedError( - "EEF action is not yet supported, need to handle rotation transformation based on action format" + action_format = self.action_config.format + reference_frame = EndEffectorPose.from_action_format(last_state, action_format) + traj = EndEffectorActionChunk.from_array(actions, action_format).relative_chunking( + reference_frame=reference_frame ) + trajectories.append(traj.to(action_format).astype(np.float32)) elif self.action_config.type == ActionType.NON_EEF: reference_frame = JointPose(last_state) traj = JointActionChunk([JointPose(m) for m in actions]).relative_chunking( @@ -222,6 +385,33 @@ def calculate_stats_for_key( } +def _compute_relative_action_fingerprint(embodiment_tag: EmbodimentTag, action_key: str) -> str: + """Hash the inputs that change ``calculate_stats_for_key``'s output. + + Cached entries in ``relative_stats.json`` are only safe to reuse when every + such input matches what they were computed under. A stats file produced for + one ``(delta_indices, format, state_key, ...)`` combo would otherwise be + silently reused for a different combo with the same ``action_key`` name, + leading to wrong normalization without any error. + """ + action_modality = MODALITY_CONFIGS[embodiment_tag.value]["action"] + state_modality = MODALITY_CONFIGS[embodiment_tag.value]["state"] + idx = action_modality.modality_keys.index(action_key) + action_config = action_modality.action_configs[idx] + payload = { + "embodiment_tag": embodiment_tag.value, + "action_key": action_key, + "action_delta_indices": list(action_modality.delta_indices), + "state_delta_indices": list(state_modality.delta_indices), + "rep": action_config.rep.name, + "type": action_config.type.name, + "format": action_config.format.name, + "state_key": action_config.state_key, + } + canonical = json.dumps(payload, sort_keys=True, separators=(",", ":")) + return "sha256:" + hashlib.sha256(canonical.encode("utf-8")).hexdigest() + + def generate_rel_stats(dataset_path: Path | str, embodiment_tag: EmbodimentTag) -> None: dataset_path = Path(dataset_path) action_config = MODALITY_CONFIGS[embodiment_tag.value]["action"] @@ -233,21 +423,54 @@ def generate_rel_stats(dataset_path: Path | str, embodiment_tag: EmbodimentTag) if action_config.rep == ActionRepresentation.RELATIVE ] stats_path = Path(dataset_path) / LE_ROBOT_REL_STATS_FILENAME - if stats_path.exists(): - with open(stats_path, "r") as f: - stats = json.load(f) - else: - stats = {} + stats = _load_stats_cache(stats_path) + fingerprints = stats.setdefault(STATS_FINGERPRINTS_KEY, {}) for action_key in sorted(action_keys): - if action_key in stats: + expected_fp = _compute_relative_action_fingerprint(embodiment_tag, action_key) + if action_key in stats and fingerprints.get(action_key) == expected_fp: continue print(f"Generating relative stats for {dataset_path} {embodiment_tag} {action_key}") stats[action_key] = calculate_stats_for_key(dataset_path, embodiment_tag, action_key) - with open(stats_path, "w") as f: - json.dump(to_json_serializable(dict(stats)), f, indent=4) + fingerprints[action_key] = expected_fp + _dump_stats_cache_atomic(stats_path, to_json_serializable(dict(stats))) -def main(dataset_path: Path | str, embodiment_tag: EmbodimentTag): +def main( + dataset_path: Path | str, + embodiment_tag: EmbodimentTag, + modality_config_path: str | None = None, +): + """Generate dataset statistics. + + Args: + dataset_path: Path to the dataset. + embodiment_tag: Embodiment tag for modality configurations. + modality_config_path: Optional path to a .py modality config file. Required for custom + embodiment tags not in the built-in MODALITY_CONFIGS registry. + """ + if modality_config_path is not None: + import importlib + import sys + + config_path = Path(modality_config_path) + if config_path.exists() and config_path.suffix == ".py": + sys.path.append(str(config_path.parent)) + importlib.import_module(config_path.stem) + print(f"Loaded modality config: {config_path}") + else: + raise FileNotFoundError( + f"Modality config path does not exist or is not a .py file: {modality_config_path}" + ) + # Custom tags (e.g. NEW_EMBODIMENT) are only in MODALITY_CONFIGS once a + # --modality-config-path registers them; fail here instead of a bare KeyError + # deep in generate_rel_stats (and before generate_stats writes a partial set). + if embodiment_tag.value not in MODALITY_CONFIGS: + raise ValueError( + f"No built-in modality config for embodiment tag '{embodiment_tag.name}' " + f"(value='{embodiment_tag.value}'). Available tags: {sorted(MODALITY_CONFIGS.keys())}. " + f"Pass --modality-config-path (e.g. examples/SO100/so100_config.py) " + f"for custom embodiments." + ) generate_stats(dataset_path) generate_rel_stats(dataset_path, embodiment_tag) diff --git a/gr00t/data/types.py b/gr00t/data/types.py index 445439a95..7bd6d5fe5 100644 --- a/gr00t/data/types.py +++ b/gr00t/data/types.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from dataclasses import dataclass, field from enum import Enum from typing import Any @@ -47,6 +62,7 @@ class VLAStepData: str, np.ndarray ] # state_name -> np.ndarray (dim,) for single step or (horizon, dim) for trajectory actions: dict[str, np.ndarray] # action_name -> np.ndarray (horizon, dim) for action chunk + masks: dict[str, list[np.ndarray]] | None = None # view_name -> list[np.ndarray] (H, W) text: str | None = None # Optional task description or instruction embodiment: EmbodimentTag = ( EmbodimentTag.NEW_EMBODIMENT @@ -84,7 +100,15 @@ class ModalityConfig: action_configs: list[ActionConfig] | None = None def __post_init__(self): - """Set default values for action-related fields if not specified.""" + """Validate fields and set default values.""" + if self.delta_indices is None or not isinstance(self.delta_indices, list): + raise ValueError(f"delta_indices must be a non-None list, got {self.delta_indices!r}") + if ( + self.modality_keys is None + or not isinstance(self.modality_keys, list) + or len(self.modality_keys) == 0 + ): + raise ValueError(f"modality_keys must be a non-empty list, got {self.modality_keys!r}") if self.action_configs is not None: assert len(self.action_configs) == len(self.modality_keys), ( f"Number of action configs ({len(self.action_configs)}) must match number of modality keys ({len(self.modality_keys)})" diff --git a/gr00t/data/utils.py b/gr00t/data/utils.py index 69eab619a..bf83902d4 100644 --- a/gr00t/data/utils.py +++ b/gr00t/data/utils.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from dataclasses import asdict, is_dataclass from enum import Enum from typing import Any @@ -278,6 +293,32 @@ def to_json_serializable(obj: Any) -> Any: return str(obj) +def parse_observation_gr00t( + obs: dict[str, Any], modality_configs: dict[str, Any] +) -> dict[str, Any]: + """Reshape a flat ``{modality.key: value}`` observation into the nested, + batched ``{modality: {key: value}}`` form a GR00T policy expects. + + Adds a leading batch dimension (``arr[None, :]``; strings become ``[[s]]``). + Shared by the eval, standalone-inference, and ONNX-export paths so they + cannot drift on modality set / key naming / batching. + """ + new_obs = {} + for modality in ["video", "state", "language"]: + new_obs[modality] = {} + for key in modality_configs[modality].modality_keys: + if modality == "language": + parsed_key = key + else: + parsed_key = f"{modality}.{key}" + arr = obs[parsed_key] + if isinstance(arr, str): + new_obs[modality][key] = [[arr]] + else: + new_obs[modality][key] = arr[None, :] + return new_obs + + def parse_modality_configs( modality_configs: dict[str, dict[str, ModalityConfig]], ) -> dict[str, dict[str, ModalityConfig]]: diff --git a/gr00t/deployment/__init__.py b/gr00t/deployment/__init__.py new file mode 100644 index 000000000..a08dd99ee --- /dev/null +++ b/gr00t/deployment/__init__.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Shared types for the deployment scripts under ``scripts/deployment``. + +``scripts/deployment`` is not an importable package, so anything the +CLIs share lives here and is reached via the ``gr00t.*`` namespace. +""" diff --git a/gr00t/deployment/modes.py b/gr00t/deployment/modes.py new file mode 100644 index 000000000..999f15cb1 --- /dev/null +++ b/gr00t/deployment/modes.py @@ -0,0 +1,167 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Single source of truth for the deployment CLIs' shared mode-flag value sets. + +``scripts/deployment`` is not an importable package, so every value set +shared across the CLIs lives here and is imported via ``gr00t.*``. A CLI +never re-authors these strings — it imports the enum or fails on a name +that does not exist, so cross-file drift is not expressible. + +Each mode flag is one enum here, imported by its CLI. The enums hold the +legitimate *subset* each tool supports (the tools really do run different +subsets — that is genuine capability, not duplication): + +- :class:`ExportMode` — the two ``export_mode`` CLIs (``export_onnx_n1d7``, + ``build_trt_pipeline``). +- :class:`VerifyMode` — ``verify_n1d7_trt`` ``--mode``. +- :class:`BenchmarkMode` — ``benchmark_inference`` ``--trt-mode``. +- :class:`BuildEngineMode` — ``build_tensorrt_engine`` ``--mode``. +- :class:`InferenceMode` — ``setup_tensorrt_engines(mode=...)``, shared by the + sim-eval rollout ``--trt-mode`` and ``standalone_inference_script``. + +Each member's value equals its name (via :func:`_generate_next_value_`), so +``tyro`` keeps the value-form CLI surface unchanged (``--mode full_pipeline``, +not ``--mode FULL_PIPELINE``) — no CLI/README/docstring edits needed when +switching from a ``Literal``. +""" + +from __future__ import annotations + +from dataclasses import dataclass +import enum + + +class _StrEnum(str, enum.Enum): + """``enum.StrEnum`` compatibility shim for older Python deployments. + + Members are ``str`` subclasses whose value equals their name, so ``==``, + ``in``, dict-keying, JSON, f-strings, and ``tyro`` choices all see the bare + value. ``__str__`` is restored to ``str``'s so ``str()``/``%s`` yield the + value rather than ``ClassName.member``. + """ + + @staticmethod + def _generate_next_value_(name, start, count, last_values): + return name + + __str__ = str.__str__ + + +class ExportMode(_StrEnum): + """Allowed values for the ``--export-mode`` flag, shared by the two + ``export_mode`` CLIs.""" + + dit_only = enum.auto() + action_head = enum.auto() + full_pipeline = enum.auto() + + +class VerifyMode(_StrEnum): + """Allowed values for ``verify_n1d7_trt`` ``--mode``.""" + + dit_only = enum.auto() + action_head = enum.auto() + n17_full_pipeline = enum.auto() + vit_llm_only = enum.auto() + + +class BenchmarkMode(_StrEnum): + """Allowed values for ``benchmark_inference`` ``--trt-mode``.""" + + dit_only = enum.auto() + n17_full_pipeline = enum.auto() + vit_llm_only = enum.auto() + + +class InferenceMode(_StrEnum): + """Engine subset ``setup_tensorrt_engines`` swaps onto a policy at inference + time. Shared by the sim-eval rollout CLI (``--trt-mode``) and + ``standalone_inference_script``; its members are exactly the modes + ``setup_tensorrt_engines`` dispatches on.""" + + dit_only = enum.auto() + action_head = enum.auto() + vit_llm_only = enum.auto() + n17_full_pipeline = enum.auto() + + +class BuildEngineMode(_StrEnum): + """Allowed values for ``build_tensorrt_engine`` ``--mode``.""" + + single = enum.auto() + full_pipeline = enum.auto() + + +# --------------------------------------------------------------------------- +# Pipeline component table (shared by the build + pipeline CLIs) +# --------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class PipelineComponent: + """One N1.7 pipeline component: its display name, the ONNX filename + candidates the exporter may write for it, and the built engine filename.""" + + name: str + onnx_candidates: tuple[str, ...] + engine: str + + +# One row per N1.7 pipeline component, in build order. ``build_full_pipeline`` +# builds from this; ``build_trt_pipeline`` derives the per-export-mode expected +# subset from it; the deployment tests bind it against the verify-side loaders. +FULL_PIPELINE_COMPONENTS: tuple[PipelineComponent, ...] = ( + PipelineComponent("ViT", ("vit_fp32.onnx", "vit_bf16.onnx"), "vit.engine"), + PipelineComponent("LLM", ("llm_bf16.onnx",), "llm_bf16.engine"), + PipelineComponent("VL Self-Attention", ("vl_self_attention.onnx",), "vl_self_attention.engine"), + PipelineComponent("State Encoder", ("state_encoder.onnx",), "state_encoder.engine"), + PipelineComponent("Action Encoder", ("action_encoder.onnx",), "action_encoder.engine"), + PipelineComponent("DiT", ("dit_bf16.onnx",), "dit_bf16.engine"), + PipelineComponent("Action Decoder", ("action_decoder.onnx",), "action_decoder.engine"), +) + +# Components each ``ExportMode`` writes ONNX for — must stay in sync with the +# export branches in ``export_onnx_n1d7.main`` (Step 4). The build stage must +# require *exactly* this subset: ``action_head`` keeps ViT/LLM/VL-SA in PyTorch, +# so demanding the full 7 makes its build fail with a misleading "missing ONNX". +EXPORT_MODE_COMPONENTS: dict[ExportMode, frozenset[str]] = { + ExportMode.dit_only: frozenset({"DiT"}), + ExportMode.action_head: frozenset({"State Encoder", "Action Encoder", "DiT", "Action Decoder"}), + ExportMode.full_pipeline: frozenset(c.name for c in FULL_PIPELINE_COMPONENTS), +} + +# Per ``export_mode``, the (build, verify, benchmark) mode each downstream stage +# runs in ``build_trt_pipeline``. One selector fans out to three sibling +# stage-modes that each consume a *different* engine set; the binding between +# this table and the component sets above is enforced by +# ``tests/scripts/deployment/test_trt_pipeline_modes.py``. +PIPELINE_STAGE_MODES: dict[ExportMode, tuple[BuildEngineMode, VerifyMode, BenchmarkMode]] = { + ExportMode.full_pipeline: ( + BuildEngineMode.full_pipeline, + VerifyMode.n17_full_pipeline, + BenchmarkMode.n17_full_pipeline, + ), + ExportMode.action_head: ( + BuildEngineMode.full_pipeline, + VerifyMode.action_head, + BenchmarkMode.dit_only, + ), + ExportMode.dit_only: ( + BuildEngineMode.single, + VerifyMode.dit_only, + BenchmarkMode.dit_only, + ), +} diff --git a/gr00t/eval/_horizon_contract.py b/gr00t/eval/_horizon_contract.py new file mode 100644 index 000000000..616fd8aab --- /dev/null +++ b/gr00t/eval/_horizon_contract.py @@ -0,0 +1,201 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Policy-resolved horizon / delta-indices contract for sim-eval and real-robot +consumers. See :class:`PolicyHorizonSpec`. + +(The DROID real-robot client makes the same open-loop-within-chunk check inline: +it runs on a slim robot install without the ``gr00t`` package and cannot import +this module — see ``examples/DROID/main_gr00t.py``.) +""" + +from __future__ import annotations + +from dataclasses import dataclass +import sys +from typing import Any, Sequence + +import numpy as np + + +_DEPRECATED_HORIZON_FLAGS = ("--action-horizon", "--action_horizon") + + +def migrate_deprecated_action_horizon_argv(argv: list[str] | None = None) -> bool: + """Rewrite the deprecated ``--action-horizon`` CLI flag to ``--execution-horizon``. + + ``--action-horizon`` used to name the open-loop *execution* stride on the + eval / inference scripts, colliding with the model-config ``action_horizon`` + (the predicted chunk length). The flag is now ``--execution-horizon``; this + keeps old invocations working for one deprecation cycle. Mutates ``argv`` + (default ``sys.argv``) in place and returns whether a rewrite happened, so + the caller can emit a deprecation warning. + """ + argv = sys.argv if argv is None else argv + rewritten = False + for i, tok in enumerate(argv): + for old in _DEPRECATED_HORIZON_FLAGS: + if tok == old: + argv[i] = "--execution-horizon" + rewritten = True + elif tok.startswith(old + "="): + argv[i] = "--execution-horizon=" + tok[len(old) + 1 :] + rewritten = True + return rewritten + + +def _as_int_tuple(x: Any) -> tuple[int, ...]: + """Collapse a list / ndarray / tuple of indices into a plain ``int`` tuple. + + A tuple keeps the contract hashable / picklable (it is passed to sim-env + worker subprocesses) and makes ``==`` comparisons return a bool rather than + an ndarray. + """ + if isinstance(x, np.ndarray): + return tuple(int(v) for v in x.tolist()) + return tuple(int(v) for v in x) + + +@dataclass(frozen=True) +class PolicyHorizonSpec: + """Single source of truth for the policy-coupled horizons that the sim-eval + wrapper and real-robot clients must agree on. + + Built from the policy's modality config (see :meth:`from_policy`), so the + observation-interface fields cannot drift from the policy. + + Fields: + n_action_steps: open-loop execution length — how many actions of the + predicted chunk are stepped before re-planning. The only tunable + knob; validated to lie in ``[1, action_horizon]``. Equals + ``action_horizon`` for full-chunk execution; a smaller value is + deliberate receding-horizon re-planning (e.g. LIBERO 8/16, GR1 8/40). + action_horizon: length of the predicted action chunk + (``len(action.delta_indices)``); the upper bound on + ``n_action_steps``. + video_delta_indices: per-step observation offsets for the video stream, + copied verbatim from the policy (e.g. ``(0,)`` single-frame, + ``(-15, 0)`` for DROID). Fed to ``MultiStepWrapper``. + state_delta_indices: the same for the proprio/state stream, or ``None`` + for a vision-only policy that has no state stream. + """ + + n_action_steps: int + action_horizon: int + video_delta_indices: tuple[int, ...] + state_delta_indices: tuple[int, ...] | None + + @classmethod + def from_policy( + cls, + policy: Any, + *, + n_action_steps: int | None = None, + ) -> "PolicyHorizonSpec": + """Resolve the spec from a policy exposing ``get_modality_config``. + + Args: + policy: any object with ``get_modality_config()`` returning a + ``{modality: ModalityConfig}`` mapping (``Gr00tSimPolicyWrapper``, + ``Gr00tPolicy``, ``PolicyClient``, ...). + n_action_steps: see the :attr:`n_action_steps` field. ``None`` + executes the full chunk (``n_action_steps == action_horizon``). + """ + return cls.from_modality_config( + policy.get_modality_config(), + n_action_steps=n_action_steps, + ) + + @classmethod + def from_modality_config( + cls, + modality_config: dict[str, Any], + *, + n_action_steps: int | None = None, + ) -> "PolicyHorizonSpec": + """Resolve the spec from a raw ``{modality: ModalityConfig}`` dict. + + ``n_action_steps`` is the open-loop execution length (see the + :attr:`n_action_steps` field); ``None`` defaults it to the full + ``action_horizon``. + """ + if "action" not in modality_config: + raise ValueError( + "policy modality config has no 'action' entry; cannot resolve " + "the action horizon. Available keys: " + f"{sorted(modality_config.keys())}." + ) + + action_delta = list(modality_config["action"].delta_indices) + action_horizon = len(action_delta) + if action_horizon < 1: + raise ValueError("policy declared an empty action.delta_indices.") + # MultiStepWrapper.step and the DROID client both index the predicted + # chunk linearly (chunk[i] is the i-th executed action), so the policy + # must predict a dense, contiguous window starting at 0. A sparse + # window (e.g. [0, 4, 8]) would silently execute the wrong rows. + if action_delta != list(range(action_horizon)): + raise ValueError( + f"action.delta_indices={action_delta} is not the contiguous " + f"range(0, {action_horizon}). Consumers index the predicted " + "action chunk linearly, so a sparse / shifted window would " + "silently execute the wrong actions." + ) + + if n_action_steps is None: + n_action_steps = action_horizon + else: + n_action_steps = int(n_action_steps) + if not (1 <= n_action_steps <= action_horizon): + raise ValueError( + f"n_action_steps={n_action_steps} must satisfy " + f"1 <= n_action_steps <= action_horizon={action_horizon}. " + "n > action_horizon would IndexError in MultiStepWrapper.step; " + "n < 1 would execute nothing." + ) + + video_delta_indices = _as_int_tuple(modality_config["video"].delta_indices) + + state_cfg = modality_config.get("state") + if state_cfg is not None and len(state_cfg.delta_indices) > 0: + state_delta_indices: tuple[int, ...] | None = _as_int_tuple(state_cfg.delta_indices) + else: + # Vision-only policy: no state stream. + state_delta_indices = None + + return cls( + n_action_steps=n_action_steps, + action_horizon=action_horizon, + video_delta_indices=video_delta_indices, + state_delta_indices=state_delta_indices, + ) + + @property + def video_delta_indices_array(self) -> np.ndarray: + """``video_delta_indices`` as the ndarray ``MultiStepWrapper`` expects.""" + return np.array(self.video_delta_indices) + + @property + def state_delta_indices_array(self) -> np.ndarray | None: + """``state_delta_indices`` as an ndarray, or ``None`` if vision-only.""" + if self.state_delta_indices is None: + return None + return np.array(self.state_delta_indices) + + +__all__: Sequence[str] = [ + "PolicyHorizonSpec", + "migrate_deprecated_action_horizon_argv", +] diff --git a/gr00t/eval/open_loop_eval.py b/gr00t/eval/open_loop_eval.py index 00e1c2f19..4461b8443 100644 --- a/gr00t/eval/open_loop_eval.py +++ b/gr00t/eval/open_loop_eval.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from copy import deepcopy from dataclasses import dataclass, field import logging @@ -9,6 +24,8 @@ from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader from gr00t.data.dataset.sharded_single_step_dataset import extract_step_data from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.utils import parse_observation_gr00t +from gr00t.eval._horizon_contract import PolicyHorizonSpec, migrate_deprecated_action_horizon_argv from gr00t.policy import BasePolicy from gr00t.policy.gr00t_policy import Gr00tPolicy from gr00t.policy.server_client import PolicyClient @@ -36,7 +53,7 @@ def plot_trajectory_results( traj_id: int, state_keys: list[str], action_keys: list[str], - action_horizon: int, + execution_horizon: int, save_plot_path: str, ) -> None: """ @@ -49,7 +66,7 @@ def plot_trajectory_results( traj_id: Trajectory ID state_keys: List of state modality keys action_keys: List of action modality keys - action_horizon: Action horizon used for inference + execution_horizon: Number of predicted-chunk steps executed per inference save_plot_path: Path to save the plot """ actual_steps = len(gt_action_across_time) @@ -88,9 +105,14 @@ def plot_trajectory_results( ax.plot(pred_action_across_time[:, action_idx], label="pred action") # put a dot every ACTION_HORIZON - for j in range(0, actual_steps, action_horizon): + for j in range(0, actual_steps, execution_horizon): if j == 0: - ax.plot(j, gt_action_across_time[j, action_idx], "ro", label="inference point") + ax.plot( + j, + gt_action_across_time[j, action_idx], + "ro", + label="inference point", + ) else: ax.plot(j, gt_action_across_time[j, action_idx], "ro") @@ -106,26 +128,6 @@ def plot_trajectory_results( plt.close() # Close the figure to free memory -def parse_observation_gr00t( - obs: dict[str, Any], modality_configs: dict[str, Any] -) -> dict[str, Any]: - new_obs = {} - for modality in ["video", "state", "language"]: - new_obs[modality] = {} - for key in modality_configs[modality].modality_keys: - if modality == "language": - parsed_key = key - else: - parsed_key = f"{modality}.{key}" - arr = obs[parsed_key] - # Add batch dimension - if isinstance(arr, str): - new_obs[modality][key] = [[arr]] - else: - new_obs[modality][key] = arr[None, :] - return new_obs - - def parse_action_gr00t(action: dict[str, Any]) -> dict[str, Any]: # Unbatch and add prefix return {f"action.{key}": action[key][0] for key in action} @@ -138,7 +140,7 @@ def evaluate_single_trajectory( embodiment_tag: EmbodimentTag, modality_keys: list[str] | None = None, steps=300, - action_horizon=16, + execution_horizon=16, save_plot_path=None, ): # Ensure steps doesn't exceed trajectory length @@ -157,9 +159,16 @@ def evaluate_single_trajectory( loader.modality_configs["action"].modality_keys if modality_keys is None else modality_keys ) + # Fail fast if the open-loop stride doesn't fit the model's predicted chunk + # (also rejects a non-contiguous action window, which the linear indexing + # below would silently mis-execute). + PolicyHorizonSpec.from_modality_config( + loader.modality_configs, n_action_steps=execution_horizon + ) + modality_configs = deepcopy(loader.modality_configs) modality_configs.pop("action") - for step_count in range(0, actual_steps, action_horizon): + for step_count in range(0, actual_steps, execution_horizon): data_point = extract_step_data(traj, step_count, modality_configs, embodiment_tag) logging.info(f"inferencing at step: {step_count}") obs = {} @@ -172,7 +181,7 @@ def evaluate_single_trajectory( parsed_obs = parse_observation_gr00t(obs, loader.modality_configs) _action_chunk, _ = policy.get_action(parsed_obs) action_chunk = parse_action_gr00t(_action_chunk) - for j in range(action_horizon): + for j in range(execution_horizon): # NOTE: concat_pred_action = action[f"action.{modality_keys[0]}"][j] # the np.atleast_1d is to ensure the action is a 1D array, handle where single value is returned concat_pred_action = np.concatenate( @@ -218,7 +227,7 @@ def extract_state_joints(traj: pd.DataFrame, columns: list[str]): traj_id=traj_id, state_keys=state_keys, action_keys=action_keys, - action_horizon=action_horizon, + execution_horizon=execution_horizon, save_plot_path=save_plot_path or f"/tmp/open_loop_eval/traj_{traj_id}.jpeg", ) @@ -241,14 +250,15 @@ class ArgsConfig: traj_ids: list[int] = field(default_factory=lambda: [0]) """List of trajectory IDs to evaluate.""" - action_horizon: int = 16 - """Action horizon to evaluate.""" + execution_horizon: int = 16 + """How many steps of each predicted action chunk to execute before re-planning + (must be <= the model's predicted chunk length).""" dataset_path: str = "demo_data/cube_to_bowl_5/" """Path to the dataset.""" - embodiment_tag: EmbodimentTag = EmbodimentTag.NEW_EMBODIMENT - """Embodiment tag to use.""" + embodiment_tag: str = "new_embodiment" + """Embodiment tag (name or value, case-insensitive). Run with --help to see known tags.""" model_path: str | None = None """Path to the model checkpoint.""" @@ -264,6 +274,7 @@ class ArgsConfig: def main(args: ArgsConfig): + args.embodiment_tag = EmbodimentTag.resolve(args.embodiment_tag) # Set up logging logging.basicConfig(level=logging.INFO) @@ -294,8 +305,19 @@ def main(args: ArgsConfig): model_path=local_model_path, device="cuda" if torch.cuda.is_available() else "cpu", ) + # Apply --denoising-steps: the action head reads num_inference_timesteps + # at sampling time. + policy.model.action_head.num_inference_timesteps = args.denoising_steps + logging.info(f"Using {args.denoising_steps} denoising steps") else: policy = PolicyClient(host=args.host, port=args.port) + if args.denoising_steps != ArgsConfig.denoising_steps: + logging.warning( + "--denoising-steps=%d is ignored when running against a remote " + "policy server; set the denoising steps on the server " + "(run_gr00t_server.py) instead.", + args.denoising_steps, + ) # Get the supported modalities for the policy modality = policy.get_modality_config() @@ -305,8 +327,6 @@ def main(args: ArgsConfig): dataset = LeRobotEpisodeLoader( dataset_path=args.dataset_path, modality_configs=modality, - video_backend="torchcodec", - video_backend_kwargs=None, ) logging.info(f"Dataset length: {len(dataset)}") @@ -328,7 +348,7 @@ def main(args: ArgsConfig): args.embodiment_tag, args.modality_keys, steps=args.steps, - action_horizon=args.action_horizon, + execution_horizon=args.execution_horizon, save_plot_path=args.save_plot_path, ) logging.info(f"MSE for trajectory {traj_id}: {mse}, MAE: {mae}") @@ -346,6 +366,8 @@ def main(args: ArgsConfig): if __name__ == "__main__": + if migrate_deprecated_action_horizon_argv(): + logging.warning("--action-horizon is deprecated; use --execution-horizon.") # Parse arguments using tyro config = tyro.cli(ArgsConfig) main(config) diff --git a/gr00t/eval/real_robot/SO100/eval_so100.py b/gr00t/eval/real_robot/SO100/eval_so100.py index 99e29af8f..892b59809 100644 --- a/gr00t/eval/real_robot/SO100/eval_so100.py +++ b/gr00t/eval/real_robot/SO100/eval_so100.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """ SO100 Real-Robot Gr00T Policy Evaluation Script @@ -25,23 +40,37 @@ import time from typing import Any, Dict, List -import draccus from gr00t.policy.server_client import PolicyClient - -# Importing various robot configs ensures CLI autocompletion works -from lerobot.cameras.opencv.configuration_opencv import OpenCVCameraConfig # noqa: F401 -from lerobot.robots import ( # noqa: F401 - Robot, - RobotConfig, - koch_follower, - make_robot_from_config, - so100_follower, - so101_follower, -) -from lerobot.utils.utils import init_logging, log_say import numpy as np +try: + import draccus + + # Importing various robot configs ensures CLI autocompletion works. + from lerobot.cameras.opencv.configuration_opencv import OpenCVCameraConfig # noqa: F401 + from lerobot.robots import ( # noqa: F401 + Robot, + RobotConfig, + koch_follower, + make_robot_from_config, + so100_follower, + so101_follower, + ) + from lerobot.utils.utils import init_logging, log_say +except ModuleNotFoundError as exc: + if exc.name is not None and ( + exc.name in {"draccus", "lerobot"} or exc.name.startswith("lerobot.") + ): + raise ModuleNotFoundError( + "SO100 real-robot evaluation uses its own client environment. Run " + "`cd gr00t/eval/real_robot/SO100 && uv venv && source .venv/bin/activate && " + "uv pip install -e . --verbose && uv pip install --no-deps -e ../../../../` " + "before launching eval_so100.py." + ) from None + raise + + def recursive_add_extra_dim(obs: Dict) -> Dict: """ Recursively add an extra dim to arrays or scalars. @@ -178,6 +207,20 @@ class EvalConfig: # ============================================================================= +def _select_action_steps(actions: List[Dict], action_horizon: int) -> List[Dict]: + """Return the first ``action_horizon`` steps of a policy action chunk. + + Raises if the policy produced fewer steps than requested so a misconfigured + horizon fails loudly instead of silently executing fewer steps than asked. + """ + if action_horizon > len(actions): + raise ValueError( + f"Configured action_horizon={action_horizon} exceeds the policy action " + f"chunk length {len(actions)}; the policy cannot supply that many steps." + ) + return actions[:action_horizon] + + @draccus.wrap() def eval(cfg: EvalConfig): """ @@ -227,7 +270,7 @@ def eval(cfg: EvalConfig): actions = policy.get_action(obs) - for i, action_dict in enumerate(actions[: cfg.action_horizon]): + for i, action_dict in enumerate(_select_action_steps(actions, cfg.action_horizon)): tic = time.time() print(f"action[{i}]: {action_dict}") # action_dict = { diff --git a/gr00t/eval/real_robot/SO100/pyproject.toml b/gr00t/eval/real_robot/SO100/pyproject.toml index 3e16ed23e..e93a5ac02 100644 --- a/gr00t/eval/real_robot/SO100/pyproject.toml +++ b/gr00t/eval/real_robot/SO100/pyproject.toml @@ -11,9 +11,11 @@ dependencies = [ "draccus", "matplotlib", "ipython", - "msgpack", + "msgpack==1.1.0", + "msgpack-numpy==0.4.8", + "transformers==4.57.3", "zmq", - "lerobot @ git+https://github.com/huggingface/lerobot.git@c75455a6de5c818fa1bb69fb2d92423e86c70475", + "lerobot[feetech] @ git+https://github.com/huggingface/lerobot.git@c75455a6de5c818fa1bb69fb2d92423e86c70475", ] # Please also manually install `uv pip install --no-deps -e ../../../../` diff --git a/gr00t/eval/rollout_policy.py b/gr00t/eval/rollout_policy.py index 4abd8e060..5a8d44bd7 100644 --- a/gr00t/eval/rollout_policy.py +++ b/gr00t/eval/rollout_policy.py @@ -1,19 +1,61 @@ -import argparse +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from collections import defaultdict +from contextlib import nullcontext from dataclasses import dataclass, field from functools import partial from pathlib import Path +import sys import time from typing import Any import uuid from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.deployment.modes import InferenceMode +from gr00t.eval._horizon_contract import PolicyHorizonSpec from gr00t.eval.sim.env_utils import get_embodiment_tag_from_env_name from gr00t.eval.sim.wrapper.multistep_wrapper import MultiStepWrapper from gr00t.policy import BasePolicy +from gr00t.utils.determinism import seed_everything import gymnasium as gym import numpy as np from tqdm import tqdm +import tyro + + +ROBOCASA_PANDA_RECORD_VIDEO_KEYS = ( + "video.res256_image_side_0", + "video.res256_image_side_1", + "video.res256_image_wrist_0", +) + +ROBOCASA365_PANDA_RECORD_VIDEO_KEYS = ( + "video.robot0_agentview_left", + "video.robot0_agentview_right", + "video.robot0_eye_in_hand", +) + +ROBOCASA_RECORD_VIDEO_KEYS_BY_PREFIX = { + "robocasa_panda_omron": ROBOCASA_PANDA_RECORD_VIDEO_KEYS, + "robocasa365_panda_omron": ROBOCASA365_PANDA_RECORD_VIDEO_KEYS, +} + +# Canonical per-episode step budget for the default (LIBERO) backend. Kept in one +# place so the CLI, video, and multi-step defaults cannot drift. +DEFAULT_MAX_EPISODE_STEPS = 720 @dataclass @@ -26,23 +68,15 @@ class VideoConfig: during rollout fps: Frames per second for the output video codec: Video codec to use for compression - input_pix_fmt: Input pixel format - crf: Constant Rate Factor for video compression (lower = better quality) - thread_type: Threading strategy for video encoding - thread_count: Number of threads to use for encoding """ video_dir: str | None = None steps_per_render: int = 2 - max_episode_steps: int = 720 + max_episode_steps: int = DEFAULT_MAX_EPISODE_STEPS fps: int = 20 codec: str = "h264" - input_pix_fmt: str = "rgb24" - crf: int = 22 - thread_type: str = "FRAME" - thread_count: int = 1 overlay_text: bool = True - n_action_steps: int = 8 + record_video_keys: tuple[str, ...] | None = None @dataclass @@ -50,16 +84,14 @@ class MultiStepConfig: """Configuration for multi-step environment settings. Attributes: - video_delta_indices: Indices of video observations to stack - state_delta_indices: Indices of state observations to stack - n_action_steps: Number of action steps to execute - max_episode_steps: Maximum number of steps per episode + contract: policy-resolved :class:`PolicyHorizonSpec` carrying + ``n_action_steps`` and the video / state delta-indices. + max_episode_steps: Maximum number of steps per episode. + terminate_on_success: End the episode once the task is reported solved. """ - video_delta_indices: np.ndarray = field(default_factory=lambda: np.array([0])) - state_delta_indices: np.ndarray = field(default_factory=lambda: np.array([0])) - n_action_steps: int = 16 - max_episode_steps: int = 720 + contract: PolicyHorizonSpec + max_episode_steps: int = DEFAULT_MAX_EPISODE_STEPS terminate_on_success: bool = False @@ -68,55 +100,13 @@ class WrapperConfigs: """Container for various environment wrapper configurations. Attributes: - video: Configuration for video recording - multistep: Configuration for multi-step processing + multistep: Configuration for multi-step processing (required; carries + the policy-resolved horizon contract). + video: Configuration for video recording. """ + multistep: MultiStepConfig video: VideoConfig = field(default_factory=VideoConfig) - multistep: MultiStepConfig = field(default_factory=MultiStepConfig) - - -def get_robocasa_env_fn( - env_name: str, -): - def env_fn(): - import os - - import robocasa # noqa: F401 - from robocasa.utils.gym_utils import GrootRoboCasaEnv # noqa: F401 - import robosuite # noqa: F401 - - os.environ["MUJOCO_GL"] = "egl" - return gym.make(env_name, enable_render=True) - - return env_fn - - -def get_groot_locomanip_env_fn( - env_name: str, -): - def env_fn(): - from gr00t_wbc.control.envs.robocasa.sync_env import SyncEnv # noqa: F401 - from gr00t_wbc.control.main.teleop.configs.configs import BaseConfig - from gr00t_wbc.control.utils.n1_utils import WholeBodyControlWrapper - import robocasa # noqa: F401 - - gym_env = gym.make( - env_name, - onscreen=False, - offscreen=True, - enable_waist=True, - randomize_cameras=False, - camera_names=[ - "robot0_oak_egoview", - "robot0_rs_tppview", - ], - ) - wbc_config = BaseConfig(wbc_version="gear_wbc", enable_waist=True).to_dict() - gym_env = WholeBodyControlWrapper(gym_env, wbc_config) - return gym_env - - return env_fn def get_simpler_env_fn( @@ -143,42 +133,41 @@ def env_fn(): return env_fn -def get_behavior_env_fn( +def get_robocasa_env_fn( env_name: str, - env_idx: int, - total_n_envs: int, + robocasa_split: str = "", ): def env_fn(): - from gr00t.eval.sim.BEHAVIOR.behavior_env import register_behavior_envs + kwargs = {} + if env_name.startswith("robocasa365_panda_omron/"): + import gr00t.eval.sim.robocasa365.gymnasium_groot # noqa: F401 - register_behavior_envs() - return gym.make(env_name, env_idx=env_idx, total_n_envs=total_n_envs) + if robocasa_split: + kwargs["split"] = robocasa_split + else: + import robocasa # noqa: F401 + import robocasa.utils.gym_utils.gymnasium_groot # noqa: F401 + + return gym.make(env_name, enable_render=True, **kwargs) return env_fn -def get_gym_env(env_name: str, env_idx: int, total_n_envs: int): +def get_gym_env(env_name: str, env_idx: int, total_n_envs: int, robocasa_split: str = ""): """Create Ray environment factory function without wrappers.""" env_embodiment = get_embodiment_tag_from_env_name(env_name) + env_prefix = env_name.split("/")[0] - if env_embodiment in ( - EmbodimentTag.GR1, - EmbodimentTag.ROBOCASA_PANDA_OMRON, - ): - env_fn = get_robocasa_env_fn(env_name) - - elif env_embodiment in (EmbodimentTag.UNITREE_G1,): - env_fn = get_groot_locomanip_env_fn(env_name) + if env_prefix in ("robocasa_panda_omron", "robocasa365_panda_omron", "gr1_unified"): + env_fn = get_robocasa_env_fn(env_name, robocasa_split=robocasa_split) - elif env_embodiment in (EmbodimentTag.OXE_GOOGLE, EmbodimentTag.OXE_WIDOWX): + elif env_embodiment in (EmbodimentTag.SIMPLER_ENV_GOOGLE, EmbodimentTag.SIMPLER_ENV_WIDOWX): env_fn = get_simpler_env_fn(env_name) elif env_embodiment in (EmbodimentTag.LIBERO_PANDA,): env_fn = get_libero_env_fn(env_name) - elif env_embodiment in (EmbodimentTag.BEHAVIOR_R1_PRO,): - env_fn = get_behavior_env_fn(env_name, env_idx, total_n_envs) else: raise ValueError(f"Invalid environment name: {env_name}") @@ -186,7 +175,11 @@ def get_gym_env(env_name: str, env_idx: int, total_n_envs: int): def create_eval_env( - env_name: str, env_idx: int, total_n_envs: int, wrapper_configs: WrapperConfigs + env_name: str, + env_idx: int, + total_n_envs: int, + wrapper_configs: WrapperConfigs, + robocasa_split: str = "", ) -> gym.Env: """Create a single evaluation environment with wrappers. @@ -198,59 +191,239 @@ def create_eval_env( Wrapped gymnasium environment """ - env = get_gym_env(env_name, env_idx, total_n_envs) + env = get_gym_env(env_name, env_idx, total_n_envs, robocasa_split=robocasa_split) if wrapper_configs.video.video_dir is not None: - from gr00t.eval.sim.wrapper.video_recording_wrapper import ( - VideoRecorder, - VideoRecordingWrapper, - ) + from gr00t.eval.sim.wrapper.video_recording_wrapper import VideoRecordingWrapper + + record_video_keys = wrapper_configs.video.record_video_keys + env_prefix = env_name.split("/")[0] + if record_video_keys is None: + record_video_keys = ROBOCASA_RECORD_VIDEO_KEYS_BY_PREFIX.get(env_prefix) - video_recorder = VideoRecorder.create_h264( - fps=wrapper_configs.video.fps, - codec=wrapper_configs.video.codec, - input_pix_fmt=wrapper_configs.video.input_pix_fmt, - crf=wrapper_configs.video.crf, - thread_type=wrapper_configs.video.thread_type, - thread_count=wrapper_configs.video.thread_count, - ) env = VideoRecordingWrapper( env, - video_recorder, video_dir=Path(wrapper_configs.video.video_dir), steps_per_render=wrapper_configs.video.steps_per_render, max_episode_steps=wrapper_configs.video.max_episode_steps, + fps=wrapper_configs.video.fps, + codec=wrapper_configs.video.codec, overlay_text=wrapper_configs.video.overlay_text, + record_video_keys=record_video_keys, ) env = MultiStepWrapper( env, - video_delta_indices=wrapper_configs.multistep.video_delta_indices, - state_delta_indices=wrapper_configs.multistep.state_delta_indices, - n_action_steps=wrapper_configs.multistep.n_action_steps, + contract=wrapper_configs.multistep.contract, max_episode_steps=wrapper_configs.multistep.max_episode_steps, terminate_on_success=wrapper_configs.multistep.terminate_on_success, ) return env +class _RobustAsyncVectorEnv(gym.vector.AsyncVectorEnv): + """AsyncVectorEnv that tolerates variable-shaped info arrays across envs. + + Gymnasium's default _add_info pre-allocates a numpy array based on the + first env's value shape and then assigns subsequent envs into it. When + envs return differently-shaped values (e.g. variable-length contact arrays) + the assignment raises ValueError. We catch that and fall back to a plain + Python list for that key so the rest of the step can proceed normally. + """ + + def _add_info(self, infos, info, env_num): + for k, v in info.items(): + if k not in infos: + infos[k] = [None] * self.num_envs + infos[f"_{k}"] = np.zeros(self.num_envs, dtype=bool) + if isinstance(infos[k], np.ndarray): + try: + infos[k][env_num] = v + except (ValueError, TypeError): + lst = list(infos[k]) + lst[env_num] = v + infos[k] = lst + else: + infos[k][env_num] = v + infos[f"_{k}"][env_num] = True + return infos + + +def _macro_step_env_steps(env_infos: dict, env_idx: int) -> int: + """Inner env-steps advanced by one macro-step for ``env_idx``. + + ``MultiStepWrapper`` records the number of inner ``super().step()`` calls in + ``info["n_env_steps"]``. The vector env relocates that info depending on the + gymnasium version: + + * gymnasium 0.29.1 (sim venvs) uses inline autoreset: a terminating step's + info is moved into ``final_info`` while the top-level info describes the + freshly reset env, which has **no** ``n_env_steps``. + * gymnasium >=1.0 keeps the terminating step's info at the top level. + + ``final_info`` is therefore consulted first; otherwise the terminal + macro-step is silently counted as 0 env-steps and ``episode_length`` + collapses to 0, tripping the zero-length-episode invariant downstream. + """ + final_info = env_infos.get("final_info") + if final_info is not None and final_info[env_idx] is not None: + step_info = final_info[env_idx] + if "n_env_steps" in step_info: + return int(step_info["n_env_steps"]) + if "n_env_steps" in env_infos: + # The key can be present with a None entry for this env; count 0 rather + # than calling int(None). + n_env_steps = env_infos["n_env_steps"][env_idx] + if n_env_steps is not None: + return int(n_env_steps) + return 0 + + +def _collect_rollout_episodes( + env, + policy: BasePolicy, + n_episodes: int, + n_envs: int, + seed: int | None, +): + """Run the rollout loop and return ``(successes, lengths, rewards, infos)``. + + Owns the progress bar and the initial / inter-episode env resets; the + caller owns env teardown so ``env.close()`` still runs if this raises. + """ + episode_lengths: list[int] = [] + episode_rewards: list[float] = [] + current_rewards = [0.0] * n_envs + current_lengths = [0] * n_envs + completed_episodes = 0 + current_successes = [False] * n_envs + episode_successes = [] + episode_infos = defaultdict(list) + + # Initial reset; if a seed is provided, give each sub-env a distinct but + # deterministic seed so that parallel workers don't all start from the + # same initial state while still being run-to-run reproducible. + if seed is not None: + reset_seeds = [int(seed) + i for i in range(n_envs)] + observations, _ = env.reset(seed=reset_seeds) + else: + observations, _ = env.reset() + policy.reset() + + pbar = tqdm(total=n_episodes, desc="Episodes") + try: + while completed_episodes < n_episodes: + actions, _ = policy.get_action(observations) + next_obs, rewards, terminations, truncations, env_infos = env.step(actions) + # NOTE (FY): Currently we don't properly handle policy reset. For now, our policy are stateless, + # but in the future if we need policy to be stateful, we need to detect env reset and call policy.reset() + for env_idx in range(n_envs): + if "success" in env_infos: + env_success = env_infos["success"][env_idx] + if isinstance(env_success, list): + env_success = np.any(env_success) + elif isinstance(env_success, np.ndarray): + env_success = np.any(env_success) + elif isinstance(env_success, bool): + env_success = env_success + elif isinstance(env_success, int): + env_success = bool(env_success) + else: + raise ValueError(f"Unknown success dtype: {type(env_success)}") + current_successes[env_idx] |= bool(env_success) + else: + current_successes[env_idx] = False + + if "final_info" in env_infos and env_infos["final_info"][env_idx] is not None: + env_success = env_infos["final_info"][env_idx]["success"] + if isinstance(env_success, list): + env_success = any(env_success) + elif isinstance(env_success, np.ndarray): + env_success = np.any(env_success) + elif isinstance(env_success, bool): + env_success = env_success + elif isinstance(env_success, int): + env_success = bool(env_success) + else: + raise ValueError(f"Unknown success dtype: {type(env_success)}") + current_successes[env_idx] |= bool(env_success) + current_rewards[env_idx] += rewards[env_idx] + current_lengths[env_idx] += _macro_step_env_steps(env_infos, env_idx) + + # If episode ended, store results + if terminations[env_idx] or truncations[env_idx]: + if "final_info" in env_infos: + current_successes[env_idx] |= any( + env_infos["final_info"][env_idx]["success"] + ) + if "task_progress" in env_infos: + episode_infos["task_progress"].append( + env_infos["task_progress"][env_idx][-1] + ) + if "q_score" in env_infos: + episode_infos["q_score"].append(np.max(env_infos["q_score"][env_idx])) + if "valid" in env_infos: + episode_infos["valid"].append(all(env_infos["valid"][env_idx])) + # Accumulate per-episode results. Both lists are captured + # BEFORE the per-env trackers are reset to 0 below — without + # this ordering downstream consumers silently see + # episode_length=0 / episode_reward=0.0. + episode_lengths.append(current_lengths[env_idx]) + episode_rewards.append(float(current_rewards[env_idx])) + episode_successes.append(current_successes[env_idx]) + # Reset trackers for this environment. + current_successes[env_idx] = False + # only update completed_episodes if valid + if "valid" in episode_infos: + if episode_infos["valid"][-1]: + completed_episodes += 1 + pbar.update(1) + else: + # envs don't return valid + completed_episodes += 1 + pbar.update(1) + # Reset with `0.0` to match the `[0.0] * n_envs` init and the + # `float(...)` cast above; otherwise the per-env entry's + # static type silently flips int <-> float across iterations. + current_rewards[env_idx] = 0.0 + current_lengths[env_idx] = 0 + observations = next_obs + + # Best-effort: a failed final reset must not skip the caller's env.close(). + try: + env.reset() + except Exception as reset_err: + print(f"Final env.reset() before close failed; closing env anyway: {reset_err}") + finally: + pbar.close() + + return episode_successes, episode_lengths, episode_rewards, episode_infos + + def run_rollout_gymnasium_policy( env_name: str, policy: BasePolicy, wrapper_configs: WrapperConfigs, n_episodes: int = 10, n_envs: int = 1, + seed: int | None = None, + robocasa_split: str = "", ) -> Any: """Run policy rollouts in parallel environments. Args: env_name: Name of the gymnasium environment to use - policy_fn: Function that creates a policy instance + policy: Policy instance n_episodes: Number of episodes to run n_envs: Number of parallel environments wrapper_configs: Configuration for environment wrappers - ray_env: Whether to use ray gym env to create each env. + seed: If set, forwards per-env seeds (``seed+i``) to the first + ``env.reset`` so each sub-env is reproducible. Should be paired + with :func:`gr00t.utils.determinism.seed_everything` upstream to + also constrain policy-side RNGs. Returns: - Collection results from running the episodes + ``(env_name, episode_successes, episode_infos)``. ``episode_lengths`` + in ``episode_infos`` is in **env-steps** (inner ``super().step()`` + calls), the same unit as ``MultiStepWrapper.max_episode_steps``. """ start_time = time.time() n_episodes = max(n_episodes, n_envs) @@ -263,6 +436,7 @@ def run_rollout_gymnasium_policy( env_name=env_name, total_n_envs=n_envs, wrapper_configs=wrapper_configs, + robocasa_split=robocasa_split, ) for idx in range(n_envs) ] @@ -270,104 +444,44 @@ def run_rollout_gymnasium_policy( if n_envs == 1: env = gym.vector.SyncVectorEnv(env_fns) else: - env = gym.vector.AsyncVectorEnv( + env = _RobustAsyncVectorEnv( env_fns, shared_memory=False, context="spawn", ) - # Storage for results - episode_lengths = [] - current_rewards = [0] * n_envs - current_lengths = [0] * n_envs - completed_episodes = 0 - current_successes = [False] * n_envs - episode_successes = [] - episode_infos = defaultdict(list) - - # Initial reset - observations, _ = env.reset() - policy.reset() - i = 0 - - pbar = tqdm(total=n_episodes, desc="Episodes") - while completed_episodes < n_episodes: - actions, _ = policy.get_action(observations) - next_obs, rewards, terminations, truncations, env_infos = env.step(actions) - # NOTE (FY): Currently we don't properly handle policy reset. For now, our policy are stateless, - # but in the future if we need policy to be stateful, we need to detect env reset and call policy.reset() - i += 1 - # Update episode tracking - for env_idx in range(n_envs): - if "success" in env_infos: - env_success = env_infos["success"][env_idx] - if isinstance(env_success, list): - env_success = np.any(env_success) - elif isinstance(env_success, np.ndarray): - env_success = np.any(env_success) - elif isinstance(env_success, bool): - env_success = env_success - elif isinstance(env_success, int): - env_success = bool(env_success) - else: - raise ValueError(f"Unknown success dtype: {type(env_success)}") - current_successes[env_idx] |= bool(env_success) - else: - current_successes[env_idx] = False - - if "final_info" in env_infos and env_infos["final_info"][env_idx] is not None: - env_success = env_infos["final_info"][env_idx]["success"] - if isinstance(env_success, list): - env_success = any(env_success) - elif isinstance(env_success, np.ndarray): - env_success = np.any(env_success) - elif isinstance(env_success, bool): - env_success = env_success - elif isinstance(env_success, int): - env_success = bool(env_success) - else: - raise ValueError(f"Unknown success dtype: {type(env_success)}") - current_successes[env_idx] |= bool(env_success) - current_rewards[env_idx] += rewards[env_idx] - current_lengths[env_idx] += 1 - - # If episode ended, store results - if terminations[env_idx] or truncations[env_idx]: - if "final_info" in env_infos: - current_successes[env_idx] |= any(env_infos["final_info"][env_idx]["success"]) - if "task_progress" in env_infos: - episode_infos["task_progress"].append(env_infos["task_progress"][env_idx][-1]) - if "q_score" in env_infos: - episode_infos["q_score"].append(np.max(env_infos["q_score"][env_idx])) - if "valid" in env_infos: - episode_infos["valid"].append(all(env_infos["valid"][env_idx])) - # Accumulate results - episode_lengths.append(current_lengths[env_idx]) - episode_successes.append(current_successes[env_idx]) - # Reset trackers for this environment. - current_successes[env_idx] = False - # only update completed_episodes if valid - if "valid" in episode_infos: - if episode_infos["valid"][-1]: - completed_episodes += 1 - pbar.update(1) - else: - # envs don't return valid - completed_episodes += 1 - pbar.update(1) - current_rewards[env_idx] = 0 - current_lengths[env_idx] = 0 - observations = next_obs - pbar.close() - - env.reset() - env.close() + # Reap the vector env (and the ffmpeg / async-worker children it owns) on + # every exit path; a leaked child blocks the next eval shard's ports/GPUs. + try: + episode_successes, episode_lengths, episode_rewards, episode_infos = ( + _collect_rollout_episodes(env, policy, n_episodes, n_envs, seed) + ) + finally: + # Don't let a teardown error mask an in-flight rollout exception. + try: + env.close() + except Exception as close_err: + print(f"env.close() during teardown failed: {close_err}") print(f"Collecting {n_episodes} episodes took {time.time() - start_time} seconds") assert len(episode_successes) >= n_episodes, ( f"Expected at least {n_episodes} episodes, got {len(episode_successes)}" ) + # Every captured episode ran >= 1 env-step, so episode_length >= 1. + assert all(length >= 1 for length in episode_lengths), ( + f"Internal invariant violated: rollout produced zero-length episode(s) " + f"in {episode_lengths!r}." + ) + + # Surface the per-episode length and reward that were tracked locally so + # downstream metrics (SimplerEnv / LIBERO / Robocasa / Wholebody) can + # read them off episode_infos instead of silently falling back to 0. + # Planted BEFORE the "valid" filter so they get filtered in lockstep + # with the other episode_infos fields. + episode_infos["episode_lengths"] = episode_lengths + episode_infos["episode_rewards"] = episode_rewards + episode_infos = dict(episode_infos) # Convert defaultdict to dict for key, value in episode_infos.items(): assert len(value) == len(episode_successes), ( @@ -389,6 +503,8 @@ def create_gr00t_sim_policy( embodiment_tag: EmbodimentTag, policy_client_host: str = "", policy_client_port: int | None = None, + trt_engine_path: str = "", + trt_mode: InferenceMode = InferenceMode.n17_full_pipeline, ) -> BasePolicy: from gr00t.policy.gr00t_policy import Gr00tPolicy, Gr00tSimPolicyWrapper @@ -397,13 +513,25 @@ def create_gr00t_sim_policy( policy = PolicyClient(host=policy_client_host, port=policy_client_port) else: - policy = Gr00tSimPolicyWrapper( - Gr00tPolicy( - embodiment_tag=embodiment_tag, - model_path=model_path, - device=0, - ) + gr00t_policy = Gr00tPolicy( + embodiment_tag=embodiment_tag, + model_path=model_path, + device=0, ) + if trt_engine_path: + deploy_dir = str(Path(__file__).resolve().parents[2] / "scripts" / "deployment") + if deploy_dir not in sys.path: + sys.path.insert(0, deploy_dir) + from trt_model_forward import close_tensorrt_engines, setup_tensorrt_engines + + try: + setup_tensorrt_engines(gr00t_policy, trt_engine_path, mode=trt_mode) + except BaseException: + # Free engines attached before the failing one so a partial + # setup doesn't leak GPU memory. + close_tensorrt_engines(gr00t_policy) + raise + policy = Gr00tSimPolicyWrapper(gr00t_policy) return policy @@ -416,65 +544,134 @@ def run_gr00t_sim_policy( policy_client_port: int | None = None, n_envs: int = 8, n_action_steps: int = 8, + video_dir: str | None = None, + trt_engine_path: str = "", + trt_mode: InferenceMode = InferenceMode.n17_full_pipeline, + seed: int | None = None, + robocasa_split: str = "", ): - embodiment_tag = get_embodiment_tag_from_env_name(env_name) + # seed_everything resolves `None` via the GR00T_EVAL_SEED env var and is a + # no-op when that is also unset, so the historical non-deterministic + # behavior is preserved by default. Returns the effective seed (or None) + # which we forward to env.reset below. + seed = seed_everything(seed) - if model_path: - video_dir = ( - f"/tmp/sim_eval_videos_{model_path.split('/')[-3]}_ac{n_action_steps}_{uuid.uuid4()}" - ) - else: - video_dir = f"/tmp/sim_eval_videos_{env_name}_ac{n_action_steps}_{uuid.uuid4()}" - if env_name.startswith("sim_behavior_r1_pro"): - # BEHAVIOR sim will crash if decord is imported in video_utils.py - video_dir = None - wrapper_configs = WrapperConfigs( - video=VideoConfig( - video_dir=video_dir, - max_episode_steps=max_episode_steps, - ), - multistep=MultiStepConfig( - n_action_steps=n_action_steps, - max_episode_steps=max_episode_steps, - terminate_on_success=True, - ), - ) + embodiment_tag = get_embodiment_tag_from_env_name(env_name) + if video_dir is None: + if model_path: + parts = model_path.split("/") + model_slug = parts[-3] if len(parts) >= 3 else parts[-1] + video_dir = f"/tmp/sim_eval_videos_{model_slug}_ac{n_action_steps}_{uuid.uuid4()}" + else: + video_dir = f"/tmp/sim_eval_videos_{env_name}_ac{n_action_steps}_{uuid.uuid4()}" policy = create_gr00t_sim_policy( - model_path, embodiment_tag, policy_client_host, policy_client_port + model_path, + embodiment_tag, + policy_client_host, + policy_client_port, + trt_engine_path=trt_engine_path, + trt_mode=trt_mode, ) - results = run_rollout_gymnasium_policy( - env_name=env_name, - policy=policy, - wrapper_configs=wrapper_configs, - n_episodes=n_episodes, - n_envs=n_envs, - ) - print("Video saved to: ", wrapper_configs.video.video_dir) - return results + # Release TRT engines explicitly on every exit path: the sim-eval entrypoint + # hard-exits via os._exit, which skips Engine.__del__ and would leak GPU memory. + if trt_engine_path: + deploy_dir = str(Path(__file__).resolve().parents[2] / "scripts" / "deployment") + if deploy_dir not in sys.path: + sys.path.insert(0, deploy_dir) + from trt_model_forward import closing_tensorrt_engines + engine_cleanup = closing_tensorrt_engines(policy) + else: + engine_cleanup = nullcontext() + + with engine_cleanup: + # Resolve the horizon contract from the policy *before* building the + # wrapper config. The video / state delta-indices are sourced from the + # policy's modality config (no policy-independent defaults), and + # ``n_action_steps`` is the receding-horizon execution length validated + # against the policy's action horizon. A mismatch now raises here at + # construction instead of surfacing as an IndexError / cryptic + # check_observation assert deep inside the rollout loop. + contract = PolicyHorizonSpec.from_policy(policy, n_action_steps=n_action_steps) + + wrapper_configs = WrapperConfigs( + multistep=MultiStepConfig( + contract=contract, + max_episode_steps=max_episode_steps, + terminate_on_success=True, + ), + video=VideoConfig( + video_dir=video_dir, + max_episode_steps=max_episode_steps, + ), + ) -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--max_episode_steps", type=int, default=504) - parser.add_argument("--n_episodes", type=int, default=50) - parser.add_argument( - "--model_path", - type=str, - default="", - ) - parser.add_argument("--policy_client_host", type=str, default="") - parser.add_argument("--policy_client_port", type=int, default=None) - parser.add_argument( - "--env_name", - type=str, - default="gr1_unified/PosttrainPnPNovelFromPlateToBowlSplitA_GR1ArmsAndWaistFourierHands_Env", - ) - parser.add_argument("--n_envs", type=int, default=8) - parser.add_argument("--n_action_steps", type=int, default=8) + results = run_rollout_gymnasium_policy( + env_name=env_name, + policy=policy, + wrapper_configs=wrapper_configs, + n_episodes=n_episodes, + n_envs=n_envs, + seed=seed, + robocasa_split=robocasa_split, + ) + print("Video saved to: ", wrapper_configs.video.video_dir) + return results + + +@dataclass +class RolloutConfig: + """Configuration for rollout policy evaluation.""" + + max_episode_steps: int = DEFAULT_MAX_EPISODE_STEPS + """Maximum number of steps per episode.""" + + n_episodes: int = 50 + """Number of episodes to run.""" - args = parser.parse_args() + model_path: str = "" + """Path to model checkpoint.""" + + policy_client_host: str = "" + """Host for policy client.""" + + policy_client_port: int | None = None + """Port for policy client.""" + + env_name: str = "libero_sim/KITCHEN_SCENE3_turn_on_the_stove_and_put_the_moka_pot_on_it" + """Environment name.""" + + n_envs: int = 8 + """Number of parallel environments.""" + + n_action_steps: int = 8 + """Number of action steps.""" + + video_dir: str | None = None + """Directory to save videos. If None, uses /tmp/sim_eval_videos__.""" + + trt_engine_path: str = "" + """Path to TRT engine directory. If set, uses TRT inference instead of PyTorch.""" + + trt_mode: InferenceMode = InferenceMode.n17_full_pipeline + """TRT mode: which engine subset to swap in (e.g. 'n17_full_pipeline' for all + engines, 'vit_llm_only', 'action_head', or 'dit_only').""" + + seed: int | None = None + """Optional seed for deterministic evaluation. When set, seeds Python / + NumPy / torch / cuda RNGs, enables cuDNN determinism, and forwards + per-env seeds to the sim envs. If left as ``None``, falls back to the + ``GR00T_EVAL_SEED`` env var; if that is also unset, keeps the historical + non-deterministic behavior.""" + + robocasa_split: str = "" + """Optional RoboCasa/RoboCasa365 split forwarded to the simulator.""" + + +if __name__ == "__main__": + args = tyro.cli(RolloutConfig) # validate policy configuration assert (args.model_path and not (args.policy_client_host or args.policy_client_port)) or ( @@ -482,8 +679,8 @@ def run_gr00t_sim_policy( ), ( "Invalid policy configuration: You must provide EITHER model_path OR (policy_client_host & policy_client_port), not both.\n" "If all 3 arguments are provided, explicitly choose one:\n" - ' - To use policy client: set --policy_client_host and --policy_client_port, and set --model_path ""\n' - ' - To use model path: set --model_path, and set --policy_client_host "" (and leave --policy_client_port unset)' + ' - To use policy client: set --policy-client-host and --policy-client-port, and set --model-path ""\n' + ' - To use model path: set --model-path, and set --policy-client-host "" (and leave --policy-client-port unset)' ) results = run_gr00t_sim_policy( @@ -495,6 +692,11 @@ def run_gr00t_sim_policy( policy_client_port=args.policy_client_port, n_envs=args.n_envs, n_action_steps=args.n_action_steps, + video_dir=args.video_dir, + trt_engine_path=args.trt_engine_path, + trt_mode=args.trt_mode, + seed=args.seed, + robocasa_split=args.robocasa_split, ) print("results: ", results) print("success rate: ", np.mean(results[1])) diff --git a/gr00t/eval/run_gr00t_server.py b/gr00t/eval/run_gr00t_server.py index 249b01867..9994b3089 100644 --- a/gr00t/eval/run_gr00t_server.py +++ b/gr00t/eval/run_gr00t_server.py @@ -1,8 +1,27 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from dataclasses import dataclass +import importlib import json import os +from pathlib import Path +import sys from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.types import ModalityConfig from gr00t.policy.gr00t_policy import Gr00tPolicy from gr00t.policy.replay_policy import ReplayPolicy from gr00t.policy.server_client import PolicyServer @@ -12,16 +31,35 @@ DEFAULT_MODEL_SERVER_PORT = 5555 +def _load_json_modality_configs(config_path: Path) -> dict[str, ModalityConfig]: + """Load a JSON file whose values are ModalityConfig field dicts. + + A dataset's ``meta/modality.json`` is a different (data-layout) schema and is + not accepted here — point such users at a .py config instead of letting the + ``ModalityConfig(**v)`` unpack raise a bare ``TypeError``. + """ + with open(config_path, "r") as f: + raw = json.load(f) + try: + return {k: ModalityConfig(**v) for k, v in raw.items()} + except TypeError as exc: + raise ValueError( + f"{config_path} is not a ModalityConfig JSON: each value must hold ModalityConfig " + f"fields (delta_indices, modality_keys, ...). A dataset's meta/modality.json uses a " + f"different schema; pass a .py modality config (e.g. examples/SO100/so100_config.py) instead." + ) from exc + + @dataclass class ServerConfig: - """Configuration for running the Groot N1.5 inference server.""" + """Configuration for running the GR00T inference server.""" # Gr00t policy configs model_path: str | None = None """Path to the model checkpoint directory""" - embodiment_tag: EmbodimentTag = EmbodimentTag.NEW_EMBODIMENT - """Embodiment tag""" + embodiment_tag: str = "new_embodiment" + """Embodiment tag (name or value, case-insensitive). Run with --help to see known tags.""" device: str = "cuda" """Device to run the model on""" @@ -34,10 +72,10 @@ class ServerConfig: """Path to the modality configuration file""" execution_horizon: int | None = None - """Policy execution horizon during inference.""" + """Policy execution horizon during inference. Required when --dataset-path is set (ReplayPolicy).""" # Server configs - host: str = "127.0.0.1" + host: str = "0.0.0.0" """Host address for the server""" port: int = DEFAULT_MODEL_SERVER_PORT @@ -51,6 +89,7 @@ class ServerConfig: def main(config: ServerConfig): + config.embodiment_tag = EmbodimentTag.resolve(config.embodiment_tag) print("Starting GR00T inference server...") print(f" Embodiment tag: {config.embodiment_tag}") print(f" Model path: {config.model_path}") @@ -58,12 +97,11 @@ def main(config: ServerConfig): print(f" Host: {config.host}") print(f" Port: {config.port}") - # check if the model path exists - if config.model_path.startswith("/") and not os.path.exists(config.model_path): - raise FileNotFoundError(f"Model path {config.model_path} does not exist") - # Create and start the server if config.model_path is not None: + # check if the model path exists + if config.model_path.startswith("/") and not os.path.exists(config.model_path): + raise FileNotFoundError(f"Model path {config.model_path} does not exist") policy = Gr00tPolicy( embodiment_tag=config.embodiment_tag, model_path=config.model_path, @@ -71,13 +109,46 @@ def main(config: ServerConfig): strict=config.strict, ) elif config.dataset_path is not None: - if config.modality_config_path is None: + if config.execution_horizon is None: + raise ValueError( + "--execution-horizon is required when --dataset-path is set " + "(ReplayPolicy needs a positive integer to advance episodes)." + ) + if config.execution_horizon <= 0: + raise ValueError( + f"--execution-horizon must be positive; got {config.execution_horizon}." + ) + + modality_configs: dict[str, ModalityConfig] | None = None + if config.modality_config_path is not None: + config_path = Path(config.modality_config_path) + if config_path.suffix == ".py": + # The .py file is expected to call register_modality_config() + # as an import side-effect; resolution falls through to + # MODALITY_CONFIGS below. + sys.path.append(str(config_path.parent)) + importlib.import_module(config_path.stem) + print(f"Loaded modality config: {config_path}") + elif config_path.suffix == ".json": + modality_configs = _load_json_modality_configs(config_path) + else: + raise ValueError( + f"Unsupported modality config format: {config_path.suffix}. Use .py or .json" + ) + + # For .py configs (or no config path), look up from the registry + if modality_configs is None: from gr00t.configs.data.embodiment_configs import MODALITY_CONFIGS - modality_configs = MODALITY_CONFIGS[config.embodiment_tag.value] - else: - with open(config.modality_config_path, "r") as f: - modality_configs = json.load(f) + modality_configs = MODALITY_CONFIGS.get(config.embodiment_tag.value) + if modality_configs is None: + raise ValueError( + f"No built-in modality config for embodiment tag " + f"'{config.embodiment_tag.name}' (value='{config.embodiment_tag.value}'). " + f"Available tags: {sorted(MODALITY_CONFIGS.keys())}. " + f"Please provide --modality-config-path (JSON or .py) " + f"when using this tag with ReplayPolicy." + ) policy = ReplayPolicy( dataset_path=config.dataset_path, modality_configs=modality_configs, @@ -93,16 +164,15 @@ def main(config: ServerConfig): policy = Gr00tSimPolicyWrapper(policy) - server = PolicyServer( + with PolicyServer( policy=policy, host=config.host, port=config.port, - ) - - try: - server.run() - except KeyboardInterrupt: - print("\nShutting down server...") + ) as server: + try: + server.run() + except KeyboardInterrupt: + print("\nShutting down server...") if __name__ == "__main__": diff --git a/gr00t/eval/sim/BEHAVIOR/available_tasks.yaml b/gr00t/eval/sim/BEHAVIOR/available_tasks.yaml deleted file mode 100644 index 97105f0bc..000000000 --- a/gr00t/eval/sim/BEHAVIOR/available_tasks.yaml +++ /dev/null @@ -1,888 +0,0 @@ -assembling_gift_baskets: - 0: - robot_start_orientation: - - -7.879192708060145e-06 - - 0.0009203923400491476 - - -0.3130902051925659 - - 0.9497228860855103 - robot_start_position: - - 4.610076904296875 - - 4.307098388671875 - - 0.0050048828125 - scene_model: house_double_floor_lower -attach_a_camera_to_a_tripod: - 0: - robot_start_orientation: - - 0.0007399778114631772 - - -0.0005474566714838147 - - -0.8709802031517029 - - 0.4913173019886017 - robot_start_position: - - -5.200164794921875 - - 1.07769775390625 - - 0.0050048828125 - scene_model: house_double_floor_upper -boxing_books_up_for_storage: - 0: - robot_start_orientation: - - 0.0008646032656542957 - - 0.00031546171521767974 - - -0.6655704379081726 - - 0.746334433555603 - robot_start_position: - - -0.434051513671875 - - -0.232452392578125 - - 0.0050048828125 - scene_model: house_double_floor_upper -bringing_in_kindling: - 0: - robot_start_orientation: - - 0.0009201883804053068 - - -1.5625875676050782e-05 - - -0.7516356706619263 - - 0.6595779061317444 - robot_start_position: - - -7.711273193359375 - - -2.353759765625 - - 0.0050048828125 - scene_model: house_double_floor_lower -bringing_in_wood: - 0: - robot_start_orientation: - - 0.000644969055429101 - - 0.0006564260693266988 - - -0.5481373071670532 - - 0.8363878726959229 - robot_start_position: - - -10.47418212890625 - - 1.28668212890625 - - 0.0050048828125 - scene_model: house_double_floor_lower -bringing_newspaper_in: - 0: - robot_start_orientation: - - -0.0006256562774069607 - - 0.0006749705644324422 - - -0.0720907673239708 - - 0.9973976612091064 - robot_start_position: - - 5.05450439453125 - - 5.048004150390625 - - 0.0050048828125 - scene_model: house_double_floor_lower -bringing_water: - 0: - robot_start_orientation: - - 0.0008991969516500831 - - -0.00019634084310382605 - - -0.793474018573761 - - 0.6086034774780273 - robot_start_position: - - 6.06195068359375 - - -0.887542724609375 - - 0.0050048828125 - scene_model: house_single_floor -can_beans: - 0: - robot_start_orientation: - - -0.00016707053873687983 - - -0.0009051887318491936 - - 0.6171036958694458 - - 0.7868812680244446 - robot_start_position: - - 6.508941650390625 - - 2.22998046875 - - 0.0050048828125 - scene_model: house_double_floor_lower -can_meat: - 0: - robot_start_orientation: - - -0.004979467485100031 - - 0.0008657632861286402 - - -0.9536957740783691 - - 0.3007306754589081 - robot_start_position: - - 5.42657470703125 - - -0.488983154296875 - - 0.0037841796875 - scene_model: house_single_floor -canning_food: - 0: - robot_start_orientation: - - 0.0008344890084117651 - - 0.00038779410533607006 - - -0.6441007852554321 - - 0.7649400234222412 - robot_start_position: - - 6.77642822265625 - - -0.971099853515625 - - 0.0050048828125 - scene_model: house_single_floor -carrying_in_groceries: - 0: - robot_start_orientation: - - 0.0009117759764194489 - - 0.00012512154353316873 - - 0.9622039794921875 - - 0.27232813835144043 - robot_start_position: - - -4.95867919921875 - - 3.770965576171875 - - 0.0050048828125 - scene_model: house_double_floor_lower -carrying_out_garden_furniture: - 0: - robot_start_orientation: - - 0.0009201004286296666 - - -1.3881042832508683e-05 - - 0.947232723236084 - - 0.3205452561378479 - robot_start_position: - - 2.83642578125 - - 4.041534423828125 - - 0.0050048828125 - scene_model: house_double_floor_lower -chop_an_onion: - 0: - robot_start_orientation: - - 0.0002523082366678864 - - -0.000885130139067769 - - 0.7300970554351807 - - 0.6833429336547852 - robot_start_position: - - 2.90386962890625 - - 2.535125732421875 - - 0.0050048828125 - scene_model: house_double_floor_lower -chopping_wood: - 0: - robot_start_orientation: - - 0.00034968581167049706 - - 0.0008513127686455846 - - -0.43605661392211914 - - 0.899918794631958 - robot_start_position: - - -13.286712646484375 - - 2.80169677734375 - - 0.0050048828125 - scene_model: house_double_floor_lower -clean_a_felt_pool_table_top: - 0: - robot_start_orientation: - - -0.0001610162726137787 - - 0.0009060571319423616 - - -0.2596948444843292 - - 0.9656902551651001 - robot_start_position: - - 12.98492431640625 - - 2.451202392578125 - - 0.004974365234375 - scene_model: house_single_floor -clean_a_patio: - 0: - robot_start_orientation: - - 4.69813821837306e-05 - - -0.0009163456270471215 - - 0.6779989004135132 - - 0.7350623607635498 - robot_start_position: - - 14.3187255859375 - - 8.972076416015625 - - 0.019134521484375 - scene_model: house_double_floor_lower -clean_a_rug: - 0: - robot_start_orientation: - - -0.0007933919550850987 - - 0.00046511049731634557 - - 0.025453653186559677 - - 0.9996755719184875 - robot_start_position: - - 22.95513916015625 - - 1.476806640625 - - 0.004974365234375 - scene_model: house_single_floor -clean_a_trumpet: - 0: - robot_start_orientation: - - -0.0007593854679726064 - - -0.0005200967425480485 - - 0.3916804790496826 - - 0.9201008677482605 - robot_start_position: - - -3.71978759765625 - - 1.291290283203125 - - 0.0050048828125 - scene_model: house_double_floor_upper -clean_boxing_gloves: - 0: - robot_start_orientation: - - -0.000913275231141597 - - 0.00011424279364291579 - - 0.1601296067237854 - - 0.9870954751968384 - robot_start_position: - - 23.091339111328125 - - 1.154144287109375 - - 0.004974365234375 - scene_model: house_single_floor -clean_up_broken_glass: - 0: - robot_start_orientation: - - 0.001841855002567172 - - -0.004706318024545908 - - -0.5311652421951294 - - 0.8472532033920288 - robot_start_position: - - 3.627716064453125 - - 3.120452880859375 - - 0.003753662109375 - scene_model: house_double_floor_lower -clean_up_your_desk: - 0: - robot_start_orientation: - - 0.0005908034509047866 - - 0.0007050615386106074 - - -0.5258352756500244 - - 0.8505859375 - robot_start_position: - - 21.521728515625 - - 14.590667724609375 - - 0.004974365234375 - scene_model: house_single_floor -cleaning_up_plates_and_food: - 0: - robot_start_orientation: - - 0.0003356111701577902 - - -0.005043020937591791 - - 0.9903920292854309 - - 0.1381959319114685 - robot_start_position: - - 6.9866943359375 - - 2.269317626953125 - - 0.003753662109375 - scene_model: house_double_floor_lower -clearing_food_from_table_into_fridge: - 0: - robot_start_orientation: - - -0.00045836929348297417 - - -0.0007981389644555748 - - -0.9995918869972229 - - 0.028552906587719917 - robot_start_position: - - 5.907440185546875 - - 2.3653564453125 - - 0.0050048828125 - scene_model: house_double_floor_lower -collecting_childrens_toys: - 0: - robot_start_orientation: - - 0.0006416336400434375 - - -0.0006598086329177022 - - 0.8321431279182434 - - 0.5545600652694702 - robot_start_position: - - 22.463470458984375 - - 6.679412841796875 - - 0.004974365234375 - scene_model: house_single_floor -cook_a_brisket: - 0: - robot_start_orientation: - - -0.0047464738599956036 - - -0.0017364295199513435 - - -0.8870946168899536 - - 0.46155980229377747 - robot_start_position: - - 8.7554931640625 - - 1.575592041015625 - - 0.0037841796875 - scene_model: house_single_floor -cook_bacon: - 0: - robot_start_orientation: - - 0.0006540070753544569 - - 0.0006473833927884698 - - 0.998127818107605 - - 0.06115550547838211 - robot_start_position: - - 5.176727294921875 - - 0.457611083984375 - - 0.0050048828125 - scene_model: house_single_floor -cook_cabbage: - 0: - robot_start_orientation: - - 0.000755067216232419 - - 0.0005265736253932118 - - -0.5986641645431519 - - 0.8009995222091675 - robot_start_position: - - 7.684234619140625 - - -0.9068603515625 - - 0.0050048828125 - scene_model: house_single_floor -cook_eggplant: - 0: - robot_start_orientation: - - -0.0043802410364151 - - 0.002521366812288761 - - 0.6536208391189575 - - 0.7568053603172302 - robot_start_position: - - 7.03240966796875 - - -0.953521728515625 - - 0.0037841796875 - scene_model: house_single_floor -cook_hot_dogs: - 0: - robot_start_orientation: - - 0.0008374275639653206 - - 0.0003818359400611371 - - -0.6459619402885437 - - 0.7633689641952515 - robot_start_position: - - 6.429229736328125 - - -0.8603515625 - - 0.0050048828125 - scene_model: house_single_floor -cool_cakes: - 0: - robot_start_orientation: - - 0.0047397310845553875 - - -0.001754383440129459 - - -0.27530622482299805 - - 0.9613432884216309 - robot_start_position: - - 4.867034912109375 - - 3.061798095703125 - - 0.003753662109375 - scene_model: house_double_floor_lower -freeze_fruit: - 0: - robot_start_orientation: - - 0.0018858104012906551 - - 0.004689079709351063 - - 0.2332150787115097 - - 0.9724120497703552 - robot_start_position: - - 5.120361328125 - - -0.41485595703125 - - 0.0037841796875 - scene_model: house_single_floor -freeze_meat: - 0: - robot_start_orientation: - - -0.002468504011631012 - - -0.004410393536090851 - - -0.754175066947937 - - 0.6566540002822876 - robot_start_position: - - 8.90155029296875 - - -0.80841064453125 - - 0.0037841796875 - scene_model: house_single_floor -freeze_pies: - 0: - robot_start_orientation: - - -0.002802755683660507 - - 0.004205789417028427 - - -0.9993684887886047 - - 0.03517213836312294 - robot_start_position: - - 5.13653564453125 - - -0.024200439453125 - - 0.0037841796875 - scene_model: house_single_floor -freeze_vegetables: - 0: - robot_start_orientation: - - -0.0004805810749530792 - - -0.005031214561313391 - - -0.6564157009124756 - - 0.7543824315071106 - robot_start_position: - - 8.867218017578125 - - -0.771820068359375 - - 0.0037841796875 - scene_model: house_single_floor -gathering_nuts: - 0: - robot_start_orientation: - - -0.00010575057240203023 - - -0.0009146732045337558 - - -0.9865900278091431 - - 0.16321490705013275 - robot_start_position: - - -22.0340576171875 - - 3.820770263671875 - - 0.0050048828125 - scene_model: house_single_floor -getting_organized_for_work: - 0: - robot_start_orientation: - - 0.0003106363001279533 - - -0.0008664365741424263 - - -0.950154185295105 - - 0.3117790222167969 - robot_start_position: - - 3.264801025390625 - - -1.6968994140625 - - 0.0050048828125 - scene_model: house_double_floor_upper -hanging_pictures: - 0: - robot_start_orientation: - - 0.0009172327117994428 - - -7.712066872045398e-05 - - -0.76616370677948 - - 0.6426447629928589 - robot_start_position: - - 5.93963623046875 - - 2.287109375 - - 0.0050048828125 - scene_model: house_double_floor_lower -hiding_Easter_eggs: - 0: - robot_start_orientation: - - -0.003265799954533577 - - 0.0038569795433431864 - - -0.9972893595695496 - - 0.0734056830406189 - robot_start_position: - - -8.090576171875 - - 14.523651123046875 - - 0.003753662109375 - scene_model: house_double_floor_lower -installing_a_fence: - 0: - robot_start_orientation: - - -0.00024352502077817917 - - -0.000887536269146949 - - -0.9936138391494751 - - 0.11283038556575775 - robot_start_position: - - 8.45611572265625 - - 6.44134521484375 - - 0.0050048828125 - scene_model: house_double_floor_lower -loading_the_car: - 0: - robot_start_orientation: - - 0.00045823934487998486 - - 0.0007978219073265791 - - -0.4750668406486511 - - 0.8799492716789246 - robot_start_position: - - -7.43365478515625 - - 4.3634033203125 - - 0.0050048828125 - scene_model: house_double_floor_lower -loading_the_dishwasher: - 0: - robot_start_orientation: - - -0.004472167696803808 - - 0.0023544421419501305 - - 0.6630809307098389 - - 0.7485305666923523 - robot_start_position: - - 5.451995849609375 - - -1.070220947265625 - - 0.0037841796875 - scene_model: house_single_floor -make_microwave_popcorn: - 0: - robot_start_orientation: - - -9.973093983717263e-05 - - 0.0009148308890871704 - - -0.28131112456321716 - - 0.9596161246299744 - robot_start_position: - - 6.012054443359375 - - 2.59600830078125 - - 0.0050048828125 - scene_model: house_double_floor_lower -make_pizza: - 0: - robot_start_orientation: - - -0.0003707160067278892 - - -0.0008425143896602094 - - -0.997943103313446 - - 0.06409911811351776 - robot_start_position: - - 6.25030517578125 - - 1.922271728515625 - - 0.0050048828125 - scene_model: house_double_floor_lower -moving_boxes_to_storage: - 0: - robot_start_orientation: - - -0.0008246538927778602 - - -0.00040826661279425025 - - 0.34809672832489014 - - 0.9374581575393677 - robot_start_position: - - -3.3118896484375 - - 3.96038818359375 - - 0.0050048828125 - scene_model: house_double_floor_lower -outfit_a_basic_toolbox: - 0: - robot_start_orientation: - - 0.0001914621243486181 - - -0.0009000403806567192 - - -0.9631679058074951 - - 0.2688990831375122 - robot_start_position: - - 23.02313232421875 - - -1.469085693359375 - - 0.004974365234375 - scene_model: house_single_floor -picking_up_toys: - 0: - robot_start_orientation: - - 0.0007278993725776672 - - 0.0005626706988550723 - - 0.9948073625564575 - - 0.10177161544561386 - robot_start_position: - - 21.585540771484375 - - 17.41180419921875 - - 0.004974365234375 - scene_model: house_single_floor -picking_up_trash: - 0: - robot_start_orientation: - - 0.004324102774262428 - - -0.0026167959440499544 - - -0.3354952037334442 - - 0.9420283436775208 - robot_start_position: - - 6.1107177734375 - - 1.5191650390625 - - 0.003753662109375 - scene_model: house_double_floor_lower -preparing_lunch_box: - 0: - robot_start_orientation: - - -0.004919721279293299 - - -0.004097792785614729 - - 0.8743805289268494 - - 0.48519861698150635 - robot_start_position: - - 6.810211181640625 - - 1.627044677734375 - - 0.002838134765625 - scene_model: house_single_floor -put_togethera_basic_pruning_kit: - 0: - robot_start_orientation: - - 0.0008678967133164406 - - -0.00030717317713424563 - - 0.9070109724998474 - - 0.42110615968704224 - robot_start_position: - - -14.0693359375 - - 10.313751220703125 - - 0.004974365234375 - scene_model: house_single_floor -putting_away_Halloween_decorations: - 0: - robot_start_orientation: - - 0.0017694442067295313 - - 0.004734577611088753 - - 0.24118688702583313 - - 0.9704654216766357 - robot_start_position: - - 5.041595458984375 - - 3.8673095703125 - - 0.003753662109375 - scene_model: house_double_floor_lower -putting_away_toys: - 0: - robot_start_orientation: - - 0.0018227527616545558 - - -0.004713948350399733 - - -0.5323176980018616 - - 0.8465295433998108 - robot_start_position: - - 14.826690673828125 - - 1.521820068359375 - - 0.003753662109375 - scene_model: house_single_floor -putting_dishes_away_after_cleaning: - 0: - robot_start_orientation: - - -0.011885271407663822 - - -0.0006322464905679226 - - 0.19025535881519318 - - 0.981662392616272 - robot_start_position: - - 7.8955078125 - - 1.60272216796875 - - 0.001495361328125 - scene_model: house_single_floor -putting_on_license_plates: - 0: - robot_start_orientation: - - -0.00021611164265777916 - - 0.00089438003487885 - - -0.2398129105567932 - - 0.9708185791969299 - robot_start_position: - - -9.364715576171875 - - 20.153045654296875 - - -0.017425537109375 - scene_model: house_single_floor -putting_shoes_on_rack: - 0: - robot_start_orientation: - - -0.0005603739409707487 - - 0.0007301800069399178 - - -0.10291498899459839 - - 0.9946897625923157 - robot_start_position: - - -0.041229248046875 - - 5.229583740234375 - - 0.0050048828125 - scene_model: house_double_floor_lower -putting_up_Christmas_decorations_inside: - 0: - robot_start_orientation: - - -0.0004975609481334686 - - 0.000774232903495431 - - -0.1303606778383255 - - 0.991466224193573 - robot_start_position: - - 15.363616943359375 - - 1.999237060546875 - - 0.004974365234375 - scene_model: house_single_floor -re_shelving_library_books: - 0: - robot_start_orientation: - - 0.0005416068015620112 - - -0.0007439615437760949 - - 0.8050010204315186 - - 0.5932726860046387 - robot_start_position: - - -1.137420654296875 - - 0.42083740234375 - - 0.0050048828125 - scene_model: house_double_floor_upper -rearranging_kitchen_furniture: - 0: - robot_start_orientation: - - -0.0037586644757539034 - - 0.003378926543518901 - - -0.99294513463974 - - 0.11846747994422913 - robot_start_position: - - 3.188018798828125 - - 2.78472900390625 - - 0.003753662109375 - scene_model: house_double_floor_lower -scrubbing_bathroom_floor: - 0: - robot_start_orientation: - - 0.0005680842441506684 - - 0.0007242267020046711 - - -0.5167263746261597 - - 0.8561500906944275 - robot_start_position: - - 0.469390869140625 - - 2.789703369140625 - - 0.0050048828125 - scene_model: house_double_floor_upper -set_up_a_coffee_station_in_your_kitchen: - 0: - robot_start_orientation: - - 0.0007323601166717708 - - -0.0005575308459810913 - - -0.8732183575630188 - - 0.48732835054397583 - robot_start_position: - - 5.7464599609375 - - -0.837646484375 - - 0.0050048828125 - scene_model: house_single_floor -setting_mousetraps: - 0: - robot_start_orientation: - - -0.003881497774273157 - - 0.0032369557302445173 - - 0.6089481711387634 - - 0.7931939363479614 - robot_start_position: - - 0.243072509765625 - - 2.041015625 - - 0.003753662109375 - scene_model: house_double_floor_upper -setting_the_fire: - 0: - robot_start_orientation: - - -0.0005923333810642362 - - -0.0007047964027151465 - - 0.4731845557689667 - - 0.8809628486633301 - robot_start_position: - - 4.783447265625 - - 4.7923583984375 - - 0.0050048828125 - scene_model: house_double_floor_lower -setting_the_table: - 0: - robot_start_orientation: - - 0.0008204160840250552 - - -0.0004171465116087347 - - -0.8424192070960999 - - 0.538821816444397 - robot_start_position: - - 5.313751220703125 - - 1.485565185546875 - - 0.0050048828125 - scene_model: house_single_floor -slicing_vegetables: - 0: - robot_start_orientation: - - 0.0003110530087724328 - - -0.0008660361636430025 - - 0.7452154755592346 - - 0.666823148727417 - robot_start_position: - - 7.861236572265625 - - -0.992340087890625 - - 0.0050048828125 - scene_model: house_single_floor -sorting_household_items: - 0: - robot_start_orientation: - - 0.000900222803466022 - - 0.00019031809642910957 - - -0.7000097632408142 - - 0.7141327261924744 - robot_start_position: - - 21.852264404296875 - - 23.0235595703125 - - 0.004974365234375 - scene_model: house_single_floor -sorting_mail: - 0: - robot_start_orientation: - - -0.000844573718495667 - - -0.0003658236237242818 - - 0.33211424946784973 - - 0.9432386755943298 - robot_start_position: - - -2.400299072265625 - - -1.915008544921875 - - 0.0050048828125 - scene_model: house_double_floor_upper -sorting_vegetables: - 0: - robot_start_orientation: - - 0.000773823237977922 - - 0.0004979491932317615 - - -0.6085850596427917 - - 0.793488085269928 - robot_start_position: - - 8.874267578125 - - -0.754669189453125 - - 0.0050048828125 - scene_model: house_single_floor -spraying_for_bugs: - 0: - robot_start_orientation: - - -0.000697517825756222 - - 0.00043834029929712415 - - -0.043683603405952454 - - 0.9990451335906982 - robot_start_position: - - 16.920989990234375 - - 11.005767822265625 - - 0.01904296875 - scene_model: house_double_floor_lower -spraying_fruit_trees: - 0: - robot_start_orientation: - - -0.002685170155018568 - - -0.014480376616120338 - - 0.8241459727287292 - - 0.5661859512329102 - robot_start_position: - - 13.7415771484375 - - 12.622802734375 - - 0.00982666015625 - scene_model: house_double_floor_lower -storing_food: - 0: - robot_start_orientation: - - 0.000510646787006408 - - -0.0007660053670406342 - - 0.7967879772186279 - - 0.6042582392692566 - robot_start_position: - - 7.696807861328125 - - -0.9969482421875 - - 0.0050048828125 - scene_model: house_single_floor -thawing_frozen_food: - 0: - robot_start_orientation: - - -0.003672386519610882 - - 0.003472357988357544 - - 0.592357873916626 - - 0.8056590557098389 - robot_start_position: - - 5.504791259765625 - - -0.95953369140625 - - 0.0037841796875 - scene_model: house_single_floor -tidying_bedroom: - 0: - robot_start_orientation: - - -0.0006719986558891833 - - 0.0006295834900811315 - - -0.04864465445280075 - - 0.9988157153129578 - robot_start_position: - - 22.232696533203125 - - 23.384613037109375 - - 0.004974365234375 - scene_model: house_single_floor -turning_on_radio: - 0: - robot_start_orientation: - - -0.005050721578299999 - - -0.00017678923904895782 - - -0.930679976940155 - - 0.3657994270324707 - robot_start_position: - - 5.29986572265625 - - 5.574432373046875 - - 0.003753662109375 - scene_model: house_double_floor_lower -wash_a_baseball_cap: - 0: - robot_start_orientation: - - -0.0002866012218873948 - - -0.0008748544496484101 - - 0.5814144611358643 - - 0.8136069774627686 - robot_start_position: - - 23.44451904296875 - - 0.23248291015625 - - 0.004974365234375 - scene_model: house_single_floor -wash_dog_toys: - 0: - robot_start_orientation: - - -0.00033173145493492484 - - -0.0008582615992054343 - - 0.5671047568321228 - - 0.8236451745033264 - robot_start_position: - - 23.190338134765625 - - -1.074005126953125 - - 0.004974365234375 - scene_model: house_single_floor diff --git a/gr00t/eval/sim/BEHAVIOR/behavior_env.py b/gr00t/eval/sim/BEHAVIOR/behavior_env.py deleted file mode 100644 index ccdc79f10..000000000 --- a/gr00t/eval/sim/BEHAVIOR/behavior_env.py +++ /dev/null @@ -1,926 +0,0 @@ -from collections import OrderedDict -import csv -import json -import logging -from pathlib import Path - -from gr00t.eval.sim.BEHAVIOR.og_teleop_utils import ( - generate_basic_environment_config, - generate_robot_config, - load_available_tasks, -) -import gymnasium as gym -from gymnasium.envs.registration import register -import numpy as np -import omnigibson as og -from omnigibson.envs import Environment, EnvironmentWrapper -from omnigibson.learning.wrappers import TaskProgressWrapper -from omnigibson.macros import gm -from omnigibson.metrics import AgentMetric, MetricBase, TaskMetric -from omnigibson.robots import BaseRobot -from omnigibson.transition_rules import CookingSystemRule, MixingToolRule, ToggleableMachineRule -import torch as th - - -gm.HEADLESS = True - -# create module logger -logger = logging.getLogger("evaluator") -logger.setLevel(20) # info - -PROPRIOCEPTION_INDICES = { - "R1Pro": OrderedDict( - { - "joint_qpos": np.s_[0:28], - "joint_qpos_sin": np.s_[28:56], - "joint_qpos_cos": np.s_[56:84], - "joint_qvel": np.s_[84:112], - "joint_qeffort": np.s_[112:140], - "robot_pos": np.s_[140:143], - "robot_ori_cos": np.s_[143:146], - "robot_ori_sin": np.s_[146:149], - "robot_2d_ori": np.s_[149:150], - "robot_2d_ori_cos": np.s_[150:151], - "robot_2d_ori_sin": np.s_[151:152], - "robot_lin_vel": np.s_[152:155], - "robot_ang_vel": np.s_[155:158], - "arm_left_qpos": np.s_[158:165], - "arm_left_qpos_sin": np.s_[165:172], - "arm_left_qpos_cos": np.s_[172:179], - "arm_left_qvel": np.s_[179:186], - "eef_left_pos": np.s_[186:189], - "eef_left_quat": np.s_[189:193], - "grasp_left": np.s_[193:194], - "gripper_left_qpos": np.s_[194:196], - "gripper_left_qvel": np.s_[196:198], - "arm_right_qpos": np.s_[198:205], - "arm_right_qpos_sin": np.s_[205:212], - "arm_right_qpos_cos": np.s_[212:219], - "arm_right_qvel": np.s_[219:226], - "eef_right_pos": np.s_[226:229], - "eef_right_quat": np.s_[229:233], - "grasp_right": np.s_[233:234], - "gripper_right_qpos": np.s_[234:236], - "gripper_right_qvel": np.s_[236:238], - "trunk_qpos": np.s_[238:242], - "trunk_qvel": np.s_[242:246], - "base_qpos": np.s_[246:249], - "base_qpos_sin": np.s_[249:252], - "base_qpos_cos": np.s_[252:255], - "base_qvel": np.s_[255:258], - } - ), -} - -ROBOT_CAMERA_NAMES = { - "R1Pro": { - "left_wrist": "robot_r1::robot_r1:left_realsense_link:Camera:0", - "right_wrist": "robot_r1::robot_r1:right_realsense_link:Camera:0", - "head": "robot_r1::robot_r1:zed_link:Camera:0", - }, -} - -HEAD_RESOLUTION = (720, 720) -WRIST_RESOLUTION = (480, 480) - -ACTION_MAP = { - "base": np.s_[0:3], - "torso": np.s_[3:7], - "left_arm": np.s_[7:14], - "left_gripper": np.s_[14:15], - "right_arm": np.s_[15:22], - "right_gripper": np.s_[22:23], -} - -DISABLED_TRANSITION_RULES = [ToggleableMachineRule, MixingToolRule, CookingSystemRule] - - -TASK_NAMES_TO_INDICES = { - "turning_on_radio": 0, - "picking_up_trash": 1, - "putting_away_Halloween_decorations": 2, - "cleaning_up_plates_and_food": 3, - "can_meat": 4, - "setting_mousetraps": 5, - "hiding_Easter_eggs": 6, - "picking_up_toys": 7, - "rearranging_kitchen_furniture": 8, - "putting_up_Christmas_decorations_inside": 9, - "set_up_a_coffee_station_in_your_kitchen": 10, - "putting_dishes_away_after_cleaning": 11, - "preparing_lunch_box": 12, - "loading_the_car": 13, - "carrying_in_groceries": 14, - "bringing_in_wood": 15, - "moving_boxes_to_storage": 16, - "bringing_water": 17, - "tidying_bedroom": 18, - "outfit_a_basic_toolbox": 19, - "sorting_vegetables": 20, - "collecting_childrens_toys": 21, - "putting_shoes_on_rack": 22, - "boxing_books_up_for_storage": 23, - "storing_food": 24, - "clearing_food_from_table_into_fridge": 25, - "assembling_gift_baskets": 26, - "sorting_household_items": 27, - "getting_organized_for_work": 28, - "clean_up_your_desk": 29, - "setting_the_fire": 30, - "clean_boxing_gloves": 31, - "wash_a_baseball_cap": 32, - "wash_dog_toys": 33, - "hanging_pictures": 34, - "attach_a_camera_to_a_tripod": 35, - "clean_a_patio": 36, - "clean_a_trumpet": 37, - "spraying_for_bugs": 38, - "spraying_fruit_trees": 39, - "make_microwave_popcorn": 40, - "cook_cabbage": 41, - "chop_an_onion": 42, - "slicing_vegetables": 43, - "chopping_wood": 44, - "cook_hot_dogs": 45, - "cook_bacon": 46, - "freeze_pies": 47, - "canning_food": 48, - "make_pizza": 49, -} -TASK_NAMES_TO_INSTRUCTIONS = {k: k.replace("_", " ") for k in TASK_NAMES_TO_INDICES.keys()} -# Capitalize the first letter of each word and add a period at the end -TASK_NAMES_TO_INSTRUCTIONS = { - k: v.capitalize() + "." for k, v in TASK_NAMES_TO_INSTRUCTIONS.items() -} - - -def recursively_convert_to_torch(state): - # For all the lists in state dict, convert to torch tensor - for key, value in state.items(): - if isinstance(value, dict): - state[key] = recursively_convert_to_torch(value) - elif isinstance(value, list): - # Convert to torch tensor if all elements are numeric and have consistent shapes - try: - state[key] = th.tensor(value, dtype=th.float32) - except: # noqa: E722 - pass - - return state - - -def load_task_instance_for_env(env, robot, instance_id: int) -> None: - scene_model = env.task.scene_name - tro_filename = env.task.get_cached_activity_scene_filename( - scene_model=scene_model, - activity_name=env.task.activity_name, - activity_definition_id=env.task.activity_definition_id, - activity_instance_id=instance_id, - ) - tro_file = ( - Path(__file__).parent - / "test_instances" - / f"{env.task.activity_name}" - / f"{tro_filename}-tro_state.json" - ) - tro_file_path = str(tro_file) - - assert tro_file.exists(), ( - f"Could not find TRO file at {tro_file_path}, did you run ./populate_behavior_tasks.sh?" - ) - with open(tro_file_path, "r") as f: - tro_state = recursively_convert_to_torch(json.load(f)) - for tro_key, tro_state in tro_state.items(): - if tro_key == "robot_poses": - presampled_robot_poses = tro_state - robot_pos = presampled_robot_poses[robot.model_name][0]["position"] - robot_quat = presampled_robot_poses[robot.model_name][0]["orientation"] - robot.set_position_orientation(robot_pos, robot_quat) - # Write robot poses to scene metadata - env.scene.write_task_metadata(key=tro_key, data=tro_state) - else: - env.task.object_scope[tro_key].load_state(tro_state, serialized=False) - - # Try to ensure that all task-relevant objects are stable - # They should already be stable from the sampled instance, but there is some issue where loading the state - # causes some jitter (maybe for small mass / thin objects?) - for _ in range(25): - og.sim.step_physics() - for entity in env.task.object_scope.values(): - if not entity.is_system and entity.exists: - entity.keep_still() - env.scene.update_initial_file() - env.scene.reset() - - -def flatten_obs_dict(obs: dict, parent_key: str = "") -> dict: - """ - Process the observation dictionary by recursively flattening the keys. - so obs["robot_r1"]["camera"]["rgb"] will become obs["robot_r1::camera:::rgb"]. - """ - processed_obs = {} - for key, value in obs.items(): - new_key = f"{parent_key}::{key}" if parent_key else key - if isinstance(value, dict) or isinstance(value, gym.spaces.Dict): - processed_obs.update(flatten_obs_dict(value, parent_key=new_key)) - else: - processed_obs[new_key] = value - return processed_obs - - -def preprocess_obs(env, obs: dict) -> dict: - """ - Preprocess the observation dictionary before passing it to the policy. - """ - obs = flatten_obs_dict(obs["robot_r1"]) - # these rgb images have alpha channel, so we need to remove it - obs["video.observation.images.rgb.left_wrist_256_256"] = ( - obs["robot_r1:left_realsense_link:Camera:0::rgb"].cpu().numpy()[..., :3] - ) - obs["video.observation.images.rgb.right_wrist_256_256"] = ( - obs["robot_r1:right_realsense_link:Camera:0::rgb"].cpu().numpy()[..., :3] - ) - obs["video.observation.images.rgb.head_256_256"] = ( - obs["robot_r1:zed_link:Camera:0::rgb"].cpu().numpy()[..., :3] - ) - obs.pop("robot_r1:left_realsense_link:Camera:0::rgb") - obs.pop("robot_r1:right_realsense_link:Camera:0::rgb") - obs.pop("robot_r1:zed_link:Camera:0::rgb") - # convert all to numpy arrays - for key, value in obs.items(): - if isinstance(value, th.Tensor): - obs[key] = value.cpu().numpy() - obs["annotation.human.coarse_action"] = env.task_instruction - # process proprio - proprio_obs = obs.pop("proprio") - for key, value in PROPRIOCEPTION_INDICES["R1Pro"].items(): - obs[f"state.{key}"] = proprio_obs[value] - return obs - - -def preprocess_action(action: dict): - th_action = th.zeros(23, dtype=th.float32) - for action_name, action_indices in ACTION_MAP.items(): - action_name = f"action.{action_name}" - th_action[action_indices] = ( - th.from_numpy(action[action_name]) - if isinstance(action[action_name], np.ndarray) - else action[action_name] - ) - - return {"robot_r1": th_action} - - -def postprocess_info(info: dict): - info["success"] = False if info["done"]["success"] is None else info["done"]["success"] - return info - - -class RGBLowResWrapper(EnvironmentWrapper): - """ - Args: - env (og.Environment): The environment to wrap. - """ - - def __init__(self, env: Environment): - super().__init__(env=env) - # Note that from eval.py we already set the robot to include rgb + depth + seg_instance_id modalities - # Here, we modify the robot observation to include only rgb modalities, and use 224 * 224 resolution - # For a complete list of available modalities, see VisionSensor.ALL_MODALITIES - robot = env.robots[0] - for camera_id, camera_name in ROBOT_CAMERA_NAMES["R1Pro"].items(): - sensor_name = camera_name.split("::")[1] - if camera_id == "head": - robot.sensors[ - sensor_name - ].horizontal_aperture = 40.0 # this is what we used in data collection - robot.sensors[sensor_name].image_height = 256 - robot.sensors[sensor_name].image_width = 256 - # reload observation space - env.load_observation_space() - logger.info("Reloaded observation space!") - - -class BEHAVIORGr00tEnv(gym.Wrapper): - metadata = {"render.modes": ["rgb_array"]} - - def __init__(self, task_name: str, env_idx: int = 0, total_n_envs: int = 1): - self.task_name = task_name - self.task_instruction = TASK_NAMES_TO_INSTRUCTIONS[self.task_name] - # Now, get human stats of the task - task_idx = TASK_NAMES_TO_INDICES[task_name] - self.human_stats = { - "length": [], - "distance_traveled": [], - "left_eef_displacement": [], - "right_eef_displacement": [], - } - human_stats_path = ( - Path(gm.DATA_PATH) / "2025-challenge-task-instances" / "metadata" / "episodes.jsonl" - ) - with open(human_stats_path, "r") as f: - episodes = [json.loads(line) for line in f] - for episode in episodes: - if episode["episode_index"] // 1e4 == task_idx: - for k in self.human_stats.keys(): - self.human_stats[k].append(episode[k]) - # take a mean - for k in self.human_stats.keys(): - self.human_stats[k] = sum(self.human_stats[k]) / len(self.human_stats[k]) - self.env = self.load_env() - self.robot = self.load_robot() - self.metrics = self.load_metrics() - super().__init__(self.env) - original_observation_space = self.env.observation_space - flat_obs_dict = flatten_obs_dict(original_observation_space["robot_r1"]) - flat_obs_dict.pop("robot_r1:left_realsense_link:Camera:0::rgb") - flat_obs_dict.pop("robot_r1:right_realsense_link:Camera:0::rgb") - flat_obs_dict.pop("robot_r1:zed_link:Camera:0::rgb") - flat_obs_dict["video.observation.images.rgb.left_wrist_256_256"] = gym.spaces.Box( - 0, 255, (256, 256, 3), np.uint8 - ) - flat_obs_dict["video.observation.images.rgb.right_wrist_256_256"] = gym.spaces.Box( - 0, 255, (256, 256, 3), np.uint8 - ) - flat_obs_dict["video.observation.images.rgb.head_256_256"] = gym.spaces.Box( - 0, 255, (256, 256, 3), np.uint8 - ) - flat_obs_dict["annotation.human.coarse_action"] = gym.spaces.Text(max_length=512) - # replace `proprio` with fine-grained state obs - proprio_space = flat_obs_dict.pop("proprio") - fine_grained_proprio_space = OrderedDict() - for key, value in PROPRIOCEPTION_INDICES["R1Pro"].items(): - fine_grained_proprio_space[f"state.{key}"] = gym.spaces.Box( - low=proprio_space.low[value], - high=proprio_space.high[value], - shape=(value.stop - value.start,), - dtype=np.float32, - ) - flat_obs_dict.update(fine_grained_proprio_space) - self.observation_space = gym.spaces.Dict(flat_obs_dict) - original_robot_action_space = self.env.action_space["robot_r1"] - action_space_dict = OrderedDict() - for action_name, action_indices in ACTION_MAP.items(): - action_space_dict[f"action.{action_name}"] = gym.spaces.Box( - low=original_robot_action_space.low[action_indices], - high=original_robot_action_space.high[action_indices], - shape=(action_indices.stop - action_indices.start,), - ) - self.action_space = gym.spaces.Dict(action_space_dict) - - self.obs, self.info = None, None - # manually reset environment episode number - self.env._current_episode = 0 - - # determine task instance - instances_to_run = list(range(10)) - assert env_idx < len(instances_to_run) - assert env_idx < total_n_envs, "env_idx must be less than total_n_envs" - n_instances_per_env = len(instances_to_run) // total_n_envs - self._instance_indices_this_env = ( - instances_to_run[env_idx * n_instances_per_env : (env_idx + 1) * n_instances_per_env] - if env_idx < (total_n_envs - 1) - else instances_to_run[env_idx * n_instances_per_env :] - ) - self._instance_idx_pointer = 0 - # load csv file - task_instance_csv_path = ( - Path(gm.DATA_PATH) / "2025-challenge-task-instances" / "metadata" / "test_instances.csv" - ) - with open(task_instance_csv_path, "r") as f: - lines = list(csv.reader(f))[1:] - assert lines[TASK_NAMES_TO_INDICES[self.task_name]][1] == self.task_name, ( - f"Task name from args {self.task_name} does not match task name from csv {lines[TASK_NAMES_TO_INDICES[self.task_name]][1]}" - ) - self._all_test_instances = list(range(10)) - - self._task_progress_dict = {} - self._physx_crashed = False - - def reset(self, *args, **kwargs): - # if physx crashed, calling env reset will raise an error - if self._physx_crashed: - self.info["valid"] = False - return self.obs, self.info - - instance_id = self._all_test_instances[ - self._instance_indices_this_env[self._instance_idx_pointer] - ] - self._instance_idx_pointer = (self._instance_idx_pointer + 1) % len( - self._instance_indices_this_env - ) - # the correct way to do: first reset then load task instance - self.env.reset() - load_task_instance_for_env(self.env, self.robot, instance_id) - - obs, info = self.env.reset() - obs = preprocess_obs(self, obs) - # run metric start callbacks - for metric in self.metrics: - metric.start_callback(self.env) - - self._task_progress_dict = {} - return obs, info - - def step(self, action: dict): - if self._physx_crashed: - self.info["success"] = False - self.info["valid"] = False - return self.obs, 0, True, True, self.info - - action = preprocess_action(action) - - # avoid PhysX errors crashing the evaluator - try: - obs, _, terminated, truncated, info = self.env.step(action, n_render_iterations=1) - except Exception as e: - self._physx_crashed = True - terminated = True - truncated = True - self.info["success"] = False - self.info["valid"] = False - logger.error(f"Error in OGEnv.step: {e}") - else: - self.obs = preprocess_obs(self, obs) - self.info = postprocess_info(info) - for metric in self.metrics: - metric.step_callback(self.env) - - if len(self._task_progress_dict) == 0: - self._task_progress_dict = {k: False for k in self.info["task_progress"]} - self._task_progress_dict = { - k: old_progress or self.info["task_progress"][k] - for k, old_progress in self._task_progress_dict.items() - } - - if terminated or truncated: - if self._physx_crashed: - # if physx crashed, don't call the end_callback as it will raise an error - self.info["q_score"] = 0.0 - self.info["valid"] = False - else: - for metric in self.metrics: - metric.end_callback(self.env) - self.info["q_score"] = self.metrics[1].final_q_score - self.info["valid"] = True - - # get task progress - if self._physx_crashed: - task_progress = 0.0 - else: - task_progress = ( - sum(self._task_progress_dict.values()) / len(self._task_progress_dict) * 100 - ) - self.info["task_progress"] = task_progress - - return self.obs, 0, terminated, truncated, self.info - - def load_env(self) -> og.Environment: - """ - Read the environment config file and create the environment. - The config file is located in the configs/envs directory. - """ - # Disable a subset of transition rules for data collection - for rule in DISABLED_TRANSITION_RULES: - rule.ENABLED = False - # Load config file - available_tasks = load_available_tasks() - assert self.task_name in available_tasks, ( - f"Got invalid OmniGibson task name: {self.task_name}" - ) - # Load the seed instance by default - task_cfg = available_tasks[self.task_name][0] - cfg = generate_basic_environment_config(task_name=self.task_name, task_cfg=task_cfg) - cfg["robots"] = [ - generate_robot_config( - task_name=self.task_name, - task_cfg=task_cfg, - ) - ] - # Update observation modalities - cfg["robots"][0]["obs_modalities"] = ["proprio", "rgb"] - cfg["robots"][0]["proprio_obs"] = list(PROPRIOCEPTION_INDICES["R1Pro"].keys()) - logger.info( - f"Setting timeout to be 2x the average length of human demos: {int(self.human_stats['length'] * 2)}" - ) - cfg["task"]["termination_config"]["max_steps"] = int(self.human_stats["length"] * 2) - cfg["task"]["include_obs"] = False - env = og.Environment(configs=cfg) - env = RGBLowResWrapper(env) - env = TaskProgressWrapper(env) - return env - - def load_robot(self) -> BaseRobot: - robot = self.env.scene.object_registry("name", "robot_r1") - # Set a big mass to robot base to prevent it from tipping over - with og.sim.stopped(): - robot.base_footprint_link.mass = 250.0 - return robot - - def load_metrics(self) -> list[MetricBase]: - """ - Load agent and task metrics. - """ - return [AgentMetric(self.human_stats), TaskMetric(self.human_stats)] - - -def register_behavior_envs(): - register( - id="sim_behavior_r1_pro/turning_on_radio", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "turning_on_radio", - }, - ) - - register( - id="sim_behavior_r1_pro/picking_up_trash", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "picking_up_trash", - }, - ) - - register( - id="sim_behavior_r1_pro/putting_away_Halloween_decorations", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "putting_away_Halloween_decorations", - }, - ) - - register( - id="sim_behavior_r1_pro/cleaning_up_plates_and_food", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "cleaning_up_plates_and_food", - }, - ) - - register( - id="sim_behavior_r1_pro/can_meat", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "can_meat", - }, - ) - - register( - id="sim_behavior_r1_pro/setting_mousetraps", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "setting_mousetraps", - }, - ) - - register( - id="sim_behavior_r1_pro/hiding_Easter_eggs", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "hiding_Easter_eggs", - }, - ) - - register( - id="sim_behavior_r1_pro/picking_up_toys", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "picking_up_toys", - }, - ) - - register( - id="sim_behavior_r1_pro/rearranging_kitchen_furniture", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "rearranging_kitchen_furniture", - }, - ) - - register( - id="sim_behavior_r1_pro/putting_up_Christmas_decorations_inside", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "putting_up_Christmas_decorations_inside", - }, - ) - - register( - id="sim_behavior_r1_pro/set_up_a_coffee_station_in_your_kitchen", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "set_up_a_coffee_station_in_your_kitchen", - }, - ) - - register( - id="sim_behavior_r1_pro/putting_dishes_away_after_cleaning", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "putting_dishes_away_after_cleaning", - }, - ) - - register( - id="sim_behavior_r1_pro/preparing_lunch_box", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "preparing_lunch_box", - }, - ) - - register( - id="sim_behavior_r1_pro/loading_the_car", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "loading_the_car", - }, - ) - - register( - id="sim_behavior_r1_pro/carrying_in_groceries", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "carrying_in_groceries", - }, - ) - - register( - id="sim_behavior_r1_pro/bringing_in_wood", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "bringing_in_wood", - }, - ) - - register( - id="sim_behavior_r1_pro/moving_boxes_to_storage", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "moving_boxes_to_storage", - }, - ) - - register( - id="sim_behavior_r1_pro/bringing_water", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "bringing_water", - }, - ) - - register( - id="sim_behavior_r1_pro/tidying_bedroom", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "tidying_bedroom", - }, - ) - - register( - id="sim_behavior_r1_pro/outfit_a_basic_toolbox", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "outfit_a_basic_toolbox", - }, - ) - - register( - id="sim_behavior_r1_pro/sorting_vegetables", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "sorting_vegetables", - }, - ) - - register( - id="sim_behavior_r1_pro/collecting_childrens_toys", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "collecting_childrens_toys", - }, - ) - - register( - id="sim_behavior_r1_pro/putting_shoes_on_rack", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "putting_shoes_on_rack", - }, - ) - - register( - id="sim_behavior_r1_pro/boxing_books_up_for_storage", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "boxing_books_up_for_storage", - }, - ) - - register( - id="sim_behavior_r1_pro/storing_food", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "storing_food", - }, - ) - - register( - id="sim_behavior_r1_pro/clearing_food_from_table_into_fridge", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "clearing_food_from_table_into_fridge", - }, - ) - - register( - id="sim_behavior_r1_pro/assembling_gift_baskets", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "assembling_gift_baskets", - }, - ) - - register( - id="sim_behavior_r1_pro/sorting_household_items", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "sorting_household_items", - }, - ) - - register( - id="sim_behavior_r1_pro/getting_organized_for_work", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "getting_organized_for_work", - }, - ) - - register( - id="sim_behavior_r1_pro/clean_up_your_desk", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "clean_up_your_desk", - }, - ) - - register( - id="sim_behavior_r1_pro/setting_the_fire", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "setting_the_fire", - }, - ) - - register( - id="sim_behavior_r1_pro/clean_boxing_gloves", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "clean_boxing_gloves", - }, - ) - - register( - id="sim_behavior_r1_pro/wash_a_baseball_cap", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "wash_a_baseball_cap", - }, - ) - - register( - id="sim_behavior_r1_pro/wash_dog_toys", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "wash_dog_toys", - }, - ) - - register( - id="sim_behavior_r1_pro/hanging_pictures", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "hanging_pictures", - }, - ) - - register( - id="sim_behavior_r1_pro/attach_a_camera_to_a_tripod", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "attach_a_camera_to_a_tripod", - }, - ) - - register( - id="sim_behavior_r1_pro/clean_a_patio", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "clean_a_patio", - }, - ) - - register( - id="sim_behavior_r1_pro/clean_a_trumpet", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "clean_a_trumpet", - }, - ) - - register( - id="sim_behavior_r1_pro/spraying_for_bugs", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "spraying_for_bugs", - }, - ) - - register( - id="sim_behavior_r1_pro/spraying_fruit_trees", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "spraying_fruit_trees", - }, - ) - - register( - id="sim_behavior_r1_pro/make_microwave_popcorn", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "make_microwave_popcorn", - }, - ) - - register( - id="sim_behavior_r1_pro/cook_cabbage", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "cook_cabbage", - }, - ) - - register( - id="sim_behavior_r1_pro/chop_an_onion", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "chop_an_onion", - }, - ) - - register( - id="sim_behavior_r1_pro/slicing_vegetables", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "slicing_vegetables", - }, - ) - - register( - id="sim_behavior_r1_pro/chopping_wood", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "chopping_wood", - }, - ) - - register( - id="sim_behavior_r1_pro/cook_hot_dogs", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "cook_hot_dogs", - }, - ) - - register( - id="sim_behavior_r1_pro/cook_bacon", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "cook_bacon", - }, - ) - - register( - id="sim_behavior_r1_pro/freeze_pies", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "freeze_pies", - }, - ) - - register( - id="sim_behavior_r1_pro/canning_food", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "canning_food", - }, - ) - - register( - id="sim_behavior_r1_pro/make_pizza", - entry_point="gr00t.eval.sim.BEHAVIOR.behavior_env:BEHAVIORGr00tEnv", - kwargs={ - "task_name": "make_pizza", - }, - ) diff --git a/gr00t/eval/sim/BEHAVIOR/og_teleop_cfg.py b/gr00t/eval/sim/BEHAVIOR/og_teleop_cfg.py deleted file mode 100644 index 5489e8fa3..000000000 --- a/gr00t/eval/sim/BEHAVIOR/og_teleop_cfg.py +++ /dev/null @@ -1,426 +0,0 @@ -from enum import Enum - -from omnigibson.transition_rules import CookingSystemRule, MixingToolRule, ToggleableMachineRule -from omnigibson.utils import transform_utils as T -import torch as th - - -# Define room dependencies by scene -# Format: {scene_name: {room_A: [room_B, room_C], ...}} -ROOM_DEPENDENCIES = { - "house_single_floor": { - "dining_room": ["kitchen", "living_room"], - "kitchen": ["living_room", "dining_room"], - "living_room": ["kitchen", "dining_room"], - }, - "house_double_floor_lower": { - "kitchen": ["living_room", "corridor"], - "living_room": ["kitchen", "corridor"], - "garage": ["corridor"], - }, - "house_double_floor_upper": {}, -} - -TASK_SPECIFIC_EXTRA_ROOMS = { - "bringing_in_kindling": { - "house_double_floor_lower": ["corridor"], - }, - "bringing_newspaper_in": { - "house_double_floor_lower": ["corridor"], - }, - "chopping_wood": { - "house_double_floor_lower": ["garage"], - }, -} - -VALIDATED_TASKS = [ - "picking_up_trash", # difficulty: 2 - "putting_away_Halloween_decorations", # difficulty: 3 - "cleaning_up_plates_and_food", # difficulty: 3.5 - "setting_mousetraps", # difficulty: 2 - "hiding_Easter_eggs", # difficulty: 2 - "set_up_a_coffee_station_in_your_kitchen", # difficulty: 3 - "putting_dishes_away_after_cleaning", # difficulty: 3 - "preparing_lunch_box", # difficulty: 3 - "loading_the_car", # difficulty: 3.5 - "carrying_in_groceries", # difficulty: 3.5 - "turning_on_radio", # difficulty: 1 - "picking_up_toys", # difficulty: 3.5 - "can_meat", # difficulty: 3.5 - "rearranging_kitchen_furniture", # difficulty: 3 - "putting_up_Christmas_decorations_inside", # difficulty: 2 - "bringing_in_wood", # difficulty: 1.5 - "moving_boxes_to_storage", # difficulty: 1.5 - "bringing_water", # difficulty: 1.5 - "tidying_bedroom", # difficulty: 2 - "outfit_a_basic_toolbox", # difficulty: 2, - "sorting_vegetables", - "collecting_childrens_toys", - "putting_shoes_on_rack", - "boxing_books_up_for_storage", - "storing_food", - "clearing_food_from_table_into_fridge", - "assembling_gift_baskets", - "sorting_household_items", - "getting_organized_for_work", - "clean_up_your_desk", - "setting_the_fire", - "clean_boxing_gloves", - "wash_a_baseball_cap", - "wash_dog_toys", - "hanging_pictures", - "attach_a_camera_to_a_tripod", - "clean_a_patio", - "clean_a_trumpet", - "spraying_for_bugs", - "spraying_fruit_trees", - "make_microwave_popcorn", - "cook_cabbage", - "make_pizza", - "chop_an_onion", - "slicing_vegetables", - "chopping_wood", - "canning_food", - "cook_hot_dogs", - "cook_bacon", - "freeze_pies", -] - - -# Viewing mode configuration -class ViewingMode(str, Enum): - SINGLE_VIEW = "single_view" - VR = "vr" - MULTI_VIEW_1 = "multi_view_1" - - -# Feature flags -USE_FLUID = False -USE_CLOTH = False -USE_ARTICULATED = False -FULL_SCENE = False -VIEWING_MODE = ViewingMode.MULTI_VIEW_1 -SIMPLIFIED_TRUNK_CONTROL = True -APPLY_EXTRA_GRIP = False - -# Robot parameters -SUPPORTED_ROBOTS = ["R1", "R1Pro"] -ROBOT_TYPE = "R1Pro" # This should always be our robot generally since GELLO is designed for this specific robot -ROBOT_NAME = "robot_r1" - -# R1 robot-specific configurations -R1_UPRIGHT_TORSO_JOINT_POS = th.tensor( - [0.45, -0.4, 0.0, 0.0], dtype=th.float32 -) # For upper cabinets, shelves, etc. -R1_DOWNWARD_TORSO_JOINT_POS = th.tensor( - [1.6, -2.5, -0.94, 0.0], dtype=th.float32 -) # For bottom cabinets, dishwashers, etc. -R1_GROUND_TORSO_JOINT_POS = th.tensor( - [1.735, -2.57, -2.1, 0.0], dtype=th.float32 -) # For ground object pick up -R1_WRIST_CAMERA_LOCAL_POS = th.tensor( - [0.1, 0.0, -0.1], dtype=th.float32 -) # Local position of the wrist camera relative to eef -R1_WRIST_CAMERA_LOCAL_ORI = th.tensor( - [0.6830127018922194, 0.6830127018922193, 0.18301270189221927, 0.18301270189221946], - dtype=th.float32, -) # Local orientation of the wrist camera relative to eef - -# R1 Pro robot-specific configurations -R1PRO_HEAD_CAMERA_LOCAL_POS = th.tensor( - [0.06, 0.0, 0.01], dtype=th.float32 -) # Local position of the head camera relative to head link -R1PRO_HEAD_CAMERA_LOCAL_ORI = th.tensor( - [-1.0, 0.0, 0.0, 0.0], dtype=th.float32 -) # Local orientation of the head camera relative to head link - -# Default parameters -DEFAULT_TRUNK_TRANSLATE = 0.5 -DEFAULT_RESET_DELTA_SPEED = 10.0 # deg / sec -N_COOLDOWN_SECS = 1.5 -FLASHLIGHT_INTENSITY = 2000.0 - -# Visualization settings -RESOLUTION = [1080, 1080] # [H, W] -USE_VISUAL_SPHERES = False -USE_VERTICAL_VISUALIZERS = False -GHOST_APPEAR_THRESHOLD = 0.1 # Threshold for showing ghost -GHOST_APPEAR_TIME = 10 # Number of frames to wait before showing ghost -USE_REACHABILITY_VISUALIZERS = True -AUTO_CHECKPOINTING = False # checkpoint when 1) a new termination condition is met 2) some fixed amount of time has passed -STEPS_TO_AUTO_CHECKPOINT = 6000 # Assuming 20 fps, this is about 5 minutes - -# Visualization cylinder configs -VIS_GEOM_COLORS = { - False: [ - th.tensor([1.0, 0, 0]), # Red - th.tensor([0, 1.0, 0]), # Green - th.tensor([0, 0, 1.0]), # Blue - ], - True: [ - th.tensor([1.0, 0.5, 0.5]), # Light Red - th.tensor([0.5, 1.0, 0.5]), # Light Green - th.tensor([0.5, 0.5, 1.0]), # Light Blue - ], -} -BEACON_LENGTH = 5.0 - -# Global whitelist of visual-only objects -VISUAL_ONLY_CATEGORIES = { - # "bush", - # "tree", - # "pot_plant", -} - -# Global whitelist of task-relevant objects -EXTRA_TASK_RELEVANT_CATEGORIES = { - "floors", - "driveway", - "lawn", -} - -# OmniGibson simulator settings -OMNIGIBSON_MACROS = { - "USE_NUMPY_CONTROLLER_BACKEND": True, - "USE_GPU_DYNAMICS": (USE_FLUID or USE_CLOTH), - "ENABLE_FLATCACHE": True, - "ENABLE_OBJECT_STATES": True, # True (FOR TASKS!) - "ENABLE_TRANSITION_RULES": True, - "ENABLE_CCD": True, - "ENABLE_HQ_RENDERING": USE_FLUID, - "GUI_VIEWPORT_ONLY": True, -} - -# Controller configuration for R1 robot -R1_CONTROLLER_CONFIG = { - "arm_left": { - "name": "JointController", - "motor_type": "position", - "pos_kp": 150, - "command_input_limits": None, - "command_output_limits": None, - "use_impedances": False, - "use_delta_commands": False, - }, - "arm_right": { - "name": "JointController", - "motor_type": "position", - "pos_kp": 150, - "command_input_limits": None, - "command_output_limits": None, - "use_impedances": False, - "use_delta_commands": False, - }, - "gripper_left": { - "name": "MultiFingerGripperController", - "mode": "smooth", - "command_input_limits": "default", - "command_output_limits": "default", - }, - "gripper_right": { - "name": "MultiFingerGripperController", - "mode": "smooth", - "command_input_limits": "default", - "command_output_limits": "default", - }, - "base": { - "name": "HolonomicBaseJointController", - "motor_type": "velocity", - "vel_kp": 150, - "command_input_limits": [-th.ones(3), th.ones(3)], - "command_output_limits": [ - -th.tensor([0.75, 0.75, 1.0]), - th.tensor([0.75, 0.75, 1.0]), - ], - "use_impedances": False, - }, - "trunk": { - "name": "JointController", - "motor_type": "position", - "pos_kp": 150, - "command_input_limits": None, - "command_output_limits": None, - "use_impedances": False, - "use_delta_commands": False, - }, - "camera": { - "name": "NullJointController", - }, -} - -ROBOT_RESET_JOINT_POS = { - "R1": th.tensor( - [ - 0, - 0, - 0, - 0, - 0, - 0, # 6 virtual base joints - 0, - 0, - 0, - 0, # 4 trunk joints -- these will be programmatically added - 33, - -33, # L, R arm joints - 162, - 162, - -108, - -108, - 34, - -34, - 73, - -73, - -65, - 65, - 0, - 0, # 2 L gripper - 0, - 0, # 2 R gripper - ] - ) - * th.pi - / 180, - "R1Pro": th.zeros(28) * th.pi / 180, -} - -WRIST_CAMERA_LINK_NAME = { - "R1": { - "left": "left_eef_link", - "right": "right_eef_link", - }, - "R1Pro": { - "left": "left_realsense_link", - "right": "right_realsense_link", - }, -} - -HEAD_CAMERA_LINK_NAME = { - "R1": "eyes", - "R1Pro": "zed_link", -} - -FINGER_LINK_NAME = { - "R1": { - "left": "left_gripper_axis", - "right": "right_gripper_axis", - }, - "R1Pro": { - "left": "left_gripper_finger_joint", - "right": "right_gripper_finger_joint", - }, -} - -# Reachability visualizer settings -REACHABILITY_VISUALIZER_CONFIG = { - "beam_width": 0.005, - "square_distance": 0.6, - "square_width": 0.4, - "square_height": 0.3, - "beam_color": [0.7, 0.7, 0.7], -} - -# Visualization cylinder configurations -VIS_CYLINDER_CONFIG = { - "width": 0.01, - "lengths": [0.25, 0.25, 0.5], # x,y,z - "proportion_offsets": [0.0, 0.0, 0.5], # x,y,z - "quat_offsets": [ - T.euler2quat(th.tensor([0.0, th.pi / 2, 0.0])), - T.euler2quat(th.tensor([-th.pi / 2, 0.0, 0.0])), - T.euler2quat(th.tensor([0.0, 0.0, 0.0])), - ], -} - -# Frame visualizer cylinder configurations -ATTACHMENT_FRAME_CONFIG = { - "width": 0.008, - "lengths": [0.15, 0.15, 0.15], - "quat_offsets": [ - T.euler2quat(th.tensor([0.0, th.pi / 2, 0.0])), # X-axis (red) - T.euler2quat(th.tensor([-th.pi / 2, 0.0, 0.0])), # Y-axis (green) - T.euler2quat(th.tensor([0.0, 0.0, 0.0])), # Z-axis (blue) - ], - "colors": [ - th.tensor([1.0, 0.0, 0.0]), # Red for X-axis - th.tensor([0.0, 1.0, 0.0]), # Green for Y-axis - th.tensor([0.0, 0.0, 1.0]), # Blue for Z-axis - ], -} - -# Camera and viewport configuration -CAMERA_VIEWPORT_POSITIONS = { - "left_shoulder": {"parent": "DockSpace", "position": "LEFT", "ratio": 0.25}, - "left_wrist": { - "parent": "viewport_left_shoulder", - "position": "BOTTOM", - "ratio": 0.5, - }, - "right_shoulder": {"parent": "DockSpace", "position": "RIGHT", "ratio": 0.2}, - "right_wrist": { - "parent": "viewport_right_shoulder", - "position": "BOTTOM", - "ratio": 0.5, - }, -} - -# External camera parameters -EXTERNAL_CAMERA_CONFIGS = { - "external_sensor0": { - "position": [-0.4, 0, 2.0], - "orientation": [0.2706, -0.2706, -0.6533, 0.6533], - }, - "external_sensor1": { - "position": [-0.2, 0.6, 2.0], - "orientation": [-0.1930, 0.4163, 0.8062, -0.3734], - }, - "external_sensor2": { - "position": [-0.2, -0.6, 2.0], - "orientation": [0.4164, -0.1929, -0.3737, 0.8060], - }, -} - -# UI visual settings -UI_SETTINGS = { - "goal_satisfied_color": 0xFF00FF00, # Green (ABGR) - "goal_unsatisfied_color": 0xFF0000FF, # Red (ABGR) - "font_size": 25, - "top_margin": 50, - "left_margin": 50, -} - -# Status display settings -STATUS_DISPLAY_SETTINGS = { - "event_duration": 3.0, # seconds - "persistent_duration": 0.1, # For persistent events - very short - "persistent_states": ["in_cooldown", "waiting_to_resume"], - "event_colors": { - "checkpoint": 0xFF00FF00, # Green - "rollback": 0xFFFF00FF, # Magenta - "cooldown": 0xFF00FFFF, # Yellow - "waiting": 0xFFFF0000, # White - "reset": 0xFF00AAFF, # Orange - }, - "font_size": 20, - "bottom_margin": 50, - "right_margin": 50, - "line_spacing": 5, -} - -# Visual sphere settings for object highlighting -OBJECT_HIGHLIGHT_SPHERE = { - "opacity": 0.5, - "emissive_intensity": 10000.0, -} - -INCLUDE_TRUNK_CONTACT_OBS = True -INCLUDE_BASE_CONTACT_OBS = True -INCLUDE_ARM_CONTACT_OBS = False -INCLUDE_FINGER_CONTACT_OBS = False - -INCLUDE_JACOBIAN_OBS = False -GHOST_UPDATE_FREQ = 3 - -BLINK_WHEN_IN_CONTACT = True - -DISABLED_TRANSITION_RULES = [ToggleableMachineRule, MixingToolRule, CookingSystemRule] diff --git a/gr00t/eval/sim/BEHAVIOR/og_teleop_utils.py b/gr00t/eval/sim/BEHAVIOR/og_teleop_utils.py deleted file mode 100644 index df05070c4..000000000 --- a/gr00t/eval/sim/BEHAVIOR/og_teleop_utils.py +++ /dev/null @@ -1,248 +0,0 @@ -from pathlib import Path - -from bddl.activity import Conditions -from gr00t.eval.sim.BEHAVIOR.og_teleop_cfg import ( - DEFAULT_TRUNK_TRANSLATE, - R1_CONTROLLER_CONFIG, - R1_DOWNWARD_TORSO_JOINT_POS, - R1_GROUND_TORSO_JOINT_POS, - R1_UPRIGHT_TORSO_JOINT_POS, - RESOLUTION, - ROBOT_NAME, - ROBOT_RESET_JOINT_POS, - ROBOT_TYPE, - ROOM_DEPENDENCIES, - TASK_SPECIFIC_EXTRA_ROOMS, -) -import yaml - - -def get_task_relevant_room_types(activity_name): - activity_conditions = Conditions( - activity_name, - 0, - simulator_name="omnigibson", - predefined_problem=None, - ) - init_conds = activity_conditions.parsed_initial_conditions - room_types = set() - for init_cond in init_conds: - if len(init_cond) == 3: - if "inroom" == init_cond[0]: - room_types.add(init_cond[2]) - - return list(room_types) - - -def augment_rooms(relevant_rooms, scene_model, task_name): - """ - Augment the list of relevant rooms by adding dependent rooms that need to be loaded together. - - Args: - relevant_rooms: List of room types that are initially relevant - scene_model: The scene model being used - task_name: Name of the task being used - - Returns: - Augmented list of room types including all dependencies - """ - - # Get dependencies for current scene - scene_dependencies = ROOM_DEPENDENCIES[scene_model] - - # Create a copy of the original list to avoid modifying it during iteration - augmented_rooms = relevant_rooms.copy() - - # Check each relevant room for dependencies - for room in relevant_rooms: - if room in scene_dependencies: - # Add dependent rooms if they're not already in the list - for dependent_room in scene_dependencies[room]: - if dependent_room not in augmented_rooms: - augmented_rooms.append(dependent_room) - - # Additionally add any task-specific rooms - augmented_rooms += TASK_SPECIFIC_EXTRA_ROOMS.get(task_name, dict()).get(scene_model, []) - # Remove redundancies - augmented_rooms = list(set(augmented_rooms)) - - return augmented_rooms - - -def load_available_tasks(): - """ - Load available tasks from configuration file - - Returns: - dict: Dictionary of available tasks - """ - # Get directory of current file - dir_path = Path(__file__).parent - task_cfg_path = dir_path / "available_tasks.yaml" - - try: - with open(task_cfg_path, "r") as file: - available_tasks = yaml.safe_load(file) - return available_tasks - except (FileNotFoundError, yaml.YAMLError) as e: - print(f"Error loading available tasks: {e}") - return {} - - -def infer_torso_qpos_from_trunk_translate(translate): - """ - Convert from trunk translate value to torso joint positions - - Args: - translate (float): Trunk translate value between 0.0 and 2.0 - - Returns: - torch.Tensor: Torso joint positions - """ - translate = min(max(translate, 0.0), 2.0) - - # Interpolate between the three pre-determined joint positions - if translate <= 1.0: - # Interpolate between upright and down positions - interpolation_factor = translate - interpolated_trunk_pos = ( - 1 - interpolation_factor - ) * R1_UPRIGHT_TORSO_JOINT_POS + interpolation_factor * R1_DOWNWARD_TORSO_JOINT_POS - else: - # Interpolate between down and ground positions - interpolation_factor = translate - 1.0 - interpolated_trunk_pos = ( - 1 - interpolation_factor - ) * R1_DOWNWARD_TORSO_JOINT_POS + interpolation_factor * R1_GROUND_TORSO_JOINT_POS - - return interpolated_trunk_pos - - -def generate_robot_config(task_name=None, task_cfg=None): - """ - Generate robot configuration - - Args: - task_name: Name of the task (optional) - task_cfg: Dictionary of task config (optional) - - Returns: - dict: Robot configuration - """ - # Create a copy of the controller config to avoid modifying the original - controller_config = {k: v.copy() for k, v in R1_CONTROLLER_CONFIG.items()} - - robot_config = { - "type": ROBOT_TYPE, - "name": ROBOT_NAME, - "action_normalize": False, - "controller_config": controller_config, - "self_collisions": True, - "obs_modalities": [], - "position": [0.0, 0.0, 0.0], - "orientation": [0.0, 0.0, 0.0, 1.0], - "grasping_mode": "assisted", - "sensor_config": { - "VisionSensor": { - "sensor_kwargs": { - "image_height": RESOLUTION[0], - "image_width": RESOLUTION[1], - }, - }, - }, - } - - # Override position and orientation for tasks - if task_name is not None and task_cfg is not None: - robot_config["position"] = task_cfg["robot_start_position"] - robot_config["orientation"] = task_cfg["robot_start_orientation"] - - # Add reset joint positions - joint_pos = ROBOT_RESET_JOINT_POS[ROBOT_TYPE].clone() - - # NOTE: Fingers MUST start open, or else generated AG spheres will be spawned incorrectly - joint_pos[-4:] = 0.05 - - # Update trunk qpos as well - joint_pos[6:10] = infer_torso_qpos_from_trunk_translate(DEFAULT_TRUNK_TRANSLATE) - - robot_config["reset_joint_pos"] = joint_pos - - return robot_config - - -def get_camera_config(name, relative_prim_path, position, orientation, resolution, modalities=[]): - """ - Generate a camera configuration dictionary - - Args: - name (str): Camera name - relative_prim_path (str): Relative path to camera in the scene - position (List[float]): Camera position [x, y, z] - orientation (List[float]): Camera orientation [x, y, z, w] - resolution (List[int]): Camera resolution [height, width] - modalities (List[str]): List of modalities for the camera - - Returns: - dict: Camera configuration dictionary - """ - return { - "sensor_type": "VisionSensor", - "name": name, - "relative_prim_path": relative_prim_path, - "modalities": modalities, - "sensor_kwargs": { - "viewport_name": "Viewport", - "image_height": resolution[0], - "image_width": resolution[1], - }, - "position": position, - "orientation": orientation, - "pose_frame": "parent", - "include_in_obs": False, - } - - -def generate_basic_environment_config(task_name, task_cfg): - """ - Generate a basic environment configuration - - Args: - task_name (str): Name of the task - task_cfg: Dictionary of task config - - Returns: - dict: Environment configuration - """ - cfg = { - "env": { - "action_frequency": 30, - "rendering_frequency": 30, - "physics_frequency": 120, - }, - "scene": { - "type": "InteractiveTraversableScene", - "scene_model": task_cfg["scene_model"], - "load_room_types": None, - "load_room_instances": task_cfg.get("load_room_instances", None), - "include_robots": False, - }, - "task": { - "type": "BehaviorTask", - "activity_name": task_name, - "activity_definition_id": 0, - "activity_instance_id": 0, - "predefined_problem": None, - "online_object_sampling": False, - "debug_object_sampling": False, - "highlight_task_relevant_objects": False, - "termination_config": { - "max_steps": 5000, - }, - "reward_config": { - "r_potential": 1.0, - }, - "include_obs": False, - }, - } - return cfg diff --git a/gr00t/eval/sim/BEHAVIOR/prepare_test_instances.py b/gr00t/eval/sim/BEHAVIOR/prepare_test_instances.py deleted file mode 100644 index c6d64a51a..000000000 --- a/gr00t/eval/sim/BEHAVIOR/prepare_test_instances.py +++ /dev/null @@ -1,15 +0,0 @@ -from pathlib import Path - -from huggingface_hub import snapshot_download - - -if __name__ == "__main__": - dir_path = Path(__file__).parent - - test_instances_path = dir_path / "test_instances" - test_instances_path.mkdir(parents=True, exist_ok=True) - snapshot_download( - repo_id="behavior-1k/2025-challenge-hidden-instances", - repo_type="dataset", - local_dir=test_instances_path, - ) diff --git a/gr00t/eval/sim/GR00T-WholeBodyControl/setup_GR00T_WholeBodyControl.sh b/gr00t/eval/sim/GR00T-WholeBodyControl/setup_GR00T_WholeBodyControl.sh deleted file mode 100644 index 86a08681d..000000000 --- a/gr00t/eval/sim/GR00T-WholeBodyControl/setup_GR00T_WholeBodyControl.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash -set -euxo pipefail - -# Where this script lives (put it inside your repo) -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_REPO="$SCRIPT_DIR/../../../.." -GR00T_WHOLEBODYCONTROL_REPO="$PROJECT_REPO/external_dependencies/GR00T-WholeBodyControl" -UV_ENV="$SCRIPT_DIR/GR00T-WholeBodyControl_uv" - -git submodule update --init $GR00T_WHOLEBODYCONTROL_REPO - -# Build helpers -# python -m pip install cmake==3.18.4 -rm -rf "$UV_ENV" -mkdir -p "$UV_ENV" -uv venv "$UV_ENV/.venv" --python 3.10 -source "$UV_ENV/.venv/bin/activate" -uv pip install setuptools wheel - -# # Sim stack -if ! command -v git-lfs >/dev/null 2>&1; then - echo "Git LFS not installed. Please install: https://git-lfs.github.com/" - exit 1 -fi -git -C "$GR00T_WHOLEBODYCONTROL_REPO" lfs pull -rm -rf "$GR00T_WHOLEBODYCONTROL_REPO/gr00t_wbc/dexmg/gr00trobosuite" -git clone https://github.com/xieleo5/robosuite.git "$GR00T_WHOLEBODYCONTROL_REPO/gr00t_wbc/dexmg/gr00trobosuite" -b leo/support_g1_locomanip -GIT_LFS_SKIP_SMUDGE=1 uv pip install -e "$GR00T_WHOLEBODYCONTROL_REPO" --config-settings editable_mode=compat -uv pip install -e "$GR00T_WHOLEBODYCONTROL_REPO/gr00t_wbc/dexmg/gr00trobosuite" --config-settings editable_mode=compat -uv pip install -e "$GR00T_WHOLEBODYCONTROL_REPO/gr00t_wbc/dexmg/gr00trobocasa" --config-settings editable_mode=compat -uv pip install mujoco==3.2.6 transformers==4.51.3 - -uv pip install --editable "$PROJECT_REPO" --no-deps - -# Sanity import & env construction -python - <<'PY' -import os -os.environ.setdefault("MUJOCO_GL", "egl") -os.environ.setdefault("PYOPENGL_PLATFORM", "egl") -import gymnasium as gym, robocasa, robosuite -import gr00t_wbc.control.envs.robocasa.sync_env -print("Imports OK:", robosuite.__version__) -env = gym.make("gr00tlocomanip_g1_sim/LMBottlePnP_G1_gear_wbc", enable_render=True) -print("Env OK:", type(env)) -PY diff --git a/gr00t/eval/sim/LIBERO/libero_env.py b/gr00t/eval/sim/LIBERO/libero_env.py index 20b3f2145..bb2cb5e51 100644 --- a/gr00t/eval/sim/LIBERO/libero_env.py +++ b/gr00t/eval/sim/LIBERO/libero_env.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """ LIBERO environment @@ -84,10 +99,13 @@ class LiberoEnv(gym.Env): """LanguageTable env.""" def __init__(self, task_bddl_file: str, task_description: str): + # `ignore_done=True`: outer `MultiStepWrapper` owns truncation; robosuite's + # horizon-termination is redundant and conflicts with LIBERO's done-override. self._env = OffScreenRenderEnv( bddl_file_name=task_bddl_file, camera_heights=256, camera_widths=256, + ignore_done=True, ) self._task_description = task_description # Convert Gym action space to Gymnasium. @@ -141,6 +159,9 @@ def _process_observation(self, obs): return new_obs def reset(self, seed=None, options=None): + if seed is not None: + # OffScreenRenderEnv follows the robosuite API: .seed(int), not reset(seed=...). + self._env.seed(int(seed)) observation = self._env.reset() observation = self._process_observation(observation) info = {"success": self._env.check_success()} @@ -199,7 +220,13 @@ def register_libero_envs(): benchmark_dict = benchmark.get_benchmark_dict() task_suite_name = "libero_10" # can also choose libero_spatial, libero_object, etc. task_suite = benchmark_dict[task_suite_name]() - for key in ["libero_10", "libero_spatial", "libero_object", "libero_goal", "libero_90"]: + for key in [ + "libero_10", + "libero_spatial", + "libero_object", + "libero_goal", + "libero_90", + ]: for task_name in benchmark_dict[key]().get_task_names(): print(f"- {key}/{task_name}") @@ -217,7 +244,11 @@ def register_libero_envs(): ) # step over the environment - env_args = {"bddl_file_name": task_bddl_file, "camera_heights": 128, "camera_widths": 128} + env_args = { + "bddl_file_name": task_bddl_file, + "camera_heights": 128, + "camera_widths": 128, + } env = OffScreenRenderEnv(**env_args) env.seed(0) env.reset() diff --git a/gr00t/eval/sim/LIBERO/setup_libero.sh b/gr00t/eval/sim/LIBERO/setup_libero.sh index 30d1399fc..c9a041fd7 100644 --- a/gr00t/eval/sim/LIBERO/setup_libero.sh +++ b/gr00t/eval/sim/LIBERO/setup_libero.sh @@ -14,21 +14,57 @@ git submodule update --init $LIBERO_REPO # python -m pip install cmake==3.18.4 rm -rf $LIBERO_UV_ENV mkdir -p $LIBERO_UV_ENV -uv venv $LIBERO_UV_ENV/.venv --python 3.10 +uv venv $LIBERO_UV_ENV/.venv --python 3.12 source $LIBERO_UV_ENV/.venv/bin/activate -# uv pip install gymnasium==1.2.0 # -> 2.9.1 -> -uv pip install --requirements $LIBERO_REPO/requirements.txt +# LIBERO's pinned requirements predate Python 3.12. Patch only the pins that +# otherwise build from source or pull source-only transitive deps on py3.12. +PATCHED_REQUIREMENTS="$LIBERO_UV_ENV/requirements-py312.txt" +python - < pathtools -> removed `imp` +} + +src = Path("$LIBERO_REPO/requirements.txt") +dst = Path("$PATCHED_REQUIREMENTS") +lines = [] +for raw in src.read_text().splitlines(): + stripped = raw.strip() + if not stripped or stripped.startswith("#"): + lines.append(raw) + continue + name = stripped.split("==", 1)[0].strip().lower() + lines.append(replacements.get(name, raw)) +dst.write_text("\n".join(lines) + "\n") +PY +uv pip install --requirements $PATCHED_REQUIREMENTS uv pip install -e $LIBERO_REPO --config-settings editable_mode=compat -uv pip install --editable $PROJECT_REPO --no-deps -uv pip install torch==2.5.1 torchvision==0.20.1 pydantic av tianshou==0.5.1 tyro pandas dm_tree einops==0.8.1 albumentations==1.4.18 zmq -uv pip install transformers==4.51.3 msgpack==1.1.0 msgpack-numpy==0.4.8 gymnasium==0.29.1 -uv pip install numpy==1.26.4 +# py3.12 pins: stop the resolver backtracking numba/llvmlite to the 3.10-only build +uv pip install torch==2.9.0 torchvision==0.24.0 pydantic av tianshou==0.5.1 numba==0.65.1 llvmlite==0.47.0 tyro pandas dm_tree einops==0.8.1 albumentations==1.4.18 zmq +uv pip install transformers==4.57.3 msgpack==1.1.0 msgpack-numpy==0.4.8 gymnasium==0.29.1 +# Pin mujoco: robosuite 1.4.0 (pulled by LIBERO's requirements) calls +# mj_fullM(model, dst, M), whose signature changed in mujoco 3.10.0 (2026-06-22) +# to mj_fullM(model, data, dst). mujoco is otherwise unpinned here, so it floats +# to the latest release and crashes env creation. Pin below the break (matches +# the RoboCasa island's existing mujoco==3.3.1 pin). +uv pip install numpy==1.26.4 mujoco==3.3.1 -uv pip install --editable "$PROJECT_REPO" --no-deps +# Expose gr00t from the repo root via a .pth: no dependency re-resolution, and +# the island supplies gr00t's runtime deps itself (matches the old --no-deps). +python -c "import sysconfig, pathlib; pathlib.Path(sysconfig.get_path('purelib'), 'gr00t.pth').write_text(pathlib.Path('$PROJECT_REPO').resolve().as_posix() + '\n')" rm -rf $HOME/.libero -echo "y\n" | python -c "from gr00t.eval.sim.LIBERO.libero_env import register_libero_envs" +printf 'n\n' | python -c "from gr00t.eval.sim.LIBERO.libero_env import register_libero_envs" python - <<'PY' +import os +os.environ.setdefault("MUJOCO_GL", "egl") +os.environ.setdefault("PYOPENGL_PLATFORM", "egl") from gr00t.eval.sim.LIBERO.libero_env import register_libero_envs register_libero_envs() import gymnasium as gym @@ -38,4 +74,4 @@ env.close() print("Env OK:", type(env)) PY -#final_info -> 2.9.1 -> final_info \ No newline at end of file +#final_info -> 2.9.1 -> final_info diff --git a/gr00t/eval/sim/SimplerEnv/setup_SimplerEnv.sh b/gr00t/eval/sim/SimplerEnv/setup_SimplerEnv.sh index ab64473ad..4f8f70f54 100644 --- a/gr00t/eval/sim/SimplerEnv/setup_SimplerEnv.sh +++ b/gr00t/eval/sim/SimplerEnv/setup_SimplerEnv.sh @@ -17,7 +17,9 @@ rm -rf "$UV_ENV" mkdir -p "$UV_ENV" uv venv "$UV_ENV/.venv" --python 3.10 source "$UV_ENV/.venv/bin/activate" -uv pip install setuptools>=80.9.0 +uv pip install "setuptools<71" +BUILD_CONSTRAINTS="$UV_ENV/build-constraints.txt" +printf 'scikit-build-core<0.10\n' > "$BUILD_CONSTRAINTS" # Core deps (match cluster’s pyproject pattern) uv pip install \ @@ -31,13 +33,29 @@ uv pip install \ # uv pip install -e "$SIMPLER_REPO/ManiSkill2_real2sim" --config-settings editable_mode=compat # uv pip install -e "$SIMPLER_REPO" --config-settings editable_mode=compat -uv pip install -e "$SIMPLER_REPO/ManiSkill2_real2sim" -uv pip install -e "$SIMPLER_REPO" +uv pip install --build-constraint "$BUILD_CONSTRAINTS" -e "$SIMPLER_REPO/ManiSkill2_real2sim" +uv pip install --build-constraint "$BUILD_CONSTRAINTS" -e "$SIMPLER_REPO" -# Make your OSS project importable -uv pip install --editable "$PROJECT_REPO" --no-deps +# gr00t pins python>=3.12, so editable-installing it into this 3.10 sim island +# fails dependency resolution. Drop a .pth instead: gr00t imports from the repo +# root using the island's own deps (the prior install was --no-deps anyway). +python -c "import sysconfig, pathlib; pathlib.Path(sysconfig.get_path('purelib'), 'gr00t.pth').write_text(pathlib.Path('$PROJECT_REPO').resolve().as_posix() + '\n')" -uv pip install tianshou==0.5.1 pydantic av zmq torchvision==0.22.0 transformers==4.51.3 +uv pip install \ + tianshou==0.5.1 \ + pydantic \ + av \ + zmq \ + torchvision==0.22.0 \ + transformers==4.57.3 \ + tyro \ + setuptools==80.9.0 \ + pandas==2.2.3 \ + dm-tree==0.1.9 \ + einops==0.8.1 \ + albumentations==1.4.18 \ + diffusers==0.35.1 \ + scipy==1.15.3 # Sanity check python - <<'PY' @@ -54,8 +72,3 @@ print("Env OK:", type(env)) PY echo "SimplerEnv ready at: $UV_ENV/.venv/bin/python3" - - -## STUFF I ADDED MANUALLY - - diff --git a/gr00t/eval/sim/SimplerEnv/simpler_env.py b/gr00t/eval/sim/SimplerEnv/simpler_env.py index fa69f066d..45586c34e 100644 --- a/gr00t/eval/sim/SimplerEnv/simpler_env.py +++ b/gr00t/eval/sim/SimplerEnv/simpler_env.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 cv2 import gymnasium as gym from gymnasium.envs.registration import register @@ -20,7 +35,10 @@ def __init__(self, env_name: str, image_size: tuple[int, int]): self.observation_space = gym.spaces.Dict( { "video.image": gym.spaces.Box( - low=0, high=255, shape=(image_size[0], image_size[1], 3), dtype=np.uint8 + low=0, + high=255, + shape=(image_size[0], image_size[1], 3), + dtype=np.uint8, ), "state.x": gym.spaces.Box(low=obs_low[0], high=obs_high[0], shape=(1,)), "state.y": gym.spaces.Box(low=obs_low[1], high=obs_high[1], shape=(1,)), @@ -60,7 +78,7 @@ def reset(self, seed=None, options=None): self.sticky_action_is_on = False self.sticky_gripper_action = 0.0 self.gripper_action_repeat = 0 - observation, info = self.env.reset() + observation, info = self.env.reset(seed=int(seed) if seed is not None else None) observation = self._process_observation(observation) info["success"] = False return observation, info @@ -80,7 +98,7 @@ def step(self, action): ) observation, reward, done, truncated, info = self.env.step(action_vector) observation = self._process_observation(observation) - info["success"] = done + info["success"] = bool(info.get("success", False)) return observation, reward, done, truncated, info def _process_observation(self, obs): @@ -127,7 +145,10 @@ def __init__(self, env_name: str, image_size: tuple[int, int]): self.observation_space = gym.spaces.Dict( { "video.image_0": gym.spaces.Box( - low=0, high=255, shape=(image_size[0], image_size[1], 3), dtype=np.uint8 + low=0, + high=255, + shape=(image_size[0], image_size[1], 3), + dtype=np.uint8, ), "state.x": gym.spaces.Box(low=obs_low[0], high=obs_high[0], shape=(1,)), "state.y": gym.spaces.Box(low=obs_low[1], high=obs_high[1], shape=(1,)), @@ -160,7 +181,7 @@ def __init__(self, env_name: str, image_size: tuple[int, int]): self.default_rot = np.array([[0, 0, 1.0], [0, 1.0, 0], [-1.0, 0, 0]]) def reset(self, seed=None, options=None): - observation, info = self.env.reset() + observation, info = self.env.reset(seed=int(seed) if seed is not None else None) observation = self._process_observation(observation) info["success"] = False return observation, info @@ -180,7 +201,7 @@ def step(self, action): ) observation, reward, done, truncated, info = self.env.step(action_vector) observation = self._process_observation(observation) - info["success"] = done + info["success"] = bool(info.get("success", False)) return observation, reward, done, truncated, info def _process_observation(self, obs): diff --git a/gr00t/eval/sim/__init__.py b/gr00t/eval/sim/__init__.py index e69de29bb..467079831 100644 --- a/gr00t/eval/sim/__init__.py +++ b/gr00t/eval/sim/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/eval/sim/env_utils.py b/gr00t/eval/sim/env_utils.py index 7758c0516..5c6683942 100644 --- a/gr00t/eval/sim/env_utils.py +++ b/gr00t/eval/sim/env_utils.py @@ -1,32 +1,69 @@ -from gr00t.data.embodiment_tags import EmbodimentTag - - -def is_groot_locomanip_env(env_name: str) -> bool: - return env_name.startswith("gr00tlocomanip") +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. - -def is_behavior_env(env_name: str) -> bool: - return env_name.startswith("sim_behavior_r1_pro") +from gr00t.data.embodiment_tags import EmbodimentTag -def is_gr1_env(env_name: str) -> bool: - """ensures gr1 and gr1_unified are the same embodiment tag""" - return env_name.startswith("gr1") or env_name.startswith("gr1_unified") +# Mapping from gym-registered env_name prefix to EmbodimentTag. +# The prefix is the part before "/" in env_name (e.g. "libero_sim" from "libero_sim/task"). +# Add new entries here when supporting a new benchmark. +ENV_PREFIX_TO_EMBODIMENT_TAG: dict[str, EmbodimentTag] = { + # Locomanipulation + "gr00tlocomanip_g1": EmbodimentTag.UNITREE_G1, + "gr00tlocomanip_g1_sim": EmbodimentTag.UNITREE_G1, + "gr00tlocomanip_g1_new": EmbodimentTag.UNITREE_G1, + # Posttrain benchmarks + "simpler_env_google": EmbodimentTag.SIMPLER_ENV_GOOGLE, + "simpler_env_widowx": EmbodimentTag.SIMPLER_ENV_WIDOWX, + "libero_sim": EmbodimentTag.LIBERO_PANDA, + "robocasa_panda_omron": EmbodimentTag.ROBOCASA_PANDA_OMRON, + "robocasa365_panda_omron": EmbodimentTag.ROBOCASA_PANDA_OMRON, + "gr1_unified": EmbodimentTag.ROBOCASA_GR1_TABLETOP, +} def get_embodiment_tag_from_env_name(env_name: str) -> EmbodimentTag: - if is_groot_locomanip_env(env_name): - groot_locomanip_mappings = { - "gr00tlocomanip_g1": EmbodimentTag.UNITREE_G1, - "gr00tlocomanip_g1_sim": EmbodimentTag.UNITREE_G1, - "gr00tlocomanip_g1_new": EmbodimentTag.UNITREE_G1, - } - return groot_locomanip_mappings[env_name.split("/")[0]] - - if is_behavior_env(env_name): - return EmbodimentTag.BEHAVIOR_R1_PRO + """Get the EmbodimentTag for a gym-registered environment name. - if is_gr1_env(env_name): - return EmbodimentTag.GR1 + Looks up the env_name prefix (before "/") in ENV_PREFIX_TO_EMBODIMENT_TAG. + Falls back to using the prefix directly as an EmbodimentTag value (most + prefixes are deliberately equal to their tag's value; the dict above only + patches the prefixes that diverge). - return EmbodimentTag(env_name.split("/")[0]) + Raises: + ValueError: If the prefix is neither a key in + ENV_PREFIX_TO_EMBODIMENT_TAG nor a valid EmbodimentTag value. This + is the expected failure when a new benchmark is registered under a + new prefix but no mapping entry was added — the message points at + the exact fix so the failure is actionable at the call boundary + instead of surfacing as a cryptic enum error deeper in eval. + """ + prefix = env_name.split("/")[0] + if prefix in ENV_PREFIX_TO_EMBODIMENT_TAG: + return ENV_PREFIX_TO_EMBODIMENT_TAG[prefix] + try: + return EmbodimentTag(prefix) + except ValueError: + known_prefixes = sorted(ENV_PREFIX_TO_EMBODIMENT_TAG) + valid_tag_values = [tag.value for tag in EmbodimentTag] + raise ValueError( + f"env_name prefix {prefix!r} (from env_name {env_name!r}) maps to no " + f"EmbodimentTag. A gym environment is registered under this prefix, but " + f"it is neither a key in ENV_PREFIX_TO_EMBODIMENT_TAG nor a valid " + f"EmbodimentTag value. Add an entry to ENV_PREFIX_TO_EMBODIMENT_TAG in " + f"gr00t/eval/sim/env_utils.py.\n" + f" known prefixes: {known_prefixes}\n" + f" valid tag values: {valid_tag_values}" + ) from None diff --git a/gr00t/eval/sim/robocasa-gr1-tabletop-tasks/setup_RoboCasaGR1TabletopTasks.sh b/gr00t/eval/sim/robocasa-gr1-tabletop-tasks/setup_RoboCasaGR1TabletopTasks.sh index 91b9a769c..a51fd6e96 100644 --- a/gr00t/eval/sim/robocasa-gr1-tabletop-tasks/setup_RoboCasaGR1TabletopTasks.sh +++ b/gr00t/eval/sim/robocasa-gr1-tabletop-tasks/setup_RoboCasaGR1TabletopTasks.sh @@ -5,12 +5,25 @@ set -euxo pipefail SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PROJECT_REPO="$SCRIPT_DIR/../../../.." ROBOCASA_GR1_TABLETOP_TASKS_REPO="$PROJECT_REPO/external_dependencies/robocasa-gr1-tabletop-tasks" +ROBOCASA_GR1_TABLETOP_TASKS_PATH="external_dependencies/robocasa-gr1-tabletop-tasks" +ROBOCASA_GR1_TABLETOP_TASKS_PIN="4840e671596f93ca03651524b9f72ffb1aadfeff" UV_ENV="$SCRIPT_DIR/robocasa_uv" # Optional: if you want to avoid hardlink warnings with uv cache # export UV_LINK_MODE=copy -git submodule update --init $ROBOCASA_GR1_TABLETOP_TASKS_REPO +if [ ! -e "$ROBOCASA_GR1_TABLETOP_TASKS_REPO/.git" ]; then + if ! git -C "$PROJECT_REPO" submodule update --init "$ROBOCASA_GR1_TABLETOP_TASKS_PATH"; then + rm -rf "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" + git clone https://github.com/robocasa/robocasa-gr1-tabletop-tasks "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" + git -C "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" checkout "$ROBOCASA_GR1_TABLETOP_TASKS_PIN" + fi +fi + +if [ "$(git -C "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" rev-parse HEAD)" != "$ROBOCASA_GR1_TABLETOP_TASKS_PIN" ]; then + git -C "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" fetch origin "$ROBOCASA_GR1_TABLETOP_TASKS_PIN" || git -C "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" fetch origin + git -C "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" checkout "$ROBOCASA_GR1_TABLETOP_TASKS_PIN" +fi # Ensure build tools (mirrors your LIBERO flow) # python -m pip install cmake==3.18.4 @@ -18,36 +31,44 @@ git submodule update --init $ROBOCASA_GR1_TABLETOP_TASKS_REPO # Fresh venv rm -rf "$UV_ENV" mkdir -p "$UV_ENV" -uv venv "$UV_ENV/.venv" --python 3.10 +uv venv "$UV_ENV/.venv" --python 3.12 source "$UV_ENV/.venv/bin/activate" # Make sure the venv has a build backend uv pip install setuptools wheel # Heavy deps first -uv pip install torch==2.5.1 torchvision==0.20.1 +uv pip install torch==2.9.0 torchvision==0.24.0 # Preinstall flash-attn to avoid builds inside other installs. # Guard it to Linux only (flash-attn not supported on macOS). INSTALL_FLASH_ATTN=${INSTALL_FLASH_ATTN:-1} if [[ "$(uname -s)" == "Linux" && "$INSTALL_FLASH_ATTN" == "1" ]]; then - uv pip install --no-build-isolation flash-attn==2.7.4.post1 || echo "flash-attn install skipped/failed; continuing" + uv pip install --no-build-isolation flash-attn==2.8.3 || echo "flash-attn install skipped/failed; continuing" else echo "Skipping flash-attn (non-Linux or INSTALL_FLASH_ATTN=0)" fi # Core sim deps: robosuite first (as per README), then this repo editable # README: https://github.com/robocasa/robocasa-gr1-tabletop-tasks -uv pip install "git+https://github.com/ARISE-Initiative/robosuite.git@master" +uv pip install "git+https://github.com/ARISE-Initiative/robosuite.git@v1.5.1" # The repo’s requirements.txt only contains "-e .", so just install editable. uv pip install -e "$ROBOCASA_GR1_TABLETOP_TASKS_REPO" --config-settings editable_mode=compat # Optional: your eval stack uses gymnasium -uv pip install gymnasium==0.29.1 pydantic av==15.0.0 zmq transformers==4.51.3 msgpack==1.1.0 msgpack-numpy==0.4.8 +uv pip install gymnasium==0.29.1 pydantic av==15.0.0 zmq transformers==4.57.3 msgpack==1.1.0 msgpack-numpy==0.4.8 tyro + +# Pin mujoco: robocasa-gr1-tabletop-tasks asserts mujoco==3.2.6 at import time, +# and that version still predates the mujoco 3.10 mj_fullM signature break that +# robosuite relies on. +# Pin numpy to 1.26.4 too, matching the other islands for deterministic rebuilds +# and to keep robosuite/mujoco on the numpy 1.x ABI they expect. +uv pip install numpy==1.26.4 mujoco==3.2.6 -# Make your project importable without re-resolving deps -uv pip install --editable "$PROJECT_REPO" --no-deps +# Expose gr00t from the repo root via a .pth: no dependency re-resolution, and +# the island supplies gr00t's runtime deps itself (matches the old --no-deps). +python -c "import sysconfig, pathlib; pathlib.Path(sysconfig.get_path('purelib'), 'gr00t.pth').write_text(pathlib.Path('$PROJECT_REPO').resolve().as_posix() + '\n')" # Optional: lower robosuite simulation timestep to 0.005 for headless stability # python - <<'PY' @@ -68,9 +89,16 @@ uv pip install --editable "$PROJECT_REPO" --no-deps # PY # Assets (per README) -python "$ROBOCASA_GR1_TABLETOP_TASKS_REPO/robocasa/scripts/download_tabletop_assets.py" -y +SKIP_DOWNLOAD_ASSETS=${SKIP_DOWNLOAD_ASSETS:-0} +if [[ "$SKIP_DOWNLOAD_ASSETS" == "0" ]]; then + echo "asset download enabled (SKIP_DOWNLOAD_ASSETS=0)" + python "$ROBOCASA_GR1_TABLETOP_TASKS_REPO/robocasa/scripts/download_tabletop_assets.py" -y +else + echo "Skipping tabletop assets download (SKIP_DOWNLOAD_ASSETS=1)" +fi # Sanity import +echo "Running Sanity Test" python - <<'PY' import os os.environ.setdefault("MUJOCO_GL", "egl") @@ -81,8 +109,3 @@ print("Imports OK:", robosuite.__version__) env = gym.make("gr1_unified/PnPCanToDrawerClose_GR1ArmsAndWaistFourierHands_Env", enable_render=True) print("Env OK:", type(env)) PY - - -#pydantic -#av -#zmq diff --git a/gr00t/eval/sim/robocasa/setup_RoboCasa.sh b/gr00t/eval/sim/robocasa/setup_RoboCasa.sh index 4f55aea77..201ac2583 100644 --- a/gr00t/eval/sim/robocasa/setup_RoboCasa.sh +++ b/gr00t/eval/sim/robocasa/setup_RoboCasa.sh @@ -1,64 +1,194 @@ #!/usr/bin/env bash +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 -euxo pipefail -# Where this script lives (put it inside your repo) SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PROJECT_REPO="$SCRIPT_DIR/../../../.." -ROBOCASA_REPO="$PROJECT_REPO/external_dependencies/robocasa" -UV_ENV="$SCRIPT_DIR/robocasa_uv" +ROBOCASA_SETUP_VARIANT="${ROBOCASA_SETUP_VARIANT:-robocasa}" + +COMMON_DEPS=( + gymnasium==0.29.1 + pydantic + av==15.0.0 + zmq + transformers==4.57.3 + msgpack==1.1.0 + msgpack-numpy==0.4.8 + tyro==1.0.13 +) +# robocasa (squarefk fork) install_requires hard-pins numpy==1.23.3 and +# numba==0.56.4 (-> llvmlite 0.39.1, supports py<3.11 only), neither of which +# installs on py3.12. Install robocasa --no-deps and provide its runtime deps +# here with py3.12-compatible versions instead. Keep mujoco==3.2.6: robocasa's +# __init__ asserts that exact version, and 3.2.6 ships cp312 wheels and predates +# the mujoco 3.10 mj_fullM signature break that robosuite still relies on. +ROBOCASA_DEPS=( + numpy==1.26.4 + numba + scipy + mujoco==3.2.6 + pygame + Pillow + opencv-python + pyyaml + pynput + tqdm + termcolor + imageio + h5py + lxml + hidapi + tianshou +) +ROBOCASA365_DEPS=( + numpy==2.2.5 + numba + scipy + mujoco==3.3.1 + pygame + Pillow + opencv-python + pyyaml + pynput + tqdm + termcolor + imageio + h5py + lxml + hidapi + tianshou + loguru==0.7.3 + tenacity==9.1.4 + sqlalchemy==2.0.50 + psycopg2-binary==2.9.12 + openai==2.41.0 + ray==2.55.1 + pandas==2.2.3 + diffusers==0.35.1 + albumentations==1.4.18 + dm-tree==0.1.9 +) +ASSET_DOWNLOAD_ARGS=() +ASSETS_CACHE_ROOT="" +INSTALL_ROBOCASA_NO_DEPS=0 + +case "$ROBOCASA_SETUP_VARIANT" in + robocasa) + ROBOCASA_REPO="$PROJECT_REPO/external_dependencies/robocasa" + ROBOCASA_PATH="external_dependencies/robocasa" + UV_ENV="$SCRIPT_DIR/robocasa_uv" + SANITY_GYM_IMPORT="import robocasa.utils.gym_utils.gymnasium_groot" + SANITY_ENV_ID="robocasa_panda_omron/OpenSingleDoor_PandaOmron_Env" + INSTALL_ROBOCASA_NO_DEPS=1 + + if [ ! -e "$ROBOCASA_REPO/.git" ]; then + if ! git -C "$PROJECT_REPO" submodule update --init "$ROBOCASA_PATH"; then + # Cache setup can leave asset directories under the submodule path + # before the submodule is initialized. Git refuses to clone into that + # non-empty directory, so clear the pre-submodule path and retry. + rm -rf "$ROBOCASA_REPO" + git -C "$PROJECT_REPO" submodule update --init "$ROBOCASA_PATH" + fi + fi + ;; + robocasa365) + ROBOCASA_REPO="$PROJECT_REPO/external_dependencies/robocasa365" + ROBOCASA365_PIN="${ROBOCASA365_PIN:-be22d659b02db8f6d7f3a3c3edc742934fdcbaae}" + ASSETS_CACHE_ROOT="${ROBOCASA365_ASSETS_CACHE_ROOT:-}" + UV_ENV="$PROJECT_REPO/gr00t/eval/sim/robocasa365/robocasa365_uv" + INSTALL_ROBOCASA_NO_DEPS=1 + ASSET_DOWNLOAD_ARGS=(--type tex tex_generative fixtures_lw objs_lw objs_objaverse objs_aigen) + SANITY_GYM_IMPORT="import gr00t.eval.sim.robocasa365.gymnasium_groot" + SANITY_ENV_ID="robocasa365_panda_omron/CloseFridge_PandaOmron_Env" -git submodule update --init $ROBOCASA_REPO + if [ ! -e "$ROBOCASA_REPO/.git" ]; then + git clone https://github.com/robocasa/robocasa.git "$ROBOCASA_REPO" + fi + + if [ "$(git -C "$ROBOCASA_REPO" rev-parse HEAD)" != "$ROBOCASA365_PIN" ]; then + git -C "$ROBOCASA_REPO" fetch origin "$ROBOCASA365_PIN" || git -C "$ROBOCASA_REPO" fetch origin + git -C "$ROBOCASA_REPO" checkout "$ROBOCASA365_PIN" + fi + ;; + *) + echo "Unknown ROBOCASA_SETUP_VARIANT: $ROBOCASA_SETUP_VARIANT" >&2 + exit 1 + ;; +esac -# Build helpers -# python -m pip install cmake==3.18.4 rm -rf "$UV_ENV" mkdir -p "$UV_ENV" -uv venv "$UV_ENV/.venv" --python 3.10 +uv venv "$UV_ENV/.venv" --python 3.12 source "$UV_ENV/.venv/bin/activate" uv pip install setuptools wheel -# Core deps -uv pip install torch==2.5.1 torchvision==0.20.1 +uv pip install torch==2.9.0 torchvision==0.24.0 # Linux-only: preinstall flash-attn to avoid compiling inside other wheels INSTALL_FLASH_ATTN=${INSTALL_FLASH_ATTN:-1} if [[ "$(uname -s)" == "Linux" && "$INSTALL_FLASH_ATTN" == "1" ]]; then - uv pip install --no-build-isolation flash-attn==2.7.4.post1 || echo "flash-attn install skipped/failed; continuing" + uv pip install --no-build-isolation flash-attn==2.8.3 || echo "flash-attn install skipped/failed; continuing" fi -# Sim stack -uv pip install "git+https://github.com/ARISE-Initiative/robosuite.git@master" -uv pip install -e "$ROBOCASA_REPO" --config-settings editable_mode=compat -uv pip install gymnasium==0.29.1 pydantic av==15.0.0 zmq transformers==4.51.3 msgpack==1.1.0 msgpack-numpy==0.4.8 +uv pip install "git+https://github.com/ARISE-Initiative/robosuite.git@85abee228d1c43ab1939bce33028099945d453b4" +if [ "$INSTALL_ROBOCASA_NO_DEPS" = "1" ]; then + uv pip install -e "$ROBOCASA_REPO" --no-deps --config-settings editable_mode=compat +else + uv pip install -e "$ROBOCASA_REPO" --config-settings editable_mode=compat +fi -# Make your project importable in this venv without re-resolving deps -uv pip install --editable "$PROJECT_REPO" --no-deps +uv pip install "${COMMON_DEPS[@]}" +if [ "$ROBOCASA_SETUP_VARIANT" = "robocasa365" ]; then + uv pip install "${ROBOCASA365_DEPS[@]}" +else + uv pip install "${ROBOCASA_DEPS[@]}" +fi -# Stable headless timestep (optional but recommended) -# python - <<'PY' -# import importlib, re -# try: -# rs = importlib.import_module("robosuite.macros_private"); path = rs.__file__ -# except Exception: -# rs = importlib.import_module("robosuite.macros"); path = rs.__file__ -# txt = open(path, "r", encoding="utf-8").read() -# new = re.sub(r"(SIMULATION_TIMESTEP\s*=\s*)([0-9.]+)", r"\g<1>0.005", txt) -# if txt != new: -# open(path, "w", encoding="utf-8").write(new); print(f"Updated SIMULATION_TIMESTEP in {path}") -# else: -# print("No SIMULATION_TIMESTEP change needed") -# PY +# Expose gr00t from the repo root via a .pth: no dependency re-resolution, and +# the island supplies gr00t's runtime deps itself (matches the old --no-deps). +python -c "import sysconfig, pathlib; pathlib.Path(sysconfig.get_path('purelib'), 'gr00t.pth').write_text(pathlib.Path('$PROJECT_REPO').resolve().as_posix() + '\n')" # Assets for RoboCasa (kitchen) -python "$ROBOCASA_REPO/robocasa/scripts/download_kitchen_assets.py" -y +SKIP_DOWNLOAD_ASSETS=${SKIP_DOWNLOAD_ASSETS:-0} +if [[ "$SKIP_DOWNLOAD_ASSETS" == "1" && -n "$ASSETS_CACHE_ROOT" ]]; then + ROBOCASA_ASSETS_REPO_DIR="$ROBOCASA_REPO/robocasa/models/assets" + mkdir -p "$ROBOCASA_ASSETS_REPO_DIR" + for shared_dir in "$ASSETS_CACHE_ROOT"/*/; do + [ -d "$shared_dir" ] || continue + name=$(basename "$shared_dir") + repo_dir="$ROBOCASA_ASSETS_REPO_DIR/$name" + [ -L "$repo_dir" ] && rm "$repo_dir" + [ -e "$repo_dir" ] && rm -rf "$repo_dir" + ln -s "$shared_dir" "$repo_dir" + done +elif [[ "$SKIP_DOWNLOAD_ASSETS" == "0" ]]; then + printf 'y\n' | python "$ROBOCASA_REPO/robocasa/scripts/download_kitchen_assets.py" "${ASSET_DOWNLOAD_ARGS[@]}" +fi # Sanity import & env construction -python - <<'PY' +python - <_PandaOmron_Env`` and emits the Panda Omron +observation/action keys used by the ROBOCASA_PANDA_OMRON checkpoint. Upstream +RoboCasa365 has a newer task registry and different wrapper keys, so this +module registers a separate namespace while preserving the checkpoint schema. +""" + +from __future__ import annotations + +import sys +from typing import Any + +import cv2 +from gymnasium import Env, spaces +from gymnasium.envs.registration import register, registry +import mujoco +import numpy as np +import robocasa # noqa: F401 - imports register upstream RoboCasa env classes +from robocasa.utils.env_utils import create_env +from robosuite.controllers.composite.composite_controller import HybridMobileBase +from robosuite.environments.base import REGISTERED_ENVS + + +ALLOWED_LANGUAGE_CHARSET = ( + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.\n\t[]{}()!?'_:" +) +CAMERA_NAMES = [ + "robot0_agentview_left", + "robot0_agentview_right", + "robot0_eye_in_hand", +] +MAPPED_CAMERA_NAMES = [ + "video.res256_image_side_0", + "video.res256_image_side_1", + "video.res256_image_wrist_0", +] +VIDEO_OBSERVATION_KEYS = [f"video.{camera_name}" for camera_name in CAMERA_NAMES] +ROBOCASA_PANDA_VIDEO_OBSERVATION_KEYS = MAPPED_CAMERA_NAMES +ROBOCASA_PANDA_HIGH_RES_VIDEO_OBSERVATION_KEYS = [ + mapped_name.replace("256", "512") for mapped_name in MAPPED_CAMERA_NAMES +] +LANGUAGE_OBSERVATION_KEY = "annotation.human.task_description" +ROBOCASA_PANDA_LANGUAGE_OBSERVATION_KEY = "annotation.human.action.task_description" +CAMERA_RESOLUTION = 512 +FINAL_IMAGE_RESOLUTION = (256, 256) +DEFAULT_SPLIT = "target" +DEFAULT_OBJ_REGISTRIES = None + + +def _gather_robot_observations(env) -> dict[str, np.ndarray]: + observations = {} + + for robot_id, robot in enumerate(env.robots): + sim = robot.sim + gripper_names = {robot.get_gripper_name(arm): robot.gripper[arm] for arm in robot.arms} + for part_name, indexes in robot._ref_joints_indexes_dict.items(): + qpos_values = [] + for joint_id in indexes: + qpos_addr = sim.model.jnt_qposadr[joint_id] + joint_type = sim.model.jnt_type[joint_id] + if joint_type == mujoco.mjtJoint.mjJNT_FREE: + qpos_size = 7 + elif joint_type == mujoco.mjtJoint.mjJNT_BALL: + qpos_size = 4 + else: + qpos_size = 1 + qpos_values = np.append( + qpos_values, sim.data.qpos[qpos_addr : qpos_addr + qpos_size] + ) + + if part_name in gripper_names: + qpos_values = np.asarray(qpos_values)[::-1] + if len(qpos_values) > 0: + observations[f"robot{robot_id}_{part_name}"] = qpos_values + + return observations + + +def _map_obs(input_obs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + return { + "state.gripper_qpos": input_obs["robot0_gripper_qpos"], + "state.base_position": input_obs["robot0_base_pos"], + "state.base_rotation": input_obs["robot0_base_quat"], + "state.end_effector_position_relative": input_obs["robot0_base_to_eef_pos"], + "state.end_effector_rotation_relative": input_obs["robot0_base_to_eef_quat"], + "state.gripper_qvel": input_obs["robot0_gripper_qvel"], + "state.end_effector_position_absolute": input_obs["robot0_eef_pos"], + "state.end_effector_rotation_absolute": input_obs["robot0_eef_quat"], + "state.joint_position": input_obs["robot0_joint_pos"], + "state.joint_position_cos": input_obs["robot0_joint_pos_cos"], + "state.joint_position_sin": input_obs["robot0_joint_pos_sin"], + "state.joint_velocity": input_obs["robot0_joint_vel"], + } + + +def _unmap_action(input_action: dict[str, np.ndarray]) -> dict[str, np.ndarray | float]: + return { + "robot0_right_gripper": -1.0 if input_action["action.gripper_close"] < 0.5 else 1.0, + "robot0_right": np.concatenate( + ( + input_action["action.end_effector_position"], + input_action["action.end_effector_rotation"], + ), + axis=-1, + ), + "robot0_base": input_action["action.base_motion"][..., 0:3], + "robot0_torso": input_action["action.base_motion"][..., 3:4], + "robot0_base_mode": -1.0 if input_action["action.control_mode"] < 0.5 else 1.0, + } + + +class GrootRoboCasa365Env(Env): + metadata = {"render_modes": ["rgb_array"], "render_fps": 20} + + def __init__( + self, + env_name: str, + enable_render: bool = True, + split: str = DEFAULT_SPLIT, + obj_registries: tuple[str, ...] | list[str] | None = DEFAULT_OBJ_REGISTRIES, + **kwargs: Any, + ): + self.env_name = env_name + self.enable_render = enable_render + if obj_registries is not None: + kwargs = {**kwargs, "obj_registries": tuple(obj_registries)} + self.env = create_env( + env_name=env_name, + robots="PandaOmron", + camera_names=CAMERA_NAMES, + camera_widths=CAMERA_RESOLUTION, + camera_heights=CAMERA_RESOLUTION, + split=split, + render_onscreen=False, + **kwargs, + ) + self.camera_names = CAMERA_NAMES + self.render_obs_key = f"{self.camera_names[0]}_image" + self.render_cache = None + self._create_spaces() + + @staticmethod + def _process_img(img: np.ndarray) -> np.ndarray: + h, w, _ = img.shape + if h != w: + dim = max(h, w) + y_offset = (dim - h) // 2 + x_offset = (dim - w) // 2 + img = np.pad(img, ((y_offset, y_offset), (x_offset, x_offset), (0, 0))) + h, w = dim, dim + if (h, w) != FINAL_IMAGE_RESOLUTION: + img = cv2.resize(img, FINAL_IMAGE_RESOLUTION, cv2.INTER_AREA) + return np.copy(img) + + def _create_spaces(self) -> None: + raw_obs = self.env.reset() + raw_obs = self._get_basic_observation(raw_obs) + mapped_obs = _map_obs(raw_obs) + + observation_space = spaces.Dict() + for key, value in mapped_obs.items(): + observation_space[key] = spaces.Box( + low=-1, high=1, shape=(len(value),), dtype=np.float32 + ) + for video_key in VIDEO_OBSERVATION_KEYS + ROBOCASA_PANDA_VIDEO_OBSERVATION_KEYS: + observation_space[video_key] = spaces.Box( + low=0, high=255, shape=(*FINAL_IMAGE_RESOLUTION, 3), dtype=np.uint8 + ) + for video_key in ROBOCASA_PANDA_HIGH_RES_VIDEO_OBSERVATION_KEYS: + observation_space[video_key] = spaces.Box( + low=0, high=255, shape=(CAMERA_RESOLUTION, CAMERA_RESOLUTION, 3), dtype=np.uint8 + ) + observation_space[LANGUAGE_OBSERVATION_KEY] = spaces.Text( + max_length=256, charset=ALLOWED_LANGUAGE_CHARSET + ) + observation_space[ROBOCASA_PANDA_LANGUAGE_OBSERVATION_KEY] = spaces.Text( + max_length=256, charset=ALLOWED_LANGUAGE_CHARSET + ) + self.observation_space = observation_space + + self.action_space = spaces.Dict( + { + "action.gripper_close": spaces.Discrete(2), + "action.end_effector_position": spaces.Box( + low=-1, high=1, shape=(3,), dtype=np.float32 + ), + "action.end_effector_rotation": spaces.Box( + low=-1, high=1, shape=(3,), dtype=np.float32 + ), + "action.base_motion": spaces.Box(low=-1, high=1, shape=(4,), dtype=np.float32), + "action.control_mode": spaces.Discrete(2), + } + ) + + def _get_basic_observation(self, raw_obs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + raw_obs.update(_gather_robot_observations(self.env)) + for obs_name, obs_value in list(raw_obs.items()): + if obs_name.endswith("_image"): + raw_obs[obs_name] = np.copy(obs_value[::-1, :, :]) + elif obs_name.endswith("_depth"): + raw_obs[obs_name] = np.copy(obs_value[::-1, :, :]).astype(np.float32) + elif isinstance(obs_value, np.ndarray): + raw_obs[obs_name] = obs_value.astype(np.float32) + + if not self.enable_render: + for name in self.camera_names: + raw_obs[f"{name}_image"] = np.zeros( + (CAMERA_RESOLUTION, CAMERA_RESOLUTION, 3), dtype=np.uint8 + ) + + self.render_cache = raw_obs[self.render_obs_key] + raw_obs["language"] = self.env.get_ep_meta().get("lang", "") + return raw_obs + + def _get_groot_observation(self, raw_obs: dict[str, np.ndarray]) -> dict[str, Any]: + basic_obs = self._get_basic_observation(raw_obs) + obs: dict[str, Any] = _map_obs(basic_obs) + for mapped_name, camera_name in zip(MAPPED_CAMERA_NAMES, CAMERA_NAMES): + image = self._process_img(basic_obs[f"{camera_name}_image"]) + obs[f"video.{camera_name}"] = image + obs[mapped_name] = image + obs[mapped_name.replace("256", "512")] = np.copy(basic_obs[f"{camera_name}_image"]) + obs[LANGUAGE_OBSERVATION_KEY] = basic_obs["language"] + obs[ROBOCASA_PANDA_LANGUAGE_OBSERVATION_KEY] = basic_obs["language"] + return obs + + def reset(self, seed: int | None = None, options: dict[str, Any] | None = None): + if seed is not None: + self.env.rng = np.random.default_rng(seed) + + raw_obs = self.env.reset() + obs = self._get_groot_observation(raw_obs) + return obs, {"success": False} + + def step(self, action: dict[str, np.ndarray]): + action_dict = _unmap_action(action) + + env_action = [] + for robot in self.env.robots: + cc = robot.composite_controller + pf = robot.robot_model.naming_prefix + robot_action = np.zeros(cc.action_limits[0].shape) + for part_name in cc.part_controllers: + start_idx, end_idx = cc._action_split_indexes[part_name] + robot_action[start_idx:end_idx] = action_dict.pop(f"{pf}{part_name}") + if isinstance(cc, HybridMobileBase): + robot_action[-1] = action_dict.pop(f"{pf}base_mode") + env_action.append(robot_action) + + if action_dict: + raise RuntimeError(f"Unprocessed RoboCasa365 actions: {sorted(action_dict)}") + + raw_obs, _, done, info = self.env.step(np.concatenate(env_action)) + is_success = bool(self.env._check_success()) + reward = 1.0 if is_success else 0.0 + obs = self._get_groot_observation(raw_obs) + info["success"] = is_success + return obs, reward, done, False, info + + def render(self): + if self.render_cache is None: + raise RuntimeError("Must run reset or step before render.") + return self.render_cache + + def close(self): + self.env.close() + + def __getattr__(self, name: str): + return getattr(self.env, name) + + +def _create_groot_robocasa365_env_class(env_name: str) -> None: + class_name = f"{env_name}_PandaOmron_Env" + id_name = f"robocasa365_panda_omron/{class_name}" + if id_name in registry: + return + + env_class_type = type( + class_name, + (GrootRoboCasa365Env,), + { + "__init__": lambda self, **kwargs: super(self.__class__, self).__init__( + env_name=env_name, + **kwargs, + ) + }, + ) + + current_module = sys.modules["gr00t.eval.sim.robocasa365.gymnasium_groot"] + setattr(current_module, class_name, env_class_type) + register( + id=id_name, + entry_point=f"gr00t.eval.sim.robocasa365.gymnasium_groot:{class_name}", + ) + + +for _ENV in REGISTERED_ENVS: + _create_groot_robocasa365_env_class(_ENV) diff --git a/gr00t/eval/sim/robocasa365/setup_RoboCasa365.sh b/gr00t/eval/sim/robocasa365/setup_RoboCasa365.sh new file mode 100644 index 000000000..711b60bf2 --- /dev/null +++ b/gr00t/eval/sim/robocasa365/setup_RoboCasa365.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 -euo pipefail + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +ROBOCASA_SETUP_VARIANT=robocasa365 exec bash "$SCRIPT_DIR/../robocasa/setup_RoboCasa.sh" "$@" diff --git a/gr00t/eval/sim/wrapper/multistep_wrapper.py b/gr00t/eval/sim/wrapper/multistep_wrapper.py index a661a0aac..50f03e594 100644 --- a/gr00t/eval/sim/wrapper/multistep_wrapper.py +++ b/gr00t/eval/sim/wrapper/multistep_wrapper.py @@ -1,4 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from collections import defaultdict, deque +from enum import Enum import warnings import gymnasium as gym @@ -6,6 +22,21 @@ import numpy as np +class AggregateMethod(str, Enum): + """Supported strategies for reducing a sequence of per-step values. + + Subclassing ``str`` keeps the members interchangeable with their + string values, so existing callers (and configs) that pass e.g. + ``"max"`` keep working while the code itself references the typed + members instead of magic strings. + """ + + MAX = "max" + MIN = "min" + MEAN = "mean" + SUM = "sum" + + def stack_repeated(x, n, loc): return np.repeat(np.expand_dims(x, axis=loc), n, axis=loc) @@ -103,38 +134,55 @@ def compress_dict_list(ds, recursive=False): return result -def aggregate(data, method="max"): - if method == "max": +def aggregate(data, method: AggregateMethod = AggregateMethod.MAX): + try: + method = AggregateMethod(method) + except ValueError: + raise ValueError( + f"Unsupported aggregate method {method!r}; " + f"expected one of {[m.value for m in AggregateMethod]}." + ) + if method is AggregateMethod.MAX: # equivalent to any return np.max(data) - elif method == "min": + elif method is AggregateMethod.MIN: # equivalent to all return np.min(data) - elif method == "mean": + elif method is AggregateMethod.MEAN: return np.mean(data) - elif method == "sum": + elif method is AggregateMethod.SUM: return np.sum(data) - else: - raise NotImplementedError() class MultiStepWrapper(gym.Wrapper): def __init__( self, env, - video_delta_indices, - state_delta_indices, - n_action_steps, + contract, max_episode_steps=None, - reward_agg_method="max", + reward_agg_method: AggregateMethod = AggregateMethod.MAX, terminate_on_success=False, ): """ - video_delta_indices: np.ndarray[int], please check `assert_delta_indices` to see the requirements - state_delta_indices: np.ndarray[int] | None, please check `assert_delta_indices` to see the requirements - if None, it means the model is vision-only + contract: policy-resolved + :class:`gr00t.eval._horizon_contract.PolicyHorizonSpec` carrying + ``n_action_steps`` and the video / state ``delta_indices``. + ``state_delta_indices`` is ``None`` for a vision-only policy. See + ``assert_delta_indices`` for the per-array requirements. """ + try: + reward_agg_method = AggregateMethod(reward_agg_method) + except ValueError: + raise ValueError( + f"Unsupported reward_agg_method {reward_agg_method!r}; " + f"expected one of {[m.value for m in AggregateMethod]}." + ) super().__init__(env) + self.contract = contract + video_delta_indices = contract.video_delta_indices_array + state_delta_indices = contract.state_delta_indices_array + n_action_steps = contract.n_action_steps + # Assign action space self._action_space = repeated_space(env.action_space, n_action_steps) @@ -253,6 +301,7 @@ def step(self, action): states = [] rewards = [] dones = [] + n_env_steps = 0 for step in range(self.n_action_steps): act = {} for key, value in action.items(): @@ -261,6 +310,7 @@ def step(self, action): # termination break observation, reward, done, truncated, info = super().step(act) + n_env_steps += 1 # TODO: assign meaningful values env_state = {"states": [], "model": []} states.append(env_state["states"]) @@ -278,7 +328,7 @@ def step(self, action): observation = self._get_obs(self.video_delta_indices, self.state_delta_indices) reward = aggregate(self.reward, self.reward_agg_method) - done = aggregate(self.done, "max") + done = aggregate(self.done, AggregateMethod.MAX) info = dict_take_last_n(self.info, self.n_action_steps) states = np.array(states) rewards = np.array(rewards) @@ -288,6 +338,9 @@ def step(self, action): info["model"] = env_state["model"] info["actions"] = action info["dones"] = dones + # Inner env-steps taken this macro-step (< n_action_steps if `done` fires + # mid-chunk); run_rollout_gymnasium_policy sums it for episode_length. + info["n_env_steps"] = n_env_steps if "intermediate_signals" in info: # "intermediate_signals" contain the metrics for 5DC tasks to indicate language following # Here we turn a list of dicts into a dict of lists diff --git a/gr00t/eval/sim/wrapper/video_recording_wrapper.py b/gr00t/eval/sim/wrapper/video_recording_wrapper.py index d71489d15..5f86e36d6 100755 --- a/gr00t/eval/sim/wrapper/video_recording_wrapper.py +++ b/gr00t/eval/sim/wrapper/video_recording_wrapper.py @@ -1,136 +1,50 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from collections.abc import Sequence import os from pathlib import Path +import subprocess import uuid -import av import cv2 -from gr00t.utils.video_utils import get_accumulate_timestamp_idxs import gymnasium as gym import numpy as np -class VideoRecorder: - def __init__( - self, - fps, - codec, - input_pix_fmt, - # options for codec - **kwargs, - ): - """ - input_pix_fmt: rgb24, bgr24 see https://github.com/PyAV-Org/PyAV/blob/bc4eedd5fc474e0f25b22102b2771fe5a42bb1c7/av/video/frame.pyx#L352 - """ - - self.fps = fps - self.codec = codec - self.input_pix_fmt = input_pix_fmt - self.kwargs = kwargs - # runtime set - self._reset_state() - - def _reset_state(self): - self.container = None - self.stream = None - self.shape = None - self.dtype = None - self.start_time = None - self.next_global_idx = 0 - - @classmethod - def create_h264( - cls, - fps, - codec="h264", - input_pix_fmt="rgb24", - output_pix_fmt="yuv420p", - crf=18, - profile="high", - **kwargs, - ): - obj = cls( - fps=fps, - codec=codec, - input_pix_fmt=input_pix_fmt, - pix_fmt=output_pix_fmt, - options={"crf": str(crf), "profile:v": "high"}, - **kwargs, - ) - return obj - - def __del__(self): - self.stop() - - def is_ready(self): - return self.stream is not None - - def start(self, file_path, start_time=None): - if self.is_ready(): - # if still recording, stop first and start anew. - self.stop() - - self.container = av.open(file_path, mode="w") - self.stream = self.container.add_stream(self.codec, rate=self.fps) - codec_context = self.stream.codec_context - for k, v in self.kwargs.items(): - setattr(codec_context, k, v) - self.start_time = start_time - - def write_frame(self, img: np.ndarray, frame_time=None): - if not self.is_ready(): - raise RuntimeError("Must run start() before writing!") - - n_repeats = 1 - if self.start_time is not None: - local_idxs, global_idxs, self.next_global_idx = get_accumulate_timestamp_idxs( - # only one timestamp - timestamps=[frame_time], - start_time=self.start_time, - dt=1 / self.fps, - next_global_idx=self.next_global_idx, - ) - # number of appearance means repeats - n_repeats = len(local_idxs) - - if self.shape is None: - self.shape = img.shape - self.dtype = img.dtype - h, w, c = img.shape - self.stream.width = w - self.stream.height = h - assert img.shape == self.shape - assert img.dtype == self.dtype - - frame = av.VideoFrame.from_ndarray(img, format=self.input_pix_fmt) - for i in range(n_repeats): - for packet in self.stream.encode(frame): - self.container.mux(packet) +# Seconds to wait for ffmpeg to flush and exit before escalating to kill(). +_FFMPEG_CLOSE_GRACE_SECONDS = 30.0 - def stop(self): - if not self.is_ready(): - return - - # Flush stream - for packet in self.stream.encode(): - self.container.mux(packet) - - # Close the file - self.container.close() - - # reset runtime parameters - self._reset_state() +_H264_CODECS = {"h264", "libx264"} +_H264_CRF = "18" +_H264_PROFILE = "high" +_H264_PIXEL_FORMAT = "yuv420p" class VideoRecordingWrapper(gym.Wrapper): def __init__( self, env, - video_recorder: VideoRecorder, mode="rgb_array", video_dir: Path | None = None, steps_per_render=1, max_episode_steps=720, + fps=20, + codec="h264", overlay_text=True, + record_video_keys: Sequence[str] | None = None, **kwargs, ): """ @@ -138,6 +52,9 @@ def __init__( """ super().__init__(env) + if record_video_keys is not None and len(record_video_keys) == 0: + raise ValueError("record_video_keys must not be empty when provided") + if video_dir is not None: video_dir.mkdir(parents=True, exist_ok=True) @@ -146,13 +63,148 @@ def __init__( self.steps_per_render = steps_per_render self.max_episode_steps = max_episode_steps self.video_dir = video_dir - self.video_recorder = video_recorder + self.video_fps = fps + self.video_codec = codec + self.video_process = None + self.video_shape = None + self.video_dtype = None self.file_path = None self.overlay_text = overlay_text + self.record_video_keys = tuple(record_video_keys) if record_video_keys is not None else None self.step_count = 0 self.is_success = False + self.is_episode_finished = False + + # Caption buffer height is cached on the first overlay frame of each + # episode so that every frame in the encoded stream has the same total + # height; the H.264 encoder rejects mid-stream shape changes. + self.caption_height = None + + def close(self): + # gym.Wrapper.close() reaps only the inner env, so without this the + # final episode's ffmpeg child survives until __del__ (or forever, if + # the GC never runs). Reap it first, then close the inner env even if + # the encoder errored. + try: + self._close_video_writer() + finally: + super().close() + + def __del__(self): + # Best-effort fallback only; close() is the real cleanup path and may + # run during interpreter shutdown when attributes are already gone. + try: + if getattr(self, "video_process", None) is not None: + self._close_video_writer() + except Exception: + pass + + def _open_video_writer(self): + if self.file_path is None: + raise RuntimeError("Cannot write video before a file path is set") + if self.video_shape is None: + raise RuntimeError("Cannot open video writer before frame shape is known") + + height, width = self.video_shape[:2] + codec = "libx264" if self.video_codec in _H264_CODECS else self.video_codec + cmd = [ + "ffmpeg", + "-y", + "-loglevel", + "error", + "-f", + "rawvideo", + "-vcodec", + "rawvideo", + "-pix_fmt", + "rgb24", + "-s", + f"{width}x{height}", + "-r", + str(self.video_fps), + "-i", + "-", + "-an", + "-vcodec", + codec, + ] + if self.video_codec in _H264_CODECS: + cmd.extend( + [ + "-crf", + _H264_CRF, + "-profile:v", + _H264_PROFILE, + "-pix_fmt", + _H264_PIXEL_FORMAT, + ] + ) + cmd.append(str(self.file_path)) + + try: + self.video_process = subprocess.Popen( + cmd, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + except FileNotFoundError as exc: + raise RuntimeError( + "ffmpeg is required for rollout video recording. Install ffmpeg or disable " + "video recording by leaving video_dir unset." + ) from exc + + def _write_video_frame(self, frame: np.ndarray): + if self.video_process is None: + self.video_shape = frame.shape + self.video_dtype = frame.dtype + self._open_video_writer() + + assert frame.shape == self.video_shape + assert frame.dtype == self.video_dtype + + assert self.video_process is not None + assert self.video_process.stdin is not None + self.video_process.stdin.write(np.ascontiguousarray(frame).tobytes()) + + def _close_video_writer(self): + process = self.video_process + try: + if process is not None: + # Let communicate() own stdin: it flushes and closes it (EOF, so + # ffmpeg finalizes the file), drains stderr, and waits — all + # bounded by the timeout so a wedged encoder can never block the + # caller (or __del__) forever. Closing stdin ourselves first + # would make communicate()'s flush raise ValueError on the + # already-closed pipe (it only ignores BrokenPipeError). + try: + _, stderr = process.communicate(timeout=_FFMPEG_CLOSE_GRACE_SECONDS) + except subprocess.TimeoutExpired: + process.kill() + _, stderr = process.communicate() + raise RuntimeError( + f"ffmpeg video recording did not exit within " + f"{_FFMPEG_CLOSE_GRACE_SECONDS}s and was killed." + ) + if process.returncode != 0: + message = (stderr or b"").decode("utf-8", errors="replace").strip() + raise RuntimeError(f"ffmpeg video recording failed: {message}") + finally: + self.video_process = None + self.video_shape = None + self.video_dtype = None + + def _get_video_frames(self, obs: dict) -> list[np.ndarray]: + if self.record_video_keys is None: + return [frame for key, frame in obs.items() if key.startswith("video.")] + + missing_keys = [key for key in self.record_video_keys if key not in obs] + if missing_keys: + raise KeyError( + f"Video observation keys missing from rollout observation: {missing_keys}" + ) + return [obs[key] for key in self.record_video_keys] def _resize_frames_to_common_height(self, frames): """ @@ -190,7 +242,10 @@ def reset(self, **kwargs): previous_step_count = self.step_count self.frames = list() self.step_count = 1 - self.video_recorder.stop() + self._close_video_writer() + # New episode == new video file == new frame shape lock, so + # drop the cached caption height too. + self.caption_height = None if self.video_dir is not None and self.file_path is not None and self.file_path.exists(): # rename the file to indicate success or failure @@ -316,7 +371,12 @@ def reset(self, **kwargs): # new_filestem += f"_{case_semantic}_clf-rate{int(contact_language_following_rate)}" new_file_path = self.video_dir / f"{new_filestem}.mp4" - if previous_step_count >= self.max_episode_steps or self.is_success: + should_keep_video = ( + self.is_episode_finished + or previous_step_count >= self.max_episode_steps + or self.is_success + ) + if should_keep_video: os.rename(self.file_path, new_file_path) else: print( @@ -325,6 +385,7 @@ def reset(self, **kwargs): os.remove(self.file_path) self.is_success = False + self.is_episode_finished = False # "intermediate_signals" contain the metrics for 5DC tasks to indicate language following self.intermediate_signals = {} @@ -335,16 +396,11 @@ def reset(self, **kwargs): def step(self, action): result = super().step(action) self.step_count += 1 + self.is_episode_finished = bool(result[2] or result[3]) if self.file_path is not None and ((self.step_count % self.steps_per_render) == 0): - if not self.video_recorder.is_ready(): - self.video_recorder.start(self.file_path) - # frame = self.env.render() obs = result[0] - video_frames = [] - for k, v in obs.items(): - if "video" in k: - video_frames.append(v) + video_frames = self._get_video_frames(obs) assert len(video_frames) > 0, "No video frame found in the observation" @@ -396,25 +452,53 @@ def step(self, action): text_size = cv2.getTextSize(language, font, font_scale, font_thickness)[0] font_scale *= 0.9 # Scale back slightly to ensure fit - # Calculate position - text_x = padding - text_y = frame.shape[0] - 20 - - # Add dark background rectangle - cv2.rectangle( - frame, - (text_x - padding, text_y - text_size[1] - padding), - (text_x + text_size[0] + padding, text_y + padding), - (0, 0, 0), - -1, + _, baseline = cv2.getTextSize(language, font, font_scale, font_thickness) + caption_height = text_size[1] + baseline + 2 * padding + if (frame.shape[0] + caption_height) % 2: + caption_height += 1 + + # Caption height must stay constant for the whole episode so + # that the encoded frame shape never changes (the H.264 stream + # rejects late shape changes and the wrapper asserts it). + # First overlay frame fixes the height; later frames whose + # natural caption would be taller (e.g. the success suffix + # changes from "(0)" to "(1)" and the dynamic scaler picks a + # slightly larger font) shrink font_scale further until they + # fit in the cached buffer. + if self.caption_height is None: + self.caption_height = caption_height + else: + # If `font_scale` bottoms out at 0.05 with caption_height + # still > self.caption_height, we deliberately keep the + # buffer at the cached size: frame-shape stability outranks + # text completeness here. cv2.putText below will silently + # clip the few overflowing pixels, which is preferable to + # tripping the wrapper shape-lock assert. + while caption_height > self.caption_height and font_scale > 0.05: + font_scale *= 0.9 + text_size, baseline = cv2.getTextSize( + language, font, font_scale, font_thickness + ) + caption_height = text_size[1] + baseline + 2 * padding + if (frame.shape[0] + caption_height) % 2: + caption_height += 1 + + caption = np.zeros( + (self.caption_height, frame.shape[1], frame.shape[2]), dtype=frame.dtype ) - # Add text cv2.putText( - frame, language, (text_x, text_y), font, font_scale, font_color, font_thickness + caption, + language, + (padding, padding + text_size[1]), + font, + font_scale, + font_color, + font_thickness, ) + frame = np.concatenate([frame, caption], axis=0) - self.video_recorder.write_frame(frame) + self._write_video_frame(frame) info = result[-1] self.is_success |= info["success"] @@ -460,6 +544,5 @@ def step(self, action): return result def render(self, mode="rgb_array", **kwargs): - if self.video_recorder.is_ready(): - self.video_recorder.stop() + self._close_video_writer() return self.file_path diff --git a/gr00t/experiment/__init__.py b/gr00t/experiment/__init__.py index e69de29bb..467079831 100644 --- a/gr00t/experiment/__init__.py +++ b/gr00t/experiment/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/experiment/dist_utils.py b/gr00t/experiment/dist_utils.py deleted file mode 100644 index 6100d569e..000000000 --- a/gr00t/experiment/dist_utils.py +++ /dev/null @@ -1,17 +0,0 @@ -# Make training work w/ and w/o distributed training. -import torch - - -def is_dist_avail_and_initialized() -> bool: - return torch.distributed.is_available() and torch.distributed.is_initialized() - - -def get_rank() -> int: - if is_dist_avail_and_initialized(): - return torch.distributed.get_rank() - return 0 - - -def barrier(): - if is_dist_avail_and_initialized(): - torch.distributed.barrier() diff --git a/gr00t/experiment/experiment.py b/gr00t/experiment/experiment.py index 6a9ad34e2..a75ecb9a8 100755 --- a/gr00t/experiment/experiment.py +++ b/gr00t/experiment/experiment.py @@ -1,4 +1,20 @@ #!/usr/bin/env python + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 json import logging import os @@ -12,11 +28,13 @@ import wandb from gr00t.configs.base_config import Config +from gr00t.configs.training.training_config import check_resume_compatibility # Use custom trainer that profiles data loading & forward times from gr00t.experiment.trainer import Gr00tTrainer, ProfCallback from gr00t.experiment.utils import BestMetricCheckpointCallback, CheckpointFormatCallback from gr00t.model import MODEL_REGISTRY +from gr00t.utils.dist_utils import run_on_rank0, run_or_wait_on_rank0 from gr00t.utils.initial_actions import INITIAL_ACTIONS_FILENAME, save_initial_actions @@ -32,20 +50,44 @@ def setup_logging(debug: bool = False): logging.getLogger("datasets").setLevel(logging.WARNING) +def _assert_num_gpus_matches_world_size(num_gpus: int) -> None: + """``num_gpus`` must equal the launcher's data-parallel world size. + + ``num_gpus`` drives per-device batch size and the DeepSpeed gating, while + HF ``Trainer`` and dataset sharding use the real ``WORLD_SIZE`` from + torchrun. A mismatch silently rescales the effective batch (e.g. an 8-rank + launch with ``num_gpus=1`` trains at 8× the intended batch), so reconcile + at the launcher trust boundary. + """ + world_size = os.environ.get("WORLD_SIZE") + if world_size is not None and int(world_size) != num_gpus: + raise ValueError( + f"config.training.num_gpus={num_gpus} does not match the launcher " + f"WORLD_SIZE={world_size}. num_gpus drives per-device batch size and " + f"DeepSpeed gating, while HF Trainer and dataset sharding use " + f"WORLD_SIZE; set num_gpus to {world_size}." + ) + + def warn_configs(config: Config): # updates to batch size + _assert_num_gpus_matches_world_size(config.training.num_gpus) assert config.training.global_batch_size % config.training.num_gpus == 0, ( "global_batch_size must be divisible by num_gpus" ) - if config.data.video_backend != "torchcodec": - warnings.warn( - "video_backend is not torchcodec. Only torchcodec will be supported in the future." + if config.training.gradient_accumulation_steps > 1: + logging.info( + "global_batch_size=%d × gradient_accumulation_steps=%d " + "→ accumulated_batch_size=%d per optimizer step", + config.training.global_batch_size, + config.training.gradient_accumulation_steps, + config.training.accumulated_batch_size, ) - if config.training.batch_size is not None: + if config.training.per_gpu_batch_size is not None: warnings.warn( - "batch_size will be deprecated in the future, please use global_batch_size instead. For now, this will override global_batch_size." + "per_gpu_batch_size will be deprecated in the future, please use global_batch_size instead. For now, this will override global_batch_size." ) if config.training.warmup_steps > 0: @@ -97,25 +139,67 @@ def warn_configs(config: Config): ) -def run(config: Config): - warn_configs(config) - - """Main training function.""" - # If using distributed training, initialize the process group +def _init_distributed_process_group() -> int: + """Init the NCCL process group with ``device_id=cuda:LOCAL_RANK`` so NCCL + binds the communicator eagerly (the PyTorch >=2.4 recommended pattern). + No-op when ``dist`` is already initialized or ``WORLD_SIZE`` is unset / 1. + """ if dist.is_initialized(): - global_rank = dist.get_rank() - elif "WORLD_SIZE" in os.environ and int(os.environ["WORLD_SIZE"]) > 1: - dist.init_process_group(backend="nccl") - # only meaningful for torchrun, for ray it is always 0 + return dist.get_rank() + if "WORLD_SIZE" in os.environ and int(os.environ["WORLD_SIZE"]) > 1: local_rank = int(os.environ["LOCAL_RANK"]) torch.cuda.set_device(local_rank) - global_rank = dist.get_rank() - else: - local_rank = 0 - global_rank = 0 + dist.init_process_group( + backend="nccl", + device_id=torch.device(f"cuda:{local_rank}"), + ) + return dist.get_rank() + return 0 + + +def save_run_config_artifacts( + save_cfg_dir: Path, output_dir: Path, config: Config, experiment_name: str +): + """Write ``config.yaml`` / ``conf.yaml`` / ``wandb_config.json``.""" + save_cfg_dir.mkdir(parents=True, exist_ok=True) + config.save(save_cfg_dir / "config.yaml") + omegaconf_config = OmegaConf.create(config.__dict__) + omegaconf_config["max_steps"] = config.training.max_steps + omegaconf_config["save_steps"] = config.training.save_steps + OmegaConf.save(omegaconf_config, save_cfg_dir / "conf.yaml", resolve=True) + wandb_config_file = output_dir / "wandb_config.json" + with open(wandb_config_file, "w") as f: + json.dump( + { + "project": config.training.wandb_project, + "run_id": experiment_name, + }, + f, + ) + logging.info(f"Saved config to {save_cfg_dir}") + + +def save_initial_actions_artifact(train_dataset, save_cfg_dir: Path): + """Write ``initial_actions.npz`` from ``train_dataset``; a falsy payload is a no-op.""" + initial_actions = train_dataset.get_initial_actions() + if not initial_actions: + return + initial_actions_path = save_cfg_dir / INITIAL_ACTIONS_FILENAME + save_initial_actions(initial_actions, initial_actions_path) + logging.info(f"Saved {len(initial_actions)} initial actions to {initial_actions_path}") + + +def run(config: Config): + """Main training function.""" + warn_configs(config) + check_resume_compatibility(config.training) + + global_rank = _init_distributed_process_group() # Setup setup_logging() + if global_rank != 0: + logging.getLogger().setLevel(logging.WARNING) set_seed(config.data.seed) # Validate config @@ -129,42 +213,36 @@ def run(config: Config): output_dir = Path(config.training.output_dir) / config.training.experiment_name experiment_name = config.training.experiment_name - output_dir.mkdir(parents=True, exist_ok=True) + run_on_rank0(output_dir.mkdir, parents=True, exist_ok=True, label="output_dir.mkdir") - # Save config save_cfg_dir = output_dir / "experiment_cfg" processor_dir = output_dir / "processor" - config.save(save_cfg_dir / "config.yaml") - omegaconf_config = OmegaConf.create(config.__dict__) - omegaconf_config["max_steps"] = config.training.max_steps - omegaconf_config["save_steps"] = config.training.save_steps - OmegaConf.save(omegaconf_config, save_cfg_dir / "conf.yaml", resolve=True) - wandb_config_file = output_dir / "wandb_config.json" - with open(wandb_config_file, "w") as f: - json.dump( - { - "project": config.training.wandb_project, - "run_id": experiment_name, - }, - f, - ) - logging.info(f"Saved config to {save_cfg_dir}") + # Rank-0-only write; wrapped so a rank-0 failure surfaces on every rank + # instead of stranding peers at the next NCCL collective. + run_on_rank0( + save_run_config_artifacts, + save_cfg_dir, + output_dir, + config, + experiment_name, + ) - # Initialize wandb if configured, but only on the main process - if config.training.use_wandb and global_rank == 0: - # Add git commit hash and version info to config - config_dict = { - **config.__dict__, - "git_commit_hash": os.environ.get("GROOT_COMMIT_HASH", "unknown"), - } - - wandb.init( - project=config.training.wandb_project, - name=experiment_name, - config=config_dict, - tags=[config.data.mode], - ) + # wandb.init does network I/O; wrap so a rank-0 failure can't strand peers. + if config.training.use_wandb: + with run_or_wait_on_rank0(label="wandb.init") as is_rank0: + if is_rank0: + config_dict = { + **config.__dict__, + "git_commit_hash": os.environ.get("GROOT_COMMIT_HASH", "unknown"), + } + + wandb.init( + project=config.training.wandb_project, + name=experiment_name, + config=config_dict, + tags=[config.data.mode], + ) # Setup model training pipeline. pipeline = MODEL_REGISTRY.get(type(config.model))(config, save_cfg_dir) @@ -173,7 +251,9 @@ def run(config: Config): train_dataset, eval_dataset = pipeline.return_dataset() data_collator = pipeline.return_collator() processor = pipeline.return_processor() - processor.save_pretrained(processor_dir) + # statistics.json here is read by Gr00tPolicy.from_pretrained at deploy time; + # a torn write silently degrades inference, so gate + broadcast failures. + run_on_rank0(processor.save_pretrained, processor_dir, label="processor.save_pretrained") # deepspeed config if config.training.num_gpus > 1 and not config.training.use_ddp: @@ -181,11 +261,11 @@ def run(config: Config): else: deepspeed_config = None - # for now we will let batch_size override global_batch_size, in future we will deprecate batch_size - if config.training.batch_size is None: + # for now we will let per_gpu_batch_size override global_batch_size, in future we will deprecate per_gpu_batch_size + if config.training.per_gpu_batch_size is None: per_device_train_batch_size = config.training.global_batch_size // config.training.num_gpus else: - per_device_train_batch_size = config.training.batch_size + per_device_train_batch_size = config.training.per_gpu_batch_size # Create training arguments training_args = TrainingArguments( @@ -198,10 +278,12 @@ def run(config: Config): lr_scheduler_type=config.training.lr_scheduler_type, weight_decay=config.training.weight_decay, warmup_ratio=config.training.warmup_ratio, + warmup_steps=config.training.warmup_steps, max_grad_norm=config.training.max_grad_norm, logging_steps=config.training.logging_steps, save_steps=config.training.save_steps, save_total_limit=config.training.save_total_limit, + save_only_model=config.training.save_only_model, fp16=config.training.fp16, bf16=config.training.bf16, tf32=config.training.tf32, @@ -244,15 +326,12 @@ def run(config: Config): metric_name=config.training.save_best_eval_metric_name, greater_is_better=config.training.save_best_eval_metric_greater_is_better, exp_cfg_dir=save_cfg_dir, + trainer=trainer, ) ) if hasattr(train_dataset, "get_initial_actions"): - initial_actions = train_dataset.get_initial_actions() - if initial_actions: - initial_actions_path = save_cfg_dir / INITIAL_ACTIONS_FILENAME - save_initial_actions(initial_actions, initial_actions_path) - logging.info(f"Saved {len(initial_actions)} initial actions to {initial_actions_path}") + run_on_rank0(save_initial_actions_artifact, train_dataset, save_cfg_dir) # Train logging.info("🚀 Starting training...") @@ -269,10 +348,13 @@ def on_trace_ready_handler(trainer, profile_dir, prof): logging.info(f"Trace saved to {output_path}") profile_dir = output_dir / "profiling" - profile_dir.mkdir(parents=True, exist_ok=True) + run_on_rank0(profile_dir.mkdir, parents=True, exist_ok=True, label="profile_dir.mkdir") with torch.profiler.profile( - activities=[torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA], + activities=[ + torch.profiler.ProfilerActivity.CPU, + torch.profiler.ProfilerActivity.CUDA, + ], schedule=torch.profiler.schedule(skip_first=10, wait=1, warmup=1, active=3, repeat=1), # profile_memory=True, with_stack=True, @@ -280,9 +362,9 @@ def on_trace_ready_handler(trainer, profile_dir, prof): on_trace_ready=partial(on_trace_ready_handler, trainer, profile_dir), ) as prof: trainer.add_callback(ProfCallback(prof=prof)) - trainer.train(resume_from_checkpoint=True) + trainer.train(resume_from_checkpoint=config.training.resume_from_checkpoint) else: - trainer.train(resume_from_checkpoint=True) + trainer.train(resume_from_checkpoint=config.training.resume_from_checkpoint) # Save final model trainer.save_model() diff --git a/gr00t/experiment/launch_finetune.py b/gr00t/experiment/launch_finetune.py index f5deb7e13..00cb3ef1f 100644 --- a/gr00t/experiment/launch_finetune.py +++ b/gr00t/experiment/launch_finetune.py @@ -1,6 +1,22 @@ -# Launch finetuning for N1.6 on "single node". +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +# Launch finetuning for N1.7 on "single node". # This script tries to provide a similar user experience as current OSS. +import json import os from pathlib import Path @@ -31,19 +47,24 @@ def load_modality_config(modality_config_path: str): os.environ["LOGURU_LEVEL"] = "INFO" # Use tyro for clean CLI ft_config = tyro.cli(FinetuneConfig, description=__doc__) + from gr00t.data.embodiment_tags import EmbodimentTag + + ft_config.embodiment_tag = EmbodimentTag.resolve(ft_config.embodiment_tag) embodiment_tag = ft_config.embodiment_tag.value # all rank workers should register for the modality config if ft_config.modality_config_path is not None: load_modality_config(ft_config.modality_config_path) + dataset_paths = [path for path in ft_config.dataset_path.split(os.pathsep) if path] + config = get_default_config().load_dict( { "data": { "download_cache": False, "datasets": [ { - "dataset_paths": [ft_config.dataset_path], + "dataset_paths": dataset_paths, "mix_ratio": 1.0, "embodiment_tag": embodiment_tag, } @@ -61,14 +82,26 @@ def load_modality_config(modality_config_path: str): config.model.state_dropout_prob = ft_config.state_dropout_prob config.model.random_rotation_angle = ft_config.random_rotation_angle config.model.color_jitter_params = ft_config.color_jitter_params + config.model.use_percentiles = ft_config.use_percentiles + if (ft_config.shortest_image_edge is None) != (ft_config.crop_fraction is None): + raise ValueError("shortest_image_edge and crop_fraction must be set together") + if ft_config.shortest_image_edge is not None: + config.model.shortest_image_edge = ft_config.shortest_image_edge + config.model.crop_fraction = ft_config.crop_fraction + config.model.image_crop_size = None + config.model.image_target_size = None + if ft_config.extra_augmentation_config: + config.model.extra_augmentation_config = json.loads(ft_config.extra_augmentation_config) + else: + config.model.extra_augmentation_config = None config.model.load_bf16 = False config.model.reproject_vision = False - config.model.eagle_collator = True - config.model.model_name = "nvidia/Eagle-Block2A-2B-v2" + config.model.model_name = "nvidia/Cosmos-Reason2-2B" config.model.backbone_trainable_params_fp32 = True config.model.use_relative_action = True + config.training.experiment_name = ft_config.experiment_name config.training.start_from_checkpoint = ft_config.base_model_path config.training.optim = "adamw_torch" config.training.global_batch_size = ft_config.global_batch_size @@ -83,10 +116,15 @@ def load_modality_config(modality_config_path: str): config.training.max_steps = ft_config.max_steps config.training.weight_decay = ft_config.weight_decay config.training.warmup_ratio = ft_config.warmup_ratio - config.training.wandb_project = "finetune-gr00t-n1d6" + config.training.wandb_project = ft_config.wandb_project config.data.shard_size = ft_config.shard_size config.data.episode_sampling_rate = ft_config.episode_sampling_rate config.data.num_shards_per_epoch = ft_config.num_shards_per_epoch + config.data.ds_weights_alpha = ft_config.ds_weights_alpha + + config.training.save_only_model = ft_config.save_only_model + config.training.resume_from_checkpoint = ft_config.resume_from_checkpoint + config.training.skip_weight_loading = ft_config.skip_weight_loading run(config) diff --git a/gr00t/experiment/launch_train.py b/gr00t/experiment/launch_train.py index 00e4c88b1..3f3c93660 100644 --- a/gr00t/experiment/launch_train.py +++ b/gr00t/experiment/launch_train.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 logging import os from pathlib import Path diff --git a/gr00t/experiment/trainer.py b/gr00t/experiment/trainer.py index e94a0cd42..817a000e7 100755 --- a/gr00t/experiment/trainer.py +++ b/gr00t/experiment/trainer.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """Custom Trainer with simple profiling utilities. This subclass of HuggingFace's ``Trainer`` measures: @@ -23,7 +38,6 @@ import torch from transformers.trainer import TRAINER_STATE_NAME, Trainer, TrainerState, get_last_checkpoint from transformers.trainer_callback import TrainerCallback -from transformers.trainer_utils import EvalPrediction class ProfCallback(TrainerCallback): @@ -135,46 +149,6 @@ def _batch_accuracy( return accuracy -# Global variables for batched evaluation metrics -_eval_accuracy_accumulated_correct = 0 -_eval_accuracy_accumulated_total = 0 - - -def compute_eval_accuracy( - eval_pred: EvalPrediction, compute_result: bool, action_offset: Optional[int] = None -): - logits = eval_pred.predictions[0] - if action_offset is not None: - logits = logits[..., action_offset:] - preds = logits.argmax(axis=-1) - labels = eval_pred.label_ids - - preds = preds[:, :-1] - labels = labels[:, 1:] - - # Ignore positions with label == -100 (HF convention) - mask = labels != -100 - - if action_offset is not None: - # we offset the labels to the action tokens range, with normal tokens in the negatives - labels = labels - action_offset - - correct = ((preds == labels) & mask).sum() - total = mask.sum() - - global _eval_accuracy_accumulated_correct, _eval_accuracy_accumulated_total - _eval_accuracy_accumulated_correct += correct - _eval_accuracy_accumulated_total += total - - if compute_result: - accuracy = _eval_accuracy_accumulated_correct / max(_eval_accuracy_accumulated_total, 1) - _eval_accuracy_accumulated_correct = 0 - _eval_accuracy_accumulated_total = 0 - return {"eval_accuracy": accuracy} - else: - return {} - - class Gr00tTrainer(Trainer): """Trainer that bypasses torch dataloader and makes data collator async.""" @@ -190,11 +164,7 @@ def __init__( """ self.action_offset = kwargs.pop("action_offset", None) self.multiprocessing_context = kwargs.pop("multiprocessing_context", "fork") - super().__init__( - *args, - **kwargs, - # compute_metrics=partial(compute_eval_accuracy, action_offset=self.action_offset), - ) + super().__init__(*args, **kwargs) def log(self, logs: dict[str, float], start_time: Optional[float] = None) -> None: # Hide epoch from logged metrics as it's misleading for Iterable datasets. @@ -212,6 +182,12 @@ def get_train_dataloader(self): # noqa: D401 curr_global_step = self.state.global_step print(f"Current global step: {curr_global_step}") if curr_global_step > 0: + # ``new_seed`` MUST be the same on every rank: ``ShardedMixtureDataset`` + # builds its shard schedule from this seed and partitions disjointly + # by index, so a per-rank delta here would cause sample duplication + # / loss across ranks. Both inputs are rank-symmetric (the dataset's + # own seed was set rank-symmetrically at __init__, and global_step + # is read from TrainerState which is broadcast via rendezvous). new_seed = self.train_dataset.seed + curr_global_step self.train_dataset.reset_seed(new_seed) print( @@ -246,25 +222,30 @@ def train( resume_from_checkpoint=None, **kwargs, ): - """Correctly set self.state from checkpoint so get_train_dataloader can read from it.""" - if resume_from_checkpoint is False: - resume_from_checkpoint = None - - if isinstance(resume_from_checkpoint, bool) and resume_from_checkpoint: - resume_from_checkpoint = get_last_checkpoint(self.args.output_dir) - if resume_from_checkpoint is None: - logging.warning( + """Pre-load TrainerState before super().train() so get_train_dataloader + can read self.state.global_step (stateful samplers rely on this). + ``resume_from_checkpoint=True`` with no checkpoint raises rather than + silently starting fresh. + """ + if resume_from_checkpoint is True: + latest_checkpoint = get_last_checkpoint(self.args.output_dir) + if latest_checkpoint is None: + raise ValueError( f"No valid checkpoint found in output directory ({self.args.output_dir})" ) + elif resume_from_checkpoint in (False, None): + latest_checkpoint = None + else: + latest_checkpoint = resume_from_checkpoint # caller passed an explicit path - if resume_from_checkpoint is not None: - logging.info(f"Resuming from checkpoint {resume_from_checkpoint}") + if latest_checkpoint is not None: + logging.info(f"Resuming from checkpoint {latest_checkpoint}") # In case of repeating the find_executable_batch_size, set `self._train_batch_size` properly self.state = TrainerState.load_from_json( - os.path.join(resume_from_checkpoint, TRAINER_STATE_NAME) + os.path.join(latest_checkpoint, TRAINER_STATE_NAME) ) - return super().train(resume_from_checkpoint=resume_from_checkpoint, **kwargs) + return super().train(resume_from_checkpoint=latest_checkpoint, **kwargs) # ------------------------------------------------------------------ # Loss / accuracy computation override @@ -324,4 +305,23 @@ def compute_loss( if self.args.local_rank in (-1, 0): self.log({"train_accuracy": acc_mean}) + # Log a sample of ground-truth vs predicted action tokens from + # the first batch element so users can verify the model is + # learning the right behaviors. + shifted_labels = inputs["labels"][:1, 1:].cpu() + shifted_preds = preds[:1, :-1] + mask_0 = shifted_labels[0] != -100 + gt_tokens = shifted_labels[0][mask_0][:20] + if self.action_offset is not None: + gt_tokens = gt_tokens - self.action_offset + gt_sample = gt_tokens.tolist() + pred_sample = shifted_preds[0][mask_0[: shifted_preds.shape[1]]][:20].tolist() + logging.info( + "Step %d — GT vs Pred (first 20 action tokens, batch[0]):\n" + " GT: %s\n Pred: %s", + self.state.global_step, + gt_sample, + pred_sample, + ) + return (loss, outputs) if return_outputs else loss diff --git a/gr00t/experiment/utils.py b/gr00t/experiment/utils.py index 23e03e960..07a09538b 100755 --- a/gr00t/experiment/utils.py +++ b/gr00t/experiment/utils.py @@ -1,10 +1,63 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 logging from pathlib import Path import shutil -from transformers import TrainerCallback +import torch +import torch.distributed as dist +from transformers import Trainer, TrainerCallback from transformers.trainer_callback import TrainerControl, TrainerState from transformers.training_args import TrainingArguments +from gr00t.utils.dist_utils import run_on_rank0, run_or_wait_on_rank0 + + +logger = logging.getLogger(__name__) + + +def _broadcast_save_decision(save_flag: int, metric_value: float) -> tuple[int, float]: + """Broadcast rank-0's `(save_flag, metric_value)` decision to every rank. + + HF's eval loop populates ``metrics`` only on rank-0 in some configurations, + so the "should we save?" branch must be decided there and synced. Without + this, non-rank-0 ranks would skip the collective ``Trainer.save_model`` + call below and rank-0 would deadlock inside the consolidated-gather. + + Returns the broadcast pair on every rank. Single-rank or non-distributed + case: returns the input unchanged. + """ + if not (dist.is_available() and dist.is_initialized()): + return save_flag, metric_value + + backend = dist.get_backend() + device = ( + torch.device(f"cuda:{torch.cuda.current_device()}") + if backend == "nccl" + else torch.device("cpu") + ) + # Use float64 so the metric reaches every rank bit-for-bit identical to + # rank-0 — the value is interpolated into the checkpoint directory name + # and must agree across ranks. + payload = torch.tensor( + [float(save_flag), float(metric_value)], device=device, dtype=torch.float64 + ) + dist.broadcast(payload, src=0) + return int(payload[0].item()), float(payload[1].item()) + class CheckpointFormatCallback(TrainerCallback): """This callback format checkpoint to make them standalone. For now, it copies all config @@ -15,7 +68,10 @@ class CheckpointFormatCallback(TrainerCallback): """ def __init__( - self, run_name: str, exp_cfg_dir: Path | None = None, processor_dir: Path | None = None + self, + run_name: str, + exp_cfg_dir: Path | None = None, + processor_dir: Path | None = None, ): """ Args: @@ -54,16 +110,38 @@ def on_save(self, args, state, control, **kwargs): class BestMetricCheckpointCallback(TrainerCallback): - """This callback saves the best checkpoint based on the metric.""" + """Save a copy of the model whenever an evaluation metric improves. + + Works under DDP, DeepSpeed ZeRO 1/2/3, and PyTorch FSDP: the save is + delegated to ``Trainer.save_model``, which handles parameter + consolidation under sharded backends. The callback's own job is to + agree across ranks on whether this eval round should save, and to + manage the best-checkpoint directory (mkdir, optional ``exp_cfg_dir`` + copy, previous-best cleanup). + """ def __init__( - self, metric_name: str, greater_is_better: bool = True, exp_cfg_dir: Path | None = None + self, + metric_name: str, + trainer: Trainer, + *, + greater_is_better: bool = True, + exp_cfg_dir: Path | None = None, ): + """ + Args: + metric_name: Key in the eval ``metrics`` dict to track. + trainer: The owning ``Trainer``; needed to call + ``trainer.save_model`` (the sharded-aware save path). + greater_is_better: True when the metric should be maximized. + exp_cfg_dir: Directory copied alongside each best checkpoint. + """ self.metric_name = metric_name self.greater_is_better = greater_is_better self.best_metric = -float("inf") if greater_is_better else float("inf") self.exp_cfg_dir = exp_cfg_dir self._best_checkpoint_dir = None + self._trainer = trainer def on_evaluate( self, @@ -74,39 +152,59 @@ def on_evaluate( model, **kwargs, ): + save_flag = 0 + metric_value = 0.0 if state.is_world_process_zero and metrics is not None: - current_metric = metrics.get(self.metric_name, None) - if current_metric is not None: + current = metrics.get(self.metric_name, None) + if current is not None: is_better = ( - self.greater_is_better - if current_metric > self.best_metric - else not self.greater_is_better + current > self.best_metric + if self.greater_is_better + else current < self.best_metric ) if is_better: - self.best_metric = current_metric - best_checkpoint_dir = ( - Path(args.output_dir) - / f"checkpoint-{state.global_step}-best-{self.metric_name}_{current_metric}" - ) - best_checkpoint_dir.mkdir(exist_ok=True) - model.save_pretrained(best_checkpoint_dir) - # Copy experiment config directory if provided - if self.exp_cfg_dir is not None: - exp_cfg_dst = best_checkpoint_dir / self.exp_cfg_dir.name - if self.exp_cfg_dir.exists(): - print( - f"Copying experiment config directory {self.exp_cfg_dir} to {exp_cfg_dst}" - ) - shutil.copytree(self.exp_cfg_dir, exp_cfg_dst, dirs_exist_ok=True) + save_flag = 1 + metric_value = float(current) - print( - f"Best checkpoint saved to {best_checkpoint_dir} with metric {self.metric_name} = {current_metric}" + save_flag, metric_value = _broadcast_save_decision(save_flag, metric_value) + if save_flag == 0: + return + + self.best_metric = metric_value + + best_checkpoint_dir = ( + Path(args.output_dir) + / f"checkpoint-{state.global_step}-best-{self.metric_name}_{metric_value}" + ) + + run_on_rank0(best_checkpoint_dir.mkdir, exist_ok=True, label="best_checkpoint.mkdir") + # Collective on every rank: gathers params under ZeRO-3 / FSDP, then + # writes from rank-0. Calling this only on rank-0 would deadlock the + # rest of the process group inside the gather. + self._trainer.save_model(str(best_checkpoint_dir)) + + with run_or_wait_on_rank0(label="best_checkpoint.copy") as is_rank0: + if is_rank0: + if self.exp_cfg_dir is not None and self.exp_cfg_dir.exists(): + exp_cfg_dst = best_checkpoint_dir / self.exp_cfg_dir.name + logger.info( + "Copying experiment config directory %s to %s", + self.exp_cfg_dir, + exp_cfg_dst, ) + shutil.copytree(self.exp_cfg_dir, exp_cfg_dst, dirs_exist_ok=True) + + logger.info( + "Best checkpoint saved to %s with metric %s = %s", + best_checkpoint_dir, + self.metric_name, + metric_value, + ) - if ( - self._best_checkpoint_dir is not None - and Path(self._best_checkpoint_dir).exists() - ): - shutil.rmtree(self._best_checkpoint_dir) + if ( + self._best_checkpoint_dir is not None + and Path(self._best_checkpoint_dir).exists() + ): + shutil.rmtree(self._best_checkpoint_dir) - self._best_checkpoint_dir = str(best_checkpoint_dir) + self._best_checkpoint_dir = str(best_checkpoint_dir) diff --git a/gr00t/model/__init__.py b/gr00t/model/__init__.py index 57e2627a0..1ba425e5e 100755 --- a/gr00t/model/__init__.py +++ b/gr00t/model/__init__.py @@ -1,2 +1,17 @@ -from .gr00t_n1d6.setup import Gr00tN1d6Pipeline +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from .gr00t_n1d7.setup import Gr00tN1d7Pipeline from .registry import MODEL_REGISTRY diff --git a/gr00t/model/base/model_pipeline.py b/gr00t/model/base/model_pipeline.py index 9d046cbcf..cd11f1f3a 100644 --- a/gr00t/model/base/model_pipeline.py +++ b/gr00t/model/base/model_pipeline.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 json import logging from pathlib import Path @@ -6,6 +21,7 @@ from gr00t.data.collator import BasicDataCollator from gr00t.data.dataset.factory import DatasetFactory from gr00t.data.interfaces import BaseProcessor +from gr00t.utils.dist_utils import get_rank, run_or_wait_on_rank0 import numpy as np import torch from transformers import PreTrainedModel @@ -68,7 +84,8 @@ def setup(self): def _create_model(self): # Load model model = self.model_class(self.config.model) - print("Model Config: ", model.config) + if get_rank() == 0: + print("Model Config: ", model.config) # unfreeze the model first for name, param in model.named_parameters(): @@ -93,13 +110,13 @@ def _create_dataset(self, save_cfg_dir: Path): dataset_factory = DatasetFactory(self.config) train_dataset, eval_dataset = dataset_factory.build(self.processor) - # Save dataset statistics for inference - stats = train_dataset.get_dataset_statistics() - stats_dict = convert_tensors_to_lists(stats) - # Save statistics - with open(save_cfg_dir / "dataset_statistics.json", "w") as f: - json.dump(stats_dict, f, indent=2) - logging.info("Saved dataset statistics for inference") + with run_or_wait_on_rank0(label="dataset_statistics.json write") as is_rank0: + if is_rank0: + stats = train_dataset.get_dataset_statistics() + stats_dict = convert_tensors_to_lists(stats) + with open(save_cfg_dir / "dataset_statistics.json", "w") as f: + json.dump(stats_dict, f, indent=2) + logging.info("Saved dataset statistics for inference") return train_dataset, eval_dataset diff --git a/gr00t/model/gr00t_n1d6/processing_gr00t_n1d6.py b/gr00t/model/gr00t_n1d6/processing_gr00t_n1d6.py deleted file mode 100755 index adaa6d7e9..000000000 --- a/gr00t/model/gr00t_n1d6/processing_gr00t_n1d6.py +++ /dev/null @@ -1,525 +0,0 @@ -import json -import os -from pathlib import Path -import re -from typing import Any, Dict, Literal -import warnings - -import albumentations as A -from gr00t.configs.data.embodiment_configs import ModalityConfig -from gr00t.data.embodiment_tags import EmbodimentTag -from gr00t.data.interfaces import BaseProcessor -from gr00t.data.state_action.state_action_processor import StateActionProcessor -from gr00t.data.utils import parse_modality_configs, to_json_serializable -import numpy as np -from PIL import Image -import torch -import torchvision.transforms.v2 as transforms -from transformers import AutoProcessor, ProcessorMixin -from transformers.feature_extraction_utils import BatchFeature -from transformers.utils import cached_file - -from .image_augmentations import ( - apply_with_replay, - build_image_transformations, - build_image_transformations_albumentations, -) - - -# Suppress protobuf deprecation warnings -warnings.filterwarnings("ignore", category=DeprecationWarning, module="google.protobuf") - -### Mapping from embodiment tag to projector index. -EMBODIMENT_TAG_TO_PROJECTOR_INDEX = { - ##### Pretrain embodiment ids ##### - "robocasa_panda_omron": 13, - "gr1": 20, - "behavior_r1_pro": 24, - ##### Pre-registered posttrain embodiment ids ##### - "unitree_g1": 8, - "libero_panda": 2, - "oxe_google": 0, - "oxe_widowx": 1, - "new_embodiment": 10, -} - - -def build_processor(model_name: str, transformers_loading_kwargs: dict) -> ProcessorMixin: - assert model_name == "nvidia/Eagle-Block2A-2B-v2", f"Processor for {model_name} not supported" - eagle_path = os.path.join( - os.path.dirname(__file__), "..", "modules", "nvidia", "Eagle-Block2A-2B-v2" - ) - return AutoProcessor.from_pretrained(eagle_path, **transformers_loading_kwargs) - - -class Gr00tN1d6DataCollator: - def __init__( - self, - model_name: str, - model_type: Literal["eagle"] = "eagle", - transformers_loading_kwargs: dict = {}, - ): - ### We need to use the same processor for padding input ids and concat - self.processor = build_processor(model_name, transformers_loading_kwargs) - # Set padding side to 'left' for Flash Attention compatibility - self.processor.tokenizer.padding_side = "left" - self.model_type = model_type - self.model_name = model_name - - def __call__(self, features: list[Dict[str, Any]]) -> BatchFeature: - batch = {} - keys = list(set().union(*(elem.keys() for elem in features))) - - for key in keys: - values = [elem[key] for elem in features if key in elem] - if key == "vlm_content": - # Handle vlm_content specially - extract text and images - text_list = [] - image_inputs = [] - for v in values: - curr_text_list = [v["text"]] - - text_list += curr_text_list - curr_image_inputs = v["images"] - image_inputs += curr_image_inputs - - # NOTE: some VLMs need this, others don't. - if self.model_type == "eagle": - image_inputs, _ = self.processor.process_vision_info( - [v["conversation"] for v in values] - ) - vlm_inputs = self.processor( - text=text_list, images=image_inputs, return_tensors="pt", padding=True - ) - for k, v in vlm_inputs.items(): - batch[k] = v - elif key in ("pixel_values", "image_grid_thw", "attention_mask", "input_ids"): - raise Exception("Not implemented") - else: - # state, state_mask, action and action_mask - stack to form batch dimension - batch[key] = torch.from_numpy(np.stack(values)) - return BatchFeature(data={"inputs": batch}) - - def __str__(self): - return f"Gr00tN1d6DataCollator(model_name={self.model_name}, model_type={self.model_type})" - - -class Gr00tN1d6Processor(BaseProcessor): - data_collator_class = Gr00tN1d6DataCollator - - def __init__( - self, - modality_configs: dict[str, dict[str, ModalityConfig]], - statistics: dict[str, dict[str, dict[str, dict[str, list[float]]]]] | None = None, - use_percentiles: bool = False, - clip_outliers: bool = True, - image_crop_size: list[int] = None, - image_target_size: list[int] = None, - shortest_image_edge: int = 512, - crop_fraction: float = 0.95, - random_rotation_angle: int | None = None, - color_jitter_params: dict[str, float] | None = None, - formalize_language: bool = True, - model_name: str = "nvidia/Eagle-Block2A-2B-v2", - model_type: Literal["eagle"] = "eagle", - max_state_dim: int = 29, - max_action_dim: int = 29, - apply_sincos_state_encoding: bool = False, - max_action_horizon: int = 40, - use_albumentations: bool = False, - use_relative_action: bool = False, - embodiment_id_mapping: dict[str, int] | None = None, - transformers_loading_kwargs: dict = {"trust_remote_code": True}, - ): - self.modality_configs = parse_modality_configs(modality_configs) - - # Initialize StateActionProcessor for state/action normalization - self.state_action_processor = StateActionProcessor( - modality_configs=modality_configs, - statistics=statistics, - use_percentiles=use_percentiles, - clip_outliers=clip_outliers, - apply_sincos_state_encoding=apply_sincos_state_encoding, - use_relative_action=use_relative_action, - ) - - # Save state action processor settings - self.use_percentiles = use_percentiles - self.clip_outliers = clip_outliers - self.apply_sincos_state_encoding = apply_sincos_state_encoding - self.use_relative_action = use_relative_action - - # Save VLM settings - self.formalize_language = formalize_language - self.model_name = model_name - self.model_type = model_type - - self.max_state_dim = max_state_dim - self.max_action_dim = max_action_dim - self.max_action_horizon = max_action_horizon - - # Save image processing settings - self.image_crop_size = image_crop_size - self.image_target_size = image_target_size - self.random_rotation_angle = random_rotation_angle - self.color_jitter_params = color_jitter_params - self.processor = build_processor(model_name, transformers_loading_kwargs) - # Set padding side to 'left' for Flash Attention compatibility - self.processor.tokenizer.padding_side = "left" - self.embodiment_id_mapping = embodiment_id_mapping or EMBODIMENT_TAG_TO_PROJECTOR_INDEX - # handle the case where the fine-tuning embodiment tag is not in the pre-trained embodiment tag mapping - for k, v in EMBODIMENT_TAG_TO_PROJECTOR_INDEX.items(): - if k not in self.embodiment_id_mapping: - self.embodiment_id_mapping[k] = v - self.shortest_image_edge = shortest_image_edge - self.crop_fraction = crop_fraction - - # Choose between torchvision and albumentations transforms - self.use_albumentations = use_albumentations - if use_albumentations: - self.train_image_transform, self.eval_image_transform = ( - build_image_transformations_albumentations( - image_target_size, - image_crop_size, - random_rotation_angle, - color_jitter_params, - shortest_image_edge, - crop_fraction, - ) - ) - else: - self.train_image_transform, self.eval_image_transform = build_image_transformations( - image_target_size, image_crop_size, random_rotation_angle, color_jitter_params - ) - self._collator = self.data_collator_class( - model_name=model_name, - model_type=model_type, - transformers_loading_kwargs=transformers_loading_kwargs, - ) - self.train() - - @property - def collator(self): - return self._collator - - def train(self): - super().train() - self.state_action_processor.train() - - def eval(self): - super().eval() - self.state_action_processor.eval() - - def set_statistics( - self, - statistics: dict[str, dict[str, dict[str, dict[str, list[float]]]]], - override: bool = False, - ) -> None: - """Set dataset statistics for normalization.""" - self.state_action_processor.set_statistics(statistics, override=override) - - # Compute action dimensions for convenience - self.action_dim = {} - for embodiment_tag in self.state_action_processor.statistics: - self.action_dim[embodiment_tag] = self.state_action_processor.get_action_dim( - embodiment_tag - ) - - def decode_action( - self, - action: np.ndarray, - embodiment_tag: EmbodimentTag, - state: dict[str, np.ndarray] | None = None, - ): - """Undo action normalization and convert relative actions to absolute.""" - # Split concatenated action into joint groups - out_dict = {} - start_idx = 0 - joint_groups = self.modality_configs[embodiment_tag.value]["action"].modality_keys - action_horizon = len(self.modality_configs[embodiment_tag.value]["action"].delta_indices) - for key in joint_groups: - joint_dim = self.state_action_processor.norm_params[embodiment_tag.value]["action"][ - key - ]["dim"].item() - out_dict[key] = action[..., :action_horizon, start_idx : start_idx + joint_dim] - start_idx += joint_dim - - # Use StateActionProcessor to unnormalize and convert to absolute - return self.state_action_processor.unapply_action( - out_dict, embodiment_tag.value, state=state - ) - - def _apply_vlm_processing(self, images: np.ndarray, language: str) -> BatchFeature: - """ - Args: - batch: - video: [T, C, H, W] - Returns: vlm_content format for collation - """ - # Convert images to PIL format - pil_images = [Image.fromarray(np.transpose(v, (1, 2, 0))) for v in images] - - # Create conversation with images and text - conversation = [ - { - "role": "user", - "content": [ - {"type": "text", "text": language}, - *[{"type": "image", "image": img} for img in pil_images], - ], - } - ] - - # Apply chat template but don't process yet - let collator handle it - text = self.processor.apply_chat_template( - conversation, tokenize=False, add_generation_prompt=False - ) - - # Return vlm_content format for collation - return { - "vlm_content": { - "text": text, - "images": pil_images, - "conversation": conversation, - } - } - - def __call__( - self, - messages: list[dict[str, Any]], - ): - assert len(messages) == 1 - content = messages[0]["content"] - embodiment_tag = content.embodiment - action_data = content.actions - state_data = content.states - - # Use StateActionProcessor to handle relative conversion and normalization - normalized_states, normalized_actions = self.state_action_processor.apply( - state=state_data, - action=action_data, - embodiment_tag=embodiment_tag.value, - ) - - if normalized_actions: - # Concatenate actions - action_keys = self.modality_configs[embodiment_tag.value]["action"].modality_keys - normalized_actions = torch.cat( - [torch.from_numpy(normalized_actions[key]) for key in action_keys], dim=-1 - ) # (t, d) - action_dim = normalized_actions.shape[1] - # Pad action to max_action_dim - normalized_actions = torch.cat( - [ - normalized_actions, - torch.zeros( - normalized_actions.shape[0], - self.max_action_dim - normalized_actions.shape[1], - ), - ], - dim=-1, - ) # (t, max_action_dim) - # Pad action to max_action_horizon - action_horizon = normalized_actions.shape[0] - normalized_actions = torch.cat( - [ - normalized_actions, - torch.zeros( - self.max_action_horizon - normalized_actions.shape[0], - self.max_action_dim, - ), - ], - dim=0, - ) # (max_action_horizon, max_action_dim) - # Create action mask - action_mask = torch.ones_like(normalized_actions) - action_mask[action_horizon:] = 0 - action_mask[:, action_dim:] = 0 - else: - assert not self.training, "Action is required in training mode" - normalized_actions = None - action_mask = None - - # Concatenate states - state_keys = self.modality_configs[embodiment_tag.value]["state"].modality_keys - normalized_states = torch.cat( - [torch.from_numpy(normalized_states[key]) for key in state_keys], dim=-1 - ) - normalized_states = torch.cat( - [ - normalized_states, - torch.zeros( - normalized_states.shape[0], self.max_state_dim - normalized_states.shape[1] - ), - ], - dim=-1, - ) - - # Crop and resize images. - if self.training: - image_transform = self.train_image_transform - else: - image_transform = self.eval_image_transform - image_keys = self.modality_configs[embodiment_tag.value]["video"].modality_keys - - if self.formalize_language: - language = content.text.lower() - language = re.sub(r"[^\w\s]", "", language) - else: - language = content.text - - vlm_inputs = self._get_vlm_inputs( - image_keys=image_keys, - images=content.images, - image_transform=image_transform, - language=language, - ) - - transformed_inputs = { - "state": normalized_states.to(torch.get_default_dtype()), - } - if normalized_actions is not None: - transformed_inputs["action"] = normalized_actions.to(torch.get_default_dtype()) - # Add VLM inputs - transformed_inputs.update(vlm_inputs) - if action_mask is not None: - transformed_inputs["action_mask"] = action_mask - transformed_inputs["embodiment_id"] = self.embodiment_id_mapping[embodiment_tag.value] - return transformed_inputs - - def _get_vlm_inputs( - self, - image_keys: list[str], - images: list[Image.Image], - image_transform: transforms.Compose | A.Compose, - language: str, - ): - temporal_stacked_images = {} - - if self.use_albumentations: - # Use albumentations transforms - replay = None - for view in image_keys: - assert view in images, f"{view} not in {images}" - # Apply transforms with replay for consistency - transformed_images, replay = apply_with_replay( - image_transform, images[view], replay - ) - temporal_stacked_images[view] = torch.stack(transformed_images) # (T, C, H, W) - else: - # Use torchvision transforms - for view in image_keys: - assert view in images, f"{view} not in {images}" - temporal_stacked_images[view] = torch.stack( - [image_transform(img) for img in images[view]] - ) # (T, C, H, W) - - for k, v in temporal_stacked_images.items(): - assert isinstance(k, str), f"{k} is not a string" - assert isinstance(v, torch.Tensor), f"{v} is not a torch tensor" - assert v.ndim == 4, f"{v} is not a 4D tensor" - assert v.dtype == torch.uint8, f"{v} is not a uint8 tensor" - assert v.shape[1] == 3, f"{v} is not a 3 channel tensor" - - stacked_images = ( - torch.stack([temporal_stacked_images[view] for view in image_keys], dim=1) - .flatten(0, 1) - .numpy() - ) # (T*V, C, H, W), Eagle processor expects numpy array - - vlm_inputs = self._apply_vlm_processing(stacked_images, language) - return vlm_inputs - - def save_pretrained(self, save_directory: str | Path) -> list[Path]: - # dump modality configs to dict using the recursive function - save_directory.mkdir(parents=True, exist_ok=True) - main_config_file = Path(save_directory) / "processor_config.json" - statistics_file = Path(save_directory) / "statistics.json" - embodiment_id_file = Path(save_directory) / "embodiment_id.json" - - config = { - "processor_class": self.__class__.__name__, - "processor_kwargs": { - "modality_configs": to_json_serializable(self.modality_configs), - # Image processing settings - "image_crop_size": self.image_crop_size, - "image_target_size": self.image_target_size, - "use_albumentations": self.use_albumentations, - "random_rotation_angle": self.random_rotation_angle, - "color_jitter_params": self.color_jitter_params, - "shortest_image_edge": self.shortest_image_edge, - "crop_fraction": self.crop_fraction, - # VLM settings - "model_name": self.model_name, - "model_type": self.model_type, - "formalize_language": self.formalize_language, - # State action dimensions - "max_state_dim": self.max_state_dim, - "max_action_dim": self.max_action_dim, - "max_action_horizon": self.max_action_horizon, - # StateActionProcessor settings - "use_percentiles": self.use_percentiles, - "clip_outliers": self.clip_outliers, - "apply_sincos_state_encoding": self.apply_sincos_state_encoding, - "use_relative_action": self.use_relative_action, - }, - } - with open(main_config_file, "w") as f: - json.dump(config, f, indent=2) - # Save statistics - with open(statistics_file, "w") as f: - json.dump(to_json_serializable(self.state_action_processor.statistics), f, indent=2) - # Save embodiment id mapping - with open(embodiment_id_file, "w") as f: - json.dump(self.embodiment_id_mapping, f, indent=2) - return [main_config_file, statistics_file, embodiment_id_file] - - @classmethod - def from_pretrained(cls, pretrained_model_name_or_path: str | Path, **kwargs): - transformers_loading_kwargs = kwargs.pop( - "transformers_loading_kwargs", {"trust_remote_code": True} - ) - pretrained_model_name_or_path = Path(pretrained_model_name_or_path) - config_file = pretrained_model_name_or_path / "processor_config.json" - statistics_file = pretrained_model_name_or_path / "statistics.json" - embodiment_id_file = pretrained_model_name_or_path / "embodiment_id.json" - is_local = os.path.isdir(pretrained_model_name_or_path) - if not is_local: - config_file = Path(cached_file(pretrained_model_name_or_path, "processor_config.json")) - statistics_file = Path(cached_file(pretrained_model_name_or_path, "statistics.json")) - embodiment_id_file = Path( - cached_file(pretrained_model_name_or_path, "embodiment_id.json") - ) - - with open(config_file, "r") as f: - config = json.load(f) - with open(statistics_file, "r") as f: - statistics = json.load(f) - if embodiment_id_file.exists(): - with open(embodiment_id_file, "r") as f: - embodiment_id_mapping = json.load(f) - else: - embodiment_id_mapping = None - processor_kwargs = config["processor_kwargs"] - processor_kwargs["statistics"] = statistics - processor_kwargs["embodiment_id_mapping"] = embodiment_id_mapping - # Directly override other processor kwargs - if kwargs: - # Override modality configs while keeping pretrained embodiment configs - modality_configs = kwargs.pop("modality_configs", {}) - for embodiment_tag, modality_config in modality_configs.items(): - processor_kwargs["modality_configs"][embodiment_tag] = modality_config - override_keys = [ - "random_rotation_angle", - "color_jitter_params", - "use_relative_action", - ] - for key in override_keys: - if key in kwargs: - override = kwargs.pop(key) - if override is not None: - processor_kwargs[key] = override - return cls(**processor_kwargs, transformers_loading_kwargs=transformers_loading_kwargs) - - -AutoProcessor.register("Gr00tN1d6", Gr00tN1d6Processor) diff --git a/gr00t/model/gr00t_n1d7/__init__.py b/gr00t/model/gr00t_n1d7/__init__.py new file mode 100644 index 000000000..467079831 --- /dev/null +++ b/gr00t/model/gr00t_n1d7/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/gr00t/model/gr00t_n1d6/gr00t_n1d6.py b/gr00t/model/gr00t_n1d7/gr00t_n1d7.py old mode 100755 new mode 100644 similarity index 69% rename from gr00t/model/gr00t_n1d6/gr00t_n1d6.py rename to gr00t/model/gr00t_n1d7/gr00t_n1d7.py index db5c5afdb..346b597a4 --- a/gr00t/model/gr00t_n1d6/gr00t_n1d6.py +++ b/gr00t/model/gr00t_n1d7/gr00t_n1d7.py @@ -1,12 +1,21 @@ -from typing import Tuple +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 logging +from typing import Any, Tuple -from gr00t.configs.model.gr00t_n1d6 import Gr00tN1d6Config -from gr00t.model.modules.dit import AlternateVLDiT, DiT -from gr00t.model.modules.eagle_backbone import EagleBackbone -from gr00t.model.modules.embodiment_conditioned_mlp import ( - CategorySpecificMLP, - MultiEmbodimentActionEncoder, -) import torch from torch import nn from torch.distributions import Beta @@ -15,38 +24,48 @@ from transformers.feature_extraction_utils import BatchFeature import tree +from gr00t.configs.model.gr00t_n1d7 import Gr00tN1d7Config +from gr00t.model.modules.dit import AlternateVLDiT, DiT, SelfAttentionTransformer +from gr00t.model.modules.embodiment_conditioned_mlp import ( + CategorySpecificMLP, + MultiEmbodimentActionEncoder, +) -class Gr00tN1d6ActionHead(nn.Module): + +logger = logging.getLogger(__name__) + + +class Gr00tN1d7ActionHead(nn.Module): """Action head component for flow matching diffusion policy.""" supports_gradient_checkpointing = True - def __init__(self, config: Gr00tN1d6Config): + def __init__(self, config: Gr00tN1d7Config): super().__init__() self.config = config self.hidden_size = config.hidden_size self.input_embedding_dim = config.input_embedding_dim - # Initialize components directly from config if config.use_alternate_vl_dit: self.model = AlternateVLDiT( **config.diffusion_model_cfg, cross_attention_dim=config.backbone_embedding_dim, attend_text_every_n_blocks=config.attend_text_every_n_blocks, ) - print("Using AlternateVLDiT for diffusion model") + logger.info("Using AlternateVLDiT for diffusion model") else: self.model = DiT( - **config.diffusion_model_cfg, cross_attention_dim=config.backbone_embedding_dim + **config.diffusion_model_cfg, + cross_attention_dim=config.backbone_embedding_dim, ) - print("Using DiT for diffusion model") + logger.info("Using DiT for diffusion model") self.action_dim = config.max_action_dim self.action_horizon = config.action_horizon self.num_inference_timesteps = config.num_inference_timesteps self.state_encoder = CategorySpecificMLP( num_categories=config.max_num_embodiments, - input_dim=config.max_state_dim, + input_dim=config.max_state_dim * config.state_history_length, hidden_dim=self.hidden_size, output_dim=self.input_embedding_dim, ) @@ -66,22 +85,34 @@ def __init__(self, config: Gr00tN1d6Config): nn.LayerNorm(config.backbone_embedding_dim) if config.use_vlln else nn.Identity() ) + vl_self_attention_cfg = getattr(config, "vl_self_attention_cfg", None) + if vl_self_attention_cfg and vl_self_attention_cfg.get("num_layers", 0) > 0: + self.vl_self_attention = SelfAttentionTransformer(**vl_self_attention_cfg) + else: + self.vl_self_attention = nn.Identity() + if config.add_pos_embed: self.position_embedding = nn.Embedding(config.max_seq_len, self.input_embedding_dim) nn.init.normal_(self.position_embedding.weight, mean=0.0, std=0.02) # State dropout parameters self.state_dropout_prob = config.state_dropout_prob - self.mask_token = ( - nn.Parameter(0.02 * torch.randn(1, 1, self.input_embedding_dim)) - if self.state_dropout_prob > 0 - else None - ) - - # State noise parameters - self.state_additive_noise_scale = config.state_additive_noise_scale - self.beta_dist = Beta(config.noise_beta_alpha, config.noise_beta_beta) + # Pin the time-sampling Beta to CPU/fp32 explicitly. The action head can + # be instantiated under a meta / no_init_weights default-device context + # (e.g. nested from_pretrained). A Beta built from bare Python floats + # would then place its concentration tensors on the meta device (or in + # the active default dtype, e.g. bf16). With validate_args enabled that + # already fails here in __init__ (Beta's internal .item() check cannot + # run on meta); even with validation off, sample_time would later raise + # or return garbage. Explicit device/dtype here makes the sampler depend + # only on the config, not on the construction-time device/dtype context, + # so the noise schedule is identical across SDPA/FA2/FA4 and meta vs. + # real-device loads. config is the canonical source for these values. + self.beta_dist = Beta( + torch.tensor(float(config.noise_beta_alpha), dtype=torch.float32, device="cpu"), + torch.tensor(float(config.noise_beta_beta), dtype=torch.float32, device="cpu"), + ) self.num_timestep_buckets = config.num_timestep_buckets self.set_trainable_parameters( config.tune_projector, config.tune_diffusion_model, config.tune_vlln @@ -101,22 +132,21 @@ def set_trainable_parameters( self.action_decoder.requires_grad_(False) if self.config.add_pos_embed: self.position_embedding.requires_grad_(False) - if self.state_dropout_prob > 0: - self.mask_token.requires_grad_(False) if not tune_diffusion_model: self.model.requires_grad_(False) if not tune_vlln: self.vlln.requires_grad_(False) - print(f"Tune action head projector: {self.tune_projector}") - print(f"Tune action head diffusion model: {self.tune_diffusion_model}") - print(f"Tune action head vlln: {self.tune_vlln}") - # Check if any parameters are still trainable. If not, print a warning. + self.vl_self_attention.requires_grad_(False) + logger.debug(f"Tune action head projector: {self.tune_projector}") + logger.debug(f"Tune action head diffusion model: {self.tune_diffusion_model}") + logger.debug(f"Tune action head vlln: {self.tune_vlln}") + # Check if any parameters are still trainable. If not, log a warning. if not tune_projector and not tune_diffusion_model and not tune_vlln: for name, p in self.named_parameters(): if p.requires_grad: - print(f"Action head trainable parameter: {name}") + logger.debug(f"Action head trainable parameter: {name}") if not any(p.requires_grad for p in self.parameters()): - print("Warning: No action head trainable parameters found.") + logger.warning("No action head trainable parameters found.") def set_frozen_modules_to_eval_mode(self): """ @@ -133,6 +163,9 @@ def set_frozen_modules_to_eval_mode(self): self.position_embedding.eval() if not self.tune_diffusion_model: self.model.eval() + if not self.tune_vlln: + self.vlln.eval() + self.vl_self_attention.eval() def sample_time(self, batch_size, device, dtype): sample = self.beta_dist.sample([batch_size]).to(device, dtype=dtype) @@ -142,6 +175,7 @@ def sample_time(self, batch_size, device, dtype): def process_backbone_output(self, backbone_output: BatchFeature) -> BatchFeature: backbone_features = backbone_output["backbone_features"] backbone_features = self.vlln(backbone_features) + backbone_features = self.vl_self_attention(backbone_features) backbone_output["backbone_features"] = backbone_features return backbone_output @@ -175,25 +209,21 @@ def forward(self, backbone_output: BatchFeature, action_input: BatchFeature) -> # Get embodiment ID. embodiment_id = action_input.embodiment_id + # Handle state history + assert action_input.state.shape[1] == self.config.state_history_length + action_input.state = action_input.state.view(action_input.state.shape[0], 1, -1) + # Embed state. state_features = self.state_encoder(action_input.state, embodiment_id) - # Dropout state features. - if self.state_dropout_prob > 0: + # Dropout state features (training only): zero out dropped states. + if self.training and self.state_dropout_prob > 0: do_dropout = ( torch.rand(state_features.shape[0], device=state_features.device) < self.state_dropout_prob ) do_dropout = do_dropout[:, None, None].to(dtype=state_features.dtype) - state_features = state_features * (1 - do_dropout) + self.mask_token * do_dropout - - # Add Gaussian noise to state features. - if self.training and self.state_additive_noise_scale > 0: - print( - f"Adding Gaussian noise to state features with scale {self.state_additive_noise_scale}" - ) - noise = torch.randn_like(state_features) * self.state_additive_noise_scale - state_features = state_features + noise + state_features = state_features * (1 - do_dropout) # Embed noised action trajectory. actions = action_input.action @@ -266,13 +296,13 @@ def _encode_features( - backbone_features: [B, seq_len, backbone_embedding_dim] - backbone_attention_mask: [B, seq_len] action_input: Input containing: - - state: [B, state_dim] + - state: [B, state_history_length, max_state_dim] - embodiment_id: [B] (embodiment IDs) Returns: BatchFeature containing: - backbone_features: [B, seq_len, backbone_embedding_dim] - - state_features: [B, state_horizon, input_embedding_dim] + - state_features: [B, 1, input_embedding_dim] """ backbone_output = self.process_backbone_output(backbone_output) @@ -280,8 +310,15 @@ def _encode_features( vl_embeds = backbone_output.backbone_features embodiment_id = action_input.embodiment_id + # Handle state history: if we have fewer timesteps than expected, repeat to fill + state = action_input.state + current_T = state.shape[1] + assert current_T == self.config.state_history_length, "current_T != state_history_length" + # Reshape state from [B, state_history_length, max_state_dim] to [B, 1, state_history_length * max_state_dim] + state = state.view(state.shape[0], 1, -1) + # Embed state. - state_features = self.state_encoder(action_input.state, embodiment_id) + state_features = self.state_encoder(state, embodiment_id) return BatchFeature(data={"backbone_features": vl_embeds, "state_features": state_features}) @@ -292,6 +329,8 @@ def get_action_with_features( state_features: torch.Tensor, embodiment_id: torch.Tensor, backbone_output: BatchFeature, + action_input: BatchFeature, + options: dict[str, Any] | None = None, ) -> BatchFeature: """ Generate actions using the flow matching diffusion process. @@ -314,6 +353,45 @@ def get_action_with_features( ) dt = 1.0 / self.num_inference_timesteps + vel_strength = torch.ones_like(actions) + + if "action" in action_input: + # If action in input when doing get action, it means we want to use RTC. + # action_horizon is the action horizon of the input action. + # rtc_overlap_steps is the number of steps to overlap with the previous action chunks. + # rtc_frozen_steps is the number of steps to freeze the action, which is the latency of the policy inference. + # rtc_ramp_rate is the rate of the ramp of denoising the actions. + assert options is not None, "options is not None" + assert "action_horizon" in options, "action_horizon is not in options" + assert "rtc_overlap_steps" in options, "rtc_overlap_steps is not in options" + assert "rtc_frozen_steps" in options, "rtc_frozen_steps is not in options" + assert "rtc_ramp_rate" in options, "rtc_ramp_rate is not in options" + + action_horizon_before_padding = options["action_horizon"] + + # Use previous action instead of pure noise to do inpainting + actions[:, : options["rtc_overlap_steps"], :] = action_input["action"][ + :, + action_horizon_before_padding + - options["rtc_overlap_steps"] : action_horizon_before_padding, + :, + ] + vel_strength[:, : options["rtc_frozen_steps"], :] = 0.0 + # NOTE: use an exponential ramp strength to set the remaining unfrozen rtc_steps + intermediate_steps = options["rtc_overlap_steps"] - options["rtc_frozen_steps"] + # Create exponential ramp from 0 to 1 over intermediate steps + t = torch.linspace(0.0, 1.0, intermediate_steps + 2, device=device) + ramp = 1 - torch.exp(-options["rtc_ramp_rate"] * t) + ramp = ramp / ramp[-1].clamp_min(1e-8) # normalize to [0,1] + ramp = ramp[ + 1:-1 + ] # we will only take the middle part of the ramp, ignore the 0.0 and 1.0 + # Apply ramp to the intermediate steps [batch, intermediate_steps, action_dim] + vel_strength[ + :, + options["rtc_frozen_steps"] : options["rtc_overlap_steps"], + :, + ] = ramp[None, :, None].to(device) # Run denoising steps. for t in range(self.num_inference_timesteps): @@ -354,7 +432,8 @@ def get_action_with_features( pred_velocity = pred[:, -self.action_horizon :] # Update actions using euler integration. - actions = actions + dt * pred_velocity + actions = actions + dt * pred_velocity * vel_strength + return BatchFeature( data={ "action_pred": actions, @@ -364,7 +443,12 @@ def get_action_with_features( ) @torch.no_grad() - def get_action(self, backbone_output: BatchFeature, action_input: BatchFeature) -> BatchFeature: + def get_action( + self, + backbone_output: BatchFeature, + action_input: BatchFeature, + options: dict[str, Any] | None = None, + ) -> BatchFeature: """ Generate actions using the flow matching diffusion process. @@ -386,6 +470,8 @@ def get_action(self, backbone_output: BatchFeature, action_input: BatchFeature) state_features=features.state_features, embodiment_id=action_input.embodiment_id, backbone_output=backbone_output, + action_input=action_input, + options=options, ) @property @@ -401,26 +487,29 @@ def prepare_input(self, batch: dict) -> BatchFeature: return BatchFeature(data=batch) -def get_backbone_cls(config: Gr00tN1d6Config): - if "NVEagle" in config.model_name or "nvidia/Eagle" in config.model_name: - return EagleBackbone +def get_backbone_cls(config: Gr00tN1d7Config): + if "nvidia/Cosmos-Reason2" in config.model_name or "Qwen/Qwen3-VL" in config.model_name: + # We import here as Qwen3Backbone depends on newer transformers versions than the rest of the code. + from gr00t.model.modules.qwen3_backbone import Qwen3Backbone + + return Qwen3Backbone else: raise ValueError(f"Unsupported model name: {config.model_name}") -class Gr00tN1d6(PreTrainedModel): - """Gr00tN1d6: Vision-Language-Action model with backbone.""" +class Gr00tN1d7(PreTrainedModel): + """Gr00tN1d7: VLA model with Cosmos-Reason2-2B (Qwen3-VL) backbone.""" - config_class = Gr00tN1d6Config + config_class = Gr00tN1d7Config supports_gradient_checkpointing = True def __init__( self, - config: Gr00tN1d6Config, + config: Gr00tN1d7Config, transformers_loading_kwargs: dict = {"trust_remote_code": True}, ): """ - Initialize Gr00tN1d6 model. + Initialize Gr00tN1d7 model. Args: config: Model configuration @@ -452,10 +541,10 @@ def __init__( ) # Initialize action head - self.action_head = Gr00tN1d6ActionHead(config) - from .processing_gr00t_n1d6 import Gr00tN1d6DataCollator + self.action_head = Gr00tN1d7ActionHead(config) + from .processing_gr00t_n1d7 import Gr00tN1d7DataCollator - self.collator = Gr00tN1d6DataCollator( + self.collator = Gr00tN1d7DataCollator( model_name=config.model_name, model_type=config.backbone_model_type, transformers_loading_kwargs=transformers_loading_kwargs, @@ -499,7 +588,6 @@ def forward(self, inputs: dict) -> BatchFeature: Args: inputs: Dictionary containing: - - Eagle inputs (prefixed with 'eagle_') - Action inputs (state, action, embodiment_id, etc.) Returns: @@ -512,7 +600,7 @@ def forward(self, inputs: dict) -> BatchFeature: return action_outputs - def get_action(self, inputs: dict) -> BatchFeature: + def get_action(self, inputs: dict, options: dict[str, Any] | None = None) -> BatchFeature: """ Generate actions using the complete model. """ @@ -521,7 +609,7 @@ def get_action(self, inputs: dict) -> BatchFeature: # Forward through backbone backbone_outputs = self.backbone(backbone_inputs) - action_outputs = self.action_head.get_action(backbone_outputs, action_inputs) + action_outputs = self.action_head.get_action(backbone_outputs, action_inputs, options) return action_outputs @@ -535,5 +623,5 @@ def dtype(self): # Register the model with HuggingFace -AutoConfig.register("Gr00tN1d6", Gr00tN1d6Config) -AutoModel.register(Gr00tN1d6Config, Gr00tN1d6) +AutoConfig.register("Gr00tN1d7", Gr00tN1d7Config) +AutoModel.register(Gr00tN1d7Config, Gr00tN1d7) diff --git a/gr00t/model/gr00t_n1d6/image_augmentations.py b/gr00t/model/gr00t_n1d7/image_augmentations.py similarity index 51% rename from gr00t/model/gr00t_n1d6/image_augmentations.py rename to gr00t/model/gr00t_n1d7/image_augmentations.py index 5feef98e1..73ff6e4fc 100755 --- a/gr00t/model/gr00t_n1d6/image_augmentations.py +++ b/gr00t/model/gr00t_n1d7/image_augmentations.py @@ -1,3 +1,19 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from typing import Sequence import warnings import albumentations as A @@ -7,13 +23,15 @@ import torchvision.transforms.v2 as transforms -def apply_with_replay(transform, images, replay=None): +def apply_with_replay(transform, images, masks=None, replay=None): """ Apply albumentations transforms to multiple images with replay functionality. + When masks are provided, mask-based transforms run per-frame before the main transform. Args: transform: Albumentations ReplayCompose or Compose transform images: List of PIL Images to transform + masks: Optional list of masks aligned with images (H, W) replay: Optional replay data for consistent transforms. If None, creates new replay. Returns: @@ -27,25 +45,43 @@ def apply_with_replay(transform, images, replay=None): # Check if transform supports replay (ReplayCompose) has_replay = hasattr(transform, "replay") - for img in images: + # Get mask-based transforms (applied per-frame, not replayed) + mask_transforms = getattr(transform, "mask_transforms", None) + + if masks is not None and len(masks) != len(images): + raise ValueError( + f"Number of masks ({len(masks)}) must match number of images ({len(images)})" + ) + + for idx, img in enumerate(images): + img_array = np.array(img) + mask_array = None if masks is None else np.array(masks[idx]) + if mask_array is not None and mask_array.dtype == np.bool_: + mask_array = mask_array.astype(np.uint8) + + # Apply mask-based transforms FIRST (per-frame, using current frame's mask) + if mask_transforms and mask_array is not None: + for mask_tf in mask_transforms: + result = mask_tf(image=img_array, mask=mask_array) + img_array = result["image"] + if has_replay: if current_replay is None: # First image - create replay data - augmented_image = transform(image=np.array(img)) + augmented_image = transform(image=img_array) current_replay = augmented_image["replay"] else: # Subsequent images - use replay for consistent transforms with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=UserWarning) augmented_image = transform.replay( - image=np.array(img), saved_augmentations=current_replay + image=img_array, saved_augmentations=current_replay ) - img_array = augmented_image["image"] else: # Regular Compose transform - no replay functionality - augmented_image = transform(image=np.array(img)) - img_array = augmented_image["image"] + augmented_image = transform(image=img_array) + img_array = augmented_image["image"] # Convert to uint8 if needed (albumentations may return float32 in [0,1]) if img_array.dtype == np.float32: img_array = (img_array * 255).astype(np.uint8) @@ -59,6 +95,96 @@ def apply_with_replay(transform, images, replay=None): return transformed_tensors, current_replay +class MaskedColorTransform(A.ImageOnlyTransform): + """Apply random tint to specific mask regions. + + Args: + target_mask_values: List of mask values to apply the transform to + alpha_range: (min, max) for random_tint overlay intensity + p: Probability of applying the transform + """ + + def __init__( + self, + target_mask_values: Sequence[int], + alpha_range: tuple[float, float] = (0.3, 1.0), + p: float = 0.5, + always_apply: bool | None = None, + ): + super().__init__(p=p, always_apply=always_apply) + self.target_mask_values = list(target_mask_values) + self.alpha_range = alpha_range + + def apply(self, img: np.ndarray, mask: np.ndarray = None, **params) -> np.ndarray: + if mask is None: + return img + + region_mask = np.zeros(mask.shape[:2], dtype=bool) + for val in self.target_mask_values: + region_mask |= mask == val + + if not region_mask.any(): + return img + + # Random color + random_color = np.random.randint(0, 256, size=3).astype(np.float32) + result = img.copy().astype(np.float32) + + # Random tint: semi-transparent overlay + alpha = np.random.uniform(self.alpha_range[0], self.alpha_range[1]) + for c in range(3): + result[region_mask, c] = result[region_mask, c] * (1 - alpha) + random_color[c] * alpha + + return np.clip(result, 0, 255).astype(np.uint8) + + def get_params_dependent_on_data(self, params, data) -> dict: + return {"mask": data.get("mask")} + + def get_transform_init_args_names(self) -> tuple[str, ...]: + return ("target_mask_values", "alpha_range") + + +class BackgroundNoiseTransform(A.ImageOnlyTransform): + """Replace specified mask regions with random noise. + + This transform replaces pixels where mask value matches target_mask_values with random RGB noise, + useful for domain randomization in sim-to-real transfer. + + Args: + p: Probability of applying the transform + target_mask_values: Mask values to replace with noise (default: [0]) + """ + + def __init__( + self, + p: float = 1.0, + target_mask_values: Sequence[int] | None = None, + always_apply: bool | None = None, + ): + super().__init__(p=p, always_apply=always_apply) + self.target_mask_values = [0] if target_mask_values is None else list(target_mask_values) + + def apply(self, img: np.ndarray, mask: np.ndarray = None, **params) -> np.ndarray: + if mask is None: + return img + + result = img.copy() + mask_2d = mask[..., 0] if mask.ndim == 3 else mask + background = np.isin(mask_2d, self.target_mask_values) + + if background.any(): + noise = np.random.randint(0, 256, size=result.shape, dtype=np.uint8) + result[background] = noise[background] + + return result + + def get_params_dependent_on_data(self, params, data) -> dict: + return {"mask": data.get("mask")} + + def get_transform_init_args_names(self) -> tuple[str, ...]: + return ("target_mask_values",) + + class FractionalRandomCrop(A.DualTransform): """Crop a random part of the input based on fractions while maintaining aspect ratio. @@ -75,7 +201,10 @@ class FractionalRandomCrop(A.DualTransform): """ def __init__( - self, crop_fraction: float = 0.9, p: float = 1.0, always_apply: bool | None = None + self, + crop_fraction: float = 0.9, + p: float = 1.0, + always_apply: bool | None = None, ): super().__init__(p=p, always_apply=always_apply) if not 0.0 < crop_fraction <= 1.0: @@ -141,7 +270,10 @@ class FractionalCenterCrop(A.DualTransform): """ def __init__( - self, crop_fraction: float = 0.9, p: float = 1.0, always_apply: bool | None = None + self, + crop_fraction: float = 0.9, + p: float = 1.0, + always_apply: bool | None = None, ): super().__init__(p=p, always_apply=always_apply) if not 0.0 < crop_fraction <= 1.0: @@ -189,6 +321,44 @@ def get_transform_init_args_names(self) -> tuple[str, ...]: return ("crop_fraction",) +class LetterBoxPad(A.DualTransform): + """Pad non-square images to square by adding black bars (letterboxing). + + This is the albumentations equivalent of LetterBoxTransform (torchvision). + Ensures all images have the same spatial dimensions after padding, + regardless of their original aspect ratio. + + Targets: + image + + Image types: + uint8, float32 + """ + + def __init__(self, p: float = 1.0, always_apply: bool | None = None): + super().__init__(p=p, always_apply=always_apply) + + def apply(self, img: np.ndarray, **params) -> np.ndarray: + # Padding is derived from the input image itself rather than from saved params so the + # transform stays correct under A.ReplayCompose, where views may differ in size. + h, w = img.shape[:2] + if h == w: + return img + max_dim = max(h, w) + pad_h = max_dim - h + pad_w = max_dim - w + pad_top = pad_h // 2 + pad_bottom = pad_h - pad_top + pad_left = pad_w // 2 + pad_right = pad_w - pad_left + return cv2.copyMakeBorder( + img, pad_top, pad_bottom, pad_left, pad_right, cv2.BORDER_CONSTANT, value=0 + ) + + def get_transform_init_args_names(self) -> tuple[str, ...]: + return () + + def build_image_transformations_albumentations( image_target_size, image_crop_size, @@ -196,37 +366,64 @@ def build_image_transformations_albumentations( color_jitter_params, shortest_image_edge, crop_fraction, + extra_augmentation_config: dict | None = None, + letter_box_transform: bool = False, ): """ - Build albumentations-based image transformations equivalent to the torchvision version. + Build albumentations-based image transformations for the N1.7 fine-tuning recipe. Args: - image_target_size: Target size for resizing (list of [height, width]) - image_crop_size: Size for cropping (list of [height, width]) + image_target_size: Target size fallback when shortest_image_edge is unset + (list of [height, width]) + image_crop_size: Crop size fallback when crop_fraction is unset (list of [height, width]) random_rotation_angle: Maximum rotation angle in degrees (0 for no rotation) color_jitter_params: Dictionary with color jitter parameters (brightness, contrast, saturation, hue) + shortest_image_edge: Shortest edge size for resizing + crop_fraction: Fraction of image to crop + letter_box_transform: When True, prepend a LetterBoxPad so mixed-aspect views are padded + to square before resizing, keeping per-sample views torch.stack-able (cf. #541). + extra_augmentation_config: Optional dict for additional augmentations. Supported keys: + - "background_noise_transforms": list of dicts, each with: + - "target_mask_values": list of int (e.g., [0]) + - "p": float (probability of applying transform) + - "masked_region_transforms": list of dicts, each with: + - "target_mask_values": list of int (e.g., [4] or [5]) + - "p": float (probability of applying transform) + - "alpha_range": [min, max] for random_tint mode intensity Returns: tuple: (train_transform, eval_transform) - raw albumentations transforms """ if crop_fraction is None: + if image_crop_size is None or image_target_size is None: + raise ValueError( + "image_crop_size and image_target_size are required when crop_fraction is None" + ) fraction_to_use = image_crop_size[0] / image_target_size[0] else: fraction_to_use = crop_fraction if shortest_image_edge is None: + if image_target_size is None: + raise ValueError("image_target_size is required when shortest_image_edge is None") max_size = image_target_size[0] else: max_size = shortest_image_edge - # Training transforms (using ReplayCompose for consistent augmentation across views) - # Use SmallestMaxSize to preserve aspect ratios, with INTER_AREA for antialiasing - train_transform_list = [ - A.SmallestMaxSize(max_size=max_size, interpolation=cv2.INTER_AREA), - FractionalRandomCrop(crop_fraction=fraction_to_use), - A.SmallestMaxSize(max_size=max_size, interpolation=cv2.INTER_AREA), - ] + extra_augmentation_config = extra_augmentation_config or {} + + # Training transforms (using ReplayCompose for consistent augmentation across views). + train_transform_list = [] + if letter_box_transform: + train_transform_list.append(LetterBoxPad()) + train_transform_list.extend( + [ + A.SmallestMaxSize(max_size=max_size, interpolation=cv2.INTER_AREA), + FractionalRandomCrop(crop_fraction=fraction_to_use), + A.SmallestMaxSize(max_size=max_size, interpolation=cv2.INTER_AREA), + ] + ) if random_rotation_angle is not None and random_rotation_angle != 0: train_transform_list.append(A.Rotate(limit=random_rotation_angle, p=1.0)) @@ -246,15 +443,51 @@ def build_image_transformations_albumentations( train_transform = A.ReplayCompose(train_transform_list, p=1.0) - # Evaluation transforms (deterministic) - # Use SmallestMaxSize to preserve aspect ratios, with INTER_AREA for antialiasing - eval_transform = A.Compose( + # === Mask-based augmentations (applied per-frame, NOT in ReplayCompose) === + # These transforms depend on per-frame mask data and must not be replayed + # to ensure each frame uses its own mask + mask_transforms = [] + + # Background noise on mask regions + for noise_cfg in extra_augmentation_config.get("background_noise_transforms", []): + target_mask_values = noise_cfg.get("target_mask_values", [0]) + p = noise_cfg.get("p", 1.0) + mask_transforms.append( + BackgroundNoiseTransform( + p=float(p), + target_mask_values=target_mask_values, + ) + ) + + # Masked region transforms + for transform_cfg in extra_augmentation_config.get("masked_region_transforms", []): + target_mask_values = transform_cfg.get("target_mask_values", []) + p = transform_cfg.get("p", 0.5) + alpha_range = tuple(transform_cfg.get("alpha_range", [0.3, 1.0])) + + mask_transforms.append( + MaskedColorTransform( + target_mask_values=target_mask_values, + alpha_range=alpha_range, + p=p, + ) + ) + + # Attach mask transforms to the main transform for use in apply_with_replay + train_transform.mask_transforms = mask_transforms if mask_transforms else None + + # Evaluation transforms (deterministic, no extra augmentations). + eval_transform_list = [] + if letter_box_transform: + eval_transform_list.append(LetterBoxPad()) + eval_transform_list.extend( [ A.SmallestMaxSize(max_size=max_size, interpolation=cv2.INTER_AREA), FractionalCenterCrop(crop_fraction=fraction_to_use), A.SmallestMaxSize(max_size=max_size, interpolation=cv2.INTER_AREA), ] ) + eval_transform = A.Compose(eval_transform_list) return train_transform, eval_transform @@ -319,7 +552,11 @@ def __call__(self, img: torch.Tensor) -> torch.Tensor: def build_image_transformations( - image_target_size, image_crop_size, random_rotation_angle, color_jitter_params + image_target_size, + image_crop_size, + random_rotation_angle, + color_jitter_params, + letter_box_transform: bool = False, ): """ Build torchvision-based image transformations. @@ -333,14 +570,16 @@ def build_image_transformations( Returns: tuple: (train_transform, eval_transform) - torchvision transforms """ - transform_list = [ - transforms.ToImage(), - LetterBoxTransform(), - # transforms.ToDtype(torch.get_default_dtype(), scale=True), - transforms.Resize(size=image_target_size), - transforms.RandomCrop(size=image_crop_size), - transforms.Resize(size=image_target_size), - ] + transform_list = [transforms.ToImage()] + if letter_box_transform: + transform_list.append(LetterBoxTransform()) + transform_list.extend( + [ + transforms.Resize(size=image_target_size), + transforms.RandomCrop(size=image_crop_size), + transforms.Resize(size=image_target_size), + ] + ) if random_rotation_angle is not None and random_rotation_angle != 0: transform_list.append( transforms.RandomRotation(degrees=[-random_rotation_angle, random_rotation_angle]) @@ -348,13 +587,15 @@ def build_image_transformations( if color_jitter_params is not None: transform_list.append(transforms.ColorJitter(**color_jitter_params)) train_image_transform = transforms.Compose(transform_list) - eval_image_transform = transforms.Compose( + eval_transform_list = [transforms.ToImage()] + if letter_box_transform: + eval_transform_list.append(LetterBoxTransform()) + eval_transform_list.extend( [ - # transforms.ToDtype(torch.get_default_dtype(), scale=True), - LetterBoxTransform(), transforms.Resize(size=image_target_size), transforms.CenterCrop(size=image_crop_size), transforms.Resize(size=image_target_size), ] ) + eval_image_transform = transforms.Compose(eval_transform_list) return train_image_transform, eval_image_transform diff --git a/gr00t/model/gr00t_n1d7/processing_gr00t_n1d7.py b/gr00t/model/gr00t_n1d7/processing_gr00t_n1d7.py new file mode 100644 index 000000000..ec0d59f77 --- /dev/null +++ b/gr00t/model/gr00t_n1d7/processing_gr00t_n1d7.py @@ -0,0 +1,889 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from copy import deepcopy +import json +import logging +import os +from pathlib import Path +import random +import re +from typing import Any, Dict +import warnings + +import albumentations as A +import numpy as np +from PIL import Image +import torch +import torchvision.transforms.v2 as transforms +from transformers import AutoProcessor +from transformers.feature_extraction_utils import BatchFeature +from transformers.utils import cached_file + +from gr00t.configs.data.embodiment_configs import ModalityConfig +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.interfaces import BaseProcessor +from gr00t.data.state_action.state_action_processor import StateActionProcessor +from gr00t.data.utils import parse_modality_configs, to_json_serializable + +from .image_augmentations import ( + apply_with_replay, + build_image_transformations, + build_image_transformations_albumentations, +) + + +try: + from transformers import Qwen3VLProcessor +except ImportError: + Qwen3VLProcessor = None + +# Suppress protobuf deprecation warnings +warnings.filterwarnings("ignore", category=DeprecationWarning, module="google.protobuf") + +logger = logging.getLogger(__name__) + +### Projector-index assignments, declared as ``{projector_index: {tags}}``. +# +# This grouped form is the source of truth: a tag only shares a projector with +# another tag if it is deliberately placed inside that index's set, so an +# accidental collision can't slip in unnoticed. Multiple tags share an index +# only when they describe the *same physical embodiment*. To add a brand-new +# embodiment, give it an unused index; to add a data-source/subtask variant of +# an existing one, add its tag to that group. +# +# ``EMBODIMENT_TAG_TO_PROJECTOR_INDEX`` below is derived from this and is the +# public, tag-keyed lookup used everywhere else. +_PROJECTOR_INDEX_GROUPS: dict[int, set[str]] = { + 0: {"simpler_env_google"}, + 1: {"simpler_env_widowx"}, + 2: {"libero_sim"}, + # Finetune placeholder projector; sim-eval robocasa tags piggyback on + # `new_embodiment`. + 10: {"new_embodiment", "robocasa_panda_omron", "robocasa_gr1_tabletop"}, + 11: {"unitree_g1_sonic"}, + 24: {"oxe_droid_relative_eef_relative_joint"}, + # Same G1 embodiment either side of the pretrain/posttrain boundary + # (`real_g1_*` is pretrain, `unitree_g1_full_body_*` is posttrain). + 25: { + "real_g1_relative_eef_relative_joints", + "unitree_g1_full_body_with_waist_height_nav_cmd", + }, + # One R1 Pro Sharpa robot, four data-source variants. + 26: { + "real_r1_pro_sharpa_relative_eef", + "real_r1_pro_sharpa_relative_eef_human", + "real_r1_pro_sharpa_relative_eef_maxinsights", + "real_r1_pro_sharpa_relative_eef_mecka", + }, + # xdof base + subtask refinement. + 27: { + "xdof_relative_eef_relative_joint", + "xdof_relative_eef_relative_joint_subtask", + }, +} + + +def _build_tag_to_projector_index(groups: dict[int, set[str]]) -> dict[str, int]: + """Flatten ``{index: {tags}}`` into ``{tag: index}``. + + Guards against a tag accidentally appearing in two groups, which would + otherwise be silently resolved by insertion order into a single mapping. + """ + mapping: dict[str, int] = {} + for index, tags in groups.items(): + for tag in tags: + if tag in mapping: + raise ValueError( + f"Embodiment tag {tag!r} is assigned to multiple projector " + f"indices ({mapping[tag]} and {index}) in " + "_PROJECTOR_INDEX_GROUPS; each tag must map to exactly one index." + ) + mapping[tag] = index + return mapping + + +EMBODIMENT_TAG_TO_PROJECTOR_INDEX: dict[str, int] = _build_tag_to_projector_index( + _PROJECTOR_INDEX_GROUPS +) + + +def build_processor(model_name: str, transformers_loading_kwargs: dict) -> Qwen3VLProcessor: + if Qwen3VLProcessor is None: + raise ImportError( + "Qwen3VLProcessor is not available. " + "Please upgrade transformers: pip install transformers>=4.52.0" + ) + return Qwen3VLProcessor.from_pretrained(model_name, **transformers_loading_kwargs) + + +def validate_action_horizons(modality_configs, max_action_horizon: int) -> None: + """Fail at processor construction if any configured embodiment's action horizon + (the number of action ``delta_indices``) exceeds ``max_action_horizon``. + + ``max_action_horizon`` is set from the model's ``action_horizon``; without this + check a horizon/model mismatch (e.g. a 50-step embodiment on a 40-step model) + surfaces only deep in the first forward, after the model and dataset are built. + """ + offenders: dict[str, int] = {} + for tag, config in modality_configs.items(): + action = config.get("action") if isinstance(config, dict) else None + delta_indices = getattr(action, "delta_indices", None) + if delta_indices is None: + continue + horizon = len(delta_indices) + if horizon > max_action_horizon: + offenders[tag] = horizon + if offenders: + required = max(offenders.values()) + details = ", ".join(f"{tag}={horizon}" for tag, horizon in sorted(offenders.items())) + raise ValueError( + f"Embodiment action horizon exceeds max_action_horizon ({max_action_horizon}): " + f"{details}. Increase model config action_horizon to >= {required} (or reduce the " + "embodiment action delta_indices)." + ) + + +class Gr00tN1d7DataCollator: + def __init__( + self, + model_name: str, + model_type: str = "qwen", + transformers_loading_kwargs: dict = {}, + ): + ### We need to use the same processor for padding input ids and concat + self.processor = build_processor(model_name, transformers_loading_kwargs) + # Set padding side to 'left' for Flash Attention compatibility + self.processor.tokenizer.padding_side = "left" + self.model_type = model_type + self.model_name = model_name + + def __call__(self, features: list[Dict[str, Any]]) -> BatchFeature: + batch = {} + keys = list(set().union(*(elem.keys() for elem in features))) + + for key in keys: + values = [elem[key] for elem in features if key in elem] + if key == "vlm_content": + # Handle vlm_content specially - extract text and images + text_list = [] + image_inputs = [] + for v in values: + curr_text_list = [v["text"]] + + text_list += curr_text_list + curr_image_inputs = v["images"] + image_inputs += curr_image_inputs + + vlm_inputs = self.processor( + text=text_list, + images=image_inputs, + return_tensors="pt", + padding=True, + ) + for k, v in vlm_inputs.items(): + batch[k] = v + elif key in ( + "pixel_values", + "image_grid_thw", + "attention_mask", + "input_ids", + ): + raise Exception("Not implemented") + else: + # state, state_mask, action and action_mask - stack to form batch dimension + batch[key] = torch.from_numpy(np.stack(values)) + return BatchFeature(data={"inputs": batch}) + + def __str__(self): + return f"Gr00tN1d7DataCollator(model_name={self.model_name}, model_type={self.model_type})" + + +class Gr00tN1d7Processor(BaseProcessor): + data_collator_class = Gr00tN1d7DataCollator + + def __init__( + self, + modality_configs: dict[str, dict[str, ModalityConfig]], + statistics: (dict[str, dict[str, dict[str, dict[str, list[float]]]]] | None) = None, + use_percentiles: bool = False, + clip_outliers: bool = True, + image_crop_size: list[int] = None, + image_target_size: list[int] = None, + shortest_image_edge: int = 256, + crop_fraction: float = 0.95, + random_rotation_angle: int | None = None, + color_jitter_params: dict[str, float] | None = None, + formalize_language: bool = True, + model_name: str = "nvidia/Cosmos-Reason2-2B", + model_type: str = "qwen", + max_state_dim: int = 29, + max_action_dim: int = 29, + max_action_horizon: int = 50, + apply_sincos_state_encoding: bool = False, + use_albumentations: bool = False, + extra_augmentation_config: dict | None = None, + use_relative_action: bool = False, + embodiment_id_mapping: dict[str, int] | None = None, + transformers_loading_kwargs: dict = {"trust_remote_code": True}, + # State augmentation + exclude_state: bool = False, + state_dropout_prob: float = 0.0, + # Normalization + use_mean_std: bool = False, + letter_box_transform: bool = False, + ): + self.modality_configs = parse_modality_configs(modality_configs) + + # Initialize StateActionProcessor for state/action normalization + self.state_action_processor = StateActionProcessor( + modality_configs=modality_configs, + statistics=statistics, + use_percentiles=use_percentiles, + clip_outliers=clip_outliers, + apply_sincos_state_encoding=apply_sincos_state_encoding, + use_relative_action=use_relative_action, + ) + + # Save state action processor settings + self.use_percentiles = use_percentiles + self.use_mean_std = use_mean_std + self.clip_outliers = clip_outliers + self.apply_sincos_state_encoding = apply_sincos_state_encoding + self.use_relative_action = use_relative_action + self.extra_augmentation_config = extra_augmentation_config + + # State augmentation settings + self.exclude_state = exclude_state + self.state_dropout_prob = state_dropout_prob + + self.letter_box_transform = letter_box_transform + + # Save VLM settings + self.formalize_language = formalize_language + self.model_name = model_name + self.model_type = model_type + + self.max_state_dim = max_state_dim + self.max_action_dim = max_action_dim + self.max_action_horizon = max_action_horizon + validate_action_horizons(self.modality_configs, self.max_action_horizon) + + # Save image processing settings + self.image_crop_size = image_crop_size + self.image_target_size = image_target_size + self.random_rotation_angle = random_rotation_angle + self.color_jitter_params = color_jitter_params + self.processor = build_processor(model_name, transformers_loading_kwargs) + # Set padding side to 'left' for Flash Attention compatibility + self.processor.tokenizer.padding_side = "left" + self.embodiment_id_mapping = embodiment_id_mapping or EMBODIMENT_TAG_TO_PROJECTOR_INDEX + # Merge any missing pre-trained embodiment tags into the custom mapping + for k, v in EMBODIMENT_TAG_TO_PROJECTOR_INDEX.items(): + if k not in self.embodiment_id_mapping: + self.embodiment_id_mapping[k] = v + self.shortest_image_edge = shortest_image_edge + self.crop_fraction = crop_fraction + + # Statistics cache (mirrors state_action_processor.statistics for serialization) + self.statistics: dict[str, dict[str, dict[str, dict[str, list[float]]]]] = {} + + # Choose between torchvision and albumentations transforms + self.use_albumentations = use_albumentations + if use_albumentations: + self.train_image_transform, self.eval_image_transform = ( + build_image_transformations_albumentations( + image_target_size, + image_crop_size, + random_rotation_angle, + color_jitter_params, + shortest_image_edge, + crop_fraction, + extra_augmentation_config=self.extra_augmentation_config, + letter_box_transform=self.letter_box_transform, + ) + ) + else: + self.train_image_transform, self.eval_image_transform = build_image_transformations( + image_target_size, + image_crop_size, + random_rotation_angle, + color_jitter_params, + letter_box_transform=self.letter_box_transform, + ) + self._collator = self.data_collator_class( + model_name=model_name, + model_type=model_type, + transformers_loading_kwargs=transformers_loading_kwargs, + ) + self.train() + + @property + def collator(self): + return self._collator + + def train(self): + super().train() + self.state_action_processor.train() + + def eval(self): + super().eval() + self.state_action_processor.eval() + + def set_statistics( + self, + statistics: dict[str, dict[str, dict[str, dict[str, list[float]]]]], + override: bool = False, + ) -> None: + """Set dataset statistics for normalization.""" + for key in statistics: + if key not in self.statistics or override: + if override: + logger.info("Overriding statistics for embodiment %r", key) + self.statistics[key] = deepcopy(statistics[key]) + else: + # Surfaced as a warning (not print) because callers running with + # override_pretraining_statistics=False on a mixture dataset will + # otherwise silently keep the pre-existing pretraining stats and + # discard newly-merged per-dataset stats — training proceeds with + # the wrong mean/std and only an easy-to-miss stdout line records + # the drop. + logger.warning( + "Statistics for embodiment %r already present; new stats " + "DISCARDED (override=False). If the new data differs from " + "the existing distribution this will cause silent " + "normalization mismatch — pass override=True (or " + "override_pretraining_statistics=True at the dataset level) " + "to use the merged stats instead.", + key, + ) + + self.state_action_processor.set_statistics(statistics, override=override) + + # Compute action dimensions for convenience + self.action_dim = {} + for embodiment_tag in self.state_action_processor.statistics: + self.action_dim[embodiment_tag] = self.state_action_processor.get_action_dim( + embodiment_tag + ) + + def decode_action( + self, + action: np.ndarray, + embodiment_tag: EmbodimentTag, + state: dict[str, np.ndarray] | None = None, + ): + """Undo action normalization and convert relative actions to absolute.""" + # Split concatenated action into joint groups + out_dict = {} + start_idx = 0 + joint_groups = self.modality_configs[embodiment_tag.value]["action"].modality_keys + action_horizon = len(self.modality_configs[embodiment_tag.value]["action"].delta_indices) + for key in joint_groups: + joint_dim = self.state_action_processor.norm_params[embodiment_tag.value]["action"][ + key + ]["dim"].item() + out_dict[key] = action[..., :action_horizon, start_idx : start_idx + joint_dim] + start_idx += joint_dim + + # Use StateActionProcessor to unnormalize and convert to absolute + return self.state_action_processor.unapply_action( + out_dict, embodiment_tag.value, state=state + ) + + def unapply( + self, + action: np.ndarray, + embodiment_tag: EmbodimentTag, + state: dict[str, np.ndarray] | None = None, + prev_action: dict[str, np.ndarray] | None = None, + ) -> dict[str, np.ndarray]: + """Undo action normalization and convert relative→absolute. + + Args: + action: Normalized action array of shape (..., action_horizon, action_dim) + embodiment_tag: Embodiment tag + state: State observations with "state." prefixed keys (for relative actions) + prev_action: Unused (kept for API compatibility) + + Returns: + Dict mapping "action." to unnormalized (absolute) action arrays. + """ + out_dict = {} + start_idx = 0 + joint_groups = self.modality_configs[embodiment_tag.value]["action"].modality_keys + action_horizon = len(self.modality_configs[embodiment_tag.value]["action"].delta_indices) + for key in joint_groups: + joint_dim = self.state_action_processor.norm_params[embodiment_tag.value]["action"][ + key + ]["dim"].item() + out_dict[key] = action[..., :action_horizon, start_idx : start_idx + joint_dim] + start_idx += joint_dim + + # Strip "state." prefix for StateActionProcessor + stripped_state = None + if state is not None: + stripped_state = {k.replace("state.", ""): v for k, v in state.items()} + + result = self.state_action_processor.unapply_action( + out_dict, embodiment_tag.value, state=stripped_state + ) + return {f"action.{key}": value for key, value in result.items()} + + def process_observation(self, observation: dict[str, Any], embodiment_tag: EmbodimentTag): + """Process batched observation tensors for inference. + + Args: + observation: Dict with keys like "video.", "state.", "" + Video values expected as numpy arrays of shape (B, T, H, W, C). + embodiment_tag: Embodiment tag identifying the robot configuration. + + Returns: + BatchFeature with tokenized VLM inputs, state, embodiment_id, and action_mask. + """ + modality_config = self.modality_configs[embodiment_tag.value] + transformed_observation = {} + + # Normalize states + state_keys = modality_config["state"].modality_keys + state_data = {key: observation[f"state.{key}"] for key in state_keys} + exclude_state = self.exclude_state or getattr( + modality_config["state"], "exclude_state", False + ) + if exclude_state: + normalized_states = torch.cat( + [torch.from_numpy(np.zeros_like(state_data[key])) for key in state_keys], dim=-1 + ) + else: + norm_state_dict = self.state_action_processor.apply_state( + state=state_data, embodiment_tag=embodiment_tag.value + ) + normalized_states = torch.cat( + [torch.from_numpy(norm_state_dict[key]) for key in state_keys], dim=-1 + ) + + assert normalized_states.shape[1] <= self.max_state_dim, ( + f"State dimension {normalized_states.shape[1]} exceeds max_state_dim {self.max_state_dim}" + ) + padding_shape = ( + *normalized_states.shape[:-1], + self.max_state_dim - normalized_states.shape[-1], + ) + normalized_states = torch.cat([normalized_states, torch.zeros(padding_shape)], dim=-1) + transformed_observation["state"] = normalized_states + + # Process images: observation values are (B, T, H, W, C) numpy arrays + image_keys = modality_config["video"].modality_keys + images_dict = {view: torch.from_numpy(observation[f"video.{view}"]) for view in image_keys} + images = torch.stack( + [images_dict[view] for view in image_keys], dim=2 + ) # (B, T, V, H, W, C) + assert images.ndim == 6 + B, T, V, img_H, img_W, img_C = images.shape + + if self.use_albumentations: + images_flat = images.reshape(B * T * V, img_H, img_W, img_C) + pil_images = [Image.fromarray(img.numpy()) for img in images_flat] + transformed_pil, _ = apply_with_replay(self.eval_image_transform, pil_images) + transformed_stacked = torch.stack(transformed_pil) # (B*T*V, C, H_new, W_new) + _, img_C_new, img_H_new, img_W_new = transformed_stacked.shape + transformed_images = transformed_stacked.reshape( + B, T * V, img_C_new, img_H_new, img_W_new + ).numpy() + else: + # Rearrange (B, T, V, H, W, C) → (B, T*V, C, H, W) for torchvision + images_perm = images.permute(0, 1, 2, 5, 3, 4).reshape(B, T * V, img_C, img_H, img_W) + transformed_images = self.eval_image_transform(images_perm).numpy() + + language_key = modality_config["language"].modality_keys[0] + language = [ + re.sub(r"[^\w\s]", "", lang.lower()) if self.formalize_language else lang + for lang in observation[language_key] + ] + + texts, all_images = [], [] + for i in range(B): + vlm_inputs = self._apply_vlm_processing(transformed_images[i], language[i]) + vc = vlm_inputs["vlm_content"] + texts.append(vc["text"]) + all_images.extend(vc["images"]) + tokenized = self.processor(text=texts, images=all_images, return_tensors="pt", padding=True) + for k, v in tokenized.items(): + transformed_observation[k] = v + + embodiment_id = ( + torch.ones(B, dtype=torch.int32) * self.embodiment_id_mapping[embodiment_tag.value] + ) + transformed_observation["embodiment_id"] = embodiment_id + + # Action mask: shape (B, max_action_horizon), 1 in the valid horizon window + action_config = modality_config["action"] + action_horizon = len(action_config.delta_indices) + assert action_horizon <= self.max_action_horizon, ( + f"Action horizon {action_horizon} (from delta_indices) exceeds" + f" max_action_horizon {self.max_action_horizon}. Increase model config" + f" action_horizon to >= {action_horizon}." + ) + action_mask = torch.zeros((B, self.max_action_horizon), dtype=torch.float32) + if action_horizon > 0: + action_mask[:, :action_horizon] = 1.0 + transformed_observation["action_mask"] = action_mask + + return BatchFeature(transformed_observation) + + def _apply_vlm_processing(self, images: np.ndarray, language: str) -> BatchFeature: + """ + Args: + batch: + video: [T, C, H, W] + Returns: vlm_content format for collation + """ + frames = [torch.as_tensor(v) for v in images] + + # Create conversation with images and text + conversation = [ + { + "role": "user", + "content": [ + *[{"type": "image", "image": img} for img in frames], + {"type": "text", "text": language}, + ], + } + ] + + # Apply chat template but don't process yet - let collator handle it + text = self.processor.apply_chat_template( + conversation, tokenize=False, add_generation_prompt=False + ) + + # Return vlm_content format for collation + return { + "vlm_content": { + "text": text, + "images": frames, + "conversation": conversation, + } + } + + def __call__( + self, + messages: list[dict[str, Any]], + ): + assert len(messages) == 1 + content = messages[0]["content"] + embodiment_tag = content.embodiment + action_data = content.actions + state_data = content.states + + # Use StateActionProcessor to handle relative conversion and normalization + norm_state_dict, normalized_actions = self.state_action_processor.apply( + state=state_data, + action=action_data, + embodiment_tag=embodiment_tag.value, + ) + + if normalized_actions: + # Concatenate actions + action_keys = self.modality_configs[embodiment_tag.value]["action"].modality_keys + normalized_actions = torch.cat( + [torch.from_numpy(normalized_actions[key]) for key in action_keys], + dim=-1, + ) # (t, d) + action_dim = normalized_actions.shape[1] + # Pad action to max_action_dim + normalized_actions = torch.cat( + [ + normalized_actions, + torch.zeros( + normalized_actions.shape[0], + self.max_action_dim - normalized_actions.shape[1], + ), + ], + dim=-1, + ) # (t, max_action_dim) + # Pad action to max_action_horizon + action_horizon = normalized_actions.shape[0] + assert action_horizon <= self.max_action_horizon, ( + f"Action sequence length {action_horizon} exceeds max_action_horizon" + f" {self.max_action_horizon}. Increase model config action_horizon to" + f" >= {action_horizon}." + ) + normalized_actions = torch.cat( + [ + normalized_actions, + torch.zeros( + self.max_action_horizon - normalized_actions.shape[0], + self.max_action_dim, + ), + ], + dim=0, + ) # (max_action_horizon, max_action_dim) + # Create action mask + action_mask = torch.ones_like(normalized_actions) + action_mask[action_horizon:] = 0 + action_mask[:, action_dim:] = 0 + else: + assert not self.training, "Action is required in training mode" + normalized_actions = None + action_mask = None + + # Concatenate states with optional dropout/noise augmentation + state_keys = self.modality_configs[embodiment_tag.value]["state"].modality_keys + exclude_state = self.exclude_state or getattr( + self.modality_configs[embodiment_tag.value]["state"], "exclude_state", False + ) + if exclude_state or ( + self.state_dropout_prob > 0 + and random.random() < self.state_dropout_prob + and self.training + ): + normalized_states = torch.cat( + [torch.from_numpy(np.zeros_like(state_data[key])) for key in state_keys], dim=-1 + ) + else: + normalized_states = torch.cat( + [torch.from_numpy(norm_state_dict[key]) for key in state_keys], dim=-1 + ) + normalized_states = torch.cat( + [ + normalized_states, + torch.zeros( + normalized_states.shape[0], + self.max_state_dim - normalized_states.shape[1], + ), + ], + dim=-1, + ) + + # Crop and resize images. + if self.training: + image_transform = self.train_image_transform + else: + image_transform = self.eval_image_transform + image_keys = self.modality_configs[embodiment_tag.value]["video"].modality_keys + + if self.formalize_language: + language = content.text.lower() + language = re.sub(r"[^\w\s]", "", language) + else: + language = content.text + + vlm_inputs = self._get_vlm_inputs( + image_keys=image_keys, + images=content.images, + masks=content.masks, + image_transform=image_transform, + language=language, + ) + + transformed_inputs = { + "state": normalized_states.to(torch.get_default_dtype()), + } + if normalized_actions is not None: + transformed_inputs["action"] = normalized_actions.to(torch.get_default_dtype()) + # Add VLM inputs + transformed_inputs.update(vlm_inputs) + if action_mask is not None: + transformed_inputs["action_mask"] = action_mask + transformed_inputs["embodiment_id"] = self.embodiment_id_mapping[embodiment_tag.value] + return transformed_inputs + + def _get_vlm_inputs( + self, + image_keys: list[str], + images: list[Image.Image], + masks: dict[str, list[np.ndarray]] | None, + image_transform: transforms.Compose | A.Compose, + language: str, + ): + temporal_stacked_images = {} + + if self.use_albumentations: + # Use albumentations transforms + replay = None + for view in image_keys: + assert view in images, f"{view} not in {images}" + if masks is not None: + assert view in masks, f"{view} not in masks" + view_masks = masks.get(view) if masks else None + view_images = images[view] + + # Apply transforms with replay for consistency + transformed_images, replay = apply_with_replay( + image_transform, view_images, view_masks, replay + ) + temporal_stacked_images[view] = torch.stack(transformed_images) # (T, C, H, W) + else: + if masks is not None: + raise ValueError( + "Mask transforms require albumentations. Set use_albumentations_transforms=True." + ) + # Use torchvision transforms + for view in image_keys: + assert view in images, f"{view} not in {images}" + temporal_stacked_images[view] = torch.stack( + [image_transform(img) for img in images[view]] + ) # (T, C, H, W) + + for k, v in temporal_stacked_images.items(): + assert isinstance(k, str), f"{k} is not a string" + assert isinstance(v, torch.Tensor), f"{v} is not a torch tensor" + assert v.ndim == 4, f"{v} is not a 4D tensor" + assert v.dtype == torch.uint8, f"{v} is not a uint8 tensor" + assert v.shape[1] == 3, f"{v} is not a 3 channel tensor" + + stacked_images = torch.stack( + [temporal_stacked_images[view] for view in image_keys], dim=1 + ).flatten(0, 1) # (T*V, C, H, W) + + vlm_inputs = self._apply_vlm_processing(stacked_images, language) + return vlm_inputs + + def save_pretrained(self, save_directory: str | Path) -> list[Path]: + save_directory = Path(save_directory) + save_directory.mkdir(parents=True, exist_ok=True) + main_config_file = save_directory / "processor_config.json" + statistics_file = save_directory / "statistics.json" + embodiment_id_file = save_directory / "embodiment_id.json" + + config = { + "processor_class": self.__class__.__name__, + "processor_kwargs": { + "modality_configs": to_json_serializable(self.modality_configs), + # Image processing settings + "image_crop_size": self.image_crop_size, + "image_target_size": self.image_target_size, + "use_albumentations": self.use_albumentations, + "random_rotation_angle": self.random_rotation_angle, + "color_jitter_params": self.color_jitter_params, + "shortest_image_edge": self.shortest_image_edge, + "crop_fraction": self.crop_fraction, + "letter_box_transform": self.letter_box_transform, + # VLM settings + "model_name": self.model_name, + "model_type": self.model_type, + "formalize_language": self.formalize_language, + # State action dimensions + "max_state_dim": self.max_state_dim, + "max_action_dim": self.max_action_dim, + "max_action_horizon": self.max_action_horizon, + # StateActionProcessor settings + "use_percentiles": self.use_percentiles, + "use_mean_std": self.use_mean_std, + "clip_outliers": self.clip_outliers, + "apply_sincos_state_encoding": self.apply_sincos_state_encoding, + "use_relative_action": self.use_relative_action, + # State augmentation + "exclude_state": self.exclude_state, + "state_dropout_prob": self.state_dropout_prob, + }, + } + with open(main_config_file, "w") as f: + json.dump(config, f, indent=2) + # Save statistics + with open(statistics_file, "w") as f: + json.dump( + to_json_serializable(self.state_action_processor.statistics), + f, + indent=2, + ) + # Save embodiment id mapping + with open(embodiment_id_file, "w") as f: + json.dump(self.embodiment_id_mapping, f, indent=2) + return [main_config_file, statistics_file, embodiment_id_file] + + @classmethod + def from_pretrained(cls, pretrained_model_name_or_path: str | Path, **kwargs): + transformers_loading_kwargs = kwargs.pop( + "transformers_loading_kwargs", {"trust_remote_code": True} + ) + hub_keys = ( + "_commit_hash", + "cache_dir", + "force_download", + "local_files_only", + "proxies", + "revision", + "subfolder", + "token", + ) + hub_kwargs = {key: kwargs.pop(key) for key in hub_keys if key in kwargs} + use_auth_token = kwargs.pop("use_auth_token", None) + if "token" not in hub_kwargs and use_auth_token is not None: + hub_kwargs["token"] = use_auth_token + pretrained_model_name_or_path = Path(pretrained_model_name_or_path) + config_file = pretrained_model_name_or_path / "processor_config.json" + statistics_file = pretrained_model_name_or_path / "statistics.json" + embodiment_id_file = pretrained_model_name_or_path / "embodiment_id.json" + is_local = os.path.isdir(pretrained_model_name_or_path) + if not is_local: + config_file = Path( + cached_file(pretrained_model_name_or_path, "processor_config.json", **hub_kwargs) + ) + statistics_file = Path( + cached_file(pretrained_model_name_or_path, "statistics.json", **hub_kwargs) + ) + embodiment_id_file = Path( + cached_file(pretrained_model_name_or_path, "embodiment_id.json", **hub_kwargs) + ) + + with open(config_file, "r") as f: + config = json.load(f) + with open(statistics_file, "r") as f: + statistics = json.load(f) + if embodiment_id_file.exists(): + with open(embodiment_id_file, "r") as f: + embodiment_id_mapping = json.load(f) + else: + embodiment_id_mapping = None + processor_kwargs = config["processor_kwargs"] + processor_kwargs["statistics"] = statistics + processor_kwargs["embodiment_id_mapping"] = embodiment_id_mapping + + # Backfill fields that older checkpoints may not have serialized. + # Without these, __init__ defaults silently apply — correct today but + # fragile if defaults ever change. + processor_kwargs.setdefault("model_name", "nvidia/Cosmos-Reason2-2B") + processor_kwargs.setdefault("model_type", "qwen") + processor_kwargs.setdefault("clip_outliers", True) + + # Directly override other processor kwargs + if kwargs: + # Override modality configs while keeping pretrained embodiment configs + modality_configs = kwargs.pop("modality_configs", {}) + for embodiment_tag, modality_config in modality_configs.items(): + processor_kwargs["modality_configs"][embodiment_tag] = modality_config + override_keys = [ + "random_rotation_angle", + "color_jitter_params", + "use_relative_action", + "exclude_state", + "state_dropout_prob", + "use_mean_std", + "model_name", + "model_type", + "max_action_horizon", + "max_state_dim", + "max_action_dim", + ] + for key in override_keys: + if key in kwargs: + override = kwargs.pop(key) + if override is not None: + processor_kwargs[key] = override + return cls(**processor_kwargs, transformers_loading_kwargs=transformers_loading_kwargs) + + +AutoProcessor.register("Gr00tN1d7", Gr00tN1d7Processor) diff --git a/gr00t/model/gr00t_n1d6/setup.py b/gr00t/model/gr00t_n1d7/setup.py old mode 100755 new mode 100644 similarity index 62% rename from gr00t/model/gr00t_n1d6/setup.py rename to gr00t/model/gr00t_n1d7/setup.py index 7ef61366f..742dcf7c3 --- a/gr00t/model/gr00t_n1d6/setup.py +++ b/gr00t/model/gr00t_n1d7/setup.py @@ -1,19 +1,34 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 json import logging from pathlib import Path +import numpy as np +import torch +from transformers import AutoModel, AutoProcessor + from gr00t.configs.base_config import Config -from gr00t.configs.model.gr00t_n1d6 import Gr00tN1d6Config +from gr00t.configs.model.gr00t_n1d7 import Gr00tN1d7Config from gr00t.data.dataset.factory import DatasetFactory -from gr00t.experiment.dist_utils import get_rank from gr00t.model.base.model_pipeline import ModelPipeline -from gr00t.model.gr00t_n1d6.gr00t_n1d6 import Gr00tN1d6 -from gr00t.model.gr00t_n1d6.processing_gr00t_n1d6 import Gr00tN1d6Processor +from gr00t.model.gr00t_n1d7.gr00t_n1d7 import Gr00tN1d7 +from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import Gr00tN1d7Processor from gr00t.model.registry import register_model -import numpy as np -from termcolor import colored -import torch -from transformers import AutoModel, AutoProcessor +from gr00t.utils.dist_utils import run_or_wait_on_rank0 # Convert tensors to lists for JSON serialization @@ -29,9 +44,9 @@ def convert_tensors_to_lists(obj): return obj -class Gr00tN1d6Pipeline(ModelPipeline): - model_class = Gr00tN1d6 - processor_class = Gr00tN1d6Processor +class Gr00tN1d7Pipeline(ModelPipeline): + model_class = Gr00tN1d7 + processor_class = Gr00tN1d7Processor def __init__(self, config: Config, save_cfg_dir: Path): super().__init__(config) @@ -62,10 +77,8 @@ def setup(self): def _create_model(self): """Setup model with proper vocabulary expansion.""" - - # Build transformers loading kwargs from training config - - if self.config.training.start_from_checkpoint is not None: + skip_weight_loading = getattr(self.config.training, "skip_weight_loading", False) + if self.config.training.start_from_checkpoint is not None and not skip_weight_loading: model, loading_info = AutoModel.from_pretrained( self.config.training.start_from_checkpoint, tune_llm=self.config.model.tune_llm, @@ -75,32 +88,48 @@ def _create_model(self): tune_vlln=self.config.model.tune_vlln, state_dropout_prob=self.config.model.state_dropout_prob, backbone_trainable_params_fp32=self.config.model.backbone_trainable_params_fp32, + load_bf16=self.config.model.load_bf16, transformers_loading_kwargs=self.transformers_loading_kwargs, output_loading_info=True, **self.transformers_loading_kwargs, ) - # Initialize mask_tokens if they are not present in the base checkpoint missing_keys = loading_info.get("missing_keys", []) mask_token_missing = any("mask_token" in key for key in missing_keys) - if mask_token_missing and model.action_head.mask_token is not None: - # Initialize mask_token with torch.no_grad(): model.action_head.mask_token.data.copy_( 0.02 * torch.randn_like(model.action_head.mask_token) ) logging.info("mask_token not in checkpoint - initialized") + unexpected_keys = loading_info.get("unexpected_keys", []) + mismatched_keys = loading_info.get("mismatched_keys", []) + other_missing = [k for k in missing_keys if "mask_token" not in k] + errors = [] + if other_missing: + errors.append(f"Missing keys ({len(other_missing)}): {other_missing}") + if unexpected_keys: + errors.append(f"Unexpected keys ({len(unexpected_keys)}): {unexpected_keys}") + if mismatched_keys: + errors.append(f"Mismatched keys ({len(mismatched_keys)}): {mismatched_keys}") + if errors: + raise RuntimeError( + "Checkpoint weight mismatch for " + f"{self.config.training.start_from_checkpoint}:\n" + "\n".join(errors) + ) + else: model = self.model_class( - self.config.model, transformers_loading_kwargs=self.transformers_loading_kwargs + self.config.model, + transformers_loading_kwargs=self.transformers_loading_kwargs, ) - print(colored(f"Model Config: {model.config}", "yellow")) - if get_rank() == 0: - with open(self.save_cfg_dir / "final_model_config.json", "w") as f: - f.write(model.config.to_filtered_json()) + logging.debug(f"Model Config: {model.config}") + with run_or_wait_on_rank0(label="final_model_config.json write") as is_rank0: + if is_rank0: + with open(self.save_cfg_dir / "final_model_config.json", "w") as f: + f.write(model.config.to_filtered_json()) # Print parameter statistics total_params = sum(p.numel() for p in model.parameters()) trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad) @@ -108,11 +137,13 @@ def _create_model(self): logging.info( f"Trainable parameters: {trainable_params:,} ({100 * trainable_params / total_params:.2f}%)" ) - print("Model: ", model) + logging.debug(f"Model architecture: {model}") return model - def _get_statistics(self) -> dict[str, dict[str, dict[str, dict[str, list[float]]]]] | None: + def _get_statistics( + self, + ) -> dict[str, dict[str, dict[str, dict[str, list[float]]]]] | None: return None def _get_embodiment_id_mapping(self) -> dict[str, int]: @@ -120,12 +151,14 @@ def _get_embodiment_id_mapping(self) -> dict[str, int]: def _create_dataset(self, save_cfg_dir: Path): """Create appropriate dataset based on task and mode.""" - + letter_box_transform = self.model_config.letter_box_transform + logging.info("N1.7 letter_box_transform=%s", letter_box_transform) if self.config.training.start_from_checkpoint is not None: processor = AutoProcessor.from_pretrained( self.config.training.start_from_checkpoint, # Overrides modality_configs=self.config.data.modality_configs, + use_percentiles=self.model_config.use_percentiles, image_crop_size=self.model_config.image_crop_size, image_target_size=self.model_config.image_target_size, random_rotation_angle=self.model_config.random_rotation_angle, @@ -136,16 +169,23 @@ def _create_dataset(self, save_cfg_dir: Path): apply_sincos_state_encoding=self.model_config.apply_sincos_state_encoding, max_action_horizon=self.model_config.action_horizon, use_albumentations=self.model_config.use_albumentations_transforms, + extra_augmentation_config=self.model_config.extra_augmentation_config, shortest_image_edge=self.model_config.shortest_image_edge, crop_fraction=self.model_config.crop_fraction, + letter_box_transform=letter_box_transform, transformers_loading_kwargs=self.transformers_loading_kwargs, use_alternate_vl_dit=self.model_config.use_alternate_vl_dit, use_relative_action=self.model_config.use_relative_action, + # State augmentation overrides + exclude_state=self.model_config.exclude_state, + state_dropout_prob=self.model_config.state_dropout_prob, + use_mean_std=self.model_config.use_mean_std, **self.transformers_loading_kwargs, ) else: processor = self.processor_class( modality_configs=self.config.data.modality_configs, + use_percentiles=self.model_config.use_percentiles, statistics=self._get_statistics(), # By default is None, so this will be computed and set later. embodiment_id_mapping=self._get_embodiment_id_mapping(), # By default is None, so this will be set later. image_crop_size=self.model_config.image_crop_size, @@ -160,33 +200,37 @@ def _create_dataset(self, save_cfg_dir: Path): apply_sincos_state_encoding=self.model_config.apply_sincos_state_encoding, max_action_horizon=self.model_config.action_horizon, use_albumentations=self.model_config.use_albumentations_transforms, + extra_augmentation_config=self.model_config.extra_augmentation_config, shortest_image_edge=self.model_config.shortest_image_edge, crop_fraction=self.model_config.crop_fraction, + letter_box_transform=letter_box_transform, use_relative_action=self.model_config.use_relative_action, + # State augmentation + exclude_state=self.model_config.exclude_state, + state_dropout_prob=self.model_config.state_dropout_prob, + use_mean_std=self.model_config.use_mean_std, transformers_loading_kwargs=self.transformers_loading_kwargs, ) - print( - colored( - f"These are all the processor configs for training: {json.dumps({k: str(v) for k, v in vars(processor).items()}, indent=2)}", - "yellow", - ) + logging.debug( + f"Processor configs for training: {json.dumps({k: str(v) for k, v in vars(processor).items()}, indent=2)}" ) - if get_rank() == 0: - with open(self.save_cfg_dir / "final_processor_config.json", "w") as f: - json.dump({k: str(v) for k, v in vars(processor).items()}, f, indent=2) + with run_or_wait_on_rank0(label="final_processor_config.json write") as is_rank0: + if is_rank0: + with open(self.save_cfg_dir / "final_processor_config.json", "w") as f: + json.dump({k: str(v) for k, v in vars(processor).items()}, f, indent=2) self.processor = processor dataset_factory = DatasetFactory(config=self.config) train_dataset, eval_dataset = dataset_factory.build(processor=self.processor) - # Save dataset statistics for inference - stats = train_dataset.get_dataset_statistics() - stats_dict = convert_tensors_to_lists(stats) - # Save statistics - with open(save_cfg_dir / "dataset_statistics.json", "w") as f: - json.dump(stats_dict, f, indent=2) - logging.info("Saved dataset statistics for inference") + with run_or_wait_on_rank0(label="dataset_statistics.json write") as is_rank0: + if is_rank0: + stats = train_dataset.get_dataset_statistics() + stats_dict = convert_tensors_to_lists(stats) + with open(save_cfg_dir / "dataset_statistics.json", "w") as f: + json.dump(stats_dict, f, indent=2) + logging.info("Saved dataset statistics for inference") return train_dataset, eval_dataset @@ -195,4 +239,4 @@ def _create_collator(self): return data_collator -register_model(Gr00tN1d6Config, Gr00tN1d6Pipeline) +register_model(Gr00tN1d7Config, Gr00tN1d7Pipeline) diff --git a/gr00t/model/modules/__init__.py b/gr00t/model/modules/__init__.py index 10fa235c3..69071b462 100644 --- a/gr00t/model/modules/__init__.py +++ b/gr00t/model/modules/__init__.py @@ -1 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """Modules package for Groot VLA models.""" diff --git a/gr00t/model/modules/dit.py b/gr00t/model/modules/dit.py index 37b94d4fc..4bb9994d3 100755 --- a/gr00t/model/modules/dit.py +++ b/gr00t/model/modules/dit.py @@ -1,3 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from contextlib import nullcontext +import os from typing import Optional from diffusers import ConfigMixin, ModelMixin @@ -9,6 +26,38 @@ import torch.nn.functional as F +def _is_spark_sm121() -> bool: + if not torch.cuda.is_available(): + return False + + major, minor = torch.cuda.get_device_capability() + return (major, minor) == (12, 1) + + +def _should_force_math_sdpa() -> bool: + override = os.environ.get("GR00T_DIT_SDPA_MODE") + if override == "math": + return True + if override == "default": + return False + + return _is_spark_sm121() + + +def _sdpa_context(): + # Spark (sm121) currently hits noisy/broken PyTorch mem-efficient SDPA kernel dispatch. + # Force the safe math backend there; on every other platform this returns a no-op context. + if not _should_force_math_sdpa(): + return nullcontext() + + return torch.backends.cuda.sdp_kernel( + enable_flash=False, + enable_math=True, + enable_mem_efficient=False, + enable_cudnn=False, + ) + + class TimestepEncoder(nn.Module): def __init__(self, embedding_dim, compute_dtype=torch.float32): super().__init__() @@ -145,13 +194,14 @@ def forward( if self.pos_embed is not None: norm_hidden_states = self.pos_embed(norm_hidden_states) - attn_output = self.attn1( - norm_hidden_states, - encoder_hidden_states=encoder_hidden_states, - attention_mask=( - encoder_attention_mask if encoder_hidden_states is not None else attention_mask - ), - ) + with _sdpa_context(): + attn_output = self.attn1( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=( + encoder_attention_mask if encoder_hidden_states is not None else attention_mask + ), + ) if self.final_dropout: attn_output = self.final_dropout(attn_output) diff --git a/gr00t/model/modules/eagle_backbone.py b/gr00t/model/modules/eagle_backbone.py deleted file mode 100755 index 6424dda3f..000000000 --- a/gr00t/model/modules/eagle_backbone.py +++ /dev/null @@ -1,120 +0,0 @@ -import os - -import torch -from transformers import AutoConfig, AutoModel -from transformers.feature_extraction_utils import BatchFeature - - -class EagleBackbone(torch.nn.Module): - def __init__( - self, - model_name: str = "nvidia/Eagle-Block2A-2B-v2", - tune_llm: bool = False, - tune_visual: bool = False, - select_layer: int = -1, - reproject_vision: bool = True, - use_flash_attention: bool = False, - projector_dim: int = -1, - load_bf16: bool = False, - tune_top_llm_layers: int = 0, - trainable_params_fp32: bool = False, - transformers_loading_kwargs: dict = {}, - ): - """ - EagleBackbone is to generate n_queries to represent the future action hidden states. - Args: - model_name: nvidia/Eagle-Block2A-2B-v2 - tune_llm: whether to tune the LLM model (default: False) - tune_visual: whether to tune the visual model (default: False) - """ - - super().__init__() - - # Add attention kwargs - extra_kwargs = {} - if use_flash_attention: - extra_kwargs["attn_implementation"] = "flash_attention_2" - if load_bf16: - extra_kwargs["torch_dtype"] = torch.bfloat16 - - if model_name == "nvidia/Eagle-Block2A-2B-v2": - assert use_flash_attention, ( - "nvidia/Eagle-Block2A-2B-v2 requires flash attention by default" - ) - assert load_bf16, "nvidia/Eagle-Block2A-2B-v2 requires bfloat16 by default" - eagle_path = os.path.join(os.path.dirname(__file__), "nvidia", "Eagle-Block2A-2B-v2") - config = AutoConfig.from_pretrained(eagle_path, trust_remote_code=True) - self.model = AutoModel.from_config(config, trust_remote_code=True) - else: - raise ValueError(f"Model {model_name} not supported") - - # needed since we don't use these layers. Also saves compute - while len(self.model.language_model.model.layers) > select_layer: - self.model.language_model.model.layers.pop(-1) - - self.select_layer = select_layer - self.set_trainable_parameters(tune_llm, tune_visual, tune_top_llm_layers) - if load_bf16 and trainable_params_fp32: - # cast trainable parameters to fp32 - for n, p in self.named_parameters(): - if p.requires_grad: - p.data = p.data.to(torch.float32) - print(f"Casting trainable parameter {n} to fp32") - - def set_trainable_parameters(self, tune_llm: bool, tune_visual: bool, tune_top_llm_layers: int): - self.tune_llm = tune_llm - self.tune_visual = tune_visual - for p in self.parameters(): - p.requires_grad = True - if not tune_llm: - self.model.language_model.requires_grad_(False) - if not tune_visual: - self.model.vision_model.requires_grad_(False) - self.model.mlp1.requires_grad_(False) - - if tune_top_llm_layers > 0: - for layer in self.model.language_model.model.layers[-tune_top_llm_layers:]: - for param in layer.parameters(): - param.requires_grad = True - - print(f"Tune backbone llm: {self.tune_llm}") - print(f"Tune backbone visual: {self.tune_visual}") - # Check if any parameters are still trainable. If not, print a warning. - for name, p in self.named_parameters(): - if p.requires_grad: - print(f"Backbone trainable parameter: {name}") - if not any(p.requires_grad for p in self.parameters()): - print("Warning: No backbone trainable parameters found.") - - def set_frozen_modules_to_eval_mode(self): - """ - Huggingface will call model.train() at each training_step. To ensure - the expected behaviors for modules like dropout, batchnorm, etc., we - need to call model.eval() for the frozen modules. - """ - if self.training: - if self.model.language_model and not self.tune_llm: - self.model.language_model.eval() - if self.model.vision_model and not self.tune_visual: - self.model.vision_model.eval() - self.model.mlp1.eval() - - def prepare_input(self, batch: dict) -> BatchFeature: - return BatchFeature(data=batch) - - def forward(self, vl_input: BatchFeature) -> BatchFeature: - self.set_frozen_modules_to_eval_mode() - # 0. Set frozen module to eval - keys_to_use = ["input_ids", "attention_mask", "pixel_values"] - vl_input = {k: vl_input[k] for k in keys_to_use} - outputs = self.model(**vl_input, output_hidden_states=True) - outputs = outputs["hidden_states"][-1] - image_mask = vl_input["input_ids"] == self.model.config.image_token_index - attention_mask = vl_input["attention_mask"] == 1 - return BatchFeature( - data={ - "backbone_features": outputs, - "backbone_attention_mask": attention_mask, - "image_mask": image_mask, - } - ) # [B, T2, hidden_size] diff --git a/gr00t/model/modules/embodiment_conditioned_mlp.py b/gr00t/model/modules/embodiment_conditioned_mlp.py index d4778981e..504785d57 100644 --- a/gr00t/model/modules/embodiment_conditioned_mlp.py +++ b/gr00t/model/modules/embodiment_conditioned_mlp.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 torch from torch import nn import torch.nn.functional as F diff --git a/gr00t/model/modules/flowmatching_modules.py b/gr00t/model/modules/flowmatching_modules.py deleted file mode 100644 index b2f61c11e..000000000 --- a/gr00t/model/modules/flowmatching_modules.py +++ /dev/null @@ -1,98 +0,0 @@ -import torch -from torch import nn -import torch.nn.functional as F - - -def swish(x): - return x * torch.sigmoid(x) - - -class SinusoidalPositionalEncoding(nn.Module): - """ - Produces a sinusoidal encoding of shape (B, T, w) - given timesteps of shape (B, T). - """ - - def __init__(self, embedding_dim): - super().__init__() - self.embedding_dim = embedding_dim - - def forward(self, timesteps): - # timesteps: shape (B, T) - # We'll compute sin/cos frequencies across dim T - timesteps = timesteps.float() # ensure float - - B, T = timesteps.shape - device = timesteps.device - - half_dim = self.embedding_dim // 2 - # typical log space frequencies for sinusoidal encoding - exponent = -torch.arange(half_dim, dtype=torch.float, device=device) * ( - torch.log(torch.tensor(10000.0)) / half_dim - ) - # Expand timesteps to (B, T, 1) then multiply - freqs = timesteps.unsqueeze(-1) * exponent.exp() # (B, T, half_dim) - - sin = torch.sin(freqs) - cos = torch.cos(freqs) - enc = torch.cat([sin, cos], dim=-1) # (B, T, w) - - return enc - - -class SmallMLP(nn.Module): - def __init__(self, input_dim, hidden_dim, output_dim): - super().__init__() - self.layer1 = nn.Linear(input_dim, hidden_dim) - self.layer2 = nn.Linear(hidden_dim, output_dim) - - def forward(self, x): - hidden = F.relu(self.layer1(x)) - return self.layer2(hidden) - - -class ActionEncoder(nn.Module): - def __init__(self, action_dim, hidden_size): - super().__init__() - self.hidden_size = hidden_size - - # W1: R^{w x d}, W2: R^{w x 2w}, W3: R^{w x w} - self.W1 = nn.Linear(action_dim, hidden_size) # (d -> w) - self.W2 = nn.Linear(2 * hidden_size, hidden_size) # (2w -> w) - self.W3 = nn.Linear(hidden_size, hidden_size) # (w -> w) - - self.pos_encoding = SinusoidalPositionalEncoding(hidden_size) - - def forward(self, actions, timesteps): - """ - actions: shape (B, T, action_dim) - timesteps: shape (B,) -- a single scalar per batch item - returns: shape (B, T, hidden_size) - """ - B, T, _ = actions.shape - - # 1) Expand each batch's single scalar time 'tau' across all T steps - # so that shape => (B, T) - # e.g. if timesteps is (B,), replicate across T - if timesteps.dim() == 1 and timesteps.shape[0] == B: - # shape (B,) => (B,T) - timesteps = timesteps.unsqueeze(1).expand(-1, T) - else: - raise ValueError( - "Expected `timesteps` to have shape (B,) so we can replicate across T." - ) - - # 2) Standard action MLP step for shape => (B, T, w) - a_emb = self.W1(actions) - - # 3) Get the sinusoidal encoding (B, T, w) - tau_emb = self.pos_encoding(timesteps).to(dtype=a_emb.dtype) - - # 4) Concat along last dim => (B, T, 2w), then W2 => (B, T, w), swish - x = torch.cat([a_emb, tau_emb], dim=-1) - x = swish(self.W2(x)) - - # 5) Finally W3 => (B, T, w) - x = self.W3(x) - - return x diff --git a/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/added_tokens.json b/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/added_tokens.json deleted file mode 100644 index 050a931a1..000000000 --- a/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/added_tokens.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "": 151673, - "": 151671, - "": 151679, - "": 151675, - "": 151677, - "": 151668, - "": 151658, - "": 151666, - "": 151669, - "": 151672, - "": 151670, - "": 151678, - "": 151674, - "": 151676, - "": 151667, - "": 151657, - "": 151665, - "<|box_end|>": 151649, - "<|box_start|>": 151648, - "<|endoftext|>": 151643, - "<|file_sep|>": 151664, - "<|fim_middle|>": 151660, - "<|fim_pad|>": 151662, - "<|fim_prefix|>": 151659, - "<|fim_suffix|>": 151661, - "<|im_end|>": 151645, - "<|im_start|>": 151644, - "<|image_pad|>": 151655, - "<|object_ref_end|>": 151647, - "<|object_ref_start|>": 151646, - "<|quad_end|>": 151651, - "<|quad_start|>": 151650, - "<|repo_name|>": 151663, - "<|video_pad|>": 151656, - "<|vision_end|>": 151653, - "<|vision_pad|>": 151654, - "<|vision_start|>": 151652 -} diff --git a/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/chat_template.json b/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/chat_template.json deleted file mode 100644 index 38c40a35a..000000000 --- a/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/chat_template.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "chat_template": "{% set image_count = namespace(value=0) %}{% set video_count = namespace(value=0) %}{% for message in messages %}{% if loop.first and message['role'] != 'system' %}<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n{% endif %}<|im_start|>{{ message['role'] }}\n{% if message['content'] is string %}{{ message['content'] }}<|im_end|>\n{% else %}{% for content in message['content'] %}{% if content['type'] == 'image' or 'image' in content or 'image_url' in content %}{% set image_count.value = image_count.value + 1 %}{% if add_vision_id %}{% endif %}{% elif content['type'] == 'video' or 'video' in content %}{% set video_count.value = video_count.value + 1 %}{% if add_vision_id %}' in content %}\n {%- set reasoning_content = content.split('')[0].rstrip('\\n').split('')[-1].lstrip('\\n') %}\n {%- set content = content.split('')[-1].lstrip('\\n') %}\n {%- endif %}\n {%- endif %}\n {%- if loop.index0 > ns.last_query_index %}\n {%- if loop.last or (not loop.last and reasoning_content) %}\n {{- '<|im_start|>' + message.role + '\\n\\n' + reasoning_content.strip('\\n') + '\\n\\n\\n' + content.lstrip('\\n') }}\n {%- else %}\n {{- '<|im_start|>' + message.role + '\\n' + content }}\n {%- endif %}\n {%- else %}\n {{- '<|im_start|>' + message.role + '\\n' + content }}\n {%- endif %}\n {%- if message.tool_calls %}\n {%- for tool_call in message.tool_calls %}\n {%- if (loop.first and content) or (not loop.first) %}\n {{- '\\n' }}\n {%- endif %}\n {%- if tool_call.function %}\n {%- set tool_call = tool_call.function %}\n {%- endif %}\n {{- '\\n{\"name\": \"' }}\n {{- tool_call.name }}\n {{- '\", \"arguments\": ' }}\n {%- if tool_call.arguments is string %}\n {{- tool_call.arguments }}\n {%- else %}\n {{- tool_call.arguments | tojson }}\n {%- endif %}\n {{- '}\\n' }}\n {%- endfor %}\n {%- endif %}\n {{- '<|im_end|>\\n' }}\n {%- elif message.role == \"tool\" %}\n {%- if loop.first or (messages[loop.index0 - 1].role != \"tool\") %}\n {{- '<|im_start|>user' }}\n {%- endif %}\n {{- '\\n\\n' }}\n {{- content }}\n {{- '\\n' }}\n {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n {{- '<|im_end|>\\n' }}\n {%- endif %}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|im_start|>assistant\\n' }}\n {%- if enable_thinking is defined and enable_thinking is false %}\n {{- '\\n\\n\\n\\n' }}\n {%- endif %}\n{%- endif %}", - "clean_up_tokenization_spaces": false, - "eos_token": "<|im_end|>", - "errors": "replace", - "extra_special_tokens": {}, - "model_max_length": 32768, - "pad_token": "<|endoftext|>", - "processor_class": "Eagle3_VLProcessor", - "split_special_tokens": false, - "tokenizer_class": "Qwen2Tokenizer", - "unk_token": null -} diff --git a/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/vocab.json b/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/vocab.json deleted file mode 100644 index 6bce3a0a3..000000000 --- a/gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2/vocab.json +++ /dev/null @@ -1,151645 +0,0 @@ -{ - "!": 0, - "!!": 2928, - "!!!": 12069, - "!!!!": 17085, - "!!!!!": 69800, - "!!!!!!!!": 50667, - "!!!!ĊĊ": 81392, - "!!!Ċ": 79295, - "!!!ĊĊ": 32057, - "!!\");Ċ": 98164, - "!!)Ċ": 85892, - "!!,": 93687, - "!!.": 24426, - "!!Ċ": 50347, - "!!ĊĊ": 24796, - "!\"": 8958, - "!\")": 88783, - "!\");": 85540, - "!\");Ċ": 11142, - "!\");ĊĊ": 57073, - "!\");čĊ": 42012, - "!\")Ċ": 22988, - "!\")ĊĊ": 66506, - "!\")čĊ": 93896, - "!\",": 18789, - "!\",Ċ": 33436, - "!\".": 92993, - "!\";Ċ": 26782, - "!\";čĊ": 93397, - "!\"Ċ": 24734, - "!\"ĊĊ": 17199, - "!'": 31383, - "!');Ċ": 25490, - "!')Ċ": 36180, - "!')ĊĊ": 98973, - "!',": 38692, - "!',Ċ": 36260, - "!';Ċ": 49174, - "!'Ċ": 48727, - "!(": 10297, - "!(\"": 17223, - "!(\"{": 88928, - "!(\"{}\",": 79878, - "!(:": 49116, - "!(Ċ": 33673, - "!)": 16315, - "!),": 48643, - "!).": 42392, - "!).ĊĊ": 86779, - "!)Ċ": 27584, - "!)ĊĊ": 35786, - "!*": 68222, - "!*\\Ċ": 90237, - "!,": 17142, - "!,Ċ": 72589, - "!--": 2495, - "!.": 15365, - "!.ĊĊ": 98527, - "!/": 87980, - "!:": 35575, - "!;Ċ": 85318, - "!<": 86932, - "!": 24011, - "\").": 1827, - "\").Ċ": 38609, - "\").ĊĊ": 80984, - "\"):": 37051, - "\"):Ċ": 15146, - "\"):čĊ": 74199, - "\");": 5038, - "\");//": 40919, - "\");}Ċ": 90118, - "\");Ċ": 797, - "\");ĊĊ": 3071, - "\");ĊĊĊ": 32636, - "\");čĊ": 2815, - "\");čĊčĊ": 15746, - "\")==": 43664, - "\")[": 17135, - "\")]": 30917, - "\")]Ċ": 5422, - "\")]ĊĊ": 72389, - "\")]čĊ": 25731, - "\"){": 47189, - "\"){Ċ": 14818, - "\"){čĊ": 50938, - "\")}": 67455, - "\")},Ċ": 79583, - "\")}Ċ": 42132, - "\")Ċ": 1138, - "\")ĊĊ": 5130, - "\")ĊĊĊ": 25639, - "\")čĊ": 6060, - "\")čĊčĊ": 30218, - "\"*": 61593, - "\"+": 5572, - "\"+\"": 77728, - "\"+Ċ": 27424, - "\",": 497, - "\",\"": 2198, - "\",\"\");Ċ": 75976, - "\",\"\",": 81390, - "\",\"\",\"": 59859, - "\",\"#": 58324, - "\",\"+": 57126, - "\",\"\\": 54256, - "\",$": 17982, - "\",&": 17834, - "\",'": 38838, - "\",(": 44970, - "\",-": 65575, - "\",@\"": 37366, - "\",[": 83498, - "\",__": 78427, - "\",{": 74448, - "\",Ċ": 756, - "\",ĊĊ": 25897, - "\",čĊ": 4723, - "\"-": 34294, - "\"--": 74757, - "\".": 3263, - "\".\"": 65720, - "\".$": 8634, - "\".$_": 88706, - "\"..": 62923, - "\"...": 52570, - "\"./": 95092, - "\".Ċ": 22956, - "\".ĊĊ": 11436, - "\".ĊĊĊĊ": 80874, - "\"/": 3115, - "\"/>": 13123, - "\"/>..Ċ": 61166, - "\"/><": 75942, - "\"/>Ċ": 4639, - "\"/>ĊĊ": 73330, - "\"/>čĊ": 41578, - "\":": 788, - "\":\"": 3252, - "\":\"\"": 62366, - "\":\"\",\"": 60767, - "\":\"\",Ċ": 42398, - "\":\"'": 71835, - "\":\"+": 70318, - "\":\"/": 58528, - "\":-": 52052, - "\":@\"": 73466, - "\":[": 8899, - "\":[\"": 36799, - "\":[-": 63028, - "\":[{\"": 66582, - "\":[{Ċ": 58018, - "\":{\"": 22317, - "\":{Ċ": 12602, - "\":Ċ": 4660, - "\":ĊĊ": 51418, - "\":čĊ": 20354, - "\";": 5123, - "\";//": 52035, - "\";}": 75091, - "\";}Ċ": 65543, - "\";Ċ": 876, - "\";ĊĊ": 3302, - "\";ĊĊĊ": 29122, - "\";čĊ": 3534, - "\";čĊčĊ": 21579, - "\"<": 22476, - "\"": 11147, - "\"=>\"": 20634, - "\"=>$": 31682, - "\">": 755, - "\">#": 86143, - "\">$": 59849, - "\">${": 47705, - "\">%": 71667, - "\">&": 13366, - "\">&#": 73144, - "\">'": 17756, - "\">'+": 40622, - "\">'+Ċ": 84086, - "\">',": 78304, - "\">',Ċ": 71820, - "\">'.": 56321, - "\">'.$": 35668, - "\">';Ċ": 24352, - "\">';čĊ": 78042, - "\">'Ċ": 74897, - "\">(": 57551, - "\">*-->Ċ": 96121, - "\">--}}Ċ": 79846, - "\">//": 72006, - "\"><": 3088, - "\">": 29052, - "-->Ċ": 9992, - "-->ĊĊ": 37859, - "-->čĊ": 38942, - "--[": 91487, - "--[[": 84105, - "--}}Ċ": 27220, - "--Ċ": 7088, - "--ĊĊ": 26469, - "--čĊ": 53751, - "-.": 14523, - "-/": 66114, - "-": 405, - "->$": 36726, - "->[": 69912, - "->_": 5129, - "->__": 29899, - "->___": 85442, - "->{": 10484, - "->{$": 33647, - "->{'": 27622, - "->{_": 98393, - "->Ċ": 84472, - "-A": 6691, - "-AA": 63664, - "-API": 98773, - "-Agent": 45118, - "-Al": 64373, - "-Allow": 33348, - "-Am": 98810, - "-Americ": 50683, - "-American": 23264, - "-Americans": 59064, - "-An": 57916, - "-Apr": 66148, - "-Ass": 61155, - "-Assad": 75186, - "-Aug": 61635, - "-B": 7671, - "-BEGIN": 53945, - "-Bar": 93320, - "-Based": 60339, - "-Benz": 62221, - "-Bold": 89581, - "-C": 7658, - "-CN": 94942, - "-CS": 78313, - "-Cal": 75350, - "-Cds": 98018, - "-Ch": 29553, - "-China": 97609, - "-Christian": 88041, - "-Class": 81526, - "-Clause": 62915, - "-Co": 86171, - "-Col": 54546, - "-Cola": 65177, - "-Compatible": 37262, - "-Con": 57748, - "-Control": 25056, - "-Core": 66429, - "-Cs": 78222, - "-D": 9420, - "-DD": 40175, - "-Day": 54912, - "-Dec": 79629, - "-Disposition": 62489, - "-E": 13431, - "-END": 51107, - "-East": 93664, - "-Encoding": 67358, - "-European": 87635, - "-F": 7276, - "-FIRST": 30362, - "-Feb": 93771, - "-Fi": 26299, - "-Free": 62890, - "-G": 12010, - "-General": 57982, - "-H": 11278, - "-HT": 99085, - "-Headers": 76006, - "-I": 21477, - "-ID": 53365, - "-II": 75544, - "-IN": 80021, - "-INF": 71470, - "-INFRINGEMENT": 94673, - "-IS": 97518, - "-Identifier": 36773, - "-In": 31500, - "-Isl": 79978, - "-Israel": 70990, - "-J": 12009, - "-Jan": 66452, - "-Javadoc": 49385, - "-Jul": 91179, - "-Jun": 77734, - "-K": 15843, - "-Key": 94321, - "-L": 8125, - "-LAST": 30515, - "-La": 93916, - "-Language": 90765, - "-Le": 46168, - "-League": 84611, - "-Length": 52493, - "-Level": 92780, - "-License": 36479, - "-Life": 87808, - "-Line": 91536, - "-M": 5251, - "-MM": 18506, - "-Mail": 37513, - "-Man": 30151, - "-Mar": 47435, - "-Mart": 64156, - "-May": 61986, - "-Men": 49459, - "-Methods": 95490, - "-Mobile": 56353, - "-Muslim": 61405, - "-N": 11250, - "-NLS": 37484, - "-Nazi": 96558, - "-New": 89737, - "-No": 97976, - "-Nov": 70488, - "-O": 23620, - "-Oct": 92426, - "-On": 66354, - "-One": 90377, - "-Origin": 51636, - "-Out": 84515, - "-Owned": 90052, - "-P": 9299, - "-Pacific": 63876, - "-Pack": 76582, - "-President": 85381, - "-Pro": 57086, - "-Q": 28242, - "-Qaeda": 56885, - "-R": 10911, - "-REAL": 95262, - "-ROM": 98383, - "-Ray": 78404, - "-Re": 67960, - "-Regular": 87591, - "-Requested": 89109, - "-Russian": 84035, - "-S": 6222, - "-SA": 92214, - "-ST": 92577, - "-Sah": 92114, - "-Saharan": 96419, - "-Se": 97528, - "-Semit": 44092, - "-Semitic": 73497, - "-Semitism": 64810, - "-Sep": 95153, - "-Series": 91731, - "-Sh": 30261, - "-Shirt": 75854, - "-Smith": 96238, - "-Speed": 94477, - "-St": 39620, - "-Star": 38784, - "-State": 86515, - "-T": 9285, - "-TV": 52292, - "-Ta": 43095, - "-Th": 70526, - "-The": 65006, - "-Time": 54485, - "-To": 58308, - "-Token": 89022, - "-Tr": 88047, - "-Trump": 66920, - "-Type": 10804, - "-U": 34581, - "-UA": 36736, - "-US": 32340, - "-Un": 82245, - "-Up": 46097, - "-V": 19625, - "-Version": 83902, - "-W": 13002, - "-West": 60761, - "-With": 83156, - "-X": 30550, - "-Y": 29137, - "-Year": 70898, - "-Z": 11171, - "-Za": 39279, - "-[": 40995, - "-\\": 30529, - "-_": 70049, - "-a": 7409, - "-ab": 38030, - "-abortion": 95483, - "-about": 68105, - "-abs": 96410, - "-ac": 37598, - "-access": 42156, - "-account": 49982, - "-acre": 63334, - "-action": 25059, - "-actions": 51321, - "-active": 31244, - "-ad": 25747, - "-add": 18570, - "-added": 86342, - "-addon": 39777, - "-addons": 94759, - "-address": 41633, - "-adjust": 59584, - "-admin": 27225, - "-aff": 70160, - "-after": 44573, - "-ag": 41985, - "-age": 42941, - "-aged": 56759, - "-agent": 41935, - "-ahead": 98488, - "-air": 37535, - "-ajax": 82320, - "-al": 18779, - "-alert": 55745, - "-align": 9644, - "-aligned": 97451, - "-alist": 80978, - "-all": 22346, - "-alone": 73149, - "-alpha": 64538, - "-alt": 33350, - "-am": 32217, - "-an": 18883, - "-analysis": 55436, - "-analytics": 98910, - "-anchor": 75445, - "-and": 9777, - "-android": 97388, - "-angle": 34381, - "-angular": 50444, - "-animate": 81350, - "-animation": 63206, - "-answer": 95777, - "-any": 88427, - "-aos": 64844, - "-ap": 45156, - "-api": 23904, - "-app": 20023, - "-append": 88229, - "-application": 92479, - "-appointed": 98363, - "-approved": 66262, - "-ar": 57393, - "-archive": 95100, - "-area": 29022, - "-arm": 66818, - "-around": 45616, - "-array": 62058, - "-arrow": 29308, - "-art": 37821, - "-article": 77405, - "-as": 32434, - "-ass": 34815, - "-assets": 75158, - "-associated": 74868, - "-at": 28783, - "-au": 81997, - "-aut": 45123, - "-auth": 33503, - "-author": 42702, - "-authored": 95371, - "-auto": 19938, - "-automatic": 94473, - "-available": 93732, - "-avatar": 79087, - "-average": 77426, - "-await": 79738, - "-awaited": 89250, - "-aware": 65004, - "-away": 89624, - "-awesome": 28524, - "-axis": 35321, - "-b": 1455, - "-back": 15461, - "-backed": 45028, - "-backend": 89987, - "-background": 41934, - "-badge": 88076, - "-bal": 83125, - "-ball": 67202, - "-band": 67675, - "-banner": 70883, - "-bar": 15773, - "-bars": 82827, - "-base": 30013, - "-based": 5980, - "-basic": 51002, - "-basket": 94675, - "-be": 15150, - "-bearing": 91153, - "-bed": 48507, - "-bedroom": 66867, - "-before": 69447, - "-begin": 91673, - "-being": 32751, - "-bel": 90205, - "-best": 56601, - "-beta": 67640, - "-between": 25959, - "-bg": 35804, - "-big": 69411, - "-billion": 69073, - "-bin": 49125, - "-binary": 94839, - "-bind": 64963, - "-binding": 64400, - "-bit": 15257, - "-bl": 16278, - "-black": 36946, - "-blind": 94349, - "-block": 9425, - "-blocking": 78761, - "-blog": 59939, - "-blood": 92903, - "-blue": 31654, - "-bo": 69466, - "-board": 52855, - "-bodied": 96297, - "-body": 9350, - "-bold": 27639, - "-book": 33640, - "-books": 83091, - "-boot": 88289, - "-bootstrap": 24383, - "-border": 27019, - "-bordered": 31354, - "-born": 39160, - "-bot": 89361, - "-bottom": 11381, - "-bound": 49862, - "-box": 12625, - "-boy": 84903, - "-br": 30117, - "-brand": 33120, - "-bre": 91908, - "-break": 34349, - "-breaking": 54307, - "-browser": 31555, - "-bs": 56430, - "-btn": 15591, - "-budget": 94752, - "-buffer": 31351, - "-build": 32145, - "-builder": 71814, - "-building": 51399, - "-built": 51614, - "-business": 64013, - "-but": 69796, - "-button": 12444, - "-buttons": 61667, - "-buy": 79678, - "-by": 14319, - "-byte": 53952, - "-c": 1786, - "-ca": 50777, - "-cache": 36680, - "-cal": 48136, - "-calendar": 46997, - "-call": 58897, - "-called": 18900, - "-camera": 71944, - "-campus": 93319, - "-can": 71214, - "-cancel": 85003, - "-cap": 36689, - "-capital": 97131, - "-caption": 58317, - "-car": 23992, - "-card": 20466, - "-care": 40106, - "-caret": 82922, - "-carousel": 52237, - "-cart": 35459, - "-case": 38485, - "-cat": 83892, - "-catching": 83324, - "-categories": 95099, - "-category": 42858, - "-ce": 53212, - "-cell": 31901, - "-cent": 21217, - "-center": 6883, - "-centered": 49382, - "-central": 84081, - "-centric": 64424, - "-century": 33357, - "-cert": 61034, - "-ch": 11582, - "-chain": 65186, - "-chair": 78681, - "-chan": 77635, - "-change": 50402, - "-changing": 48861, - "-channel": 53868, - "-char": 42538, - "-character": 79225, - "-chart": 44627, - "-chat": 60535, - "-che": 36740, - "-check": 15934, - "-checkbox": 49073, - "-checked": 99131, - "-chevron": 47382, - "-chief": 73619, - "-child": 23484, - "-choice": 62626, - "-ci": 62384, - "-cigaret": 62267, - "-cigarettes": 85063, - "-circle": 18664, - "-city": 53329, - "-cl": 30617, - "-class": 14800, - "-clean": 91800, - "-clear": 67027, - "-cli": 54797, - "-click": 28118, - "-client": 30011, - "-clock": 54288, - "-close": 34462, - "-cloud": 59197, - "-cluster": 93208, - "-cmpr": 97971, - "-cn": 63264, - "-co": 22471, - "-code": 25261, - "-coded": 86311, - "-col": 19459, - "-collapse": 24487, - "-collar": 96836, - "-collection": 95609, - "-color": 7889, - "-colored": 57722, - "-cols": 97814, - "-column": 24960, - "-columns": 73569, - "-com": 11476, - "-comm": 87289, - "-command": 48419, - "-comment": 45666, - "-comments": 77154, - "-commerce": 41585, - "-commercial": 73044, - "-commit": 96398, - "-common": 45045, - "-community": 89786, - "-comp": 62150, - "-company": 91033, - "-compatible": 80215, - "-complete": 74414, - "-component": 41387, - "-components": 24594, - "-compose": 65070, - "-con": 14859, - "-cond": 83376, - "-condition": 58005, - "-conf": 50717, - "-confidence": 90880, - "-config": 25130, - "-confirm": 66525, - "-connect": 85470, - "-connected": 72188, - "-cons": 68504, - "-conscious": 65566, - "-console": 74756, - "-consuming": 69740, - "-cont": 34072, - "-contact": 52996, - "-contained": 95224, - "-container": 12578, - "-containing": 92771, - "-content": 6808, - "-context": 63633, - "-contrib": 85444, - "-control": 4465, - "-controlled": 40270, - "-controller": 67245, - "-controls": 34251, - "-cookie": 87239, - "-coordinate": 80697, - "-copy": 66140, - "-cor": 45613, - "-core": 23460, - "-corner": 87595, - "-cost": 40138, - "-count": 26580, - "-counter": 63189, - "-country": 55871, - "-course": 68429, - "-court": 97362, - "-cover": 75365, - "-covered": 83308, - "-cr": 47589, - "-create": 39679, - "-created": 70957, - "-cross": 76429, - "-css": 47859, - "-cultural": 93426, - "-cur": 94049, - "-current": 44175, - "-custom": 36898, - "-cut": 42221, - "-cycle": 77690, - "-d": 1737, - "-da": 65897, - "-danger": 12025, - "-dark": 21838, - "-dashboard": 49136, - "-dat": 92997, - "-data": 13945, - "-date": 18413, - "-datepicker": 58564, - "-day": 11228, - "-days": 95214, - "-db": 60399, - "-dd": 21541, - "-de": 6810, - "-deals": 67548, - "-death": 96486, - "-debug": 71051, - "-decoration": 30266, - "-def": 28799, - "-default": 13672, - "-defense": 57698, - "-defined": 38717, - "-definition": 89050, - "-degree": 37675, - "-del": 47126, - "-delay": 45171, - "-delete": 40904, - "-dem": 76679, - "-demand": 56264, - "-demo": 58893, - "-den": 96528, - "-density": 88031, - "-depend": 35714, - "-dependent": 42818, - "-depth": 30310, - "-derived": 71186, - "-des": 24506, - "-desc": 52547, - "-described": 50604, - "-describedby": 64762, - "-description": 42830, - "-design": 46017, - "-designed": 68856, - "-desktop": 79249, - "-dess": 88329, - "-destruct": 96222, - "-det": 90904, - "-detail": 29572, - "-details": 30433, - "-dev": 25758, - "-devel": 64103, - "-develop": 47961, - "-development": 94606, - "-device": 65607, - "-di": 50289, - "-dialog": 20641, - "-digit": 48342, - "-dimensional": 32420, - "-dir": 45283, - "-direct": 43524, - "-directed": 85755, - "-direction": 33049, - "-directory": 53634, - "-dis": 10475, - "-disable": 21400, - "-disabled": 68067, - "-disc": 51665, - "-dismiss": 18298, - "-dismissible": 77633, - "-display": 52839, - "-dist": 87259, - "-distance": 73808, - "-div": 32785, - "-divider": 69900, - "-do": 29559, - "-doc": 11527, - "-document": 82233, - "-dollar": 53035, - "-dom": 14428, - "-domain": 72794, - "-dominated": 89623, - "-done": 94288, - "-door": 57090, - "-dot": 80902, - "-double": 68620, - "-down": 14875, - "-download": 62451, - "-dr": 18643, - "-drive": 82410, - "-driven": 31405, - "-driver": 76490, - "-driving": 59711, - "-drop": 61771, - "-dropdown": 43949, - "-du": 97205, - "-duration": 64383, - "-duty": 54518, - "-e": 5655, - "-earth": 85087, - "-east": 39507, - "-economic": 76149, - "-ed": 34435, - "-edge": 47348, - "-edit": 22142, - "-editor": 46467, - "-educated": 87681, - "-eff": 52365, - "-effect": 23067, - "-effective": 52321, - "-effects": 74788, - "-efficient": 72816, - "-eight": 69715, - "-el": 83149, - "-elect": 35981, - "-elected": 95705, - "-election": 42633, - "-element": 28452, - "-elements": 64445, - "-em": 36512, - "-email": 42117, - "-employed": 87884, - "-empty": 39433, - "-en": 20767, - "-enable": 64211, - "-enabled": 54192, - "-encoded": 92262, - "-end": 13068, - "-ended": 83075, - "-ending": 66797, - "-energy": 64387, - "-eng": 96102, - "-engine": 49625, - "-enh": 83082, - "-enter": 48215, - "-entity": 93588, - "-entry": 47244, - "-env": 67462, - "-envelope": 63525, - "-equ": 62259, - "-equipped": 87102, - "-equiv": 22941, - "-era": 51343, - "-error": 18917, - "-errors": 72604, - "-es": 31854, - "-eslint": 55175, - "-esque": 78958, - "-establish": 47487, - "-established": 63768, - "-esteem": 64806, - "-et": 96010, - "-ev": 90245, - "-even": 91531, - "-event": 39687, - "-events": 53803, - "-ever": 56440, - "-ex": 10187, - "-example": 43430, - "-exc": 96933, - "-exclusive": 93058, - "-exec": 70721, - "-existent": 59828, - "-existing": 49357, - "-exp": 18376, - "-expand": 49093, - "-expanded": 30036, - "-export": 65827, - "-expression": 81493, - "-ext": 66103, - "-extension": 80539, - "-extra": 71704, - "-eye": 46697, - "-eyed": 52513, - "-f": 2220, - "-face": 29088, - "-facebook": 53587, - "-faced": 76881, - "-facing": 63306, - "-factor": 74097, - "-family": 17190, - "-fashion": 57480, - "-fashioned": 63269, - "-fast": 73668, - "-fat": 63254, - "-fe": 33203, - "-feature": 91840, - "-fed": 78000, - "-feed": 86160, - "-feedback": 34874, - "-feira": 63908, - "-fetch": 80040, - "-fi": 36631, - "-fiction": 73431, - "-field": 19130, - "-fields": 79585, - "-figure": 98996, - "-file": 14203, - "-files": 46048, - "-fill": 58987, - "-filled": 43418, - "-filter": 32448, - "-fin": 83999, - "-final": 54862, - "-finals": 97908, - "-find": 75784, - "-fire": 56269, - "-fired": 71578, - "-first": 36943, - "-fit": 49560, - "-five": 35299, - "-fix": 70913, - "-fixed": 53764, - "-fl": 12276, - "-flag": 77950, - "-flash": 92879, - "-flat": 65468, - "-flex": 18120, - "-flight": 76203, - "-floating": 89651, - "-floor": 79350, - "-flow": 61313, - "-fluid": 17422, - "-fly": 82885, - "-focus": 79464, - "-focused": 51273, - "-fold": 23432, - "-folder": 74604, - "-follow": 92585, - "-font": 30671, - "-fontawesome": 95848, - "-food": 63467, - "-foot": 20483, - "-football": 84142, - "-footer": 19019, - "-for": 15193, - "-force": 80049, - "-form": 8460, - "-format": 38380, - "-formed": 94877, - "-forward": 44804, - "-found": 26704, - "-founded": 82108, - "-founder": 35827, - "-four": 41017, - "-fr": 50378, - "-frame": 46767, - "-framework": 73397, - "-free": 12577, - "-frequency": 78312, - "-friendly": 21896, - "-from": 38051, - "-front": 63626, - "-ft": 93624, - "-full": 23642, - "-function": 33749, - "-functional": 98516, - "-functions": 77430, - "-funded": 49601, - "-fw": 39239, - "-g": 2371, - "-gallery": 51238, - "-game": 19395, - "-gap": 88557, - "-gay": 83936, - "-gen": 36464, - "-general": 67997, - "-generated": 16185, - "-generation": 42827, - "-generator": 78002, - "-generic": 82682, - "-get": 22491, - "-girl": 62870, - "-git": 81749, - "-gl": 69650, - "-global": 73319, - "-gnu": 85716, - "-go": 19926, - "-goal": 92288, - "-going": 64812, - "-good": 71700, - "-google": 62645, - "-government": 45604, - "-gr": 24321, - "-grade": 40227, - "-gradient": 42738, - "-grand": 71002, - "-graph": 73016, - "-gray": 21840, - "-green": 38268, - "-grey": 63213, - "-grid": 28083, - "-ground": 78155, - "-group": 4351, - "-groups": 90352, - "-grow": 92732, - "-growing": 55557, - "-guard": 92981, - "-guid": 83692, - "-guide": 91425, - "-gun": 75235, - "-h": 2832, - "-haired": 67379, - "-half": 33802, - "-hand": 24413, - "-handed": 36140, - "-handle": 88407, - "-handler": 72112, - "-hard": 70745, - "-has": 45898, - "-hash": 96170, - "-haspopup": 61226, - "-have": 68484, - "-he": 37335, - "-head": 26390, - "-headed": 61066, - "-header": 9351, - "-heading": 23339, - "-health": 78405, - "-heart": 42244, - "-hearted": 69295, - "-heavy": 73566, - "-height": 17068, - "-held": 57506, - "-help": 49470, - "-helper": 77664, - "-hero": 91793, - "-hidden": 13306, - "-hide": 59882, - "-high": 27561, - "-highlight": 72802, - "-history": 61374, - "-hit": 69101, - "-holder": 65409, - "-hole": 86593, - "-home": 24388, - "-hook": 33860, - "-hooks": 78387, - "-hop": 48719, - "-horizontal": 37900, - "-host": 38589, - "-hot": 59447, - "-hour": 21231, - "-hours": 76005, - "-house": 35902, - "-hover": 28893, - "-how": 57423, - "-html": 53768, - "-http": 71312, - "-human": 68995, - "-i": 17600, - "-icon": 7815, - "-icons": 18868, - "-id": 12897, - "-ie": 87327, - "-if": 44637, - "-ignore": 43171, - "-il": 56275, - "-im": 36925, - "-image": 13746, - "-images": 50991, - "-img": 21064, - "-imm": 63583, - "-import": 53315, - "-important": 97373, - "-in": 3419, - "-inc": 85619, - "-inch": 24241, - "-income": 31097, - "-ind": 17776, - "-indent": 52675, - "-independent": 97785, - "-index": 21492, - "-induced": 37873, - "-inf": 47236, - "-inflammatory": 66495, - "-info": 12505, - "-information": 80739, - "-ing": 83905, - "-init": 54773, - "-initial": 47967, - "-initialized": 68028, - "-inline": 23633, - "-inner": 30899, - "-input": 13933, - "-ins": 21853, - "-insert": 74550, - "-inspired": 52061, - "-inst": 33688, - "-instagram": 90397, - "-install": 57899, - "-instance": 73655, - "-int": 20052, - "-intensive": 86992, - "-inter": 44894, - "-interest": 64773, - "-interface": 82954, - "-inv": 87486, - "-invalid": 39740, - "-inverse": 74299, - "-io": 86269, - "-ion": 79746, - "-ios": 88119, - "-ip": 74732, - "-is": 30430, - "-ish": 66753, - "-issue": 89365, - "-it": 37511, - "-item": 6404, - "-items": 17459, - "-j": 13333, - "-java": 85339, - "-job": 69948, - "-js": 25802, - "-json": 56080, - "-k": 12646, - "-key": 16173, - "-keys": 76109, - "-kind": 59706, - "-kit": 91476, - "-know": 99120, - "-known": 21309, - "-l": 2852, - "-la": 52826, - "-label": 6942, - "-labelled": 31801, - "-labelledby": 32127, - "-lang": 75460, - "-language": 43558, - "-large": 39148, - "-largest": 66967, - "-last": 60515, - "-lasting": 64165, - "-lat": 98414, - "-launch": 85306, - "-law": 30312, - "-layer": 47335, - "-layout": 37803, - "-le": 30207, - "-leading": 68375, - "-league": 87263, - "-leaning": 77361, - "-learning": 70756, - "-led": 33954, - "-left": 7950, - "-leg": 61123, - "-legged": 94264, - "-len": 85557, - "-length": 29325, - "-less": 54909, - "-letter": 79368, - "-level": 11591, - "-lfs": 70162, - "-lg": 7510, - "-li": 75546, - "-lib": 38641, - "-library": 52421, - "-license": 58967, - "-life": 25843, - "-light": 17709, - "-like": 12681, - "-limit": 71159, - "-line": 8447, - "-linear": 61299, - "-lined": 88959, - "-lines": 83363, - "-link": 8965, - "-linked": 54414, - "-links": 46676, - "-linux": 46375, - "-list": 9029, - "-lite": 78482, - "-liter": 85594, - "-live": 73451, - "-lived": 61854, - "-ln": 27692, - "-lnd": 46751, - "-lo": 26480, - "-load": 49008, - "-loaded": 78070, - "-loader": 21350, - "-loading": 58686, - "-local": 40060, - "-location": 60870, - "-lock": 41772, - "-log": 46332, - "-login": 35048, - "-logo": 33797, - "-long": 23791, - "-looking": 30248, - "-loop": 60666, - "-loss": 76301, - "-loving": 76600, - "-low": 59269, - "-m": 1448, - "-machine": 83215, - "-made": 26877, - "-mail": 11468, - "-mails": 60220, - "-main": 29992, - "-major": 65581, - "-make": 94219, - "-maker": 83601, - "-makers": 75070, - "-making": 27746, - "-man": 20477, - "-management": 54785, - "-manager": 44896, - "-many": 80188, - "-map": 25858, - "-mar": 69998, - "-margin": 45391, - "-mark": 28904, - "-marker": 69828, - "-market": 47731, - "-mask": 76056, - "-master": 50903, - "-match": 45704, - "-material": 67318, - "-max": 44073, - "-md": 4433, - "-me": 33973, - "-mean": 82996, - "-med": 44772, - "-media": 41262, - "-mediated": 80976, - "-medium": 45817, - "-member": 43550, - "-members": 85840, - "-memory": 64096, - "-men": 87969, - "-menu": 11714, - "-message": 29332, - "-messages": 88142, - "-meta": 54017, - "-metadata": 96431, - "-metal": 88832, - "-meter": 72501, - "-method": 50297, - "-mf": 47247, - "-middle": 50067, - "-mile": 42176, - "-million": 45049, - "-min": 13398, - "-minded": 33323, - "-mini": 67354, - "-minus": 71023, - "-minute": 23498, - "-mm": 48575, - "-mobile": 41079, - "-mod": 17078, - "-modal": 25120, - "-mode": 14982, - "-model": 28244, - "-module": 46718, - "-modules": 61079, - "-mon": 77296, - "-money": 67992, - "-monitor": 91634, - "-month": 22289, - "-more": 49914, - "-mort": 89553, - "-most": 62398, - "-motion": 84249, - "-mount": 59588, - "-mounted": 77730, - "-mouth": 91039, - "-move": 95694, - "-moving": 85472, - "-ms": 64089, - "-msg": 57462, - "-mult": 96927, - "-multi": 95669, - "-muted": 30740, - "-my": 61496, - "-même": 97275, - "-n": 5279, - "-na": 93082, - "-name": 11494, - "-names": 89044, - "-national": 74529, - "-native": 15598, - "-nav": 16818, - "-navbar": 52332, - "-navigation": 38652, - "-ne": 39978, - "-neck": 95433, - "-needed": 68775, - "-negative": 60935, - "-net": 66496, - "-network": 56732, - "-neutral": 91222, - "-new": 22269, - "-news": 45251, - "-next": 22304, - "-ng": 82963, - "-night": 44327, - "-nil": 83248, - "-nine": 85603, - "-no": 28366, - "-node": 39054, - "-non": 98700, - "-none": 24887, - "-normal": 52083, - "-not": 29169, - "-notch": 77511, - "-note": 67238, - "-notes": 61867, - "-notification": 90724, - "-now": 90963, - "-null": 60341, - "-num": 31194, - "-number": 25854, - "-o": 16022, - "-ob": 92449, - "-object": 40432, - "-of": 8668, - "-off": 12462, - "-office": 81127, - "-offs": 63939, - "-offset": 23761, - "-offsetof": 54187, - "-ok": 74253, - "-old": 6284, - "-olds": 64148, - "-on": 10326, - "-one": 18589, - "-online": 68879, - "-only": 15382, - "-ons": 59126, - "-op": 29492, - "-opacity": 68059, - "-open": 25686, - "-opening": 85208, - "-oper": 58555, - "-operation": 66234, - "-operative": 88993, - "-operator": 94687, - "-opt": 56112, - "-option": 48689, - "-options": 39733, - "-or": 26511, - "-orange": 84383, - "-order": 23810, - "-orders": 85051, - "-org": 71184, - "-oriented": 35085, - "-origin": 66803, - "-original": 66958, - "-os": 82428, - "-other": 72472, - "-out": 9794, - "-outline": 29641, - "-output": 59524, - "-outs": 83975, - "-over": 28252, - "-overlay": 51495, - "-owned": 28699, - "-owner": 69809, - "-p": 2268, - "-paced": 64219, - "-pack": 56510, - "-package": 44135, - "-packages": 75761, - "-packed": 69904, - "-pad": 92819, - "-padding": 42549, - "-page": 15112, - "-pages": 72347, - "-pagination": 80750, - "-paid": 69020, - "-pane": 38452, - "-panel": 31376, - "-paper": 76719, - "-par": 56998, - "-param": 72966, - "-parameter": 89412, - "-parent": 46436, - "-parse": 85382, - "-parser": 36620, - "-part": 28037, - "-parts": 92478, - "-party": 24031, - "-pass": 46967, - "-password": 33069, - "-path": 33095, - "-pattern": 79569, - "-pay": 70088, - "-paying": 88723, - "-payment": 72443, - "-pdf": 97625, - "-pe": 95651, - "-peer": 78597, - "-pencil": 56066, - "-per": 17018, - "-percent": 70624, - "-performance": 57474, - "-period": 98081, - "-person": 28045, - "-ph": 62737, - "-phase": 81610, - "-phone": 50480, - "-photo": 66367, - "-php": 84179, - "-pic": 82773, - "-picker": 61146, - "-picture": 79658, - "-piece": 55864, - "-pill": 88387, - "-pills": 90441, - "-pin": 74443, - "-pl": 32107, - "-place": 41661, - "-placeholder": 69098, - "-placement": 51563, - "-plan": 72981, - "-plane": 89549, - "-platform": 54025, - "-play": 26544, - "-player": 42367, - "-playing": 72085, - "-plugin": 23629, - "-plugins": 83746, - "-plus": 22934, - "-po": 74388, - "-pocket": 98336, - "-point": 16574, - "-pointer": 57689, - "-points": 92458, - "-pol": 53996, - "-policy": 66420, - "-pop": 40252, - "-popup": 47536, - "-port": 41457, - "-pos": 71782, - "-position": 33524, - "-positive": 68688, - "-post": 24410, - "-posts": 88571, - "-pound": 47630, - "-power": 26526, - "-powered": 40403, - "-pr": 26650, - "-pre": 21334, - "-prefix": 67181, - "-prepend": 84159, - "-pres": 79776, - "-present": 48024, - "-president": 65988, - "-pressure": 88461, - "-prev": 67012, - "-preview": 50881, - "-price": 37308, - "-priced": 84737, - "-primary": 9799, - "-print": 42145, - "-private": 65277, - "-pro": 9838, - "-process": 50094, - "-processing": 69193, - "-produ": 45254, - "-produced": 83461, - "-producing": 89275, - "-product": 28645, - "-production": 69566, - "-products": 67873, - "-prof": 92308, - "-profile": 24194, - "-profit": 27826, - "-program": 66020, - "-progress": 53291, - "-project": 33696, - "-prom": 65171, - "-proof": 59167, - "-prop": 76571, - "-properties": 67079, - "-property": 61401, - "-provider": 81532, - "-proxy": 83701, - "-ps": 68167, - "-pt": 96051, - "-public": 56471, - "-publish": 97353, - "-purple": 94462, - "-purpose": 58238, - "-push": 98643, - "-python": 71929, - "-q": 51608, - "-qu": 73701, - "-quality": 22092, - "-quarter": 57314, - "-quarters": 82541, - "-query": 65489, - "-question": 66415, - "-quote": 92929, - "-r": 3795, - "-ra": 58301, - "-rad": 94755, - "-radio": 62693, - "-radius": 17710, - "-random": 91675, - "-range": 30508, - "-ranging": 81005, - "-ranked": 75597, - "-ranking": 71439, - "-rate": 43026, - "-rated": 54885, - "-rating": 79511, - "-ray": 29530, - "-rays": 81717, - "-re": 5504, - "-reaching": 86148, - "-react": 30596, - "-read": 28806, - "-readable": 83218, - "-reader": 90479, - "-ready": 63915, - "-real": 74795, - "-rec": 59172, - "-record": 56163, - "-red": 31598, - "-redux": 19604, - "-ref": 43007, - "-reference": 72623, - "-refresh": 75086, - "-reg": 32163, - "-regexp": 94411, - "-region": 60679, - "-register": 63018, - "-registration": 98698, - "-rel": 47612, - "-related": 13904, - "-relative": 75706, - "-release": 44724, - "-remove": 48625, - "-ren": 93009, - "-render": 58933, - "-repeat": 33743, - "-reply": 78391, - "-report": 47411, - "-reported": 84196, - "-request": 44808, - "-required": 62472, - "-res": 11588, - "-reset": 76403, - "-resistant": 45956, - "-resolution": 62936, - "-resource": 74790, - "-resources": 89811, - "-response": 58469, - "-responsive": 20964, - "-rest": 76233, - "-result": 53838, - "-results": 64770, - "-ret": 69110, - "-return": 80023, - "-review": 45721, - "-reviewed": 78704, - "-rich": 40847, - "-right": 6701, - "-rights": 86556, - "-ring": 75929, - "-rise": 88399, - "-risk": 45470, - "-ro": 51934, - "-road": 65715, - "-rock": 79337, - "-role": 54821, - "-roll": 86760, - "-room": 47740, - "-root": 39214, - "-round": 21015, - "-rounded": 64218, - "-route": 81559, - "-router": 14266, - "-routing": 52156, - "-row": 19545, - "-rule": 59301, - "-run": 22973, - "-runner": 83056, - "-running": 53489, - "-runtime": 68912, - "-s": 1331, - "-safe": 55119, - "-sale": 57537, - "-sales": 95668, - "-sama": 95176, - "-sample": 83879, - "-san": 45938, - "-save": 48553, - "-saving": 57985, - "-sc": 30319, - "-scal": 61887, - "-scalable": 74252, - "-scale": 12934, - "-scenes": 79545, - "-schema": 79684, - "-school": 34689, - "-score": 75174, - "-screen": 29260, - "-script": 65960, - "-scripts": 94148, - "-scroll": 34785, - "-scrollbar": 92920, - "-sdk": 35478, - "-se": 7806, - "-search": 19428, - "-season": 30200, - "-seat": 78081, - "-second": 43863, - "-secondary": 29383, - "-secret": 68892, - "-section": 21599, - "-sectional": 96219, - "-sector": 88111, - "-security": 62202, - "-seeking": 98438, - "-select": 20458, - "-selected": 45240, - "-selection": 75705, - "-selector": 76127, - "-self": 41476, - "-selling": 47624, - "-sem": 69689, - "-semibold": 81916, - "-send": 74118, - "-sensitive": 56667, - "-separated": 72692, - "-ser": 25397, - "-series": 56332, - "-serif": 27566, - "-server": 26300, - "-service": 23461, - "-services": 58292, - "-serving": 85986, - "-session": 57181, - "-set": 24096, - "-setting": 60456, - "-settings": 40032, - "-setup": 78097, - "-seven": 78025, - "-sex": 26028, - "-sh": 7514, - "-shadow": 26866, - "-shaped": 34731, - "-share": 59720, - "-shared": 94908, - "-sharing": 54756, - "-sheet": 88966, - "-shell": 74862, - "-shift": 89943, - "-shirt": 33668, - "-shirts": 48660, - "-shop": 74914, - "-shopping": 78442, - "-short": 68651, - "-shot": 63530, - "-show": 30537, - "-side": 24067, - "-sidebar": 34128, - "-sided": 49758, - "-sign": 27953, - "-signed": 92553, - "-simple": 65957, - "-single": 56687, - "-site": 28554, - "-six": 54441, - "-size": 7174, - "-sized": 27835, - "-sizing": 60351, - "-sk": 45307, - "-sl": 58097, - "-slide": 36457, - "-slider": 37733, - "-slot": 87219, - "-sm": 4668, - "-small": 33759, - "-sn": 75450, - "-so": 33019, - "-social": 42029, - "-solid": 57253, - "-solving": 98146, - "-song": 76640, - "-sort": 46540, - "-source": 30774, - "-sp": 22238, - "-space": 27947, - "-spacing": 52373, - "-span": 64060, - "-spe": 52975, - "-speaking": 61190, - "-spec": 57794, - "-special": 92248, - "-specific": 18906, - "-speed": 29599, - "-spin": 80906, - "-spinner": 70110, - "-split": 78412, - "-sponsored": 63550, - "-spot": 97580, - "-square": 32947, - "-src": 48942, - "-st": 5477, - "-stack": 56090, - "-stage": 50156, - "-standard": 53820, - "-standing": 55603, - "-star": 20680, - "-stars": 96906, - "-start": 18935, - "-stat": 72354, - "-state": 20733, - "-states": 89060, - "-static": 49730, - "-stats": 80013, - "-status": 34998, - "-ste": 96326, - "-step": 29208, - "-stock": 87111, - "-stop": 41211, - "-storage": 62795, - "-store": 33252, - "-story": 45099, - "-str": 41628, - "-stream": 38723, - "-string": 30881, - "-strip": 31404, - "-striped": 32775, - "-strokes": 97408, - "-strong": 95757, - "-style": 11297, - "-su": 86129, - "-sub": 17967, - "-submit": 51215, - "-success": 13102, - "-suite": 91574, - "-sum": 75811, - "-summary": 65610, - "-sup": 58515, - "-support": 55947, - "-supported": 87113, - "-sur": 67706, - "-svg": 58569, - "-sw": 61879, - "-switch": 47196, - "-symbol": 87322, - "-sync": 65034, - "-syntax": 82779, - "-system": 36648, - "-t": 2385, - "-tab": 27411, - "-table": 16785, - "-tabs": 31741, - "-tag": 38204, - "-tags": 63814, - "-taking": 79571, - "-talk": 92680, - "-tank": 95028, - "-target": 18489, - "-task": 52579, - "-tax": 57044, - "-te": 48793, - "-team": 42842, - "-tech": 41257, - "-temp": 68190, - "-template": 33409, - "-term": 9663, - "-terminal": 90623, - "-terrorism": 94896, - "-test": 16839, - "-tested": 96073, - "-testid": 89252, - "-testing": 82155, - "-tests": 81094, - "-text": 9345, - "-th": 7563, - "-than": 47654, - "-that": 93500, - "-the": 10603, - "-theme": 33185, - "-themed": 56589, - "-thinking": 98951, - "-third": 29177, - "-thirds": 44626, - "-this": 60191, - "-thread": 60804, - "-threat": 55744, - "-threatening": 61899, - "-three": 48393, - "-through": 42747, - "-thumb": 66196, - "-thumbnail": 63867, - "-thumbnails": 96401, - "-ticket": 93222, - "-tier": 57255, - "-time": 7246, - "-times": 44448, - "-tip": 83229, - "-title": 8816, - "-tm": 70535, - "-to": 4686, - "-toast": 94634, - "-toggle": 9948, - "-toggler": 45294, - "-token": 34841, - "-ton": 74635, - "-tone": 97936, - "-too": 93579, - "-tool": 40224, - "-toolbar": 72790, - "-tools": 44646, - "-tooltip": 60646, - "-top": 8175, - "-topic": 85700, - "-total": 76229, - "-touch": 38926, - "-town": 82903, - "-tr": 10188, - "-tra": 79267, - "-track": 53466, - "-tracking": 93849, - "-trade": 82029, - "-trained": 68924, - "-training": 85370, - "-trans": 38060, - "-transfer": 92691, - "-transform": 32852, - "-transition": 54501, - "-transitional": 91330, - "-translate": 98183, - "-transparent": 74218, - "-trash": 42027, - "-treated": 87086, - "-tree": 40438, - "-trigger": 57987, - "-ts": 94501, - "-turn": 63951, - "-turned": 90446, - "-tw": 97562, - "-twitter": 59090, - "-two": 37402, - "-txt": 98273, - "-type": 10604, - "-types": 20817, - "-u": 45381, - "-ui": 8723, - "-ul": 64970, - "-un": 19892, - "-under": 71107, - "-unit": 60575, - "-unstyled": 80190, - "-unused": 63412, - "-up": 5239, - "-update": 38860, - "-upload": 47169, - "-upper": 53262, - "-uppercase": 59192, - "-ups": 26761, - "-uri": 87232, - "-url": 25443, - "-urlencoded": 44557, - "-us": 25682, - "-use": 24673, - "-used": 68521, - "-user": 8694, - "-users": 43380, - "-using": 92775, - "-util": 73446, - "-utils": 46029, - "-v": 8273, - "-val": 45154, - "-valid": 84810, - "-validate": 89376, - "-validation": 58346, - "-validator": 78574, - "-valu": 80019, - "-value": 19083, - "-values": 69050, - "-var": 85415, - "-variable": 38789, - "-vars": 80633, - "-vector": 65192, - "-ver": 98056, - "-vers": 93936, - "-version": 45367, - "-vertical": 88598, - "-ves": 92809, - "-vesm": 93973, - "-video": 41311, - "-view": 22503, - "-viol": 75727, - "-vis": 81389, - "-visible": 91136, - "-volume": 66768, - "-vous": 44225, - "-vs": 97874, - "-w": 2630, - "-wage": 95876, - "-wall": 85011, - "-war": 47160, - "-warning": 24073, - "-watch": 84296, - "-water": 53951, - "-wave": 88254, - "-way": 26798, - "-we": 61341, - "-web": 29431, - "-webpack": 58799, - "-week": 29509, - "-weight": 12635, - "-west": 37602, - "-wh": 55332, - "-wheel": 61627, - "-white": 15858, - "-wide": 24472, - "-widget": 28912, - "-widgets": 81108, - "-width": 9347, - "-wife": 82835, - "-win": 47689, - "-window": 41766, - "-windows": 97194, - "-wing": 28380, - "-winning": 26777, - "-wise": 44439, - "-with": 26189, - "-word": 37328, - "-work": 28621, - "-worker": 65516, - "-workers": 62284, - "-working": 63892, - "-world": 30084, - "-worthy": 96667, - "-wow": 71532, - "-wrap": 24208, - "-wrapper": 17388, - "-write": 62062, - "-writing": 96665, - "-written": 66283, - "-wsj": 28133, - "-www": 41242, - "-x": 6558, - "-xl": 30946, - "-xs": 9941, - "-y": 12034, - "-yard": 36739, - "-year": 4666, - "-years": 56088, - "-yellow": 72912, - "-you": 45417, - "-your": 52146, - "-yyyy": 75391, - "-z": 9141, - "-zA": 21088, - "-zero": 36929, - "-zone": 77763, - "-{": 63347, - "-être": 84715, - "-Ċ": 6913, - "-ĊĊ": 10452, - "-čĊ": 69127, - ".": 13, - ".!": 61350, - ".\"": 1189, - ".\"\"": 11124, - ".\"\"\"": 74000, - ".\"\"\"Ċ": 14442, - ".\"\"\"ĊĊ": 29184, - ".\"&": 83784, - ".\"'": 34177, - ".\"'\";Ċ": 92213, - ".\"',": 61144, - ".\"','\".$": 84491, - ".\")": 38739, - ".\"));Ċ": 54136, - ".\"),": 82815, - ".\"),Ċ": 62497, - ".\").": 98401, - ".\");": 55435, - ".\");Ċ": 7320, - ".\");ĊĊ": 30458, - ".\");čĊ": 27007, - ".\")]Ċ": 51507, - ".\")Ċ": 13053, - ".\")ĊĊ": 31225, - ".\")čĊ": 63173, - ".\"+": 67047, - ".\",": 10465, - ".\",\"": 47891, - ".\",Ċ": 10346, - ".\",čĊ": 57374, - ".\".": 36911, - ".\"/": 51561, - ".\";": 77355, - ".\";Ċ": 15297, - ".\";ĊĊ": 58724, - ".\";čĊ": 54203, - ".\"<": 55408, - ".\"Ċ": 96705, - "...\"Ċ": 30438, - "...\"ĊĊ": 47486, - "...'": 73338, - "...');Ċ": 67451, - "...')Ċ": 47456, - "...',": 68386, - "...',Ċ": 74740, - "...'Ċ": 80330, - "...(": 92056, - "...)": 32574, - "...)Ċ": 31218, - "...)ĊĊ": 61827, - "...,": 39768, - "....": 1934, - ".....": 18083, - "......": 28149, - ".......": 48611, - "........": 4007, - ".........": 60973, - "..........": 143207, - "...............": 135535, - "................": 7895, - "........................": 56241, - "................................": 16562, - "................................................................": 42269, - "......ĊĊ": 70031, - ".....ĊĊ": 80634, - "....Ċ": 77828, - "....ĊĊ": 20225, - "...": 38681, - "/\"Ċ": 29555, - "/\"ĊĊ": 85312, - "/#": 26559, - "/#{": 42847, - "/$": 10749, - "/$',": 45969, - "/${": 11254, - "/%": 12627, - "/&": 83372, - "/'": 11324, - "/')": 78664, - "/');Ċ": 55979, - "/')Ċ": 48174, - "/'+": 28407, - "/',": 14351, - "/',Ċ": 30493, - "/'.": 70017, - "/'.$": 19010, - "/';Ċ": 43886, - "/';ĊĊ": 95173, - "/'Ċ": 33021, - "/'ĊĊ": 79567, - "/(": 11884, - "/(?": 53780, - "/)": 50807, - "/)Ċ": 53560, - "/*": 1057, - "/*!": 18684, - "/*!Ċ": 24021, - "/**": 3663, - "/***": 69939, - "/********": 66721, - "/****************": 72300, - "/************************": 62622, - "/********************************": 25275, - "/****************************************": 72961, - "/************************************************": 78371, - "/********************************************************": 66159, - "/****************************************************************": 20159, - "/************************************************************************": 11370, - "/****************************************************************************": 22565, - "/********************************************************************************": 75632, - "/************************************************************************************************": 86544, - "/*******************************************************************************Ċ": 36713, - "/******************************************************************************/Ċ": 84999, - "/******************************************************************************Ċ": 53196, - "/*****************************************************************************Ċ": 68132, - "/****************************************************************************Ċ": 58007, - "/***************************************************************************Ċ": 70988, - "/******/": 23996, - "/******/Ċ": 76888, - "/***/": 21724, - "/**/*.": 52565, - "/**<": 69019, - "/**Ċ": 1747, - "/**ĊĊ": 89958, - "/**čĊ": 7534, - "/*------------------------------------------------": 73062, - "/*----------------------------------------------------------------": 29865, - "/*----------------------------------------------------------------------------": 57906, - "/*.": 23540, - "/*/": 91537, - "/*================================================================": 44438, - "/*@": 82594, - "/*Ċ": 3284, - "/*ĊĊ": 49760, - "/*čĊ": 16360, - "/+": 61651, - "/,": 34545, - "/,Ċ": 58658, - "/-": 23650, - "/--": 60487, - "/.": 11930, - "/../": 78380, - "/.Ċ": 75869, - "/.ĊĊ": 83900, - "//": 322, - "//!": 13650, - "//!Ċ": 51752, - "//\"": 77215, - "//#": 14206, - "//$": 20565, - "//'": 44539, - "//(": 95438, - "//*": 21417, - "//****************************************************************": 55263, - "//************************************************************************": 65080, - "//****************************************************************************": 64226, - "//**Ċ": 94714, - "//*[": 76330, - "//*[@": 37318, - "//-": 61463, - "//--": 77517, - "//----------------": 61683, - "//--------------------------------": 48256, - "//------------------------------------------------": 30889, - "//----------------------------------------------------------------": 9888, - "//----------------------------------------------------------------------------": 18012, - "//--------------------------------------------------------------------------------": 50561, - "//------------------------------------------------------------------------------------------------": 56342, - "//----------------------------------------------------------------------------------------------------------------": 89180, - "//------------------------------------------------------------------------------Ċ": 45814, - "//------------------------------------------------------------------------------ĊĊ": 87567, - "//-----------------------------------------------------------------------------Ċ": 44142, - "//----------------------------------------------------------------------------Ċ": 78938, - "//---------------------------------------------------------------------------Ċ": 57307, - "//---------------------------------------------------------------------------ĊĊ": 94464, - "//--------------------------------------------------------------Ċ": 81042, - "///": 2575, - "////": 725, - "/////": 97656, - "////////": 1145, - "////////////": 16862, - "////////////////": 1970, - "////////////////////////////////": 3898, - "////////////////////////////////////////////////": 27405, - "////////////////////////////////////////////////////": 82845, - "////////////////////////////////////////////////////////": 60908, - "////////////////////////////////////////////////////////////": 64575, - "////////////////////////////////////////////////////////////////": 9822, - "////////////////////////////////////////////////////////////////////": 43200, - "////////////////////////////////////////////////////////////////////////": 35109, - "////////////////////////////////////////////////////////////////////////////": 27183, - "////////////////////////////////////////////////////////////////////////////////": 28226, - "////////////////////////////////////////////////////////////////////////////////////////////////": 60629, - "////////////////////////////////////////////////////////////////////////////////Ċ": 58869, - "////////////////////////////////////////////////////////////////////////////////ĊĊ": 98320, - "///////////////////////////////////////////////////////////////////////////////Ċ": 76737, - "/////////////////////////////////////////////////////////////////////////////Ċ": 83894, - "////Ċ": 59867, - "///<": 43726, - "///Ċ": 15374, - "///ĊĊ": 47144, - "///čĊ": 63458, - "//:": 91129, - "//=": 68206, - "//===": 78712, - "//================================================": 76507, - "//================================================================": 23161, - "//================================================================================": 94303, - "//@": 36585, - "//[": 65637, - "//{{": 77146, - "//{Ċ": 47603, - "//}}": 92055, - "//}Ċ": 36323, - "//}ĊĊ": 55342, - "//Ċ": 2289, - "//ĊĊ": 6320, - "//ĊĊĊ": 84741, - "//čĊ": 14015, - "//čĊčĊ": 65870, - "/:": 11315, - "/;Ċ": 79795, - "/<": 23012, - "/": 9685, - "/>\";Ċ": 67708, - "/>.": 95908, - "/>.Ċ": 21005, - "/>.ĊĊ": 51278, - "/><": 32487, - "/>\\": 98408, - "/>Ċ": 10171, - "/>ĊĊ": 68601, - "/>čĊ": 48527, - "/?": 17763, - "/@": 38662, - "/A": 10360, - "/AFP": 68315, - "/AIDS": 92546, - "/AP": 59129, - "/API": 72030, - "/Add": 98619, - "/Admin": 56556, - "/App": 42746, - "/Application": 88204, - "/Area": 85341, - "/Auth": 86280, - "/B": 16276, - "/Base": 95383, - "/Branch": 76981, - "/Button": 46196, - "/C": 11295, - "/Card": 57489, - "/Common": 78086, - "/Core": 54164, - "/Create": 62050, - "/D": 14953, - "/DD": 81961, - "/DTD": 75614, - "/Data": 50239, - "/Delete": 63675, - "/Desktop": 48499, - "/Dk": 96620, - "/Documents": 54730, - "/E": 25646, - "/Edit": 59436, - "/Error": 96259, - "/F": 12318, - "/File": 64068, - "/Footer": 84080, - "/Form": 72820, - "/Foundation": 33925, - "/Framework": 80509, - "/G": 15792, - "/GL": 82323, - "/GPL": 84006, - "/Game": 84953, - "/Gate": 88820, - "/Getty": 20890, - "/Graphics": 66250, - "/Grid": 81696, - "/H": 23354, - "/Header": 59960, - "/Home": 40815, - "/I": 38151, - "/INFO": 48957, - "/IP": 84438, - "/Image": 81265, - "/Images": 91749, - "/Index": 88151, - "/Input": 76818, - "/Instruction": 76759, - "/Internal": 70435, - "/J": 31701, - "/K": 32854, - "/L": 7434, - "/LICENSE": 10845, - "/Layout": 87155, - "/Library": 59077, - "/Linux": 94325, - "/List": 76397, - "/Login": 54803, - "/M": 10270, - "/MIT": 85163, - "/MM": 37360, - "/MPL": 63519, - "/Main": 65241, - "/Math": 98717, - "/N": 20290, - "/New": 81249, - "/O": 17532, - "/OR": 93248, - "/Object": 68526, - "/Observable": 95655, - "/Open": 96662, - "/P": 16341, - "/Page": 94639, - "/Peak": 89724, - "/Private": 74777, - "/Product": 77738, - "/Public": 64533, - "/Q": 45274, - "/R": 19382, - "/Register": 81269, - "/Resources": 76099, - "/Runtime": 82636, - "/S": 11374, - "/Search": 78893, - "/Set": 51554, - "/Sh": 76202, - "/St": 84440, - "/String": 36264, - "/Sub": 49972, - "/Subthreshold": 57844, - "/System": 91274, - "/T": 16731, - "/TR": 52327, - "/Table": 79609, - "/Test": 80527, - "/The": 47748, - "/Typography": 83539, - "/U": 62010, - "/UI": 74883, - "/UIKit": 23679, - "/User": 33511, - "/Users": 97821, - "/V": 27233, - "/W": 22175, - "/Web": 50438, - "/WebAPI": 94897, - "/X": 32979, - "/XML": 48624, - "/XMLSchema": 53266, - "/Y": 39249, - "/YYYY": 81122, - "/Z": 71960, - "/[": 44510, - "/\\": 34319, - "/]": 73977, - "/^": 70867, - "/_": 19632, - "/__": 79463, - "/a": 14186, - "/about": 42516, - "/ac": 69471, - "/access": 72356, - "/account": 47920, - "/accounts": 83743, - "/action": 54765, - "/actions": 39121, - "/activity": 97618, - "/ad": 44460, - "/add": 19627, - "/address": 90665, - "/admin": 17402, - "/ag": 64031, - "/ajax": 24221, - "/al": 52120, - "/alert": 79688, - "/all": 31406, - "/am": 55417, - "/an": 55492, - "/android": 51825, - "/angular": 40051, - "/animate": 88283, - "/animations": 77394, - "/antlr": 69630, - "/ap": 24670, - "/apache": 38737, - "/api": 10508, - "/apimachinery": 72644, - "/apis": 66152, - "/app": 10640, - "/apple": 75603, - "/application": 33032, - "/apps": 50887, - "/apt": 86665, - "/ar": 95420, - "/arch": 59973, - "/archive": 71627, - "/arm": 88544, - "/array": 95838, - "/art": 55549, - "/article": 38181, - "/articles": 54034, - "/as": 72483, - "/assert": 71625, - "/assets": 21442, - "/at": 80730, - "/audio": 71247, - "/auth": 17369, - "/authentication": 90577, - "/auto": 91250, - "/autoload": 69863, - "/avatar": 58140, - "/aws": 41273, - "/ay": 83558, - "/ayushman": 86923, - "/b": 3470, - "/back": 59948, - "/backend": 70020, - "/background": 82445, - "/banner": 84676, - "/bar": 49513, - "/base": 26090, - "/bash": 17148, - "/basic": 77909, - "/be": 58689, - "/bg": 59552, - "/big": 90936, - "/bin": 8749, - "/bind": 84480, - "/bit": 86644, - "/bl": 89193, - "/black": 98545, - "/blob": 34827, - "/block": 59981, - "/blog": 37462, - "/blue": 97916, - "/board": 97430, - "/body": 61111, - "/book": 52284, - "/books": 71263, - "/boot": 88876, - "/bootstrap": 9841, - "/bower": 85056, - "/browse": 90281, - "/browser": 43023, - "/build": 30593, - "/bus": 96916, - "/business": 84828, - "/button": 54308, - "/buttons": 72180, - "/by": 67733, - "/c": 2899, - "/ca": 80591, - "/cache": 62094, - "/cal": 91734, - "/calendar": 76717, - "/callback": 91527, - "/car": 65659, - "/card": 61309, - "/cards": 70889, - "/cart": 56677, - "/cat": 92807, - "/catalog": 76098, - "/categories": 75930, - "/category": 46333, - "/cc": 87310, - "/cgi": 70416, - "/ch": 21284, - "/change": 81586, - "/channel": 73121, - "/chart": 73941, - "/chat": 71335, - "/check": 46619, - "/cl": 55931, - "/class": 25514, - "/classes": 47058, - "/cli": 82604, - "/client": 25085, - "/close": 94308, - "/cloud": 57800, - "/cm": 69198, - "/cmd": 83033, - "/cms": 97866, - "/co": 64942, - "/code": 46928, - "/color": 43898, - "/colors": 71293, - "/column": 89274, - "/com": 25093, - "/command": 83205, - "/comment": 73980, - "/comments": 48825, - "/common": 11356, - "/commons": 91567, - "/community": 92477, - "/company": 79943, - "/compiler": 82694, - "/component": 62958, - "/components": 20261, - "/con": 31236, - "/conf": 59241, - "/config": 14730, - "/configuration": 89442, - "/connect": 78489, - "/connection": 93406, - "/console": 96269, - "/constants": 45188, - "/contact": 45936, - "/container": 83897, - "/content": 27917, - "/contentassist": 93126, - "/context": 77766, - "/control": 82667, - "/controller": 58813, - "/controllers": 51646, - "/cop": 66659, - "/copyleft": 70953, - "/core": 5320, - "/count": 81043, - "/course": 84349, - "/cpp": 88201, - "/cpu": 77317, - "/create": 25577, - "/crypto": 84229, - "/cs": 91635, - "/css": 6710, - "/csv": 92128, - "/cupertino": 86955, - "/current": 74053, - "/custom": 34665, - "/customer": 70256, - "/d": 3446, - "/dashboard": 41161, - "/dat": 37566, - "/data": 13167, - "/dataTables": 59540, - "/database": 41605, - "/datatables": 47370, - "/date": 74564, - "/day": 44739, - "/db": 29357, - "/dc": 97333, - "/dd": 44881, - "/de": 22549, - "/debug": 67479, - "/default": 28989, - "/delete": 32275, - "/demo": 55160, - "/design": 83157, - "/desktop": 97579, - "/detail": 40823, - "/details": 59265, - "/dev": 35061, - "/device": 68365, - "/devices": 80397, - "/dialog": 52446, - "/dir": 88226, - "/dis": 41510, - "/disable": 87377, - "/disc": 95454, - "/display": 73329, - "/dist": 19537, - "/div": 22013, - "/do": 82638, - "/doc": 39510, - "/docker": 61764, - "/docs": 25967, - "/document": 46388, - "/documentation": 85586, - "/documents": 97090, - "/dom": 71344, - "/domain": 71972, - "/down": 79067, - "/download": 33630, - "/downloads": 89185, - "/dr": 48054, - "/drivers": 86647, - "/e": 16546, - "/ec": 73058, - "/edit": 21345, - "/editor": 75806, - "/effects": 91708, - "/el": 88658, - "/em": 62776, - "/email": 61649, - "/embed": 58653, - "/en": 13606, - "/end": 82846, - "/engine": 82045, - "/english": 71009, - "/entities": 65885, - "/entity": 66908, - "/env": 14358, - "/environment": 54482, - "/epl": 59303, - "/error": 41737, - "/errors": 57131, - "/es": 38428, - "/etc": 47047, - "/event": 40763, - "/events": 42764, - "/ex": 25815, - "/example": 65182, - "/examples": 67020, - "/exec": 90905, - "/exp": 65459, - "/export": 66948, - "/ext": 81143, - "/extensions": 72482, - "/f": 6663, - "/fa": 87562, - "/facebook": 75988, - "/false": 91233, - "/fast": 92351, - "/favicon": 48557, - "/features": 69313, - "/feed": 93730, - "/file": 23903, - "/filepath": 96442, - "/files": 33220, - "/filter": 63524, - "/find": 81121, - "/fire": 53010, - "/firebase": 66756, - "/fixtures": 94275, - "/fl": 58303, - "/flutter": 62593, - "/font": 25123, - "/fontawesome": 97537, - "/fonts": 60667, - "/foo": 60555, - "/footer": 26844, - "/form": 20260, - "/format": 92340, - "/forms": 25424, - "/forum": 62135, - "/fr": 80870, - "/frame": 67991, - "/framework": 81724, - "/free": 55694, - "/from": 91106, - "/front": 84067, - "/frontend": 73163, - "/fs": 73036, - "/full": 62975, - "/function": 70643, - "/functions": 56810, - "/fw": 60193, - "/fwlink": 62476, - "/g": 4846, - "/gallery": 67980, - "/game": 48191, - "/games": 88311, - "/gcc": 89848, - "/ge": 68748, - "/gen": 81753, - "/general": 65961, - "/generated": 79372, - "/get": 23302, - "/gif": 90831, - "/gin": 78624, - "/git": 60590, - "/github": 71120, - "/gl": 60662, - "/global": 38984, - "/go": 25525, - "/google": 40689, - "/goto": 92020, - "/gpio": 96649, - "/gpl": 37958, - "/gr": 40336, - "/graph": 72177, - "/graphql": 93308, - "/grid": 77341, - "/group": 53389, - "/groups": 77685, - "/grpc": 96047, - "/gtest": 70611, - "/gui": 55202, - "/h": 7530, - "/hash": 76784, - "/he": 77056, - "/head": 54312, - "/header": 24655, - "/help": 78930, - "/helper": 79285, - "/helpers": 41426, - "/her": 37907, - "/high": 58135, - "/history": 81883, - "/home": 18215, - "/hooks": 92519, - "/host": 90119, - "/how": 50326, - "/hr": 74901, - "/html": 13739, - "/http": 15627, - "/i": 16438, - "/ic": 76398, - "/icon": 29298, - "/icons": 18908, - "/id": 38146, - "/if": 91183, - "/il": 97565, - "/im": 72024, - "/image": 23349, - "/images": 9737, - "/img": 13670, - "/import": 87284, - "/in": 17996, - "/inc": 72388, - "/include": 26393, - "/includes": 63659, - "/index": 9022, - "/inet": 83081, - "/info": 54976, - "/init": 42948, - "/input": 39990, - "/install": 56951, - "/int": 31114, - "/interface": 47122, - "/interfaces": 59771, - "/internal": 30968, - "/io": 41390, - "/ion": 84853, - "/ioutil": 61246, - "/ip": 54919, - "/is": 46427, - "/issues": 38745, - "/item": 43996, - "/items": 61259, - "/j": 4437, - "/jav": 86357, - "/java": 47200, - "/javascript": 9837, - "/job": 77402, - "/jpeg": 51818, - "/jquery": 9576, - "/js": 9113, - "/json": 8931, - "/k": 14109, - "/kernel": 58343, - "/key": 68864, - "/kg": 44770, - "/kubernetes": 79587, - "/l": 13328, - "/lab": 94198, - "/lang": 25253, - "/language": 88436, - "/latest": 33149, - "/layout": 40010, - "/layouts": 89117, - "/left": 97089, - "/legal": 47036, - "/lg": 79020, - "/lgpl": 83850, - "/li": 88381, - "/lib": 8194, - "/library": 45446, - "/libs": 22755, - "/lic": 6580, - "/license": 43986, - "/licenses": 6971, - "/light": 76844, - "/link": 55431, - "/linux": 63844, - "/list": 20936, - "/lists": 98281, - "/live": 94212, - "/load": 71896, - "/loader": 93128, - "/loading": 83235, - "/local": 22270, - "/locale": 84039, - "/location": 91505, - "/log": 19413, - "/logger": 70277, - "/logging": 80074, - "/login": 16543, - "/logo": 28547, - "/logout": 56097, - "/logs": 77554, - "/m": 3183, - "/mL": 92322, - "/mac": 80716, - "/mail": 60819, - "/main": 15351, - "/mainwindow": 81898, - "/man": 72192, - "/manage": 81117, - "/manual": 73095, - "/map": 41081, - "/maps": 36793, - "/mark": 73598, - "/master": 23303, - "/mat": 84600, - "/material": 14831, - "/math": 59705, - "/max": 62599, - "/md": 74823, - "/me": 50899, - "/media": 29506, - "/member": 75062, - "/memory": 79671, - "/menu": 39983, - "/message": 50624, - "/messages": 71753, - "/met": 90228, - "/meta": 69207, - "/method": 91837, - "/min": 44173, - "/misc": 77686, - "/mit": 93847, - "/ml": 59548, - "/mm": 55180, - "/mobile": 69925, - "/mock": 90386, - "/mod": 38479, - "/modal": 74201, - "/model": 24882, - "/models": 20268, - "/module": 48185, - "/modules": 22903, - "/mol": 38871, - "/moment": 83947, - "/month": 47317, - "/movie": 71777, - "/mp": 62483, - "/ms": 58634, - "/msg": 80765, - "/music": 77770, - "/my": 34198, - "/mysql": 57515, - "/n": 9612, - "/name": 75992, - "/native": 75187, - "/nav": 68236, - "/navbar": 81806, - "/navigation": 83265, - "/ne": 89310, - "/net": 38065, - "/network": 47658, - "/new": 25376, - "/news": 27355, - "/ng": 44043, - "/nginx": 69261, - "/no": 33100, - "/node": 37211, - "/non": 91130, - "/not": 62441, - "/notification": 96542, - "/npm": 63920, - "/ns": 82492, - "/null": 19293, - "/o": 20271, - "/oauth": 60703, - "/object": 59489, - "/oct": 59182, - "/octet": 79832, - "/of": 96745, - "/off": 50806, - "/on": 86537, - "/op": 52000, - "/open": 37644, - "/operator": 68341, - "/operators": 46481, - "/opt": 87196, - "/options": 72102, - "/or": 5144, - "/order": 43395, - "/orders": 82818, - "/org": 41361, - "/original": 98137, - "/os": 57892, - "/out": 48316, - "/output": 47016, - "/owl": 68618, - "/p": 4322, - "/package": 64000, - "/packages": 72919, - "/page": 32180, - "/pages": 29078, - "/parser": 61770, - "/part": 48981, - "/pass": 67070, - "/password": 59470, - "/path": 50976, - "/pay": 72423, - "/payment": 81821, - "/pdf": 47751, - "/people": 87684, - "/per": 43985, - "/perl": 77122, - "/person": 56461, - "/pg": 98234, - "/ph": 89021, - "/photo": 51392, - "/photos": 49775, - "/php": 41773, - "/pi": 62228, - "/pkg": 22523, - "/pl": 11255, - "/place": 60775, - "/plain": 36971, - "/platform": 27294, - "/play": 81092, - "/player": 59503, - "/plugin": 51372, - "/plugins": 20797, - "/pm": 97989, - "/png": 35960, - "/pol": 92750, - "/pop": 91275, - "/popper": 48152, - "/port": 71377, - "/portfolio": 87203, - "/post": 29996, - "/posts": 51311, - "/power": 86696, - "/pp": 87146, - "/pr": 44672, - "/pre": 36259, - "/preferences": 75484, - "/print": 92221, - "/private": 81001, - "/pro": 18008, - "/problem": 79997, - "/problems": 49216, - "/process": 86780, - "/product": 24788, - "/products": 33480, - "/profile": 23580, - "/project": 40118, - "/projects": 39606, - "/prom": 76951, - "/proto": 97766, - "/provider": 74997, - "/providers": 82543, - "/pub": 59492, - "/public": 22041, - "/py": 90834, - "/python": 23266, - "/q": 33894, - "/qt": 89976, - "/qu": 78845, - "/query": 66762, - "/question": 94623, - "/questions": 43319, - "/r": 7382, - "/rand": 95978, - "/random": 79442, - "/raw": 75909, - "/rc": 95502, - "/re": 10758, - "/react": 27417, - "/read": 69199, - "/rec": 84094, - "/red": 77900, - "/ref": 55763, - "/reference": 65780, - "/reg": 86858, - "/register": 37837, - "/release": 88648, - "/releases": 58187, - "/rem": 81771, - "/remove": 74930, - "/render": 83201, - "/renderer": 89429, - "/report": 62385, - "/repos": 49505, - "/repository": 97548, - "/request": 53007, - "/res": 32426, - "/reset": 70003, - "/resource": 53100, - "/resources": 38900, - "/respond": 66463, - "/response": 98804, - "/rest": 45265, - "/result": 82907, - "/results": 77174, - "/rfc": 93982, - "/right": 73101, - "/root": 72074, - "/ros": 83846, - "/router": 18546, - "/routes": 62970, - "/rs": 91885, - "/rss": 85291, - "/rules": 95489, - "/run": 48385, - "/runtime": 39298, - "/s": 2687, - "/sample": 69851, - "/save": 69027, - "/sbin": 72435, - "/sc": 33474, - "/schema": 61142, - "/screen": 97990, - "/screens": 59386, - "/script": 55678, - "/scripts": 39372, - "/sdk": 79760, - "/se": 59587, - "/search": 23167, - "/sec": 60071, - "/security": 71422, - "/select": 37346, - "/self": 68239, - "/send": 69736, - "/server": 37255, - "/service": 34186, - "/services": 22258, - "/session": 54760, - "/set": 47267, - "/settings": 29866, - "/settingsdialog": 68579, - "/setup": 77443, - "/sh": 14688, - "/share": 33914, - "/shared": 25948, - "/she": 56595, - "/shop": 61877, - "/show": 34175, - "/sidebar": 72907, - "/sign": 35763, - "/signup": 68763, - "/simple": 67195, - "/single": 96562, - "/site": 47881, - "/sites": 67502, - "/sl": 82577, - "/slick": 96224, - "/slider": 90739, - "/sm": 74037, - "/small": 96816, - "/sn": 71591, - "/social": 91508, - "/socket": 55480, - "/software": 78727, - "/source": 54373, - "/sources": 96690, - "/sp": 26734, - "/span": 90345, - "/spec": 45389, - "/sql": 59682, - "/src": 13437, - "/ss": 87602, - "/st": 14272, - "/star": 79264, - "/start": 69976, - "/stat": 42525, - "/state": 63796, - "/static": 36643, - "/stats": 94933, - "/status": 32518, - "/std": 21546, - "/stdc": 24121, - "/storage": 53345, - "/store": 31320, - "/story": 78389, - "/stream": 87434, - "/stretch": 75116, - "/stretchr": 76519, - "/string": 54544, - "/student": 82031, - "/style": 28717, - "/styles": 27788, - "/sub": 37885, - "/support": 60370, - "/svg": 32800, - "/sw": 42934, - "/swagger": 80930, - "/sweetalert": 92481, - "/sys": 41836, - "/system": 28139, - "/t": 5523, - "/tab": 78859, - "/table": 45326, - "/tag": 76196, - "/tags": 84460, - "/target": 88868, - "/task": 58186, - "/tasks": 81337, - "/tcp": 95958, - "/team": 78015, - "/temp": 70445, - "/template": 37094, - "/templates": 38941, - "/terms": 96763, - "/test": 12697, - "/testify": 76702, - "/testing": 28801, - "/tests": 62468, - "/text": 36271, - "/th": 20439, - "/the": 51257, - "/theme": 40081, - "/themes": 37065, - "/thread": 72144, - "/thumb": 79941, - "/time": 35263, - "/tiny": 72405, - "/tinyos": 84369, - "/title": 81946, - "/tmp": 57008, - "/to": 32429, - "/todo": 93214, - "/token": 54386, - "/tool": 75027, - "/tools": 45714, - "/top": 35282, - "/topic": 92969, - "/topics": 57662, - "/tos": 80945, - "/tr": 21485, - "/train": 50838, - "/trans": 80121, - "/tree": 62978, - "/trunk": 78680, - "/ts": 99046, - "/tty": 84861, - "/tutorial": 85252, - "/twitter": 82228, - "/type": 49611, - "/types": 20384, - "/u": 33566, - "/ubuntu": 79926, - "/ui": 22444, - "/umd": 83199, - "/un": 35217, - "/unit": 78311, - "/up": 71843, - "/update": 29832, - "/upload": 37173, - "/uploads": 29581, - "/url": 57254, - "/us": 62431, - "/use": 62272, - "/user": 11739, - "/users": 19178, - "/usr": 54338, - "/util": 22610, - "/utility": 95726, - "/utils": 21902, - "/v": 5457, - "/validation": 97800, - "/value": 57542, - "/values": 96985, - "/var": 92146, - "/vector": 80382, - "/vendor": 35663, - "/vendors": 72029, - "/version": 64413, - "/video": 41303, - "/videos": 72945, - "/view": 22489, - "/views": 20370, - "/vnd": 42701, - "/vue": 71597, - "/w": 6324, - "/wait": 86103, - "/watch": 26213, - "/we": 53686, - "/weather": 77758, - "/web": 21808, - "/welcome": 86697, - "/widget": 33336, - "/widgets": 42836, - "/wiki": 25502, - "/win": 97718, - "/window": 79243, - "/windows": 75349, - "/work": 35062, - "/workspace": 93381, - "/world": 78892, - "/wp": 30746, - "/write": 64264, - "/ws": 91021, - "/www": 26550, - "/x": 10776, - "/xhtml": 34132, - "/xml": 36524, - "/y": 26491, - "/year": 84900, - "/yyyy": 42651, - "/z": 31082, - "/{": 9388, - "/{$": 78658, - "/{{": 66839, - "/{{$": 68665, - "/{}/": 92509, - "/~": 53796, - "/Ċ": 5894, - "/ĊĊ": 8680, - "/ĊĊĊ": 75258, - "/ĊĊĊĊ": 75960, - "/čĊ": 29110, - "/čĊčĊ": 72534, - "0": 15, - "1": 16, - "2": 17, - "3": 18, - "4": 19, - "5": 20, - "6": 21, - "7": 22, - "8": 23, - "9": 24, - ":": 25, - ":!": 98324, - ":\"": 2974, - ":\"\",": 83131, - ":\"\",Ċ": 79389, - ":\"#": 79729, - ":\")": 90220, - ":\");Ċ": 24305, - ":\");ĊĊ": 70571, - ":\");čĊ": 67618, - ":\")Ċ": 34403, - ":\"+": 28798, - ":\",": 12147, - ":\",Ċ": 55120, - ":\"-": 86789, - ":\"-\"`Ċ": 98899, - ":\".": 95740, - ":\".$": 91920, - ":\";Ċ": 28669, - ":\";čĊ": 83359, - ":\"<<": 69034, - ":\"Ċ": 34300, - ":#": 14111, - ":$": 21701, - ":${": 37454, - ":%": 7533, - ":&": 35218, - ":'": 4884, - ":'#": 54602, - ":''": 95727, - ":'',": 96403, - ":'',Ċ": 54443, - ":')": 79895, - ":');Ċ": 93728, - ":')Ċ": 53781, - ":'+": 75316, - ":',": 17440, - ":',Ċ": 43355, - ":'.$": 75984, - ":'/": 70282, - ":';Ċ": 85568, - ":'Ċ": 91088, - ":(": 3269, - ":)": 28489, - ":)])": 95804, - ":)];Ċ": 89036, - ":)Ċ": 82630, - ":*": 53386, - ":**": 66963, - ":+": 12225, - ":,": 41239, - ":-": 10944, - ":-------------": 96178, - ":?": 76475, - ":@": 14882, - ":@\"": 5466, - ":@\"\"": 75306, - ":@\"%": 29752, - ":@\"%@": 54721, - ":@\"%@\",": 77741, - ":@{": 88877, - ":A": 55648, - ":Add": 54676, - ":Any": 97192, - ":Array": 49033, - ":B": 81268, - ":Boolean": 46084, - ":C": 55992, - ":CGPoint": 89369, - ":CGRect": 26651, - ":CGRectMake": 28509, - ":D": 63843, - ":E": 84488, - ":Event": 93164, - ":F": 69856, - ":Get": 21083, - ":H": 94192, - ":I": 57155, - ":Int": 43979, - ":Is": 46551, - ":L": 69233, - ":M": 65207, - ":N": 37694, - ":NO": 37457, - ":NS": 23787, - ":NSLayout": 89752, - ":NSLocalizedString": 93095, - ":NSMakeRange": 90282, - ":NSUTF": 75121, - ":Number": 35004, - ":Object": 65292, - ":P": 92411, - ":Register": 65339, - ":S": 75369, - ":Set": 15606, - ":SetPoint": 90305, - ":SetText": 95098, - ":String": 15816, - ":System": 69112, - ":T": 68661, - ":The": 74045, - ":UI": 16487, - ":UIAlert": 91507, - ":UIButtonType": 86261, - ":UIButtonTypeCustom": 98159, - ":UIControl": 24094, - ":UIControlEvent": 51468, - ":UIControlEventTouchUpInside": 57828, - ":UIControlState": 30959, - ":UIControlStateNormal": 34029, - ":UITableView": 66099, - ":X": 83530, - ":YES": 19566, - ":[": 7259, - ":[\"": 81262, - ":['": 69287, - ":[[": 52192, - ":[],Ċ": 90415, - ":[Ċ": 64772, - ":\\": 7190, - ":\\\"": 75035, - ":\\/\\/": 15325, - ":\\\\": 23817, - ":]": 28283, - ":])": 95849, - ":])Ċ": 43057, - ":],": 45499, - ":].": 72559, - ":]:Ċ": 75781, - ":]Ċ": 24135, - ":]ĊĊ": 64631, - ":^": 37933, - ":^(": 20281, - ":^{Ċ": 49348, - ":_": 22035, - ":`": 18736, - ":`~": 77802, - ":a": 43833, - ":absolute": 62239, - ":add": 38488, - ":aload": 60005, - ":animated": 59400, - ":any": 31466, - ":async": 92803, - ":auto": 57764, - ":b": 43973, - ":before": 79157, - ":bg": 68149, - ":black": 70686, - ":block": 57628, - ":bold": 49722, - ":boolean": 41937, - ":border": 97128, - ":both": 95716, - ":c": 48031, - ":center": 27678, - ":checked": 97381, - ":class": 91964, - ":convert": 95615, - ":create": 58584, - ":d": 40422, - ":data": 41784, - ":date": 93263, - ":def": 22582, - ":description": 93323, - ":disable": 42066, - ":e": 55976, - ":end": 25789, - ":eq": 62671, - ":error": 69195, - ":event": 18254, - ":expr": 96011, - ":f": 55477, - ":false": 22110, - ":first": 53374, - ":flex": 86885, - ":flutter": 16784, - ":focus": 88358, - ":frame": 77674, - ":function": 17934, - ":g": 70418, - ":get": 24907, - ":green": 95731, - ":h": 69651, - ":hidden": 72631, - ":host": 72361, - ":hover": 32721, - ":href": 95797, - ":http": 69459, - ":i": 14665, - ":id": 39125, - ":image": 37670, - ":index": 46088, - ":indexPath": 42293, - ":init": 48952, - ":initComponents": 56373, - ":inline": 67942, - ":int": 14337, - ":invoke": 94584, - ":item": 78852, - ":j": 57558, - ":k": 57071, - ":key": 64849, - ":l": 88397, - ":last": 67692, - ":left": 34810, - ":len": 77899, - ":length": 29296, - ":list": 78079, - ":m": 30286, - ":maj": 59873, - ":max": 82494, - ":message": 91473, - ":min": 83675, - ":mm": 20133, - ":model": 65615, - ":mysql": 85276, - ":n": 19266, - ":name": 57520, - ":new": 44755, - ":nil": 15002, - ":no": 66479, - ":none": 21869, - ":normal": 91177, - ":not": 67844, - ":nth": 37964, - ":null": 53098, - ":num": 55268, - ":number": 34040, - ":numel": 91081, - ":o": 93557, - ":on": 94876, - ":p": 44389, - ":param": 67316, - ":params": 95011, - ":path": 71796, - ":pk": 94541, - ":pointer": 71140, - ":r": 67359, - ":red": 41584, - ":relative": 84566, - ":req": 69739, - ":request": 81995, - ":result": 95161, - ":return": 66302, - ":right": 42352, - ":s": 14495, - ":selected": 54354, - ":self": 10899, - ":semicolon": 46717, - ":set": 23854, - ":size": 41621, - ":ss": 25734, - ":start": 87090, - ":str": 61296, - ":string": 22423, - ":t": 60777, - ":test": 84476, - ":text": 34952, - ":this": 37612, - ":title": 58649, - ":true": 18251, - ":type": 46445, - ":uint": 62921, - ":update": 91809, - ":url": 35730, - ":user": 64280, - ":utf": 55022, - ":v": 52649, - ":value": 62856, - ":variables": 56205, - ":view": 77380, - ":void": 28949, - ":w": 52882, - ":white": 50816, - ":x": 35254, - ":y": 69203, - ":{": 12547, - ":{}": 79411, - ":{Ċ": 17894, - ":{čĊ": 83051, - ":Ċ": 510, - ":ĊĊ": 1447, - ":ĊĊĊ": 24391, - ":ĊĊĊĊ": 14223, - ":ĊĊĊĊĊĊ": 47446, - ":čĊ": 2834, - ":čĊčĊ": 31980, - ";": 26, - ";!": 98473, - ";\"": 10892, - ";\");Ċ": 34649, - ";\")Ċ": 91812, - ";\",": 32503, - ";\",Ċ": 64497, - ";\";Ċ": 39678, - ";\">": 12350, - ";\"><": 29652, - ";\">Ċ": 12143, - ";\">čĊ": 49048, - ";\"Ċ": 41655, - ";$": 25675, - ";%": 38402, - ";&": 8009, - ";&#": 50222, - ";'": 35994, - ";');Ċ": 95674, - ";',": 47186, - ";',Ċ": 45385, - ";';Ċ": 69646, - ";'>": 46639, - ";'Ċ": 98319, - ";(": 57709, - ";)": 36174, - ";*/Ċ": 62403, - ";++": 36507, - ";,": 71554, - ";-": 54433, - ";.": 78698, - ";/": 20560, - ";/*": 86229, - ";//": 9361, - ";;": 6768, - ";;;": 36328, - ";;;;": 22789, - ";;;;;;;;": 40300, - ";;;;;;;;;;;;;;;;": 71409, - ";;Ċ": 28207, - ";;ĊĊ": 72931, - ";<": 35058, - ";": 24904, - ";?>\"": 52736, - ";?>Ċ": 39569, - ";\\": 17882, - ";\\\">": 93162, - ";\\Ċ": 55783, - ";]/": 90838, - ";a": 48222, - ";amp": 19933, - ";b": 54933, - ";background": 49954, - ";base": 81860, - ";border": 35779, - ";br": 78692, - ";break": 86879, - ";c": 78632, - ";charset": 45017, - ";color": 39691, - ";d": 99149, - ";display": 85565, - ";element": 74162, - ";font": 27056, - ";height": 43041, - ";i": 4696, - ";if": 81004, - ";j": 13061, - ";k": 34996, - ";l": 81628, - ";left": 90350, - ";line": 85173, - ";m": 67236, - ";margin": 31927, - ";n": 46703, - ";o": 93449, - ";p": 55913, - ";padding": 35129, - ";q": 60899, - ";r": 85308, - ";s": 39414, - ";set": 80389, - ";t": 53747, - ";text": 44385, - ";top": 81754, - ";width": 39336, - ";x": 54621, - ";y": 70863, - ";z": 96712, - ";}": 30031, - ";};Ċ": 86637, - ";}Ċ": 12084, - ";}ĊĊ": 33498, - ";}čĊ": 39528, - ";Ċ": 280, - ";ĊĊ": 401, - ";ĊĊĊ": 5210, - ";ĊĊĊĊ": 22116, - ";ĊĊĊĊĊ": 69494, - ";čĊ": 463, - ";čĊčĊ": 1926, - ";čĊčĊčĊ": 22367, - ";čĊčĊčĊčĊ": 86232, - ";ččĊ": 44122, - ";čččĊ": 67796, - "<": 27, - "": 71698, - "<*": 78822, - "<-": 45342, - "": 128247, - "<::": 87398, - "<<": 2442, - "<<\"": 7753, - "<<\"\\": 28777, - "<<(": 32484, - "<<<": 12603, - "<<<<": 35684, - "<<<<<<<": 66838, - "<<<<<<<<": 82128, - "<=": 8203, - "<=$": 87990, - "<=(": 80961, - "<>": 21122, - "<>(": 20591, - "<>(\"": 89039, - "<>();Ċ": 10874, - "<>();ĊĊ": 28389, - "<>();čĊ": 50721, - "<>Ċ": 62537, - "": 19542, - ">": 74094, - "": 128245, - "": 128244, - "Ċ": 76216, - "=\"\";Ċ": 26794, - "=\"\";čĊ": 67924, - "=\"\">": 18261, - "=\"\"><": 49570, - "=\"\">Ċ": 17419, - "=\"\">čĊ": 77962, - "=\"\"Ċ": 33418, - "=\"#": 4649, - "=\"#\"": 13395, - "=\"#\">": 15250, - "=\"#\"><": 27590, - "=\"#\">Ċ": 39945, - "=\"$": 20227, - "=\"$(": 46434, - "=\"${": 20451, - "=\"%": 35220, - "=\"'": 15509, - "=\"'+": 35970, - "=\"'.": 37317, - "=\"'.$": 22469, - "=\"(": 78239, - "=\").": 75244, - "=\");Ċ": 45219, - "=\"+": 14095, - "=\",": 21369, - "=\"-": 23948, - "=\"--": 98298, - "=\".": 35226, - "=\".$": 26332, - "=\".$_": 96652, - "=\"../": 6510, - "=\"../../": 15437, - "=\"../../../": 70412, - "=\"./": 26420, - "=\"/": 5914, - "=\"/\"": 44609, - "=\"/\">": 68939, - "=\"/\">Ċ": 76977, - "=\"//": 44166, - "=\";Ċ": 93175, - "=\"<": 34476, - "=\"<<": 80476, - "=\"": 84653, - "==Ċ": 20747, - "=>": 2179, - "=>\"": 44488, - "=>$": 29798, - "=>'": 39526, - "=>{Ċ": 13135, - "=?": 19884, - "=?\",": 87873, - "=?\";Ċ": 89212, - "=?,": 52650, - "=@": 33678, - "=@\"": 94806, - "=A": 46623, - "=B": 54526, - "=BitConverter": 79308, - "=C": 40917, - "=D": 48634, - "=DB": 89649, - "=E": 85234, - "=F": 82226, - "=False": 5608, - "=G": 92009, - "=Integer": 87643, - "=L": 68851, - "=M": 49682, - "=Math": 76706, - "=N": 51995, - "=NULL": 27980, - "=None": 5856, - "=P": 76778, - "=R": 72677, - "=S": 72196, - "=T": 60461, - "=True": 3618, - "=UTF": 37005, - "=User": 94255, - "=Value": 88048, - "=W": 69547, - "=X": 61345, - "=Y": 91994, - "=YES": 94834, - "=[": 5818, - "=[\"": 27965, - "=['": 13987, - "=[[": 45937, - "=[]": 30692, - "=[],": 66221, - "=[];Ċ": 39952, - "=[]Ċ": 27184, - "=[]čĊ": 73927, - "=[Ċ": 33199, - "=\\": 34433, - "=\\\"": 4070, - "=\\\"\"": 41445, - "=\\\"\";Ċ": 90983, - "=\\\"#": 67915, - "=\\\"$": 56113, - "=\\\"%": 75559, - "=\\\"/": 98185, - "=\\'": 55761, - "=_": 20904, - "=_(\"": 91347, - "=_('": 89966, - "=__": 87423, - "=`": 22250, - "=a": 24239, - "=add": 92784, - "=admin": 95890, - "=all": 88277, - "=args": 31258, - "=array": 24529, - "=ax": 71663, - "=b": 22086, - "=back": 92372, - "=batch": 71798, - "=bool": 89112, - "=c": 19535, - "=center": 74144, - "=color": 63792, - "=com": 58846, - "=config": 46290, - "=context": 70694, - "=count": 73916, - "=create": 91087, - "=current": 71923, - "=cut": 48715, - "=cv": 67470, - "=d": 25405, - "=data": 22839, - "=date": 52231, - "=datetime": 56749, - "=db": 57752, - "=default": 92628, - "=device": 19718, - "=df": 60884, - "=dict": 39597, - "=document": 33541, - "=e": 40391, - "=edge": 35940, - "=email": 76371, - "=en": 61757, - "=end": 61521, - "=event": 95260, - "=explode": 91470, - "=f": 18111, - "=false": 12219, - "=file": 59245, - "=find": 60517, - "=findViewById": 84891, - "=float": 33815, - "=fopen": 74087, - "=form": 51374, - "=format": 91662, - "=forms": 64742, - "=function": 29486, - "=g": 37162, - "=get": 28280, - "=h": 54113, - "=head": 23770, - "=headers": 54085, - "=http": 34717, - "=https": 51999, - "=i": 21397, - "=id": 46022, - "=image": 74655, - "=img": 93288, - "=in": 67384, - "=index": 62641, - "=input": 39067, - "=int": 16563, - "=is": 92310, - "=item": 32562, - "=j": 45612, - "=json": 37507, - "=k": 45157, - "=key": 86582, - "=l": 40627, - "=label": 98689, - "=lambda": 27504, - "=len": 45819, - "=length": 94362, - "=line": 78185, - "=list": 40972, - "=localhost": 84551, - "=log": 83304, - "=logging": 70228, - "=m": 27221, - "=max": 44617, - "=message": 87129, - "=min": 61506, - "=model": 62496, - "=models": 27410, - "=msg": 97378, - "=my": 80470, - "=mysql": 33991, - "=mysqli": 30772, - "=n": 21747, - "=name": 39241, - "=new": 8342, - "=nil": 63358, - "=no": 30315, - "=node": 79158, - "=np": 17418, - "=null": 18911, - "=num": 46901, - "=o": 85876, - "=obj": 77246, - "=open": 52965, - "=options": 95031, - "=os": 50864, - "=out": 84998, - "=output": 85947, - "=p": 17385, - "=params": 57643, - "=password": 73517, - "=path": 81940, - "=pd": 67295, - "=pk": 87185, - "=plt": 95933, - "=pos": 99138, - "=post": 82150, - "=q": 63048, - "=query": 79194, - "=r": 31120, - "=rand": 95595, - "=random": 79817, - "=re": 49652, - "=read": 89871, - "=req": 84016, - "=request": 25168, - "=require": 62833, - "=res": 78370, - "=response": 79090, - "=result": 74212, - "=root": 74983, - "=row": 65529, - "=s": 14149, - "=sc": 74875, - "=search": 96598, - "=self": 7667, - "=session": 83400, - "=set": 68800, - "=settings": 72652, - "=size": 74178, - "=start": 55622, - "=status": 55118, - "=str": 15932, - "=sub": 45399, - "=subprocess": 56594, - "=sum": 68815, - "=sys": 58870, - "=t": 24000, - "=target": 96778, - "=temp": 53482, - "=test": 53538, - "=text": 48306, - "=tf": 32919, - "=this": 25667, - "=time": 60282, - "=title": 90507, - "=tk": 63751, - "=tmp": 92060, - "=top": 91017, - "=torch": 66257, - "=train": 76599, - "=true": 11265, - "=u": 38633, - "=url": 64563, - "=user": 30164, - "=username": 67421, - "=utf": 22264, - "=v": 39254, - "=val": 87529, - "=value": 46538, - "=view": 91953, - "=w": 63417, - "=wx": 90712, - "=x": 25387, - "=y": 29368, - "=yes": 59565, - "=z": 82570, - "=zeros": 56544, - "={": 1165, - "={!": 64426, - "={\"": 15783, - "={\"/": 98367, - "={$": 52273, - "={'": 12854, - "={(": 16817, - "={()": 10727, - "={()=>": 55051, - "={({": 82866, - "={<": 38006, - "={[": 32752, - "={['": 95590, - "={[Ċ": 68221, - "={`": 17559, - "={`${": 37312, - "={`/": 55241, - "={{": 6780, - "={{Ċ": 18268, - "={}": 68085, - "={},": 67425, - "={}Ċ": 58627, - "={Ċ": 17554, - "=}": 77422, - "=~": 94535, - "=âĢĿ": 44121, - "=Ċ": 14750, - "=ĊĊ": 68327, - ">": 29, - ">\"": 9877, - ">\")": 82598, - ">\").": 61032, - ">\");Ċ": 15084, - ">\");ĊĊ": 67940, - ">\");čĊ": 43691, - ">\")Ċ": 42363, - ">\"+": 45957, - ">\"+Ċ": 83522, - ">\",": 21156, - ">\",Ċ": 35452, - ">\".": 52946, - ">\".$": 33643, - ">\";": 31923, - ">\";Ċ": 6734, - ">\";ĊĊ": 32423, - ">\";čĊ": 20078, - ">\"Ċ": 19134, - ">\"čĊ": 82606, - ">#": 61125, - ">$": 23586, - ">${": 37680, - ">%": 28740, - ">&": 5789, - ">'": 5592, - ">')": 79865, - ">').": 57576, - ">');": 97236, - ">');Ċ": 22085, - ">');ĊĊ": 87346, - ">');čĊ": 78916, - ">')Ċ": 39866, - ">'+": 44501, - ">'+Ċ": 41909, - ">',": 19579, - ">',Ċ": 23174, - ">'.": 44689, - ">'.$": 29541, - ">'.Ċ": 63720, - ">';": 36709, - ">';Ċ": 7165, - ">';ĊĊ": 30463, - ">';čĊ": 22857, - ">'Ċ": 23431, - ">'čĊ": 95363, - ">(": 2235, - ">(\"": 13211, - ">(&": 44784, - ">('": 67638, - ">((": 47453, - ">(()": 58789, - ">()": 13555, - ">())": 92783, - ">());Ċ": 32872, - ">());ĊĊ": 93718, - ">())Ċ": 61004, - ">(),": 39019, - ">(),Ċ": 65766, - ">()->": 88380, - ">().": 10483, - ">();": 48281, - ">();Ċ": 3913, - ">();ĊĊ": 10448, - ">();čĊ": 15921, - ">();čĊčĊ": 51622, - ">()Ċ": 18949, - ">()ĊĊ": 73953, - ">(*": 60674, - ">(_": 45609, - ">({": 95753, - ">({Ċ": 81483, - ">(Ċ": 17055, - ">)": 9231, - ">).": 71524, - ">):": 37023, - ">);Ċ": 42013, - ">)Ċ": 32279, - ">*": 19443, - ">*/Ċ": 66475, - ">*+": 95326, - ">,": 8066, - ">,,Ċ": 12520, - ">-": 38643, - ">--": 82157, - ">-->Ċ": 36360, - ">--}}Ċ": 43196, - ">.": 14276, - ">..Ċ": 29816, - ">.ĊĊ": 94367, - ">/": 18105, - ">/',": 86864, - ">//": 52593, - ">/<": 67772, - ">:": 26818, - ">::": 6831, - ">:;": 65795, - ">;Ċ": 10133, - ">;ĊĊ": 19421, - ">;čĊ": 84109, - "><": 1784, - ">Ċ": 54769, - "]->": 6294, - "].": 936, - "].\"": 70966, - "].'": 95295, - "].[": 36416, - "]._": 39981, - "].Ċ": 26126, - "].ĊĊ": 29562, - "]/": 9769, - "]:": 5669, - "]:=": 90551, - "]:Ċ": 10343, - "]:ĊĊ": 68562, - "]:ĊĊĊ": 33666, - "]:čĊ": 52386, - "];": 5265, - "];//": 55682, - "];Ċ": 935, - "];ĊĊ": 4821, - "];ĊĊĊ": 52599, - "];čĊ": 5960, - "];čĊčĊ": 25890, - "]<": 34139, - "]": 93696, - "]=[": 66128, - "]=]": 95585, - "]={": 36336, - "]={Ċ": 95525, - "]>": 25669, - "]>=": 73775, - "]>Ċ": 64077, - "]?": 49964, - "]?.": 77841, - "][": 1457, - "][\"": 9868, - "][$": 24040, - "]['": 5352, - "][(": 82776, - "][-": 62872, - "][/": 77794, - "][:": 25091, - "][]": 45725, - "][_": 94692, - "]\\": 17960, - "]\\\\": 86920, - "]]": 5053, - "]])": 29616, - "]]);Ċ": 49854, - "]])Ċ": 26731, - "]])ĊĊ": 72103, - "]],": 20492, - "]],Ċ": 18543, - "]].": 22099, - "]]:Ċ": 83320, - "]];": 97829, - "]];Ċ": 13204, - "]];ĊĊ": 86853, - "]]=": 71383, - "]]>Ċ": 87565, - "]}Ċ": 23439, - "]Ċ": 921, - "]ĊĊ": 2533, - "]ĊĊĊ": 21675, - "]ĊĊĊĊ": 46739, - "]čĊ": 6114, - "]čĊčĊ": 36818, - "^": 61, - "^(": 13268, - "^-": 49309, - "^.": 39396, - "^K": 51967, - "^[": 27736, - "^\\": 24884, - "^^": 21876, - "^^^^": 61724, - "^n": 86167, - "^{": 47822, - "^{-": 87210, - "_": 62, - "_\"": 18771, - "_\"+": 33415, - "_\",": 60102, - "_\".$": 80511, - "_##": 49131, - "_#{": 90599, - "_$": 34421, - "_$_": 62750, - "_${": 40855, - "_%": 18695, - "_'": 19333, - "_'+": 33996, - "_',": 58013, - "_'.$": 38201, - "_(": 8361, - "_(\"": 37719, - "_('": 74678, - "_();Ċ": 96060, - "_()Ċ": 87358, - "_)": 16324, - "_));Ċ": 68464, - "_),": 65016, - "_);Ċ": 15299, - "_);ĊĊ": 50640, - "_);čĊ": 62447, - "_)Ċ": 23373, - "_)čĊ": 76643, - "_*": 45797, - "_,": 6878, - "_,Ċ": 38386, - "_-": 39311, - "_->": 10462, - "_-_": 83100, - "_.": 4950, - "_/": 50295, - "_:": 23211, - "_:*": 78593, - "_;": 23182, - "_;Ċ": 8588, - "_;ĊĊ": 22663, - "_;čĊ": 41940, - "_<": 41743, - "_": 98377, - "_A": 1566, - "_AA": 81941, - "_AB": 32643, - "_ABC": 91404, - "_ABI": 86974, - "_ABORT": 71044, - "_ABS": 65246, - "_AC": 15500, - "_ACC": 25666, - "_ACCEPT": 51741, - "_ACCESS": 24420, - "_ACCOUNT": 38831, - "_ACK": 50690, - "_ACL": 97627, - "_ACT": 15923, - "_ACTION": 21866, - "_ACTIONS": 94434, - "_ACTIV": 92626, - "_ACTIVE": 25946, - "_ACTIVITY": 42445, - "_AD": 22510, - "_ADAPTER": 79602, - "_ADC": 41630, - "_ADD": 8581, - "_ADDR": 16058, - "_ADDRESS": 20135, - "_ADMIN": 30460, - "_ADV": 74438, - "_AES": 69381, - "_AF": 46735, - "_AFTER": 72339, - "_AG": 37851, - "_AGENT": 52499, - "_AHB": 95846, - "_AI": 75322, - "_AL": 8912, - "_ALARM": 87735, - "_ALERT": 64486, - "_ALIAS": 61608, - "_ALIGN": 36688, - "_ALIGNMENT": 78518, - "_ALL": 16269, - "_ALLOC": 39333, - "_ALLOW": 44324, - "_ALLOWED": 73186, - "_ALPHA": 39497, - "_ALREADY": 80554, - "_ALT": 57861, - "_ALWAYS": 62761, - "_AM": 25022, - "_AMD": 98624, - "_AMOUNT": 59993, - "_AN": 23615, - "_ANAL": 59753, - "_AND": 21767, - "_ANDROID": 73238, - "_ANGLE": 78934, - "_ANS": 67752, - "_ANT": 97119, - "_ANY": 34450, - "_AP": 21899, - "_APB": 70391, - "_API": 11415, - "_APP": 16410, - "_APPEND": 65851, - "_APPLICATION": 54206, - "_APPRO": 75001, - "_APPS": 89754, - "_AR": 23399, - "_ARB": 53400, - "_ARCH": 40049, - "_ARCHIVE": 98636, - "_AREA": 50992, - "_ARG": 13905, - "_ARGS": 24386, - "_ARGUMENT": 51922, - "_ARM": 47051, - "_ARR": 86014, - "_ARRAY": 17724, - "_ARROW": 71295, - "_ART": 59156, - "_AS": 28028, - "_ASC": 84593, - "_ASCII": 98924, - "_ASM": 86906, - "_ASS": 18676, - "_ASSERT": 11796, - "_ASSIGN": 52248, - "_ASSOC": 31593, - "_ASSUME": 50089, - "_AST": 76853, - "_ASYNC": 80909, - "_AT": 8667, - "_ATOM": 97360, - "_ATOMIC": 87843, - "_ATT": 29977, - "_ATTACH": 49797, - "_ATTACHMENT": 69448, - "_ATTACK": 63398, - "_ATTR": 12865, - "_ATTRIB": 99043, - "_ATTRIBUTE": 32245, - "_ATTRIBUTES": 64550, - "_AUD": 81697, - "_AUDIO": 38002, - "_AURA": 76922, - "_AUT": 53716, - "_AUTH": 22675, - "_AUTHOR": 78843, - "_AUTO": 29013, - "_AUX": 81634, - "_AV": 29386, - "_AVAILABLE": 51823, - "_AX": 36817, - "_AXIS": 50431, - "_Abstract": 74372, - "_Account": 86855, - "_Act": 46672, - "_Action": 59899, - "_Ad": 23834, - "_Add": 21346, - "_Address": 64899, - "_Adjust": 41704, - "_AdjustorThunk": 42901, - "_Admin": 57308, - "_Al": 40812, - "_All": 53629, - "_An": 32699, - "_And": 93846, - "_Anim": 72072, - "_Api": 91128, - "_App": 36117, - "_Application": 96579, - "_Arg": 87581, - "_Array": 47229, - "_As": 62741, - "_AspNet": 77421, - "_Ass": 62222, - "_At": 55581, - "_Att": 81797, - "_B": 1668, - "_BACK": 22005, - "_BACKEND": 77795, - "_BACKGROUND": 70128, - "_BAD": 30666, - "_BAL": 79952, - "_BAND": 78268, - "_BANK": 66407, - "_BAR": 47405, - "_BASE": 11762, - "_BASIC": 71068, - "_BATCH": 74009, - "_BB": 93929, - "_BC": 72247, - "_BE": 27168, - "_BEFORE": 82218, - "_BEGIN": 26382, - "_BG": 62290, - "_BGR": 50825, - "_BIG": 62743, - "_BIN": 55720, - "_BINARY": 49754, - "_BIND": 44555, - "_BINDING": 85172, - "_BIT": 11189, - "_BITMAP": 72376, - "_BITS": 32695, - "_BL": 21089, - "_BLACK": 56555, - "_BLE": 44300, - "_BLEND": 62763, - "_BLK": 87634, - "_BLOCK": 18756, - "_BLOCKS": 86542, - "_BLUE": 53463, - "_BO": 12551, - "_BOARD": 65256, - "_BODY": 44411, - "_BOLD": 90166, - "_BOOK": 61256, - "_BOOL": 32491, - "_BOOLEAN": 37809, - "_BOOT": 57313, - "_BORDER": 61235, - "_BOTH": 82718, - "_BOTTOM": 58333, - "_BOUND": 73644, - "_BOUNDS": 91625, - "_BOX": 40167, - "_BP": 68822, - "_BR": 26543, - "_BRANCH": 71746, - "_BREAK": 63841, - "_BROWSER": 72500, - "_BS": 92962, - "_BT": 53970, - "_BTN": 58558, - "_BU": 92218, - "_BUCKET": 74444, - "_BUF": 35207, - "_BUFF": 62128, - "_BUFFER": 14394, - "_BUILD": 37491, - "_BUS": 33473, - "_BUSY": 67283, - "_BUTTON": 20110, - "_BY": 13696, - "_BYTE": 27349, - "_BYTES": 40705, - "_Back": 64703, - "_Bar": 91069, - "_Base": 33982, - "_Begin": 93447, - "_Bl": 56947, - "_Block": 51779, - "_Blue": 97201, - "_Bool": 79948, - "_Box": 81953, - "_Buffer": 55040, - "_Build": 96686, - "_Button": 41297, - "_By": 85996, - "_C": 920, - "_CA": 54890, - "_CACHE": 29138, - "_CAL": 39415, - "_CALC": 98014, - "_CALL": 14935, - "_CALLBACK": 35773, - "_CAM": 39446, - "_CAMERA": 58379, - "_CAN": 45600, - "_CANCEL": 47459, - "_CANNOT": 90916, - "_CAP": 21879, - "_CAPACITY": 92153, - "_CAPTURE": 61801, - "_CAR": 85887, - "_CARD": 45529, - "_CART": 65172, - "_CASE": 28540, - "_CAST": 25753, - "_CAT": 64572, - "_CATEGORY": 39284, - "_CB": 48933, - "_CBC": 90764, - "_CC": 31331, - "_CD": 55200, - "_CE": 94805, - "_CELL": 59109, - "_CENTER": 34555, - "_CERT": 55298, - "_CF": 72058, - "_CFG": 21760, - "_CH": 6466, - "_CHAIN": 70232, - "_CHAN": 80324, - "_CHANGE": 32523, - "_CHANGED": 48099, - "_CHANNEL": 23688, - "_CHANNELS": 77026, - "_CHAR": 20891, - "_CHARACTER": 68877, - "_CHARS": 82319, - "_CHARSET": 95104, - "_CHAT": 70748, - "_CHECK": 11780, - "_CHILD": 59196, - "_CHIP": 79101, - "_CHK": 87855, - "_CHO": 50616, - "_CHOICES": 74995, - "_CHUNK": 70508, - "_CI": 93807, - "_CID": 87525, - "_CIPHER": 80973, - "_CITY": 85310, - "_CL": 6843, - "_CLAMP": 88309, - "_CLASS": 13735, - "_CLASSES": 69164, - "_CLEAN": 79661, - "_CLEAR": 39280, - "_CLI": 91195, - "_CLICK": 52278, - "_CLICKED": 94245, - "_CLIENT": 22521, - "_CLIP": 96353, - "_CLK": 25160, - "_CLOCK": 41296, - "_CLOSE": 24323, - "_CLOSED": 78140, - "_CLR": 71499, - "_CLUSTER": 77871, - "_CM": 42337, - "_CMD": 16344, - "_CMP": 83256, - "_CN": 56621, - "_CNT": 34202, - "_CNTL": 95575, - "_CO": 19628, - "_COD": 81505, - "_CODE": 10020, - "_CODEC": 68199, - "_CODES": 41688, - "_COL": 25332, - "_COLL": 74317, - "_COLLECTION": 68757, - "_COLOR": 14471, - "_COLORS": 85436, - "_COLS": 93714, - "_COLUMN": 36183, - "_COLUMNS": 71903, - "_COM": 6877, - "_COMBO": 95403, - "_COMM": 14025, - "_COMMAND": 22723, - "_COMMENT": 49956, - "_COMMIT": 77364, - "_COMMON": 45026, - "_COMP": 14969, - "_COMPANY": 97673, - "_COMPARE": 77898, - "_COMPAT": 76770, - "_COMPILE": 83401, - "_COMPILER": 87009, - "_COMPLETE": 50665, - "_COMPLETED": 85674, - "_COMPLEX": 97820, - "_COMPONENT": 40021, - "_CON": 4307, - "_COND": 81631, - "_CONDITION": 72815, - "_CONF": 29212, - "_CONFIG": 12568, - "_CONFIGURATION": 70752, - "_CONFIRM": 64934, - "_CONN": 60376, - "_CONNECT": 33462, - "_CONNECTED": 69434, - "_CONNECTION": 40708, - "_CONSOLE": 89292, - "_CONST": 23098, - "_CONSTANT": 55310, - "_CONT": 10710, - "_CONTACT": 54636, - "_CONTAINER": 50689, - "_CONTENT": 25560, - "_CONTEXT": 29577, - "_CONTINUE": 79066, - "_CONTROL": 23680, - "_CONTROLLER": 63995, - "_CONV": 85323, - "_CONVERT": 79121, - "_COOKIE": 76549, - "_COORD": 60508, - "_COPY": 35556, - "_COR": 47696, - "_CORE": 31310, - "_COST": 70932, - "_COUNT": 14672, - "_COUNTER": 48411, - "_COUNTRY": 94005, - "_CP": 45976, - "_CPP": 64624, - "_CPU": 29741, - "_CR": 24314, - "_CRC": 75310, - "_CRE": 68872, - "_CREAT": 70802, - "_CREATE": 25823, - "_CREATED": 57784, - "_CRITICAL": 88036, - "_CRYPTO": 87245, - "_CS": 34796, - "_CSR": 81449, - "_CSS": 83579, - "_CSV": 96594, - "_CT": 72547, - "_CTL": 37537, - "_CTRL": 19170, - "_CTX": 44233, - "_CUBE": 91969, - "_CUDA": 94861, - "_CUR": 33834, - "_CURRENT": 32938, - "_CURSOR": 58988, - "_CUSTOM": 36314, - "_CUSTOMER": 90292, - "_CY": 46431, - "_CYCLE": 86802, - "_Call": 76028, - "_Callback": 55102, - "_Camera": 89076, - "_Cancel": 97485, - "_Category": 80414, - "_Cell": 54454, - "_Ch": 27588, - "_Channel": 68858, - "_Char": 50896, - "_Character": 84529, - "_Check": 28188, - "_Checked": 48618, - "_CheckedChanged": 51911, - "_Cl": 85110, - "_Class": 47538, - "_Clear": 57744, - "_Click": 7163, - "_Client": 46102, - "_Close": 68185, - "_Cmd": 98253, - "_Code": 38084, - "_Collections": 37910, - "_Color": 43387, - "_Column": 96622, - "_Com": 16946, - "_ComCallableWrapper": 88950, - "_Comm": 59452, - "_Command": 66751, - "_Common": 77271, - "_Component": 80760, - "_Con": 15100, - "_Config": 35412, - "_Connection": 85002, - "_Construct": 41126, - "_Content": 78383, - "_Context": 71994, - "_Control": 45376, - "_Controller": 30674, - "_Copy": 77637, - "_Core": 41990, - "_Count": 50775, - "_Create": 34325, - "_Current": 40735, - "_Custom": 57402, - "_Customer": 94596, - "_D": 1557, - "_DA": 75144, - "_DAC": 85966, - "_DAMAGE": 64459, - "_DAT": 36347, - "_DATA": 7896, - "_DATABASE": 45510, - "_DATE": 18500, - "_DAY": 43566, - "_DAYS": 89256, - "_DB": 16310, - "_DBG": 37620, - "_DC": 56661, - "_DD": 95985, - "_DDR": 79838, - "_DE": 2881, - "_DEAD": 82898, - "_DEBUG": 11139, - "_DEC": 23773, - "_DECL": 22732, - "_DECLARE": 48415, - "_DECLS": 94631, - "_DECREF": 38887, - "_DEF": 21736, - "_DEFAULT": 13811, - "_DEFIN": 40503, - "_DEFINE": 46807, - "_DEFINED": 59122, - "_DEFINITION": 92326, - "_DEL": 20918, - "_DELAY": 33410, - "_DELETE": 28923, - "_DELETED": 85921, - "_DELTA": 80814, - "_DEN": 66936, - "_DENIED": 92118, - "_DEPEND": 94293, - "_DEPRECATED": 82076, - "_DEPTH": 32644, - "_DER": 96062, - "_DESC": 23456, - "_DESCRIPTION": 38168, - "_DESCRIPTOR": 55445, - "_DEST": 45874, - "_DESTROY": 79400, - "_DET": 77107, - "_DETAIL": 32905, - "_DETAILS": 56462, - "_DETECT": 96218, - "_DEV": 26419, - "_DEVICE": 18094, - "_DEVICES": 84433, - "_DF": 92864, - "_DGRAM": 92273, - "_DH": 92439, - "_DI": 44663, - "_DIAG": 76210, - "_DIALOG": 42802, - "_DICT": 54047, - "_DIFF": 53984, - "_DIG": 33362, - "_DIGEST": 94901, - "_DIM": 39302, - "_DIP": 41524, - "_DIPSETTING": 57675, - "_DIR": 8291, - "_DIRECT": 31730, - "_DIRECTION": 65065, - "_DIRECTORY": 43814, - "_DIRS": 90560, - "_DIS": 12198, - "_DISABLE": 25680, - "_DISABLED": 55701, - "_DISCONNECT": 76225, - "_DISK": 84504, - "_DISP": 85475, - "_DISPATCH": 88674, - "_DISPLAY": 37579, - "_DIST": 40953, - "_DISTANCE": 63217, - "_DIV": 35303, - "_DL": 74436, - "_DLL": 53800, - "_DM": 58796, - "_DMA": 33782, - "_DO": 21820, - "_DOC": 68911, - "_DOCUMENT": 60584, - "_DOM": 30230, - "_DOMAIN": 33729, - "_DONE": 42741, - "_DOT": 82567, - "_DOUBLE": 33839, - "_DOWN": 21157, - "_DOWNLOAD": 67748, - "_DP": 71475, - "_DR": 20488, - "_DRAW": 42731, - "_DRIVE": 92787, - "_DRIVER": 44042, - "_DROP": 64210, - "_DRV": 66173, - "_DS": 51901, - "_DSP": 94281, - "_DST": 71772, - "_DT": 60255, - "_DU": 97153, - "_DUMP": 74498, - "_DURATION": 53413, - "_DX": 92831, - "_DYNAMIC": 57356, - "_Data": 17817, - "_Date": 39564, - "_Db": 60968, - "_De": 24597, - "_Debug": 77938, - "_Dec": 78668, - "_Def": 88411, - "_Default": 60336, - "_Delay": 92726, - "_Delete": 57418, - "_Dep": 90680, - "_Des": 98054, - "_Desc": 92957, - "_Description": 79687, - "_Destroy": 79266, - "_Detail": 94762, - "_Details": 97426, - "_Device": 66780, - "_Dis": 45525, - "_Display": 80352, - "_Do": 93481, - "_Double": 84390, - "_Draw": 69154, - "_E": 2089, - "_EC": 69510, - "_ED": 32860, - "_EDEFAULT": 88948, - "_EDGE": 52043, - "_EDIT": 25106, - "_EDITOR": 52770, - "_EFFECT": 55634, - "_EL": 62283, - "_ELEM": 90704, - "_ELEMENT": 27156, - "_ELEMENTS": 66169, - "_EM": 27148, - "_EMAIL": 29548, - "_EMIT": 97763, - "_EMP": 68784, - "_EMPTY": 36640, - "_EN": 6300, - "_ENABLE": 14379, - "_ENABLED": 29276, - "_ENC": 72674, - "_ENCOD": 53269, - "_ENCODE": 89513, - "_ENCODING": 73029, - "_END": 10898, - "_ENDIAN": 57769, - "_ENDPOINT": 48756, - "_ENGINE": 62177, - "_ENSURE": 82817, - "_ENT": 16241, - "_ENTER": 41974, - "_ENTITY": 46599, - "_ENTRIES": 87695, - "_ENTRY": 22659, - "_ENUM": 31894, - "_ENV": 22027, - "_EOF": 89287, - "_EOL": 36244, - "_EP": 52194, - "_EPS": 77292, - "_EQ": 9168, - "_EQUAL": 18182, - "_EQUALS": 68581, - "_ER": 58995, - "_ERR": 9875, - "_ERROR": 5414, - "_ERRORS": 66241, - "_ES": 30275, - "_ESCAPE": 75575, - "_EST": 79816, - "_ET": 73755, - "_ETH": 79667, - "_EV": 65458, - "_EVAL": 70965, - "_EVENT": 14054, - "_EVENTS": 61357, - "_EVT": 64955, - "_EX": 4966, - "_EXCEPTION": 27285, - "_EXEC": 38235, - "_EXECUTE": 91103, - "_EXIST": 49049, - "_EXISTS": 70042, - "_EXIT": 34009, - "_EXP": 34468, - "_EXPECT": 68208, - "_EXPI": 62006, - "_EXPORT": 20789, - "_EXPR": 73051, - "_EXPRESSION": 98345, - "_EXT": 16066, - "_EXTENDED": 95952, - "_EXTENSION": 37012, - "_EXTENSIONS": 97058, - "_EXTERN": 37743, - "_EXTERNAL": 47871, - "_EXTRA": 58981, - "_Edit": 66158, - "_Element": 64099, - "_Em": 76060, - "_Email": 83168, - "_Enable": 65216, - "_Enc": 93529, - "_End": 49953, - "_Ent": 50503, - "_Enter": 91105, - "_Entity": 89618, - "_Entry": 94164, - "_Equals": 86567, - "_Err": 93623, - "_Error": 28651, - "_Event": 39354, - "_Ex": 62531, - "_Exception": 48247, - "_Execute": 83453, - "_F": 1400, - "_FA": 19058, - "_FACE": 65113, - "_FACT": 36299, - "_FACTOR": 53706, - "_FACTORY": 71152, - "_FAIL": 11878, - "_FAILED": 22775, - "_FAILURE": 16998, - "_FALL": 83962, - "_FALSE": 18125, - "_FAMILY": 80828, - "_FAR": 87961, - "_FAST": 58225, - "_FATAL": 61540, - "_FAULT": 94664, - "_FB": 64707, - "_FC": 79903, - "_FD": 86221, - "_FE": 43307, - "_FEATURE": 30827, - "_FEED": 74176, - "_FETCH": 57925, - "_FF": 86880, - "_FIELD": 17354, - "_FIELDS": 52999, - "_FIFO": 49429, - "_FILE": 8087, - "_FILENAME": 45005, - "_FILENO": 75538, - "_FILES": 48010, - "_FILL": 61000, - "_FILTER": 23728, - "_FIN": 45280, - "_FINAL": 75872, - "_FIND": 67285, - "_FINE": 90687, - "_FINISH": 87093, - "_FIRE": 76614, - "_FIRST": 36272, - "_FIX": 42635, - "_FIXED": 66300, - "_FL": 22588, - "_FLAG": 11890, - "_FLAGS": 30090, - "_FLASH": 48515, - "_FLOAT": 21496, - "_FLOW": 55818, - "_FLUSH": 80395, - "_FM": 92312, - "_FMT": 44332, - "_FN": 60122, - "_FOCUS": 96629, - "_FOLDER": 33637, - "_FOLLOW": 78869, - "_FONT": 39532, - "_FOR": 14516, - "_FORCE": 50092, - "_FORE": 47185, - "_FOREACH": 70751, - "_FORM": 12705, - "_FORMAT": 14960, - "_FORWARD": 64005, - "_FOUND": 24687, - "_FP": 70981, - "_FR": 14220, - "_FRAGMENT": 66157, - "_FRAME": 22260, - "_FRAMEBUFFER": 71551, - "_FRE": 73183, - "_FREE": 35356, - "_FREQ": 48602, - "_FREQUENCY": 93174, - "_FRIEND": 86268, - "_FROM": 27108, - "_FRONT": 51915, - "_FS": 40398, - "_FT": 84740, - "_FULL": 29822, - "_FULLSCREEN": 87688, - "_FUN": 58873, - "_FUNC": 20875, - "_FUNCTION": 18490, - "_FUNCTIONS": 95484, - "_FW": 73108, - "_FWD": 84977, - "_Field": 46272, - "_FieldOffsetTable": 88396, - "_File": 34061, - "_Filter": 68935, - "_Final": 77072, - "_Find": 95245, - "_First": 79790, - "_Flag": 98135, - "_Float": 89067, - "_Font": 74213, - "_For": 84368, - "_Form": 28121, - "_Format": 72999, - "_Frame": 68403, - "_Framework": 61995, - "_Free": 58455, - "_From": 53157, - "_Function": 59738, - "_G": 2646, - "_GAIN": 67068, - "_GAME": 40908, - "_GAP": 84721, - "_GATE": 81116, - "_GB": 98631, - "_GC": 76915, - "_GE": 59033, - "_GEN": 42362, - "_GENER": 18693, - "_GENERAL": 65336, - "_GENERIC": 25274, - "_GET": 12702, - "_GF": 79365, - "_GL": 36700, - "_GLOBAL": 36761, - "_GO": 39622, - "_GOOD": 86725, - "_GP": 85834, - "_GPIO": 17863, - "_GPS": 97123, - "_GPU": 68716, - "_GR": 17874, - "_GRA": 76774, - "_GRANTED": 63910, - "_GRAPH": 58360, - "_GRAY": 60516, - "_GRE": 72739, - "_GREEN": 53059, - "_GRID": 61435, - "_GROUP": 20130, - "_GROUPS": 89189, - "_GRP": 90023, - "_GT": 71881, - "_GU": 84513, - "_GUI": 61305, - "_GUID": 58648, - "_Game": 49223, - "_Generic": 29085, - "_GenericClass": 35974, - "_Get": 13614, - "_Global": 93132, - "_Grid": 83047, - "_Group": 52619, - "_H": 2039, - "_HAL": 43694, - "_HALF": 74611, - "_HAND": 29190, - "_HANDLE": 23683, - "_HANDLER": 42472, - "_HARD": 78149, - "_HAS": 37978, - "_HASH": 32309, - "_HAVE": 56087, - "_HC": 98991, - "_HDR": 55765, - "_HE": 7867, - "_HEAD": 27990, - "_HEADER": 20330, - "_HEADERS": 79428, - "_HEALTH": 99028, - "_HEAP": 81358, - "_HEIGHT": 17355, - "_HEL": 69235, - "_HELP": 49587, - "_HELPER": 85331, - "_HERE": 81555, - "_HERSHEY": 92534, - "_HEX": 86502, - "_HI": 72536, - "_HIDDEN": 80921, - "_HIDE": 72014, - "_HIGH": 31621, - "_HINT": 74457, - "_HISTORY": 63823, - "_HIT": 86767, - "_HOLD": 97553, - "_HOME": 28466, - "_HOOK": 82251, - "_HOR": 90462, - "_HORIZONTAL": 75867, - "_HOST": 17213, - "_HOT": 91323, - "_HOUR": 86292, - "_HP": 80588, - "_HPP": 19974, - "_HS": 81832, - "_HT": 24105, - "_HTML": 56726, - "_HTTP": 34954, - "_HW": 44013, - "_Handle": 42714, - "_HandleTypeDef": 78906, - "_Handler": 41879, - "_Header": 71353, - "_Height": 83829, - "_Helper": 67828, - "_I": 7959, - "_IA": 87490, - "_IB": 79263, - "_IC": 22960, - "_ICON": 36525, - "_ID": 3450, - "_IDENT": 40264, - "_IDENTIFIER": 49554, - "_IDLE": 46390, - "_IDS": 74942, - "_IDX": 40932, - "_IE": 60448, - "_IEnumerator": 88913, - "_IF": 19035, - "_IGNORE": 49974, - "_IL": 70862, - "_IList": 88431, - "_IM": 8351, - "_IMAGE": 19121, - "_IMAGES": 79415, - "_IMETHOD": 76779, - "_IMG": 50365, - "_IMM": 67303, - "_IMP": 97415, - "_IMPL": 51345, - "_IMPLEMENT": 62325, - "_IMPORT": 21024, - "_IMPORTED": 25267, - "_IN": 2158, - "_INC": 39901, - "_INCLUDE": 48081, - "_INCLUDED": 36078, - "_INCREF": 74347, - "_INCREMENT": 58058, - "_IND": 41003, - "_INDEX": 14515, - "_INET": 26834, - "_INF": 65487, - "_INFINITY": 91110, - "_INFO": 9068, - "_INFORMATION": 53124, - "_ING": 84485, - "_INIT": 14446, - "_INITIAL": 65872, - "_INITIALIZ": 59082, - "_INITIALIZER": 90214, - "_INLINE": 32482, - "_INPUT": 21022, - "_INS": 31650, - "_INSERT": 47924, - "_INST": 49893, - "_INSTALL": 58486, - "_INSTANCE": 42587, - "_INT": 9161, - "_INTEGER": 25757, - "_INTER": 16732, - "_INTERFACE": 31561, - "_INTERNAL": 31752, - "_INTERRUPT": 53770, - "_INTERVAL": 37353, - "_INTR": 43661, - "_INV": 40107, - "_INVALID": 15167, - "_IO": 19790, - "_IOC": 97001, - "_IOCTL": 67326, - "_IOS": 79259, - "_IP": 16607, - "_IPV": 58830, - "_IR": 17138, - "_IRQ": 21980, - "_IRQHandler": 74944, - "_IRQn": 52357, - "_IS": 12766, - "_ISO": 83858, - "_ISR": 70678, - "_ISS": 92687, - "_IT": 41681, - "_ITEM": 16461, - "_ITEMS": 56280, - "_ITER": 51347, - "_IV": 61917, - "_IW": 86421, - "_Id": 21576, - "_Il": 38563, - "_Image": 45949, - "_Impl": 60532, - "_In": 25972, - "_Index": 50361, - "_Info": 39624, - "_Init": 15644, - "_InitStruct": 42596, - "_InitStructure": 60099, - "_Input": 48653, - "_Insert": 76417, - "_Instance": 70849, - "_Int": 32054, - "_Integer": 80318, - "_Inter": 79717, - "_Interface": 74626, - "_Internal": 37238, - "_InternalArray": 72128, - "_Invoke": 79143, - "_Is": 31879, - "_Item": 27518, - "_Items": 74467, - "_J": 10598, - "_JO": 38532, - "_JOB": 59690, - "_JOIN": 69317, - "_JS": 77846, - "_JSON": 25356, - "_JUMP": 88730, - "_K": 10102, - "_KEEP": 74937, - "_KERNEL": 39637, - "_KEY": 6600, - "_KEYBOARD": 81164, - "_KEYS": 51251, - "_KEYWORD": 71908, - "_KHR": 88528, - "_KIND": 72959, - "_KP": 72849, - "_Key": 35253, - "_KeyDown": 81459, - "_KeyPress": 77834, - "_L": 2351, - "_LA": 83759, - "_LABEL": 25670, - "_LANE": 68488, - "_LANG": 39761, - "_LANGUAGE": 59990, - "_LARGE": 83861, - "_LAST": 36794, - "_LAT": 64241, - "_LAYER": 50520, - "_LAYOUT": 52685, - "_LCD": 63092, - "_LD": 72800, - "_LE": 5280, - "_LEAVE": 89741, - "_LED": 37604, - "_LEFT": 19013, - "_LEG": 72303, - "_LEN": 15536, - "_LENGTH": 15023, - "_LESS": 90664, - "_LEVEL": 17415, - "_LIB": 26207, - "_LIBRARY": 54110, - "_LICENSE": 57560, - "_LIGHT": 35614, - "_LIMIT": 29194, - "_LINE": 15657, - "_LINEAR": 51948, - "_LINES": 66744, - "_LINK": 26147, - "_LINUX": 74025, - "_LIST": 11899, - "_LITERAL": 78047, - "_LL": 70309, - "_LO": 4606, - "_LOAD": 24042, - "_LOADED": 89917, - "_LOADING": 63960, - "_LOC": 16397, - "_LOCAL": 28399, - "_LOCATION": 30202, - "_LOCK": 27661, - "_LOG": 8419, - "_LOGGER": 87673, - "_LOGIN": 38314, - "_LONG": 19903, - "_LOOK": 73686, - "_LOOKUP": 93398, - "_LOOP": 49502, - "_LOW": 25831, - "_LOWER": 90132, - "_LP": 85430, - "_LR": 94938, - "_LS": 87789, - "_LSB": 76799, - "_LT": 65917, - "_LVL": 94282, - "_Label": 53557, - "_Last": 84672, - "_Lean": 95593, - "_Left": 70785, - "_Length": 81620, - "_Level": 78861, - "_Line": 59100, - "_Link": 72420, - "_List": 27104, - "_Load": 19553, - "_Local": 71421, - "_Location": 85524, - "_Log": 44083, - "_Login": 79232, - "_Long": 88240, - "_M": 1245, - "_MA": 85311, - "_MAC": 28076, - "_MACHINE": 66702, - "_MACRO": 73361, - "_MAG": 55231, - "_MAGIC": 49194, - "_MAIL": 65082, - "_MAIN": 32276, - "_MAJOR": 52045, - "_MAKE": 77442, - "_MALLOC": 86753, - "_MAN": 25143, - "_MANAGER": 44018, - "_MANY": 97374, - "_MAP": 16306, - "_MAPPING": 73513, - "_MARGIN": 71823, - "_MARK": 36916, - "_MARKER": 82689, - "_MASK": 11720, - "_MASTER": 47068, - "_MAT": 71917, - "_MATCH": 40824, - "_MATERIAL": 92932, - "_MATH": 85944, - "_MATRIX": 58376, - "_MAX": 6806, - "_MAXIMUM": 85377, - "_MAY": 83079, - "_MB": 76344, - "_MC": 59714, - "_MD": 46497, - "_ME": 33037, - "_MED": 97550, - "_MEDIA": 49527, - "_MEDIUM": 93792, - "_MEM": 13209, - "_MEMBER": 37552, - "_MEMBERS": 96446, - "_MEMORY": 30048, - "_MENU": 27648, - "_MESH": 85388, - "_MESSAGE": 14641, - "_MESSAGES": 69485, - "_MET": 33387, - "_META": 59836, - "_METADATA": 58084, - "_METHOD": 14058, - "_MI": 59763, - "_MIC": 69478, - "_MIDDLE": 86752, - "_MIN": 11820, - "_MINOR": 61524, - "_MINUS": 68263, - "_MISC": 69035, - "_MISS": 63608, - "_MISSING": 80706, - "_MIX": 77299, - "_MM": 46957, - "_MO": 18089, - "_MOBILE": 94137, - "_MOD": 20724, - "_MODAL": 86300, - "_MODE": 8414, - "_MODEL": 27551, - "_MODIFIED": 85958, - "_MODULE": 13953, - "_MODULES": 95742, - "_MON": 27065, - "_MONITOR": 81734, - "_MONTH": 48023, - "_MORE": 75131, - "_MOUNT": 95600, - "_MOUSE": 53307, - "_MOV": 48664, - "_MOVE": 35876, - "_MP": 53052, - "_MPI": 77454, - "_MR": 82153, - "_MS": 36147, - "_MSB": 96389, - "_MSG": 14372, - "_MSK": 95317, - "_MT": 49047, - "_MUL": 91421, - "_MULT": 29207, - "_MULTI": 49794, - "_MUT": 52403, - "_MUTEX": 66994, - "_MUX": 79351, - "_MY": 84395, - "_Main": 45105, - "_Man": 71628, - "_Manager": 47573, - "_Map": 56992, - "_Master": 80681, - "_Matrix": 76933, - "_Max": 58843, - "_Menu": 54098, - "_Message": 50974, - "_Meta": 59812, - "_MetaData": 75216, - "_Metadata": 62219, - "_MetadataUsageId": 67031, - "_Method": 44844, - "_MethodInfo": 69428, - "_Min": 62122, - "_Mod": 71485, - "_Mode": 54361, - "_Model": 21626, - "_Module": 63197, - "_Mouse": 36247, - "_Move": 66352, - "_Msg": 90653, - "_Msk": 66554, - "_Msp": 67437, - "_N": 1604, - "_NAME": 4708, - "_NAMES": 24833, - "_NAMESPACE": 34552, - "_NATIVE": 55575, - "_NAV": 71148, - "_NB": 80107, - "_NC": 95942, - "_NE": 14039, - "_NEAR": 78148, - "_NEAREST": 91926, - "_NEED": 86068, - "_NEG": 62368, - "_NET": 26855, - "_NETWORK": 48119, - "_NEW": 22015, - "_NEXT": 39987, - "_NM": 96053, - "_NO": 9100, - "_NODE": 19218, - "_NODES": 92948, - "_NON": 22128, - "_NONE": 14904, - "_NONNULL": 47703, - "_NOP": 71810, - "_NORMAL": 26455, - "_NOT": 9169, - "_NOTE": 54791, - "_NOTICE": 67800, - "_NOTIFICATION": 54241, - "_NOTIFY": 57614, - "_NOW": 59401, - "_NPC": 91569, - "_NR": 68195, - "_NS": 33777, - "_NT": 76575, - "_NULL": 18119, - "_NUM": 9631, - "_NUMBER": 19364, - "_NUMERIC": 84393, - "_NV": 49631, - "_Name": 19015, - "_Native": 98233, - "_New": 39582, - "_No": 36989, - "_Node": 41340, - "_None": 52523, - "_Normal": 74900, - "_Not": 60816, - "_Null": 55534, - "_Num": 61883, - "_Number": 51799, - "_O": 2232, - "_OBJ": 27559, - "_OBJC": 63804, - "_OBJECT": 13442, - "_OBS": 86948, - "_OC": 74663, - "_OCC": 32874, - "_OCCURRED": 35746, - "_OD": 60426, - "_OF": 14234, - "_OFF": 11987, - "_OFFSET": 17626, - "_OID": 96284, - "_OK": 8375, - "_OLD": 82869, - "_OM": 83169, - "_ON": 11077, - "_ONCE": 98814, - "_ONE": 34727, - "_ONLY": 31263, - "_OP": 13908, - "_OPCODE": 73080, - "_OPEN": 24070, - "_OPENGL": 91353, - "_OPER": 27205, - "_OPERATION": 44685, - "_OPERATOR": 69678, - "_OPT": 28264, - "_OPTION": 19968, - "_OPTIONS": 36321, - "_OPTS": 84015, - "_OR": 19834, - "_ORD": 85870, - "_ORDER": 26677, - "_ORIENTATION": 94180, - "_ORIGIN": 97199, - "_OS": 30400, - "_OT": 51147, - "_OTHER": 56038, - "_OUT": 11881, - "_OUTPUT": 23981, - "_OVER": 32043, - "_OVERFLOW": 94393, - "_OVERRIDE": 49372, - "_OW": 69819, - "_OWNER": 74323, - "_Obj": 70672, - "_Object": 27839, - "_Of": 89355, - "_Off": 94377, - "_Offset": 85697, - "_On": 35482, - "_One": 68201, - "_Open": 51747, - "_Options": 86101, - "_Order": 53267, - "_Osc": 82105, - "_OscInitStruct": 96199, - "_Out": 36675, - "_Output": 65062, - "_P": 1088, - "_PA": 26191, - "_PACK": 23987, - "_PACKAGE": 55566, - "_PACKET": 40328, - "_PAD": 36451, - "_PADDING": 78359, - "_PAGE": 19971, - "_PAGES": 79873, - "_PAIR": 65765, - "_PANEL": 68988, - "_PAR": 32029, - "_PARAM": 12073, - "_PARAMETER": 33241, - "_PARAMETERS": 71463, - "_PARAMS": 37488, - "_PARENT": 46848, - "_PARSE": 69706, - "_PARSER": 78544, - "_PART": 28278, - "_PARTITION": 91664, - "_PASS": 34351, - "_PASSWORD": 23059, - "_PATCH": 76804, - "_PATH": 7944, - "_PATTERN": 44227, - "_PAUSE": 79538, - "_PAY": 36417, - "_PAYLOAD": 79493, - "_PAYMENT": 67566, - "_PB": 71556, - "_PC": 39797, - "_PCI": 71520, - "_PCIE": 93061, - "_PCM": 69071, - "_PD": 69487, - "_PE": 45784, - "_PED": 81630, - "_PEER": 92742, - "_PENDING": 56614, - "_PER": 10617, - "_PERCENT": 72223, - "_PERIOD": 43166, - "_PERMISSION": 52788, - "_PERSON": 73428, - "_PF": 79180, - "_PG": 85644, - "_PH": 17909, - "_PHASE": 70239, - "_PHONE": 59704, - "_PHOTO": 92641, - "_PHP": 81582, - "_PHY": 35519, - "_PHYS": 68356, - "_PI": 20212, - "_PICK": 74032, - "_PICTURE": 94179, - "_PID": 55794, - "_PIN": 15844, - "_PIPE": 51584, - "_PIPELINE": 96516, - "_PIX": 85372, - "_PIXEL": 50484, - "_PK": 63898, - "_PKG": 94126, - "_PKT": 69879, - "_PL": 11082, - "_PLACE": 81924, - "_PLAN": 83648, - "_PLATFORM": 43219, - "_PLAY": 38575, - "_PLAYER": 36554, - "_PLL": 46620, - "_PLUGIN": 39935, - "_PLUS": 71878, - "_PM": 39918, - "_PO": 14169, - "_POINT": 27407, - "_POINTER": 28701, - "_POINTS": 64163, - "_POL": 33165, - "_POLICY": 58999, - "_POLL": 76820, - "_POOL": 51924, - "_POP": 55508, - "_PORT": 12377, - "_PORTS": 95559, - "_POS": 18313, - "_POSITION": 33580, - "_POST": 20506, - "_POSTFIELDS": 96247, - "_POWER": 33304, - "_PP": 43258, - "_PR": 10571, - "_PRE": 17427, - "_PRED": 92180, - "_PREF": 66372, - "_PREFIX": 18519, - "_PRESENT": 68708, - "_PRESS": 61219, - "_PREVIEW": 98990, - "_PRI": 81193, - "_PRICE": 51900, - "_PRIMARY": 75019, - "_PRINT": 23402, - "_PRINTF": 70395, - "_PRIORITY": 42694, - "_PRIV": 70625, - "_PRIVATE": 30470, - "_PRO": 5756, - "_PROC": 45050, - "_PROCESS": 36199, - "_PROD": 89799, - "_PRODUCT": 31850, - "_PRODUCTS": 79881, - "_PROF": 95152, - "_PROFILE": 34533, - "_PROGRAM": 59832, - "_PROGRESS": 54446, - "_PROJECT": 43804, - "_PROM": 71346, - "_PROP": 32839, - "_PROPERTIES": 64619, - "_PROPERTY": 26021, - "_PROTO": 30265, - "_PROTOCOL": 39893, - "_PROVID": 51868, - "_PROVIDER": 62542, - "_PROXY": 59065, - "_PS": 47666, - "_PT": 65061, - "_PTR": 20657, - "_PUBLIC": 36209, - "_PULL": 60284, - "_PUR": 79006, - "_PUSH": 58811, - "_PUT": 88429, - "_PW": 96740, - "_PWM": 50459, - "_PWR": 57996, - "_PY": 78537, - "_Page": 51540, - "_Panel": 98817, - "_Param": 27426, - "_Parameter": 84458, - "_Params": 44656, - "_Parms": 78933, - "_Parse": 77337, - "_Part": 97938, - "_Password": 93302, - "_Path": 66388, - "_Per": 53918, - "_Ph": 85775, - "_Pin": 35453, - "_Pl": 41609, - "_Play": 91854, - "_Player": 51955, - "_Pods": 76861, - "_Point": 52838, - "_Port": 56328, - "_Pos": 44246, - "_Position": 55724, - "_Post": 66726, - "_Pr": 32716, - "_Pre": 79561, - "_Price": 93234, - "_Print": 45788, - "_Printf": 87257, - "_Private": 43830, - "_Pro": 16670, - "_Process": 70241, - "_Product": 44017, - "_Profile": 77294, - "_Project": 64659, - "_Property": 68353, - "_Ptr": 81822, - "_Public": 73905, - "_Q": 13337, - "_QMARK": 87343, - "_QU": 16332, - "_QUAL": 69942, - "_QUERY": 31585, - "_QUESTION": 93430, - "_QUEUE": 35292, - "_QUOTES": 53358, - "_Query": 48042, - "_R": 2568, - "_RA": 53554, - "_RAD": 90473, - "_RADIO": 74415, - "_RADIUS": 60226, - "_RAM": 62393, - "_RANDOM": 72675, - "_RANGE": 28270, - "_RANK": 70006, - "_RATE": 29108, - "_RATIO": 65679, - "_RAW": 39922, - "_RB": 89753, - "_RC": 41414, - "_RCC": 63011, - "_RD": 28694, - "_RDONLY": 66104, - "_RDWR": 66266, - "_RE": 2192, - "_READ": 13117, - "_READONLY": 93695, - "_READY": 51184, - "_REAL": 30111, - "_REALTYPE": 56261, - "_REASON": 71945, - "_REC": 62252, - "_RECE": 49816, - "_RECEIVED": 99145, - "_RECORD": 38243, - "_RECT": 69621, - "_RECV": 95042, - "_RED": 33737, - "_REDIRECT": 90279, - "_REF": 12312, - "_REFER": 70910, - "_REFERENCE": 21121, - "_REFERER": 86771, - "_REFRESH": 77272, - "_REG": 8064, - "_REGEX": 56196, - "_REGION": 39179, - "_REGISTER": 33355, - "_REGISTRY": 93895, - "_REGS": 83317, - "_REL": 41207, - "_RELEASE": 40649, - "_REMOTE": 69832, - "_REMOVE": 50046, - "_RENDER": 45867, - "_RENDERER": 96641, - "_REPEAT": 66570, - "_REPLACE": 97720, - "_REPLY": 70200, - "_REPO": 82479, - "_REPORT": 40413, - "_REQ": 30756, - "_REQUEST": 14454, - "_REQUIRE": 53927, - "_REQUIRED": 53912, - "_RES": 10983, - "_RESERVED": 67593, - "_RESET": 27028, - "_RESOLUTION": 92746, - "_RESOURCE": 38208, - "_RESOURCES": 89959, - "_RESP": 28980, - "_RESPONSE": 35901, - "_REST": 55133, - "_RESULT": 21181, - "_RESULTS": 76015, - "_RET": 38748, - "_RETRY": 77924, - "_RETURN": 21909, - "_RETURNTRANSFER": 71165, - "_REUSE": 91763, - "_REV": 65351, - "_RF": 65977, - "_RG": 47304, - "_RGB": 24815, - "_RGBA": 53336, - "_RGCTX": 60863, - "_RIGHT": 21199, - "_RING": 70695, - "_RM": 86254, - "_RO": 8302, - "_ROLE": 47298, - "_ROM": 71844, - "_ROOM": 59966, - "_ROOT": 16197, - "_ROT": 62667, - "_ROUND": 78519, - "_ROUT": 69588, - "_ROUTE": 62038, - "_ROW": 38889, - "_ROWS": 62725, - "_RPC": 76022, - "_RS": 59138, - "_RSA": 76994, - "_RSP": 85642, - "_RST": 64093, - "_RT": 53563, - "_RTC": 78945, - "_RULE": 50495, - "_RUN": 24068, - "_RUNNING": 70246, - "_RUNTIME": 52198, - "_RW": 60818, - "_RX": 20430, - "_Re": 50693, - "_Read": 38381, - "_Real": 93306, - "_Record": 75329, - "_Rect": 56469, - "_Red": 92940, - "_Ref": 81086, - "_Reference": 98790, - "_Reg": 49384, - "_Register": 73124, - "_Rel": 88922, - "_Release": 85573, - "_Rem": 54551, - "_Remove": 66843, - "_Render": 42102, - "_Renderer": 82104, - "_Report": 76428, - "_Request": 44024, - "_Res": 92815, - "_Reset": 67771, - "_Resource": 86346, - "_Response": 65873, - "_Result": 49596, - "_Return": 53316, - "_Right": 73275, - "_Row": 66932, - "_Run": 84158, - "_Runtime": 63422, - "_S": 1098, - "_SA": 81219, - "_SAFE": 57970, - "_SAMPL": 85144, - "_SAMPLE": 41439, - "_SAMPLES": 89881, - "_SAN": 63123, - "_SANITIZE": 76703, - "_SAVE": 43109, - "_SB": 72209, - "_SC": 12031, - "_SCALE": 39810, - "_SCAN": 41855, - "_SCANCODE": 83753, - "_SCENE": 89468, - "_SCHED": 86208, - "_SCHEDULE": 98118, - "_SCHEMA": 46220, - "_SCL": 92315, - "_SCOPE": 61725, - "_SCORE": 63727, - "_SCR": 89405, - "_SCREEN": 42399, - "_SCRIPT": 45968, - "_SCROLL": 60430, - "_SD": 45161, - "_SDK": 84197, - "_SE": 3620, - "_SEARCH": 33708, - "_SEC": 24672, - "_SECOND": 56224, - "_SECONDS": 75351, - "_SECRET": 31408, - "_SECTION": 44228, - "_SECURE": 77848, - "_SECURITY": 71116, - "_SEG": 52272, - "_SEGMENT": 87354, - "_SEL": 40251, - "_SELECT": 23060, - "_SELECTED": 59340, - "_SELECTION": 72489, - "_SELECTOR": 72396, - "_SELF": 38847, - "_SEND": 31872, - "_SENS": 38924, - "_SENSOR": 49836, - "_SENT": 72663, - "_SEP": 92052, - "_SEPARATOR": 32243, - "_SEQ": 50045, - "_SEQUENCE": 74018, - "_SER": 14844, - "_SERIAL": 54585, - "_SERVER": 20012, - "_SERVICE": 21590, - "_SESSION": 34361, - "_SET": 8481, - "_SETTING": 58955, - "_SETTINGS": 34189, - "_SETUP": 61178, - "_SF": 84679, - "_SH": 6834, - "_SHA": 38096, - "_SHADER": 45163, - "_SHADOW": 90943, - "_SHAPE": 93138, - "_SHARE": 68923, - "_SHARED": 54718, - "_SHIFT": 22657, - "_SHORT": 16456, - "_SHOW": 37822, - "_SI": 94421, - "_SID": 79386, - "_SIDE": 77761, - "_SIG": 55687, - "_SIGN": 36727, - "_SIGNAL": 52520, - "_SIGNATURE": 73752, - "_SIM": 30920, - "_SIMPLE": 67103, - "_SINGLE": 39028, - "_SITE": 60544, - "_SIZE": 4098, - "_SK": 34464, - "_SKIP": 67756, - "_SL": 25622, - "_SLAVE": 74418, - "_SLEEP": 64733, - "_SLOT": 53047, - "_SM": 28845, - "_SMALL": 56207, - "_SMS": 87326, - "_SN": 47260, - "_SO": 45142, - "_SOC": 67978, - "_SOCKET": 39736, - "_SOFT": 91338, - "_SOL": 90705, - "_SORT": 57187, - "_SOUND": 63327, - "_SOURCE": 25430, - "_SP": 17747, - "_SPACE": 38404, - "_SPE": 88455, - "_SPEC": 36436, - "_SPECIAL": 64240, - "_SPEED": 30391, - "_SPELL": 83668, - "_SPI": 31848, - "_SPLIT": 76415, - "_SPR": 79100, - "_SQL": 46625, - "_SR": 48163, - "_SRC": 29409, - "_SRV": 95990, - "_SS": 57207, - "_SSL": 45437, - "_ST": 2402, - "_STA": 81525, - "_STACK": 21801, - "_STAGE": 64820, - "_STANDARD": 73825, - "_STAR": 70786, - "_START": 13044, - "_STARTED": 76066, - "_STAT": 16113, - "_STATE": 10832, - "_STATES": 87437, - "_STATIC": 31352, - "_STATS": 51963, - "_STATUS": 9348, - "_STD": 47166, - "_STENCIL": 85666, - "_STEP": 39968, - "_STMT": 97963, - "_STOCK": 79581, - "_STOP": 31568, - "_STORAGE": 36024, - "_STORE": 40415, - "_STR": 7159, - "_STREAM": 23584, - "_STRING": 12283, - "_STRIP": 90054, - "_STRUCT": 30474, - "_STRUCTURE": 69906, - "_STS": 98947, - "_STYLE": 41775, - "_SU": 56615, - "_SUB": 17282, - "_SUBJECT": 89187, - "_SUCCESS": 8827, - "_SUFFIX": 63825, - "_SUITE": 84314, - "_SUM": 50369, - "_SUP": 51631, - "_SUPER": 86846, - "_SUPPLY": 89416, - "_SUPPORT": 24292, - "_SUPPORTED": 52583, - "_SUR": 60050, - "_SURFACE": 91321, - "_SUS": 78174, - "_SW": 22795, - "_SWAP": 77326, - "_SWITCH": 51183, - "_SY": 11399, - "_SYM": 82933, - "_SYMBOL": 23598, - "_SYN": 75662, - "_SYNC": 39189, - "_SYS": 26783, - "_SYSTEM": 30167, - "_SZ": 62333, - "_Save": 78746, - "_Se": 26920, - "_Search": 65913, - "_Select": 58073, - "_Selected": 38290, - "_SelectedIndexChanged": 47040, - "_Selection": 88435, - "_Send": 46267, - "_Server": 62320, - "_Service": 52548, - "_Session": 84664, - "_Set": 14812, - "_Settings": 71769, - "_Sh": 36578, - "_Show": 79665, - "_Size": 45553, - "_Source": 48122, - "_Space": 60283, - "_Speed": 87058, - "_St": 70645, - "_Start": 38056, - "_State": 24773, - "_Static": 27049, - "_StaticFields": 37735, - "_Statics": 56319, - "_Status": 36449, - "_Stop": 80308, - "_Store": 92684, - "_Str": 46171, - "_Stream": 80631, - "_String": 31777, - "_Struct": 72246, - "_Style": 88038, - "_Sub": 36359, - "_Success": 87161, - "_Surface": 69702, - "_Syntax": 48429, - "_System": 25363, - "_T": 1139, - "_TA": 61850, - "_TAB": 41708, - "_TABLE": 16039, - "_TAC": 48221, - "_TAG": 16592, - "_TAGS": 84182, - "_TARGET": 29299, - "_TASK": 26315, - "_TB": 87806, - "_TBL": 79418, - "_TC": 56738, - "_TCP": 50614, - "_TD": 95862, - "_TE": 36222, - "_TEAM": 71198, - "_TEM": 90617, - "_TEMP": 41244, - "_TEMPLATE": 34786, - "_TER": 65444, - "_TERM": 75220, - "_TERMIN": 79902, - "_TEST": 11641, - "_TESTS": 80312, - "_TEX": 84171, - "_TEXT": 10243, - "_TEXTURE": 17208, - "_TH": 10625, - "_THAN": 85868, - "_THAT": 91594, - "_THE": 76594, - "_THEME": 62281, - "_THIS": 66036, - "_THREAD": 27087, - "_THREADS": 56239, - "_THRESH": 34828, - "_THRESHOLD": 44405, - "_THROW": 43897, - "_TI": 56109, - "_TICK": 57260, - "_TILE": 75810, - "_TIM": 16746, - "_TIME": 10051, - "_TIMEOUT": 23412, - "_TIMER": 31833, - "_TIMES": 92560, - "_TIMESTAMP": 47854, - "_TITLE": 22717, - "_TLS": 69067, - "_TM": 70223, - "_TMP": 71517, - "_TO": 8650, - "_TODO": 87461, - "_TOGGLE": 79755, - "_TOKEN": 18681, - "_TOO": 74555, - "_TOOL": 57188, - "_TOOLTIP": 77852, - "_TOP": 25478, - "_TOPIC": 74077, - "_TOTAL": 50831, - "_TOUCH": 74288, - "_TP": 76000, - "_TR": 6410, - "_TRA": 39096, - "_TRACE": 24238, - "_TRACK": 44050, - "_TRAIN": 81488, - "_TRAN": 30967, - "_TRANS": 28953, - "_TRANSACTION": 78509, - "_TRANSFER": 64697, - "_TRANSFORM": 92621, - "_TRANSL": 71480, - "_TREE": 46691, - "_TRI": 41283, - "_TRIANGLE": 94175, - "_TRIANGLES": 89986, - "_TRIGGER": 56714, - "_TRNS": 92705, - "_TRUE": 14044, - "_TRUNC": 94642, - "_TRY": 85373, - "_TS": 61793, - "_TUN": 87228, - "_TURN": 94583, - "_TV": 96703, - "_TW": 95747, - "_TWO": 73892, - "_TX": 18819, - "_TXT": 84411, - "_TYP": 15109, - "_TYPE": 4189, - "_TYPED": 23982, - "_TYPEDEF": 78214, - "_TYPES": 25794, - "_Tab": 92842, - "_Table": 42544, - "_Tag": 78040, - "_Target": 75823, - "_Task": 77103, - "_Template": 57917, - "_Test": 32541, - "_TestCase": 87729, - "_Text": 20550, - "_TextChanged": 45536, - "_Texture": 72185, - "_Thread": 96076, - "_Tick": 73581, - "_Time": 39080, - "_Timer": 64026, - "_Tis": 46946, - "_Title": 72001, - "_To": 38346, - "_Tool": 88451, - "_Top": 94819, - "_Total": 85933, - "_Tr": 21038, - "_Trans": 34932, - "_Tree": 90770, - "_True": 93577, - "_Two": 82989, - "_Type": 13729, - "_TypeDef": 90720, - "_TypeInfo": 30895, - "_U": 6665, - "_UART": 32358, - "_UC": 80314, - "_UClass": 67089, - "_UD": 98265, - "_UDP": 75201, - "_UFunction": 94549, - "_UI": 30522, - "_UID": 69882, - "_UINT": 27241, - "_UL": 76228, - "_UN": 6735, - "_UNDEF": 98215, - "_UNDEFINED": 76863, - "_UNDER": 92614, - "_UNICODE": 75688, - "_UNIFORM": 98426, - "_UNIQUE": 90330, - "_UNIT": 31718, - "_UNITS": 90787, - "_UNIX": 82754, - "_UNKNOWN": 31546, - "_UNLOCK": 63068, - "_UNS": 33399, - "_UNSIGNED": 51979, - "_UNSUPPORTED": 89140, - "_UNUSED": 31916, - "_UP": 14055, - "_UPDATE": 22408, - "_UPDATED": 86048, - "_UPLOAD": 63036, - "_UPPER": 91703, - "_URI": 23116, - "_URL": 8000, - "_US": 13467, - "_USAGE": 57290, - "_USART": 68162, - "_USB": 35992, - "_USE": 22295, - "_USED": 77348, - "_USER": 9107, - "_USERNAME": 42696, - "_USERS": 52875, - "_UT": 87526, - "_UTF": 55061, - "_UTIL": 49904, - "_UTILS": 87967, - "_UUID": 57499, - "_Un": 40687, - "_Unit": 80481, - "_UnityEngine": 59938, - "_Up": 88425, - "_Update": 47393, - "_User": 31339, - "_Util": 89743, - "_Utils": 91175, - "_V": 2334, - "_VAL": 6096, - "_VALID": 27335, - "_VALIDATE": 63927, - "_VALUE": 7476, - "_VALUES": 58662, - "_VAR": 25750, - "_VARIABLE": 45873, - "_VARS": 73793, - "_VC": 84252, - "_VE": 89368, - "_VEC": 70706, - "_VECTOR": 47993, - "_VENDOR": 56448, - "_VER": 14815, - "_VERBOSE": 52102, - "_VERIFY": 56042, - "_VERSION": 10678, - "_VERTEX": 47028, - "_VERTICAL": 73559, - "_VF": 98842, - "_VIDEO": 32884, - "_VIEW": 24374, - "_VIRTUAL": 76959, - "_VIS": 54442, - "_VISIBLE": 57189, - "_VLAN": 93489, - "_VM": 65396, - "_VO": 64755, - "_VOICE": 92830, - "_VOID": 57144, - "_VOL": 70415, - "_VOLT": 81373, - "_VOLUME": 60371, - "_Val": 88271, - "_Valid": 97279, - "_Value": 27867, - "_ValueChanged": 98913, - "_Var": 61251, - "_Variable": 83932, - "_Vector": 61377, - "_Version": 85217, - "_Vert": 80810, - "_View": 50711, - "_W": 2763, - "_WAIT": 32091, - "_WAKE": 76221, - "_WALL": 93435, - "_WARN": 35148, - "_WARNING": 31962, - "_WARNINGS": 83830, - "_WATCH": 96009, - "_WATER": 97850, - "_WE": 32244, - "_WEAPON": 93279, - "_WEB": 53085, - "_WEEK": 76999, - "_WEIGHT": 60697, - "_WH": 53876, - "_WHITE": 59831, - "_WIDGET": 49094, - "_WIDTH": 13947, - "_WIFI": 75470, - "_WIN": 34377, - "_WINDOW": 24780, - "_WINDOWS": 71425, - "_WITH": 23929, - "_WM": 75452, - "_WORD": 33238, - "_WORDS": 88421, - "_WORK": 34044, - "_WORLD": 38913, - "_WP": 98149, - "_WR": 21779, - "_WRAP": 45087, - "_WRAPPER": 98851, - "_WRITE": 17475, - "_WRONG": 89607, - "_WRONLY": 88649, - "_WS": 68388, - "_Widget": 58049, - "_Width": 77609, - "_Window": 60649, - "_Word": 96544, - "_Work": 87471, - "_Write": 31825, - "_X": 6859, - "_XDECREF": 71821, - "_XML": 45617, - "_Y": 10626, - "_YEAR": 57127, - "_YELLOW": 94139, - "_YES": 76730, - "_YUV": 89046, - "_Z": 12302, - "_ZERO": 39370, - "_ZONE": 60742, - "_Zero": 97672, - "_[": 11883, - "_\\": 56014, - "_]": 74827, - "_^": 67280, - "_^(": 65018, - "__": 563, - "__\":Ċ": 21082, - "__$": 41089, - "__',": 87510, - "__':Ċ": 16179, - "__':čĊ": 82777, - "__(": 3804, - "__(\"": 51669, - "__('": 23426, - "__((": 30409, - "__()": 94786, - "__()Ċ": 32616, - "__()ĊĊ": 65264, - "__(*": 68006, - "__(/*!": 51796, - "__(Ċ": 60994, - "__)": 19141, - "__))": 63553, - "__));Ċ": 97332, - "__))Ċ": 64113, - "__),": 55087, - "__).": 59043, - "__);": 87569, - "__);Ċ": 21205, - "__);ĊĊ": 64277, - "__)Ċ": 23135, - "__)ĊĊ": 40725, - "__)ĊĊĊ": 66960, - "__*/": 50993, - "__,": 10445, - "__,__": 82930, - "__,Ċ": 48566, - "__.": 18725, - "__.'/": 70837, - "__.__": 49380, - "__/": 47372, - "__:": 80342, - "__;": 54637, - "__;Ċ": 57048, - "__[": 66190, - "__[\"": 41903, - "___": 5973, - "____": 2130, - "_____": 80517, - "________": 3979, - "____________": 41383, - "________________": 7686, - "________________________________": 17466, - "________________________________________________________________": 46932, - "_________________ĊĊ": 88252, - "___ĊĊ": 60288, - "__Ċ": 12148, - "__ĊĊ": 24197, - "__čĊ": 62564, - "_a": 4306, - "_aa": 89808, - "_ab": 22885, - "_ability": 95763, - "_abort": 70907, - "_about": 57975, - "_above": 77315, - "_abs": 31170, - "_absolute": 50874, - "_abstract": 85939, - "_ac": 14718, - "_acc": 17737, - "_accel": 52638, - "_accept": 35728, - "_accepted": 90354, - "_access": 12759, - "_accessible": 88724, - "_accessor": 33901, - "_account": 13500, - "_accounts": 55665, - "_accum": 75837, - "_accuracy": 41358, - "_ack": 48447, - "_acl": 63692, - "_acquire": 97523, - "_act": 29370, - "_action": 7931, - "_actions": 25368, - "_activ": 71684, - "_activate": 67894, - "_activation": 52404, - "_active": 12930, - "_activities": 97740, - "_activity": 30026, - "_actor": 54818, - "_actual": 40149, - "_ad": 10027, - "_adapter": 43682, - "_adc": 64840, - "_add": 2891, - "_added": 37653, - "_additional": 81742, - "_addr": 7387, - "_address": 6744, - "_addresses": 59471, - "_adj": 42559, - "_adjust": 44153, - "_admin": 12207, - "_ads": 72275, - "_adv": 35656, - "_advance": 98093, - "_advanced": 83843, - "_aes": 90958, - "_af": 67213, - "_aff": 48914, - "_after": 19844, - "_ag": 20587, - "_again": 62427, - "_age": 32053, - "_agent": 25730, - "_agents": 76347, - "_agg": 83534, - "_ai": 69415, - "_air": 50827, - "_ajax": 38119, - "_ak": 72148, - "_al": 8418, - "_alarm": 66286, - "_album": 53241, - "_alert": 35717, - "_alg": 72123, - "_algo": 76993, - "_algorithm": 59531, - "_alias": 35947, - "_aliases": 90233, - "_align": 37015, - "_aligned": 66385, - "_alignment": 51006, - "_alive": 58850, - "_all": 5705, - "_alloc": 14802, - "_allocate": 77078, - "_allocated": 82342, - "_allocation": 81267, - "_allocator": 56910, - "_allow": 55731, - "_allowed": 42155, - "_almost": 94418, - "_alpha": 26633, - "_already": 80772, - "_alt": 32105, - "_altern": 79728, - "_am": 22880, - "_amount": 13471, - "_amp": 60281, - "_amt": 54605, - "_an": 12008, - "_analysis": 42682, - "_anchor": 56532, - "_and": 8378, - "_android": 56665, - "_ang": 58060, - "_angle": 21727, - "_angles": 72643, - "_anim": 58076, - "_animation": 48487, - "_ann": 51870, - "_annotation": 61237, - "_annotations": 78896, - "_ans": 60801, - "_answer": 28534, - "_answers": 61610, - "_ant": 62460, - "_any": 37248, - "_ap": 21093, - "_api": 11697, - "_app": 8191, - "_append": 26041, - "_application": 38721, - "_apply": 36551, - "_appro": 36057, - "_approval": 95613, - "_approved": 86850, - "_approx": 90425, - "_apps": 69899, - "_ar": 25842, - "_arc": 62914, - "_arch": 34330, - "_archive": 42873, - "_are": 56855, - "_area": 15030, - "_areas": 78572, - "_arg": 6057, - "_args": 8384, - "_argument": 9025, - "_arguments": 43433, - "_argv": 73563, - "_arm": 34680, - "_armor": 84451, - "_arr": 11210, - "_array": 3858, - "_arrays": 68983, - "_arrow": 46566, - "_art": 36932, - "_article": 37321, - "_articles": 71283, - "_artist": 66840, - "_ary": 82219, - "_as": 11898, - "_asc": 88474, - "_ascii": 50238, - "_ask": 92269, - "_asm": 67529, - "_aspect": 80070, - "_ass": 12083, - "_assert": 16553, - "_asset": 42299, - "_assets": 53299, - "_assign": 20688, - "_assigned": 85515, - "_assignment": 51891, - "_assoc": 18891, - "_associ": 58665, - "_ast": 48019, - "_async": 28346, - "_at": 3752, - "_atom": 42292, - "_atomic": 51367, - "_atoms": 67755, - "_att": 13356, - "_attach": 40719, - "_attached": 93561, - "_attachment": 40868, - "_attachments": 98581, - "_attack": 45697, - "_attempt": 85951, - "_attempts": 79490, - "_attention": 75825, - "_attr": 10422, - "_attrib": 68787, - "_attribute": 16791, - "_attributes": 18240, - "_attrs": 39578, - "_atts": 95770, - "_atual": 97050, - "_auc": 75080, - "_audio": 29688, - "_audit": 84437, - "_aug": 60411, - "_aut": 32808, - "_auth": 14014, - "_authenticated": 64913, - "_authentication": 89465, - "_author": 22938, - "_auto": 27740, - "_aux": 30468, - "_av": 26173, - "_avail": 76967, - "_available": 26962, - "_avatar": 51104, - "_average": 38594, - "_avg": 26631, - "_aw": 54168, - "_ax": 42385, - "_axes": 58394, - "_axis": 23567, - "_az": 95387, - "_b": 880, - "_back": 3895, - "_backend": 40011, - "_background": 24103, - "_backup": 44710, - "_backward": 70477, - "_bad": 34199, - "_bag": 74368, - "_bal": 56441, - "_balance": 29396, - "_ball": 55808, - "_band": 45344, - "_bank": 35733, - "_banner": 46571, - "_bar": 14388, - "_barang": 54601, - "_barrier": 82355, - "_base": 7651, - "_based": 66679, - "_baseline": 82065, - "_basename": 81135, - "_bases": 96290, - "_basic": 34729, - "_basis": 62696, - "_batch": 14534, - "_batches": 57755, - "_battery": 81930, - "_bb": 50255, - "_bbox": 59390, - "_bc": 65803, - "_bd": 68499, - "_be": 21263, - "_beam": 85350, - "_bed": 89079, - "_before": 23708, - "_beg": 91167, - "_begin": 23338, - "_beh": 43241, - "_behavior": 74540, - "_bel": 96761, - "_below": 82750, - "_ber": 88165, - "_best": 33101, - "_bet": 91745, - "_beta": 49292, - "_between": 48302, - "_bg": 23122, - "_bh": 90581, - "_bi": 66814, - "_bias": 36381, - "_bid": 62509, - "_big": 36386, - "_bill": 63153, - "_billing": 87807, - "_bin": 21816, - "_binary": 31761, - "_bind": 27461, - "_binding": 60815, - "_bindings": 94516, - "_bins": 44912, - "_bio": 89641, - "_birth": 52973, - "_bit": 13996, - "_bitmap": 41527, - "_bits": 20034, - "_bl": 13141, - "_black": 40272, - "_blank": 56103, - "_ble": 70713, - "_blend": 88520, - "_blk": 51969, - "_blob": 45908, - "_bloc": 71572, - "_block": 7113, - "_blocked": 89223, - "_blocking": 91449, - "_blocks": 25201, - "_blog": 35815, - "_blue": 34991, - "_blueprint": 75327, - "_bm": 91922, - "_bn": 58112, - "_bo": 56013, - "_board": 23919, - "_body": 14114, - "_bold": 95677, - "_bonus": 59541, - "_book": 26421, - "_booking": 65165, - "_books": 73084, - "_bool": 22159, - "_boolean": 46642, - "_boost": 84913, - "_boot": 52062, - "_bootstrap": 88424, - "_border": 31940, - "_bot": 38883, - "_both": 88819, - "_bottom": 25473, - "_bound": 19447, - "_boundary": 54004, - "_bounds": 36878, - "_box": 10194, - "_boxes": 38384, - "_bp": 57106, - "_br": 17682, - "_branch": 28031, - "_brand": 54858, - "_break": 39494, - "_bridge": 54944, - "_brightness": 91028, - "_broadcast": 74923, - "_browser": 53414, - "_bs": 68550, - "_bt": 48626, - "_btn": 14839, - "_bucket": 38749, - "_buckets": 84156, - "_budget": 68867, - "_buf": 10363, - "_buff": 29328, - "_buffer": 7776, - "_buffers": 54591, - "_bug": 73232, - "_build": 20801, - "_builder": 28532, - "_building": 82397, - "_builtin": 73829, - "_bulk": 71392, - "_bullet": 94619, - "_bundle": 60986, - "_bus": 25418, - "_business": 65998, - "_busy": 75959, - "_but": 86874, - "_button": 8487, - "_buttons": 41021, - "_buy": 46348, - "_bw": 64484, - "_by": 3710, - "_byte": 19737, - "_bytes": 12524, - "_c": 666, - "_ca": 49604, - "_cache": 11529, - "_cached": 64369, - "_cal": 24005, - "_calc": 38241, - "_calendar": 57665, - "_calibration": 99086, - "_call": 13429, - "_callable": 64940, - "_callback": 12519, - "_callbacks": 60148, - "_called": 27859, - "_calls": 45636, - "_cam": 42511, - "_camera": 29843, - "_campaign": 58561, - "_can": 27421, - "_cancel": 28895, - "_candidate": 62360, - "_candidates": 73553, - "_canvas": 47136, - "_cap": 16388, - "_capabilities": 92092, - "_capability": 89686, - "_capacity": 35603, - "_caps": 52955, - "_caption": 61705, - "_capture": 55148, - "_car": 26616, - "_card": 16888, - "_cards": 41357, - "_cart": 24186, - "_case": 19096, - "_cases": 41427, - "_cash": 64363, - "_cast": 5303, - "_cat": 20825, - "_catalog": 47310, - "_cate": 92049, - "_categoria": 78736, - "_categorical": 87455, - "_categories": 27542, - "_category": 11847, - "_cats": 77370, - "_cb": 16450, - "_cc": 28955, - "_cd": 43074, - "_ce": 50727, - "_cell": 16648, - "_cells": 37796, - "_cent": 32591, - "_center": 21087, - "_centers": 80179, - "_cert": 37097, - "_certificate": 63047, - "_cf": 71143, - "_cfg": 18343, - "_cg": 98353, - "_ch": 4138, - "_chain": 30583, - "_challenge": 87406, - "_chan": 45552, - "_chance": 74127, - "_change": 15947, - "_changed": 25213, - "_changes": 47526, - "_channel": 14571, - "_channels": 19291, - "_char": 9232, - "_character": 40988, - "_characters": 79060, - "_charge": 46008, - "_chars": 37418, - "_charset": 65883, - "_chart": 40961, - "_chat": 35053, - "_che": 83527, - "_check": 7200, - "_checkbox": 55244, - "_checked": 56456, - "_checker": 62715, - "_checkout": 68186, - "_checkpoint": 55208, - "_checks": 75797, - "_checksum": 64038, - "_chg": 96276, - "_chi": 98826, - "_child": 17268, - "_children": 31206, - "_chip": 49514, - "_chk": 64673, - "_choice": 31936, - "_choices": 61909, - "_choose": 77433, - "_chr": 68993, - "_chunk": 30539, - "_chunks": 65470, - "_ci": 43514, - "_cid": 68699, - "_cipher": 76692, - "_circle": 42222, - "_city": 24971, - "_ck": 89236, - "_cl": 6794, - "_claim": 84969, - "_class": 4790, - "_classes": 16833, - "_classification": 80872, - "_classifier": 63329, - "_clause": 57530, - "_clean": 19573, - "_cleanup": 42444, - "_clear": 21811, - "_cli": 47147, - "_click": 18631, - "_clicked": 30147, - "_client": 8179, - "_cliente": 44661, - "_clients": 56899, - "_clip": 44728, - "_clk": 36500, - "_clock": 23062, - "_clone": 54742, - "_close": 12704, - "_closed": 44697, - "_closure": 72823, - "_cloud": 37356, - "_clr": 98480, - "_cls": 38656, - "_cluster": 28441, - "_clusters": 46243, - "_cm": 43619, - "_cmd": 11684, - "_cmds": 89472, - "_cmos": 81597, - "_cmp": 35193, - "_cn": 52177, - "_cnt": 15982, - "_co": 11393, - "_cod": 55290, - "_code": 4136, - "_codec": 51084, - "_codegen": 32018, - "_codes": 38482, - "_codigo": 74532, - "_coef": 63929, - "_coeff": 31990, - "_coeffs": 85950, - "_coin": 75718, - "_col": 10211, - "_coll": 43597, - "_collect": 68140, - "_collection": 25019, - "_collections": 89742, - "_collision": 70375, - "_color": 6714, - "_colors": 33670, - "_colour": 56260, - "_cols": 25347, - "_column": 8744, - "_columns": 22590, - "_com": 2965, - "_comb": 34454, - "_combine": 72374, - "_combined": 89945, - "_combo": 54781, - "_comm": 25149, - "_command": 10811, - "_commands": 44151, - "_comment": 17638, - "_comments": 30359, - "_commit": 36346, - "_common": 21107, - "_community": 97508, - "_comp": 18177, - "_company": 33403, - "_compare": 32235, - "_comparison": 90797, - "_compat": 89602, - "_compile": 74170, - "_compiler": 80910, - "_complete": 27675, - "_completed": 49068, - "_completion": 60164, - "_complex": 41522, - "_component": 23406, - "_components": 23258, - "_compress": 87845, - "_compute": 57028, - "_con": 3382, - "_concat": 57478, - "_cond": 24433, - "_condition": 27656, - "_conditions": 54099, - "_conf": 16059, - "_config": 5332, - "_configs": 59150, - "_configuration": 35726, - "_configure": 75887, - "_confirm": 23800, - "_confirmation": 37681, - "_conn": 17241, - "_connect": 15720, - "_connected": 43276, - "_connection": 15866, - "_connections": 56402, - "_connector": 76393, - "_cons": 31971, - "_console": 51724, - "_const": 13610, - "_constant": 34967, - "_constants": 55642, - "_constraint": 46973, - "_constraints": 60267, - "_construct": 64803, - "_constructor": 66210, - "_consts": 48530, - "_consum": 69870, - "_consumer": 73969, - "_cont": 10260, - "_contact": 20597, - "_contacts": 64174, - "_container": 15847, - "_contains": 63598, - "_content": 7495, - "_contents": 16682, - "_context": 8467, - "_contin": 68948, - "_continue": 75297, - "_continuous": 94400, - "_contr": 62663, - "_contract": 51499, - "_contrib": 92581, - "_control": 13436, - "_controller": 21600, - "_controls": 50936, - "_conv": 22716, - "_conversion": 64132, - "_convert": 34910, - "_converter": 74073, - "_cookie": 38663, - "_cookies": 94158, - "_coord": 30096, - "_coordinate": 68649, - "_coordinates": 50084, - "_coords": 32576, - "_copy": 16096, - "_cor": 14734, - "_core": 15467, - "_cores": 93441, - "_corner": 66884, - "_corners": 82774, - "_corpus": 94226, - "_corr": 53866, - "_correct": 31550, - "_correction": 82474, - "_cos": 61192, - "_cost": 15890, - "_costs": 85946, - "_cou": 98763, - "_count": 3180, - "_counter": 15730, - "_counters": 85632, - "_countries": 91674, - "_country": 28106, - "_counts": 25977, - "_coupon": 76049, - "_course": 31726, - "_courses": 72551, - "_cov": 50028, - "_cover": 38087, - "_coverage": 73384, - "_cp": 39811, - "_cpp": 59686, - "_cpu": 21795, - "_cpus": 90673, - "_cr": 32331, - "_crc": 59084, - "_cre": 92862, - "_create": 8657, - "_created": 27288, - "_creation": 46163, - "_creator": 68532, - "_cred": 73475, - "_credentials": 47396, - "_credit": 51569, - "_crit": 92089, - "_criteria": 80990, - "_critical": 77502, - "_crop": 51453, - "_cross": 35284, - "_crossentropy": 88246, - "_crypto": 78298, - "_cs": 35372, - "_css": 25924, - "_csv": 14020, - "_ct": 26134, - "_ctl": 42891, - "_ctor": 54185, - "_ctr": 69096, - "_ctrl": 22667, - "_ctx": 15147, - "_ctxt": 93285, - "_cu": 92045, - "_cube": 64065, - "_cuda": 62706, - "_cum": 91328, - "_cur": 18956, - "_curr": 40515, - "_currency": 34710, - "_current": 11080, - "_cursor": 28601, - "_curve": 43407, - "_cust": 87652, - "_custom": 15875, - "_customer": 28840, - "_customize": 40595, - "_cut": 41317, - "_cutoff": 74382, - "_cv": 43233, - "_cycle": 39079, - "_cycles": 68970, - "_d": 814, - "_da": 47070, - "_daily": 64530, - "_damage": 40895, - "_dark": 67937, - "_dash": 84585, - "_dashboard": 55791, - "_dat": 15353, - "_data": 1769, - "_database": 27341, - "_dataframe": 77570, - "_datas": 46530, - "_dataset": 18999, - "_datasets": 81325, - "_date": 4164, - "_dates": 46382, - "_datetime": 28943, - "_datos": 87548, - "_day": 16763, - "_days": 28353, - "_db": 8685, - "_dbg": 44124, - "_dc": 55847, - "_dd": 43174, - "_de": 2259, - "_dead": 53427, - "_death": 78294, - "_debug": 15446, - "_dec": 13783, - "_decay": 43260, - "_decimal": 74429, - "_decision": 90636, - "_deck": 83860, - "_decl": 35814, - "_declaration": 77926, - "_decode": 15227, - "_decoder": 49843, - "_decor": 70369, - "_decorator": 87252, - "_decrypt": 80764, - "_deep": 87044, - "_def": 7844, - "_default": 9993, - "_defaults": 42290, - "_define": 51049, - "_defined": 52870, - "_definition": 31698, - "_definitions": 84881, - "_defs": 56535, - "_deg": 46057, - "_degree": 49524, - "_deinit": 97435, - "_del": 18029, - "_delay": 22198, - "_delegate": 55312, - "_delete": 11353, - "_deleted": 39418, - "_delivery": 50562, - "_delta": 26710, - "_dem": 69403, - "_demand": 91295, - "_demo": 47830, - "_den": 49522, - "_dense": 72619, - "_density": 53349, - "_dep": 49258, - "_depart": 69865, - "_department": 71886, - "_depend": 34161, - "_dependencies": 71841, - "_dependency": 62387, - "_deploy": 91890, - "_deposit": 85798, - "_deps": 76489, - "_dept": 93868, - "_depth": 19061, - "_der": 35345, - "_deriv": 76546, - "_derivative": 95930, - "_des": 15768, - "_desc": 10986, - "_descr": 64622, - "_description": 11448, - "_descriptor": 33774, - "_design": 49803, - "_dest": 25264, - "_destination": 56344, - "_destroy": 18066, - "_det": 24409, - "_detach": 93067, - "_detail": 14480, - "_details": 13260, - "_detalle": 95471, - "_detect": 56457, - "_detected": 98876, - "_detection": 57505, - "_detector": 71540, - "_dev": 10433, - "_device": 9204, - "_devices": 41334, - "_df": 10894, - "_di": 29477, - "_diag": 61304, - "_dialog": 24331, - "_dic": 39154, - "_dice": 97196, - "_dict": 5243, - "_dictionary": 42605, - "_dicts": 88961, - "_die": 61588, - "_diff": 15850, - "_difference": 47525, - "_different": 82741, - "_digest": 52994, - "_digit": 48403, - "_digits": 41432, - "_dim": 10791, - "_dimension": 49619, - "_dimensions": 59699, - "_dims": 29267, - "_dir": 4334, - "_direct": 32871, - "_direction": 25438, - "_directory": 14846, - "_dirs": 44869, - "_dirty": 63642, - "_dis": 9932, - "_disable": 33842, - "_disabled": 51401, - "_disc": 37745, - "_disconnect": 67972, - "_discount": 42879, - "_disk": 41687, - "_disp": 50692, - "_dispatch": 42991, - "_dispatcher": 92189, - "_display": 14825, - "_dist": 16031, - "_distance": 19464, - "_distances": 77329, - "_distribution": 41465, - "_district": 75440, - "_div": 16237, - "_dl": 50811, - "_dll": 94626, - "_dm": 57182, - "_dma": 39476, - "_dn": 69799, - "_dns": 71125, - "_do": 26309, - "_doc": 18869, - "_docs": 49692, - "_document": 26231, - "_documento": 83061, - "_documents": 75927, - "_does": 96374, - "_dom": 35749, - "_domain": 20111, - "_domains": 70199, - "_don": 73974, - "_done": 24390, - "_door": 78962, - "_dot": 30941, - "_double": 24598, - "_down": 13998, - "_download": 35939, - "_dp": 53872, - "_dr": 26680, - "_draft": 91339, - "_drag": 72095, - "_draw": 23021, - "_drawer": 94507, - "_drive": 67151, - "_driver": 20602, - "_drop": 29584, - "_dropdown": 51024, - "_dropout": 74605, - "_drv": 39136, - "_drvdata": 79544, - "_ds": 35362, - "_dst": 33114, - "_dt": 27516, - "_dtype": 64886, - "_dual": 96772, - "_due": 75728, - "_dummy": 60321, - "_dump": 18296, - "_dup": 51932, - "_duplicate": 70434, - "_duplicates": 75051, - "_dur": 82289, - "_duration": 25454, - "_dw": 79503, - "_dx": 61984, - "_dy": 82635, - "_dyn": 69213, - "_dynamic": 45992, - "_e": 2204, - "_each": 32046, - "_easy": 59091, - "_ec": 36844, - "_echo": 68628, - "_ed": 32370, - "_edge": 17932, - "_edges": 28026, - "_edit": 13156, - "_editor": 33752, - "_ef": 79410, - "_eff": 51945, - "_effect": 27125, - "_effects": 83171, - "_eg": 90209, - "_el": 21602, - "_elapsed": 73737, - "_ele": 61365, - "_elem": 28179, - "_element": 7894, - "_elements": 22801, - "_elems": 86217, - "_elim": 84655, - "_else": 62628, - "_elt": 91034, - "_em": 22504, - "_email": 9172, - "_emails": 77773, - "_emb": 56864, - "_embed": 24007, - "_embedding": 51502, - "_embeddings": 63772, - "_emit": 69082, - "_emlrt": 92079, - "_emp": 56766, - "_employee": 51781, - "_empresa": 71787, - "_empty": 15124, - "_en": 6205, - "_enable": 18988, - "_enabled": 18220, - "_enc": 13781, - "_encode": 11224, - "_encoded": 73069, - "_encoder": 39068, - "_encoding": 37613, - "_encrypt": 66593, - "_end": 6213, - "_endian": 87193, - "_endpoint": 36699, - "_ends": 90729, - "_enemy": 73682, - "_energy": 34795, - "_eng": 62102, - "_engine": 24823, - "_enqueue": 28395, - "_ent": 27425, - "_enter": 37480, - "_entities": 47377, - "_entity": 19169, - "_entries": 26092, - "_entropy": 50374, - "_entry": 9078, - "_enum": 31054, - "_env": 15879, - "_environment": 51774, - "_eof": 90792, - "_ep": 12476, - "_epi": 41359, - "_episode": 72224, - "_episodes": 97007, - "_epoch": 20682, - "_epochs": 44127, - "_eps": 74996, - "_epsilon": 98983, - "_eq": 10714, - "_equ": 41443, - "_equal": 11478, - "_equalTo": 55522, - "_equals": 61664, - "_equiv": 71849, - "_er": 80604, - "_erase": 85516, - "_err": 9266, - "_errno": 37363, - "_error": 4096, - "_errors": 20196, - "_es": 33741, - "_esc": 92196, - "_escape": 21832, - "_est": 18583, - "_estado": 62064, - "_estimate": 78718, - "_estimator": 91968, - "_estimators": 81054, - "_et": 45668, - "_eta": 54925, - "_eth": 57757, - "_ev": 43713, - "_eval": 21296, - "_evaluation": 86505, - "_even": 68347, - "_event": 6748, - "_events": 19691, - "_every": 64048, - "_evt": 60019, - "_ex": 2702, - "_exact": 71084, - "_exam": 83334, - "_example": 39304, - "_examples": 45279, - "_exc": 45647, - "_excel": 51242, - "_except": 54633, - "_exception": 17499, - "_exceptions": 80036, - "_excerpt": 66947, - "_exchange": 59212, - "_exclude": 88668, - "_exe": 76074, - "_exec": 18430, - "_execute": 44329, - "_execution": 60948, - "_executor": 81207, - "_exempt": 95736, - "_exist": 35906, - "_existing": 62630, - "_exists": 9766, - "_exit": 16880, - "_exp": 14214, - "_expand": 67875, - "_expect": 68918, - "_expected": 32190, - "_experience": 91142, - "_experiment": 82302, - "_expire": 83409, - "_expired": 80221, - "_expiry": 96509, - "_export": 27114, - "_exports": 45309, - "_expr": 21915, - "_expression": 28068, - "_ext": 9927, - "_extend": 70265, - "_extended": 61678, - "_extension": 31035, - "_extensions": 60498, - "_extent": 70102, - "_external": 47432, - "_extra": 31858, - "_extract": 39123, - "_extraction": 94842, - "_extractor": 89821, - "_eye": 76087, - "_f": 761, - "_fa": 95864, - "_fac": 41589, - "_face": 30985, - "_facebook": 81487, - "_faces": 59848, - "_fact": 47805, - "_factor": 18588, - "_factors": 73040, - "_factory": 24269, - "_fail": 22121, - "_failed": 35060, - "_failure": 43618, - "_fake": 56881, - "_false": 36015, - "_family": 26823, - "_far": 67513, - "_fast": 35743, - "_fatal": 92188, - "_fault": 70097, - "_favorite": 96744, - "_fb": 50796, - "_fc": 46506, - "_fd": 17676, - "_fds": 90438, - "_fe": 7642, - "_feat": 46753, - "_feats": 70646, - "_feature": 17069, - "_featured": 79420, - "_features": 14965, - "_fecha": 72517, - "_fee": 34305, - "_feed": 42390, - "_feedback": 58138, - "_female": 97827, - "_fence": 81073, - "_fetch": 11803, - "_ff": 58708, - "_fft": 67059, - "_fg": 69473, - "_fh": 90808, - "_fid": 92247, - "_field": 5013, - "_fields": 12132, - "_fifo": 56590, - "_fig": 62141, - "_figure": 82731, - "_fil": 78200, - "_file": 2458, - "_filename": 13323, - "_filenames": 80632, - "_filepath": 53490, - "_files": 10931, - "_fill": 30728, - "_filled": 90592, - "_filt": 92220, - "_filter": 8727, - "_filtered": 51429, - "_filters": 22481, - "_fin": 39737, - "_final": 20676, - "_finalize": 70616, - "_find": 21814, - "_finder": 87402, - "_finish": 42980, - "_finished": 56423, - "_fire": 45772, - "_firestore": 89824, - "_first": 12978, - "_firstname": 92095, - "_fit": 32416, - "_fitness": 85346, - "_five": 95258, - "_fix": 36060, - "_fixed": 37839, - "_fixture": 74409, - "_fk": 65886, - "_fl": 5081, - "_flag": 10933, - "_flags": 14130, - "_flash": 30225, - "_flashdata": 48843, - "_flat": 49556, - "_flg": 86258, - "_flight": 90370, - "_flip": 56012, - "_float": 17586, - "_floor": 60044, - "_flow": 27441, - "_flush": 39213, - "_flutter": 68089, - "_flux": 66661, - "_fm": 78694, - "_fmt": 38128, - "_fn": 15246, - "_fname": 42334, - "_focus": 47492, - "_fold": 61187, - "_folder": 15268, - "_folders": 83928, - "_follow": 43490, - "_font": 17451, - "_fonts": 71502, - "_food": 58580, - "_foot": 75759, - "_footer": 25966, - "_for": 5478, - "_force": 40739, - "_fore": 35563, - "_foreign": 78983, - "_form": 7915, - "_format": 8955, - "_formats": 68351, - "_formatted": 86610, - "_formatter": 73965, - "_forms": 64282, - "_formula": 63869, - "_forum": 78327, - "_forward": 32121, - "_found": 21480, - "_four": 56142, - "_fp": 34160, - "_fps": 65163, - "_fr": 41537, - "_frac": 70358, - "_fraction": 59023, - "_frag": 80817, - "_fragment": 43012, - "_frame": 8929, - "_frames": 29319, - "_framework": 27565, - "_fre": 74179, - "_free": 8905, - "_freq": 21790, - "_frequency": 40132, - "_friend": 60580, - "_friends": 75430, - "_frm": 82239, - "_from": 5673, - "_front": 22926, - "_frontend": 93833, - "_fs": 34470, - "_fsm": 97069, - "_ft": 41572, - "_fu": 36467, - "_full": 16372, - "_fun": 28315, - "_func": 9596, - "_funcs": 64124, - "_function": 9174, - "_functions": 31708, - "_future": 59740, - "_fw": 57449, - "_fwd": 81083, - "_fx": 62691, - "_g": 1889, - "_gain": 39925, - "_gallery": 51867, - "_game": 18547, - "_games": 67370, - "_gamma": 61179, - "_gap": 51790, - "_gas": 82116, - "_gate": 54798, - "_gateway": 64049, - "_gb": 87935, - "_gc": 49423, - "_gchandle": 75833, - "_ge": 32933, - "_gem": 87135, - "_gen": 16322, - "_gender": 62821, - "_gene": 59602, - "_gener": 71963, - "_general": 39177, - "_generate": 48851, - "_generated": 67313, - "_generation": 64191, - "_generator": 25813, - "_generic": 41232, - "_genes": 83472, - "_genre": 91322, - "_geo": 60308, - "_geom": 72987, - "_geometry": 57022, - "_get": 3062, - "_gettime": 98221, - "_ghost": 98784, - "_gid": 72893, - "_gift": 94928, - "_git": 68801, - "_given": 57653, - "_gl": 34569, - "_glob": 95133, - "_global": 19296, - "_globals": 58775, - "_glyph": 88703, - "_go": 25515, - "_goal": 41264, - "_goals": 96244, - "_gold": 54696, - "_good": 44781, - "_goods": 45095, - "_google": 47155, - "_goto": 97732, - "_gp": 75196, - "_gpio": 32001, - "_gps": 83407, - "_gpu": 35628, - "_gr": 15682, - "_grad": 18352, - "_grade": 50515, - "_gradient": 49482, - "_gradients": 96972, - "_graph": 14738, - "_graphics": 84385, - "_gray": 51331, - "_greater": 97994, - "_green": 48254, - "_grid": 15604, - "_ground": 72492, - "_group": 6288, - "_groups": 21148, - "_growth": 49182, - "_grp": 59448, - "_grupo": 96110, - "_gs": 96930, - "_gshared": 18571, - "_gt": 37479, - "_guard": 36796, - "_guess": 54737, - "_guest": 62739, - "_gui": 46155, - "_guid": 43756, - "_guide": 80407, - "_h": 1523, - "_hal": 52580, - "_half": 40626, - "_hand": 23194, - "_handle": 10630, - "_handler": 10183, - "_handlers": 57037, - "_handles": 68017, - "_handling": 75642, - "_hard": 77712, - "_has": 21778, - "_hash": 8950, - "_hashes": 91616, - "_hat": 39773, - "_have": 67301, - "_hd": 60111, - "_hdl": 66154, - "_hdr": 28238, - "_he": 41876, - "_head": 13138, - "_header": 8757, - "_headers": 26719, - "_heading": 47242, - "_heads": 76320, - "_health": 45727, - "_heap": 33059, - "_heat": 69981, - "_height": 9561, - "_hello": 96724, - "_help": 26926, - "_helper": 10418, - "_helpers": 54473, - "_here": 73271, - "_hero": 78716, - "_hex": 32655, - "_hi": 47225, - "_hid": 87813, - "_hidden": 26739, - "_hide": 49735, - "_hierarchy": 95043, - "_high": 22680, - "_highlight": 74546, - "_hint": 45825, - "_hist": 36399, - "_histogram": 68564, - "_history": 19802, - "_hit": 37697, - "_hits": 63832, - "_hold": 65824, - "_holder": 50788, - "_hom": 57105, - "_home": 21653, - "_hook": 32005, - "_hooks": 73113, - "_hop": 98193, - "_hor": 58046, - "_horizontal": 66469, - "_host": 12848, - "_hostname": 63840, - "_hosts": 61129, - "_hot": 33433, - "_hour": 32292, - "_hours": 41371, - "_house": 64270, - "_hover": 53445, - "_hp": 48478, - "_hpp": 74277, - "_hr": 70138, - "_href": 62988, - "_hresult": 65509, - "_hs": 85956, - "_ht": 49086, - "_html": 9564, - "_http": 25888, - "_https": 26817, - "_hub": 93996, - "_human": 86247, - "_hw": 28792, - "_hyper": 93416, - "_hz": 95676, - "_i": 5318, - "_ib": 66470, - "_ic": 32747, - "_icall": 82384, - "_icon": 15648, - "_icons": 59819, - "_id": 842, - "_ident": 38399, - "_identifier": 33176, - "_identity": 46244, - "_idle": 47810, - "_ids": 8077, - "_idx": 7258, - "_idxs": 68646, - "_ie": 62203, - "_if": 11119, - "_iface": 67666, - "_iff": 36172, - "_ignore": 58493, - "_ij": 70331, - "_il": 26743, - "_im": 17895, - "_imag": 88609, - "_image": 4954, - "_images": 13283, - "_img": 8918, - "_imgs": 60825, - "_imm": 71370, - "_imp": 36788, - "_impl": 21007, - "_import": 18434, - "_in": 1243, - "_inactive": 90882, - "_inc": 31285, - "_inches": 73258, - "_include": 37878, - "_income": 67377, - "_increase": 73807, - "_increment": 51482, - "_ind": 9122, - "_indent": 69045, - "_index": 3560, - "_indexes": 50161, - "_indicator": 58070, - "_indices": 18333, - "_individual": 88873, - "_inds": 56634, - "_indx": 97587, - "_inf": 26051, - "_info": 3109, - "_information": 35212, - "_infos": 47779, - "_ing": 59112, - "_ini": 50506, - "_inicio": 65414, - "_init": 6137, - "_initial": 15809, - "_initialize": 40889, - "_initialized": 62421, - "_initializer": 36462, - "_inline": 41871, - "_inner": 34345, - "_inode": 46748, - "_inp": 78887, - "_input": 5898, - "_inputs": 28557, - "_ins": 34386, - "_insert": 17678, - "_inside": 72860, - "_insn": 79799, - "_inst": 17740, - "_install": 34245, - "_installed": 79065, - "_instance": 11904, - "_instances": 41504, - "_instr": 62574, - "_instruction": 54923, - "_instructions": 82427, - "_int": 4042, - "_integer": 31725, - "_integral": 64076, - "_integration": 90250, - "_intensity": 80187, - "_intent": 94249, - "_inter": 15318, - "_interaction": 97394, - "_interest": 62527, - "_interface": 20546, - "_interfaces": 72960, - "_internal": 23472, - "_interp": 68711, - "_interrupt": 42606, - "_intersect": 72747, - "_intersection": 82558, - "_interval": 20541, - "_intervals": 90807, - "_intf": 91290, - "_into": 45514, - "_intr": 59888, - "_intro": 68520, - "_inv": 19996, - "_invalid": 31433, - "_inventory": 50473, - "_inverse": 63333, - "_invite": 94910, - "_invoice": 39225, - "_invoke": 79779, - "_io": 16939, - "_ioctl": 59683, - "_ios": 59098, - "_ip": 10385, - "_ipc": 83806, - "_ips": 71074, - "_ipv": 49378, - "_ir": 51433, - "_irq": 22623, - "_is": 6892, - "_iso": 49660, - "_isr": 88985, - "_issue": 53340, - "_issues": 90232, - "_it": 14631, - "_item": 5634, - "_items": 12134, - "_iter": 11723, - "_iteration": 62772, - "_iterations": 55607, - "_iterator": 13491, - "_iters": 72866, - "_itr": 71938, - "_iv": 51411, - "_ix": 62686, - "_j": 5374, - "_jButton": 61750, - "_java": 77323, - "_jet": 93169, - "_job": 20298, - "_jobs": 37247, - "_join": 31017, - "_joint": 53158, - "_journal": 85075, - "_js": 26250, - "_json": 9455, - "_jump": 65436, - "_jwt": 95576, - "_k": 4698, - "_kategori": 81270, - "_kb": 95638, - "_ke": 45476, - "_keep": 50293, - "_keeper": 43404, - "_kel": 59222, - "_kelas": 95914, - "_kernel": 26876, - "_key": 3097, - "_keyboard": 58797, - "_keys": 12631, - "_keyword": 45824, - "_keywords": 51354, - "_kill": 73327, - "_kind": 33162, - "_km": 88680, - "_known": 71690, - "_kses": 96796, - "_kv": 97066, - "_kw": 64496, - "_kwargs": 36235, - "_l": 907, - "_la": 79633, - "_lab": 51828, - "_label": 6106, - "_labels": 14547, - "_lahir": 85367, - "_lambda": 51884, - "_land": 60506, - "_lane": 60302, - "_lang": 17876, - "_language": 29021, - "_languages": 77576, - "_large": 45228, - "_last": 12195, - "_lastname": 93212, - "_lat": 26174, - "_latency": 74832, - "_latest": 64880, - "_latitude": 80364, - "_launch": 51617, - "_launcher": 79277, - "_layer": 12680, - "_layers": 26091, - "_layout": 14466, - "_lazy": 49646, - "_lb": 63601, - "_lbl": 54319, - "_lc": 93057, - "_lcd": 87172, - "_ld": 50573, - "_le": 11751, - "_lead": 87052, - "_leader": 79991, - "_leaf": 38909, - "_learn": 98948, - "_learning": 67291, - "_least": 88716, - "_leave": 62666, - "_led": 38367, - "_left": 9579, - "_leg": 64122, - "_legacy": 97555, - "_legal": 82324, - "_legend": 76612, - "_len": 6043, - "_length": 5118, - "_lengths": 54416, - "_lens": 81642, - "_less": 50747, - "_letter": 46117, - "_letters": 67330, - "_level": 8274, - "_levels": 37819, - "_lex": 74547, - "_lhs": 84284, - "_li": 50450, - "_lib": 16142, - "_library": 39461, - "_license": 63839, - "_life": 72491, - "_lifetime": 98827, - "_lift": 87004, - "_light": 28663, - "_like": 25535, - "_likelihood": 95999, - "_likes": 89178, - "_lim": 58191, - "_limit": 14763, - "_limits": 31820, - "_lin": 24606, - "_line": 6528, - "_linear": 40674, - "_lineno": 31142, - "_lines": 18323, - "_link": 7233, - "_linked": 76145, - "_links": 25258, - "_linux": 77463, - "_list": 2019, - "_lista": 76386, - "_listen": 79286, - "_listener": 46493, - "_listing": 64214, - "_lists": 37288, - "_lit": 98399, - "_lite": 89191, - "_literal": 34100, - "_literals": 49643, - "_live": 55203, - "_ll": 42995, - "_lm": 90004, - "_ln": 60401, - "_lng": 89680, - "_lo": 5560, - "_load": 12411, - "_loaded": 49205, - "_loader": 22139, - "_loading": 57726, - "_loan": 94900, - "_loc": 13400, - "_local": 13564, - "_locale": 55518, - "_locals": 94552, - "_location": 13126, - "_locations": 45032, - "_locator": 75344, - "_lock": 9818, - "_locked": 60271, - "_locs": 96913, - "_log": 5224, - "_logged": 47333, - "_logger": 27413, - "_logging": 59982, - "_logic": 54335, - "_logical": 86484, - "_login": 13681, - "_logits": 59555, - "_logo": 29962, - "_logout": 69386, - "_logs": 42899, - "_lon": 57688, - "_long": 17799, - "_longitude": 79734, - "_look": 24271, - "_lookup": 27464, - "_loop": 17198, - "_loss": 11193, - "_losses": 66162, - "_lost": 88661, - "_lot": 91849, - "_low": 23767, - "_lower": 30425, - "_lowercase": 93129, - "_lp": 76529, - "_lr": 46086, - "_ls": 53174, - "_lst": 31983, - "_lstm": 96397, - "_lt": 39164, - "_lua": 76013, - "_lv": 55469, - "_lvl": 67975, - "_ly": 93337, - "_m": 717, - "_mA": 97461, - "_mB": 94665, - "_mC": 97335, - "_mD": 97955, - "_mE": 96717, - "_ma": 69586, - "_mac": 22802, - "_machine": 38695, - "_macro": 58810, - "_macros": 85904, - "_mag": 48310, - "_magic": 54612, - "_mail": 25176, - "_main": 11027, - "_major": 47916, - "_make": 28230, - "_makeConstraints": 63137, - "_maker": 96040, - "_male": 95789, - "_malloc": 38303, - "_man": 17062, - "_manage": 56473, - "_managed": 79889, - "_management": 45363, - "_manager": 12144, - "_manifest": 74269, - "_manual": 75428, - "_many": 22101, - "_map": 5376, - "_mapped": 91933, - "_mapper": 76664, - "_mapping": 26930, - "_mappings": 84153, - "_maps": 46512, - "_mar": 38063, - "_margin": 42644, - "_mark": 18924, - "_marker": 26267, - "_markers": 92082, - "_market": 68725, - "_marks": 74204, - "_markup": 54449, - "_marshaled": 81365, - "_marshall": 81007, - "_mas": 81641, - "_mask": 9999, - "_masks": 62935, - "_mass": 36714, - "_master": 24582, - "_mat": 16610, - "_match": 10708, - "_matched": 93900, - "_matches": 38344, - "_matching": 70763, - "_material": 33884, - "_math": 65561, - "_matrices": 95190, - "_matrix": 10193, - "_max": 6345, - "_maximum": 93581, - "_mb": 53812, - "_mc": 43357, - "_md": 32994, - "_me": 16612, - "_mean": 16933, - "_means": 80866, - "_meas": 95786, - "_measure": 48938, - "_measurement": 87342, - "_med": 44085, - "_media": 29173, - "_median": 83003, - "_medium": 54867, - "_mem": 12976, - "_member": 19388, - "_members": 30397, - "_membership": 84635, - "_memcpy": 78038, - "_memory": 19195, - "_ment": 26985, - "_mentions": 30063, - "_menu": 10403, - "_menus": 83333, - "_merge": 20888, - "_merged": 90702, - "_mes": 69159, - "_mesh": 29453, - "_message": 6462, - "_messages": 23428, - "_met": 44517, - "_meta": 13381, - "_metadata": 22220, - "_meter": 79338, - "_method": 9032, - "_methods": 36084, - "_metric": 41294, - "_metrics": 37686, - "_mex": 59930, - "_mgmt": 96014, - "_mgr": 42438, - "_mi": 86013, - "_micro": 73003, - "_mid": 43733, - "_middle": 62580, - "_migration": 90373, - "_mime": 83624, - "_min": 7260, - "_mini": 84821, - "_minimum": 84855, - "_minor": 70861, - "_minus": 38457, - "_minute": 76944, - "_minutes": 67655, - "_mirror": 88593, - "_misc": 69350, - "_miss": 67722, - "_missing": 40447, - "_mix": 67729, - "_mk": 64861, - "_ml": 76567, - "_mm": 35599, - "_mo": 79258, - "_mob": 85069, - "_mobile": 34491, - "_mock": 34134, - "_mod": 7480, - "_modal": 43788, - "_mode": 7302, - "_model": 5047, - "_models": 30792, - "_modes": 59724, - "_modified": 37749, - "_modifier": 61773, - "_modify": 57725, - "_module": 10750, - "_modules": 15848, - "_mon": 20737, - "_money": 34065, - "_monitor": 40112, - "_mono": 60080, - "_month": 18933, - "_months": 88462, - "_more": 36664, - "_most": 81416, - "_mot": 78584, - "_motion": 65460, - "_motor": 59789, - "_mount": 57593, - "_mouse": 39203, - "_mov": 55798, - "_move": 17134, - "_movement": 70325, - "_moves": 45390, - "_movie": 50729, - "_movies": 77631, - "_mp": 39898, - "_mpi": 83812, - "_mr": 92858, - "_ms": 21416, - "_msg": 6483, - "_msgs": 20777, - "_mt": 65944, - "_mtime": 93674, - "_mtx": 85416, - "_mu": 43521, - "_mul": 24944, - "_mult": 26290, - "_multi": 25133, - "_multip": 91802, - "_multiple": 45233, - "_multiplier": 51800, - "_multiply": 93054, - "_music": 61863, - "_mut": 29523, - "_mutex": 14204, - "_mux": 80363, - "_mv": 73187, - "_mx": 83185, - "_my": 35686, - "_mysql": 59992, - "_n": 1089, - "_na": 58631, - "_nama": 86536, - "_name": 1269, - "_named": 71834, - "_names": 9187, - "_namespace": 41571, - "_nan": 73936, - "_nat": 38169, - "_native": 44494, - "_nav": 28233, - "_navigation": 58051, - "_nb": 43675, - "_nbr": 78272, - "_nc": 52382, - "_nd": 43544, - "_ne": 13925, - "_near": 76340, - "_need": 71506, - "_needed": 57426, - "_neg": 28209, - "_negative": 53865, - "_neighbor": 71888, - "_neighbors": 55925, - "_nested": 66279, - "_net": 19722, - "_network": 20966, - "_neurons": 96156, - "_new": 5921, - "_news": 32485, - "_next": 11257, - "_nf": 78225, - "_ng": 82102, - "_nh": 93934, - "_nick": 89564, - "_nil": 36175, - "_nl": 81052, - "_nm": 57572, - "_nn": 69962, - "_no": 6536, - "_node": 5084, - "_nodes": 14896, - "_noise": 40313, - "_nom": 53475, - "_nombre": 50198, - "_nome": 76144, - "_non": 21637, - "_nonce": 48508, - "_none": 31488, - "_norm": 19181, - "_normal": 13973, - "_normalize": 80807, - "_normalized": 80006, - "_normals": 91029, - "_not": 7913, - "_note": 27207, - "_notes": 45138, - "_notice": 51807, - "_notification": 34296, - "_notifications": 67546, - "_notifier": 86179, - "_notify": 36654, - "_now": 20813, - "_np": 41760, - "_npc": 97981, - "_nr": 36513, - "_ns": 34728, - "_nsec": 64988, - "_nt": 38945, - "_nth": 78342, - "_null": 15162, - "_nullable": 69743, - "_num": 4273, - "_number": 5500, - "_numbers": 32964, - "_numer": 99001, - "_numeric": 29418, - "_numero": 96728, - "_numpy": 43034, - "_nums": 51875, - "_nv": 79430, - "_o": 14179, - "_oauth": 91193, - "_ob": 36322, - "_obj": 7328, - "_object": 5314, - "_objects": 24873, - "_objs": 62673, - "_obs": 30405, - "_observer": 81912, - "_oc": 49648, - "_occ": 57291, - "_oct": 70135, - "_od": 51797, - "_odd": 74668, - "_of": 3575, - "_off": 13651, - "_offer": 67814, - "_office": 79604, - "_offset": 6917, - "_offsets": 56924, - "_oid": 59633, - "_ok": 19817, - "_old": 21108, - "_on": 4470, - "_once": 7630, - "_one": 11667, - "_online": 51546, - "_only": 18410, - "_op": 10287, - "_opacity": 96707, - "_opcode": 71319, - "_open": 11311, - "_oper": 25634, - "_operand": 69259, - "_operation": 32565, - "_operations": 57345, - "_operator": 40594, - "_ops": 21959, - "_opt": 15032, - "_optimizer": 68168, - "_option": 9672, - "_optional": 74644, - "_options": 8743, - "_opts": 32354, - "_or": 8734, - "_ord": 67324, - "_order": 7869, - "_ordered": 75272, - "_orders": 37129, - "_org": 35583, - "_organization": 82352, - "_ori": 85525, - "_orient": 53493, - "_orientation": 66269, - "_orig": 35328, - "_origin": 34043, - "_original": 39556, - "_os": 29387, - "_ot": 65614, - "_other": 30456, - "_out": 6068, - "_outer": 67258, - "_outline": 72980, - "_output": 7645, - "_outputs": 35189, - "_ov": 83981, - "_over": 15431, - "_overflow": 79073, - "_overlap": 65794, - "_overlay": 58189, - "_override": 48576, - "_own": 82100, - "_owned": 51973, - "_owner": 29027, - "_p": 620, - "_pa": 55475, - "_pack": 32995, - "_package": 26328, - "_packages": 41874, - "_packet": 21078, - "_packets": 63569, - "_pad": 30290, - "_padding": 40726, - "_pag": 51003, - "_page": 6129, - "_pages": 21655, - "_pagination": 82231, - "_pago": 79179, - "_paid": 63207, - "_paint": 92284, - "_pair": 14445, - "_pairs": 36430, - "_pal": 73310, - "_palette": 66252, - "_pan": 71099, - "_panel": 24570, - "_paper": 88917, - "_par": 22654, - "_para": 48080, - "_paragraph": 96713, - "_parallel": 60625, - "_param": 4090, - "_parameter": 24899, - "_parameters": 18263, - "_params": 6745, - "_parent": 15960, - "_parents": 81719, - "_parm": 97705, - "_parms": 98935, - "_pars": 77113, - "_parse": 21039, - "_parsed": 75788, - "_parser": 18517, - "_part": 10495, - "_partial": 52068, - "_particle": 70203, - "_particles": 67560, - "_partition": 43840, - "_partitions": 99097, - "_partner": 72432, - "_parts": 33217, - "_party": 44021, - "_pas": 79578, - "_pass": 15464, - "_passed": 87405, - "_passwd": 88667, - "_password": 10122, - "_past": 93019, - "_pat": 55824, - "_patch": 39643, - "_patches": 98519, - "_path": 2638, - "_paths": 24152, - "_patient": 70310, - "_pattern": 21260, - "_patterns": 64923, - "_pause": 59989, - "_pay": 28925, - "_payload": 32813, - "_payment": 26696, - "_payments": 91257, - "_pb": 31409, - "_pc": 35612, - "_pci": 76384, - "_pcm": 59655, - "_pct": 71512, - "_pd": 31322, - "_pdata": 96825, - "_pdf": 39948, - "_pdu": 95249, - "_pe": 36367, - "_peak": 66709, - "_ped": 93104, - "_pedido": 96619, - "_peer": 45159, - "_pel": 82852, - "_pemb": 92883, - "_pen": 38114, - "_penalty": 82286, - "_pending": 37861, - "_peng": 65424, - "_people": 62717, - "_per": 5678, - "_perc": 82812, - "_percent": 29883, - "_percentage": 46044, - "_perf": 76776, - "_performance": 84833, - "_period": 20818, - "_periods": 95193, - "_perm": 31961, - "_permalink": 44854, - "_permission": 37971, - "_permissions": 44767, - "_perms": 98043, - "_person": 23417, - "_persona": 99118, - "_personal": 78035, - "_pes": 92195, - "_pet": 75963, - "_pf": 74961, - "_pg": 58681, - "_ph": 9782, - "_phase": 37593, - "_phi": 42009, - "_phone": 22154, - "_photo": 32385, - "_photos": 77468, - "_php": 78547, - "_phr": 57729, - "_phrase": 66696, - "_phy": 50266, - "_phys": 69319, - "_physical": 84980, - "_pi": 47771, - "_pic": 29473, - "_pick": 58168, - "_picker": 68230, - "_pickle": 73661, - "_picture": 42406, - "_pid": 30065, - "_piece": 48470, - "_pieces": 83479, - "_pin": 26296, - "_ping": 71661, - "_pins": 90089, - "_pipe": 41862, - "_pipeline": 45187, - "_pitch": 51959, - "_pix": 50646, - "_pixel": 29760, - "_pixels": 49745, - "_pk": 33321, - "_pkg": 64739, - "_pkt": 42051, - "_pl": 6317, - "_place": 34548, - "_placeholder": 60383, - "_placement": 90203, - "_places": 57446, - "_plain": 41015, - "_plan": 26564, - "_plane": 46023, - "_planes": 75340, - "_plate": 79366, - "_platform": 34260, - "_play": 22144, - "_player": 15524, - "_players": 46721, - "_playing": 83857, - "_playlist": 69267, - "_pll": 98812, - "_plot": 24351, - "_plots": 87795, - "_plugin": 23110, - "_plugins": 45658, - "_plural": 57427, - "_plus": 28043, - "_pm": 46507, - "_png": 61746, - "_po": 61814, - "_pod": 85337, - "_point": 6085, - "_pointer": 21425, - "_points": 12928, - "_pol": 47323, - "_policy": 22773, - "_poll": 40002, - "_poly": 36133, - "_polygon": 73542, - "_pool": 15709, - "_pop": 17061, - "_population": 74572, - "_popup": 44984, - "_por": 76628, - "_port": 8716, - "_portal": 97077, - "_portfolio": 80790, - "_ports": 47694, - "_pos": 6479, - "_pose": 33201, - "_position": 9661, - "_positions": 37219, - "_positive": 54160, - "_possible": 71244, - "_post": 6333, - "_posts": 20222, - "_pot": 57952, - "_pow": 56183, - "_power": 20421, - "_pp": 31600, - "_pr": 5294, - "_pre": 10442, - "_prec": 59179, - "_precision": 54618, - "_pred": 12830, - "_predicate": 97474, - "_predict": 26815, - "_predicted": 95488, - "_prediction": 51446, - "_predictions": 59887, - "_preds": 65983, - "_pref": 43331, - "_preference": 92718, - "_preferences": 65513, - "_prefix": 13974, - "_prefs": 86430, - "_prep": 83794, - "_prepare": 47460, - "_pres": 32116, - "_presence": 56403, - "_present": 36976, - "_press": 38938, - "_pressed": 46178, - "_pressure": 73595, - "_prev": 25566, - "_preview": 42383, - "_previous": 52552, - "_pri": 85639, - "_price": 9040, - "_prices": 65688, - "_prim": 87419, - "_primary": 45314, - "_prime": 38217, - "_primitive": 84087, - "_principal": 82402, - "_print": 10064, - "_printer": 91772, - "_printf": 21823, - "_prior": 58782, - "_priority": 38161, - "_priv": 24726, - "_private": 26249, - "_pro": 2540, - "_prob": 20794, - "_proba": 83022, - "_probability": 68589, - "_probe": 49108, - "_problem": 60139, - "_probs": 51405, - "_proc": 24436, - "_process": 11305, - "_processed": 63916, - "_processes": 80143, - "_processing": 58209, - "_processor": 50127, - "_processors": 73153, - "_procs": 96148, - "_prod": 34984, - "_product": 9840, - "_production": 91980, - "_producto": 58428, - "_products": 29622, - "_produk": 80752, - "_prof": 33609, - "_profile": 13789, - "_profiles": 64021, - "_profit": 72042, - "_prog": 60390, - "_program": 25096, - "_progress": 27200, - "_proj": 49453, - "_project": 16352, - "_projection": 72738, - "_projects": 58774, - "_prom": 47877, - "_prompt": 61421, - "_proof": 86757, - "_prop": 21663, - "_properties": 25158, - "_property": 16638, - "_props": 44835, - "_prot": 22357, - "_proto": 37689, - "_protocol": 34880, - "_prov": 89648, - "_provider": 29518, - "_province": 97116, - "_proxy": 29712, - "_ps": 26047, - "_pt": 20124, - "_ptr": 4348, - "_ptrs": 79533, - "_pts": 41878, - "_pub": 34014, - "_public": 27074, - "_publish": 58779, - "_published": 69524, - "_publisher": 84726, - "_pull": 65693, - "_pulse": 83645, - "_purchase": 63203, - "_push": 14218, - "_pushButton": 91468, - "_put": 15557, - "_putchar": 57969, - "_puts": 88574, - "_putstr": 74475, - "_pv": 91139, - "_pw": 60181, - "_pwd": 50957, - "_pwm": 70985, - "_px": 67162, - "_py": 40291, - "_python": 55869, - "_q": 8976, - "_qos": 78960, - "_qp": 88550, - "_qs": 80738, - "_qty": 34858, - "_qu": 11280, - "_quad": 68631, - "_qual": 64391, - "_quality": 55074, - "_quant": 53346, - "_quantity": 32097, - "_que": 47342, - "_queries": 65588, - "_query": 5738, - "_queryset": 66638, - "_quest": 98015, - "_question": 28915, - "_questions": 55048, - "_queue": 10841, - "_queues": 82413, - "_quick": 82094, - "_quit": 72424, - "_quiz": 88336, - "_quota": 97093, - "_quote": 45236, - "_quotes": 75637, - "_r": 1710, - "_ra": 59969, - "_race": 91317, - "_rad": 39764, - "_radi": 97479, - "_radio": 49740, - "_radius": 28936, - "_raise": 55383, - "_raises": 88840, - "_ram": 62124, - "_rand": 33864, - "_random": 22644, - "_range": 9698, - "_ranges": 58748, - "_rank": 20417, - "_rat": 70475, - "_rate": 9246, - "_rates": 55373, - "_rating": 30646, - "_ratings": 75188, - "_ratio": 19917, - "_raw": 16067, - "_ray": 72690, - "_rb": 68544, - "_rc": 30299, - "_rd": 54763, - "_re": 1288, - "_reaction": 96631, - "_read": 6443, - "_readable": 91232, - "_reader": 22306, - "_reading": 81859, - "_reads": 66628, - "_ready": 35456, - "_real": 15266, - "_reason": 38229, - "_rec": 7080, - "_recall": 90311, - "_receipt": 77974, - "_receive": 38557, - "_received": 40783, - "_receiver": 65691, - "_recent": 62361, - "_recipe": 62251, - "_recommend": 99084, - "_record": 14192, - "_records": 31279, - "_recovery": 91475, - "_rect": 16979, - "_rectangle": 61847, - "_recursive": 66242, - "_recv": 36118, - "_red": 26058, - "_redirect": 30043, - "_redirected": 73309, - "_redis": 87542, - "_reduce": 64596, - "_reduction": 74289, - "_ref": 7793, - "_refer": 73386, - "_reference": 25433, - "_references": 92702, - "_refl": 83623, - "_refptr": 97643, - "_refresh": 42076, - "_refs": 60638, - "_reg": 4920, - "_regeneration": 74820, - "_regex": 41832, - "_region": 20627, - "_regions": 58035, - "_register": 14000, - "_registered": 72683, - "_registers": 78360, - "_registration": 49101, - "_registro": 91834, - "_registry": 50650, - "_regression": 91144, - "_regs": 36910, - "_regular": 49443, - "_regularizer": 79059, - "_rel": 13557, - "_related": 53256, - "_relation": 46984, - "_relations": 94221, - "_relationship": 69031, - "_relative": 29286, - "_release": 24577, - "_reload": 79405, - "_relu": 76282, - "_rem": 19194, - "_remain": 86607, - "_remaining": 59244, - "_remote": 36425, - "_remove": 18193, - "_removed": 68248, - "_rename": 79399, - "_render": 22781, - "_renderer": 52345, - "_rent": 83127, - "_reordered": 66996, - "_rep": 25533, - "_repeat": 41975, - "_replace": 10633, - "_reply": 15323, - "_repo": 37784, - "_report": 14813, - "_reporting": 52376, - "_reports": 64423, - "_repository": 47301, - "_repr": 68535, - "_representation": 94263, - "_req": 17644, - "_request": 7893, - "_requested": 72709, - "_requests": 37216, - "_require": 13793, - "_required": 18743, - "_requirements": 89632, - "_requires": 54949, - "_res": 4918, - "_reservation": 96548, - "_reserve": 89591, - "_reserved": 74913, - "_reset": 18983, - "_residual": 88056, - "_resize": 53370, - "_resolution": 39849, - "_resolve": 77291, - "_resolver": 91578, - "_resource": 17962, - "_resources": 35569, - "_resp": 35160, - "_response": 9655, - "_responses": 81292, - "_rest": 32231, - "_restart": 69392, - "_restore": 62677, - "_restrict": 97684, - "_result": 5287, - "_results": 13576, - "_resume": 58132, - "_ret": 21695, - "_retry": 62745, - "_return": 12511, - "_returns": 58900, - "_rev": 38082, - "_reverse": 43277, - "_review": 38661, - "_reviews": 68706, - "_revision": 59856, - "_reward": 38260, - "_rewards": 77997, - "_rewrite": 74052, - "_rf": 65466, - "_rg": 86566, - "_rgb": 37407, - "_rgba": 95229, - "_rho": 79160, - "_rhs": 64537, - "_right": 10539, - "_rights": 98053, - "_ring": 34683, - "_rl": 98441, - "_rm": 58537, - "_rng": 66849, - "_rnn": 98600, - "_ro": 26608, - "_robot": 59116, - "_roi": 72391, - "_role": 19792, - "_roles": 43061, - "_roll": 57578, - "_rom": 81383, - "_room": 25003, - "_rooms": 76037, - "_root": 12993, - "_ros": 79215, - "_rot": 38256, - "_rotate": 60834, - "_rotation": 44813, - "_round": 29896, - "_route": 28109, - "_router": 55587, - "_routes": 64314, - "_routing": 97710, - "_row": 8530, - "_rows": 10949, - "_rp": 83440, - "_rpc": 60799, - "_rq": 79638, - "_rr": 56285, - "_rs": 47115, - "_rsa": 82522, - "_rsp": 64381, - "_rt": 40169, - "_ru": 73584, - "_rule": 21124, - "_rules": 21407, - "_run": 14007, - "_runner": 54828, - "_running": 37333, - "_runs": 67352, - "_runtime": 33232, - "_rw": 49566, - "_rwlock": 98850, - "_rx": 24330, - "_s": 643, - "_sa": 66443, - "_safe": 34067, - "_saida": 76420, - "_sal": 62491, - "_salary": 71222, - "_sale": 47114, - "_sales": 47067, - "_salt": 92280, - "_same": 33574, - "_sample": 17491, - "_sampler": 72812, - "_samples": 18297, - "_sampling": 77716, - "_san": 87866, - "_sat": 51303, - "_save": 15376, - "_saved": 53709, - "_sb": 55540, - "_sc": 13171, - "_scal": 28656, - "_scalar": 41652, - "_scale": 16727, - "_scaled": 61715, - "_scaling": 79216, - "_scan": 28857, - "_scenario": 89712, - "_scene": 37296, - "_sched": 67394, - "_schedule": 34530, - "_scheduler": 53646, - "_schema": 25371, - "_scheme": 53293, - "_school": 62165, - "_scope": 23199, - "_score": 10405, - "_scores": 27198, - "_scr": 59728, - "_screen": 17649, - "_script": 14660, - "_scripts": 35789, - "_scroll": 41407, - "_sd": 40168, - "_sdk": 61783, - "_se": 3453, - "_search": 10716, - "_season": 78725, - "_seat": 91381, - "_sec": 17242, - "_second": 29644, - "_secondary": 77759, - "_seconds": 34825, - "_secret": 21962, - "_secs": 68718, - "_section": 16221, - "_sections": 59485, - "_sector": 62651, - "_secure": 73088, - "_security": 48726, - "_seed": 33809, - "_seek": 74473, - "_seen": 60668, - "_seg": 35325, - "_segment": 28061, - "_segments": 55735, - "_sel": 34153, - "_select": 13051, - "_selected": 23755, - "_selection": 23672, - "_selector": 28890, - "_self": 25637, - "_sell": 71072, - "_sem": 30442, - "_semaphore": 90255, - "_send": 13565, - "_sender": 54356, - "_sensitive": 65324, - "_sensor": 28899, - "_sent": 24115, - "_sentence": 48332, - "_sentences": 75903, - "_sep": 54775, - "_separator": 58204, - "_seq": 14486, - "_seqs": 93261, - "_sequence": 23735, - "_sequences": 58732, - "_ser": 75861, - "_serial": 25602, - "_serialize": 88686, - "_serializer": 67441, - "_series": 35015, - "_serv": 44053, - "_server": 12015, - "_servers": 67507, - "_service": 12267, - "_services": 39846, - "_sess": 83856, - "_session": 12316, - "_sessions": 71385, - "_set": 2602, - "_setopt": 23533, - "_sets": 21289, - "_setting": 20313, - "_settings": 10853, - "_setup": 21363, - "_sex": 82113, - "_sf": 56182, - "_sg": 76318, - "_sh": 3712, - "_sha": 48836, - "_shader": 35485, - "_shadow": 53120, - "_shape": 13597, - "_shapes": 71315, - "_share": 38272, - "_shared": 20405, - "_sheet": 43112, - "_shell": 48945, - "_shift": 22230, - "_ship": 31042, - "_shipping": 53553, - "_shop": 38690, - "_short": 16673, - "_shortcode": 48259, - "_shot": 81226, - "_should": 43378, - "_show": 15267, - "_shuffle": 73484, - "_shutdown": 54804, - "_si": 40983, - "_sibling": 96328, - "_sid": 53044, - "_side": 30862, - "_sidebar": 31628, - "_sig": 29252, - "_sigma": 49005, - "_sign": 11172, - "_signal": 21137, - "_signals": 76698, - "_signature": 39859, - "_signed": 55617, - "_signup": 82005, - "_sim": 18314, - "_similarity": 76236, - "_simple": 30015, - "_simps": 79572, - "_simulation": 82487, - "_sin": 78710, - "_since": 56262, - "_single": 19487, - "_singleton": 82119, - "_singular": 93240, - "_sink": 51567, - "_site": 24507, - "_sites": 68600, - "_size": 2368, - "_sizes": 32159, - "_sk": 33811, - "_skb": 94486, - "_skill": 45624, - "_skills": 92980, - "_skin": 66052, - "_skip": 44830, - "_sku": 79647, - "_sl": 11886, - "_slave": 65320, - "_sleep": 49393, - "_slice": 26488, - "_slices": 87288, - "_slide": 61833, - "_slider": 36007, - "_slope": 79743, - "_slot": 27563, - "_slots": 54161, - "_slow": 82447, - "_slug": 31024, - "_sm": 15874, - "_small": 31966, - "_smart": 88825, - "_smooth": 71655, - "_sms": 58567, - "_sn": 28022, - "_snap": 74175, - "_snapshot": 53265, - "_snd": 88518, - "_so": 39833, - "_soc": 54114, - "_social": 51196, - "_sock": 33103, - "_socket": 19555, - "_soft": 38326, - "_softc": 75302, - "_softmax": 99108, - "_sol": 53668, - "_sold": 88193, - "_solution": 50274, - "_solve": 86246, - "_solver": 53156, - "_some": 61855, - "_song": 57102, - "_sort": 18435, - "_sorted": 41277, - "_sound": 37676, - "_soup": 97352, - "_source": 10347, - "_sources": 52896, - "_sp": 10123, - "_space": 14663, - "_spaces": 67883, - "_spacing": 63328, - "_span": 37382, - "_sparse": 71123, - "_spawn": 76026, - "_spec": 13594, - "_special": 41629, - "_species": 74130, - "_specific": 56592, - "_specs": 71200, - "_spectrum": 95463, - "_speed": 16944, - "_spell": 64717, - "_sphere": 86973, - "_spi": 44920, - "_spin": 47965, - "_spinner": 65114, - "_split": 17052, - "_splits": 73000, - "_spot": 84766, - "_sprite": 45489, - "_sprites": 89629, - "_sq": 47252, - "_sql": 18063, - "_sqrt": 92199, - "_square": 39794, - "_squared": 54641, - "_sr": 61248, - "_src": 16274, - "_srv": 63921, - "_ss": 41848, - "_ssh": 82805, - "_ssl": 48210, - "_st": 1261, - "_sta": 79951, - "_stack": 15528, - "_staff": 47060, - "_stage": 35238, - "_stamp": 52978, - "_stand": 87957, - "_standard": 48688, - "_star": 31681, - "_start": 4906, - "_started": 55679, - "_starts": 86552, - "_startup": 80858, - "_stat": 16271, - "_state": 4387, - "_statement": 37404, - "_states": 22972, - "_static": 25360, - "_station": 44798, - "_statistics": 49569, - "_stats": 15381, - "_status": 4773, - "_statuses": 83702, - "_std": 15656, - "_stderr": 93033, - "_stdio": 37227, - "_stdout": 67416, - "_ste": 65937, - "_step": 11946, - "_steps": 22731, - "_stmt": 21824, - "_stock": 30541, - "_stop": 19039, - "_storage": 23310, - "_store": 14809, - "_story": 66342, - "_str": 2895, - "_strategy": 49308, - "_strcmp": 74523, - "_strdup": 45901, - "_stream": 12673, - "_streams": 74872, - "_street": 78562, - "_strength": 71893, - "_strerror": 81444, - "_stride": 41513, - "_strike": 71717, - "_string": 3904, - "_strings": 33500, - "_strip": 66130, - "_strlen": 44288, - "_struct": 15126, - "_structure": 38283, - "_stub": 62781, - "_student": 36753, - "_students": 71644, - "_study": 85581, - "_stuff": 95396, - "_style": 15117, - "_styles": 37857, - "_stylesheet": 84724, - "_su": 89927, - "_sub": 5228, - "_subject": 28834, - "_submenu": 96733, - "_submission": 75866, - "_submit": 31674, - "_subnet": 95681, - "_subplot": 56978, - "_subs": 82767, - "_subscribe": 88935, - "_subscription": 59838, - "_subset": 47532, - "_substr": 83578, - "_subtitle": 94927, - "_subtype": 96228, - "_succ": 70758, - "_success": 18632, - "_successful": 92951, - "_suffix": 37151, - "_suite": 57239, - "_sum": 10160, - "_summary": 27251, - "_sun": 86623, - "_sup": 23723, - "_super": 38886, - "_superuser": 85754, - "_supp": 91480, - "_supplier": 75438, - "_supply": 65630, - "_support": 25827, - "_supported": 57885, - "_sur": 49946, - "_surf": 88323, - "_surface": 31030, - "_survey": 88345, - "_suspend": 64196, - "_sv": 76808, - "_svc": 78198, - "_svg": 76849, - "_sw": 32581, - "_swap": 40991, - "_switch": 27652, - "_sy": 58530, - "_sym": 26825, - "_symbol": 21179, - "_symbols": 55752, - "_syn": 51393, - "_sync": 23008, - "_syntax": 78894, - "_sys": 20344, - "_system": 17687, - "_sz": 33945, - "_t": 528, - "_tA": 81612, - "_tC": 84772, - "_tD": 88741, - "_tE": 98304, - "_tF": 79798, - "_ta": 91710, - "_tab": 17344, - "_table": 5237, - "_tables": 35632, - "_tabs": 57953, - "_tac": 30626, - "_tag": 9372, - "_tags": 16333, - "_tail": 35471, - "_take": 73261, - "_taken": 72933, - "_tar": 66608, - "_target": 11123, - "_targets": 41997, - "_task": 12184, - "_tasks": 32823, - "_tau": 75760, - "_tax": 24579, - "_taxonomy": 75794, - "_tb": 23481, - "_tbl": 34572, - "_tc": 63126, - "_tcb": 98725, - "_tcp": 45562, - "_td": 57051, - "_te": 38678, - "_teacher": 70553, - "_team": 26532, - "_teams": 86299, - "_tel": 67180, - "_tele": 58253, - "_tem": 28613, - "_temp": 11771, - "_temperature": 53525, - "_template": 8693, - "_templates": 49526, - "_ten": 75827, - "_tensor": 23188, - "_tensors": 91067, - "_ter": 72493, - "_term": 17464, - "_terminal": 64309, - "_terms": 37498, - "_test": 4452, - "_testing": 70962, - "_tests": 32509, - "_tex": 48187, - "_text": 4326, - "_texts": 79646, - "_texture": 28165, - "_tf": 47719, - "_tgt": 93085, - "_th": 5854, - "_than": 51613, - "_that": 70197, - "_the": 16068, - "_theme": 19864, - "_then": 68367, - "_theta": 39363, - "_thickness": 91231, - "_third": 79519, - "_this": 24868, - "_thr": 72071, - "_thread": 10814, - "_threads": 29725, - "_three": 50016, - "_thresh": 49562, - "_threshold": 21858, - "_through": 87399, - "_throw": 72161, - "_thumb": 46352, - "_thumbnail": 37824, - "_ti": 98799, - "_tick": 43612, - "_ticket": 45718, - "_tickets": 91836, - "_ticks": 49961, - "_tid": 73719, - "_tile": 29844, - "_tiles": 60857, - "_tim": 29087, - "_time": 3009, - "_timeline": 77560, - "_timeout": 20537, - "_timer": 16255, - "_times": 22353, - "_timestamp": 23073, - "_timezone": 53193, - "_timing": 70973, - "_tip": 48014, - "_tipo": 43659, - "_title": 6112, - "_titles": 72199, - "_tl": 82970, - "_tls": 71262, - "_tm": 44045, - "_tmp": 16125, - "_to": 2346, - "_today": 68717, - "_todo": 87686, - "_toggle": 48860, - "_tok": 76162, - "_token": 6458, - "_tokenize": 86508, - "_tokens": 28838, - "_tol": 70121, - "_tolerance": 92069, - "_tool": 22785, - "_toolbar": 65695, - "_tools": 39723, - "_tooltip": 76265, - "_top": 10426, - "_topic": 31414, - "_topics": 64358, - "_topology": 90234, - "_tot": 36138, - "_total": 10784, - "_totals": 96892, - "_touch": 60840, - "_tp": 55191, - "_tpl": 14107, - "_tr": 3547, - "_tra": 27242, - "_trace": 23575, - "_track": 28545, - "_tracker": 50264, - "_tracking": 66105, - "_tracks": 66953, - "_trade": 52162, - "_traffic": 90012, - "_train": 7591, - "_training": 32891, - "_trait": 78491, - "_traits": 39693, - "_traj": 83823, - "_trajectory": 86031, - "_trampoline": 92942, - "_tran": 98941, - "_trans": 7965, - "_transaction": 28884, - "_transactions": 68182, - "_transaksi": 95661, - "_transfer": 35403, - "_transform": 18449, - "_transient": 97758, - "_transition": 53593, - "_translate": 66381, - "_translation": 49273, - "_transport": 46398, - "_trap": 88536, - "_travel": 91319, - "_tree": 11663, - "_trees": 75791, - "_tri": 42120, - "_trial": 63486, - "_trials": 75845, - "_triangle": 70575, - "_trigger": 32925, - "_triggered": 78678, - "_trim": 70025, - "_trip": 63883, - "_true": 16082, - "_truth": 49186, - "_try": 53283, - "_ts": 25023, - "_tt": 66740, - "_ttl": 87157, - "_tunnel": 95692, - "_tuple": 21773, - "_tuples": 89269, - "_turn": 37274, - "_tv": 46132, - "_tw": 54178, - "_tweet": 75419, - "_tweets": 75920, - "_twitter": 83338, - "_two": 23241, - "_tx": 17805, - "_txn": 92299, - "_txt": 22436, - "_ty": 53171, - "_typ": 42111, - "_type": 1819, - "_typeDefinition": 66605, - "_typeDefinitionSize": 66650, - "_typeof": 93852, - "_types": 9763, - "_u": 7300, - "_uart": 56789, - "_ub": 66794, - "_uc": 68887, - "_ud": 71939, - "_udp": 69432, - "_ue": 91064, - "_ui": 22412, - "_uid": 25396, - "_uint": 15807, - "_ul": 61039, - "_ulong": 72288, - "_um": 72063, - "_un": 4907, - "_unc": 76576, - "_under": 58228, - "_undo": 98940, - "_unicode": 54662, - "_uniform": 45066, - "_union": 51621, - "_unique": 21218, - "_unit": 14832, - "_units": 28345, - "_unix": 80572, - "_unknown": 57507, - "_unlock": 19465, - "_unpack": 54889, - "_unref": 49484, - "_unregister": 68992, - "_unset": 98109, - "_unsigned": 67830, - "_until": 44352, - "_unused": 66944, - "_up": 8237, - "_upd": 83550, - "_update": 8882, - "_updated": 33492, - "_updates": 57829, - "_upgrade": 67794, - "_upload": 21691, - "_uploaded": 54411, - "_upper": 34445, - "_ur": 64879, - "_uri": 15572, - "_url": 2903, - "_urls": 32822, - "_us": 11306, - "_usage": 31507, - "_usb": 50863, - "_use": 15951, - "_usec": 43047, - "_used": 27803, - "_user": 3317, - "_userdata": 59315, - "_userid": 84568, - "_username": 21588, - "_users": 16348, - "_using": 75180, - "_usr": 79078, - "_usuario": 29246, - "_ut": 60363, - "_utc": 84259, - "_utf": 39453, - "_util": 18974, - "_utilities": 94044, - "_utils": 17309, - "_uuid": 25540, - "_uv": 67474, - "_v": 2273, - "_va": 73959, - "_val": 6189, - "_valid": 8337, - "_validate": 42681, - "_validation": 19416, - "_validator": 64959, - "_valor": 93131, - "_vals": 29550, - "_value": 3142, - "_values": 9146, - "_var": 4612, - "_variable": 14635, - "_variables": 28182, - "_variance": 77450, - "_variant": 46112, - "_variation": 95409, - "_vars": 11168, - "_vc": 73396, - "_ve": 73285, - "_vec": 13251, - "_vect": 59402, - "_vector": 12247, - "_vectors": 49158, - "_vehicle": 64008, - "_vel": 34504, - "_velocity": 39666, - "_vendor": 58320, - "_venta": 87621, - "_ver": 26042, - "_verbose": 67921, - "_verification": 84245, - "_verified": 71871, - "_verify": 35638, - "_version": 9438, - "_versions": 65148, - "_vert": 54000, - "_vertex": 26611, - "_vertical": 61203, - "_vertices": 37720, - "_verts": 98035, - "_vi": 97319, - "_via": 80710, - "_vid": 68385, - "_video": 19815, - "_videos": 83791, - "_view": 7122, - "_viewer": 80344, - "_views": 39498, - "_virtual": 58730, - "_vis": 15887, - "_visibility": 71256, - "_visible": 34371, - "_visit": 56484, - "_visited": 96729, - "_visitor": 81364, - "_visual": 64630, - "_vk": 89852, - "_vlan": 71296, - "_vlog": 92145, - "_vm": 39008, - "_vocab": 52823, - "_voice": 76765, - "_void": 37775, - "_vol": 42784, - "_voltage": 62756, - "_volume": 26941, - "_vote": 54360, - "_votes": 65116, - "_vp": 87960, - "_vs": 42434, - "_vue": 69147, - "_w": 1670, - "_wait": 18760, - "_waiting": 84683, - "_walk": 56131, - "_wall": 50731, - "_wallet": 62308, - "_war": 90539, - "_warn": 55045, - "_warning": 38395, - "_warnings": 87658, - "_was": 91612, - "_watch": 58562, - "_water": 54550, - "_wave": 60063, - "_way": 48936, - "_wc": 75871, - "_we": 45922, - "_weak": 86356, - "_weapon": 69475, - "_weather": 69364, - "_web": 25960, - "_website": 79032, - "_week": 31277, - "_weight": 15876, - "_weights": 21114, - "_wf": 86382, - "_wh": 36225, - "_wheel": 82012, - "_when": 47636, - "_where": 36814, - "_while": 86069, - "_white": 44431, - "_whitespace": 86175, - "_widget": 13585, - "_widgets": 51815, - "_width": 7927, - "_wifi": 71495, - "_win": 25672, - "_wind": 87438, - "_window": 12571, - "_windows": 58220, - "_winner": 92588, - "_wire": 75206, - "_with": 6615, - "_within": 72385, - "_without": 39904, - "_wo": 96058, - "_word": 13533, - "_words": 18981, - "_work": 11498, - "_worker": 40385, - "_workers": 43557, - "_workflow": 86418, - "_working": 81101, - "_workspace": 75560, - "_world": 31792, - "_wp": 39287, - "_wr": 44074, - "_wrap": 38550, - "_wrapper": 23561, - "_write": 9165, - "_writer": 28908, - "_written": 72403, - "_wrong": 75198, - "_ws": 50211, - "_x": 3212, - "_xlabel": 52698, - "_xlim": 74561, - "_xml": 23855, - "_xor": 76462, - "_xpath": 36595, - "_xs": 80646, - "_xt": 60069, - "_xx": 95968, - "_xy": 40920, - "_xyz": 64974, - "_y": 4178, - "_yaml": 64380, - "_yaw": 80183, - "_year": 14645, - "_years": 74490, - "_yellow": 93053, - "_yes": 59744, - "_yield": 83709, - "_ylabel": 48189, - "_ylim": 67646, - "_you": 70456, - "_z": 6415, - "_zero": 19359, - "_zeros": 83761, - "_zip": 42131, - "_zone": 28692, - "_zones": 93002, - "_zoom": 56736, - "_{": 15159, - "_|": 35395, - "_Ċ": 12924, - "_ĊĊ": 18797, - "_čĊ": 57891, - "_čĊčĊ": 89950, - "`": 63, - "`\"]Ċ": 91595, - "`${": 37753, - "`(": 81556, - "`()": 67680, - "`)": 32881, - "`),Ċ": 89746, - "`).": 59210, - "`);Ċ": 20625, - "`);ĊĊ": 74526, - "`)Ċ": 24183, - "`,": 7808, - "`,`": 40181, - "`,Ċ": 12892, - "`.": 28587, - "`.`": 28905, - "`.Ċ": 18639, - "`.ĊĊ": 62338, - "`:": 44622, - "`;": 77582, - "`;Ċ": 16909, - "`;ĊĊ": 18259, - "`=": 90260, - "`='$": 76116, - "`\\": 61069, - "`]": 80709, - "`](": 84702, - "``": 13874, - "``,": 90716, - "```": 73594, - "``Ċ": 84274, - "`s": 39829, - "`t": 79115, - "`}": 74768, - "`}Ċ": 53136, - "`Ċ": 3989, - "`ĊĊ": 19324, - "`čĊ": 75679, - "a": 64, - "aData": 94950, - "aN": 55019, - "aa": 5305, - "aaS": 64610, - "aaa": 32646, - "aaaa": 28458, - "aaaaaaaa": 69440, - "aab": 88607, - "aac": 64705, - "aad": 86629, - "aal": 54342, - "aan": 41702, - "aar": 73609, - "aat": 38267, - "ab": 370, - "aba": 12004, - "abad": 27347, - "abaj": 78984, - "abajo": 73268, - "abal": 62794, - "abama": 18884, - "aban": 38165, - "abant": 79283, - "abar": 94560, - "abay": 97186, - "abb": 12523, - "abbage": 56489, - "abbit": 19949, - "abbix": 95442, - "abble": 72191, - "abbo": 53550, - "abbr": 71276, - "abbrev": 44272, - "abbreviation": 76857, - "abby": 78636, - "abc": 13683, - "abcd": 68644, - "abcdef": 41202, - "abcdefgh": 56747, - "abcdefghijkl": 63168, - "abcdefghijklmnop": 65102, - "abcdefghijklmnopqrstuvwxyz": 67512, - "abd": 85920, - "abe": 8229, - "abee": 79112, - "abei": 38972, - "abel": 780, - "abela": 37385, - "abeled": 22320, - "abella": 71590, - "abelle": 54167, - "aben": 40308, - "aber": 43139, - "abet": 10237, - "abetes": 16231, - "abeth": 17406, - "abetic": 44838, - "abez": 83478, - "abh": 66366, - "abhäng": 138644, - "abhängig": 138645, - "abi": 25084, - "abic": 68291, - "abies": 97041, - "abil": 12762, - "abile": 57109, - "abileceÄŁi": 132216, - "abilia": 93350, - "abilidad": 54262, - "abilidade": 79916, - "abilir": 81758, - "abilit": 45400, - "abilities": 8456, - "ability": 2897, - "abilité": 86682, - "abin": 8892, - "abinet": 75512, - "abis": 15367, - "abit": 38927, - "abl": 61473, - "able": 480, - "ableObject": 79176, - "ableOpacity": 22529, - "ableView": 7938, - "ableViewController": 94906, - "abled": 2312, - "abler": 91967, - "ables": 4788, - "abling": 18768, - "ablish": 5102, - "ablo": 31460, - "ably": 2845, - "ablytyped": 80898, - "abo": 47421, - "abol": 52804, - "abolic": 56465, - "abor": 4324, - "abort": 46699, - "about": 9096, - "abouts": 63299, - "above": 48432, - "abox": 76734, - "abr": 77571, - "abra": 43932, - "abras": 53888, - "abric": 28897, - "abs": 3435, - "absolute": 17182, - "abstract": 16249, - "abstractmethod": 64951, - "abus": 57541, - "abwe": 42431, - "aby": 6115, - "abyrin": 57337, - "abyrinth": 61530, - "abyte": 66711, - "abytes": 71129, - "abı": 126148, - "ac": 580, - "aca": 17106, - "acad": 49857, - "academic": 90256, - "acades": 18686, - "acak": 78665, - "acakt": 127384, - "acaktır": 127385, - "acam": 95608, - "acao": 15108, - "acas": 77183, - "acaģı": 125207, - "acaģını": 131225, - "acaģız": 136232, - "acb": 97471, - "acc": 4475, - "accel": 43888, - "accent": 77548, - "accept": 10330, - "acceptable": 37016, - "accepted": 54574, - "access": 5211, - "accessToken": 41167, - "accessible": 62347, - "acci": 34603, - "accine": 88021, - "accion": 45422, - "acciones": 97707, - "acción": 66047, - "acco": 19500, - "accom": 71987, - "according": 73846, - "accordion": 35337, - "account": 4608, - "accountId": 75906, - "accounts": 26206, - "acct": 95081, - "accum": 38931, - "accumulate": 98387, - "accumulator": 94810, - "accur": 35921, - "accuracy": 32729, - "accès": 135341, - "acd": 94112, - "ace": 578, - "acea": 82582, - "acebook": 4497, - "aced": 4435, - "acellular": 64341, - "acemark": 97594, - "acement": 6346, - "acements": 33078, - "acen": 90487, - "acency": 40624, - "acent": 18181, - "acente": 94860, - "aceous": 76040, - "acer": 9584, - "acerb": 50819, - "acers": 72697, - "aces": 2434, - "acet": 67223, - "aceut": 24309, - "aceutical": 25134, - "acey": 55920, - "acf": 62594, - "ach": 610, - "acha": 51576, - "achable": 77283, - "achat": 96164, - "ache": 1777, - "ached": 3854, - "achel": 14770, - "achelor": 24736, - "achen": 45699, - "acher": 11007, - "achers": 26520, - "aches": 14242, - "achi": 30364, - "achie": 44520, - "achievement": 74608, - "achine": 3814, - "achinery": 62954, - "achines": 70142, - "aching": 11829, - "achment": 8888, - "acho": 63429, - "achs": 86873, - "achsen": 70487, - "acht": 15938, - "achte": 84642, - "achten": 53776, - "achts": 81006, - "achu": 64918, - "achuset": 20041, - "achusetts": 20051, - "aci": 24464, - "acia": 27041, - "acial": 32111, - "acias": 42442, - "acic": 93157, - "acid": 57056, - "acidad": 69545, - "acie": 46283, - "aciente": 58203, - "acier": 53453, - "acies": 26030, - "acific": 40483, - "acija": 83903, - "acimiento": 54366, - "acin": 39388, - "acing": 4527, - "acio": 35870, - "acion": 5806, - "acional": 21598, - "acionales": 84139, - "aciones": 12430, - "acios": 79845, - "acious": 19430, - "acist": 49322, - "acists": 92612, - "acity": 4018, - "ación": 5721, - "acja": 51689, - "acje": 69209, - "acji": 33378, - "acjÄĻ": 135541, - "ack": 473, - "ackBar": 32629, - "ackage": 1434, - "ackages": 22211, - "ackbar": 27691, - "acked": 11191, - "acker": 9683, - "ackers": 87412, - "acket": 5709, - "ackets": 18382, - "acking": 8985, - "ackle": 51522, - "acks": 7821, - "ackson": 19387, - "acky": 79957, - "acl": 47736, - "aclass": 67528, - "acle": 7902, - "acles": 18209, - "acman": 94114, - "aco": 16428, - "acob": 38951, - "acobian": 62518, - "acock": 80278, - "acoes": 60126, - "acom": 44570, - "acomment": 75215, - "acon": 22379, - "acons": 75444, - "acos": 41647, - "acr": 64748, - "acre": 28474, - "acro": 49507, - "acs": 19252, - "act": 531, - "actable": 66660, - "actal": 80148, - "acted": 22167, - "acter": 2481, - "acteria": 77752, - "acterial": 69934, - "acters": 4983, - "actic": 23170, - "actical": 36019, - "actice": 33001, - "actices": 89190, - "actics": 67969, - "acting": 34922, - "action": 1311, - "actionDate": 89107, - "actions": 4020, - "activ": 8859, - "activate": 16856, - "activated": 30162, - "activation": 23002, - "active": 3028, - "actively": 63019, - "activex": 36231, - "activities": 31978, - "activity": 7175, - "activité": 133850, - "activo": 83070, - "actly": 32739, - "actor": 5621, - "actories": 52893, - "actoring": 75407, - "actors": 21161, - "actory": 2919, - "acts": 11359, - "actual": 11944, - "actually": 73028, - "actus": 60959, - "acula": 85193, - "acular": 23006, - "acus": 95305, - "acute": 31490, - "acy": 2757, - "acyj": 95553, - "acz": 41830, - "acı": 125403, - "ad": 329, - "ada": 2584, - "adal": 50488, - "adalafil": 93086, - "adam": 50954, - "adamente": 76055, - "adan": 53640, - "adapt": 88071, - "adapter": 19731, - "adaptive": 41562, - "adaptiveStyles": 49225, - "adar": 36080, - "adas": 11107, - "adastrar": 66170, - "adastro": 56566, - "adata": 4602, - "aday": 64626, - "adays": 33976, - "adaÅŁ": 126531, - "adb": 39591, - "adc": 33385, - "add": 718, - "addAction": 57772, - "addAll": 67809, - "addChild": 44852, - "addClass": 12287, - "addColumn": 47792, - "addComponent": 11270, - "addContainerGap": 33710, - "addElement": 76293, - "addError": 88122, - "addEventListener": 32374, - "addField": 51855, - "addGap": 23714, - "addGroup": 15488, - "addItem": 49738, - "addListener": 84587, - "addOn": 58067, - "addPreferredGap": 34275, - "addTo": 50301, - "addWidget": 36805, - "addafi": 93312, - "added": 16828, - "adden": 70095, - "adder": 20808, - "adders": 80208, - "addin": 97006, - "adding": 2998, - "addir": 44525, - "additional": 35499, - "addle": 20137, - "addock": 79434, - "addon": 51099, - "addons": 77270, - "addr": 6214, - "address": 4995, - "addresses": 53789, - "adds": 72994, - "addtogroup": 84286, - "addy": 22478, - "ade": 1021, - "adecimal": 49326, - "aded": 14255, - "adel": 15151, - "adelphia": 17802, - "adem": 59372, - "ademic": 69758, - "aden": 21140, - "adena": 44347, - "adeon": 32709, - "ader": 998, - "adera": 66601, - "adero": 73230, - "aders": 6393, - "ades": 3452, - "adesh": 22902, - "adf": 96289, - "adge": 60705, - "adget": 50931, - "adh": 51587, - "adi": 2767, - "adia": 52831, - "adian": 10066, - "adians": 20736, - "adiator": 67808, - "adic": 36214, - "adiens": 82695, - "adients": 36318, - "adier": 95265, - "adies": 17054, - "adin": 30984, - "ading": 2228, - "adio": 4022, - "adioButton": 17253, - "adir": 41173, - "adium": 13478, - "adius": 4037, - "adj": 24739, - "adjust": 38719, - "adjusted": 87797, - "adle": 71355, - "adm": 46929, - "admin": 2882, - "administr": 68849, - "administration": 90590, - "administrator": 66966, - "admins": 74600, - "ado": 2123, - "adol": 86769, - "adoo": 77112, - "adoop": 25268, - "adopt": 98238, - "ador": 5364, - "adora": 29813, - "adoras": 73438, - "adores": 18244, - "adors": 66887, - "ados": 5553, - "adow": 5843, - "adows": 21060, - "adox": 39097, - "adr": 14666, - "adratic": 88678, - "adress": 82236, - "adresse": 60275, - "adro": 89676, - "ads": 7664, - "adt": 25720, - "adult": 67856, - "adv": 14290, - "advance": 59320, - "advanced": 41779, - "advert": 40240, - "advertisement": 93148, - "advisor": 81794, - "adx": 38285, - "ady": 7604, - "ae": 5918, - "aea": 70335, - "aec": 71221, - "aed": 61454, - "aeda": 34660, - "ael": 5891, - "aeper": 73665, - "aepernick": 73732, - "aes": 76584, - "af": 2577, - "afa": 35834, - "afari": 59639, - "afb": 96834, - "afc": 94298, - "afd": 92139, - "afe": 5645, - "afen": 67558, - "afety": 38618, - "aff": 2649, - "affe": 37780, - "affected": 31057, - "affen": 71378, - "affer": 72153, - "affiliate": 78340, - "affle": 44090, - "affles": 80535, - "afi": 45910, - "afia": 48451, - "afil": 42962, - "afka": 21883, - "afone": 79294, - "afort": 52713, - "afs": 71498, - "after": 10694, - "afx": 34178, - "afür": 60119, - "ag": 351, - "aga": 12466, - "again": 32771, - "against": 68749, - "agal": 68112, - "agan": 18345, - "agar": 37712, - "agara": 59722, - "agas": 85052, - "agascar": 78675, - "agate": 46836, - "agation": 27137, - "age": 424, - "aged": 3279, - "agedList": 87765, - "agem": 14661, - "agement": 3448, - "agements": 61096, - "agen": 8535, - "agency": 55565, - "agenda": 79723, - "agens": 38796, - "agent": 8092, - "agenta": 47062, - "agento": 28053, - "agents": 54875, - "ager": 1409, - "agers": 11218, - "ages": 1134, - "aget": 84063, - "agg": 15718, - "aggable": 84896, - "agged": 96476, - "agger": 10114, - "aggi": 31616, - "aggio": 34159, - "aggregate": 59606, - "agh": 33756, - "aghan": 96169, - "agher": 63574, - "aghetti": 63965, - "agi": 36035, - "agic": 12780, - "agina": 80601, - "agination": 10353, - "aginator": 33128, - "agine": 23392, - "aging": 4118, - "agini": 90069, - "agit": 73872, - "agle": 32674, - "agli": 79056, - "agma": 5716, - "agment": 15601, - "agn": 3246, - "agna": 54957, - "agnar": 80753, - "agne": 23870, - "agner": 39438, - "agnet": 63233, - "agnetic": 38000, - "agnitude": 34715, - "agnosis": 49815, - "agnost": 8208, - "agnostic": 11953, - "agnostics": 15550, - "ago": 6304, - "agog": 54080, - "agogue": 70936, - "agon": 6113, - "agonal": 23450, - "agoon": 67413, - "agos": 80607, - "agr": 68305, - "agra": 12655, - "agram": 5745, - "agrams": 68772, - "agrant": 63487, - "agraph": 9216, - "agree": 68100, - "agrid": 45327, - "ags": 2032, - "agt": 62713, - "agu": 46720, - "agua": 54648, - "aguay": 83142, - "ague": 4663, - "agues": 13488, - "agus": 58738, - "agy": 81670, - "ah": 1466, - "aha": 13546, - "ahaha": 73535, - "ahan": 22051, - "ahas": 91966, - "ahead": 42787, - "ahi": 51106, - "ahir": 50998, - "ahkan": 74286, - "ahl": 16722, - "ahlen": 58193, - "ahn": 29560, - "aho": 28582, - "ahoma": 27840, - "ahoo": 16967, - "ahr": 15113, - "ahrain": 57958, - "ahren": 21176, - "ahrenheit": 47910, - "ahrung": 65224, - "ahrungen": 74374, - "ahu": 26695, - "ahun": 29727, - "ai": 2143, - "aic": 61388, - "aid": 3779, - "aida": 35444, - "aidu": 35801, - "aight": 7386, - "aign": 4109, - "aigned": 69969, - "ail": 604, - "ailability": 12535, - "ailable": 2094, - "ailand": 25178, - "ailed": 5687, - "ailer": 38782, - "ailing": 14277, - "aille": 50909, - "ailles": 86355, - "ails": 6209, - "ailure": 9373, - "aily": 5069, - "aim": 2640, - "aimassage": 55950, - "aims": 25676, - "ain": 466, - "aina": 72622, - "aincontri": 74472, - "aine": 8346, - "ained": 2627, - "ainen": 55664, - "ainer": 1743, - "ainers": 20568, - "aines": 32803, - "aining": 2056, - "ainless": 16459, - "ainment": 72612, - "ains": 1735, - "aint": 1641, - "ainted": 30229, - "aintenance": 24559, - "ainter": 73541, - "ainties": 61024, - "ainting": 70859, - "ainty": 18271, - "air": 1310, - "aira": 89780, - "aire": 11998, - "aired": 24274, - "aires": 17276, - "airie": 74590, - "airo": 25549, - "airobi": 83452, - "airport": 86615, - "airro": 37658, - "airs": 4720, - "airy": 21939, - "ais": 2782, - "aisal": 91020, - "aise": 4016, - "aised": 23964, - "aiser": 39266, - "aises": 21868, - "aising": 50126, - "aison": 56188, - "aisy": 49056, - "ait": 1315, - "aits": 56479, - "aj": 1630, - "aja": 19042, - "ajan": 96286, - "ajar": 50904, - "ajaran": 84033, - "ajas": 66822, - "ajax": 7242, - "aje": 11058, - "ajes": 35450, - "aji": 41788, - "ajo": 18734, - "ajor": 3035, - "ajs": 23720, - "aju": 51413, - "ajÄħ": 32873, - "ajÄħc": 95251, - "ajÄħce": 134287, - "ajÄħcy": 135390, - "ak": 585, - "aka": 13334, - "akah": 76427, - "akan": 19262, - "akash": 93995, - "ake": 726, - "akeFromNib": 69729, - "aked": 7741, - "akedirs": 35567, - "akedown": 77245, - "aken": 3366, - "akening": 73362, - "akens": 70737, - "aker": 4407, - "akers": 8312, - "akes": 2050, - "akespeare": 36871, - "akest": 74141, - "aket": 60942, - "akeup": 62744, - "akh": 21758, - "akhir": 64858, - "akhstan": 63747, - "aki": 14624, - "akin": 42230, - "aking": 1765, - "akis": 75777, - "akistan": 69293, - "akit": 97401, - "akk": 30041, - "aklı": 131920, - "ako": 28786, - "akov": 88630, - "akra": 51403, - "aks": 9810, - "aksi": 37679, - "akt": 9913, - "akte": 28815, - "akter": 51767, - "aktion": 67726, - "aktiv": 73607, - "aktu": 50654, - "aku": 23557, - "akukan": 49995, - "aky": 28100, - "akÄ±ÅŁ": 138676, - "al": 278, - "ala": 6053, - "alach": 71384, - "alah": 29393, - "alam": 16823, - "alamat": 53218, - "alan": 32283, - "alance": 4978, - "aland": 15337, - "alar": 7934, - "alaria": 56916, - "alarm": 56780, - "alars": 39977, - "alary": 39459, - "alborg": 68202, - "album": 21011, - "albums": 61471, - "alc": 16927, - "alchemy": 34905, - "alcon": 46214, - "alculate": 45441, - "ald": 4747, - "aldi": 76916, - "aldo": 39132, - "ale": 1574, - "aleb": 63930, - "aled": 5838, - "aleigh": 54830, - "alem": 21589, - "alement": 53860, - "alen": 35649, - "alendar": 12082, - "alent": 68161, - "aler": 13111, - "alers": 55785, - "alert": 5083, - "alertView": 86609, - "alerts": 91133, - "ales": 3831, - "alesce": 73250, - "alette": 28510, - "aleur": 59947, - "alex": 55875, - "aley": 41927, - "alez": 42945, - "aleza": 79152, - "alf": 3104, - "alfa": 84426, - "alg": 23881, - "algo": 72464, - "algorithm": 19688, - "ali": 7956, - "alia": 18848, - "alian": 10480, - "alias": 14956, - "aliases": 33924, - "alic": 31513, - "alice": 63195, - "alie": 74518, - "alien": 55318, - "align": 6612, - "aligned": 47142, - "alignment": 44598, - "alin": 35107, - "aling": 6132, - "alink": 66823, - "alion": 49741, - "alis": 34865, - "alist": 53072, - "ality": 2719, - "alité": 131275, - "alive": 50961, - "alk": 1692, - "alker": 36808, - "alking": 29755, - "all": 541, - "alla": 20905, - "allah": 76478, - "allas": 15863, - "allax": 44168, - "allback": 3420, - "alle": 5054, - "alled": 4736, - "allee": 53382, - "allel": 7957, - "allele": 94520, - "allen": 57301, - "alleng": 33769, - "allenge": 15832, - "allenges": 42370, - "aller": 13956, - "alleries": 97226, - "allery": 7447, - "alles": 95929, - "allest": 19236, - "allet": 7464, - "alley": 92166, - "alli": 95793, - "alling": 16740, - "allis": 95144, - "allo": 35937, - "alloc": 4742, - "alloca": 90594, - "allocate": 31191, - "allocated": 57372, - "allocation": 93239, - "allocator": 57631, - "allon": 92414, - "allow": 7183, - "allowed": 20967, - "alloween": 22685, - "allows": 55867, - "alls": 5583, - "ally": 745, - "alm": 7673, - "almart": 26952, - "almost": 59201, - "almö": 90756, - "alnum": 93362, - "alo": 12529, - "aload": 54396, - "alog": 30951, - "alogy": 79278, - "alom": 82028, - "alon": 43611, - "alone": 31576, - "along": 38293, - "alore": 43921, - "alous": 29443, - "alph": 30223, - "alpha": 7141, - "alphabet": 89453, - "already": 45484, - "als": 1127, - "alsa": 41826, - "alse": 710, - "alsex": 69488, - "also": 18654, - "alsy": 59284, - "alt": 3145, - "alta": 68051, - "altar": 70843, - "alte": 92320, - "alted": 61234, - "alten": 59493, - "alter": 37277, - "altern": 40412, - "alternate": 75362, - "alternative": 76995, - "altet": 93908, - "alth": 1864, - "although": 36141, - "alties": 23487, - "altimore": 87132, - "altitude": 98011, - "alto": 75677, - "altung": 61806, - "altura": 68491, - "alty": 10026, - "altı": 132917, - "alu": 36986, - "alue": 540, - "alus": 86127, - "always": 32122, - "aly": 5774, - "alysis": 9092, - "alytics": 17555, - "alyze": 55856, - "alyzed": 67842, - "alyzer": 27165, - "alık": 127781, - "alım": 131736, - "alÄ±ÅŁ": 72969, - "am": 309, - "ama": 3029, - "amac": 32607, - "amacare": 33824, - "amage": 9617, - "amaged": 91820, - "amaha": 85213, - "aman": 12715, - "amanho": 46305, - "amar": 15554, - "amarin": 30038, - "amas": 28089, - "amat": 41911, - "amate": 91066, - "amation": 26187, - "amax": 89627, - "amazon": 72753, - "amaño": 62313, - "amb": 2969, - "amba": 41908, - "ambah": 38187, - "ambda": 5698, - "amber": 15221, - "ambi": 88402, - "ambia": 52837, - "ambient": 59614, - "ambiguous": 90213, - "ambil": 77071, - "ambio": 64658, - "ambique": 89829, - "amble": 62934, - "ambre": 57466, - "amburg": 31448, - "amburger": 46675, - "amd": 67913, - "ame": 373, - "amed": 3606, - "ameda": 98071, - "amedi": 91906, - "amel": 35562, - "ameleon": 96811, - "amen": 24774, - "ament": 2838, - "amental": 43086, - "amentals": 77014, - "amente": 8980, - "amenti": 63480, - "amento": 10411, - "amentos": 36779, - "aments": 23558, - "amer": 15232, - "amera": 3436, - "amerate": 76966, - "american": 77718, - "ameron": 90612, - "ames": 971, - "amespace": 1680, - "amework": 3345, - "ami": 10606, - "amic": 3991, - "amics": 78178, - "amide": 65696, - "amient": 66328, - "amiento": 22820, - "amientos": 78309, - "amil": 20933, - "amiliar": 40405, - "amilies": 58904, - "amily": 5174, - "amin": 8608, - "amina": 34050, - "amination": 26837, - "amine": 19991, - "aminer": 64153, - "amines": 95981, - "aming": 6469, - "amins": 37825, - "aml": 9467, - "amm": 8666, - "amma": 13099, - "ammable": 99110, - "ammad": 53396, - "ammed": 24794, - "ammen": 36772, - "amment": 63556, - "ammer": 66599, - "ammers": 42057, - "ammo": 98327, - "ammu": 87039, - "amo": 21100, - "amodel": 40259, - "amon": 30836, - "among": 76305, - "amos": 10585, - "amoto": 56860, - "amount": 6045, - "amous": 22517, - "amp": 1121, - "ampa": 22639, - "ampaign": 18168, - "amped": 32198, - "amphetamine": 84790, - "ampie": 48298, - "ampil": 51628, - "ampilkan": 96313, - "amping": 30457, - "ampion": 13277, - "ampions": 9132, - "ampionship": 12241, - "ampire": 32033, - "ample": 1516, - "ampled": 65007, - "ampler": 34501, - "amples": 4023, - "ampling": 29709, - "ampo": 53730, - "ampoline": 59352, - "ampoo": 47595, - "ampp": 45726, - "amps": 14647, - "ampton": 42001, - "ampus": 43551, - "ams": 4122, - "amsung": 14441, - "amt": 35225, - "amu": 51972, - "amura": 83717, - "amus": 55355, - "amy": 26228, - "améli": 142829, - "améliorer": 142830, - "an": 276, - "ana": 3362, - "anagan": 89163, - "anager": 8184, - "anal": 48821, - "analy": 43703, - "analysis": 34484, - "analytics": 77652, - "analyze": 93221, - "aname": 93694, - "anan": 28618, - "anas": 25908, - "anax": 84612, - "anc": 1129, - "anca": 63245, - "ance": 681, - "anced": 4874, - "ancel": 4949, - "anceled": 38392, - "ancell": 14241, - "ancellable": 83603, - "ancellation": 49222, - "ancellationToken": 23927, - "ancellor": 34146, - "ancement": 16480, - "ancements": 38581, - "ancer": 11705, - "ancers": 31742, - "ances": 3020, - "ancestor": 66878, - "anch": 3497, - "anche": 27997, - "anches": 82181, - "anchise": 65690, - "anchor": 17109, - "anchors": 70499, - "ancia": 24158, - "ancial": 4898, - "ancias": 79641, - "ancies": 31637, - "ancing": 8974, - "anco": 18557, - "ancock": 74081, - "ancode": 87115, - "ancouver": 20471, - "ancy": 6572, - "ancybox": 61046, - "and": 437, - "andExpect": 40793, - "andFilterWhere": 84697, - "andReturn": 65805, - "andWhere": 65147, - "anda": 9817, - "andal": 16672, - "andalone": 84112, - "andan": 82808, - "andard": 7648, - "andas": 55433, - "andatory": 62088, - "andbox": 31536, - "ande": 22925, - "anded": 6465, - "andel": 37121, - "andelier": 78121, - "anden": 61700, - "ander": 8199, - "andering": 60280, - "anders": 83951, - "andes": 61352, - "andest": 90856, - "andex": 44526, - "andez": 37222, - "andi": 64574, - "andid": 4551, - "andidate": 17050, - "andidates": 26222, - "andin": 50601, - "anding": 25591, - "andise": 30670, - "andle": 3316, - "andler": 5252, - "andles": 20125, - "ando": 4883, - "andom": 2206, - "andon": 11037, - "andoned": 90144, - "andr": 73876, - "andra": 23274, - "andre": 79181, - "andro": 41724, - "android": 5954, - "ands": 2844, - "andscape": 71027, - "andum": 57285, - "andy": 13331, - "ane": 2145, - "anean": 32461, - "aned": 51430, - "anel": 2387, - "anela": 77440, - "aneous": 17666, - "aneously": 20315, - "anes": 14655, - "aney": 81186, - "anford": 94103, - "ang": 524, - "anga": 19372, - "angan": 18633, - "anganese": 65864, - "ange": 844, - "anged": 3726, - "angel": 17281, - "angelo": 87910, - "angelog": 61873, - "angement": 56633, - "angen": 59141, - "angent": 66451, - "angep": 55851, - "angepicker": 75321, - "anger": 4003, - "angered": 96309, - "angers": 14052, - "anges": 5520, - "anggal": 30509, - "anggan": 77257, - "anghai": 30070, - "angi": 78328, - "angible": 60086, - "anging": 8595, - "angkan": 86012, - "angle": 4044, - "angled": 38940, - "angler": 65548, - "angles": 17248, - "angling": 90104, - "ango": 5170, - "angs": 64487, - "angstrom": 79023, - "angu": 2325, - "anguage": 2616, - "anguages": 10513, - "anguard": 52190, - "angular": 4234, - "anh": 27924, - "ani": 5559, - "ania": 9166, - "anian": 74512, - "anic": 31270, - "anical": 44883, - "anie": 19151, - "aniel": 12046, - "aniem": 96308, - "anim": 15968, - "animal": 47899, - "animals": 76796, - "animate": 22030, - "animated": 19700, - "animation": 23050, - "animations": 52927, - "anime": 94670, - "anine": 91256, - "aning": 43059, - "anio": 92708, - "anism": 67813, - "anitize": 58652, - "anity": 38270, - "aniu": 72431, - "anium": 34722, - "anj": 52091, - "anja": 93951, - "anje": 84957, - "ank": 1180, - "anka": 26671, - "ankan": 75082, - "anke": 88729, - "anked": 40772, - "anken": 89289, - "anker": 98248, - "ankind": 69270, - "anking": 32334, - "anko": 92852, - "anks": 4039, - "anky": 91816, - "anmar": 45716, - "ann": 1020, - "anna": 12642, - "annabin": 96753, - "annah": 43004, - "anne": 20368, - "anned": 7295, - "anneer": 90485, - "annel": 2594, - "annels": 6680, - "anner": 4887, - "anners": 24003, - "annes": 41156, - "anness": 82033, - "anni": 42661, - "annie": 71076, - "annies": 93242, - "anning": 5947, - "annis": 76283, - "anno": 21552, - "annon": 17436, - "annonce": 97623, - "annot": 3401, - "annotate": 91350, - "annotation": 24674, - "annotations": 39626, - "announce": 65512, - "announcement": 80309, - "annt": 93339, - "annual": 63609, - "anny": 12888, - "annya": 71098, - "année": 84235, - "ano": 5652, - "anoi": 72703, - "anoia": 69895, - "anol": 38610, - "anon": 58910, - "anonymous": 25280, - "anooga": 87002, - "anos": 43605, - "another": 41963, - "anova": 85463, - "ans": 596, - "ansa": 93602, - "ansas": 13805, - "anse": 69654, - "ansen": 60865, - "anship": 34302, - "ansi": 52067, - "ansible": 91742, - "ansion": 10501, - "ansk": 40774, - "anske": 87211, - "ansom": 47231, - "anson": 36545, - "ansson": 80165, - "anst": 61194, - "answer": 9217, - "answered": 56724, - "answers": 24710, - "ant": 517, - "anta": 8260, - "antage": 24806, - "antaged": 74140, - "antages": 37786, - "antal": 59693, - "antan": 66189, - "antanamo": 95623, - "antar": 88965, - "antas": 76814, - "antasy": 96937, - "antd": 36881, - "ante": 4942, - "anted": 7566, - "antee": 13843, - "anteed": 58250, - "anten": 54834, - "anter": 80030, - "antes": 15477, - "anth": 31229, - "antha": 57869, - "anti": 15359, - "antiago": 42974, - "antic": 8159, - "antically": 80949, - "anticipated": 92778, - "antics": 36233, - "antidad": 26793, - "antine": 38357, - "antino": 95364, - "antis": 37866, - "antity": 5759, - "antium": 97925, - "antlr": 44964, - "antly": 17548, - "anto": 13561, - "antom": 30002, - "anton": 30954, - "antor": 88167, - "antro": 86190, - "antry": 31210, - "ants": 1783, - "antt": 88688, - "antu": 91306, - "antwort": 69046, - "antz": 89497, - "anus": 57963, - "anut": 37818, - "anuts": 72752, - "anvas": 11947, - "any": 3767, - "anya": 24074, - "anyahu": 41559, - "anyak": 50303, - "anych": 44453, - "anye": 48283, - "anyl": 89914, - "anything": 72154, - "anz": 12070, - "anza": 26466, - "anzeigen": 88860, - "anzi": 71818, - "ança": 90998, - "ao": 3441, - "aoke": 68505, - "aos": 64866, - "ap": 391, - "apGestureRecognizer": 54614, - "apa": 18321, - "apache": 58072, - "apan": 5359, - "apanese": 28689, - "apas": 88027, - "apat": 25760, - "apatkan": 90543, - "ape": 2027, - "apeake": 96556, - "aped": 10185, - "apel": 81100, - "apellido": 55303, - "aper": 3191, - "apers": 9532, - "apes": 9337, - "apesh": 77931, - "apest": 27624, - "apeut": 26498, - "apeutic": 31386, - "apeutics": 87786, - "apg": 63360, - "apgolly": 64407, - "aph": 1342, - "aphael": 74240, - "aphore": 25545, - "aphrag": 94796, - "api": 2068, - "apiKey": 57371, - "apia": 79370, - "apid": 43121, - "apikey": 72174, - "aping": 14216, - "apiro": 69479, - "apis": 13725, - "apist": 59229, - "apixel": 94195, - "apk": 93812, - "apl": 72289, - "apo": 65552, - "apol": 16657, - "apolis": 23814, - "apollo": 53610, - "apon": 10736, - "apons": 25778, - "apor": 20715, - "aporan": 71739, - "aporation": 95549, - "apore": 17665, - "apos": 30415, - "apot": 89901, - "app": 676, - "appId": 74829, - "appName": 85102, - "appa": 27180, - "appable": 86384, - "appe": 33431, - "appear": 40766, - "appearance": 96655, - "appeared": 98467, - "apped": 5677, - "appen": 63760, - "append": 5090, - "appendChild": 42609, - "appendTo": 46603, - "apper": 3106, - "appers": 27821, - "apphire": 55105, - "appid": 58342, - "appiness": 66291, - "apping": 3629, - "appings": 23036, - "appl": 76096, - "apple": 22377, - "applicant": 90264, - "application": 5132, - "applications": 82453, - "apply": 10280, - "appoint": 11671, - "appointed": 70116, - "appointment": 51101, - "appro": 15707, - "appropri": 75471, - "appropriate": 28128, - "approval": 54439, - "approve": 49221, - "approved": 33912, - "approx": 48053, - "approximately": 96736, - "apps": 27635, - "appy": 11144, - "apr": 59817, - "apro": 58848, - "après": 139320, - "aps": 2625, - "apse": 7477, - "apsed": 9200, - "apses": 78290, - "apsible": 68561, - "apsulation": 86115, - "apt": 2689, - "aptcha": 25431, - "apter": 2873, - "apters": 17425, - "aptic": 52174, - "aption": 10162, - "aptive": 27781, - "aptop": 16386, - "aptops": 40973, - "aptor": 32657, - "aptors": 57412, - "apture": 11850, - "aptured": 80228, - "apult": 72806, - "apur": 99040, - "apus": 67074, - "apy": 9667, - "apyrus": 89194, - "aq": 36306, - "aqu": 71571, - "aque": 19659, - "ar": 277, - "arDown": 59342, - "arLayout": 16814, - "arParams": 63752, - "arResult": 59081, - "ara": 5059, - "arah": 42418, - "arak": 27885, - "aram": 637, - "aramel": 46604, - "aran": 21320, - "araoh": 81197, - "aras": 72842, - "arat": 46857, - "aravel": 61653, - "arb": 75270, - "arbeit": 59908, - "arbon": 51645, - "arbonate": 96242, - "arc": 8198, - "arcer": 42986, - "arch": 1113, - "archical": 45234, - "arching": 82285, - "architecture": 80419, - "archive": 16019, - "archives": 95812, - "archivo": 61947, - "archs": 86050, - "archy": 15272, - "arcy": 96379, - "ard": 567, - "arda": 71526, - "ardash": 55688, - "arde": 41341, - "arded": 20958, - "arden": 8341, - "ardi": 36389, - "ardin": 53790, - "arding": 28410, - "ardless": 29820, - "ardo": 20473, - "ardon": 45296, - "ardown": 37496, - "ards": 2347, - "ardu": 82061, - "arduino": 90201, - "ardware": 37750, - "ardy": 90574, - "are": 546, - "area": 4798, - "areas": 32537, - "ared": 1605, - "arefa": 75251, - "arehouse": 20256, - "arel": 30431, - "arella": 74931, - "arem": 68368, - "aremos": 80184, - "aren": 9151, - "arena": 30527, - "arence": 68677, - "arend": 52845, - "arendra": 63494, - "arent": 1390, - "arently": 30127, - "arer": 60470, - "ares": 5403, - "arest": 15432, - "aret": 11302, - "areth": 56265, - "arez": 38514, - "arf": 59226, - "arg": 858, - "arga": 17922, - "argar": 33892, - "argas": 74079, - "argc": 23307, - "arge": 2744, - "arged": 92249, - "argent": 76117, - "arger": 41776, - "arges": 58240, - "argest": 32381, - "arget": 1284, - "argin": 2904, - "arging": 74716, - "argins": 81839, - "argo": 12088, - "argon": 70821, - "argout": 60490, - "args": 2116, - "argument": 14479, - "arguments": 16370, - "argv": 6508, - "arhus": 91089, - "ari": 2780, - "aria": 10432, - "arial": 42721, - "arian": 8821, - "ariance": 36905, - "arians": 29527, - "ariant": 15341, - "arias": 47113, - "ariat": 40879, - "ariate": 49659, - "arie": 66445, - "aries": 5431, - "arih": 93783, - "arily": 6613, - "arin": 42740, - "arine": 74214, - "aring": 3249, - "ario": 3290, - "arios": 10100, - "arious": 53271, - "aris": 41860, - "arith": 56636, - "arity": 10748, - "arium": 33665, - "arius": 40221, - "ark": 838, - "arkan": 61886, - "arked": 42061, - "arker": 12856, - "arkers": 90041, - "arket": 54560, - "arkin": 92321, - "arking": 33452, - "arks": 7193, - "arl": 48258, - "arlo": 60928, - "arm": 2178, - "arma": 19726, - "armac": 71382, - "armacy": 75242, - "arme": 73860, - "armed": 30272, - "arming": 32902, - "armor": 42548, - "arms": 15914, - "arn": 1885, - "arna": 39215, - "arnation": 54049, - "arness": 23518, - "arning": 3177, - "arnings": 14857, - "aro": 17165, - "aron": 12765, - "aroo": 75765, - "around": 19454, - "arov": 93918, - "arp": 7876, - "arpa": 81897, - "arr": 1118, - "arra": 79030, - "arrant": 6598, - "arrants": 51080, - "arranty": 43190, - "arrass": 20920, - "array": 1653, - "arrays": 66893, - "arrera": 82131, - "arring": 19859, - "arrings": 51498, - "arris": 58322, - "arrison": 50003, - "arriv": 141345, - "arrival": 77079, - "arrivée": 141346, - "arrière": 134183, - "arro": 81201, - "arrow": 6044, - "arry": 11433, - "arrêt": 134455, - "ars": 1561, - "arse": 2583, - "arsed": 18112, - "arseille": 61160, - "arser": 10425, - "arsers": 40488, - "arshal": 28423, - "arsi": 60014, - "arsimp": 52209, - "arsing": 28598, - "arsity": 70880, - "art": 471, - "arta": 24969, - "arte": 19840, - "arten": 23118, - "arter": 5295, - "arters": 14361, - "arth": 46501, - "arti": 67541, - "artial": 20894, - "artic": 80887, - "article": 7058, - "articles": 16243, - "artifact": 63722, - "artin": 34845, - "artisan": 36251, - "artisanlib": 80159, - "artist": 18622, - "artists": 76635, - "artment": 3195, - "artner": 92307, - "arto": 35943, - "arton": 79496, - "arts": 7038, - "arty": 6720, - "artz": 21593, - "aru": 30144, - "arus": 50319, - "ary": 658, - "arya": 72168, - "aryana": 92974, - "aryawan": 75627, - "aryl": 77808, - "ará": 30741, - "arÃŃa": 82701, - "arı": 67128, - "as": 300, - "asInstanceOf": 49044, - "asString": 75422, - "asa": 15428, - "asad": 76611, - "asaki": 56409, - "asan": 45388, - "asant": 15596, - "asar": 66938, - "asbourg": 83150, - "asc": 5061, - "asca": 98440, - "ascade": 19977, - "ascal": 35840, - "ascar": 65888, - "ascending": 71900, - "ascii": 23324, - "ascimento": 56961, - "asco": 79357, - "ascript": 5825, - "asctime": 77077, - "ascular": 49704, - "ascus": 52643, - "asd": 79102, - "asdf": 76615, - "ase": 519, - "ased": 1475, - "asel": 83497, - "aseline": 49314, - "asename": 27100, - "aser": 12080, - "asers": 59730, - "ases": 2264, - "aset": 5028, - "aseña": 42523, - "ash": 988, - "asha": 30443, - "ashboard": 7349, - "ashed": 13571, - "asher": 33767, - "ashes": 14051, - "ashi": 30378, - "ashing": 19049, - "ashington": 31699, - "ashion": 8782, - "ashire": 96314, - "ashtra": 57381, - "asi": 10215, - "asia": 35159, - "asic": 5971, - "asics": 67981, - "aside": 28512, - "asier": 76683, - "asil": 29049, - "asily": 37267, - "asin": 50310, - "asing": 4422, - "asio": 39513, - "asion": 17766, - "asionally": 68391, - "asions": 87671, - "asis": 10718, - "asiswa": 55624, - "asive": 26547, - "asje": 26846, - "asjon": 93546, - "ask": 1073, - "aska": 16883, - "askan": 78351, - "askell": 42758, - "asket": 9553, - "askets": 48140, - "asking": 70705, - "asks": 4604, - "asl": 75366, - "asley": 73011, - "asm": 10530, - "asma": 22572, - "asmine": 38864, - "asmus": 81788, - "asn": 65536, - "aso": 38955, - "ason": 1497, - "asonic": 42275, - "asonry": 50793, - "asons": 98849, - "asp": 13367, - "aspberry": 35962, - "aspect": 57058, - "asper": 32261, - "aspers": 87629, - "ass": 395, - "assa": 55592, - "assador": 24500, - "assadors": 73253, - "assage": 38236, - "assandra": 70093, - "asse": 13256, - "assed": 59004, - "assel": 80561, - "assemble": 69108, - "assembly": 14993, - "assen": 27277, - "asser": 33758, - "assert": 2207, - "assertCount": 94031, - "assertEquals": 16422, - "assertFalse": 59041, - "assertInstanceOf": 63180, - "assertSame": 37774, - "assertTrue": 35637, - "asses": 50990, - "assessment": 64672, - "asset": 9852, - "assets": 5160, - "assi": 81543, - "assic": 64344, - "assign": 6983, - "assigned": 39021, - "assignment": 29951, - "assignments": 96310, - "assin": 43723, - "assing": 72832, - "assis": 32467, - "assist": 50966, - "assistant": 77091, - "assium": 48063, - "asso": 28863, - "assoc": 46877, - "associ": 24313, - "associate": 71531, - "associated": 49087, - "association": 54465, - "assume": 45051, - "assuming": 65363, - "assword": 1938, - "assy": 26703, - "ast": 559, - "asta": 14300, - "aste": 5525, - "asted": 15036, - "aster": 2300, - "astered": 87373, - "asters": 14199, - "asterxml": 27453, - "astery": 53571, - "astes": 26908, - "asthan": 71549, - "asti": 68460, - "astic": 5064, - "astically": 35319, - "astics": 38071, - "asticsearch": 27791, - "asting": 14725, - "astle": 74430, - "asto": 53385, - "aston": 94991, - "astos": 52993, - "astr": 20467, - "astreet": 61398, - "astro": 22975, - "asts": 11757, - "asty": 14980, - "astype": 21754, - "asu": 95277, - "asurable": 55812, - "asure": 3970, - "asured": 39312, - "asurement": 24359, - "asurer": 56294, - "asures": 23471, - "asuring": 68674, - "asury": 26102, - "asy": 6405, - "asyarak": 90322, - "asyarakat": 91280, - "async": 7692, - "asz": 52340, - "ası": 92285, - "at": 266, - "atLng": 32738, - "ata": 459, - "atab": 2096, - "atabase": 2211, - "atabases": 23822, - "atable": 15086, - "atables": 29375, - "ataire": 65649, - "ataires": 92451, - "atak": 68728, - "ataka": 60124, - "atal": 4212, - "ataloader": 70286, - "atalog": 7750, - "atan": 16225, - "atar": 6392, - "atars": 43858, - "atas": 19346, - "ataset": 8369, - "atasets": 76649, - "atat": 92484, - "atatype": 91162, - "atch": 754, - "atched": 34244, - "atcher": 28058, - "atches": 9118, - "atchet": 83992, - "atchewan": 58747, - "atching": 31924, - "ate": 349, - "ateau": 76625, - "ated": 657, - "atedRoute": 27195, - "atee": 95680, - "ateful": 20840, - "ateg": 1328, - "ategic": 89367, - "ategies": 69388, - "atego": 94072, - "ategor": 7593, - "ategori": 31234, - "ategoria": 16758, - "ategorias": 50382, - "ategorical": 46047, - "ategorie": 37473, - "ategories": 5268, - "ategorized": 57611, - "ategory": 2031, - "ategy": 10228, - "atel": 83326, - "ately": 2652, - "atem": 37246, - "atemala": 53450, - "atement": 5605, - "aten": 13518, - "ater": 962, - "ateral": 19165, - "aterangepicker": 85107, - "ateria": 28183, - "aterial": 2180, - "atern": 13375, - "aternion": 16351, - "aternity": 64043, - "aterno": 79556, - "aters": 11535, - "ates": 973, - "atest": 13893, - "atetime": 27662, - "ateur": 10831, - "ateurs": 35206, - "atever": 7415, - "ateway": 12043, - "atform": 3329, - "ath": 587, - "atha": 65726, - "atham": 68376, - "athan": 13981, - "athe": 68936, - "athed": 69637, - "ather": 1856, - "atherine": 27009, - "athering": 82795, - "athers": 19030, - "athi": 66531, - "athing": 43561, - "athlete": 89944, - "athlon": 76917, - "atholic": 95330, - "athom": 72455, - "athon": 23941, - "athroom": 77832, - "aths": 26286, - "athy": 19135, - "ati": 9307, - "atial": 22433, - "atic": 774, - "atica": 53297, - "atical": 61072, - "atically": 7022, - "atican": 43062, - "aticon": 85049, - "atics": 28370, - "atie": 25852, - "atient": 16389, - "atif": 49748, - "atile": 9010, - "atility": 31156, - "atin": 14768, - "ating": 1095, - "atings": 27689, - "atinum": 29090, - "atio": 6266, - "ation": 367, - "ationToken": 17044, - "ational": 1663, - "ationale": 37035, - "ationally": 29054, - "ations": 804, - "ationship": 15471, - "atis": 3605, - "atisation": 97671, - "atisch": 81591, - "atische": 69022, - "atisf": 7478, - "atisfaction": 51270, - "atisfied": 46265, - "atism": 71110, - "atitis": 81701, - "atitude": 17145, - "ativ": 19488, - "ativa": 27852, - "ativas": 51541, - "ative": 1388, - "atively": 7887, - "atives": 5859, - "ativity": 43415, - "ativo": 28250, - "ativos": 63445, - "atk": 53809, - "atl": 59335, - "ato": 4330, - "atoes": 20187, - "atoi": 51071, - "atoire": 66663, - "atology": 73914, - "atom": 21855, - "atomic": 6618, - "atoms": 65550, - "atomy": 40795, - "aton": 23535, - "atonin": 98412, - "atoon": 51675, - "ator": 850, - "atore": 44009, - "atori": 50637, - "atoria": 95310, - "atorial": 37936, - "atories": 37170, - "atorio": 36590, - "atorium": 65744, - "ators": 2973, - "atory": 5269, - "atos": 14030, - "atown": 87333, - "atr": 60978, - "atra": 39558, - "atre": 15715, - "atri": 2361, - "atrib": 75567, - "atrice": 67536, - "atrigesimal": 42487, - "atrix": 2555, - "atro": 35336, - "atron": 80089, - "ats": 1862, - "atsapp": 71444, - "atsby": 35514, - "atsu": 50743, - "att": 1587, - "atta": 31919, - "attach": 16330, - "attached": 67497, - "attachment": 21981, - "attachments": 45878, - "attack": 20566, - "attacks": 80110, - "atte": 62634, - "atted": 12127, - "attempt": 55505, - "atten": 14456, - "attend": 56458, - "attendance": 62625, - "attended": 84906, - "attention": 53103, - "atter": 1650, - "attered": 21924, - "attering": 30336, - "attern": 3227, - "atters": 10175, - "attery": 18670, - "atti": 30955, - "attice": 31791, - "attivitÃł": 138961, - "attle": 4626, - "attles": 90127, - "atto": 16755, - "attr": 2991, - "attrib": 44113, - "attribute": 9116, - "attributes": 12340, - "attro": 76947, - "attrs": 20468, - "atts": 20983, - "atty": 22908, - "atu": 35309, - "atum": 26253, - "atur": 2628, - "atura": 24296, - "atural": 4585, - "aturally": 71147, - "aturas": 86529, - "aturated": 34367, - "aturday": 6970, - "aturdays": 69704, - "ature": 1568, - "atures": 2789, - "aturing": 39228, - "aturity": 37854, - "atus": 1000, - "aty": 49971, - "atype": 20157, - "atypes": 60913, - "atz": 20175, - "atég": 93387, - "ató": 44028, - "atório": 64694, - "atÄĥ": 75480, - "au": 2863, - "aub": 43506, - "auc": 20436, - "auce": 75790, - "aucoup": 44885, - "auction": 79762, - "aud": 7880, - "audi": 15523, - "audio": 16736, - "audit": 48545, - "auen": 45258, - "auer": 27097, - "auf": 50528, - "aug": 19179, - "auga": 89524, - "auge": 19392, - "aukee": 31987, - "aul": 4943, - "auled": 74667, - "ault": 945, - "aunch": 18423, - "aupt": 51898, - "aur": 4110, - "aura": 21563, - "aurant": 14334, - "aurants": 33984, - "aurus": 42513, - "aus": 11855, - "ausal": 79074, - "ause": 3454, - "auses": 35143, - "ausible": 42636, - "auss": 63051, - "aussian": 46972, - "aut": 2717, - "auth": 3242, - "authenticate": 50060, - "authenticated": 57707, - "authentication": 45890, - "author": 3094, - "authority": 84454, - "authorization": 39554, - "authorize": 52022, - "authorized": 19084, - "authors": 47005, - "autical": 67167, - "autiful": 34677, - "auto": 3902, - "autocomplete": 56514, - "autoload": 38513, - "autom": 27073, - "automatic": 83456, - "automation": 67080, - "autop": 87321, - "autoplay": 90323, - "autor": 62045, - "autorelease": 77386, - "autoreleasepool": 87422, - "autos": 79301, - "auty": 57951, - "auté": 93843, - "auważ": 139309, - "aux": 11981, - "av": 402, - "ava": 2907, - "avad": 37055, - "avadoc": 43425, - "avage": 67156, - "avail": 70263, - "availability": 53062, - "available": 10334, - "aval": 21761, - "avan": 30905, - "avana": 28245, - "avanaugh": 34714, - "avar": 36232, - "avascript": 6173, - "avatar": 11962, - "avatars": 74814, - "avax": 10914, - "avaÅŁ": 127498, - "ave": 523, - "avec": 87323, - "aved": 4141, - "avel": 3878, - "aveled": 28185, - "avelength": 34861, - "aven": 5276, - "avenous": 80343, - "avenport": 96876, - "aver": 7255, - "average": 17202, - "avern": 33718, - "avers": 21565, - "aversable": 97513, - "aversal": 45545, - "averse": 22439, - "avery": 24698, - "aves": 4693, - "avez": 51559, - "avg": 13961, - "avi": 6190, - "avia": 34002, - "avian": 59178, - "avic": 88445, - "avicon": 27921, - "avid": 15212, - "avier": 30648, - "aviest": 98362, - "avig": 2957, - "avigate": 10379, - "avigation": 4372, - "avigator": 10325, - "avin": 34616, - "aving": 2317, - "avings": 45751, - "aviolet": 84211, - "avior": 5640, - "aviors": 22176, - "aviour": 8897, - "aviours": 59256, - "avirus": 23779, - "avis": 22354, - "avit": 43110, - "avity": 11718, - "avl": 67311, - "avn": 30597, - "avo": 27217, - "avoid": 47856, - "avor": 3292, - "avored": 75386, - "avorite": 15622, - "avorites": 29379, - "avors": 50485, - "avour": 25998, - "avourite": 51388, - "avourites": 69316, - "avr": 69584, - "avra": 62867, - "avras": 88123, - "avs": 38751, - "avy": 5663, - "aw": 672, - "awa": 14077, - "awah": 78528, - "awai": 35969, - "awaii": 70954, - "await": 11421, - "awaiter": 72976, - "awan": 40929, - "award": 68606, - "aware": 19541, - "away": 13757, - "aways": 39590, - "awe": 84177, - "awei": 37585, - "awesome": 16875, - "awi": 40878, - "awk": 23397, - "awks": 29278, - "awl": 87448, - "awn": 6379, - "awner": 67193, - "awning": 50846, - "awns": 39996, - "aws": 8635, - "awy": 95719, - "ax": 706, - "axe": 49739, - "axed": 51451, - "axes": 19992, - "axies": 56988, - "axios": 21325, - "axis": 7184, - "axon": 51836, - "axter": 72539, - "axy": 13773, - "ay": 352, - "aya": 12589, - "ayah": 84074, - "ayan": 43857, - "ayar": 75146, - "ayaran": 72902, - "ayas": 97340, - "aybe": 49791, - "aycast": 51287, - "aydın": 139959, - "aye": 59955, - "ayed": 42895, - "ayer": 1135, - "ayers": 5074, - "ayette": 48289, - "aygı": 143877, - "aying": 17270, - "aylight": 93864, - "ayload": 6989, - "aylor": 14023, - "ayment": 6074, - "ayne": 96521, - "ayo": 75980, - "ayout": 1407, - "ays": 942, - "ayscale": 50348, - "aysia": 58085, - "ayı": 126379, - "az": 1370, - "aza": 12707, - "azaar": 68338, - "azar": 33044, - "azard": 57657, - "aze": 9832, - "azed": 27011, - "azeera": 72671, - "azel": 68326, - "azen": 82821, - "azer": 22850, - "azers": 60307, - "azes": 73785, - "azi": 17812, - "azine": 9918, - "azines": 28741, - "azing": 6657, - "azio": 56846, - "azione": 15013, - "azioni": 31651, - "azo": 40184, - "azole": 75901, - "azon": 5522, - "azor": 42866, - "azu": 39129, - "azure": 39495, - "azy": 13619, - "azz": 9802, - "azzi": 71318, - "azzo": 39673, - "azı": 131035, - "azÄĥ": 86903, - "ação": 12967, - "ações": 33465, - "añ": 32369, - "aña": 41261, - "aÄĩ": 78942, - "aÄŁ": 143786, - "aÄŁa": 131106, - "aÄŁlı": 143787, - "aģı": 125494, - "aģını": 141336, - "aż": 59919, - "aÅĤ": 126256, - "aÅĤa": 129948, - "aÅĤem": 133325, - "b": 65, - "ba": 4645, - "baar": 70217, - "bab": 47722, - "babel": 31211, - "bable": 59051, - "baby": 77964, - "bac": 55877, - "bach": 34538, - "back": 1419, - "backend": 20942, - "background": 6742, - "backgroundColor": 39989, - "backs": 24113, - "backup": 31371, - "backward": 81196, - "bad": 13855, - "badge": 31524, - "bag": 21250, - "bagai": 45497, - "bage": 20652, - "bags": 52394, - "bah": 68143, - "bai": 50407, - "bairro": 58383, - "bak": 69822, - "bal": 13313, - "balance": 21571, - "balanced": 58402, - "balances": 75427, - "ball": 3959, - "balls": 45518, - "bam": 80567, - "ban": 6850, - "banana": 87747, - "band": 7053, - "bands": 41906, - "bane": 35914, - "bang": 27174, - "bank": 17033, - "banks": 78946, - "banner": 27128, - "bao": 64841, - "bar": 2257, - "bara": 24095, - "barang": 86468, - "barcode": 64286, - "bard": 65919, - "bare": 54102, - "bars": 24950, - "bart": 40579, - "baru": 89360, - "bas": 17797, - "base": 3152, - "basePath": 79163, - "baseUrl": 37691, - "based": 29939, - "baseline": 75958, - "basename": 42953, - "bases": 78267, - "bash": 46216, - "basic": 22342, - "basis": 88826, - "basket": 59764, - "bast": 28011, - "bastian": 36497, - "bat": 13718, - "batch": 14049, - "bate": 70529, - "batim": 54748, - "batis": 36588, - "battery": 74359, - "battle": 64954, - "bau": 71832, - "baugh": 61639, - "baum": 58511, - "bay": 46264, - "baz": 42573, - "baÅŁÄ±": 137805, - "bb": 6066, - "bbb": 53151, - "bbbb": 87609, - "bbc": 84185, - "bbe": 64073, - "bben": 36039, - "bbie": 54871, - "bbing": 67341, - "bble": 59880, - "bbox": 58456, - "bc": 8904, - "bcc": 69018, - "bcd": 91490, - "bcm": 91185, - "bcrypt": 65498, - "bd": 8940, - "bdb": 85760, - "bdd": 50442, - "be": 1371, - "beam": 53871, - "bean": 17479, - "beans": 27340, - "bear": 67660, - "bearer": 95131, - "bearing": 87350, - "beat": 22227, - "beautiful": 86944, - "beb": 90805, - "bec": 16692, - "because": 27653, - "becca": 37196, - "beck": 54077, - "becue": 51985, - "bed": 2721, - "bedPane": 80543, - "bedo": 88987, - "bedtls": 76032, - "bee": 32031, - "beeld": 78931, - "been": 81750, - "beer": 47795, - "bef": 57647, - "before": 14801, - "beg": 51153, - "begin": 7265, - "beginTransaction": 58110, - "beh": 29898, - "behavior": 55866, - "bei": 62401, - "being": 34114, - "beit": 19985, - "beiten": 50656, - "beiter": 72964, - "beits": 64002, - "bek": 76514, - "bel": 9779, - "belie": 31798, - "belief": 59776, - "bell": 17250, - "bellion": 85763, - "belongs": 80897, - "belongsTo": 42867, - "below": 53177, - "belt": 75848, - "belum": 78244, - "ben": 7964, - "bench": 27024, - "benchmark": 79186, - "benef": 67144, - "benh": 38795, - "benhavn": 40977, - "bens": 55874, - "ber": 652, - "berapa": 74402, - "bere": 61286, - "berg": 7725, - "berger": 48020, - "berman": 80195, - "bern": 76712, - "bero": 80784, - "beros": 92795, - "berra": 62341, - "berries": 35889, - "berry": 15357, - "bers": 1902, - "bersome": 93424, - "bert": 9160, - "bery": 30204, - "bes": 9433, - "besch": 143729, - "beschäft": 143730, - "beschäftig": 143731, - "best": 15862, - "bestos": 64164, - "bet": 28551, - "beta": 19127, - "beth": 82044, - "bett": 90957, - "better": 57134, - "between": 41867, - "bew": 81936, - "bez": 143213, - "bezpieczeÅĦst": 143214, - "bezpieczeÅĦstw": 143215, - "bf": 13233, - "bfd": 81664, - "bff": 92106, - "bg": 12220, - "bgcolor": 95900, - "bh": 51871, - "bi": 8221, - "bia": 14500, - "bial": 46959, - "bian": 13162, - "bias": 60442, - "biased": 64301, - "bib": 57280, - "bic": 93498, - "bid": 20648, - "bidden": 22108, - "bie": 21745, - "bies": 56673, - "big": 16154, - "bigint": 84674, - "bih": 40116, - "bij": 61269, - "bike": 55155, - "bil": 48838, - "bild": 60365, - "bilder": 86389, - "bildung": 93590, - "bilit": 126947, - "bilité": 133296, - "bilitÃł": 130670, - "bill": 29642, - "billing": 38637, - "bilt": 69724, - "bin": 6863, - "binary": 25891, - "binations": 73629, - "bind": 7666, - "bindParam": 33816, - "bindValue": 40424, - "binding": 31036, - "bindings": 65495, - "bindung": 90226, - "bine": 46561, - "bing": 7132, - "bins": 39330, - "bio": 37323, - "biology": 80062, - "bios": 69628, - "bir": 43855, - "bird": 22592, - "birds": 66361, - "birth": 27713, - "birthdate": 98531, - "birthday": 51265, - "bis": 53581, - "bish": 57699, - "bishop": 60278, - "bit": 4489, - "bitcoin": 83910, - "bite": 89935, - "bitmap": 40954, - "bitrary": 87851, - "bits": 11516, - "bitset": 77615, - "biz": 54673, - "bió": 139153, - "bj": 35751, - "bject": 800, - "bjerg": 91878, - "bk": 40029, - "bl": 2024, - "bla": 64726, - "black": 11453, - "blade": 62727, - "blah": 70614, - "blank": 10189, - "blas": 49297, - "blast": 63317, - "ble": 891, - "bled": 37659, - "blem": 10121, - "blems": 21699, - "blend": 82632, - "bler": 77462, - "blers": 70378, - "bles": 38763, - "blick": 83820, - "blind": 92909, - "bling": 9695, - "blings": 97463, - "blink": 54316, - "blk": 34989, - "blo": 38145, - "blob": 35112, - "block": 4574, - "blocked": 61348, - "blocking": 70356, - "blockquote": 48775, - "blocks": 21928, - "blog": 11659, - "blogs": 53903, - "blood": 50005, - "blr": 22134, - "blue": 12203, - "blur": 33542, - "bm": 29307, - "bmp": 52696, - "bn": 11081, - "bnb": 44002, - "bo": 749, - "boBox": 9405, - "boa": 69014, - "board": 2482, - "boarding": 37569, - "boards": 19270, - "boat": 37765, - "boats": 94358, - "bob": 47086, - "body": 2599, - "bohydr": 33558, - "bol": 30046, - "bold": 14824, - "bole": 60075, - "bolt": 52433, - "bomb": 78344, - "bon": 5970, - "bond": 64239, - "bone": 19756, - "bones": 80991, - "bons": 46520, - "bonus": 57469, - "boo": 32993, - "book": 2190, - "booking": 21278, - "bookmark": 60375, - "books": 12110, - "bool": 2641, - "boolean": 6117, - "boom": 95316, - "boost": 13000, - "boot": 4619, - "bootstrap": 6281, - "bor": 9368, - "borah": 60558, - "border": 9461, - "borg": 24210, - "born": 15998, - "borne": 30996, - "boro": 34867, - "borough": 34079, - "borrow": 71141, - "bos": 78448, - "bose": 8297, - "boss": 33314, - "bot": 6331, - "bote": 92918, - "both": 21028, - "bots": 61905, - "bottom": 14860, - "bounce": 64302, - "bound": 10891, - "boundary": 65180, - "bounded": 65686, - "bounding": 61579, - "bounds": 34019, - "bour": 15385, - "bourg": 67545, - "bourne": 21436, - "bout": 72901, - "bove": 30924, - "bow": 15439, - "bower": 56949, - "bows": 54531, - "box": 2011, - "boxed": 79075, - "boxes": 22204, - "boxing": 89174, - "boy": 17184, - "boys": 29023, - "bp": 17808, - "bpp": 71145, - "bps": 31180, - "br": 1323, - "bra": 14383, - "brace": 31237, - "bracht": 85426, - "braco": 96967, - "brahim": 57932, - "brain": 53060, - "brains": 32625, - "brakk": 47540, - "bral": 41643, - "branch": 17940, - "branches": 67839, - "brand": 13473, - "brands": 69194, - "brane": 87454, - "bras": 70761, - "braska": 33788, - "brate": 64116, - "brates": 98768, - "bre": 20512, - "bread": 47516, - "breadcrumb": 24234, - "breadcrumbs": 35029, - "break": 8960, - "breaker": 64121, - "breaking": 36657, - "bred": 90742, - "brero": 77085, - "brew": 21632, - "brick": 69673, - "brid": 16223, - "bridge": 13709, - "brids": 83588, - "brief": 6658, - "brig": 82032, - "bright": 72116, - "brightness": 99056, - "bring": 81377, - "bringing": 79988, - "bris": 28172, - "brit": 31314, - "brities": 34695, - "bro": 14877, - "broadcast": 54162, - "broken": 48909, - "broker": 69309, - "bron": 67457, - "brook": 42266, - "brown": 64461, - "browse": 61213, - "browser": 22468, - "brtc": 78536, - "bru": 32613, - "bruar": 93289, - "bruary": 6812, - "brush": 36061, - "bs": 1279, - "bsd": 51835, - "bserv": 4840, - "bservable": 8293, - "bservice": 64693, - "bsite": 3222, - "bsites": 11712, - "bsolute": 16855, - "bson": 91723, - "bsp": 5417, - "bst": 24585, - "bstract": 48494, - "bsub": 69683, - "bt": 12755, - "btc": 92634, - "btn": 3905, - "bu": 19644, - "buah": 86461, - "buat": 69842, - "bubble": 77489, - "buch": 72043, - "bucket": 30410, - "buckets": 92417, - "bucks": 39788, - "bud": 69927, - "budget": 48406, - "buf": 5909, - "buff": 25976, - "buffer": 7573, - "buffers": 60433, - "bufio": 97551, - "bug": 2313, - "bugs": 56176, - "buie": 86460, - "build": 5834, - "builder": 17850, - "builders": 98507, - "building": 23296, - "built": 46239, - "builtin": 42457, - "bul": 16110, - "bulan": 86326, - "bulk": 67142, - "bull": 42004, - "bullet": 39460, - "bum": 5377, - "bundle": 34518, - "bundles": 86660, - "bung": 83592, - "buquerque": 68176, - "bur": 11240, - "burg": 10269, - "burger": 62452, - "burgh": 17816, - "burn": 21719, - "burse": 37982, - "bursement": 51073, - "burst": 57738, - "bury": 19603, - "bus": 10338, - "buscar": 79757, - "business": 26151, - "buster": 55552, - "busters": 75518, - "busy": 78467, - "but": 8088, - "butt": 92796, - "button": 2159, - "buttonShape": 84054, - "buttons": 24086, - "buy": 19783, - "buyer": 59307, - "buzz": 86126, - "bv": 54929, - "bw": 39824, - "bx": 21861, - "by": 1694, - "bye": 28374, - "byn": 39085, - "byname": 94878, - "byss": 55072, - "byte": 3782, - "byter": 71607, - "byterian": 79336, - "bytes": 9651, - "bz": 71701, - "bé": 91074, - "bö": 135514, - "bü": 129578, - "c": 66, - "ca": 924, - "caa": 87734, - "cab": 54793, - "cac": 83110, - "cache": 9360, - "cached": 32918, - "cad": 34455, - "cade": 32796, - "cadena": 86863, - "cae": 97987, - "caf": 68796, - "caff": 23778, - "caffe": 87760, - "caffold": 27864, - "cai": 95150, - "cairo": 62383, - "cake": 47384, - "cakes": 61992, - "cal": 5416, - "cala": 93380, - "calar": 59153, - "calc": 26586, - "calcul": 80630, - "calculate": 35597, - "calculator": 88821, - "cale": 2246, - "caled": 25228, - "calendar": 26258, - "caler": 63084, - "cales": 30196, - "caling": 81552, - "call": 6659, - "callable": 95192, - "callback": 13494, - "callbacks": 68311, - "called": 43882, - "callee": 86476, - "caller": 56126, - "calling": 73726, - "calloc": 65488, - "calls": 44620, - "cam": 11599, - "camatan": 71050, - "came": 6014, - "camel": 93321, - "camera": 24910, - "camp": 25238, - "campaign": 37339, - "campo": 56762, - "cams": 74250, - "can": 4814, - "cancel": 18515, - "cancellationToken": 95470, - "cancelled": 95282, - "candidate": 46274, - "candidates": 91345, - "canf": 20393, - "cannot": 33260, - "cano": 68277, - "canonical": 77942, - "cant": 65263, - "cantidad": 49331, - "canvas": 19943, - "cao": 28339, - "cap": 11346, - "capabilities": 94392, - "capability": 81251, - "capacity": 37387, - "cape": 5330, - "capital": 65063, - "capitalize": 81341, - "caps": 48233, - "capt": 43203, - "captcha": 54347, - "caption": 23347, - "capture": 45070, - "captures": 66326, - "car": 6918, - "caracter": 135523, - "caracterÃŃsticas": 135524, - "carbon": 73341, - "card": 4951, - "cards": 25024, - "care": 10506, - "career": 94537, - "caret": 54227, - "cargo": 66715, - "carousel": 23454, - "carrier": 65985, - "carry": 73765, - "cars": 50708, - "cart": 11452, - "cas": 24307, - "cascade": 49900, - "case": 5638, - "casecmp": 48072, - "cased": 91126, - "cases": 23910, - "cash": 41271, - "cassert": 66922, - "cast": 3829, - "castHit": 82720, - "caster": 32020, - "casting": 76332, - "castle": 35108, - "casts": 50034, - "cat": 4616, - "catalog": 26539, - "catch": 7173, - "cate": 42772, - "categoria": 43244, - "categorias": 93005, - "categorie": 86695, - "categories": 15497, - "category": 5471, - "categoryId": 61378, - "catid": 78677, - "cation": 64882, - "cats": 37452, - "caught": 61208, - "cause": 1563, - "cação": 90523, - "cb": 7221, - "cba": 93829, - "cbc": 80766, - "cbd": 90749, - "cc": 638, - "cca": 24441, - "ccak": 84262, - "ccb": 81317, - "ccc": 37054, - "cccc": 55597, - "ccd": 95840, - "cce": 86921, - "ccess": 1322, - "cci": 56708, - "ccion": 14059, - "ccione": 66319, - "cciones": 54703, - "cción": 22004, - "cco": 57661, - "ccoli": 59703, - "ccording": 6641, - "ccount": 4513, - "cctor": 88605, - "cd": 4385, - "cdb": 85301, - "cdc": 72026, - "cdecl": 66916, - "cdf": 58348, - "cdn": 12254, - "cdnjs": 38762, - "cdot": 50853, - "cdr": 64170, - "ce": 346, - "cea": 72938, - "cean": 11206, - "ceans": 42220, - "ceased": 94204, - "ceb": 84797, - "cec": 68955, - "ced": 1998, - "cede": 94874, - "cedes": 25701, - "cedure": 13196, - "cedures": 53691, - "cee": 70596, - "ceed": 4635, - "ceeded": 94206, - "cef": 65041, - "ceil": 22058, - "ceipt": 24130, - "ceive": 8238, - "ceived": 8771, - "ceiver": 12862, - "ceiving": 46344, - "cej": 57245, - "cek": 45700, - "cel": 3672, - "celain": 59142, - "celand": 35216, - "cele": 69765, - "celed": 33183, - "cell": 5873, - "cellent": 24746, - "cells": 36691, - "celona": 22365, - "cem": 53821, - "cen": 47322, - "cence": 35534, - "cene": 59351, - "cent": 1168, - "centage": 16133, - "centaje": 70399, - "cente": 77584, - "center": 3057, - "centers": 85441, - "central": 51811, - "centration": 93276, - "centre": 74117, - "centroid": 96026, - "cents": 38328, - "cep": 31652, - "ceph": 58722, - "cept": 1484, - "ceptar": 74958, - "ception": 995, - "ceptions": 34928, - "ceptive": 58274, - "ceptor": 15349, - "ceptors": 57550, - "cepts": 57771, - "cer": 3828, - "cerer": 68881, - "ceries": 55182, - "cern": 28544, - "cerpt": 34028, - "cerr": 23960, - "cers": 16832, - "cert": 12246, - "certificate": 63586, - "cery": 21505, - "ces": 1603, - "ceso": 54198, - "cess": 1120, - "cession": 25461, - "cessive": 86628, - "cesso": 29312, - "cest": 15184, - "cestor": 81340, - "ceu": 81130, - "ceÄŁi": 125329, - "cf": 9792, - "cff": 57823, - "cfg": 14072, - "cg": 27446, - "cgi": 72415, - "ch": 331, - "cha": 6447, - "chaft": 20542, - "chai": 45081, - "chain": 8819, - "chains": 58358, - "chair": 34196, - "chal": 85567, - "chalk": 86388, - "challenge": 57365, - "chan": 5658, - "chandle": 72621, - "chang": 77982, - "change": 3373, - "changed": 17353, - "changer": 72831, - "changes": 19365, - "changing": 51713, - "channel": 10119, - "channels": 32425, - "chant": 11681, - "chantment": 68889, - "chants": 98806, - "chap": 92319, - "chapter": 40226, - "char": 1762, - "charAt": 70857, - "character": 19190, - "characters": 47485, - "charg": 17685, - "charge": 13891, - "charged": 36961, - "charger": 41456, - "charges": 62299, - "charging": 62359, - "charm": 98409, - "chars": 19255, - "charset": 25327, - "chart": 15941, - "chartInstance": 96246, - "charted": 90818, - "charts": 36584, - "chas": 58679, - "chat": 9686, - "che": 1528, - "cheap": 61690, - "check": 2028, - "checkBox": 72230, - "checkbox": 10263, - "checked": 7549, - "checker": 69955, - "checking": 57854, - "checkout": 33035, - "checkpoint": 69134, - "checks": 49383, - "checksum": 70740, - "ched": 2397, - "chedule": 8796, - "cheduled": 26644, - "cheduler": 15222, - "chedulers": 36212, - "chedules": 49613, - "cheduling": 44356, - "chef": 75079, - "cheid": 57926, - "cheiden": 98975, - "chein": 63859, - "chem": 2407, - "chema": 3416, - "chemas": 31126, - "chematic": 81049, - "cheme": 8058, - "chemes": 66346, - "chemical": 30956, - "chemist": 74088, - "chemistry": 51655, - "chemy": 24088, - "chen": 7522, - "cheng": 67184, - "cheon": 75169, - "cher": 9034, - "cherche": 29510, - "chers": 98623, - "ches": 8528, - "chest": 26320, - "chester": 14819, - "chestra": 37160, - "chet": 39113, - "chez": 34015, - "chg": 65940, - "chi": 14604, - "chia": 89546, - "chie": 5467, - "chied": 31722, - "chief": 61526, - "child": 3048, - "childNodes": 75773, - "children": 5864, - "childs": 86500, - "chimp": 90340, - "chin": 59071, - "china": 80136, - "chine": 87895, - "ching": 26977, - "chio": 52401, - "chip": 29662, - "chk": 35896, - "chl": 67056, - "chlor": 71867, - "chluss": 93383, - "chmod": 56274, - "chn": 2125, - "chner": 85577, - "chnitt": 88718, - "cho": 958, - "chod": 128030, - "chodzÄħ": 128031, - "chodzÄħc": 138993, - "choice": 11746, - "choices": 24789, - "chool": 2135, - "choose": 27052, - "chooser": 67360, - "chor": 6150, - "chos": 45248, - "chosen": 63075, - "chr": 16789, - "chrift": 82850, - "christ": 82132, - "chrom": 40384, - "chrome": 31902, - "chron": 7410, - "chrono": 25768, - "chs": 55457, - "chsel": 90830, - "cht": 13920, - "chte": 38486, - "chten": 42888, - "chter": 66685, - "chts": 54327, - "chu": 65752, - "chunk": 25979, - "chunks": 84263, - "church": 64194, - "chure": 58334, - "chw": 65845, - "chwitz": 90931, - "chy": 57964, - "chè": 134284, - "ché": 74017, - "ci": 5855, - "cia": 24119, - "cial": 15781, - "cid": 20558, - "cidade": 52443, - "cido": 54351, - "cie": 24161, - "cient": 12295, - "cies": 69007, - "cil": 81023, - "cimal": 87099, - "cimiento": 66037, - "cin": 18103, - "cing": 6125, - "cio": 60830, - "cion": 22613, - "cip": 79657, - "cipher": 67586, - "cir": 57032, - "circ": 43298, - "circle": 25857, - "cis": 78055, - "cision": 54704, - "cit": 53861, - "citation": 83147, - "cite": 67075, - "cities": 53009, - "city": 8926, - "cité": 135719, - "civil": 93130, - "ció": 87100, - "ción": 76931, - "ciÄħ": 129554, - "ciÄħg": 129555, - "ciÅĽni": 140045, - "cj": 79446, - "cjÄħ": 131176, - "cjÄĻ": 129165, - "ck": 377, - "cka": 96257, - "cke": 60273, - "ckeditor": 62324, - "cken": 40188, - "cker": 15160, - "cket": 3996, - "ckett": 84829, - "cki": 97738, - "ckill": 94068, - "cko": 31463, - "ckpt": 68175, - "cks": 14553, - "cksÃ¥": 86586, - "ckt": 68412, - "cl": 564, - "cla": 53661, - "clado": 96881, - "claim": 7859, - "claimed": 21275, - "claimer": 13640, - "claims": 48561, - "clair": 48172, - "clamation": 32984, - "clamp": 85453, - "clang": 25380, - "clar": 12821, - "claration": 16490, - "clarations": 49121, - "clare": 67554, - "clared": 86251, - "clarsimp": 78160, - "clas": 86263, - "class": 1040, - "classCallCheck": 80198, - "classList": 33305, - "className": 13871, - "classNames": 83874, - "classed": 96737, - "classes": 8855, - "classic": 79709, - "classification": 65381, - "classified": 64874, - "classifier": 78100, - "classify": 94290, - "classmethod": 26755, - "classname": 62806, - "classnames": 55113, - "classpath": 79814, - "clause": 82082, - "clave": 40533, - "clazz": 82914, - "clc": 78839, - "cle": 9148, - "clean": 18377, - "cleanup": 55235, - "clear": 7422, - "clearfix": 32453, - "clerosis": 90611, - "cles": 18638, - "clf": 69126, - "cli": 19521, - "click": 3678, - "clicked": 47013, - "clid": 75044, - "clide": 45323, - "clidean": 50078, - "client": 2972, - "clientId": 67683, - "cliente": 37771, - "clientes": 81644, - "clients": 31869, - "cliffe": 79456, - "climate": 93774, - "clin": 46581, - "cline": 87934, - "cling": 62098, - "clinic": 89265, - "clinical": 90799, - "clip": 7974, - "clipboard": 70848, - "clipse": 9473, - "clist": 84009, - "cljs": 32934, - "clk": 32583, - "clo": 32578, - "cloak": 88751, - "clock": 20666, - "clone": 19982, - "close": 5552, - "closed": 34087, - "closest": 36461, - "closing": 85777, - "closure": 46916, - "cloth": 87954, - "cloud": 12361, - "clr": 60947, - "cls": 18074, - "club": 19862, - "clubs": 76285, - "clud": 1485, - "clude": 857, - "cluded": 10181, - "cludes": 7396, - "cluding": 10910, - "cluir": 44721, - "clus": 4163, - "clusion": 8957, - "clusions": 23529, - "clusive": 8336, - "cluster": 18855, - "clusters": 78521, - "clusão": 142528, - "cly": 84145, - "clé": 133861, - "cm": 6226, - "cmath": 33725, - "cmb": 95055, - "cmc": 94866, - "cmd": 8710, - "cmds": 92407, - "cmp": 7293, - "cmpeq": 99021, - "cms": 28711, - "cn": 14271, - "cname": 78488, - "cnt": 15853, - "cntl": 75017, - "co": 1015, - "coach": 88093, - "coal": 40465, - "coat": 67412, - "cob": 85556, - "cobra": 59410, - "coc": 77312, - "cock": 37153, - "cod": 20116, - "code": 1851, - "codec": 34607, - "coded": 65530, - "codegen": 95859, - "coder": 40170, - "codes": 25814, - "codigo": 33466, - "codile": 82674, - "coding": 48367, - "coe": 72772, - "coef": 64650, - "coeff": 48638, - "coes": 79850, - "coffee": 78117, - "coh": 39275, - "cohol": 11106, - "coholic": 44394, - "coil": 85737, - "coin": 7160, - "coins": 29609, - "col": 2074, - "cola": 55452, - "cold": 87072, - "cole": 55645, - "coles": 84838, - "coli": 91380, - "coll": 17222, - "collapse": 17908, - "collapsed": 42028, - "collect": 17384, - "collection": 13421, - "collectionView": 42440, - "collections": 51137, - "collector": 91469, - "college": 67434, - "collision": 54567, - "colm": 41837, - "coln": 22033, - "colo": 58248, - "colon": 76824, - "color": 3423, - "colors": 21036, - "colour": 47339, - "cols": 21380, - "column": 6229, - "columnName": 86030, - "columns": 16369, - "com": 874, - "coma": 81845, - "comb": 21873, - "combat": 85643, - "combe": 91057, - "combination": 75028, - "combine": 63136, - "combined": 66307, - "combo": 61492, - "comboBox": 68586, - "come": 2020, - "comed": 29990, - "comes": 6579, - "comfort": 19411, - "comic": 89889, - "coming": 4959, - "comings": 69143, - "comm": 3621, - "comma": 45386, - "command": 5631, - "commands": 24270, - "commend": 30528, - "commended": 35871, - "comment": 6182, - "comments": 14727, - "commerce": 43194, - "commercial": 83607, - "commission": 80064, - "commit": 17413, - "committed": 97446, - "committee": 56785, - "common": 5464, - "commons": 52361, - "communic": 25579, - "communication": 50171, - "communications": 43310, - "community": 28402, - "como": 96296, - "comp": 5689, - "compact": 39760, - "compan": 44249, - "companies": 64751, - "company": 10139, - "companyId": 92706, - "compare": 18948, - "compareTo": 55583, - "comparison": 54705, - "compass": 30829, - "compat": 18331, - "compatible": 34842, - "compet": 27245, - "competition": 78023, - "competitive": 92399, - "compile": 20433, - "compileComponents": 43998, - "compiled": 50845, - "compiler": 33620, - "complete": 14737, - "completed": 34735, - "completion": 43312, - "complex": 23247, - "complexContent": 97715, - "complexType": 79419, - "component": 8571, - "components": 5149, - "compose": 52706, - "composed": 92734, - "composer": 74894, - "composite": 89504, - "composition": 76807, - "compound": 86204, - "compress": 38360, - "compressed": 45703, - "compression": 83192, - "comput": 64947, - "compute": 27706, - "computed": 71011, - "computer": 43111, - "con": 443, - "cona": 90424, - "conc": 40446, - "concat": 20164, - "concept": 68487, - "concert": 88305, - "conciliation": 98240, - "cond": 1297, - "conda": 63753, - "conde": 94859, - "condition": 9056, - "conditional": 45368, - "conditionally": 95967, - "conditions": 16495, - "conds": 7848, - "conduct": 76652, - "cone": 58082, - "conexao": 85680, - "conexion": 43653, - "conf": 6135, - "conference": 78490, - "confidence": 81929, - "config": 1676, - "configs": 53978, - "configuration": 21138, - "configure": 21002, - "configured": 81443, - "confirm": 13800, - "confirmation": 53412, - "confirmed": 41028, - "coni": 85210, - "conj": 92440, - "conn": 5148, - "connect": 6459, - "connected": 15288, - "connecting": 90811, - "connection": 7742, - "connections": 49986, - "connector": 53700, - "connexion": 74878, - "cono": 85858, - "conom": 44217, - "conomic": 31007, - "conomics": 80092, - "conomy": 70071, - "cons": 6254, - "conscious": 63489, - "consider": 24712, - "consin": 18864, - "consistent": 78399, - "console": 5354, - "const": 1024, - "constant": 18077, - "constants": 15763, - "constexpr": 42281, - "constitution": 43003, - "constitutional": 48574, - "constraint": 48057, - "constraints": 65312, - "construct": 7596, - "constructed": 81578, - "construction": 47197, - "constructor": 21846, - "consts": 95773, - "consult": 48412, - "consulta": 42168, - "consum": 66676, - "consume": 84494, - "consumer": 46764, - "cont": 772, - "contact": 6287, - "contacts": 29063, - "contador": 67248, - "contain": 52095, - "contained": 52515, - "container": 3586, - "containers": 39399, - "contains": 13372, - "conte": 45352, - "contenido": 76268, - "content": 1796, - "contentType": 44963, - "contents": 17610, - "contest": 65717, - "context": 2147, - "contexts": 71927, - "conti": 82910, - "contin": 21319, - "continent": 74595, - "continental": 82851, - "continue": 9534, - "continued": 85857, - "continuous": 78589, - "conto": 65244, - "contr": 8222, - "contra": 96743, - "contract": 20257, - "contracts": 63322, - "contrast": 84224, - "contre": 30300, - "contres": 74850, - "contri": 12855, - "contrib": 47110, - "contributors": 84355, - "contro": 43748, - "control": 2865, - "controlled": 58607, - "controller": 7152, - "controllers": 21611, - "controls": 28517, - "conut": 26261, - "conv": 12027, - "conversation": 61637, - "conversion": 73725, - "convert": 14166, - "convertView": 94267, - "converted": 76204, - "converter": 73746, - "cook": 86795, - "cooked": 98697, - "cookie": 16236, - "cookies": 44317, - "cool": 42196, - "cooldown": 90396, - "coon": 72235, - "coop": 86857, - "coord": 26402, - "coordinate": 62526, - "coordinates": 34739, - "coords": 35030, - "cop": 37728, - "cope": 2417, - "copies": 77601, - "copy": 8560, - "copyright": 15492, - "cor": 6005, - "coration": 26452, - "cord": 30989, - "cordova": 76297, - "core": 2153, - "cores": 7701, - "corev": 98645, - "corlib": 67430, - "corn": 38630, - "corner": 73425, - "corp": 80727, - "corr": 59277, - "correct": 19928, - "correo": 66171, - "cors": 53972, - "cos": 9407, - "cosa": 97456, - "cosity": 85118, - "cost": 16440, - "cosystem": 23287, - "cot": 64498, - "cott": 50705, - "cou": 22249, - "could": 28077, - "couldn": 90962, - "count": 1830, - "counter": 8292, - "countries": 46708, - "country": 11141, - "counts": 44859, - "county": 64926, - "coupon": 38300, - "cour": 66871, - "course": 11856, - "courses": 41324, - "court": 62758, - "cout": 6104, - "cov": 56412, - "cover": 3688, - "coverage": 54250, - "covered": 20804, - "covering": 91913, - "covers": 55858, - "covery": 7449, - "cow": 18921, - "cox": 82000, - "cp": 4672, - "cpf": 64553, - "cplusplus": 24926, - "cpp": 10821, - "cps": 72576, - "cpt": 97995, - "cpu": 16475, - "cpy": 7641, - "cq": 95418, - "cr": 5082, - "craft": 7712, - "crafted": 79794, - "cran": 71985, - "crap": 98721, - "craper": 86282, - "crast": 85474, - "cratch": 86284, - "crate": 61711, - "crawl": 94899, - "crawler": 74929, - "crc": 66083, - "cre": 837, - "cream": 46000, - "crear": 98753, - "crease": 19947, - "creasing": 75462, - "creat": 94739, - "create": 3182, - "createClass": 87979, - "createCommand": 97380, - "createElement": 58008, - "createForm": 84658, - "createFrom": 90095, - "createQuery": 95867, - "createQueryBuilder": 88085, - "createTime": 83186, - "createUrl": 97218, - "createView": 75613, - "created": 7120, - "createdAt": 42765, - "creates": 58519, - "creating": 44902, - "creation": 37375, - "creative": 51717, - "creativecommons": 85231, - "creator": 32398, - "creature": 64127, - "cred": 10844, - "credential": 66799, - "credentials": 32353, - "credible": 57941, - "credit": 23311, - "credited": 66209, - "credits": 55769, - "creds": 85734, - "creen": 2191, - "creens": 15539, - "creenshot": 31109, - "crement": 13477, - "crest": 44451, - "cret": 4423, - "crete": 9353, - "cretion": 88690, - "crets": 52710, - "crew": 38617, - "cri": 740, - "cribe": 3114, - "cribed": 17433, - "cribes": 55136, - "cribing": 43531, - "crime": 84354, - "criminal": 98395, - "cripcion": 20667, - "cript": 1228, - "cription": 1453, - "criptions": 24685, - "criptive": 40319, - "criptor": 6820, - "criptors": 25705, - "cripts": 24227, - "crire": 66919, - "crit": 36996, - "criteria": 20519, - "critical": 41541, - "crm": 61738, - "cro": 37884, - "croft": 81693, - "croll": 15241, - "crollView": 41088, - "cron": 69387, - "crop": 34147, - "cross": 28842, - "crow": 51805, - "crud": 53569, - "cry": 61138, - "crypt": 48125, - "crypto": 35772, - "cré": 129532, - "cs": 4837, - "csi": 63229, - "csr": 77851, - "csrf": 24102, - "css": 5143, - "cstdint": 96975, - "cstdio": 37212, - "cstdlib": 42695, - "cstring": 38906, - "csv": 18104, - "ct": 302, - "cta": 77519, - "ctal": 93981, - "cter": 74069, - "ctest": 67880, - "cth": 91821, - "ctic": 25555, - "ctica": 49029, - "ctime": 33600, - "ction": 407, - "ctions": 5136, - "ctl": 12373, - "ctor": 4904, - "ctors": 12532, - "ctp": 77941, - "ctr": 10597, - "ctrine": 13743, - "ctrl": 11933, - "cts": 60903, - "ctx": 3773, - "ctxt": 77492, - "ctype": 17211, - "cu": 20199, - "cuador": 49262, - "cube": 45411, - "cuda": 33926, - "cue": 31724, - "cul": 3314, - "cular": 21366, - "culate": 11207, - "culated": 49804, - "culator": 20022, - "culo": 63387, - "culos": 78034, - "cult": 92013, - "culture": 69805, - "culus": 41349, - "cum": 59253, - "cup": 36665, - "cur": 2352, - "cura": 53535, - "curacy": 21500, - "curities": 30602, - "curity": 3666, - "curl": 19925, - "curr": 15427, - "currency": 15973, - "current": 3231, - "currentColor": 60745, - "currentIndex": 59314, - "currentPage": 46383, - "currentState": 84870, - "currentTime": 66900, - "currentUser": 38880, - "currently": 58202, - "curring": 45739, - "curso": 42201, - "cursor": 17437, - "curve": 50051, - "cury": 25455, - "cus": 56340, - "cust": 44414, - "custom": 9163, - "customer": 11049, - "customerId": 82019, - "customers": 40154, - "customize": 94385, - "cut": 10242, - "cuts": 22497, - "cv": 13122, - "cw": 62543, - "cwd": 32165, - "cx": 25844, - "cxx": 89073, - "cy": 11130, - "cyan": 69746, - "cych": 73046, - "cycl": 97484, - "cycle": 21621, - "cycles": 48421, - "cz": 13769, - "czas": 66637, - "czeÅĦ": 125936, - "cznie": 88494, - "cznÄħ": 133477, - "czy": 47772, - "czyÄĩ": 130912, - "czyÅĤ": 127618, - "czÄħ": 126580, - "czÄħc": 132574, - "czÄĻ": 125846, - "cá": 132438, - "cé": 49984, - "có": 129133, - "ców": 126613, - "cÃŃ": 130497, - "cÃŃa": 129467, - "cı": 126283, - "cılar": 134830, - "cılı": 135295, - "cılık": 135296, - "d": 67, - "dB": 40955, - "dT": 90363, - "da": 3235, - "dac": 82549, - "dad": 55844, - "dados": 42589, - "dae": 89184, - "daemon": 75841, - "daf": 85733, - "dag": 50641, - "daily": 48074, - "dain": 62499, - "dal": 51547, - "dale": 34183, - "dam": 15408, - "damage": 42865, - "damn": 88619, - "dan": 35155, - "dana": 45683, - "dance": 98875, - "danger": 31450, - "dao": 41521, - "dap": 91294, - "daq": 73207, - "dar": 34123, - "dark": 22624, - "dart": 35594, - "darwin": 98765, - "das": 34889, - "dash": 43519, - "dashboard": 18641, - "dat": 5911, - "data": 691, - "dataArray": 81568, - "dataGridView": 76488, - "dataProvider": 35498, - "dataSource": 64860, - "dataTable": 66769, - "dataType": 57694, - "database": 12216, - "datable": 88831, - "datagrid": 84990, - "datal": 82553, - "datap": 93253, - "datas": 27240, - "dataset": 21378, - "datasets": 65546, - "datatable": 80884, - "datatype": 62409, - "date": 1028, - "dateFormat": 90848, - "dateTime": 48006, - "dated": 3577, - "datepicker": 36263, - "dater": 27463, - "dates": 6394, - "datetime": 15450, - "dating": 14110, - "dato": 71105, - "datos": 27615, - "datum": 55933, - "daughter": 59778, - "day": 1292, - "days": 13778, - "daÄĩ": 133107, - "daÄŁ": 136768, - "db": 1999, - "dbContext": 69762, - "dbName": 90881, - "dba": 89455, - "dbc": 14899, - "dbcTemplate": 48972, - "dbe": 83406, - "dbg": 54318, - "dbh": 40800, - "dbl": 72602, - "dbname": 35265, - "dbo": 20852, - "dbuf": 87314, - "dbus": 78986, - "dc": 7628, - "dcc": 86964, - "dd": 631, - "dda": 71487, - "ddb": 89723, - "ddd": 40360, - "dddd": 64100, - "dde": 88089, - "dden": 10792, - "ddf": 96482, - "ddie": 28454, - "ddit": 20090, - "ddl": 78372, - "dds": 33650, - "ddy": 53510, - "de": 450, - "dea": 55088, - "dead": 33754, - "deadline": 78788, - "deal": 29639, - "dealer": 78235, - "dealloc": 75660, - "death": 61907, - "deaux": 61915, - "deb": 37935, - "debian": 90784, - "debit": 89380, - "debug": 8349, - "dec": 8169, - "decay": 84499, - "decess": 26911, - "decimal": 23289, - "decision": 63938, - "deck": 33425, - "decl": 10005, - "declar": 56305, - "declaration": 80383, - "declare": 18471, - "declaring": 64565, - "declspec": 56318, - "decltype": 74364, - "decode": 18196, - "decoded": 62913, - "decoder": 48110, - "decor": 32093, - "decorate": 47976, - "decorators": 94700, - "decrypt": 73295, - "ded": 9789, - "dee": 57894, - "deen": 64481, - "deep": 32880, - "deer": 96262, - "def": 750, - "default": 2258, - "defaultValue": 53102, - "defaults": 26756, - "defense": 96992, - "defer": 62095, - "defgroup": 86029, - "define": 1289, - "defined": 9711, - "defines": 57043, - "definition": 18375, - "definitions": 48563, - "defs": 48485, - "deg": 16508, - "degree": 41027, - "degrees": 69749, - "dehy": 79560, - "dehyde": 85736, - "dek": 76273, - "del": 9588, - "delay": 22263, - "delegate": 28227, - "delete": 4542, - "deleted": 26521, - "delimiter": 58116, - "deliver": 74728, - "delivery": 32390, - "delivr": 62701, - "delta": 20255, - "dem": 27431, - "demand": 82931, - "demo": 25762, - "den": 5183, - "dens": 52221, - "dense": 80286, - "density": 69818, - "dent": 54823, - "deny": 89963, - "deo": 94514, - "dep": 14891, - "depart": 32048, - "department": 27314, - "departments": 91795, - "departure": 58171, - "departureday": 95637, - "depend": 19510, - "dependence": 90646, - "dependencies": 54274, - "dependency": 53690, - "dependent": 37555, - "depending": 80480, - "depends": 57947, - "deploy": 35794, - "deployment": 82213, - "deposit": 60514, - "deprecated": 38189, - "deps": 72587, - "dept": 40585, - "depth": 17561, - "deque": 53498, - "der": 1107, - "dera": 97903, - "derabad": 56700, - "dere": 96393, - "deriv": 82495, - "derive": 27098, - "derived": 50082, - "ders": 12321, - "des": 5799, - "desc": 8614, - "descending": 88032, - "descr": 66515, - "describe": 12332, - "descricao": 63662, - "descripcion": 39238, - "description": 4684, - "descriptor": 53132, - "deserialize": 66777, - "design": 24852, - "designation": 88116, - "desired": 82782, - "desk": 50069, - "desktop": 36869, - "dess": 33007, - "dest": 4979, - "destination": 17997, - "destroy": 15518, - "destruct": 60268, - "det": 19285, - "detach": 56764, - "detail": 14585, - "details": 14871, - "detalle": 84118, - "detect": 61243, - "detector": 91544, - "dev": 3583, - "develop": 15840, - "developer": 34401, - "developers": 64305, - "development": 29571, - "device": 6111, - "deviceId": 94202, - "devices": 46966, - "devil": 80152, - "dex": 91769, - "dez": 86524, - "df": 2940, - "dfa": 97549, - "dfd": 91230, - "dff": 98714, - "dfs": 34378, - "dfunding": 63891, - "dg": 35138, - "dge": 91691, - "dh": 30621, - "dhcp": 96220, - "di": 8579, - "dia": 31006, - "diag": 60214, - "dialog": 11817, - "dialogs": 41454, - "diamond": 88576, - "dic": 29680, - "dice": 76053, - "dict": 8477, - "dictionary": 35671, - "dictions": 52390, - "did": 22920, - "didn": 96749, - "die": 26493, - "diet": 93842, - "dif": 87464, - "diff": 13490, - "difference": 59251, - "different": 63650, - "difficulty": 71864, - "dig": 44861, - "digest": 36339, - "digit": 34934, - "digital": 57269, - "digits": 60770, - "dim": 12927, - "dimension": 42539, - "dimensions": 59239, - "dims": 54490, - "din": 72811, - "ding": 6968, - "dings": 24602, - "dio": 71763, - "dir": 3741, - "dire": 63584, - "direccion": 62689, - "direct": 19798, - "direction": 19071, - "directive": 72863, - "director": 69795, - "directories": 75701, - "directory": 23037, - "dirname": 14434, - "dirs": 57623, - "dirty": 53488, - "dis": 4243, - "disable": 18015, - "disabled": 11978, - "disc": 16822, - "discard": 76492, - "disciplinary": 70100, - "disconnect": 51992, - "discord": 42579, - "discount": 27359, - "discover": 97629, - "discussion": 69869, - "dish": 72833, - "disk": 30496, - "dismiss": 81334, - "disp": 29795, - "dispatch": 18274, - "dispatcher": 60492, - "display": 5493, - "displayName": 46630, - "displayText": 81733, - "dispose": 83865, - "disposed": 75529, - "disposing": 19286, - "dist": 12211, - "distance": 19348, - "distinct": 53021, - "distributed": 62375, - "distribution": 81716, - "district": 35391, - "dit": 17752, - "dition": 2345, - "ditor": 68731, - "div": 611, - "dives": 90514, - "divide": 59394, - "divider": 50794, - "division": 28764, - "diÄŁ": 125284, - "diÄŁi": 126276, - "diÄŁim": 135065, - "diÄŁimiz": 135066, - "diÄŁinde": 139902, - "diÄŁini": 130988, - "diÄŁiniz": 134758, - "dj": 77504, - "django": 13575, - "dk": 7584, - "dl": 8736, - "dle": 90385, - "dlg": 59040, - "dling": 60316, - "dll": 67159, - "dm": 13849, - "dma": 44981, - "dn": 17395, - "dna": 92877, - "dney": 18787, - "dni": 96280, - "dns": 45226, - "do": 2982, - "dob": 51016, - "doc": 5236, - "doch": 72293, - "dock": 77055, - "docker": 28648, - "docs": 14120, - "doctor": 36983, - "doctrine": 91165, - "doctype": 50139, - "document": 6062, - "documentation": 76303, - "documento": 97665, - "documents": 50778, - "does": 27057, - "doesn": 71914, - "dog": 18457, - "dogs": 80034, - "doi": 47786, - "doing": 44259, - "dojo": 72611, - "doll": 77189, - "dom": 5600, - "domain": 12204, - "domains": 59621, - "don": 15007, - "done": 10438, - "dong": 75211, - "donnees": 98553, - "dont": 77025, - "door": 10787, - "doors": 27304, - "dorf": 89999, - "dos": 40525, - "dot": 16119, - "dotenv": 50893, - "dots": 67816, - "double": 4331, - "doubleValue": 82078, - "down": 2923, - "download": 12885, - "downloads": 81329, - "doÄŁ": 127522, - "doÄŁan": 127523, - "dp": 9796, - "dpi": 78029, - "dq": 85646, - "dr": 3612, - "drFc": 70266, - "dra": 22248, - "draft": 44997, - "drag": 33931, - "dragon": 55419, - "dration": 49691, - "draul": 30338, - "draulic": 32742, - "draw": 7633, - "drawable": 91015, - "drawer": 80127, - "drawing": 80849, - "dre": 62840, - "dream": 56191, - "dress": 68234, - "drink": 97327, - "drive": 31967, - "driver": 12521, - "drivers": 62125, - "drm": 98558, - "dro": 11263, - "drop": 6719, - "dropIfExists": 43692, - "dropdown": 11138, - "dropout": 84620, - "drops": 90512, - "drs": 93246, - "drug": 72721, - "drv": 54813, - "dry": 53210, - "ds": 5356, - "dsa": 96780, - "dsl": 81874, - "dsn": 75136, - "dsp": 94724, - "dst": 15658, - "dt": 8047, - "dto": 58978, - "dtype": 47727, - "du": 1054, - "duc": 7545, - "ducation": 33885, - "duce": 13373, - "duced": 53378, - "ducer": 28938, - "ducers": 33375, - "ducible": 78285, - "duck": 72970, - "duct": 1058, - "ducted": 53915, - "duction": 23113, - "ductive": 67143, - "ductor": 35769, - "ductory": 50338, - "due": 23646, - "dued": 78133, - "duino": 31186, - "duit": 46248, - "duk": 56571, - "dummy": 31390, - "dump": 27660, - "dup": 21912, - "duplicate": 63826, - "dur": 70692, - "duration": 17021, - "during": 81877, - "duto": 27943, - "dux": 12138, - "duÄŁ": 140114, - "duÄŁu": 130565, - "duÄŁunu": 140115, - "dv": 37261, - "dw": 29406, - "dx": 12719, - "dy": 10258, - "dyn": 43085, - "dynamic": 21544, - "dz": 37877, - "dzi": 74816, - "dziaÅĤ": 128706, - "dziÄĩ": 131681, - "dziÅĤ": 136300, - "dzÄħ": 132828, - "dão": 133150, - "dé": 128505, - "dì": 134839, - "dü": 126427, - "dür": 126700, - "dÃ¼ÄŁÃ¼": 131803, - "dÃŃ": 133489, - "dÃŃa": 135505, - "dı": 126220, - "dık": 132046, - "dıkl": 127712, - "dıklar": 142409, - "dıkları": 135015, - "dıklarını": 142410, - "dıkt": 140082, - "dıktan": 140083, - "dım": 130412, - "dın": 128099, - "dır": 125020, - "dıģ": 125257, - "dıģı": 128815, - "dıģımız": 137530, - "dıģında": 138571, - "dıģını": 130478, - "dıģınız": 138306, - "dÄĻ": 127209, - "dź": 130682, - "dÅĤug": 136853, - "e": 68, - "ea": 12508, - "each": 9547, - "eacher": 49200, - "ead": 3149, - "eah": 10427, - "eam": 14580, - "ean": 5307, - "ear": 682, - "earable": 76858, - "earch": 2902, - "earchBar": 92336, - "earer": 20786, - "earing": 13678, - "early": 22140, - "earn": 10118, - "earned": 57600, - "earning": 16526, - "ears": 7444, - "earth": 27541, - "ease": 46614, - "east": 60501, - "easy": 45022, - "eat": 32066, - "eated": 67822, - "eating": 90855, - "eature": 15208, - "eatures": 22462, - "eax": 40144, - "eb": 3065, - "eba": 70753, - "ebb": 85302, - "ebile": 137343, - "ebileceÄŁi": 137344, - "ebin": 76157, - "ebp": 65347, - "ebra": 50213, - "ebx": 81363, - "ec": 757, - "eca": 22794, - "ecake": 78256, - "ecal": 97198, - "ecast": 91438, - "ecause": 6631, - "ecc": 71325, - "ecd": 37206, - "ece": 74407, - "eced": 58357, - "ecedor": 65035, - "ecer": 93118, - "ecera": 90227, - "ecess": 4005, - "ecessarily": 73653, - "ecessary": 20122, - "eceÄŁi": 126841, - "eceÄŁini": 136757, - "ech": 4737, - "echa": 17772, - "echo": 3047, - "eci": 75732, - "ecided": 78641, - "ecimal": 42090, - "ecn": 30567, - "eco": 54297, - "ecom": 65174, - "ecome": 51421, - "economic": 48844, - "ecret": 50856, - "ecs": 53717, - "ect": 439, - "ectar": 38816, - "ected": 1569, - "ection": 11915, - "ections": 37605, - "ective": 95878, - "ectl": 52669, - "ectomy": 71683, - "ector": 1256, - "ectors": 10605, - "ecture": 62193, - "ecure": 76108, - "ecurity": 18429, - "ecute": 3068, - "ecx": 76084, - "ecycle": 16696, - "ecz": 68668, - "eczy": 96495, - "ed": 291, - "edBy": 97322, - "edException": 18826, - "edImage": 57472, - "edList": 38301, - "edReader": 17120, - "edTextBox": 97917, - "eda": 13830, - "edad": 75498, - "edar": 33215, - "edata": 72885, - "eday": 45112, - "edb": 93727, - "edback": 19733, - "edd": 53537, - "eddar": 77616, - "ede": 15326, - "eded": 29935, - "edef": 4219, - "edelta": 46854, - "eden": 14134, - "eder": 7294, - "ederal": 5077, - "ederation": 96013, - "edere": 85019, - "ederland": 39355, - "edes": 58526, - "edge": 7186, - "edges": 16900, - "edi": 19048, - "edia": 4495, - "edian": 28567, - "ediator": 87694, - "edic": 33283, - "edicine": 90901, - "edics": 80711, - "edido": 53605, - "edin": 30401, - "eding": 16100, - "edio": 61959, - "edis": 41825, - "edish": 25950, - "edit": 3587, - "editable": 43646, - "editar": 83175, - "editary": 94354, - "edited": 61403, - "edith": 81063, - "editing": 61353, - "edition": 77937, - "editor": 8868, - "edium": 23090, - "edly": 52323, - "edm": 89525, - "edo": 65881, - "edom": 8769, - "edor": 24358, - "edores": 68219, - "edral": 35520, - "edriver": 71039, - "eds": 6767, - "edu": 55101, - "educ": 24770, - "educated": 65349, - "education": 36738, - "educt": 80500, - "edula": 68855, - "edx": 71093, - "edy": 9313, - "ee": 2127, - "eea": 84408, - "eec": 95834, - "eed": 12051, - "eee": 34063, - "eeee": 68616, - "eel": 95451, - "een": 14911, - "eenth": 61555, - "eeper": 43031, - "eer": 34756, - "ees": 5516, - "ef": 823, - "efa": 75631, - "efault": 11301, - "efd": 93678, - "efe": 44953, - "efeller": 80612, - "eff": 6445, - "effect": 26061, - "effective": 77895, - "effects": 80424, - "efficient": 42770, - "efined": 4006, - "efore": 4642, - "efs": 43962, - "eft": 33573, - "eful": 51121, - "efully": 72992, - "eg": 791, - "ega": 11188, - "egade": 95237, - "egal": 61321, - "egan": 15756, - "egas": 14842, - "egasus": 86033, - "egative": 15060, - "egen": 19981, - "egend": 87045, - "eger": 1878, - "egers": 67592, - "egg": 28368, - "eggies": 55560, - "egie": 60057, - "egin": 3013, - "egis": 89967, - "egl": 63502, - "egment": 71080, - "ego": 13243, - "egot": 65978, - "egov": 74187, - "egr": 14412, - "egra": 87575, - "egral": 26821, - "egrate": 57017, - "egrated": 47172, - "egration": 17376, - "egrator": 96435, - "egree": 26776, - "egrity": 67212, - "egt": 50659, - "eguard": 81871, - "eh": 2636, - "ehen": 40697, - "ehicle": 15970, - "ehicles": 41865, - "ehler": 57596, - "ehr": 54988, - "ei": 19972, - "eid": 61878, - "eight": 67532, - "eil": 58791, - "ein": 71620, - "eing": 31775, - "either": 49898, - "eiÃŁ": 131095, - "ej": 35468, - "ejs": 91783, - "ek": 1225, - "eka": 52313, - "eken": 53894, - "eker": 51216, - "eki": 78753, - "eking": 58852, - "eko": 97664, - "eks": 21167, - "ekt": 17149, - "ekte": 66362, - "ekyll": 96809, - "el": 301, - "ela": 8294, - "elage": 80792, - "elah": 74977, - "elaide": 44093, - "elan": 76100, - "eland": 18123, - "elapsed": 53118, - "elas": 39743, - "elastic": 61964, - "elay": 6895, - "elcome": 5717, - "eld": 783, - "elda": 36908, - "elden": 57588, - "elder": 66976, - "eldig": 98411, - "eldo": 83455, - "eldom": 52634, - "eldon": 55043, - "eldorf": 69875, - "ele": 10068, - "elect": 18957, - "election": 61472, - "electric": 63365, - "electron": 74503, - "electronics": 78566, - "eled": 40089, - "elem": 18871, - "element": 6101, - "elementGuidId": 88375, - "elementType": 93287, - "elements": 21423, - "elems": 94822, - "elen": 8398, - "elenium": 14784, - "eler": 7865, - "elerik": 35100, - "elf": 490, - "elfare": 19251, - "elfast": 46025, - "elfth": 87698, - "elho": 85999, - "eli": 12294, - "elia": 35929, - "eliac": 94605, - "elial": 58444, - "elian": 69564, - "elib": 61218, - "elic": 42623, - "elier": 67149, - "elif": 12458, - "elig": 38467, - "elige": 95946, - "elight": 88243, - "eligible": 68050, - "elihood": 19906, - "elijk": 32238, - "elijke": 65046, - "elim": 39795, - "eliminar": 88256, - "elin": 32730, - "eline": 4834, - "elines": 10999, - "eliness": 54698, - "eling": 20058, - "elist": 19230, - "elite": 70291, - "elivery": 72871, - "elix": 67718, - "elize": 19412, - "ell": 613, - "ella": 6842, - "ellan": 84786, - "ellaneous": 40142, - "ellant": 77141, - "ellar": 26880, - "ellas": 74495, - "ellation": 42213, - "elle": 6712, - "elled": 15201, - "elleicht": 66360, - "ellen": 15671, - "eller": 7073, - "ellers": 24777, - "ellery": 49876, - "elles": 36807, - "elli": 20508, - "ellido": 24118, - "ellidos": 50128, - "ellig": 6703, - "elligence": 8509, - "elligent": 20509, - "ellij": 35259, - "elling": 6293, - "ellipse": 68004, - "ellipsis": 71922, - "ellite": 18155, - "ellites": 41660, - "ello": 4791, - "ellow": 5299, - "elloworld": 95292, - "ells": 6436, - "ellschaft": 69701, - "ellt": 32863, - "ellular": 53130, - "ellung": 82017, - "ellungen": 76213, - "elly": 11896, - "elm": 23162, - "elman": 63541, - "elmet": 74772, - "eln": 17454, - "elo": 20172, - "eload": 76897, - "elocity": 19054, - "elog": 50571, - "elon": 64367, - "elong": 38022, - "elope": 81565, - "elor": 69247, - "elow": 49381, - "elp": 1267, - "elper": 2947, - "elpers": 17527, - "elps": 83619, - "elry": 24044, - "els": 2010, - "else": 1503, - "elsea": 23278, - "elseif": 26016, - "elsen": 41145, - "elsey": 92467, - "elsif": 65967, - "elsing": 96588, - "elsinki": 53917, - "elsius": 40247, - "elson": 21395, - "elt": 3818, - "elta": 5964, - "eltas": 71906, - "elter": 17872, - "elters": 46783, - "elts": 84028, - "elu": 78278, - "elve": 21210, - "elves": 4275, - "ely": 974, - "elyn": 91509, - "em": 336, - "ema": 9176, - "emaakt": 93127, - "emachine": 98469, - "emacs": 47935, - "emade": 28432, - "email": 2332, - "emailer": 88822, - "emails": 51376, - "emain": 92558, - "emaker": 58675, - "emale": 11749, - "emales": 86403, - "eman": 15977, - "emand": 20096, - "emann": 79898, - "emap": 42040, - "emark": 21115, - "emarks": 36166, - "emas": 34162, - "emat": 42598, - "ematic": 12240, - "ematics": 33705, - "emax": 92297, - "emb": 8858, - "embali": 68705, - "embed": 12250, - "embedded": 69864, - "embedding": 94611, - "ember": 1377, - "embers": 7062, - "emble": 91629, - "embourg": 55018, - "embr": 59063, - "embrance": 71569, - "embre": 22530, - "embro": 48910, - "embros": 90468, - "emd": 94110, - "eme": 3894, - "emean": 46890, - "emed": 16404, - "emen": 16335, - "emens": 72737, - "ement": 1114, - "emente": 38861, - "ementia": 45644, - "emento": 75284, - "ements": 3723, - "emer": 40896, - "emergency": 98808, - "emes": 15660, - "emet": 34826, - "emetery": 36538, - "emi": 21780, - "emia": 21925, - "emiah": 64845, - "emic": 8111, - "emics": 37205, - "emie": 96146, - "emies": 11041, - "emin": 25684, - "eming": 73814, - "emit": 18712, - "emm": 72419, - "emma": 33793, - "emme": 96592, - "emo": 6726, - "emode": 91546, - "emodel": 95648, - "emoji": 37523, - "emon": 7291, - "emonic": 38801, - "emons": 58296, - "emony": 18867, - "emory": 4731, - "emos": 14946, - "emoth": 95574, - "emotion": 73353, - "emouth": 86041, - "emp": 3262, - "emperature": 93725, - "emphasis": 86192, - "empl": 25892, - "emplace": 93592, - "emplate": 3708, - "emplates": 76793, - "emple": 44434, - "emplo": 30210, - "emploi": 96575, - "employ": 7668, - "employed": 35142, - "employee": 12946, - "employees": 34539, - "employer": 65201, - "employment": 20461, - "empo": 22114, - "empor": 52371, - "emporary": 13766, - "empre": 36839, - "empresa": 35838, - "empt": 20968, - "emption": 33106, - "empty": 3194, - "ems": 11852, - "emsp": 91137, - "emu": 33063, - "emy": 4524, - "emás": 41841, - "en": 268, - "ena": 7157, - "enable": 12552, - "enabled": 15868, - "enade": 86039, - "enaire": 96720, - "enal": 74397, - "ename": 1840, - "enames": 32954, - "enan": 61841, - "enance": 10220, - "enant": 25121, - "enaries": 84275, - "enario": 20413, - "enarios": 60494, - "enary": 46128, - "enas": 26945, - "enate": 31123, - "enberg": 55836, - "enburg": 54385, - "enc": 954, - "ence": 763, - "enced": 5767, - "encent": 26365, - "encer": 19529, - "encers": 62294, - "ences": 2380, - "ench": 19762, - "enchmark": 39381, - "enci": 45257, - "encia": 8792, - "encial": 44312, - "encias": 26799, - "encies": 5946, - "encil": 17005, - "encing": 11373, - "encion": 92773, - "ención": 43631, - "enco": 73385, - "encode": 6180, - "encodeURIComponent": 97683, - "encoded": 19329, - "encoder": 27008, - "encoding": 17159, - "encrypt": 32826, - "encrypted": 36444, - "encryption": 79937, - "encv": 34384, - "ency": 2251, - "end": 408, - "endDate": 45618, - "endTime": 49688, - "enda": 9696, - "endale": 69060, - "endance": 29719, - "endant": 20372, - "endants": 28310, - "endar": 5153, - "endars": 87614, - "endas": 41507, - "endcode": 89691, - "enddate": 98589, - "ende": 10938, - "ended": 2883, - "endedor": 61167, - "enden": 19875, - "endencies": 37331, - "endency": 21213, - "endent": 28193, - "ender": 1659, - "endereco": 91146, - "enderit": 97468, - "enderror": 41742, - "enders": 14506, - "endet": 54081, - "endez": 72502, - "endforeach": 22095, - "endi": 40024, - "endid": 50403, - "endif": 2330, - "endimento": 79859, - "ending": 2459, - "endir": 66473, - "endl": 5336, - "endment": 14646, - "endo": 8691, - "endon": 90986, - "endor": 8029, - "endors": 32885, - "endoza": 95428, - "endphp": 83662, - "endpoint": 32540, - "endra": 60699, - "endregion": 7715, - "ends": 1412, - "endsWith": 84474, - "endtime": 90861, - "endum": 24530, - "ene": 1952, - "ened": 6758, - "enedor": 76121, - "enef": 50465, - "enefit": 88629, - "eneg": 77529, - "enegro": 87821, - "enemy": 27828, - "enen": 33370, - "ener": 798, - "eneral": 18451, - "enerate": 13220, - "enerated": 10543, - "enerating": 93107, - "eneration": 17252, - "enerative": 74889, - "enerator": 15312, - "energy": 17489, - "eneric": 3469, - "enerima": 92682, - "eners": 18223, - "enery": 89233, - "enes": 21649, - "eness": 23709, - "enet": 69336, - "enever": 30745, - "enez": 20556, - "eng": 826, - "enga": 74575, - "engage": 84739, - "engan": 18262, - "enge": 6309, - "engeance": 55379, - "enger": 10009, - "engers": 14886, - "enght": 70078, - "engine": 8512, - "engineering": 97915, - "engkap": 87272, - "engl": 43624, - "english": 29120, - "engo": 64653, - "ength": 996, - "engu": 27004, - "enguin": 45872, - "enguins": 55358, - "enh": 39867, - "enha": 62026, - "enheim": 91610, - "eni": 33129, - "enia": 58286, - "eniable": 78811, - "enic": 55889, - "enido": 32458, - "enie": 61558, - "ening": 6019, - "enis": 38585, - "enity": 55585, - "enk": 78571, - "enkins": 57006, - "enko": 55055, - "enment": 51961, - "enn": 2667, - "enna": 14950, - "ennai": 50924, - "enne": 25136, - "ennen": 40193, - "ennent": 88710, - "ennes": 15209, - "ennessee": 21464, - "ennial": 31231, - "ennie": 98028, - "ennifer": 58970, - "ennis": 16156, - "ennon": 62925, - "enny": 17835, - "eno": 11790, - "enor": 98731, - "enos": 70870, - "enqueue": 61373, - "ens": 724, - "ensa": 57825, - "ensagem": 67859, - "ensaje": 26007, - "ensation": 41625, - "ensburg": 76929, - "ensch": 46745, - "enschaft": 52028, - "ense": 1117, - "ensed": 28940, - "ensely": 60032, - "ensem": 44399, - "ensemble": 48475, - "ensen": 34017, - "enser": 59444, - "enses": 4280, - "ensex": 95536, - "ensi": 55487, - "ensible": 36764, - "ensibly": 69772, - "ensing": 48105, - "ension": 2645, - "ensions": 4664, - "ensis": 86678, - "ensitive": 18723, - "ensitivity": 47837, - "ensity": 7968, - "ensive": 4025, - "ensively": 26916, - "enso": 71689, - "enson": 33137, - "ensor": 3805, - "ensored": 55778, - "ensors": 26529, - "enstein": 61656, - "ensual": 66729, - "ensure": 27289, - "ensus": 13626, - "ent": 306, - "enta": 16576, - "entai": 35130, - "ental": 6296, - "entanyl": 94291, - "entar": 79680, - "entario": 62836, - "entarios": 81546, - "ente": 6817, - "ented": 15864, - "entence": 18380, - "enter": 1950, - "entered": 86043, - "enterprise": 77934, - "entes": 21243, - "enth": 20684, - "enthal": 77175, - "enti": 22396, - "ential": 2283, - "entialAction": 57971, - "entially": 30568, - "entials": 8476, - "entic": 4256, - "enticate": 22661, - "enticated": 17942, - "entication": 7164, - "enticator": 61393, - "enties": 57042, - "entieth": 51131, - "entifier": 7189, - "entiful": 78720, - "entimes": 91355, - "entin": 43409, - "entina": 23909, - "entine": 26872, - "enting": 91199, - "ention": 2939, - "entionPolicy": 78165, - "entions": 63701, - "entious": 97881, - "entities": 10499, - "entity": 2996, - "entityManager": 47112, - "entlich": 44275, - "ently": 4402, - "ento": 17537, - "enton": 73972, - "entr": 23745, - "entrada": 62240, - "entral": 45086, - "entrant": 69558, - "entre": 39897, - "entreprise": 87888, - "entric": 39409, - "entries": 12940, - "entropy": 49150, - "entry": 4085, - "entrée": 134944, - "ents": 805, - "enty": 7166, - "enu": 1481, - "enuine": 63212, - "enuity": 89489, - "enum": 9018, - "enumer": 39501, - "enumerate": 76569, - "enumerator": 96616, - "enums": 92572, - "enuous": 82022, - "enus": 37865, - "env": 3160, - "enville": 67632, - "environment": 23294, - "environments": 78291, - "eny": 32395, - "enz": 16597, - "enza": 23353, - "enze": 84091, - "enzhen": 78411, - "enzie": 56863, - "enzyme": 64628, - "ença": 86680, - "enção": 97298, - "enÃŃ": 96402, - "eo": 24612, - "eof": 77594, - "eon": 65030, - "eor": 23385, - "eos": 84399, - "eous": 33072, - "ep": 747, - "epad": 69541, - "epam": 88929, - "epar": 11584, - "eparator": 91640, - "epend": 12769, - "ependency": 40529, - "eper": 10436, - "eph": 23544, - "ephir": 80673, - "ephy": 96253, - "eping": 54223, - "episode": 39291, - "epoch": 20197, - "epochs": 46529, - "eprom": 52945, - "eps": 7124, - "epsilon": 31767, - "epy": 70548, - "eq": 11006, - "equ": 25310, - "equal": 25795, - "equalTo": 90585, - "equality": 81638, - "equals": 7176, - "equalsIgnoreCase": 34633, - "equip": 68095, - "equipment": 67518, - "equiv": 57317, - "er": 261, - "era": 2416, - "erable": 26959, - "erah": 96208, - "erais": 80256, - "eral": 3253, - "erala": 49981, - "erald": 24380, - "erals": 17368, - "eras": 9247, - "erase": 18688, - "erate": 58668, - "eration": 20927, - "erator": 39522, - "eração": 74744, - "erb": 40499, - "erc": 2962, - "erca": 77893, - "erce": 25641, - "erchant": 59943, - "ercial": 7991, - "ercicio": 47000, - "ercise": 18359, - "ercises": 47715, - "ercul": 68193, - "erculosis": 73454, - "erd": 14348, - "erdale": 72320, - "erde": 86805, - "erdem": 87783, - "erdings": 68627, - "ere": 485, - "erea": 67109, - "ereal": 43253, - "ereco": 33994, - "ered": 12336, - "eree": 74960, - "eref": 43970, - "ereg": 52633, - "erek": 27626, - "eren": 17392, - "ereo": 64853, - "ereotype": 15742, - "erequisite": 90375, - "erequisites": 82301, - "erer": 90017, - "eres": 12917, - "eresa": 37586, - "ereum": 23923, - "erez": 33786, - "ereço": 77956, - "erg": 2375, - "ergarten": 47572, - "erge": 10080, - "erged": 51525, - "ergency": 65301, - "ergic": 74339, - "erging": 95296, - "erglass": 75469, - "ergus": 32931, - "erguson": 34908, - "ergy": 41943, - "eri": 30703, - "eria": 49829, - "erial": 2848, - "erialization": 50563, - "erialize": 9050, - "erialized": 67577, - "erializer": 41939, - "eric": 11632, - "erie": 26105, - "eries": 4699, - "erin": 84409, - "ering": 4671, - "erior": 14575, - "erk": 16754, - "erland": 86954, - "erm": 4195, - "ermal": 18067, - "ermalink": 42699, - "erman": 4753, - "ermann": 91450, - "ermen": 59158, - "ermint": 93832, - "ermo": 40716, - "ern": 932, - "erna": 46528, - "ernal": 2978, - "ernals": 89320, - "ernational": 27135, - "ernaut": 91189, - "erne": 67395, - "ernel": 5454, - "ernels": 42329, - "ernen": 49072, - "erner": 41372, - "ernes": 73625, - "erness": 28568, - "ernet": 13845, - "ernetes": 29823, - "ernity": 33619, - "erno": 24935, - "ernote": 87450, - "ero": 2328, - "erokee": 59439, - "eron": 19540, - "eroon": 79732, - "eros": 6264, - "erosis": 57781, - "erot": 88992, - "erox": 98158, - "erp": 22632, - "err": 615, - "errMsg": 98871, - "erra": 13886, - "erral": 28178, - "errals": 55143, - "errar": 50049, - "erras": 84384, - "errat": 59609, - "errated": 83656, - "erre": 66000, - "errer": 30929, - "erreur": 70556, - "errick": 60400, - "erring": 14443, - "errmsg": 69932, - "errno": 26379, - "erro": 40296, - "error": 841, - "errorCode": 60329, - "errorMessage": 43169, - "errorMsg": 76044, - "errors": 7650, - "errs": 84735, - "errupt": 10579, - "errupted": 80853, - "erry": 5400, - "ers": 388, - "ersed": 39919, - "ersen": 87989, - "erset": 44146, - "ersh": 54990, - "ersion": 1325, - "ersions": 35279, - "ersist": 4975, - "ersistence": 8026, - "ersistent": 13931, - "ersive": 52353, - "erson": 1270, - "ersonic": 94557, - "erspective": 85091, - "ert": 529, - "erta": 22637, - "ertain": 7615, - "ertainment": 11205, - "ertainty": 80146, - "ertas": 52430, - "ertation": 75304, - "erte": 13820, - "erten": 50958, - "ertest": 83386, - "ertext": 37220, - "erti": 34113, - "ertia": 40122, - "ertiary": 66530, - "erties": 2707, - "ertificate": 20962, - "ertil": 85695, - "ertility": 61487, - "ertime": 69741, - "ertino": 90600, - "erto": 13878, - "ertoire": 61604, - "erton": 36633, - "ertools": 36316, - "ertos": 67119, - "erts": 15546, - "ertura": 55870, - "erture": 41847, - "erty": 1344, - "ertype": 45069, - "ertz": 57937, - "erule": 79393, - "erus": 45009, - "erusform": 69216, - "erv": 648, - "erva": 45865, - "erval": 6152, - "ervals": 42198, - "ervas": 95064, - "ervation": 8768, - "ervations": 45821, - "ervative": 53168, - "ervatives": 78529, - "erve": 5852, - "erved": 2771, - "ervention": 46598, - "erver": 2836, - "ervers": 18729, - "erves": 13280, - "ervice": 1017, - "ervices": 2161, - "erview": 12873, - "erville": 50772, - "erving": 19505, - "ervised": 77990, - "ervisor": 31396, - "ervlet": 4560, - "ervo": 77044, - "ervoir": 75850, - "ery": 722, - "eryl": 45025, - "erÃł": 132617, - "erÃŃa": 131397, - "es": 288, - "esModule": 30012, - "esa": 22371, - "esan": 62424, - "esar": 32240, - "esc": 3300, - "escal": 81082, - "escape": 12998, - "escaped": 65826, - "escaping": 42480, - "esch": 59378, - "esco": 93834, - "escort": 78652, - "escription": 2037, - "esda": 68626, - "ese": 2367, - "esehen": 81184, - "eselect": 51630, - "esen": 65935, - "eses": 83736, - "esh": 4288, - "eshire": 89245, - "esi": 33083, - "esian": 29221, - "esign": 13985, - "esimal": 29472, - "esion": 55981, - "esis": 13774, - "esity": 27123, - "esium": 40830, - "esk": 66819, - "esktop": 62204, - "eslint": 85502, - "eso": 28830, - "esome": 7057, - "eson": 60917, - "esor": 47835, - "esp": 24610, - "especially": 34946, - "esper": 69038, - "espère": 143899, - "ess": 433, - "essa": 25496, - "essage": 801, - "essages": 3737, - "essaging": 32140, - "essay": 79977, - "esse": 23318, - "essed": 21712, - "essel": 35548, - "essen": 38809, - "essenger": 40137, - "essential": 48482, - "esser": 36370, - "esseract": 82538, - "esses": 64870, - "essian": 74329, - "essim": 66733, - "ession": 1338, - "essional": 15774, - "essions": 8551, - "essler": 76949, - "essment": 23391, - "esso": 9823, - "essoa": 27587, - "esson": 71405, - "essor": 8309, - "est": 477, - "esta": 29179, - "establish": 33400, - "estado": 22016, - "estar": 89327, - "estate": 64115, - "estation": 63978, - "estatus": 98525, - "este": 17750, - "estead": 72337, - "ested": 9980, - "esteem": 63617, - "ester": 5191, - "esterday": 11282, - "esters": 75702, - "esthes": 53020, - "esthesia": 62523, - "esthetic": 70009, - "esti": 53483, - "estic": 9826, - "estimate": 40130, - "estimated": 44229, - "estinal": 63950, - "estination": 20646, - "esting": 59855, - "estion": 42498, - "estival": 10863, - "esto": 51425, - "estone": 97933, - "estr": 15111, - "estre": 72775, - "estring": 65040, - "estro": 54556, - "estroy": 9478, - "estruct": 29294, - "estruction": 68702, - "estructor": 42922, - "ests": 17966, - "esture": 15992, - "estureRecognizer": 81920, - "esty": 40239, - "estyle": 37383, - "esub": 71636, - "esus": 42393, - "esy": 64641, - "esz": 74036, - "et": 295, - "etAddress": 53862, - "etCode": 89260, - "etSocketAddress": 80507, - "eta": 1915, - "etable": 35064, - "etadata": 7603, - "etag": 80465, - "etail": 1628, - "etailed": 10111, - "etails": 2237, - "etak": 88721, - "etal": 21323, - "etary": 15859, - "etas": 35917, - "etat": 96615, - "etc": 12107, - "etch": 2995, - "etched": 36780, - "etchup": 90897, - "etcode": 83145, - "ete": 7714, - "etect": 13176, - "etection": 22280, - "etections": 89183, - "eted": 24481, - "eten": 33748, - "eteor": 59466, - "eter": 1404, - "eterangan": 53311, - "eteria": 77822, - "etermin": 16483, - "eterminate": 64224, - "etermination": 81037, - "etermine": 24308, - "etermined": 46637, - "eters": 2424, - "etes": 95181, - "etest": 57824, - "eth": 769, - "ethe": 18522, - "etheless": 26071, - "ether": 2723, - "ethereum": 67122, - "etherlands": 23612, - "etheus": 39705, - "ethical": 74842, - "ething": 2298, - "ethnic": 80418, - "ethod": 1068, - "ethoven": 92522, - "ethyl": 41872, - "ethylene": 87540, - "ethyst": 87303, - "eti": 50898, - "etic": 5298, - "etical": 44508, - "etically": 36674, - "etics": 24279, - "eties": 25559, - "etime": 4107, - "etimes": 6889, - "etine": 85228, - "eting": 11619, - "eto": 11023, - "eton": 34694, - "etr": 17366, - "etrain": 95416, - "etration": 73854, - "etre": 46887, - "etri": 93123, - "etric": 16340, - "etrics": 13468, - "etrize": 56953, - "etro": 8804, - "etrofit": 70308, - "etroit": 18328, - "etros": 34466, - "etry": 15149, - "ets": 1415, - "etsk": 85774, - "etsy": 62627, - "ett": 7066, - "etta": 26527, - "ette": 6535, - "ettel": 84793, - "etten": 94101, - "etter": 21405, - "ettes": 45903, - "etti": 27937, - "etting": 51089, - "ettings": 81183, - "ettle": 47626, - "etto": 52879, - "etty": 88798, - "etu": 94417, - "etur": 31841, - "eturn": 2489, - "etus": 63376, - "etween": 10053, - "etwork": 2349, - "etxt": 88900, - "ety": 2611, - "etyl": 86248, - "etype": 16214, - "etypes": 67553, - "etz": 42189, - "etzt": 61007, - "etÃł": 94871, - "eu": 20128, - "euillez": 87925, - "eur": 12559, - "europ": 143830, - "europä": 143831, - "europäische": 143832, - "eurs": 37547, - "eus": 89702, - "eut": 60053, - "ev": 5120, - "eva": 73418, - "eval": 14170, - "evaluate": 47291, - "evaluation": 74014, - "eve": 82048, - "even": 16788, - "evenodd": 83627, - "event": 3087, - "eventId": 90356, - "eventName": 85827, - "eventType": 94066, - "evento": 83954, - "events": 12389, - "ever": 2054, - "every": 29015, - "everyone": 91957, - "everything": 72726, - "evice": 63924, - "evil": 58867, - "evin": 14281, - "evity": 51679, - "evt": 28734, - "ew": 365, - "ewan": 52298, - "eward": 24035, - "eware": 54069, - "ewart": 26497, - "ewater": 47444, - "eway": 24723, - "eways": 69271, - "ewe": 87723, - "ewear": 98128, - "ewed": 92076, - "ewhat": 80475, - "ewhere": 60652, - "ewidth": 28357, - "ewing": 78410, - "ewire": 70545, - "ewis": 82152, - "ewise": 24350, - "ewish": 65829, - "ewith": 97809, - "ewitness": 70896, - "ewn": 94450, - "ewnÄĻtr": 128160, - "ewnÄĻtrzn": 128161, - "ewolf": 76699, - "ewood": 75265, - "ework": 2445, - "eworld": 95772, - "eworthy": 56138, - "ewriter": 72480, - "ews": 27744, - "ex": 327, - "exact": 46385, - "exam": 41616, - "example": 8687, - "exampleInput": 57692, - "exampleInputEmail": 82001, - "exampleModal": 58390, - "exampleModalLabel": 82403, - "examples": 51668, - "exao": 39539, - "exas": 7467, - "exc": 39441, - "excel": 40524, - "except": 11683, - "exception": 7803, - "exceptions": 61752, - "excerpt": 71570, - "exchange": 39568, - "exclude": 32413, - "excluding": 78995, - "exclusive": 89122, - "exe": 46184, - "exec": 11748, - "executable": 95924, - "execute": 10257, - "execution": 52721, - "executor": 80787, - "exels": 94727, - "exemple": 70734, - "exercise": 63462, - "exion": 16132, - "exist": 28575, - "existence": 92672, - "existent": 64085, - "existing": 36895, - "exists": 16304, - "exit": 13652, - "exo": 77209, - "exp": 4580, - "expand": 32317, - "expanded": 35483, - "expect": 17119, - "expectException": 87714, - "expected": 7325, - "expects": 37631, - "expense": 58757, - "expenses": 92210, - "experience": 49559, - "experiment": 59429, - "experimental": 86703, - "expert": 73887, - "expiration": 63643, - "expire": 52161, - "expired": 75532, - "expires": 48203, - "expiry": 75717, - "expl": 29892, - "explain": 94344, - "explained": 80850, - "explicit": 93632, - "explo": 68231, - "explode": 54842, - "expo": 71131, - "export": 1533, - "exports": 4986, - "expr": 9413, - "express": 13788, - "expression": 28099, - "expérience": 132808, - "ext": 427, - "extAlignment": 58749, - "extField": 25082, - "extView": 64981, - "extend": 25048, - "extended": 41098, - "extends": 15231, - "extension": 12427, - "extensions": 27609, - "extent": 70172, - "exter": 37565, - "exterity": 58816, - "extern": 4301, - "external": 20921, - "externalActionCode": 90098, - "extr": 38649, - "extra": 15460, - "extracomment": 75513, - "extract": 23493, - "extras": 72575, - "extrême": 144003, - "extérieur": 138186, - "exual": 45179, - "exus": 23666, - "ey": 1195, - "eyJ": 84609, - "eya": 77889, - "eye": 18958, - "eyed": 47959, - "eyer": 34372, - "eyes": 57231, - "eyond": 22650, - "ez": 10125, - "ezier": 98616, - "eña": 131080, - "eño": 131011, - "eÄŁ": 127129, - "eÄŁe": 138375, - "eÄŁi": 129230, - "eÄŁin": 131490, - "eÅĦ": 129299, - "f": 69, - "fa": 3632, - "fab": 36855, - "fabric": 85154, - "fabs": 50147, - "fac": 22185, - "face": 1564, - "facebook": 20944, - "faces": 7605, - "facet": 83523, - "facility": 78683, - "fact": 33110, - "faction": 90309, - "factor": 37591, - "factory": 21618, - "facts": 68053, - "faculty": 85168, - "fad": 83059, - "fade": 17517, - "fadeIn": 34993, - "fadeOut": 39619, - "faf": 76476, - "fahren": 96922, - "fail": 18403, - "failed": 16091, - "fails": 59631, - "failure": 28939, - "fair": 40900, - "fait": 63865, - "faith": 74610, - "fake": 30570, - "faker": 36419, - "fal": 95588, - "fall": 13464, - "fallback": 73311, - "falls": 32595, - "false": 3849, - "family": 18984, - "fan": 30178, - "fang": 42477, - "fans": 85877, - "fant": 60727, - "faq": 45523, - "far": 23559, - "fare": 23051, - "farm": 65811, - "fas": 14847, - "fast": 9349, - "fasta": 94466, - "fastcall": 42403, - "fat": 44183, - "fatal": 74394, - "father": 23017, - "fault": 59572, - "fav": 80864, - "favicon": 54557, - "favor": 73960, - "favorite": 38490, - "favorites": 78503, - "fax": 39053, - "fb": 10798, - "fbe": 93264, - "fc": 8316, - "fcc": 72975, - "fce": 97614, - "fclose": 78054, - "fcn": 92041, - "fcntl": 49676, - "fd": 6902, - "fdb": 94228, - "fdc": 92168, - "fdf": 80583, - "fds": 64834, - "fe": 1859, - "fea": 94214, - "feas": 89277, - "feat": 44644, - "feature": 12753, - "featured": 36215, - "features": 20304, - "feb": 77371, - "fec": 76526, - "fecha": 19808, - "fect": 3751, - "fection": 13120, - "fections": 24384, - "fed": 51123, - "fee": 30017, - "feed": 11184, - "feedback": 20999, - "feeding": 45419, - "feeds": 64542, - "feel": 56576, - "fef": 97804, - "feit": 61121, - "feito": 89118, - "fel": 58267, - "feld": 30102, - "fell": 66543, - "felt": 65822, - "female": 42634, - "fen": 30353, - "feof": 85670, - "fer": 802, - "ference": 2202, - "ferences": 4901, - "fern": 78733, - "ferred": 5554, - "fers": 49793, - "fest": 52764, - "fetch": 9641, - "fetchAll": 39015, - "few": 70730, - "ff": 542, - "ffa": 71942, - "ffb": 88549, - "ffc": 77887, - "ffd": 72554, - "ffe": 27969, - "ffect": 1705, - "ffective": 39684, - "ffects": 39927, - "ffee": 53125, - "ffen": 25651, - "ffer": 2945, - "fff": 14092, - "ffff": 7238, - "ffffff": 26886, - "fffffff": 82692, - "ffffffff": 53697, - "ffi": 53799, - "ffic": 20615, - "ffield": 53239, - "ffiti": 55326, - "ffmpeg": 72422, - "ffset": 55340, - "fft": 29175, - "fg": 4817, - "fgang": 75313, - "fgets": 98993, - "fh": 31104, - "fi": 9983, - "fib": 75326, - "fiber": 82945, - "fic": 58628, - "fiction": 57062, - "fid": 32439, - "fidf": 80954, - "field": 2566, - "fieldName": 44594, - "fieldname": 86098, - "fields": 9007, - "fieldset": 23566, - "fifo": 74031, - "fig": 904, - "figcaption": 79212, - "fight": 21143, - "fighter": 72331, - "fighters": 78061, - "figure": 17781, - "figures": 98027, - "fil": 12441, - "fila": 46136, - "file": 1192, - "fileName": 20464, - "filePath": 36697, - "filename": 8404, - "filepath": 44157, - "filer": 72555, - "files": 7198, - "filesize": 91378, - "filesystem": 41897, - "fill": 7559, - "fillType": 54329, - "fillable": 41386, - "filled": 27511, - "fillna": 95096, - "fills": 66167, - "film": 30155, - "filme": 78335, - "films": 65402, - "filt": 87631, - "filter": 5315, - "filtered": 41131, - "filters": 24608, - "filtr": 84746, - "filtro": 93749, - "fin": 5472, - "final": 11822, - "finalize": 94405, - "finally": 39176, - "finance": 62675, - "financial": 74987, - "find": 3903, - "findAll": 51389, - "findBy": 61236, - "findById": 94009, - "findFirst": 98042, - "findOne": 44381, - "findOrFail": 54290, - "findViewById": 25782, - "finder": 33339, - "finding": 67187, - "fine": 62057, - "finger": 79116, - "finish": 30150, - "finished": 12129, - "finite": 25722, - "finity": 19888, - "fir": 91636, - "fire": 10796, - "firebase": 29310, - "firefox": 97912, - "fires": 55071, - "firm": 8802, - "first": 3896, - "firstName": 27987, - "firstname": 28425, - "fish": 18170, - "fit": 6276, - "fitness": 73521, - "fits": 29222, - "five": 52670, - "fix": 5743, - "fixed": 22021, - "fixture": 59612, - "fixtures": 45247, - "fk": 41718, - "fl": 1489, - "flag": 9903, - "flags": 11161, - "flake": 63456, - "flamm": 44764, - "flammatory": 53997, - "flare": 31605, - "flash": 19268, - "flashdata": 71934, - "flat": 26229, - "flatMap": 57591, - "flate": 16716, - "flater": 11729, - "flation": 64149, - "flatten": 47066, - "fld": 48311, - "fleet": 72698, - "flen": 58467, - "flex": 12018, - "flies": 53919, - "flight": 38390, - "flip": 39017, - "flix": 17528, - "flo": 89806, - "float": 3649, - "floating": 82510, - "floor": 30449, - "flow": 4965, - "flower": 38753, - "flowers": 88670, - "flows": 38140, - "flt": 79209, - "flu": 26164, - "fluence": 40016, - "fluid": 66025, - "flush": 21664, - "flutter": 14972, - "flux": 36706, - "fly": 21642, - "fläche": 135266, - "fm": 21112, - "fmt": 12501, - "fn": 8822, - "fname": 23993, - "fo": 824, - "focus": 17414, - "focused": 62157, - "foil": 98957, - "fois": 85533, - "fol": 8400, - "fold": 19961, - "folder": 17668, - "folders": 67355, - "folio": 10988, - "folios": 57998, - "folk": 40931, - "follow": 18559, - "follower": 93742, - "followers": 65866, - "following": 42918, - "fon": 21470, - "fone": 31341, - "fono": 21812, - "font": 4026, - "fontName": 77101, - "fontSize": 35095, - "fontWeight": 61881, - "fonts": 20203, - "fontsize": 45801, - "fony": 13172, - "foo": 7975, - "foobar": 50267, - "food": 13915, - "foods": 95320, - "foon": 94776, - "foot": 5334, - "football": 84336, - "footer": 6956, - "for": 1958, - "forEach": 17969, - "forall": 33629, - "forc": 10458, - "force": 8833, - "forced": 24246, - "forcement": 10927, - "forcements": 87393, - "forcer": 82010, - "forces": 48796, - "forcing": 41496, - "ford": 8187, - "forder": 87227, - "fore": 1324, - "foreach": 8808, - "forecast": 58984, - "foreground": 34919, - "foregroundColor": 81144, - "foreign": 28443, - "forest": 50655, - "forg": 96844, - "forge": 24112, - "forget": 40019, - "forgettable": 56446, - "forgot": 67803, - "fork": 44738, - "form": 627, - "formData": 52873, - "forma": 47571, - "formance": 11795, - "format": 2243, - "formation": 1627, - "formats": 63482, - "formatted": 49878, - "formatter": 32941, - "forme": 75601, - "formed": 10155, - "formedURLException": 64771, - "former": 34527, - "formerly": 69514, - "formik": 76607, - "forming": 54757, - "forms": 9807, - "formula": 59499, - "formulario": 93493, - "fort": 3969, - "fortawesome": 56663, - "forth": 70527, - "fortunate": 32074, - "fortunately": 11029, - "fortune": 83512, - "forum": 22585, - "forums": 54059, - "forward": 13435, - "fos": 50688, - "foto": 42138, - "found": 15105, - "foundation": 72307, - "foundland": 76633, - "four": 34024, - "fout": 96805, - "fov": 85582, - "fox": 15011, - "foy": 93717, - "fp": 10852, - "fprintf": 31617, - "fps": 43428, - "fq": 63919, - "fr": 1626, - "fra": 42289, - "frac": 37018, - "fraction": 81090, - "frag": 33198, - "frage": 83301, - "fragistics": 53625, - "fragment": 42202, - "fram": 91504, - "frame": 6763, - "frames": 23719, - "framework": 3794, - "frared": 81382, - "frau": 96115, - "frauen": 98058, - "fre": 24716, - "fred": 27993, - "free": 10593, - "freeze": 51638, - "frei": 97369, - "freq": 33540, - "frequency": 46521, - "fresh": 71308, - "frey": 75231, - "frica": 29880, - "frican": 47793, - "fried": 97525, - "friend": 10701, - "friendly": 81530, - "friends": 29462, - "frm": 31636, - "frog": 85982, - "from": 1499, - "fromJson": 97756, - "front": 6951, - "frontend": 28181, - "fruit": 35598, - "fs": 3848, - "fsp": 92113, - "fst": 49494, - "fstream": 30516, - "ft": 723, - "ftar": 46201, - "fte": 63319, - "ften": 25061, - "fter": 1046, - "ftime": 17789, - "ftp": 25068, - "fts": 44444, - "ftware": 2110, - "fty": 36958, - "ftype": 80390, - "fu": 32621, - "fuck": 70474, - "fuel": 63375, - "ful": 1262, - "fulWidget": 35385, - "full": 8878, - "fullName": 67158, - "fullname": 44846, - "fullscreen": 52449, - "fully": 3641, - "fulness": 30414, - "fun": 11894, - "func": 2830, - "funcs": 87482, - "function": 1688, - "functional": 49228, - "functions": 21409, - "fund": 57603, - "fung": 78606, - "fur": 82901, - "furt": 38186, - "fusc": 51589, - "fuscated": 80247, - "fuse": 95592, - "fusion": 54565, - "future": 21055, - "fv": 27890, - "fw": 20564, - "fwrite": 96727, - "fx": 8298, - "fy": 30595, - "fä": 131660, - "fäh": 136507, - "fähig": 136508, - "fäll": 143155, - "fälle": 142845, - "fällig": 143156, - "fällt": 135475, - "fé": 58858, - "férence": 135387, - "för": 94961, - "förder": 138154, - "fü": 30166, - "füg": 60409, - "füh": 68545, - "fühl": 133666, - "führ": 72313, - "führen": 131527, - "führer": 142884, - "führt": 96373, - "führung": 132975, - "für": 133238, - "fÃŃcio": 137548, - "g": 70, - "gL": 80130, - "gMaps": 83804, - "ga": 6743, - "gaard": 94489, - "gabe": 61229, - "gaben": 83543, - "gable": 35034, - "gado": 77640, - "gae": 66278, - "gage": 14943, - "gages": 55044, - "gain": 59146, - "gal": 16470, - "galement": 42210, - "gallery": 26205, - "gam": 39329, - "gambar": 84069, - "game": 5804, - "gameObject": 42763, - "games": 34568, - "gamma": 32214, - "gan": 29428, - "gang": 46014, - "gap": 41410, - "gar": 12164, - "gard": 53492, - "gars": 63402, - "gart": 45246, - "gary": 33488, - "gas": 39525, - "gate": 24601, - "gateway": 46473, - "gather": 95725, - "gatsby": 49148, - "gay": 74493, - "gb": 9511, - "gba": 56380, - "gboolean": 86962, - "gc": 20669, - "gcc": 70983, - "gcd": 91289, - "gd": 28584, - "ge": 709, - "gear": 54727, - "geb": 42153, - "geben": 42316, - "geber": 95905, - "gebn": 66198, - "gebra": 26083, - "gebung": 92135, - "ged": 3556, - "gee": 98394, - "gef": 140600, - "gefähr": 140601, - "geführt": 133429, - "geh": 94873, - "geist": 78400, - "gel": 28852, - "gem": 34103, - "geme": 64649, - "gement": 29564, - "gements": 83027, - "gems": 99053, - "gemÃ¤ÃŁ": 142334, - "gen": 4370, - "gence": 28255, - "gency": 21640, - "gend": 57064, - "gende": 58773, - "genden": 85953, - "gender": 12968, - "gene": 42371, - "gener": 7490, - "general": 24595, - "generate": 19366, - "generated": 16187, - "generation": 80057, - "generator": 35851, - "generic": 35787, - "genes": 58175, - "genesis": 77894, - "genic": 88205, - "genome": 87945, - "genre": 33613, - "genres": 63911, - "gens": 58305, - "gent": 15772, - "geo": 13052, - "geois": 46309, - "geom": 41916, - "geometry": 15281, - "ger": 1389, - "gerald": 56797, - "gere": 87027, - "geries": 60388, - "gers": 10637, - "gerät": 137143, - "ges": 4188, - "gesch": 45061, - "gest": 6969, - "gesture": 85357, - "get": 455, - "getActiveSheet": 49732, - "getAll": 45071, - "getApplication": 91869, - "getAs": 91346, - "getAttribute": 25635, - "getBlock": 97497, - "getBody": 58720, - "getBytes": 56809, - "getC": 59515, - "getCell": 89514, - "getChild": 68350, - "getClass": 42660, - "getClient": 53893, - "getClientOriginal": 74885, - "getCode": 57934, - "getColor": 47660, - "getColumn": 53909, - "getConfig": 52536, - "getConnection": 52414, - "getContent": 46679, - "getContext": 49233, - "getCurrent": 44454, - "getData": 25940, - "getDate": 74280, - "getDb": 95158, - "getDefault": 75987, - "getDescription": 94813, - "getDisplay": 99033, - "getDoctrine": 50018, - "getDrawable": 88498, - "getElement": 75657, - "getElementsByTagName": 70620, - "getEmail": 89512, - "getError": 69681, - "getExtension": 57860, - "getField": 40430, - "getFile": 76595, - "getFullYear": 96785, - "getHeight": 66773, - "getID": 66031, - "getId": 15612, - "getImage": 63308, - "getIndex": 95934, - "getInstance": 19720, - "getInt": 48880, - "getItem": 51753, - "getJSON": 79031, - "getKey": 63147, - "getLast": 71557, - "getList": 74689, - "getLocale": 88582, - "getLocation": 87972, - "getManager": 56884, - "getMessage": 20383, - "getMethod": 90161, - "getMock": 46228, - "getMockBuilder": 91424, - "getModel": 49430, - "getName": 13875, - "getNext": 79202, - "getNode": 69984, - "getNum": 83044, - "getObject": 61949, - "getOption": 69023, - "getOrElse": 91702, - "getPage": 96472, - "getParam": 44775, - "getParameter": 62649, - "getParent": 59169, - "getPath": 50174, - "getPlayer": 94972, - "getPosition": 50408, - "getPost": 64997, - "getProperty": 58636, - "getQuery": 57098, - "getReference": 72265, - "getRepository": 41332, - "getRequest": 39397, - "getResource": 34560, - "getResponse": 59341, - "getResult": 56656, - "getRoot": 93190, - "getRow": 87476, - "getService": 71510, - "getSession": 60849, - "getSimpleName": 73317, - "getSingleton": 79166, - "getSize": 59353, - "getSource": 87804, - "getState": 62353, - "getStatus": 68873, - "getStatusCode": 76537, - "getStore": 80579, - "getString": 20769, - "getStringExtra": 86681, - "getStyle": 74743, - "getTable": 59193, - "getText": 31298, - "getTime": 25278, - "getTitle": 66305, - "getToken": 84731, - "getType": 28549, - "getUrl": 66270, - "getUser": 28440, - "getValue": 18499, - "getVar": 71049, - "getView": 86449, - "getWidth": 65731, - "getWindow": 92594, - "getX": 51439, - "getY": 52568, - "getattr": 81732, - "getc": 71303, - "gether": 3439, - "getic": 35224, - "getitem": 59912, - "getline": 56692, - "gets": 18691, - "gett": 76445, - "getter": 52891, - "gettext": 57259, - "getti": 96372, - "getting": 50110, - "getto": 63622, - "gew": 37285, - "gewater": 85030, - "gf": 45124, - "gfx": 55111, - "gg": 14398, - "gger": 91776, - "gh": 866, - "ghan": 15708, - "ghest": 57242, - "ghi": 75076, - "ghost": 38654, - "ght": 2076, - "gi": 8212, - "gia": 54801, - "giatan": 78209, - "gid": 34849, - "gie": 21512, - "gien": 87264, - "giene": 42212, - "gies": 67369, - "gif": 33186, - "gift": 52330, - "gil": 60787, - "gin": 8163, - "ginas": 78907, - "ging": 3173, - "gings": 52833, - "gio": 45145, - "girl": 28552, - "girls": 60196, - "gis": 51098, - "gist": 95294, - "git": 12882, - "github": 5204, - "gium": 89239, - "give": 46430, - "given": 41968, - "gl": 6072, - "glas": 26383, - "glass": 58436, - "gle": 3408, - "gles": 85609, - "glfw": 90445, - "gli": 45288, - "glich": 28494, - "glm": 42219, - "glob": 58926, - "global": 9752, - "globals": 53167, - "glomer": 75046, - "gly": 22945, - "glyph": 65481, - "glyphicon": 22135, - "glÄħd": 131772, - "gm": 26186, - "gmail": 76209, - "gment": 9070, - "gments": 26139, - "gmt": 46063, - "gn": 4905, - "gne": 67155, - "gni": 46242, - "gnore": 10289, - "gnu": 68828, - "go": 3346, - "goal": 33939, - "goals": 84157, - "god": 39711, - "going": 9546, - "gold": 34537, - "golden": 97235, - "gom": 36083, - "gomery": 38230, - "gon": 11670, - "gone": 45596, - "gons": 43874, - "goo": 62048, - "good": 18536, - "goods": 19693, - "goog": 39858, - "google": 17485, - "gor": 5628, - "gorit": 86415, - "gorith": 6063, - "gorithm": 7095, - "gorithms": 18980, - "gorm": 73281, - "gos": 34073, - "got": 22390, - "gota": 70153, - "goto": 28535, - "gov": 53203, - "government": 86763, - "gow": 36186, - "gp": 21888, - "gpio": 44877, - "gps": 74511, - "gpu": 42594, - "gr": 901, - "gra": 31950, - "grab": 58212, - "grad": 6759, - "gradable": 77030, - "gradation": 48141, - "grade": 6937, - "graded": 23343, - "grades": 22340, - "gradient": 26394, - "grading": 32259, - "graduate": 27670, - "graf": 76039, - "gram": 1520, - "grammar": 41094, - "grams": 50770, - "gran": 67063, - "grand": 52666, - "grant": 51627, - "graph": 4439, - "graphic": 85872, - "graphics": 31685, - "graphql": 38294, - "graphs": 86186, - "grass": 53354, - "gratis": 94746, - "grav": 35390, - "grave": 76631, - "gravity": 70791, - "gray": 11650, - "gre": 15525, - "greSQL": 59796, - "great": 46891, - "greater": 65235, - "gree": 22490, - "green": 13250, - "greens": 81726, - "greg": 7998, - "gregar": 58932, - "gregate": 14240, - "gregated": 93040, - "gregation": 34442, - "gregator": 58131, - "gren": 74265, - "grep": 38205, - "gres": 17818, - "grese": 48450, - "greso": 72156, - "gresql": 81624, - "gress": 2483, - "gression": 29740, - "gressive": 46719, - "gressor": 73231, - "grey": 34571, - "gricult": 12835, - "grid": 4203, - "grily": 79955, - "grim": 86097, - "gro": 41411, - "gross": 93802, - "ground": 1951, - "groundColor": 56716, - "grounds": 62111, - "group": 4074, - "groupBox": 63618, - "groupBy": 71288, - "groupId": 51854, - "groupName": 90631, - "groupid": 93799, - "groupon": 69914, - "groups": 16753, - "grow": 66218, - "grown": 61276, - "growth": 73089, - "grp": 42854, - "grpc": 56585, - "grund": 59785, - "grunt": 61224, - "grupo": 71977, - "gráf": 137434, - "gráfica": 137435, - "gráfico": 135912, - "gré": 89866, - "grÃ¶ÃŁe": 143721, - "grün": 136613, - "gründe": 137609, - "gs": 5857, - "gst": 63205, - "gsub": 94548, - "gt": 5178, - "gte": 55067, - "gtest": 82038, - "gtk": 40749, - "gu": 8717, - "gua": 84269, - "guard": 26098, - "guarded": 96303, - "guards": 78738, - "gue": 37668, - "guess": 51751, - "guest": 30177, - "gui": 19109, - "guid": 23448, - "guide": 48370, - "guided": 65419, - "guild": 57877, - "gulp": 23328, - "gun": 13259, - "guna": 61275, - "gunakan": 74705, - "guns": 51821, - "gunta": 59910, - "gué": 136418, - "gv": 21404, - "gw": 54133, - "gx": 59957, - "gy": 4577, - "gypt": 13539, - "gz": 46589, - "gzip": 70996, - "gänge": 140299, - "gé": 126295, - "géni": 137583, - "gência": 132439, - "gó": 129253, - "gü": 126547, - "gün": 133372, - "gı": 128137, - "gÅĤ": 125797, - "gÅĤo": 135142, - "gÅĤos": 130315, - "gÅĤow": 133542, - "gÅĤoÅĽ": 135143, - "gÅĤÄĻb": 136092, - "h": 71, - "ha": 4223, - "haar": 68129, - "hab": 10573, - "habi": 61595, - "habit": 96702, - "hack": 65972, - "had": 31245, - "haft": 81760, - "hai": 25214, - "hair": 50629, - "hait": 97708, - "hal": 11866, - "halb": 49662, - "haled": 59885, - "half": 37006, - "hall": 42241, - "halt": 39416, - "halten": 35505, - "ham": 5604, - "hammad": 33057, - "hammer": 45334, - "hamster": 94265, - "han": 9917, - "hana": 83103, - "hand": 10661, - "handle": 8192, - "handleChange": 48694, - "handleRequest": 91237, - "handleSubmit": 65560, - "handled": 38821, - "handler": 17905, - "handlers": 55627, - "handles": 43931, - "handling": 90097, - "hands": 88012, - "hang": 20658, - "hani": 86811, - "hap": 37810, - "hape": 29788, - "happy": 56521, - "haps": 6224, - "hapus": 67955, - "har": 12982, - "hard": 18703, - "hardt": 59282, - "hardware": 68215, - "hare": 76711, - "harga": 59862, - "hari": 75907, - "harma": 77238, - "hart": 46389, - "has": 4648, - "hasClass": 40172, - "hasMany": 48296, - "hasOne": 80347, - "hash": 8296, - "hashCode": 60695, - "hashed": 95647, - "hashtags": 30209, - "hasil": 32956, - "hat": 9198, - "hatt": 23104, - "hattan": 25337, - "haul": 43156, - "haus": 31551, - "hausen": 76147, - "haust": 15074, - "have": 19016, - "haven": 70912, - "having": 68566, - "hawk": 81154, - "hawks": 70287, - "hay": 67312, - "hazi": 63585, - "hb": 49039, - "hc": 38052, - "hci": 73810, - "hcp": 62169, - "hd": 15990, - "hdl": 90374, - "hdr": 28785, - "he": 383, - "hea": 39933, - "head": 1983, - "headed": 62500, - "header": 2708, - "headers": 7713, - "heading": 11412, - "headline": 63193, - "heads": 35810, - "health": 12120, - "healthy": 37028, - "heap": 15961, - "hear": 86060, - "heard": 54503, - "heart": 17735, - "heartbeat": 72471, - "heat": 19963, - "heatmap": 94061, - "heavy": 88845, - "hec": 41650, - "heck": 1227, - "hecy": 49731, - "hed": 41009, - "hee": 49053, - "heed": 56554, - "heel": 8431, - "heels": 72510, - "heet": 3674, - "heets": 20306, - "hei": 60852, - "heid": 44797, - "height": 2563, - "heim": 20572, - "heimer": 34080, - "heiro": 59477, - "heit": 22385, - "heiten": 89249, - "heits": 87818, - "hek": 91080, - "hel": 49122, - "held": 27608, - "hell": 56095, - "hello": 14990, - "helm": 51899, - "help": 8653, - "helper": 18764, - "helpers": 21723, - "hem": 29032, - "hen": 12032, - "her": 1923, - "here": 6739, - "herence": 51361, - "herent": 37538, - "herit": 9263, - "heritance": 62443, - "herited": 48394, - "herits": 38693, - "hero": 17732, - "heroes": 53476, - "hes": 16668, - "hesion": 58638, - "hesive": 40818, - "hest": 6402, - "het": 13803, - "heten": 93933, - "hetic": 26863, - "hetics": 48366, - "hetto": 76242, - "heure": 74776, - "hev": 80813, - "hevik": 80908, - "hex": 17308, - "hexdigest": 97224, - "hey": 35561, - "hf": 44754, - "hg": 66602, - "hh": 20367, - "hhh": 90064, - "hi": 6023, - "hib": 5803, - "hiba": 78476, - "hibit": 65817, - "hibited": 92517, - "hibition": 58973, - "hic": 82513, - "hid": 46453, - "hidden": 6263, - "hide": 8559, - "hift": 47833, - "high": 11892, - "higher": 89347, - "highest": 74154, - "highlight": 35198, - "hil": 75323, - "hill": 27507, - "him": 39517, - "hin": 41557, - "hind": 73938, - "hint": 46125, - "hints": 95348, - "hip": 2151, - "hips": 33222, - "hipster": 95988, - "hir": 29628, - "hire": 34448, - "hiro": 85138, - "his": 25235, - "hist": 21158, - "histoire": 89346, - "histor": 43441, - "historic": 73316, - "history": 18844, - "hit": 22492, - "hits": 50205, - "hive": 88568, - "hiên": 136081, - "hiếu": 137503, - "hk": 85511, - "hl": 17958, - "hlen": 70667, - "hm": 34301, - "hma": 40353, - "hn": 24134, - "ho": 6161, - "hoa": 98661, - "hoc": 88473, - "hoe": 75935, - "hof": 75858, - "hoff": 93304, - "hog": 60622, - "hol": 8452, - "hold": 6282, - "holder": 4251, - "holders": 16662, - "holding": 42491, - "holds": 53119, - "hole": 30420, - "holes": 74690, - "holiday": 70540, - "holm": 33505, - "hom": 34840, - "home": 5117, - "homepage": 52019, - "homes": 85272, - "homme": 86613, - "hon": 81549, - "hone": 25256, - "hood": 5694, - "hook": 20873, - "hooks": 38560, - "hoot": 90321, - "hop": 25115, - "hope": 60793, - "hopefully": 96425, - "hor": 19530, - "hora": 46364, - "hores": 82071, - "horia": 95629, - "horizontal": 30629, - "horn": 50884, - "horse": 59675, - "hort": 22007, - "hos": 41835, - "hospital": 70027, - "host": 3790, - "hostname": 27806, - "hosts": 44692, - "hot": 10622, - "hotel": 38817, - "hotmail": 55454, - "hots": 34413, - "hou": 18166, - "houette": 45625, - "hound": 75096, - "hour": 24677, - "hours": 30382, - "house": 7675, - "houses": 36741, - "housing": 80615, - "hover": 17583, - "how": 5158, - "hower": 83018, - "however": 97836, - "hp": 21197, - "hpp": 90843, - "hq": 81899, - "hr": 4079, - "hra": 71910, - "hread": 73839, - "href": 13335, - "hrs": 65262, - "hs": 4997, - "hsi": 67494, - "ht": 426, - "hta": 75809, - "htable": 26686, - "htag": 34311, - "htags": 25285, - "htaking": 52243, - "htar": 84644, - "htdocs": 39748, - "hte": 55499, - "hti": 94848, - "htm": 87372, - "html": 1551, - "htmlspecialchars": 79596, - "hton": 64712, - "htt": 96336, - "http": 1254, - "httpClient": 83417, - "https": 2428, - "htub": 65413, - "hu": 16739, - "hua": 91236, - "hub": 26682, - "hud": 80388, - "hue": 92923, - "huge": 95370, - "hum": 27300, - "human": 25312, - "humidity": 93046, - "hung": 56832, - "hunt": 80075, - "hunter": 98272, - "hurst": 69100, - "hus": 12800, - "hv": 81979, - "hw": 27827, - "hwnd": 97318, - "hx": 58424, - "hy": 8503, - "hya": 86223, - "hydr": 25172, - "hydrate": 87378, - "hydration": 80724, - "hydro": 66129, - "hyp": 78243, - "hyper": 68192, - "hyth": 22576, - "hythm": 60154, - "hz": 37259, - "hä": 127533, - "hält": 130655, - "hänge": 139101, - "häuser": 143492, - "hé": 128959, - "hôtel": 133068, - "hões": 93230, - "hör": 129602, - "hế": 140652, - "há»ı": 137899, - "há»ķ": 137390, - "hợ": 137129, - "i": 72, - "iOS": 62760, - "iPad": 66293, - "iParam": 69908, - "iPhone": 44740, - "iT": 83589, - "iVar": 81885, - "ia": 685, - "iability": 78343, - "iable": 2156, - "iac": 17569, - "iad": 62944, - "iado": 96709, - "iae": 71978, - "iage": 64440, - "iagnostics": 18938, - "iah": 19310, - "iais": 56467, - "ial": 530, - "iale": 19893, - "ialect": 55056, - "iales": 32788, - "iali": 81064, - "ialias": 88214, - "ialis": 17691, - "ialized": 76974, - "ially": 33475, - "ialog": 2344, - "ials": 10309, - "iam": 4932, - "iameter": 36044, - "iami": 15264, - "iamo": 34214, - "iamond": 18479, - "iams": 12382, - "ian": 1103, - "iana": 12417, - "iance": 5284, - "iances": 21813, - "iane": 35035, - "iang": 27224, - "iangle": 63850, - "iani": 46447, - "ianne": 63352, - "iano": 13088, - "ians": 5380, - "iant": 5372, - "iants": 62278, - "iao": 22516, - "iap": 67721, - "iar": 13572, - "iard": 67865, - "iards": 80460, - "iare": 95186, - "ias": 3473, - "iasco": 97283, - "iasi": 97554, - "iasm": 32890, - "iat": 10358, - "iate": 6493, - "iated": 10029, - "iates": 42298, - "iating": 22897, - "iation": 7101, - "iationException": 74027, - "iations": 17144, - "iative": 53579, - "iator": 36122, - "iators": 80290, - "iatric": 22520, - "iatrics": 70428, - "iaux": 82291, - "iaz": 26975, - "iazza": 89414, - "iação": 67643, - "iaÅĤ": 34284, - "iaÅĤa": 94590, - "ib": 579, - "ibBundleOrNil": 89390, - "ibName": 59344, - "ibNameOrNil": 89326, - "iba": 34938, - "ibaba": 28260, - "ibal": 50529, - "iban": 33779, - "iband": 87363, - "ibase": 98746, - "ibbean": 32059, - "ibble": 82418, - "ibbon": 35080, - "ibe": 23549, - "ibel": 68595, - "iben": 63236, - "iber": 8629, - "ibern": 17660, - "ibernate": 18818, - "ibi": 39393, - "ibia": 66237, - "ibil": 30517, - "ibile": 41417, - "ibili": 85948, - "ibilidad": 56235, - "ibilidade": 86585, - "ibilit": 39848, - "ibilities": 13450, - "ibility": 3147, - "ibir": 82460, - "ible": 1238, - "ibles": 20410, - "ibli": 68613, - "ibling": 19876, - "iblings": 24229, - "ibly": 6487, - "ibo": 28846, - "ibold": 58395, - "ibox": 70283, - "ibr": 10665, - "ibraltar": 84796, - "ibraries": 72616, - "ibrary": 27666, - "ibrate": 43092, - "ibrated": 60566, - "ibration": 18350, - "ibrator": 84894, - "ibre": 63591, - "ibri": 57834, - "ibs": 54341, - "ibt": 20319, - "ibu": 56982, - "ibur": 85198, - "ibus": 33395, - "ic": 292, - "ica": 3001, - "icable": 74338, - "icago": 9440, - "icaid": 31484, - "ical": 938, - "ically": 2673, - "icals": 52603, - "icamente": 51677, - "ican": 7065, - "icana": 98505, - "icans": 37373, - "icao": 36982, - "icap": 97350, - "icare": 80038, - "icas": 15185, - "icast": 35446, - "icate": 8463, - "icated": 10089, - "icates": 24821, - "ication": 20285, - "icator": 13254, - "icators": 42052, - "icação": 96192, - "icc": 47638, - "ice": 558, - "iced": 7572, - "icemail": 86283, - "icens": 6314, - "icense": 1545, - "icensed": 7296, - "icensing": 23411, - "iceps": 74569, - "icer": 12999, - "icerca": 72662, - "icers": 34980, - "ices": 1216, - "icester": 50677, - "ich": 713, - "ichTextBox": 52459, - "icha": 61387, - "ichael": 59708, - "ichage": 72165, - "iche": 12063, - "ichel": 90240, - "ichen": 28324, - "icher": 28064, - "ichern": 88581, - "ichert": 92473, - "ichever": 45569, - "ichi": 40552, - "ichick": 98599, - "ichier": 62796, - "icho": 77115, - "icht": 4865, - "ichte": 37347, - "ichten": 28698, - "ichtet": 89730, - "ichtig": 34966, - "ici": 3375, - "icia": 24024, - "icial": 7090, - "ician": 12452, - "icians": 9621, - "iciar": 72451, - "iciary": 26813, - "icias": 49685, - "icide": 14502, - "icides": 75095, - "icie": 76277, - "iciel": 77393, - "iciencies": 42590, - "iciency": 10387, - "icient": 5385, - "iciente": 65680, - "icients": 28142, - "icies": 44339, - "icina": 72865, - "icine": 54003, - "icing": 10124, - "icio": 11267, - "icion": 13898, - "icional": 62793, - "icionar": 53793, - "iciones": 41224, - "icions": 77110, - "icios": 25345, - "icious": 9627, - "icip": 8442, - "icipant": 21757, - "icipants": 27925, - "icipation": 76353, - "icism": 41814, - "icit": 18677, - "icits": 50550, - "icity": 61691, - "ición": 25742, - "ick": 865, - "icked": 18504, - "icken": 9692, - "icker": 5215, - "ickerView": 76256, - "ickers": 39089, - "ickest": 69752, - "icket": 5897, - "ickets": 17480, - "ickey": 74939, - "icking": 16272, - "ickle": 25606, - "ickname": 41052, - "ickness": 25900, - "icks": 5788, - "ickt": 70980, - "icky": 18964, - "icl": 87367, - "iclass": 69503, - "icle": 2002, - "icles": 4342, - "icmp": 50774, - "ico": 3955, - "icode": 13634, - "icol": 26463, - "icolon": 38517, - "icolor": 73809, - "icom": 53994, - "icon": 1924, - "iconductor": 51492, - "icone": 36173, - "icons": 10670, - "icont": 51160, - "icontains": 99029, - "icontrol": 77006, - "icopt": 23951, - "icopter": 87223, - "icorn": 50356, - "icos": 16627, - "icot": 86437, - "icro": 2754, - "icrobial": 81959, - "icrosoft": 3929, - "icrous": 83189, - "ics": 1211, - "ict": 849, - "icted": 12770, - "icter": 79639, - "ictim": 51144, - "iction": 2479, - "ictionaries": 44192, - "ictionary": 3916, - "ictions": 21439, - "ictory": 90033, - "icts": 29995, - "icture": 3826, - "ictureBox": 10201, - "ictured": 29275, - "ictures": 7489, - "icular": 23632, - "icularly": 48157, - "iculo": 32653, - "iculos": 67277, - "icult": 3866, - "icultural": 52815, - "iculture": 92728, - "iculty": 25990, - "icum": 85131, - "icus": 58244, - "icut": 27306, - "icy": 2842, - "icycle": 26165, - "icz": 52222, - "id": 307, - "idUser": 99100, - "ida": 4744, - "idable": 36754, - "idad": 5845, - "idade": 9075, - "idades": 13596, - "idak": 60389, - "idal": 25880, - "idan": 55204, - "idar": 92902, - "idas": 17015, - "idata": 81080, - "iday": 48878, - "idd": 1772, - "idden": 2854, - "idders": 99129, - "idding": 26500, - "iddle": 3310, - "iddled": 87762, - "iddles": 77455, - "iddleware": 11603, - "iddy": 75570, - "ide": 577, - "idea": 41777, - "ideal": 62953, - "ideas": 93684, - "idebar": 12683, - "ided": 4490, - "idel": 26802, - "idelberg": 91919, - "idelity": 45101, - "iden": 12487, - "idenav": 49263, - "idence": 7087, - "idences": 83996, - "idency": 25775, - "idend": 68850, - "ident": 1713, - "idental": 61623, - "identally": 56122, - "idente": 96278, - "idential": 11234, - "identification": 91577, - "identified": 42260, - "identifier": 15909, - "identify": 80396, - "identity": 16912, - "idents": 6880, - "ideo": 1888, - "ideographic": 94007, - "ideon": 99142, - "ideos": 5188, - "idepress": 58833, - "ider": 1776, - "iders": 13269, - "ides": 3341, - "ideshow": 44700, - "idf": 77004, - "idge": 6478, - "idges": 29163, - "idget": 2006, - "idi": 12278, - "idia": 86700, - "idian": 35642, - "idine": 89973, - "iding": 6577, - "idious": 79127, - "idis": 84242, - "idity": 18518, - "idl": 55464, - "idle": 47273, - "ido": 5249, - "idon": 90456, - "idor": 28756, - "idores": 80421, - "idos": 13349, - "idot": 93269, - "ids": 3365, - "idth": 1104, - "idual": 3340, - "idue": 60607, - "idunt": 56043, - "idx": 6361, - "idy": 42586, - "idée": 131742, - "ie": 645, - "ieber": 60241, - "iec": 66492, - "iece": 9108, - "ieces": 29765, - "iect": 91542, - "ied": 1122, - "iedad": 39029, - "iedade": 95166, - "iedades": 73913, - "ieder": 22181, - "iedo": 87051, - "iedy": 81619, - "ieee": 82154, - "ief": 4738, - "iefs": 29821, - "ieg": 35010, - "iegel": 74947, - "iego": 62287, - "iei": 75999, - "iej": 56547, - "iek": 35007, - "iel": 13029, - "ield": 816, - "ielding": 98992, - "ields": 6907, - "iele": 24619, - "iem": 26862, - "iembre": 53471, - "ieme": 88030, - "ien": 3591, - "iena": 86651, - "ience": 1835, - "iences": 11975, - "ienda": 77921, - "iendo": 36016, - "iene": 42568, - "ienen": 31261, - "ienes": 56862, - "ienia": 51458, - "ienie": 74322, - "ienne": 25503, - "iens": 79363, - "ient": 1167, - "iente": 12844, - "ientes": 26240, - "iento": 10873, - "ientos": 31960, - "ientras": 49892, - "ients": 4075, - "ienza": 65502, - "ier": 1268, - "iera": 25834, - "ieran": 81381, - "ierarchical": 98950, - "ierarchy": 33880, - "ierce": 88968, - "iere": 18849, - "ieren": 16030, - "ieres": 64488, - "ierge": 86003, - "ieri": 53939, - "iero": 43588, - "ieron": 39508, - "ierre": 44423, - "ierrez": 95080, - "iers": 4813, - "iership": 76078, - "iert": 17029, - "ierte": 65161, - "ierten": 77399, - "ierung": 36616, - "ierz": 65343, - "ies": 550, - "iese": 81053, - "iesel": 82130, - "iesen": 93840, - "iest": 13438, - "iesta": 58449, - "iesz": 49806, - "iet": 3891, - "iete": 66860, - "ieten": 33254, - "ietet": 56908, - "ietf": 74068, - "ieties": 31506, - "iets": 80781, - "ieu": 25173, - "ieur": 60905, - "ieurs": 45038, - "ieux": 52719, - "iev": 43091, - "ieval": 31886, - "ieve": 19155, - "ieved": 30977, - "iever": 81021, - "ieves": 38135, - "ieving": 83346, - "iew": 570, - "iez": 73366, - "ież": 55723, - "ieÅĦ": 130694, - "if": 333, - "ifa": 33818, - "iface": 52674, - "ifact": 20754, - "ifacts": 26401, - "ifar": 92927, - "ifax": 53617, - "ifdef": 34732, - "ife": 1612, - "ifecycle": 19517, - "ifen": 55339, - "ifer": 11437, - "iferay": 33204, - "ifers": 98813, - "ifes": 82295, - "ifest": 6962, - "ifestyle": 16479, - "ifestyles": 72525, - "ifetime": 28515, - "iff": 3092, - "iffany": 55082, - "iffe": 43414, - "iffer": 14320, - "ifference": 18192, - "ifferences": 58326, - "ifferent": 18277, - "ifferential": 68657, - "iffies": 80571, - "iffin": 83864, - "iffs": 18852, - "ifi": 12919, - "ifiable": 22619, - "ifiant": 83454, - "ific": 1086, - "ifica": 29488, - "ificacion": 37703, - "ificaciones": 89086, - "ificación": 52407, - "ificado": 47138, - "ificador": 54900, - "ificados": 90762, - "ificance": 99004, - "ificant": 33728, - "ificantly": 97764, - "ificar": 23244, - "ificate": 9261, - "ificates": 24405, - "ification": 2404, - "ifications": 7029, - "ificação": 81451, - "ifice": 21898, - "ificent": 36143, - "ificial": 16488, - "ificio": 92638, - "ifie": 56509, - "ified": 1870, - "ifier": 3049, - "ifiers": 11836, - "ifies": 9606, - "ifik": 48672, - "ifikasi": 77350, - "ifique": 51660, - "ifix": 96322, - "ifié": 89759, - "ifle": 19092, - "iflower": 76773, - "ifndef": 56919, - "ifo": 31497, - "ifold": 48285, - "iform": 7250, - "iforn": 6417, - "ifornia": 6574, - "ifr": 96716, - "iframe": 23207, - "ifs": 21835, - "ifstream": 49497, - "ift": 2085, - "ifter": 37700, - "ifth": 57610, - "ifting": 17680, - "ifton": 90261, - "ifty": 38624, - "ifu": 20850, - "iful": 4985, - "ify": 1437, - "ifying": 7766, - "ig": 343, - "igDecimal": 30183, - "igInteger": 47950, - "iga": 16551, - "igail": 84206, - "igan": 10881, - "igans": 75757, - "igar": 51284, - "igaret": 43275, - "igate": 63956, - "igated": 82241, - "igation": 17930, - "igator": 57082, - "igators": 64983, - "ige": 7256, - "igel": 49539, - "igen": 6433, - "igenous": 25354, - "iger": 7272, - "igeria": 63717, - "igers": 32114, - "iges": 51663, - "igest": 15153, - "igg": 20218, - "igger": 4500, - "iggers": 21385, - "iggins": 51926, - "iggs": 61147, - "igh": 1090, - "igham": 85222, - "ighb": 4681, - "ighbor": 19247, - "ighborhood": 46185, - "ighbors": 24101, - "ighbour": 46818, - "ighbours": 52117, - "ighest": 7504, - "ighet": 81508, - "ight": 491, - "ighted": 64507, - "ighter": 85200, - "ighth": 21877, - "ighthouse": 57909, - "ighting": 44750, - "ightly": 71948, - "ighton": 87773, - "ights": 2796, - "igi": 29537, - "igid": 20926, - "igidBody": 69181, - "igidbody": 29690, - "igin": 9143, - "iginal": 11040, - "igion": 31618, - "igious": 22153, - "igit": 12597, - "igital": 10233, - "igits": 18667, - "igkeit": 50499, - "igli": 76161, - "iglia": 79996, - "igm": 24129, - "igma": 11491, - "igmat": 97571, - "igmatic": 98730, - "igmoid": 52111, - "ign": 622, - "ignKey": 13466, - "ignal": 25719, - "ignant": 58010, - "igne": 18857, - "igned": 1542, - "igner": 77656, - "ignet": 84858, - "ignite": 95408, - "ignment": 3531, - "ignon": 61699, - "ignore": 13130, - "ignored": 58471, - "ignty": 42743, - "ignum": 92160, - "igo": 7836, - "igon": 73881, - "igor": 69970, - "igos": 32239, - "igr": 5233, - "igram": 49127, - "igrams": 83109, - "igrant": 56019, - "igrants": 70236, - "igraph": 53867, - "igraphy": 92070, - "igrate": 34479, - "igrated": 94830, - "igration": 5033, - "igrationBuilder": 52255, - "igrations": 17824, - "igroup": 74658, - "igs": 14462, - "igsaw": 86924, - "igslist": 48922, - "igt": 17917, - "igte": 92172, - "igth": 89690, - "igu": 26745, - "igua": 90746, - "igue": 21945, - "iguiente": 89776, - "igung": 42603, - "iguous": 27029, - "igure": 9811, - "igy": 92493, - "ih": 6996, - "ihad": 30613, - "ihan": 56888, - "ihanna": 78357, - "ihar": 71641, - "ihat": 80877, - "ihil": 51426, - "ihilation": 91241, - "ihn": 90550, - "ihu": 81884, - "ii": 3808, - "iid": 54483, - "iii": 34594, - "ij": 3172, - "ija": 28130, - "ijd": 32223, - "ije": 31276, - "iji": 34873, - "ijing": 23649, - "ijk": 18750, - "ijke": 50405, - "ijken": 56902, - "ijkl": 59779, - "ijkstra": 87177, - "ijn": 14153, - "ijo": 46900, - "iju": 63174, - "ik": 1579, - "ika": 11496, - "ikal": 87460, - "ikan": 22222, - "ike": 2970, - "iked": 42608, - "ikel": 28855, - "iken": 36433, - "iker": 24803, - "ikers": 53113, - "ikes": 12450, - "ikh": 30503, - "ikhail": 82256, - "iki": 7570, - "iking": 19233, - "ikip": 14628, - "ikipedia": 14939, - "ikit": 60403, - "ikk": 29887, - "ikki": 83541, - "iko": 23630, - "ikon": 61614, - "iks": 67891, - "ikt": 31580, - "iktig": 96433, - "iku": 38242, - "ikut": 88994, - "il": 321, - "ila": 10524, - "ilage": 86976, - "ilan": 89359, - "iland": 78691, - "ilar": 3569, - "ilarity": 48225, - "ilate": 75357, - "ilated": 92483, - "ilater": 90795, - "ilateral": 42939, - "ilation": 13455, - "ild": 695, - "ilda": 55161, - "ilde": 34276, - "ilded": 90254, - "ilden": 51865, - "ildenafil": 65086, - "ilder": 20776, - "ildo": 29945, - "ile": 457, - "ileaks": 83964, - "iled": 2181, - "ilee": 63066, - "ileen": 90694, - "ilege": 42769, - "ileged": 68431, - "ileges": 70838, - "ilen": 22837, - "ilename": 4033, - "ilenames": 52768, - "ilent": 68414, - "ileo": 84134, - "iler": 5769, - "ilers": 27158, - "iles": 3658, - "iless": 72141, - "ilestone": 93028, - "ilet": 20619, - "iley": 17801, - "ilha": 84110, - "ili": 3921, - "ilia": 24078, - "ilian": 68083, - "ilians": 25625, - "iliar": 9538, - "iliary": 34446, - "iliate": 34850, - "iliated": 53773, - "iliation": 28009, - "ilib": 29959, - "ilibrium": 45680, - "ilies": 7597, - "ilig": 73276, - "ilight": 34900, - "ilih": 46968, - "ilihan": 87162, - "ilik": 96159, - "iliki": 65023, - "iline": 26560, - "ilinear": 70933, - "iling": 7979, - "ilingual": 49823, - "ilinx": 98033, - "ilio": 33329, - "ilion": 48912, - "ilit": 3664, - "ilitary": 20247, - "ilitating": 75154, - "ilitation": 32849, - "ilities": 4298, - "ility": 1403, - "ilk": 33163, - "ill": 483, - "illa": 6241, - "illac": 63287, - "illage": 47064, - "illance": 18832, - "illard": 66259, - "illary": 34505, - "illas": 33244, - "illation": 66084, - "illator": 70084, - "illaume": 98012, - "ille": 4517, - "illed": 4374, - "illegal": 75998, - "iller": 15252, - "illery": 35369, - "illes": 30255, - "illet": 40884, - "illez": 67390, - "illi": 57168, - "illian": 64721, - "illin": 60497, - "illing": 9400, - "illion": 14726, - "illions": 90287, - "illis": 56212, - "illisecond": 65358, - "illiseconds": 56194, - "illo": 21782, - "illon": 42488, - "illos": 64937, - "illow": 95923, - "ills": 3305, - "illum": 76565, - "illus": 86337, - "illusion": 81162, - "illustr": 82618, - "illy": 14385, - "illé": 139041, - "ilm": 9484, - "ilmington": 74534, - "ilmiÅŁ": 133021, - "ilo": 18045, - "iloc": 25953, - "ilog": 50773, - "ilogue": 90492, - "ilogy": 40058, - "ilon": 16917, - "ilor": 49538, - "ilos": 89319, - "ilot": 23958, - "ils": 8669, - "ilst": 19282, - "ilt": 2963, - "ilter": 2044, - "ilters": 8612, - "ilton": 16296, - "iltr": 36604, - "iltro": 46120, - "ilty": 15054, - "ilver": 47030, - "ily": 1541, - "ilyn": 68482, - "im": 318, - "ima": 7523, - "imachinery": 70355, - "imag": 28016, - "image": 1805, - "imageName": 79778, - "imageUrl": 67673, - "imageView": 70245, - "imagem": 84696, - "imagen": 39347, - "imagenes": 85285, - "images": 3642, - "imagin": 79124, - "imal": 2861, - "imals": 24163, - "iman": 39210, - "imap": 39942, - "imar": 87356, - "imary": 3111, - "imas": 49363, - "imat": 77332, - "imate": 3426, - "imated": 7145, - "imately": 7108, - "imates": 47471, - "imating": 78348, - "imation": 5465, - "imations": 96376, - "imator": 13689, - "imators": 71036, - "imax": 75109, - "imb": 20828, - "imbabwe": 43181, - "imbledon": 84663, - "imbus": 95216, - "imd": 87493, - "imdi": 127540, - "ime": 545, - "imeInterval": 80932, - "imeType": 34872, - "imed": 75485, - "imedia": 26936, - "imei": 97861, - "imeline": 54147, - "imen": 26144, - "imens": 45597, - "imension": 18161, - "imensional": 28221, - "iment": 3819, - "imentary": 74543, - "imenti": 83297, - "imento": 15027, - "imentos": 55273, - "iments": 12558, - "imeo": 50888, - "imer": 3134, - "imers": 67897, - "imes": 1733, - "imest": 4255, - "imestamp": 4702, - "imestep": 48747, - "imesteps": 76632, - "imestone": 35441, - "imet": 85266, - "imeter": 25334, - "imeters": 54236, - "imetype": 72777, - "img": 1892, - "imgs": 58575, - "imi": 24836, - "imid": 98494, - "imiento": 16320, - "imientos": 44962, - "imilar": 78862, - "imin": 60234, - "iminal": 8150, - "iminary": 77873, - "iming": 59076, - "imir": 30104, - "imit": 2353, - "imited": 31511, - "imiter": 17700, - "imiters": 67645, - "imitive": 13654, - "imitives": 35209, - "imits": 22866, - "imity": 30935, - "imité": 98381, - "imization": 65964, - "imize": 11853, - "imizeBox": 64534, - "imized": 45706, - "imizer": 41699, - "imm": 12543, - "immel": 64864, - "immer": 18982, - "immers": 72583, - "imming": 40033, - "immune": 69055, - "immutable": 91240, - "imo": 11366, - "imon": 25417, - "imonial": 49325, - "imonials": 57335, - "imony": 64456, - "imore": 21382, - "imos": 24107, - "imoto": 96158, - "imp": 6664, - "impact": 57300, - "impan": 89888, - "impl": 6383, - "imple": 6456, - "implement": 94474, - "implementation": 14369, - "implemented": 54071, - "implements": 93958, - "implicit": 30940, - "implicitly": 87295, - "implified": 73837, - "implify": 70206, - "implode": 55577, - "import": 474, - "importDefault": 86479, - "important": 15333, - "importe": 93796, - "imports": 62888, - "imps": 66658, - "impse": 39427, - "ims": 5742, - "imshow": 65447, - "imson": 45445, - "imu": 78326, - "imulation": 60361, - "imulator": 91503, - "imum": 3295, - "imus": 76928, - "imuth": 55207, - "in": 258, - "ina": 2210, - "inactive": 61137, - "inaire": 67876, - "inal": 977, - "inalg": 33231, - "inality": 80777, - "inally": 37645, - "inals": 23695, - "iname": 79856, - "inan": 73176, - "inance": 24387, - "inand": 75731, - "inant": 85296, - "inar": 13762, - "inars": 46337, - "inary": 3287, - "inas": 20114, - "inate": 3277, - "inated": 15479, - "inati": 97040, - "inating": 15873, - "ination": 2554, - "inations": 12634, - "inator": 17272, - "inbox": 84699, - "inburgh": 36786, - "inc": 2840, - "incare": 65903, - "ince": 1701, - "incer": 69798, - "incerely": 86091, - "inces": 30076, - "incess": 19570, - "inceton": 41590, - "inch": 36750, - "inci": 48597, - "incible": 76872, - "incident": 75011, - "incinn": 31997, - "incinnati": 32176, - "incip": 5706, - "incipal": 15702, - "inciple": 15996, - "incl": 91157, - "include": 997, - "included": 82622, - "includes": 14526, - "including": 16169, - "inclusive": 98361, - "income": 56966, - "incoming": 79677, - "incorrect": 61954, - "incr": 98428, - "incre": 42742, - "increase": 78501, - "increment": 35744, - "increments": 56437, - "inct": 7800, - "inction": 21362, - "inctions": 73590, - "incy": 75586, - "ind": 484, - "inda": 17416, - "inde": 26976, - "inded": 16593, - "inden": 58217, - "indent": 32840, - "inder": 5744, - "indered": 82203, - "inders": 31451, - "index": 1252, - "indexOf": 29849, - "indexPath": 18887, - "indexed": 97473, - "indexes": 71227, - "indh": 65989, - "indhoven": 82058, - "indi": 28685, - "indic": 85084, - "indicator": 56151, - "indice": 73417, - "indices": 14987, - "inding": 3961, - "individual": 54877, - "indle": 57763, - "indo": 34999, - "indow": 985, - "indows": 1491, - "indr": 80587, - "indre": 70833, - "indrical": 62406, - "indrome": 36058, - "inds": 8673, - "indsay": 53977, - "indsight": 78860, - "industry": 70764, - "indx": 86707, - "indy": 48990, - "ine": 482, - "ineTransform": 49781, - "inea": 34418, - "inear": 88921, - "inecraft": 12086, - "ined": 1589, - "inee": 84799, - "inel": 29708, - "inely": 22094, - "inem": 68413, - "inema": 93423, - "inement": 37184, - "inen": 16676, - "inent": 13847, - "iner": 10453, - "inerary": 51553, - "iners": 39699, - "inery": 16323, - "ines": 1543, - "inese": 7346, - "inesis": 82789, - "iness": 1880, - "inet": 29876, - "inez": 38295, - "inf": 13573, - "infeld": 98836, - "infer": 89559, - "infile": 74833, - "infinity": 80016, - "inflate": 37455, - "info": 2733, - "inform": 40440, - "informatics": 97488, - "information": 25069, - "infos": 55965, - "infra": 92317, - "ing": 287, - "inge": 17707, - "inged": 56558, - "ingen": 27918, - "inger": 5137, - "ingerprint": 47918, - "ingers": 14105, - "inges": 40399, - "ingga": 65401, - "ingham": 23246, - "inging": 24030, - "ingle": 2173, - "ingles": 49603, - "ingleton": 75710, - "ingly": 11307, - "ingo": 27908, - "ingredient": 38525, - "ingredients": 38120, - "ingroup": 41281, - "ings": 819, - "ingt": 74919, - "ington": 4805, - "ingu": 12810, - "ingular": 41880, - "inh": 20868, - "inha": 43238, - "inherit": 12825, - "inheritDoc": 32469, - "inheritdoc": 21047, - "inherits": 77836, - "inho": 27576, - "ini": 6591, - "inia": 90450, - "inic": 92335, - "inicio": 64053, - "inidad": 68155, - "inin": 64444, - "inine": 82234, - "ining": 5740, - "inion": 36300, - "inions": 83896, - "inis": 84603, - "inish": 18176, - "inished": 24657, - "init": 2327, - "initWith": 24214, - "inite": 15856, - "initely": 7475, - "initial": 9426, - "initialize": 21641, - "initialized": 36161, - "initializer": 46774, - "inition": 4054, - "inity": 13489, - "inium": 63890, - "iniz": 69639, - "inja": 41420, - "inject": 32133, - "ink": 766, - "inka": 74122, - "inke": 95873, - "inkel": 81176, - "inker": 41112, - "inki": 49409, - "inking": 15736, - "inkle": 35144, - "inks": 15504, - "inky": 38034, - "inline": 5057, - "inn": 6130, - "innacle": 68953, - "innamon": 39335, - "inne": 93232, - "inned": 20561, - "innen": 34711, - "inner": 4382, - "innerHTML": 15609, - "innerText": 55017, - "inness": 70673, - "innie": 98189, - "inning": 19770, - "innitus": 97339, - "ino": 3313, - "inoa": 78994, - "inode": 52239, - "inois": 16669, - "inos": 15215, - "inosaur": 88147, - "inous": 60698, - "inox": 73079, - "inp": 42092, - "input": 1355, - "inputEmail": 97232, - "inputs": 24941, - "inq": 5885, - "inqu": 52888, - "ins": 1330, - "inscription": 98546, - "insert": 4208, - "insi": 31284, - "insic": 27592, - "insics": 67102, - "inside": 41350, - "insk": 88392, - "inski": 52877, - "insky": 51441, - "insn": 85817, - "inson": 28873, - "inspace": 30313, - "inspect": 82054, - "inspection": 53395, - "inst": 6308, - "instagram": 46266, - "install": 12248, - "installation": 80816, - "installed": 49573, - "installer": 63216, - "instanc": 33005, - "instance": 4851, - "instances": 47825, - "instancetype": 33684, - "instant": 85158, - "instead": 64837, - "instein": 36394, - "institution": 81309, - "inston": 38505, - "instr": 60511, - "instruction": 54974, - "instructions": 62295, - "instrument": 66368, - "insula": 35373, - "insurance": 69954, - "int": 396, - "intColor": 38492, - "intValue": 46040, - "inta": 33469, - "intage": 16153, - "inte": 45329, - "integer": 11662, - "integr": 80729, - "integral": 81035, - "integration": 60168, - "intel": 79543, - "intelligence": 92275, - "intendent": 43402, - "intendo": 20323, - "intent": 56431, - "inter": 2245, - "interaction": 68075, - "interactive": 37540, - "interest": 12724, - "interested": 83698, - "interesting": 87557, - "interface": 4970, - "interfaces": 28965, - "intern": 55444, - "internal": 10481, - "international": 97597, - "internet": 85743, - "interop": 31068, - "interopRequire": 32899, - "interopRequireDefault": 35364, - "interp": 63721, - "interpre": 74714, - "interpret": 16897, - "interpreted": 93461, - "interpreter": 90554, - "interrupt": 54805, - "inters": 49940, - "intersect": 96018, - "intersection": 73648, - "interval": 27904, - "intestinal": 70458, - "inth": 47021, - "intl": 97642, - "into": 18122, - "inton": 7306, - "intosh": 61594, - "intptr": 91091, - "intr": 58788, - "intree": 88583, - "intro": 36442, - "intros": 94728, - "ints": 21042, - "intval": 57602, - "inté": 133889, - "intégr": 133890, - "intér": 136207, - "intérieur": 134920, - "intérêt": 136208, - "inue": 6232, - "inus": 70856, - "inux": 19559, - "inv": 14057, - "invalid": 11808, - "invalidate": 90835, - "inventory": 31093, - "inverse": 61482, - "invert": 83729, - "invest": 42014, - "investment": 96012, - "invisible": 90751, - "invitation": 97530, - "invite": 56279, - "invoice": 22217, - "invoices": 88596, - "invoke": 22430, - "inx": 20014, - "iny": 6441, - "inya": 61087, - "inyin": 61505, - "inz": 40522, - "io": 815, - "ioc": 73352, - "ioctl": 76704, - "iod": 3127, - "iode": 94726, - "iol": 24903, - "iola": 80439, - "iolet": 30912, - "iological": 40214, - "iology": 30126, - "iom": 33595, - "iomanip": 59623, - "ioms": 90169, - "ion": 290, - "iona": 41690, - "ionage": 63690, - "ional": 3914, - "ionale": 55697, - "ionales": 82423, - "ionario": 48466, - "ionate": 84899, - "ione": 6339, - "ioned": 96557, - "ioneer": 55398, - "iones": 11431, - "ioni": 18820, - "ionic": 20764, - "ions": 908, - "ior": 2462, - "iore": 86007, - "iores": 45796, - "iors": 21867, - "ios": 3530, - "iosa": 66617, - "iosis": 90160, - "iosity": 32179, - "iosk": 74917, - "ioso": 58448, - "iostream": 9665, - "iot": 11098, - "iotic": 61014, - "iotics": 82200, - "iou": 98255, - "ious": 1223, - "iously": 13307, - "iov": 30835, - "iox": 23691, - "ioxid": 41551, - "ioxide": 36801, - "ip": 573, - "ipa": 85150, - "ipated": 62232, - "ipation": 48586, - "ipay": 43912, - "ipc": 68281, - "ipe": 3444, - "iped": 31721, - "ipeg": 46884, - "ipel": 81079, - "ipeline": 8790, - "ipelines": 93997, - "iper": 12858, - "ipers": 58835, - "ipes": 8923, - "iph": 15261, - "ipher": 10558, - "ipheral": 23298, - "ipherals": 68972, - "iphers": 82077, - "iphertext": 45043, - "iphery": 93548, - "iphone": 53359, - "iphy": 60230, - "ipi": 90921, - "ipient": 14117, - "ipients": 47647, - "iping": 46095, - "ipl": 10352, - "iple": 3778, - "iples": 37458, - "iplina": 82721, - "iplinary": 43450, - "ipline": 47429, - "ipmap": 50428, - "ipment": 5402, - "ipo": 6943, - "ipop": 79382, - "ipp": 2807, - "ipped": 6450, - "ippers": 31897, - "ippet": 21581, - "ippets": 42870, - "ippi": 24255, - "ippines": 63906, - "ipping": 5654, - "ipple": 51164, - "ipples": 50560, - "ippo": 87353, - "ippy": 45749, - "ipro": 48789, - "ips": 3077, - "ipse": 27332, - "ipsis": 47402, - "ipsoid": 96321, - "ipt": 11442, - "iptables": 95289, - "ipur": 71877, - "ipv": 42676, - "ipy": 22947, - "ipzig": 56200, - "iq": 23740, - "iqu": 5011, - "ique": 2372, - "iquement": 80135, - "iquer": 71584, - "iques": 8303, - "iqueta": 97110, - "iquid": 31989, - "iqué": 75266, - "ir": 404, - "ira": 8832, - "irable": 24966, - "iral": 36378, - "iram": 66708, - "iran": 54690, - "iras": 50085, - "irate": 88340, - "irates": 24557, - "iration": 19629, - "irc": 2437, - "ircle": 7074, - "ircles": 74263, - "ircon": 88276, - "ircraft": 12615, - "ircuit": 37268, - "ircular": 21472, - "ird": 2603, - "ire": 554, - "irebase": 13341, - "ireccion": 31505, - "irect": 1226, - "irected": 74612, - "irection": 2866, - "irectional": 44670, - "irector": 65476, - "irectory": 4758, - "ired": 2690, - "irement": 46568, - "iren": 46335, - "ires": 3861, - "irez": 59736, - "iri": 20679, - "irical": 66866, - "irie": 61216, - "irim": 61372, - "iring": 6191, - "iris": 41946, - "irit": 6906, - "iriÅŁ": 127045, - "irk": 14136, - "irl": 2811, - "irlines": 24536, - "irling": 50768, - "irm": 2853, - "irma": 44011, - "irmed": 8434, - "irmingham": 32600, - "irms": 14404, - "irmware": 53260, - "iro": 8698, - "iron": 2475, - "iropr": 54987, - "iros": 47228, - "irq": 16329, - "irror": 28812, - "irs": 16838, - "irsch": 81865, - "irse": 82614, - "irst": 864, - "irt": 2106, - "irteen": 44904, - "irth": 4809, - "irthday": 19951, - "irting": 66939, - "irts": 19666, - "irtschaft": 61811, - "irtual": 2901, - "irty": 16531, - "irus": 16972, - "irut": 86305, - "iry": 33770, - "irá": 83562, - "is": 285, - "isActive": 31814, - "isAdmin": 72658, - "isArray": 67113, - "isChecked": 53882, - "isContained": 80469, - "isEmpty": 18972, - "isEnabled": 74452, - "isEqual": 97886, - "isEqualTo": 32651, - "isFunction": 94144, - "isLoading": 54584, - "isLoggedIn": 93968, - "isNaN": 43958, - "isNew": 59333, - "isNull": 66811, - "isObject": 88633, - "isOk": 79274, - "isOpen": 63837, - "isRequired": 68542, - "isSelected": 21753, - "isValid": 29192, - "isVisible": 72632, - "isa": 10761, - "isable": 81485, - "isan": 17132, - "isans": 66399, - "isas": 85934, - "isateur": 32126, - "isation": 7923, - "isations": 55176, - "isbn": 66438, - "isbury": 84606, - "isc": 3427, - "iscal": 15787, - "iscard": 47560, - "isce": 89268, - "isch": 16053, - "ische": 10559, - "ischen": 17739, - "ischer": 32708, - "isches": 86957, - "isci": 92286, - "iscing": 52754, - "isclosed": 73690, - "isco": 9464, - "iscopal": 85205, - "iscrim": 41610, - "iscrimination": 85913, - "isd": 20640, - "isdiction": 25623, - "isdigit": 69829, - "ise": 1064, - "isease": 55307, - "isecond": 45866, - "iseconds": 16683, - "ised": 4056, - "isel": 65294, - "iselect": 74310, - "isempty": 46064, - "isen": 23129, - "iser": 12059, - "isers": 61280, - "ises": 4909, - "iset": 49189, - "iseum": 93465, - "isex": 75253, - "ish": 812, - "isha": 34940, - "ished": 3304, - "isher": 38572, - "ishes": 20527, - "ishi": 38376, - "ishing": 10976, - "ishlist": 48211, - "ishly": 64823, - "ishment": 16025, - "ishments": 98953, - "ishop": 20158, - "ishops": 50109, - "isi": 13229, - "isia": 47939, - "isible": 23066, - "isicing": 55946, - "isiert": 87481, - "isify": 90293, - "isin": 57404, - "ising": 3791, - "ision": 1816, - "isions": 6805, - "isis": 9479, - "isión": 70255, - "isk": 3187, - "iska": 48560, - "iske": 32209, - "iskey": 46090, - "isko": 68543, - "isks": 92834, - "isky": 70704, - "isl": 22457, - "islation": 58221, - "isle": 40105, - "ism": 2142, - "isma": 38152, - "isman": 62570, - "ismatch": 24976, - "ismatic": 56145, - "isme": 43518, - "ismet": 90158, - "ismic": 54094, - "ismo": 17001, - "isms": 13664, - "isnan": 78129, - "iso": 15420, - "isode": 6549, - "isodes": 14739, - "isoft": 61018, - "isol": 59923, - "ison": 3335, - "isoner": 97020, - "isons": 19379, - "isor": 15841, - "isors": 41214, - "isory": 85903, - "isos": 69304, - "isp": 13090, - "ispens": 53620, - "isper": 27370, - "ispers": 68835, - "isphere": 46794, - "ispiel": 68057, - "isplay": 2316, - "isposable": 46907, - "isque": 95543, - "iss": 1038, - "issa": 21429, - "issan": 33097, - "issance": 23965, - "issant": 65162, - "isse": 15398, - "issement": 49653, - "issen": 36964, - "issenschaft": 79748, - "issent": 78638, - "isser": 73233, - "isses": 84360, - "isset": 4888, - "isseur": 73508, - "issing": 13577, - "ission": 7558, - "issional": 89580, - "issions": 16528, - "issippi": 26035, - "isson": 48263, - "issor": 70350, - "issors": 41622, - "isspace": 81770, - "issue": 11159, - "issued": 58226, - "issuer": 66817, - "issues": 18427, - "issy": 60215, - "ist": 380, - "ista": 9087, - "istan": 8944, - "istance": 3924, - "istani": 39322, - "istant": 11202, - "istar": 83474, - "istas": 26673, - "iste": 16776, - "isted": 13236, - "istem": 66421, - "istema": 41448, - "isten": 37122, - "istence": 80524, - "istencia": 88200, - "istency": 47094, - "istent": 18128, - "ister": 1571, - "isters": 9303, - "istes": 74360, - "isti": 61517, - "istic": 4532, - "istica": 86259, - "istical": 39496, - "istically": 37110, - "istics": 5589, - "istik": 95393, - "istine": 53065, - "isting": 11083, - "istingu": 71169, - "istinguish": 88647, - "istinguished": 79282, - "istique": 96396, - "istle": 28300, - "istles": 65943, - "isto": 25339, - "istogram": 28499, - "istol": 91768, - "iston": 58819, - "istor": 5323, - "istorical": 95698, - "istory": 2579, - "istr": 3758, - "istra": 74963, - "istrar": 34765, - "istrate": 60301, - "istrates": 93100, - "istration": 4048, - "istrator": 18690, - "istream": 40633, - "istrib": 4789, - "istribute": 80133, - "istributed": 25146, - "istribution": 13107, - "istributions": 17994, - "istributor": 78388, - "istrict": 8391, - "istring": 73756, - "istringstream": 82416, - "istro": 15561, - "istros": 81950, - "istry": 4944, - "ists": 1671, - "istung": 83214, - "isty": 87523, - "isu": 62748, - "isure": 32137, - "iswa": 67220, - "isy": 28013, - "isz": 69728, - "isé": 67968, - "isée": 137123, - "it": 275, - "ita": 6255, - "itable": 15368, - "itably": 34668, - "itag": 94540, - "itage": 18443, - "itaire": 59124, - "ital": 2174, - "italic": 34406, - "italize": 34313, - "itals": 16265, - "itamin": 75552, - "itan": 12849, - "itant": 50944, - "itar": 12355, - "itarian": 20030, - "itary": 44806, - "itas": 21226, - "itat": 47777, - "itate": 19652, - "itated": 32237, - "itates": 81729, - "itating": 49544, - "itation": 7556, - "itational": 49824, - "itations": 30667, - "itative": 21312, - "itbart": 49199, - "itch": 1610, - "itched": 92403, - "itchen": 7454, - "itchens": 48621, - "itches": 25220, - "ite": 632, - "iteDatabase": 54251, - "itech": 60782, - "itect": 8360, - "itecture": 41134, - "ited": 1608, - "iteit": 68519, - "itel": 56643, - "itelist": 57645, - "item": 1203, - "itemId": 54382, - "itemName": 95720, - "itemap": 25330, - "itemid": 84127, - "itempty": 19918, - "items": 3615, - "iten": 14668, - "iter": 2015, - "iteral": 9953, - "iterals": 37802, - "iterate": 41512, - "iterated": 50486, - "iteration": 36722, - "iterations": 67584, - "iterator": 6854, - "itere": 41846, - "iterr": 33825, - "ites": 3611, - "itespace": 36074, - "itesse": 86860, - "itest": 97105, - "itet": 41538, - "iteur": 82948, - "itez": 54645, - "ith": 410, - "ithe": 82756, - "ither": 2485, - "ithmetic": 25922, - "ithub": 3827, - "iti": 12303, - "itia": 87475, - "itial": 1559, - "itian": 78444, - "itic": 47986, - "itical": 31260, - "itics": 46979, - "ities": 1361, - "itim": 126690, - "itimate": 70750, - "itime": 38504, - "itin": 84886, - "iting": 5853, - "ition": 680, - "itional": 3005, - "itionally": 17412, - "itioner": 71246, - "itions": 5930, - "itious": 64695, - "itis": 19435, - "itive": 3404, - "itives": 50354, - "itivity": 18055, - "itize": 26310, - "itized": 83443, - "itizen": 93134, - "itizer": 63818, - "itle": 1002, - "itled": 15263, - "itledBorder": 85121, - "itlement": 45337, - "itles": 41243, - "itm": 72284, - "itmap": 19244, - "itness": 8091, - "ito": 6357, - "itol": 26003, - "iton": 62437, - "itone": 84066, - "itor": 1919, - "itore": 92916, - "itored": 36201, - "itori": 93357, - "itories": 13427, - "itorio": 95986, - "itoris": 79289, - "itors": 11905, - "itory": 10618, - "itos": 25593, - "itous": 49755, - "itr": 21561, - "itra": 36429, - "itre": 48734, - "itrust": 84871, - "its": 1199, - "itsu": 49557, - "itt": 1442, - "itta": 45024, - "ittal": 82123, - "ittance": 87191, - "itte": 96673, - "itted": 3762, - "ittel": 95283, - "itten": 22449, - "itter": 3248, - "itters": 28063, - "ittest": 14267, - "itti": 71766, - "itting": 14810, - "ittings": 52259, - "ittle": 2377, - "itto": 86187, - "itty": 22814, - "itu": 32362, - "itud": 12842, - "itude": 3906, - "itudes": 20590, - "itulo": 46378, - "itunes": 84482, - "itung": 50158, - "itur": 51930, - "itura": 76766, - "iture": 9280, - "itures": 41104, - "itus": 35791, - "itution": 33690, - "ity": 487, - "ityEngine": 6082, - "itz": 11042, - "itzer": 20480, - "itzerland": 26423, - "itä": 64321, - "ität": 36614, - "ité": 12815, - "ités": 34833, - "itÃł": 23940, - "iu": 18738, - "ium": 2356, - "ius": 9156, - "iv": 344, - "iva": 9924, - "ivable": 42572, - "ival": 3936, - "ivalence": 88790, - "ivalent": 11769, - "ivals": 18233, - "ivamente": 56158, - "ivan": 27322, - "ivant": 96005, - "ivar": 56398, - "ivariate": 55422, - "ivas": 38824, - "ivate": 731, - "ivated": 54686, - "ivating": 64143, - "ivation": 39127, - "ivative": 47158, - "ive": 533, - "iveau": 39219, - "ivec": 68580, - "ived": 2221, - "ivel": 20528, - "ively": 3132, - "ivement": 90540, - "iven": 2071, - "iveness": 12781, - "ivent": 80441, - "iver": 1524, - "ivered": 43056, - "ivering": 83940, - "ivers": 1945, - "iversal": 33952, - "iversary": 17577, - "iverse": 8034, - "iversity": 2977, - "ivery": 6497, - "ives": 1886, - "ivet": 98654, - "ivi": 32820, - "ivia": 20809, - "ivial": 26658, - "ivic": 39406, - "ivicrm": 96752, - "ivid": 63923, - "ividad": 94166, - "ividual": 16826, - "ivil": 6230, - "iving": 2249, - "ivirus": 57913, - "ivism": 72950, - "ivist": 79144, - "ivities": 42379, - "ivity": 1927, - "ivityManager": 69557, - "ivité": 142566, - "ivitÃł": 78443, - "ivo": 6496, - "ivol": 80506, - "ivor": 49675, - "ivors": 85393, - "ivos": 24224, - "ivot": 16084, - "ivr": 57766, - "ivre": 83495, - "ivy": 64505, - "iw": 37081, - "ix": 941, - "ixa": 46384, - "ixe": 85300, - "ixed": 3286, - "ixedReality": 56804, - "ixel": 5941, - "ixels": 10274, - "ixer": 39014, - "ixin": 20456, - "ixmap": 24593, - "ixo": 51362, - "ixon": 28472, - "ixture": 12735, - "iy": 16220, - "iya": 79474, - "iyor": 83342, - "iz": 449, - "iza": 17090, - "izabeth": 18540, - "izable": 8335, - "izacao": 97190, - "izacion": 51470, - "ización": 41500, - "izada": 51211, - "izado": 25846, - "izador": 90589, - "izados": 72158, - "izando": 91858, - "izar": 11155, - "izard": 13722, - "izards": 34091, - "izarre": 29482, - "ization": 2022, - "izational": 76391, - "izations": 8040, - "ização": 47376, - "ize": 551, - "ized": 1506, - "izedName": 20167, - "izen": 23678, - "izens": 28960, - "izer": 3135, - "izers": 12230, - "izes": 4756, - "izi": 33235, - "izia": 62041, - "izin": 76971, - "izing": 4849, - "izio": 44982, - "izione": 38361, - "izioni": 78159, - "izo": 42894, - "izon": 16973, - "izona": 15371, - "izons": 63847, - "izont": 6186, - "izontal": 6506, - "izontally": 50401, - "izoph": 45178, - "izophren": 45312, - "izr": 65362, - "izu": 91615, - "izz": 8759, - "izza": 13741, - "izzard": 38148, - "izzare": 76598, - "izzas": 67304, - "izzato": 91838, - "izzazione": 86108, - "izzer": 93329, - "izzes": 58327, - "izzie": 87987, - "izziness": 96645, - "izzle": 43137, - "izzlies": 94695, - "izzling": 89119, - "izzly": 72725, - "izzo": 60206, - "izzy": 90491, - "ião": 77328, - "ição": 38080, - "ième": 89172, - "ière": 20108, - "ièrement": 66782, - "ières": 58207, - "ié": 138522, - "ién": 23538, - "iéndo": 138523, - "iêu": 132728, - "ië": 127180, - "ió": 34894, - "ión": 3655, - "iÃŁ": 36947, - "iÄħ": 46892, - "iÄĩ": 67829, - "iÄį": 83095, - "iÄĻ": 62602, - "iÄĻÄĩ": 138476, - "iÄŁi": 127625, - "iÅĤ": 130274, - "iÅŁ": 97802, - "iếc": 135075, - "iết": 133545, - "iếu": 141010, - "iá»ĥu": 137444, - "iá»ĩm": 141071, - "iá»ĩn": 133682, - "iá»ĩu": 130241, - "j": 73, - "jQuery": 28004, - "ja": 5580, - "jab": 38916, - "jabi": 91884, - "jac": 86131, - "jack": 27134, - "jad": 62086, - "jadi": 92046, - "jah": 97396, - "jak": 62402, - "jal": 47692, - "jam": 43711, - "jamin": 25246, - "jan": 22838, - "jandro": 72059, - "jang": 37527, - "jango": 5846, - "jar": 19033, - "jas": 29726, - "jav": 61459, - "java": 10042, - "javascript": 14073, - "javax": 45148, - "jaw": 73992, - "jax": 14518, - "jay": 70037, - "jb": 38978, - "jc": 62987, - "jd": 43390, - "jdbc": 52132, - "jdk": 88851, - "je": 3756, - "jec": 73201, - "ject": 583, - "jected": 28303, - "jection": 7606, - "jections": 24575, - "jective": 50491, - "jectives": 86578, - "jectories": 65572, - "jectory": 23363, - "jee": 67896, - "jej": 76810, - "jejer": 56932, - "jem": 62903, - "jen": 23166, - "jenis": 56520, - "jer": 26360, - "jerne": 75347, - "jes": 20645, - "jest": 49015, - "jet": 15407, - "jeta": 64234, - "jets": 73904, - "jf": 96423, - "jh": 74306, - "ji": 7754, - "jian": 81891, - "jiang": 63547, - "jid": 72876, - "jie": 96237, - "jin": 49800, - "jing": 98168, - "jis": 82726, - "jit": 58809, - "jj": 38811, - "jk": 41808, - "jl": 43870, - "jm": 65939, - "jmp": 61055, - "jn": 93808, - "jni": 79114, - "jo": 7305, - "job": 8799, - "jobs": 31105, - "john": 47817, - "join": 5987, - "joined": 71154, - "joining": 65205, - "joint": 32850, - "jom": 60218, - "jon": 34165, - "jong": 98460, - "jos": 39161, - "jour": 29262, - "jourd": 68472, - "journal": 42518, - "jours": 39806, - "joy": 4123, - "jp": 46054, - "jpeg": 30921, - "jpg": 17974, - "jq": 43915, - "jquery": 26836, - "jr": 58913, - "js": 2519, - "jsc": 75527, - "json": 2236, - "jsonData": 91803, - "jsonp": 57045, - "jsonwebtoken": 76474, - "jsp": 93340, - "jspb": 92947, - "jspx": 30477, - "jsx": 45290, - "jt": 57205, - "ju": 8613, - "jual": 65029, - "jualan": 81925, - "juan": 94706, - "juana": 13264, - "jud": 18138, - "judge": 92361, - "judul": 67612, - "jug": 47702, - "jumbotron": 89334, - "jumlah": 48616, - "jump": 43296, - "jun": 57681, - "junction": 72428, - "jur": 86877, - "jure": 52302, - "jured": 79391, - "juries": 89827, - "jury": 41761, - "just": 4250, - "justice": 38768, - "justify": 34706, - "juven": 62131, - "jwt": 41592, - "jylland": 75161, - "jähr": 135453, - "jährige": 135454, - "jÃł": 43324, - "jÄħ": 36837, - "jÄħc": 125749, - "jÄħce": 127269, - "jÄħcego": 133123, - "jÄħcej": 135225, - "jÄħcy": 133188, - "jÄħcych": 129954, - "jÄħcym": 134200, - "jÄħcÄħ": 136413, - "jÄĻ": 35310, - "jÅĽÄĩ": 136981, - "k": 74, - "kB": 81524, - "kHz": 61756, - "kJ": 42330, - "ka": 4554, - "kaar": 87151, - "kad": 93275, - "kah": 83502, - "kal": 35541, - "kan": 8656, - "kap": 38834, - "kar": 28134, - "kart": 74847, - "kas": 62899, - "kat": 33755, - "kategori": 67447, - "kaza": 133821, - "kazaÅĤ": 133822, - "kb": 21310, - "kbd": 48456, - "kc": 31378, - "kd": 37744, - "kdir": 12438, - "ke": 440, - "kea": 42428, - "ked": 47159, - "kee": 21822, - "keep": 13096, - "keeper": 18861, - "keepers": 55538, - "keeping": 32394, - "kees": 40748, - "keh": 70617, - "kehr": 81112, - "keit": 26612, - "keiten": 51707, - "kek": 85207, - "kel": 17659, - "kelas": 89952, - "keletal": 85155, - "keleton": 27094, - "keley": 27299, - "kelig": 85010, - "ken": 2712, - "kening": 89273, - "kept": 97920, - "ker": 7052, - "kerja": 74918, - "kernel": 23248, - "kers": 26177, - "kes": 12556, - "kest": 39323, - "ket": 25475, - "keterangan": 85325, - "ketøy": 80785, - "key": 792, - "keyCode": 91367, - "keyboard": 41713, - "keydown": 44191, - "keypress": 60406, - "keys": 10563, - "keyup": 37224, - "keyword": 19863, - "keywords": 28995, - "kf": 81869, - "kg": 7351, - "kh": 30664, - "ki": 6642, - "kich": 70776, - "kick": 55793, - "kid": 63281, - "kids": 73896, - "kie": 30322, - "kiego": 93737, - "kiem": 87150, - "kil": 85526, - "kill": 10851, - "killer": 72078, - "kills": 60925, - "kim": 57893, - "kin": 7989, - "kind": 15314, - "king": 10566, - "kins": 11704, - "kinson": 50447, - "kip": 13389, - "kir": 67931, - "kish": 73620, - "kit": 8226, - "kits": 89417, - "kiye": 95203, - "kj": 92697, - "kk": 19196, - "kke": 90761, - "kker": 52598, - "kl": 10561, - "klass": 54422, - "kle": 23089, - "klä": 63730, - "klär": 77131, - "km": 16017, - "kn": 19095, - "knife": 42720, - "know": 32034, - "knowledge": 89053, - "known": 5278, - "ko": 9325, - "koa": 88288, - "kode": 37136, - "kok": 45264, - "kol": 51452, - "kom": 22097, - "kommen": 42789, - "kon": 39537, - "koneksi": 88782, - "kont": 39720, - "kontakte": 58868, - "kop": 83598, - "kor": 40717, - "kos": 56678, - "kov": 51667, - "kowski": 70124, - "koÅĦ": 126852, - "koÅĦcz": 130302, - "koÅĦczyÅĤ": 141213, - "kp": 48495, - "kr": 9855, - "kraine": 77736, - "kre": 54942, - "kreÅĽl": 135099, - "krit": 87550, - "krä": 144004, - "kräfte": 144005, - "krÄĻ": 141698, - "krÄĻc": 141699, - "ks": 2787, - "ksam": 91647, - "ksen": 85261, - "kses": 54009, - "ksi": 31060, - "ksiÄħż": 143972, - "ksiÄħżka": 143973, - "ksz": 139438, - "ksztaÅĤ": 139439, - "ksztaÅĤc": 139440, - "kt": 5840, - "kte": 40951, - "ktion": 39470, - "ktop": 8617, - "ktor": 75278, - "ktör": 127334, - "ku": 12133, - "kube": 97717, - "kubectl": 79971, - "kul": 90195, - "kur": 68317, - "kus": 78466, - "kv": 43408, - "kw": 28600, - "kwargs": 9674, - "ky": 7891, - "ków": 93457, - "kö": 73052, - "köp": 137316, - "körper": 142223, - "köy": 131751, - "kü": 129056, - "kür": 127356, - "kı": 126348, - "kıl": 132544, - "kır": 130071, - "kÄħ": 128578, - "kÄĻ": 84444, - "kÅĤad": 126416, - "l": 75, - "la": 4260, - "lab": 14380, - "label": 1502, - "labels": 16873, - "labs": 70271, - "lac": 92429, - "lace": 26536, - "laces": 76588, - "lad": 18107, - "laden": 88551, - "ladesh": 34121, - "ladı": 126763, - "ladıģı": 133786, - "lag": 13363, - "lage": 55754, - "lagen": 54708, - "lags": 22851, - "lah": 14992, - "lahoma": 22088, - "lain": 51971, - "lake": 62110, - "lam": 23771, - "lama": 80001, - "lambda": 12935, - "lamp": 94757, - "lan": 10715, - "land": 1933, - "lander": 34003, - "landers": 84967, - "landing": 48341, - "lando": 23693, - "lands": 8166, - "landscape": 88391, - "landı": 131181, - "landır": 128112, - "landırma": 142498, - "landırıl": 140119, - "lane": 37847, - "lang": 5205, - "langle": 70800, - "langs": 63917, - "language": 11528, - "languages": 42824, - "lanması": 135501, - "lanmÄ±ÅŁ": 137736, - "lap": 15958, - "lapping": 90619, - "laps": 89722, - "lar": 13796, - "lararas": 128171, - "lararası": 128172, - "lard": 133946, - "lardır": 133947, - "larg": 26897, - "large": 16767, - "ları": 45837, - "larımız": 129545, - "ların": 95448, - "larına": 128767, - "larınd": 129956, - "larında": 128759, - "larından": 129957, - "larını": 128445, - "larının": 128650, - "larınız": 127882, - "larınızı": 136810, - "larıyla": 133006, - "las": 14493, - "lash": 24686, - "lashes": 46545, - "lass": 447, - "lassen": 70489, - "lasses": 33868, - "lassian": 89597, - "last": 4259, - "lastName": 29156, - "lastic": 51179, - "lasting": 69429, - "lastname": 29206, - "lat": 5524, - "latable": 91147, - "late": 5075, - "lated": 22076, - "latent": 50023, - "later": 67576, - "lates": 48246, - "latesAutoresizingMaskIntoConstraints": 60107, - "latest": 19350, - "latex": 64680, - "latin": 60085, - "lation": 2302, - "lations": 29656, - "latitude": 23718, - "latlong": 61499, - "lator": 21829, - "lauf": 97761, - "laughs": 72456, - "laughter": 51783, - "launch": 33499, - "launcher": 77191, - "laus": 57229, - "lav": 78836, - "law": 19915, - "laws": 67537, - "lay": 6651, - "layan": 128045, - "layer": 10333, - "layers": 44198, - "layout": 8399, - "layouts": 20054, - "lays": 63359, - "layui": 41335, - "layın": 138649, - "lazy": 49013, - "laÅŁ": 124447, - "laÅŁma": 127697, - "laÅŁtır": 137850, - "laÅŁtırma": 142099, - "lb": 21123, - "lbl": 31998, - "lbrace": 75233, - "lbrakk": 74161, - "lbs": 52944, - "lc": 17257, - "lcd": 68416, - "ld": 507, - "lda": 73426, - "ldap": 38665, - "ldata": 52681, - "ldb": 56925, - "lder": 76869, - "ldr": 72377, - "ldre": 63196, - "lds": 71033, - "le": 273, - "leDb": 89506, - "lea": 88291, - "lead": 26060, - "leader": 37391, - "leaders": 78386, - "leading": 20654, - "leads": 98370, - "leaf": 24153, - "leaflet": 81707, - "league": 46731, - "lean": 2675, - "leaning": 58951, - "leanor": 76680, - "leans": 21708, - "leanup": 60639, - "lear": 1547, - "leared": 92333, - "learn": 12675, - "learner": 93595, - "learning": 20981, - "lease": 1623, - "leased": 4673, - "leases": 28299, - "leasing": 83552, - "least": 55271, - "leave": 21510, - "lec": 34753, - "leccion": 42630, - "leck": 93876, - "lect": 767, - "lected": 2209, - "lectic": 67449, - "lection": 1170, - "lections": 67679, - "lector": 27669, - "lectric": 46162, - "lectron": 69229, - "lectual": 58417, - "lecture": 76761, - "led": 832, - "ledge": 4890, - "ledged": 92624, - "ledger": 50704, - "ledo": 60655, - "ledon": 82457, - "lee": 8501, - "leen": 39662, - "leep": 3499, - "leet": 18973, - "leetcode": 35326, - "lef": 59238, - "left": 2359, - "leftJoin": 75661, - "leftright": 80375, - "leftrightarrow": 81819, - "leg": 1937, - "legacy": 39884, - "legal": 6428, - "legalArgumentException": 97009, - "legant": 58802, - "legate": 4989, - "legates": 53379, - "legation": 87566, - "lege": 4757, - "legen": 48414, - "legend": 14505, - "legg": 83028, - "leground": 64766, - "legs": 72236, - "legt": 71168, - "leh": 73790, - "lehem": 87572, - "lei": 62785, - "leich": 54371, - "leigh": 62969, - "lein": 78369, - "leine": 91833, - "leitung": 74462, - "lek": 75776, - "lem": 3433, - "lemen": 41307, - "lement": 986, - "lements": 90455, - "lemetry": 35958, - "lemma": 9633, - "lemn": 61030, - "lems": 39616, - "len": 2892, - "lena": 48021, - "lename": 29118, - "lene": 34191, - "leneck": 59013, - "leness": 76219, - "length": 4129, - "lenmiÅŁ": 140313, - "leo": 81763, - "leon": 79398, - "lep": 62967, - "ler": 1536, - "leri": 46779, - "lernen": 78877, - "lero": 65311, - "lers": 9254, - "les": 642, - "lesai": 97531, - "lesc": 63531, - "lescope": 38113, - "lesen": 56027, - "lesh": 17469, - "leshoot": 96408, - "leshooting": 50240, - "lesi": 75895, - "lesia": 92237, - "less": 1717, - "lessly": 15740, - "lessness": 31928, - "lesson": 27495, - "lessons": 72312, - "lest": 59144, - "leston": 45568, - "let": 1149, - "leta": 48151, - "letal": 45490, - "letcher": 60520, - "lete": 1617, - "leted": 6873, - "letes": 13881, - "letic": 21973, - "letics": 43028, - "leting": 35935, - "letion": 52625, - "leton": 15616, - "lets": 9942, - "lett": 27064, - "lette": 9809, - "letter": 9451, - "letters": 21053, - "lettes": 65592, - "leur": 34977, - "leurs": 76560, - "lev": 3449, - "levance": 32094, - "levant": 8367, - "levard": 42243, - "levation": 43757, - "levator": 79200, - "level": 3294, - "leveland": 21478, - "levelname": 75641, - "levels": 42564, - "lever": 71805, - "levision": 10864, - "lew": 74964, - "lex": 2571, - "lexer": 38815, - "lexible": 94544, - "lexical": 93364, - "lexport": 83353, - "ley": 3179, - "leys": 47679, - "lez": 40781, - "leÅŁ": 124968, - "leÅŁme": 127495, - "leÅŁtir": 125269, - "leÅŁtirme": 139670, - "lf": 11008, - "lfw": 96106, - "lg": 11819, - "lh": 63045, - "lhs": 31895, - "li": 742, - "lia": 23350, - "liable": 50330, - "liament": 12403, - "lian": 91798, - "lias": 71829, - "lib": 2740, - "libc": 55576, - "libft": 56523, - "libraries": 63049, - "library": 18065, - "libs": 35719, - "lic": 415, - "lica": 15317, - "licable": 46114, - "lical": 31248, - "licant": 35237, - "licants": 61832, - "licas": 52210, - "licate": 48795, - "licated": 13724, - "lication": 1693, - "lications": 10709, - "licative": 65266, - "lice": 4754, - "liced": 74630, - "licence": 93206, - "license": 13266, - "licensed": 71711, - "licenses": 77914, - "licer": 97243, - "lices": 37414, - "lich": 6772, - "liche": 20005, - "lichen": 21673, - "licher": 50095, - "liches": 95285, - "lichkeit": 88185, - "licht": 37633, - "licing": 89114, - "licit": 6026, - "licity": 24779, - "lick": 1206, - "licken": 93790, - "lickr": 31803, - "lico": 36011, - "licos": 88844, - "lict": 21242, - "licted": 41343, - "licting": 78208, - "licts": 56445, - "lid": 61206, - "lide": 16655, - "lider": 19118, - "lie": 11567, - "lien": 85036, - "lient": 1451, - "lients": 7041, - "lier": 5623, - "liers": 40376, - "lies": 48101, - "liest": 23138, - "lieÃŁ": 56400, - "lieÃŁlich": 83090, - "life": 14450, - "lifetime": 97057, - "lift": 34969, - "lifting": 51903, - "lify": 55500, - "lig": 7708, - "liga": 44870, - "lige": 52790, - "light": 4145, - "lightbox": 98504, - "lightly": 79498, - "lights": 13826, - "ligne": 90030, - "ligt": 58156, - "lij": 22953, - "lijah": 75368, - "lijk": 47292, - "lijke": 81934, - "lik": 7637, - "like": 4803, - "liked": 43236, - "likelihood": 61130, - "likely": 14282, - "likes": 25039, - "lim": 4659, - "lime": 38943, - "limit": 9506, - "limitations": 73168, - "limited": 18235, - "limits": 41078, - "lin": 3732, - "line": 1056, - "lineEdit": 92547, - "linear": 22763, - "lined": 15121, - "lineno": 79983, - "liner": 61798, - "lines": 7969, - "liness": 48858, - "linewidth": 57212, - "ling": 2718, - "lingen": 76307, - "linger": 71560, - "lings": 18812, - "lington": 42647, - "linha": 66820, - "linik": 79870, - "lining": 34881, - "link": 2080, - "linked": 43133, - "linkedin": 76170, - "linkplain": 68640, - "links": 15880, - "linky": 51858, - "lint": 14957, - "linux": 14210, - "lio": 25147, - "lion": 78151, - "lip": 33115, - "liqu": 39993, - "lique": 36426, - "liquid": 53637, - "lis": 47203, - "lish": 1672, - "list": 1607, - "lista": 32660, - "liste": 64646, - "listed": 31240, - "listen": 36337, - "listener": 35039, - "listeners": 76950, - "listening": 74819, - "listing": 34596, - "lists": 17575, - "lit": 31635, - "lite": 68078, - "liter": 68091, - "literal": 35785, - "little": 55392, - "lius": 86419, - "liv": 33567, - "live": 24822, - "living": 63175, - "liwo": 141935, - "liwoÅĽci": 141936, - "lix": 15051, - "lixir": 97772, - "liÄŁ": 125364, - "liÄŁe": 139261, - "liÄŁi": 126326, - "liÄŁin": 133752, - "liÄŁinde": 137161, - "liÄŁini": 133350, - "liÅĽmy": 129083, - "lj": 52735, - "lk": 41748, - "lke": 126732, - "ll": 654, - "lla": 35782, - "lland": 73412, - "lld": 32459, - "lle": 65501, - "llen": 79788, - "ller": 54956, - "lli": 39976, - "llib": 20745, - "llu": 60749, - "llum": 5448, - "lluminate": 5585, - "llvm": 29042, - "llx": 94990, - "lm": 17771, - "ln": 2261, - "lname": 50228, - "lng": 20810, - "lo": 385, - "load": 1078, - "loadModel": 93931, - "loaded": 15589, - "loader": 8355, - "loading": 10628, - "loads": 32685, - "loan": 38329, - "loat": 1239, - "loating": 28493, - "lob": 1684, - "lobal": 2042, - "lobals": 16616, - "lobber": 91397, - "lobby": 71775, - "lobe": 62997, - "lobs": 68164, - "loc": 1074, - "local": 2438, - "localObject": 53207, - "localStorage": 43453, - "localctx": 54474, - "locale": 14484, - "locales": 80232, - "localhost": 8301, - "localized": 71594, - "locals": 64130, - "locate": 22401, - "located": 39463, - "location": 2527, - "locations": 31309, - "locator": 68033, - "lock": 1023, - "locked": 24633, - "locker": 93414, - "locking": 89482, - "locks": 34936, - "locs": 83629, - "lod": 82482, - "lodash": 30279, - "loe": 34498, - "loff": 93038, - "log": 839, - "logan": 93925, - "logen": 85845, - "logfile": 75566, - "logg": 93369, - "logged": 24867, - "loggedIn": 80149, - "loggedin": 96227, - "logger": 9786, - "logging": 25263, - "logic": 24225, - "logical": 30256, - "login": 3673, - "logo": 10129, - "logout": 15937, - "logradouro": 67840, - "logs": 22081, - "logue": 67078, - "logy": 35681, - "loh": 82348, - "loi": 66392, - "loid": 51096, - "loit": 78549, - "lok": 60931, - "lol": 59319, - "lon": 12212, - "long": 4825, - "longitude": 25446, - "longleftrightarrow": 87459, - "longrightarrow": 55042, - "loo": 47133, - "lood": 4556, - "look": 7201, - "looking": 20363, - "looks": 94273, - "lookup": 21020, - "loom": 18474, - "loomberg": 90072, - "loon": 31335, - "loop": 10498, - "loops": 82451, - "loor": 3993, - "lop": 22288, - "lope": 35327, - "lopedia": 42373, - "lopen": 41899, - "lops": 53689, - "loquent": 20522, - "lor": 9566, - "lord": 25598, - "lords": 47765, - "lore": 20156, - "los": 2301, - "lose": 1469, - "losed": 9259, - "loser": 69215, - "loses": 49341, - "losing": 17831, - "losion": 40455, - "loss": 9379, - "lossen": 76166, - "lost": 54337, - "losure": 11653, - "losures": 41206, - "lot": 9184, - "loth": 69552, - "lots": 65776, - "lotte": 24573, - "loud": 52178, - "lov": 35147, - "lovak": 86110, - "love": 30053, - "lover": 56497, - "low": 10303, - "lower": 14772, - "lowest": 89898, - "lox": 55728, - "loy": 1989, - "loyd": 25796, - "loyment": 39130, - "loys": 33298, - "lp": 13545, - "lpVtbl": 55138, - "lparr": 88887, - "lr": 19018, - "lrt": 55868, - "ls": 4730, - "lsa": 77683, - "lse": 87782, - "lsen": 59988, - "lsi": 65533, - "lsru": 90655, - "lsruhe": 93409, - "lst": 36687, - "lsx": 29017, - "lt": 4832, - "lte": 48791, - "ltk": 43671, - "ltr": 67375, - "ltra": 39369, - "ltre": 78758, - "ltür": 127667, - "lu": 9835, - "lua": 27623, - "lucent": 59054, - "luck": 85376, - "lude": 52538, - "luent": 56067, - "luet": 56316, - "luetooth": 57076, - "lug": 43213, - "lund": 84733, - "lung": 37949, - "lus": 82645, - "lush": 34604, - "lust": 70979, - "lut": 86854, - "lux": 62859, - "luÄŁu": 131977, - "luÄŁun": 136253, - "lv": 21827, - "lvl": 58160, - "lw": 57053, - "lx": 31447, - "ly": 398, - "lya": 96099, - "lycer": 67490, - "lying": 6711, - "lymp": 13842, - "lyn": 18013, - "lyph": 9525, - "lyphicon": 13684, - "lys": 60392, - "lz": 95505, - "lá": 129788, - "lâ": 131618, - "lä": 43183, - "läss": 139376, - "lässig": 139377, - "läuft": 141136, - "lève": 137379, - "lé": 68228, - "lée": 133607, - "légi": 137728, - "lóg": 142312, - "lógica": 142313, - "lö": 131807, - "lös": 141850, - "lösung": 141851, - "lü": 125462, - "lük": 130343, - "lÃ¼ÄŁÃ¼": 132489, - "lÃł": 132368, - "lÃŃ": 128910, - "lı": 25611, - "lık": 91733, - "lıkl": 126108, - "lıklar": 135388, - "lıkları": 135347, - "lıģ": 131236, - "lıģa": 138386, - "lıģı": 125508, - "lıģın": 131237, - "lıģını": 133182, - "m": 76, - "mA": 69265, - "mAh": 78535, - "mPid": 83779, - "ma": 1728, - "maal": 78791, - "mac": 11948, - "macen": 64601, - "mach": 54277, - "machine": 32056, - "macro": 32606, - "macros": 86398, - "mad": 20302, - "made": 26912, - "maf": 98061, - "mag": 30506, - "mage": 52310, - "magic": 37451, - "magnitude": 96264, - "mah": 74119, - "mai": 76485, - "maid": 45242, - "maids": 97150, - "mail": 3711, - "mailbox": 92447, - "mailer": 58403, - "mailto": 38526, - "main": 3817, - "maint": 66813, - "maintenance": 98078, - "mainwindow": 41580, - "maj": 95195, - "major": 36505, - "mak": 48562, - "make": 6927, - "maker": 25766, - "makers": 19887, - "makes": 79685, - "making": 27836, - "makt": 126389, - "maktad": 126390, - "maktadır": 126391, - "mal": 14649, - "male": 36476, - "malink": 46618, - "mall": 29532, - "malloc": 16166, - "mallow": 74380, - "malı": 127245, - "malıdır": 133088, - "man": 1515, - "mana": 47476, - "manage": 25117, - "managed": 25270, - "managedType": 65248, - "management": 42473, - "manager": 13297, - "mand": 1928, - "manda": 35545, - "mandatory": 80116, - "mando": 79744, - "manent": 32754, - "mani": 77198, - "mania": 51568, - "manifest": 42315, - "mann": 17562, - "mans": 69891, - "manship": 57732, - "mant": 41451, - "manual": 19730, - "manuel": 36164, - "manufact": 97450, - "manufacturer": 60914, - "many": 34576, - "manın": 132549, - "manız": 133370, - "map": 2186, - "mapped": 65371, - "mapper": 38076, - "mapping": 40792, - "maps": 17640, - "mar": 5612, - "marca": 84718, - "mare": 27655, - "mares": 62536, - "margin": 8936, - "marginLeft": 81637, - "marginTop": 66541, - "maries": 89333, - "marine": 84443, - "mark": 3987, - "markdown": 60073, - "marked": 46362, - "marker": 27742, - "markers": 60773, - "market": 19301, - "marketing": 91818, - "markets": 59460, - "marks": 15544, - "markt": 84590, - "markup": 80827, - "married": 69482, - "mars": 94926, - "marsh": 36239, - "marshal": 27121, - "marshall": 84161, - "marshaller": 52541, - "mart": 33472, - "marvin": 50276, - "mary": 1534, - "mas": 6899, - "mask": 11258, - "masked": 81535, - "mass": 26331, - "massage": 78585, - "mast": 96513, - "master": 13629, - "masters": 63611, - "ması": 75924, - "masına": 132585, - "masını": 126890, - "mat": 8470, - "match": 6347, - "matchCondition": 23972, - "matched": 36734, - "matcher": 70826, - "matches": 19914, - "matching": 89043, - "mate": 18052, - "material": 8243, - "materials": 77572, - "mates": 16457, - "math": 10374, - "mathrm": 91550, - "matic": 37244, - "matplotlib": 80427, - "matrix": 18110, - "matter": 58965, - "max": 2810, - "maxLength": 60992, - "maxcdn": 43273, - "maximum": 39187, - "maxlength": 50456, - "may": 18358, - "mayacaģı": 140645, - "maybe": 36760, - "mayı": 130298, - "mayın": 136469, - "maze": 97950, - "mb": 3096, - "mbH": 31098, - "mc": 12887, - "md": 2277, - "mdat": 80621, - "mdb": 78127, - "mdi": 40423, - "mdir": 69695, - "mdl": 47214, - "mdp": 90669, - "me": 2660, - "meal": 41780, - "mean": 14287, - "meaning": 56765, - "means": 46221, - "measure": 47799, - "measurement": 81425, - "med": 2061, - "medi": 4404, - "media": 7399, - "median": 55651, - "mediate": 14636, - "mediately": 43187, - "medical": 68116, - "medicine": 82443, - "medium": 26086, - "meer": 89925, - "meet": 63410, - "meeting": 61249, - "meg": 70276, - "mega": 42510, - "mek": 73753, - "mel": 27127, - "meld": 36601, - "meldung": 87697, - "melon": 71118, - "mem": 10536, - "member": 9597, - "memberOf": 68981, - "memberof": 49592, - "members": 22974, - "membership": 69328, - "memcmp": 61534, - "memcpy": 81084, - "memo": 55409, - "memory": 17269, - "memset": 98066, - "men": 5676, - "meno": 69091, - "mens": 48874, - "mensagem": 88841, - "mensaje": 46345, - "ment": 478, - "mental": 92121, - "mentation": 31099, - "mente": 12541, - "mented": 26980, - "mention": 29248, - "mentioned": 36591, - "mentions": 97355, - "mentor": 97645, - "ments": 1368, - "menu": 6064, - "menuItem": 88932, - "menus": 57627, - "mer": 1174, - "merc": 64422, - "merce": 10190, - "merchant": 39011, - "mercial": 18839, - "mere": 59931, - "merge": 19052, - "merged": 40354, - "meric": 2117, - "merican": 15717, - "mers": 22780, - "mes": 8828, - "mesh": 23506, - "mess": 49746, - "message": 1994, - "messages": 16325, - "met": 4059, - "meta": 5490, - "metadata": 17637, - "metal": 54008, - "metatable": 93589, - "meteor": 97774, - "meter": 59422, - "meth": 68891, - "method": 4393, - "methodName": 58550, - "methodPointerType": 95556, - "methodVisitor": 24962, - "methods": 35742, - "metic": 17990, - "metics": 45266, - "metis": 56944, - "metric": 15903, - "metrical": 58302, - "metrics": 43262, - "metro": 57047, - "metros": 67116, - "metry": 32242, - "meye": 142635, - "meyeceÄŁi": 142636, - "mez": 82156, - "mf": 28124, - "mg": 12311, - "mgr": 48292, - "mh": 51916, - "mi": 8155, - "mia": 90199, - "mic": 21220, - "micro": 40443, - "mid": 16106, - "midd": 84649, - "middle": 19656, - "middleware": 26624, - "middlewares": 88632, - "midi": 96519, - "midt": 42301, - "mie": 73596, - "mieÅĽci": 134938, - "might": 44968, - "mighty": 67305, - "migration": 80227, - "mil": 72270, - "mile": 66597, - "mill": 25013, - "million": 58313, - "milliseconds": 60772, - "mime": 49588, - "min": 1065, - "mina": 75435, - "minate": 34016, - "minated": 51199, - "minating": 64283, - "mination": 32096, - "mind": 37724, - "mine": 5967, - "minecraft": 72538, - "minent": 46407, - "miner": 92501, - "ming": 5311, - "mini": 36411, - "minimal": 92607, - "minimum": 37988, - "mino": 31824, - "minor": 45670, - "mins": 46696, - "minster": 40378, - "mint": 67791, - "minus": 38365, - "minute": 42557, - "minutes": 37037, - "mir": 19936, - "mirror": 73225, - "mis": 33865, - "misc": 47240, - "mise": 73206, - "misión": 132884, - "miss": 1831, - "missible": 44064, - "missing": 30616, - "mission": 2728, - "missions": 5176, - "missive": 56928, - "missão": 132192, - "mist": 78924, - "mit": 1763, - "mite": 52895, - "mites": 91499, - "mith": 43674, - "mits": 44703, - "mitt": 23692, - "mitted": 5483, - "mittel": 91184, - "mitter": 16126, - "mitters": 82089, - "mium": 50218, - "mix": 35071, - "mixed": 56685, - "miÄĻ": 131281, - "miÅŁ": 124801, - "miÅŁti": 132747, - "miÅŁtir": 129479, - "mj": 77830, - "mk": 24452, - "mkdir": 26117, - "ml": 1014, - "mland": 85694, - "mlin": 40926, - "mlink": 44243, - "mlx": 66903, - "mm": 3821, - "mma": 15895, - "mmas": 89536, - "mmc": 92008, - "mmm": 48886, - "mmo": 77675, - "mn": 21775, - "mnop": 63500, - "mnt": 40882, - "mo": 6355, - "mob": 33935, - "mobile": 14933, - "mobx": 88415, - "mock": 16712, - "mod": 2593, - "modal": 5667, - "modation": 68511, - "mode": 8516, - "model": 2528, - "modelName": 93374, - "modele": 76925, - "modelo": 78451, - "models": 6507, - "modern": 49789, - "modes": 89822, - "modifiable": 84079, - "modification": 97596, - "modified": 27162, - "modifier": 49742, - "modifiers": 91090, - "modify": 34053, - "modity": 51202, - "modo": 75943, - "mods": 60790, - "module": 4352, - "moduleId": 85843, - "moduleName": 73340, - "modules": 11525, - "modulo": 87966, - "modx": 95630, - "moid": 45059, - "moil": 60047, - "moire": 96395, - "mojom": 82336, - "mol": 44344, - "mom": 60774, - "moment": 28599, - "mon": 1645, - "monary": 54792, - "mond": 12388, - "monds": 54620, - "money": 28259, - "mong": 71155, - "mongo": 53070, - "mongodb": 37197, - "mongoose": 22774, - "monic": 73589, - "monitor": 32225, - "monkey": 96016, - "mono": 56401, - "mons": 23570, - "monster": 50519, - "mont": 20416, - "month": 10249, - "monthly": 69138, - "months": 49714, - "monto": 94073, - "monton": 40765, - "mony": 64427, - "moon": 67269, - "mor": 56802, - "more": 6384, - "morgan": 96391, - "morph": 89833, - "mort": 92611, - "mos": 8631, - "most": 3562, - "mostat": 54725, - "mostly": 62895, - "mot": 46828, - "moth": 67404, - "mother": 26412, - "motion": 48875, - "motor": 57988, - "mount": 16557, - "mounted": 81516, - "mour": 83084, - "mouse": 13237, - "mousedown": 56638, - "mouseenter": 86328, - "mouseleave": 81446, - "mousemove": 60077, - "mouseout": 55711, - "mouseover": 46158, - "mouseup": 67790, - "mouth": 32680, - "mov": 29961, - "move": 3397, - "moved": 94818, - "movement": 61174, - "moves": 66082, - "movie": 20032, - "movies": 39420, - "moving": 65115, - "moz": 46517, - "mozilla": 50345, - "mp": 1307, - "mpeg": 47551, - "mph": 55002, - "mpi": 39479, - "mpjes": 74554, - "mpl": 54010, - "mploy": 7111, - "mployee": 9458, - "mpp": 93368, - "mpr": 78373, - "mps": 93470, - "mpz": 82705, - "mq": 27674, - "mqtt": 86576, - "mr": 20946, - "ms": 1011, - "mscorlib": 71605, - "mse": 96582, - "msg": 3236, - "msgid": 86509, - "msgs": 77845, - "msp": 92545, - "mt": 2501, - "mtime": 60976, - "mtree": 70422, - "mts": 91326, - "mtx": 90310, - "mu": 15128, - "much": 58078, - "mue": 91138, - "mui": 67466, - "mul": 24160, - "mult": 25875, - "multi": 26268, - "multiline": 92760, - "multip": 77976, - "multipart": 29542, - "multiple": 35673, - "multiply": 64648, - "mun": 24997, - "mund": 35314, - "munition": 33586, - "mur": 65106, - "mus": 37727, - "music": 31161, - "must": 24812, - "mut": 6984, - "mutable": 30473, - "mutation": 30971, - "mutations": 51755, - "mute": 52214, - "mutex": 22366, - "mux": 75066, - "muÅŁ": 126661, - "muÅŁtur": 128085, - "mv": 26002, - "mvc": 94847, - "mw": 44128, - "mx": 18085, - "my": 2408, - "myModal": 46033, - "myModalLabel": 81102, - "myfile": 94921, - "myp": 86134, - "mys": 8209, - "mysql": 12272, - "mysqli": 15647, - "mysÅĤ": 134160, - "myÅĽl": 129772, - "mát": 143643, - "mática": 130739, - "máticos": 143644, - "mÃ¤ÃŁig": 140448, - "mètre": 132754, - "mé": 128613, - "méd": 130054, - "média": 130055, - "même": 132861, - "mó": 137905, - "móvel": 137906, - "mówi": 132953, - "mö": 127846, - "möglich": 127847, - "möglichkeiten": 142432, - "mü": 130187, - "mÃ¼ÅŁ": 131441, - "mı": 130329, - "mıyor": 135207, - "mız": 125673, - "mızda": 137332, - "mızı": 131174, - "mÄ±ÅŁ": 125042, - "mÄ±ÅŁtı": 132862, - "mÄ±ÅŁtır": 129577, - "n": 77, - "nEnter": 78941, - "nP": 86749, - "nThe": 88230, - "na": 3376, - "nable": 16251, - "nad": 80944, - "nage": 67055, - "nah": 38130, - "nahme": 72164, - "naire": 28483, - "naires": 68563, - "naissance": 45202, - "nak": 42874, - "nal": 41978, - "nam": 12400, - "nama": 18425, - "name": 606, - "named": 30245, - "naments": 73815, - "nameof": 68442, - "names": 11400, - "namese": 43419, - "namespace": 2231, - "nan": 18759, - "nano": 93625, - "nant": 51885, - "nants": 62263, - "nap": 6861, - "napshot": 9601, - "nar": 51657, - "nard": 96932, - "nas": 45423, - "nat": 33297, - "natal": 73339, - "nation": 98795, - "national": 41140, - "native": 29738, - "natural": 52880, - "nature": 66712, - "nav": 3722, - "navbar": 9839, - "navbarDropdown": 98311, - "navbarSupportedContent": 75722, - "navigate": 70839, - "navigation": 22608, - "navigationBar": 82653, - "navigator": 63098, - "naz": 87296, - "nb": 18080, - "nbr": 64401, - "nbsp": 5674, - "nc": 1016, - "nce": 16443, - "nces": 98162, - "ncia": 18953, - "ncias": 54679, - "ncmp": 32801, - "ncoder": 66943, - "ncpy": 35250, - "ncy": 20735, - "nd": 303, - "nda": 27896, - "ndata": 82603, - "nde": 42341, - "ndef": 5037, - "nder": 900, - "ndern": 93016, - "ndl": 88370, - "ndo": 89214, - "ndon": 85352, - "nds": 81003, - "ndx": 93256, - "ne": 811, - "nea": 32152, - "neapolis": 38476, - "near": 51659, - "nearest": 69511, - "neas": 97257, - "neath": 27817, - "neau": 82253, - "necessary": 94217, - "neck": 62340, - "nect": 2321, - "nection": 1821, - "ned": 18694, - "nee": 33091, - "need": 17046, - "needed": 40817, - "needle": 59519, - "needs": 55245, - "nees": 68719, - "neg": 28775, - "negative": 42224, - "nego": 52099, - "neh": 25402, - "nehmen": 37060, - "nehmer": 88487, - "neider": 47611, - "neighbor": 36469, - "neighbors": 79488, - "nej": 35800, - "nek": 46945, - "nel": 8138, - "nell": 48465, - "nelle": 63729, - "nelly": 86631, - "nels": 35427, - "nement": 39180, - "nemonic": 70775, - "nen": 12495, - "neo": 51260, - "ner": 1194, - "nerRadius": 33151, - "nerg": 38524, - "nergie": 63274, - "nergy": 9997, - "nero": 68952, - "ners": 4972, - "nes": 4873, - "nesc": 86596, - "nesday": 7316, - "nesia": 97475, - "nesota": 17434, - "ness": 2090, - "nest": 21414, - "nested": 59271, - "nestjs": 44587, - "nesty": 47285, - "net": 4711, - "netinet": 69699, - "nets": 52861, - "nett": 82724, - "nette": 78728, - "network": 17511, - "neutral": 59568, - "nev": 97393, - "never": 36493, - "new": 931, - "newInstance": 84036, - "newValue": 52830, - "newline": 89202, - "news": 9984, - "newsletter": 71368, - "nex": 73226, - "next": 3600, - "nextInt": 94096, - "ney": 3437, - "neys": 35271, - "nez": 54406, - "nf": 31737, - "ng": 968, - "nga": 62530, - "nge": 84490, - "ngen": 99011, - "nger": 64067, - "ngine": 70891, - "nginx": 73561, - "ngle": 66230, - "ngo": 70590, - "ngoing": 85071, - "ngr": 58192, - "ngrx": 75184, - "ngth": 6717, - "ngthen": 18465, - "ngx": 33046, - "nh": 16719, - "ni": 7751, - "nia": 20887, - "nic": 11590, - "nicas": 73346, - "nice": 52796, - "nick": 20406, - "nickname": 39413, - "nicos": 84430, - "nid": 57344, - "nie": 10810, - "niej": 59904, - "niejs": 91262, - "nier": 88983, - "niest": 84780, - "night": 9287, - "nih": 86065, - "nik": 21490, - "nika": 89065, - "ników": 129408, - "nil": 8385, - "nilai": 75591, - "nim": 56751, - "nin": 78460, - "nine": 93223, - "ning": 1229, - "ningar": 92575, - "ningen": 72108, - "ninger": 87421, - "nings": 38469, - "nio": 92633, - "nip": 69773, - "nis": 25151, - "nish": 96839, - "nist": 64759, - "nit": 44068, - "nite": 61564, - "nivel": 89000, - "nivers": 127515, - "niÄħ": 130961, - "niÄĻ": 125847, - "niÄĻcia": 141588, - "niÄĻcie": 139896, - "nj": 56108, - "nk": 49436, - "nl": 15643, - "nm": 19638, - "nn": 7370, - "nnen": 19294, - "no": 2152, - "noDB": 82240, - "nob": 55023, - "noc": 47991, - "noch": 76018, - "nock": 87121, - "nod": 34566, - "node": 3509, - "nodeName": 93451, - "nodeValue": 89985, - "nodes": 20008, - "nodiscard": 82334, - "nodoc": 93569, - "nof": 26654, - "nofollow": 28530, - "noinspection": 89267, - "noise": 52218, - "nom": 16687, - "nombre": 14236, - "nome": 17081, - "non": 6280, - "nonatomic": 10439, - "nonce": 39593, - "none": 6697, - "nonnull": 61436, - "noon": 12402, - "noop": 40162, - "noopener": 66106, - "nop": 62813, - "nor": 44707, - "nore": 93066, - "norm": 20011, - "normal": 8252, - "normalize": 30590, - "normalized": 38460, - "normally": 85236, - "north": 61895, - "nos": 36391, - "nosis": 75105, - "nost": 31457, - "nosti": 73852, - "nostic": 86424, - "not": 1921, - "notEmpty": 89517, - "nota": 67217, - "notated": 87029, - "notation": 10930, - "notations": 14297, - "note": 9974, - "noteq": 45299, - "notes": 18286, - "nothing": 41212, - "nothrow": 79381, - "notice": 23556, - "noticed": 74275, - "notif": 85046, - "notification": 18553, - "notifications": 38188, - "notify": 21948, - "notin": 83780, - "noun": 90109, - "nov": 38042, - "nova": 93184, - "novation": 98748, - "now": 3328, - "nowled": 50022, - "nowledge": 51186, - "nown": 4169, - "nowrap": 55423, - "nox": 41403, - "noxious": 94732, - "noÅĽci": 44323, - "noÅĽÄĩ": 71619, - "np": 6199, - "npc": 45383, - "npj": 62245, - "npm": 40039, - "npos": 38992, - "nqu": 139033, - "nquête": 139034, - "nr": 19618, - "ns": 4412, - "nsic": 42211, - "nst": 57718, - "nt": 406, - "ntag": 94905, - "ntax": 8842, - "nte": 23446, - "nten": 42469, - "nth": 51738, - "ntity": 89258, - "ntl": 44456, - "nton": 55353, - "ntp": 89340, - "nts": 65677, - "nty": 40833, - "nu": 8933, - "null": 2921, - "nullable": 12902, - "nullptr": 41132, - "num": 2413, - "number": 4082, - "numberOf": 37823, - "numbers": 37378, - "numer": 75596, - "numeric": 19600, - "numero": 32615, - "numerusform": 70719, - "nummer": 67919, - "numpy": 35083, - "nums": 26350, - "nung": 46621, - "nut": 23333, - "nutrition": 82564, - "nuts": 63766, - "nv": 36941, - "nvarchar": 63565, - "nw": 61227, - "nx": 23357, - "ny": 3834, - "nya": 22891, - "nych": 27284, - "nyder": 49255, - "nym": 48121, - "nz": 50824, - "nze": 84449, - "nç": 131164, - "nça": 131059, - "né": 51135, - "née": 130577, - "nü": 129894, - "nÃŃ": 54022, - "nı": 128658, - "nın": 128337, - "nız": 125288, - "nızda": 137722, - "nızı": 134502, - "nÄħ": 56350, - "nÄħÄĩ": 131264, - "nÄħÅĤ": 137253, - "nÄĻ": 126919, - "nÄĻÅĤa": 141716, - "o": 78, - "oS": 72743, - "oa": 19533, - "oad": 2731, - "oader": 39966, - "oard": 33386, - "oauth": 34363, - "ob": 674, - "oba": 26833, - "obao": 69131, - "obar": 31393, - "obb": 20415, - "obbies": 40312, - "obble": 95850, - "obbled": 90946, - "obby": 10317, - "obe": 15422, - "obel": 77106, - "ober": 5923, - "obi": 18337, - "obia": 40063, - "obic": 30806, - "obierno": 51582, - "obil": 27929, - "obile": 3372, - "obili": 94823, - "obj": 2295, - "objPHPExcel": 77500, - "objc": 28826, - "object": 1700, - "objectId": 88170, - "objectManager": 98047, - "objective": 84511, - "objects": 19210, - "objet": 66716, - "objs": 88327, - "obl": 37734, - "oble": 49993, - "oblin": 47061, - "oblins": 78814, - "obo": 38519, - "obody": 42340, - "obook": 73328, - "obot": 44639, - "obox": 32460, - "obra": 28856, - "obre": 37608, - "obs": 5481, - "observ": 22764, - "observable": 33495, - "observation": 77960, - "observations": 70384, - "observe": 48033, - "observeOn": 95059, - "observer": 30730, - "obsolete": 55015, - "obsÅĤug": 140863, - "obuf": 18464, - "obutton": 82377, - "oby": 27015, - "oc": 509, - "oca": 16846, - "ocab": 20497, - "ocabulary": 43527, - "ocache": 85672, - "ocado": 46182, - "ocal": 3683, - "ocale": 36311, - "ocaly": 66680, - "ocalypse": 48308, - "ocalyptic": 68648, - "ocard": 73278, - "ocate": 81515, - "ocation": 2276, - "ocations": 55199, - "ocator": 74328, - "ocaust": 37926, - "occ": 13983, - "occan": 84011, - "occasion": 93311, - "occer": 96188, - "occo": 40842, - "occup": 23785, - "occupation": 58262, - "occupied": 40356, - "occus": 91311, - "oce": 80556, - "ocene": 77682, - "ocese": 57644, - "och": 4953, - "ocha": 58729, - "ochastic": 65954, - "ochen": 54536, - "ochond": 46417, - "ochrome": 91721, - "ocht": 63767, - "oci": 2119, - "ocial": 2705, - "ocide": 42177, - "ociety": 6052, - "ocio": 46410, - "ocious": 77187, - "ocities": 80449, - "ocity": 7453, - "ock": 1176, - "ocked": 67385, - "ocker": 13659, - "ocket": 4537, - "ockets": 19601, - "ockey": 17887, - "ocking": 70091, - "ocks": 25183, - "ocl": 61768, - "oco": 13140, - "ocoa": 33302, - "ocode": 43688, - "ocoder": 50722, - "ocol": 4547, - "ocolate": 13816, - "ocols": 22018, - "ocom": 11986, - "ocommerce": 23181, - "ocomplete": 20104, - "ocop": 83521, - "ocos": 41388, - "ocr": 4215, - "ocracy": 45260, - "ocrat": 72532, - "ocrates": 76946, - "ocratic": 37241, - "ocrats": 54106, - "ocre": 62418, - "ocrin": 90053, - "ocrine": 77638, - "ocrisy": 67145, - "ocs": 14128, - "oct": 41692, - "ocular": 67697, - "ocument": 1452, - "ocumented": 36684, - "ocup": 72125, - "ocurrency": 77480, - "ocus": 3384, - "ocused": 20387, - "ocusing": 86495, - "ocy": 33846, - "ocyte": 78659, - "ocytes": 56778, - "ocz": 83895, - "ocê": 45759, - "od": 347, - "oda": 13993, - "odable": 69129, - "odafone": 79477, - "odal": 57597, - "odash": 25601, - "odata": 56169, - "odate": 87011, - "oday": 6289, - "odb": 16853, - "odcast": 98511, - "odd": 14556, - "ode": 534, - "oded": 6737, - "odef": 97577, - "odega": 89162, - "odel": 720, - "odeled": 96479, - "odelist": 84013, - "odem": 91461, - "oden": 54736, - "oder": 4316, - "oders": 52498, - "odes": 2539, - "odesk": 71224, - "odge": 15542, - "odi": 30459, - "odia": 46328, - "odiac": 56886, - "odial": 89069, - "odian": 63849, - "odic": 52760, - "odie": 85349, - "odied": 71106, - "odies": 10028, - "odigo": 13687, - "oding": 3700, - "odings": 58335, - "odium": 46776, - "odka": 56540, - "odo": 6004, - "odom": 84767, - "odon": 76052, - "odont": 85715, - "odor": 48917, - "odore": 67465, - "odos": 16385, - "odox": 30062, - "odoxy": 92298, - "ods": 29697, - "odu": 75955, - "odule": 1756, - "odus": 49477, - "ody": 1076, - "odyn": 59670, - "odynam": 71831, - "odynamic": 59902, - "odynamics": 78911, - "odzi": 75311, - "oe": 4644, - "oeff": 20719, - "oen": 15975, - "oenix": 18399, - "oes": 7072, - "of": 1055, - "ofday": 57826, - "off": 1847, - "offee": 21180, - "offer": 25077, - "offers": 71879, - "office": 26516, - "official": 32812, - "offline": 63529, - "offs": 32483, - "offset": 3176, - "offsetof": 19214, - "ofi": 92023, - "ofil": 46799, - "ofile": 65273, - "ofilm": 78576, - "ofire": 85482, - "ofs": 36081, - "ofstream": 52930, - "oft": 14118, - "often": 60817, - "oftware": 73105, - "og": 538, - "oga": 14034, - "ogan": 29536, - "ogany": 91732, - "oge": 40532, - "ogen": 11706, - "ogene": 33124, - "ogeneity": 75630, - "ogeneous": 48022, - "ogenerated": 58605, - "ogenesis": 51279, - "ogenic": 28469, - "ogenous": 52495, - "ogens": 56018, - "oger": 55440, - "ogg": 16108, - "oggle": 5216, - "oggled": 63900, - "oggler": 39178, - "oggles": 50852, - "ogh": 63936, - "ogi": 63877, - "ogie": 77672, - "ogl": 97247, - "ogle": 2443, - "oglob": 75425, - "oglobin": 93755, - "ogn": 3934, - "ogne": 95341, - "ognition": 30656, - "ognitive": 50449, - "ognito": 63441, - "ogo": 23500, - "ogonal": 65971, - "ogr": 73546, - "ogra": 91141, - "ograd": 66911, - "ograf": 25058, - "ografia": 49801, - "ografÃŃa": 141742, - "ogram": 12958, - "ograms": 55385, - "ograph": 3178, - "ographed": 90573, - "ographer": 41506, - "ographers": 78354, - "ographic": 12679, - "ographical": 31177, - "ographically": 63931, - "ographics": 44145, - "ographies": 66145, - "ographs": 66032, - "ography": 5696, - "ográf": 82481, - "ogs": 26307, - "ogue": 27423, - "ogui": 90470, - "ogy": 15661, - "oh": 2267, - "oha": 65083, - "ohan": 56472, - "ohana": 84342, - "ohen": 26440, - "ohl": 39337, - "ohn": 3103, - "oho": 95286, - "ohon": 98592, - "oi": 6728, - "oice": 8834, - "oid": 588, - "oidal": 70816, - "oids": 16960, - "oil": 73813, - "oin": 1961, - "oine": 62816, - "oined": 73506, - "oins": 68798, - "oint": 781, - "ointed": 83979, - "ointment": 27919, - "ointments": 59517, - "oints": 14399, - "oir": 13300, - "oire": 41727, - "ois": 29048, - "oise": 68189, - "oit": 47796, - "oj": 21265, - "oji": 26902, - "ojis": 83428, - "ok": 562, - "oka": 30766, - "okable": 63734, - "okableCall": 76566, - "okane": 79586, - "okay": 93217, - "oke": 4740, - "oked": 10823, - "okedex": 86331, - "okemon": 13514, - "oken": 1679, - "okens": 9713, - "oker": 10451, - "okers": 40681, - "okes": 7940, - "oki": 38191, - "okia": 27552, - "okie": 12502, - "okies": 30818, - "okin": 78017, - "oking": 10746, - "okino": 82434, - "okit": 96363, - "oklyn": 82187, - "oko": 27243, - "oks": 34222, - "oksen": 62764, - "oku": 16493, - "okus": 90076, - "oky": 69881, - "ol": 337, - "ola": 7924, - "olah": 90786, - "olan": 37772, - "oland": 96440, - "olang": 37287, - "olar": 7417, - "olare": 76361, - "olarity": 72527, - "olars": 26242, - "olas": 19186, - "olate": 33066, - "olated": 80519, - "olatile": 25517, - "olation": 34962, - "old": 813, - "oldem": 73718, - "oldemort": 75063, - "older": 2018, - "olders": 32120, - "olding": 14995, - "oldown": 24766, - "olds": 18431, - "oldt": 93044, - "ole": 1263, - "olean": 1738, - "oleans": 96999, - "olec": 12465, - "olecular": 42843, - "olecule": 54169, - "olecules": 81106, - "oled": 41731, - "olem": 70858, - "olen": 17205, - "oleon": 59103, - "oler": 22072, - "olerance": 31661, - "oles": 7151, - "olesale": 42507, - "olest": 60995, - "olesterol": 34144, - "oley": 48999, - "olf": 8095, - "olg": 74063, - "oli": 14225, - "olia": 38160, - "olian": 88008, - "olib": 56603, - "oliberal": 71216, - "olic": 7762, - "olicies": 42038, - "olicit": 97048, - "olicited": 91104, - "olicitud": 58399, - "olics": 45907, - "olicy": 8018, - "olid": 5192, - "oliday": 10092, - "olidays": 19891, - "olie": 61017, - "olin": 36637, - "olina": 57904, - "oline": 21908, - "oling": 84569, - "olini": 94794, - "olio": 72167, - "olis": 68758, - "olist": 34675, - "olith": 47118, - "olithic": 65370, - "olk": 22604, - "olkata": 62692, - "olkien": 75979, - "oll": 965, - "olla": 42683, - "ollah": 47855, - "olland": 42332, - "ollapse": 10786, - "ollapsed": 66974, - "ollar": 21295, - "olle": 54048, - "ollect": 24605, - "ollection": 1908, - "ollections": 3107, - "ollectors": 29751, - "ollen": 32289, - "oller": 69396, - "olley": 34519, - "olleyError": 93384, - "ollider": 31255, - "ollipop": 89544, - "ollision": 29037, - "ollo": 27961, - "ollow": 1544, - "ollower": 29034, - "olls": 67878, - "olly": 8618, - "ollywood": 14115, - "olo": 10011, - "oload": 28112, - "olocation": 43206, - "olog": 1609, - "ologi": 85635, - "ologia": 37973, - "ologic": 38127, - "ological": 5729, - "ologically": 29350, - "ologie": 37369, - "ologies": 9090, - "ologist": 16155, - "ologists": 21306, - "ologna": 65790, - "ologne": 67444, - "ologue": 76728, - "ology": 2449, - "ologÃŃa": 53333, - "olon": 72269, - "olor": 789, - "olph": 42970, - "ols": 3069, - "olson": 71538, - "olt": 6181, - "olta": 59854, - "oltage": 26489, - "oltip": 13379, - "olu": 43806, - "olucion": 91560, - "olución": 77076, - "olulu": 72046, - "olum": 1132, - "olumbia": 73070, - "olume": 4661, - "olumes": 19705, - "olumn": 1286, - "olut": 9041, - "olute": 6268, - "olutely": 9689, - "olution": 3214, - "olutions": 20201, - "olv": 35315, - "olvable": 88097, - "olve": 3948, - "olved": 8731, - "olvency": 93930, - "olver": 7921, - "olvers": 39435, - "olves": 18186, - "olvimento": 78669, - "olving": 19648, - "oly": 5730, - "olygon": 19582, - "olynomial": 76309, - "ológ": 60094, - "ológica": 134411, - "ológico": 133397, - "om": 316, - "oma": 7786, - "omain": 3121, - "omal": 52811, - "omaly": 83092, - "oman": 6908, - "omanip": 55915, - "omap": 74811, - "omas": 22267, - "omat": 80768, - "omatic": 13487, - "omb": 2855, - "omba": 76930, - "ombat": 77628, - "ombie": 23342, - "ombies": 35694, - "ombine": 26197, - "ombo": 80387, - "ombok": 16424, - "ombre": 5509, - "ombres": 30032, - "ombs": 85704, - "ome": 635, - "omed": 24139, - "omedical": 60760, - "omega": 32696, - "omen": 6297, - "omencl": 88847, - "omens": 55541, - "oment": 12913, - "omentum": 58311, - "omer": 25359, - "omers": 68538, - "omes": 20347, - "omet": 4413, - "ometer": 20408, - "ometers": 32404, - "omething": 11532, - "ometimes": 12693, - "ometown": 36718, - "ometric": 23375, - "ometrics": 91791, - "ometry": 6988, - "omez": 53594, - "omi": 21441, - "omial": 20855, - "omic": 3075, - "omics": 23320, - "omid": 43019, - "omidou": 53341, - "omin": 7970, - "ominated": 49515, - "omination": 80380, - "ominator": 30206, - "oming": 17765, - "omit": 77968, - "omite": 85803, - "omitempty": 19967, - "omm": 19786, - "ommen": 46646, - "omnia": 49305, - "omo": 15900, - "omon": 34585, - "omore": 43984, - "omorphic": 69917, - "omp": 14435, - "ompiler": 87485, - "ompson": 95001, - "oms": 6940, - "omy": 5533, - "on": 263, - "onChange": 51485, - "onClick": 48897, - "onDelete": 61171, - "ona": 6721, - "onacci": 39345, - "onal": 24202, - "onald": 79694, - "onas": 55301, - "onation": 90883, - "onaut": 36064, - "once": 13184, - "onces": 42798, - "onclick": 39799, - "oncé": 94610, - "ond": 2111, - "onda": 18194, - "onde": 17231, - "onden": 72216, - "onder": 14184, - "ondere": 70439, - "onders": 27313, - "ondheim": 82303, - "ondo": 34971, - "ondon": 6474, - "ondrous": 93550, - "onds": 49958, - "one": 603, - "oned": 19684, - "onedDateTime": 83459, - "oneksi": 64242, - "onen": 41928, - "onent": 84547, - "onents": 98341, - "onenumber": 73266, - "oner": 26576, - "ones": 3154, - "onesia": 56672, - "onest": 35124, - "onestly": 80472, - "onet": 68686, - "oney": 2534, - "ong": 644, - "onga": 93924, - "ongan": 82288, - "ongo": 6363, - "ongodb": 21225, - "ongoose": 10872, - "ongs": 13181, - "ongsTo": 34225, - "ongyang": 56898, - "oni": 20783, - "onia": 21251, - "onian": 75491, - "onic": 14011, - "onica": 63945, - "onical": 22391, - "oning": 19744, - "oningen": 97177, - "onio": 81413, - "onis": 96694, - "onitor": 30314, - "onium": 89244, - "online": 25649, - "only": 3243, - "onn": 26378, - "onna": 13459, - "onne": 28952, - "onnement": 89980, - "onnen": 98103, - "onné": 134824, - "ono": 10148, - "onom": 14274, - "onomic": 47128, - "onomies": 79346, - "onomous": 29846, - "onomy": 16974, - "onomÃŃa": 141019, - "onor": 54037, - "ons": 2382, - "onsense": 97733, - "onso": 61767, - "ont": 544, - "onta": 49414, - "onte": 52277, - "onth": 6039, - "onto": 9935, - "ontology": 62233, - "ontvangst": 53209, - "onus": 27698, - "ony": 3549, - "onym": 7831, - "onymous": 9757, - "onyms": 45603, - "onz": 27045, - "oo": 2624, - "ood": 1386, - "oodle": 30607, - "oodles": 97121, - "oodoo": 73401, - "oods": 9065, - "oogle": 2671, - "ook": 1941, - "ooke": 85458, - "ookeeper": 94171, - "ookie": 9619, - "ookies": 25874, - "ooks": 14685, - "ooky": 66724, - "ool": 1749, - "oolStrip": 10094, - "oola": 45980, - "ooled": 45073, - "ools": 6178, - "oom": 4191, - "oomla": 45836, - "oon": 9009, - "oons": 28539, - "ooo": 38621, - "oooo": 25761, - "oooooooo": 60293, - "oop": 47306, - "oops": 64562, - "oor": 10692, - "oord": 81437, - "oose": 13752, - "oot": 1905, - "ooter": 9746, - "ooth": 6491, - "oothing": 38413, - "ooting": 27462, - "op": 453, - "opa": 39852, - "opacity": 20570, - "opal": 56979, - "opaque": 95480, - "opard": 31929, - "opath": 35111, - "opathic": 61109, - "opathy": 52942, - "opause": 83010, - "opc": 67858, - "opcion": 92781, - "opcode": 48128, - "ope": 2792, - "oped": 16367, - "open": 2508, - "opencv": 43195, - "opened": 56128, - "openh": 42070, - "openhagen": 44829, - "openid": 48551, - "opening": 67685, - "opens": 24175, - "opensource": 44408, - "openssl": 53612, - "oper": 3296, - "operand": 40609, - "operands": 92593, - "operate": 85199, - "operation": 9262, - "operations": 38163, - "operative": 42619, - "operator": 7884, - "operators": 32838, - "opers": 51087, - "opes": 18523, - "opez": 41259, - "oph": 5127, - "ophage": 97954, - "ophe": 80409, - "opher": 16940, - "ophil": 97535, - "ophile": 67446, - "ophilia": 92555, - "ophobia": 54508, - "ophobic": 60700, - "ophon": 93806, - "ophone": 77203, - "ophys": 84304, - "ophysical": 89904, - "opi": 71087, - "opia": 29551, - "opian": 47648, - "opic": 24810, - "opies": 75541, - "oping": 33707, - "opl": 55078, - "oplan": 93460, - "oplast": 91235, - "oplay": 36265, - "oplayer": 93108, - "ople": 1164, - "opleft": 76252, - "oples": 26424, - "oplevel": 67780, - "opo": 55709, - "opol": 27665, - "opolitan": 84909, - "opoly": 39763, - "opor": 88666, - "opot": 88390, - "opoulos": 56895, - "opp": 4775, - "oppable": 77539, - "opped": 17573, - "oppel": 66522, - "opper": 18487, - "oppers": 31442, - "opping": 7008, - "oppins": 79396, - "opport": 143008, - "opportunitÃł": 143009, - "opr": 46288, - "opro": 45926, - "oproject": 61351, - "ops": 3721, - "opsis": 32806, - "opsy": 48192, - "opt": 2912, - "optgroup": 96330, - "optic": 93683, - "optim": 19133, - "optimize": 94332, - "optimized": 98868, - "optimizer": 33296, - "option": 2047, - "optional": 12807, - "options": 2875, - "opts": 10518, - "opup": 27735, - "opus": 45870, - "opy": 1266, - "opyright": 2171, - "opération": 135016, - "oque": 60552, - "or": 269, - "orElse": 54088, - "orThunk": 42844, - "orWhere": 83328, - "ora": 6215, - "orable": 24715, - "oracle": 69631, - "orado": 96755, - "orage": 2680, - "oral": 9819, - "oralType": 95904, - "oram": 93496, - "orama": 48016, - "oran": 54404, - "orang": 84168, - "orange": 34164, - "orarily": 96154, - "orary": 7592, - "oras": 64647, - "orate": 37895, - "oration": 7614, - "orative": 62365, - "orb": 29886, - "orbit": 74341, - "orc": 49822, - "orca": 92159, - "orce": 16316, - "orch": 21584, - "ord": 539, - "orda": 57080, - "ordable": 35170, - "ordan": 13396, - "orde": 52118, - "orden": 27784, - "order": 1358, - "orderBy": 22197, - "orderId": 53491, - "orderby": 45757, - "ordered": 10544, - "orderid": 97561, - "ordering": 51869, - "orders": 7917, - "ordes": 80392, - "ordial": 92673, - "ordin": 5986, - "ordinal": 45151, - "ordinary": 21031, - "ordinate": 8730, - "ordinated": 82469, - "ordinates": 8742, - "ordination": 98244, - "ordinator": 17442, - "ording": 2678, - "ordion": 25711, - "ordo": 51272, - "ordon": 21508, - "ordova": 76163, - "ords": 2260, - "ore": 460, - "orea": 60048, - "oreach": 8539, - "oreal": 89768, - "orean": 45195, - "ored": 3018, - "oredProcedure": 45517, - "oref": 46752, - "oreferrer": 57940, - "orelease": 45214, - "orem": 13173, - "oren": 23647, - "orent": 68525, - "orer": 14827, - "ores": 4589, - "orest": 41419, - "orestation": 96793, - "oret": 18174, - "oretical": 90767, - "orf": 32842, - "org": 1775, - "organ": 8462, - "organic": 60594, - "organisation": 57804, - "organisms": 75891, - "organization": 23899, - "organizations": 69253, - "organized": 62216, - "orge": 6670, - "orgen": 39563, - "orgeous": 20708, - "orges": 80775, - "orget": 55755, - "orgetown": 59468, - "orgh": 88526, - "orghini": 95319, - "orgia": 46949, - "orgot": 43685, - "orgt": 82751, - "ori": 13601, - "oria": 10782, - "orial": 21913, - "orian": 22090, - "orianCalendar": 63793, - "orias": 67263, - "oriasis": 91903, - "oric": 26359, - "orical": 69748, - "orida": 39757, - "orie": 29203, - "orient": 14881, - "orientation": 24294, - "oriented": 32436, - "ories": 2433, - "orig": 4670, - "origin": 8611, - "original": 9889, - "oring": 5503, - "orio": 49831, - "orious": 21995, - "oriously": 69024, - "oris": 50280, - "orizontal": 8101, - "ork": 669, - "orks": 73302, - "orld": 1385, - "orm": 493, - "ormal": 2492, - "orman": 62875, - "ormap": 39031, - "ormsg": 82027, - "orn": 1512, - "orna": 33264, - "ornado": 62943, - "orne": 16907, - "ornecedor": 76935, - "orners": 44280, - "orney": 9430, - "orneys": 26812, - "orning": 79575, - "ornings": 51685, - "ornment": 94475, - "orno": 11121, - "orns": 43029, - "orny": 79577, - "oro": 18307, - "oron": 84850, - "orough": 14438, - "orous": 20244, - "orp": 30115, - "orph": 16347, - "orphic": 40869, - "orphism": 52807, - "orpion": 72475, - "orpor": 38282, - "orption": 65081, - "orque": 85964, - "orr": 17391, - "orra": 83038, - "orraine": 90022, - "orrar": 57648, - "orre": 92433, - "orrect": 27034, - "orrent": 48709, - "orrh": 53208, - "orris": 97316, - "orro": 67569, - "orrow": 7768, - "orry": 8468, - "ors": 1087, - "orsch": 79985, - "orsche": 43476, - "orse": 10836, - "orses": 22434, - "orsi": 73087, - "orsk": 81587, - "orst": 65296, - "ort": 371, - "orta": 88539, - "ortal": 33372, - "ortality": 74952, - "orte": 16568, - "orted": 13595, - "ortex": 44592, - "orth": 2364, - "orthand": 61679, - "ortho": 90824, - "orthy": 33494, - "ortic": 89338, - "orting": 51472, - "ortion": 25886, - "orton": 37100, - "orts": 18955, - "oru": 65005, - "orum": 33006, - "orus": 29869, - "ory": 679, - "orz": 67323, - "os": 436, - "osa": 11983, - "osaic": 44783, - "osal": 32556, - "osals": 85975, - "osas": 86809, - "osate": 87870, - "osaur": 57976, - "osaurs": 52256, - "osc": 23469, - "osci": 84628, - "oscope": 62653, - "oscopic": 83567, - "ose": 960, - "oseconds": 75889, - "osed": 19586, - "osemite": 83013, - "osen": 8313, - "oser": 23438, - "oses": 19696, - "osex": 19791, - "osexual": 48200, - "osg": 91412, - "osh": 9267, - "oshi": 31845, - "osi": 30724, - "osing": 14421, - "osis": 10704, - "osit": 34054, - "osite": 87742, - "osition": 2113, - "osity": 22053, - "osl": 47458, - "oso": 27147, - "osomal": 95008, - "osome": 31454, - "osomes": 57275, - "osoph": 11343, - "osopher": 45359, - "osos": 94328, - "osp": 4785, - "ospace": 80014, - "ospel": 26156, - "ospels": 97998, - "osph": 23609, - "osphate": 92373, - "osphere": 65122, - "ospital": 6298, - "oss": 3662, - "ossa": 43836, - "ossal": 78816, - "ossed": 87850, - "ossible": 23653, - "ossier": 39229, - "ossil": 83961, - "ossip": 41473, - "ost": 535, - "osta": 27364, - "oste": 84123, - "osten": 14012, - "oster": 11713, - "osterone": 32474, - "osti": 70679, - "osto": 35790, - "oston": 9424, - "ostream": 7617, - "ostringstream": 59006, - "ot": 354, - "ota": 6089, - "otal": 2370, - "otas": 53524, - "otate": 20223, - "otation": 11606, - "otch": 93607, - "ote": 1272, - "otec": 88162, - "oteca": 64390, - "otech": 58096, - "otechn": 44760, - "otechnology": 51436, - "oted": 9253, - "otel": 40785, - "oten": 65628, - "otence": 97560, - "otent": 63532, - "oter": 25392, - "oteric": 82675, - "oters": 39796, - "otes": 6295, - "oth": 8767, - "other": 1575, - "otherapy": 41711, - "othermal": 89996, - "others": 58861, - "otherwise": 59936, - "othy": 28571, - "oti": 88292, - "otic": 14212, - "otics": 49903, - "otide": 67944, - "otify": 37253, - "otime": 19175, - "otine": 39153, - "oting": 11519, - "otion": 5956, - "otionEvent": 63420, - "otional": 40864, - "otions": 40256, - "otive": 23827, - "otland": 77111, - "otle": 50526, - "otlin": 15345, - "oto": 2072, - "otomy": 84895, - "oton": 25849, - "otonin": 66955, - "otope": 50682, - "otor": 9887, - "otos": 8001, - "otoxic": 90576, - "otp": 48708, - "otr": 86379, - "otre": 51162, - "otron": 51005, - "otropic": 78332, - "otros": 47045, - "ots": 2412, - "ott": 1716, - "otta": 22193, - "ottage": 33695, - "otte": 50011, - "otted": 15521, - "otten": 10291, - "ottenham": 49703, - "ottes": 48253, - "ottesville": 60570, - "otti": 41227, - "ottie": 82229, - "ottle": 62118, - "otto": 35626, - "ottom": 2826, - "otton": 16881, - "otts": 87701, - "otty": 57639, - "otyp": 36841, - "otype": 4156, - "otypes": 21830, - "otypical": 87067, - "otyping": 66147, - "ou": 283, - "oub": 5482, - "ouble": 1201, - "oubles": 85613, - "oubted": 33300, - "oubtedly": 34110, - "ouce": 69779, - "ouch": 3026, - "ouched": 33070, - "oucher": 23937, - "ouchers": 52755, - "oud": 2950, - "ouden": 67527, - "oueur": 71166, - "oufl": 61740, - "ouflage": 72231, - "oug": 48304, - "ough": 1384, - "ought": 2450, - "oui": 73844, - "ouis": 47990, - "oul": 10965, - "ould": 616, - "oulder": 37634, - "oulos": 53947, - "oulouse": 66630, - "oultry": 54019, - "oun": 1624, - "ounc": 2981, - "ounce": 9734, - "ounced": 19453, - "ouncement": 40171, - "ouncements": 54264, - "ouncer": 79745, - "ounces": 29944, - "ouncil": 6690, - "ouncill": 45403, - "ouncing": 36757, - "ouncy": 81301, - "ound": 795, - "oundary": 72466, - "oundation": 4068, - "ounded": 13082, - "ounder": 92906, - "ounding": 13586, - "oundingBox": 57504, - "ounds": 3095, - "ounge": 25564, - "ouns": 58986, - "ounsel": 93641, - "ount": 629, - "ountain": 34524, - "ountains": 92306, - "ounter": 39914, - "ounters": 92002, - "ountries": 20126, - "ountry": 4976, - "ounty": 36725, - "oup": 13346, - "ouple": 84389, - "ouples": 68426, - "oupon": 32987, - "oupper": 36888, - "our": 413, - "ourage": 60040, - "ource": 919, - "ourced": 53392, - "ourcem": 96831, - "ources": 2360, - "ourcing": 42562, - "ourd": 76392, - "oure": 79184, - "oured": 20394, - "ourg": 48441, - "ouri": 21467, - "ourke": 84434, - "ourmet": 50702, - "ourn": 3431, - "ournal": 4931, - "ournals": 32614, - "ournament": 9783, - "ournaments": 33568, - "ournemouth": 96979, - "ourney": 32990, - "ournée": 71394, - "ouro": 49826, - "ours": 2471, - "ourse": 5253, - "ourses": 16349, - "ourt": 28586, - "ous": 782, - "ousand": 51849, - "ousands": 39037, - "ouse": 1530, - "oused": 36488, - "ousedown": 48066, - "ousel": 12374, - "ouser": 88005, - "ouses": 19757, - "ousing": 21738, - "ously": 7017, - "ousse": 45551, - "oust": 25112, - "oustic": 34315, - "ouston": 14415, - "ousy": 93523, - "out": 411, - "outcome": 86194, - "outdir": 94853, - "oute": 2133, - "outed": 18533, - "outedEventArgs": 29072, - "outer": 2676, - "outers": 66095, - "outes": 5495, - "outfile": 59625, - "outh": 2898, - "outil": 30158, - "outine": 14159, - "outines": 28628, - "outing": 10909, - "outline": 44130, - "outlined": 49133, - "output": 3006, - "outputs": 41006, - "outs": 11672, - "outside": 66990, - "outu": 50032, - "outube": 10221, - "ouv": 65767, - "ouve": 82284, - "ouver": 14826, - "oux": 40570, - "ov": 859, - "ova": 12660, - "ovable": 31955, - "ovah": 71094, - "oval": 13516, - "ovan": 42657, - "ovation": 22874, - "ove": 994, - "oved": 4941, - "ovel": 43335, - "ovement": 14458, - "oven": 16253, - "ovenant": 38602, - "over": 1975, - "overall": 74455, - "overe": 68930, - "overflow": 20823, - "overlap": 80061, - "overlay": 21118, - "overn": 6706, - "overnment": 25057, - "override": 9199, - "overrides": 83358, - "overs": 8969, - "overview": 49278, - "overwrite": 64915, - "oves": 10088, - "ovi": 45088, - "ovic": 40045, - "ovich": 50114, - "ovid": 25582, - "ovie": 6327, - "ovies": 12546, - "oving": 9130, - "ovo": 21715, - "ovolta": 92491, - "ovsky": 78578, - "ovy": 61515, - "ow": 363, - "owa": 13472, - "owan": 80231, - "owane": 73349, - "owania": 56029, - "owanie": 54389, - "owany": 94791, - "oward": 81971, - "owards": 70739, - "owaÄĩ": 49147, - "owaÅĤ": 128958, - "owaÅĤa": 132233, - "owe": 23733, - "owed": 12817, - "owego": 77280, - "owej": 60382, - "owel": 67057, - "owell": 79499, - "ower": 1202, - "owered": 79213, - "owering": 89614, - "owers": 15965, - "owi": 71338, - "owie": 28986, - "owied": 59428, - "owing": 23184, - "owitz": 52331, - "owl": 9605, - "owler": 64328, - "owment": 75455, - "own": 779, - "owned": 18332, - "owner": 8118, - "owners": 22980, - "ownership": 78147, - "ownik": 72732, - "ownload": 37702, - "owns": 42356, - "ownt": 12901, - "owntown": 15508, - "owo": 57715, - "owoÅĽci": 128124, - "owoÅĽÄĩ": 140615, - "ows": 4241, - "owski": 28284, - "owy": 36875, - "owych": 45911, - "owÄħ": 128891, - "ox": 5131, - "oxel": 52391, - "oxetine": 90603, - "oxic": 81229, - "oxid": 83978, - "oxide": 54089, - "oxy": 60163, - "oy": 2253, - "oya": 46062, - "oyal": 47102, - "oyer": 41119, - "oyo": 52378, - "oystick": 74132, - "oz": 9510, - "oze": 90153, - "ozilla": 27342, - "ozo": 95514, - "ozy": 75423, - "oÃłi": 133046, - "oÄŁ": 129294, - "oÄŁlu": 129295, - "oÅĽci": 89056, - "oÅĽciÄħ": 130795, - "oÅĽÄĩ": 128428, - "p": 79, - "pData": 57881, - "pNet": 49929, - "pNext": 89281, - "pa": 6595, - "paRepository": 41972, - "pac": 44951, - "pace": 1306, - "paced": 68552, - "paces": 27338, - "pack": 4748, - "package": 1722, - "packageName": 91063, - "packages": 43141, - "packed": 50321, - "packet": 24829, - "packing": 95124, - "pad": 13242, - "padding": 9571, - "padÅĤ": 140793, - "pag": 18419, - "page": 2893, - "pageIndex": 91877, - "pageNum": 81297, - "pageNumber": 84727, - "pageSize": 39069, - "pageTitle": 85786, - "paged": 63115, - "pagen": 82613, - "pager": 46200, - "pages": 10781, - "pagesize": 84917, - "pagina": 63897, - "paginate": 38465, - "pagination": 25584, - "paginator": 78356, - "paging": 72746, - "pai": 84959, - "paid": 34678, - "pain": 91624, - "paint": 33617, - "pair": 12670, - "paired": 76167, - "pairs": 77256, - "pais": 87098, - "pak": 70989, - "pal": 19308, - "palette": 59674, - "pan": 848, - "pane": 25325, - "panel": 7429, - "panels": 82698, - "panic": 19079, - "panied": 22065, - "panies": 17010, - "panion": 40790, - "panse": 94419, - "pants": 91937, - "pany": 1981, - "paper": 19166, - "papers": 47293, - "paque": 53422, - "par": 1732, - "para": 14794, - "parable": 49156, - "paragraph": 27727, - "paragus": 93689, - "paralle": 64761, - "parallel": 46103, - "paralleled": 67801, - "param": 903, - "parameter": 16181, - "parameters": 13786, - "paramref": 43015, - "params": 3519, - "parate": 67598, - "parated": 49600, - "paration": 35135, - "parator": 12356, - "parcel": 95920, - "pard": 61643, - "pare": 3380, - "pared": 7212, - "paredStatement": 22422, - "paren": 41064, - "parency": 21279, - "parent": 3765, - "parentId": 53548, - "parentNode": 80704, - "parents": 25456, - "parer": 61119, - "paring": 44152, - "parison": 35542, - "parity": 94368, - "park": 28736, - "parm": 57453, - "parms": 77508, - "pars": 72380, - "parse": 6400, - "parseFloat": 64872, - "parseInt": 33587, - "parsed": 41030, - "parser": 9657, - "parsers": 88564, - "part": 4480, - "partial": 37420, - "partials": 49458, - "participant": 58513, - "participants": 91135, - "particle": 41979, - "particles": 68498, - "particularly": 72939, - "partition": 40998, - "partment": 35991, - "partner": 36258, - "partners": 97031, - "parts": 18252, - "party": 32957, - "pas": 41101, - "pass": 6385, - "passed": 35422, - "passes": 94323, - "passport": 42669, - "passwd": 52500, - "password": 3833, - "past": 52420, - "paste": 56868, - "pat": 4676, - "patch": 3400, - "patches": 96878, - "path": 2343, - "pathname": 66281, - "paths": 21623, - "patial": 32414, - "patibility": 53053, - "patible": 37079, - "patient": 22722, - "patients": 80337, - "patrick": 64220, - "pattern": 14339, - "patterns": 25971, - "pause": 27448, - "paused": 78293, - "pawn": 68596, - "pay": 13890, - "payer": 93586, - "payload": 19427, - "payment": 13755, - "payments": 63043, - "paypal": 71205, - "pañ": 142298, - "pb": 16650, - "pbs": 26015, - "pc": 3992, - "pcb": 90870, - "pcf": 90143, - "pch": 70348, - "pci": 55387, - "pcion": 16270, - "pciones": 77368, - "pción": 43328, - "pcl": 77853, - "pcm": 76484, - "pcodes": 71719, - "pcs": 47313, - "pd": 15360, - "pdata": 57796, - "pdb": 84202, - "pdev": 49419, - "pdf": 11828, - "pdo": 29714, - "pe": 375, - "peace": 54125, - "peak": 22792, - "peaker": 65474, - "pear": 8015, - "pearance": 13024, - "peare": 36552, - "peat": 10979, - "peated": 41954, - "peater": 65242, - "peating": 64877, - "peats": 82439, - "pec": 992, - "pecia": 79960, - "pecial": 2964, - "pecially": 4794, - "pecies": 88621, - "pecific": 15564, - "pecified": 44040, - "pect": 987, - "pected": 4046, - "pecting": 65348, - "pection": 16076, - "pections": 48713, - "pective": 9085, - "pectives": 32201, - "pector": 18997, - "pectral": 86575, - "pectrum": 38706, - "pects": 7973, - "ped": 6874, - "pedia": 82050, - "pedido": 80662, - "pedo": 52494, - "pee": 61498, - "peech": 39586, - "peed": 4508, - "peek": 29107, - "peer": 16537, - "pees": 81300, - "peg": 10311, - "pegawai": 72958, - "pei": 63874, - "pek": 87176, - "pekt": 78881, - "pel": 47524, - "pell": 37522, - "pellier": 91654, - "pen": 2752, - "pend": 3740, - "pendicular": 68551, - "pending": 28210, - "peng": 63083, - "pent": 45125, - "peon": 90036, - "people": 16069, - "peq": 82338, - "per": 712, - "perPage": 94622, - "perate": 79113, - "peration": 91774, - "perator": 76866, - "perature": 14365, - "perc": 48135, - "percent": 24422, - "percentage": 40550, - "pered": 42768, - "perf": 59545, - "perfect": 63085, - "perfil": 81071, - "perform": 28488, - "performance": 61244, - "perhaps": 65272, - "peri": 31736, - "peria": 74099, - "perial": 67227, - "perience": 12970, - "perienced": 44833, - "periences": 68497, - "periment": 14329, - "perimental": 25513, - "periments": 49632, - "pering": 60718, - "period": 19304, - "perl": 64936, - "perm": 19913, - "permalink": 81104, - "permanent": 97424, - "permission": 22618, - "permissions": 29900, - "permit": 39681, - "perms": 87772, - "peror": 25819, - "pers": 31290, - "perse": 81244, - "persist": 39826, - "persistent": 69389, - "person": 8987, - "persona": 70594, - "personal": 29612, - "persons": 76651, - "pert": 76368, - "pery": 61379, - "pes": 20352, - "pesan": 96285, - "pest": 29123, - "pet": 6862, - "petition": 55767, - "pets": 64201, - "petto": 82243, - "pez": 39959, - "peÅĤ": 126739, - "peÅĤni": 129887, - "pf": 15897, - "pg": 3517, - "pga": 74669, - "pgsql": 53298, - "ph": 759, - "pha": 3967, - "phabet": 18485, - "phalt": 35174, - "phan": 9943, - "phans": 84311, - "phant": 26924, - "phants": 52567, - "phanumeric": 65788, - "phas": 50380, - "phase": 25141, - "phasis": 54149, - "phe": 80806, - "phem": 59941, - "phen": 14769, - "pher": 28082, - "pherd": 42531, - "phere": 8023, - "pheres": 64633, - "pheric": 32249, - "pherical": 44745, - "phet": 21951, - "phetamine": 65604, - "phi": 16827, - "phia": 17653, - "phies": 47072, - "phil": 45085, - "phin": 54753, - "phins": 39672, - "phinx": 49561, - "phis": 36789, - "phon": 51701, - "phone": 4844, - "phoneNumber": 58173, - "phones": 16729, - "phony": 29648, - "phoon": 77049, - "phot": 51299, - "photo": 11556, - "photos": 24603, - "php": 1208, - "phrase": 27710, - "phthalm": 80837, - "phy": 12700, - "phys": 41205, - "physical": 46592, - "physics": 66765, - "pi": 2493, - "piar": 56526, - "pic": 15587, - "picable": 94018, - "pick": 29245, - "picked": 93499, - "picker": 14868, - "pickle": 85905, - "pickup": 84684, - "pics": 73457, - "picture": 26483, - "pictureBox": 59933, - "pictured": 68289, - "pictures": 75403, - "pid": 10412, - "pie": 20283, - "piece": 22362, - "pieces": 46468, - "pieczeÅĦ": 128184, - "pieczeÅĦst": 128185, - "piel": 44236, - "pies": 44652, - "pig": 89500, - "pii": 93921, - "pike": 64446, - "pile": 12192, - "piler": 28055, - "pill": 49846, - "pillar": 76502, - "pin": 13273, - "pine": 38038, - "ping": 9989, - "pink": 63249, - "pins": 74558, - "pio": 11917, - "pios": 92397, - "pip": 51501, - "pipe": 13768, - "pipeline": 51258, - "pipes": 86720, - "pir": 5565, - "piration": 28479, - "pire": 22922, - "pired": 11724, - "pires": 18968, - "piring": 78763, - "pirit": 52729, - "piry": 48209, - "pis": 56896, - "pisa": 139525, - "pisaÄĩ": 139526, - "pit": 32586, - "pitch": 53238, - "pite": 5972, - "pivot": 68441, - "pix": 35484, - "pixel": 29684, - "pixels": 53319, - "pizza": 92438, - "piÄĻ": 142029, - "piÄĻt": 142030, - "pj": 91116, - "pk": 20819, - "pkg": 30069, - "pkt": 46775, - "pl": 500, - "pla": 56538, - "place": 2007, - "placed": 36369, - "placeholder": 12384, - "placeholders": 82670, - "placement": 16101, - "placements": 63535, - "placer": 90212, - "places": 26078, - "placing": 47933, - "plain": 20772, - "plaint": 31297, - "plaintext": 71223, - "plan": 10393, - "planation": 35890, - "plane": 19025, - "planes": 38057, - "planet": 50074, - "plans": 78524, - "plant": 20827, - "plants": 63705, - "plash": 19493, - "plat": 42339, - "plate": 1750, - "plates": 7278, - "platform": 15734, - "platz": 57548, - "play": 1363, - "played": 50808, - "player": 3434, - "players": 18312, - "playing": 41912, - "playlist": 34233, - "plays": 27797, - "ple": 694, - "pleado": 32266, - "pleasant": 43907, - "please": 30021, - "pled": 49085, - "plement": 2764, - "plementary": 65982, - "plementation": 9874, - "plemented": 14231, - "plements": 4674, - "plen": 86535, - "pler": 12910, - "plers": 88409, - "plet": 10819, - "plete": 5171, - "pleted": 11028, - "pletely": 49168, - "pletion": 14386, - "plets": 89492, - "plevel": 88805, - "plex": 9111, - "pliance": 31612, - "pliant": 59852, - "plib": 81682, - "plied": 3440, - "plier": 7875, - "pliers": 15178, - "plies": 7202, - "pline": 31439, - "pling": 11863, - "plings": 80302, - "plist": 39934, - "plit": 2292, - "plits": 39033, - "plitude": 30050, - "pll": 80438, - "plode": 70744, - "plorer": 79825, - "plot": 4469, - "plotlib": 15406, - "plots": 32797, - "ploy": 2693, - "ployment": 52799, - "plr": 94845, - "pls": 56986, - "plt": 9476, - "pluck": 58496, - "plug": 47474, - "plugin": 9138, - "plugins": 18716, - "plural": 66546, - "plus": 7138, - "plusplus": 24428, - "plx": 78854, - "ply": 2541, - "plätze": 142454, - "pm": 5187, - "pmat": 94663, - "pn": 19958, - "pname": 82662, - "png": 14066, - "po": 5368, - "pod": 39073, - "poi": 82263, - "point": 2768, - "pointer": 16044, - "points": 7706, - "poke": 48098, - "pokemon": 57380, - "pol": 9896, - "polate": 45429, - "polation": 44686, - "polator": 57736, - "pole": 68072, - "policy": 34790, - "polit": 90527, - "political": 74685, - "poll": 30141, - "pollo": 85890, - "poly": 33435, - "polygon": 65012, - "pon": 618, - "ponce": 88055, - "pond": 3511, - "ponde": 75049, - "ponder": 20328, - "pone": 80917, - "ponent": 1146, - "ponential": 59825, - "ponents": 2700, - "pong": 59102, - "ponge": 36254, - "ponible": 96851, - "pons": 2737, - "ponse": 1025, - "ponses": 22648, - "ponsible": 42319, - "ponsive": 14221, - "ponsor": 30241, - "ponsored": 34741, - "ponsors": 50876, - "pool": 10285, - "poon": 31976, - "poons": 82088, - "pop": 8374, - "popover": 68842, - "popular": 43248, - "populate": 47721, - "population": 44441, - "popup": 23706, - "por": 4308, - "pora": 70664, - "porate": 60621, - "porn": 56650, - "porno": 78385, - "port": 403, - "portal": 37953, - "porte": 44708, - "ported": 35526, - "porter": 89232, - "portfolio": 27159, - "portion": 15388, - "portlet": 84543, - "porto": 92574, - "portrait": 95641, - "ports": 3394, - "portun": 55886, - "portunity": 67064, - "pos": 966, - "posable": 17421, - "posables": 95966, - "posal": 24155, - "pose": 2900, - "posed": 3865, - "poser": 20071, - "poses": 8285, - "posición": 130858, - "posing": 8314, - "posit": 2724, - "posite": 13607, - "posites": 80139, - "position": 3487, - "positions": 27436, - "positive": 30487, - "positor": 60950, - "positories": 17286, - "pository": 3099, - "posium": 53137, - "posix": 80804, - "posição": 131280, - "poss": 8831, - "possible": 10031, - "possibly": 53128, - "post": 2203, - "postData": 65139, - "postId": 71716, - "posta": 38531, - "postal": 33170, - "postalcode": 76481, - "postcode": 72438, - "posted": 43082, - "poster": 45401, - "postgres": 43070, - "postgresql": 88470, - "posting": 64564, - "posts": 12664, - "posure": 12044, - "posé": 132189, - "pot": 19099, - "potential": 91936, - "pour": 54519, - "pow": 21743, - "power": 13175, - "powered": 51516, - "powers": 77304, - "powied": 128070, - "powiedzie": 139570, - "powiedzieÄĩ": 139571, - "powiedź": 140849, - "pożycz": 143442, - "pp": 602, - "ppard": 98004, - "ppe": 71905, - "pped": 6924, - "ppelin": 68008, - "pper": 6922, - "ppers": 35523, - "pping": 10732, - "ppo": 39480, - "pps": 59543, - "ppt": 97428, - "ppv": 98597, - "ppy": 33963, - "pq": 64016, - "pr": 649, - "pra": 31659, - "praak": 79086, - "practice": 59521, - "pragma": 6015, - "prar": 93950, - "pras": 81222, - "pray": 90604, - "prd": 86222, - "pre": 1726, - "pread": 20717, - "prec": 10645, - "precated": 19889, - "precation": 69593, - "preced": 26152, - "precedented": 28691, - "prech": 61231, - "preci": 62453, - "precio": 47774, - "precision": 27182, - "pred": 23464, - "predicate": 61785, - "predict": 34698, - "predicted": 94300, - "prediction": 68931, - "predictions": 91327, - "pref": 30552, - "prefer": 80060, - "preferences": 60989, - "preferred": 73486, - "prefix": 11849, - "prefs": 60963, - "preg": 29485, - "preh": 30782, - "prehensive": 52899, - "preload": 96007, - "premium": 84594, - "prend": 58876, - "prene": 16534, - "preneur": 55305, - "prenom": 66348, - "prep": 71774, - "prepare": 13609, - "prepared": 60112, - "prepend": 55906, - "pres": 23623, - "presence": 73419, - "present": 28744, - "presentation": 43925, - "preserve": 92882, - "preset": 85508, - "presión": 134252, - "press": 1873, - "pressed": 14318, - "pression": 4011, - "pressions": 39873, - "pressive": 68463, - "presso": 34460, - "pressor": 56220, - "pressure": 45974, - "pressão": 135353, - "prestashop": 91292, - "pret": 8043, - "preter": 28637, - "pretty": 32955, - "prev": 9883, - "prevState": 66743, - "prevent": 92655, - "preview": 27171, - "previous": 19702, - "pri": 68608, - "price": 6555, - "prices": 58769, - "pricing": 74370, - "prim": 17893, - "primary": 6545, - "primaryKey": 54513, - "prime": 32338, - "primer": 47570, - "primir": 49067, - "primitive": 73448, - "principal": 66450, - "pring": 2637, - "print": 1350, - "printStats": 82261, - "printed": 52213, - "printer": 62956, - "printf": 2517, - "printing": 98831, - "println": 33655, - "prints": 25738, - "printw": 94095, - "prior": 64233, - "priority": 23582, - "prise": 9671, - "prises": 25425, - "prising": 33654, - "prisingly": 48164, - "prit": 39707, - "prite": 5734, - "prites": 28879, - "priv": 11887, - "privacy": 46821, - "private": 1996, - "privation": 64493, - "privileged": 97288, - "prix": 91713, - "prm": 94043, - "pro": 776, - "prob": 19899, - "probability": 87440, - "probably": 54440, - "probante": 87937, - "probe": 52329, - "problem": 34586, - "problems": 95340, - "proc": 15782, - "procedure": 21141, - "process": 4630, - "processable": 57240, - "processed": 34022, - "processing": 20660, - "processor": 29474, - "processors": 81748, - "procs": 90087, - "prod": 19748, - "produ": 8555, - "produce": 97274, - "producer": 58912, - "product": 3031, - "productId": 46166, - "productName": 88426, - "production": 22627, - "productive": 33270, - "producto": 46707, - "productos": 74905, - "products": 10144, - "produk": 88812, - "produto": 66195, - "prof": 21826, - "profession": 96135, - "professional": 65786, - "profil": 90992, - "profile": 5365, - "profiles": 56195, - "profit": 25394, - "profits": 76501, - "prog": 32992, - "program": 14906, - "programming": 91626, - "programs": 72953, - "progress": 14366, - "progressbar": 81583, - "proj": 30386, - "project": 4987, - "projectId": 62562, - "projection": 60471, - "projects": 17161, - "prom": 24468, - "promise": 49550, - "promo": 75465, - "promotion": 74142, - "prompt": 40581, - "pron": 71139, - "proof": 15780, - "prop": 2674, - "propTypes": 86993, - "proper": 80668, - "properties": 13193, - "property": 3699, - "propertyName": 62548, - "proposal": 73874, - "propri": 70521, - "props": 4761, - "prot": 4391, - "protect": 45979, - "protected": 5764, - "protein": 78465, - "proto": 15110, - "protobuf": 32921, - "protocol": 17014, - "protocols": 85412, - "prototype": 45654, - "prov": 42947, - "prove": 34463, - "proved": 95508, - "provide": 61456, - "provided": 63425, - "provider": 19979, - "providers": 47287, - "province": 26335, - "prowad": 128132, - "prowadzi": 128133, - "prowadziÄĩ": 140699, - "prowadziÅĤ": 142311, - "prox": 41498, - "proxy": 22803, - "prs": 84305, - "prt": 88697, - "prung": 92352, - "prus": 49887, - "przed": 128198, - "przedsi": 128199, - "przedsiÄĻb": 128200, - "przedsiÄĻbior": 128201, - "przedsiÄĻbiorc": 143957, - "przedsiÄĻbiorst": 142625, - "przedsiÄĻbiorstw": 142626, - "pré": 133938, - "prés": 130311, - "présent": 130312, - "prü": 66693, - "prüf": 133618, - "ps": 1690, - "psc": 81984, - "pseudo": 68893, - "psi": 30765, - "psilon": 59892, - "pson": 18014, - "pst": 88795, - "psy": 45146, - "psych": 91009, - "psz": 44688, - "pt": 417, - "pta": 51591, - "pte": 24151, - "pter": 73137, - "ptest": 70334, - "pth": 8490, - "pthread": 36283, - "ptic": 26235, - "ptide": 46209, - "ptides": 73389, - "ptime": 28941, - "ption": 560, - "ptions": 1300, - "ptive": 53735, - "pto": 57991, - "ptom": 79697, - "ptoms": 51173, - "pton": 18748, - "ptr": 3505, - "ptrdiff": 88269, - "ptron": 94710, - "pts": 12754, - "ptune": 51914, - "pty": 1595, - "ptype": 72814, - "pu": 5584, - "pub": 9585, - "public": 888, - "publication": 71160, - "publish": 27502, - "published": 32866, - "publisher": 51191, - "pull": 23441, - "pulse": 78207, - "pun": 64907, - "punk": 75509, - "punkt": 71865, - "pur": 24998, - "purchase": 33877, - "pure": 51733, - "purple": 56507, - "purpose": 76663, - "pus": 17820, - "push": 9077, - "pushViewController": 97271, - "put": 628, - "putation": 13320, - "putc": 89040, - "pute": 8492, - "puted": 19292, - "puter": 11281, - "puties": 43933, - "puts": 16920, - "puty": 16983, - "pués": 42209, - "pv": 30168, - "pw": 31862, - "pwd": 25565, - "px": 1767, - "py": 3288, - "pygame": 51060, - "pytest": 26721, - "python": 12669, - "pyx": 85359, - "pz": 66565, - "pé": 128937, - "péri": 137823, - "pósito": 143269, - "póÅĤ": 129666, - "põ": 139565, - "põe": 139566, - "pÅĤat": 130088, - "pÅĤyw": 135506, - "q": 80, - "qa": 15445, - "qb": 49698, - "qc": 59833, - "qd": 76727, - "qe": 78124, - "qed": 51233, - "qh": 91900, - "qi": 40187, - "qid": 88587, - "qing": 89584, - "ql": 1470, - "qli": 6905, - "qm": 77398, - "qml": 83612, - "qn": 48350, - "qp": 32763, - "qq": 27579, - "qr": 23004, - "qrst": 61739, - "qrstuvwxyz": 64467, - "qrt": 8140, - "qry": 61255, - "qs": 26358, - "qt": 23044, - "qtt": 32267, - "qty": 29303, - "qu": 446, - "qua": 43832, - "quad": 31610, - "quake": 66718, - "qual": 1751, - "qualification": 71909, - "qualified": 36335, - "qualities": 82365, - "quality": 10473, - "quals": 2366, - "quam": 86701, - "quan": 88437, - "quant": 30448, - "quantity": 13523, - "quare": 5151, - "quared": 34249, - "quares": 40856, - "quarter": 32015, - "quartered": 67620, - "quarters": 19670, - "quat": 72983, - "quate": 19137, - "que": 591, - "queda": 41360, - "quee": 17110, - "queen": 93114, - "queeze": 19340, - "quel": 41914, - "quelle": 87165, - "quence": 4375, - "quences": 43945, - "quent": 16769, - "quential": 15838, - "quer": 15959, - "queries": 42835, - "querque": 67608, - "query": 1631, - "queryParams": 80720, - "querySelector": 86267, - "queryString": 95888, - "ques": 13968, - "quest": 719, - "question": 7841, - "questions": 17348, - "quests": 86322, - "quet": 23300, - "quete": 60354, - "quets": 90591, - "quette": 51706, - "queue": 4584, - "queueReusable": 37185, - "queueReusableCell": 38559, - "queued": 66547, - "queues": 76089, - "quez": 41121, - "qui": 46291, - "quia": 83622, - "quick": 27763, - "quier": 32471, - "quierda": 86381, - "quiet": 43650, - "quil": 87584, - "quila": 74129, - "quin": 35344, - "quina": 53406, - "quine": 47258, - "quip": 35747, - "quipe": 60573, - "quipment": 48879, - "quir": 11388, - "quire": 984, - "quired": 2931, - "quirer": 50792, - "quires": 17694, - "quiries": 31900, - "quiring": 70094, - "quirrel": 86640, - "quiry": 17343, - "quis": 9202, - "quisa": 58495, - "quisar": 95235, - "quisite": 32424, - "quisites": 48250, - "quisition": 17204, - "quisitions": 52829, - "quist": 55309, - "quit": 31537, - "quite": 83170, - "quito": 41096, - "quiv": 15418, - "quivo": 28944, - "quivos": 86231, - "quiz": 31949, - "quo": 26512, - "quoi": 61898, - "quoise": 58670, - "quot": 13492, - "quota": 92604, - "quote": 2949, - "quoted": 63725, - "quotelev": 30860, - "quotes": 53282, - "qus": 61504, - "qué": 63491, - "quÃŃ": 130532, - "qv": 69578, - "qw": 69291, - "qx": 88735, - "r": 81, - "rPid": 83893, - "ra": 956, - "rab": 50105, - "rabbit": 86345, - "rac": 19959, - "race": 41183, - "racial": 48925, - "rack": 71685, - "raction": 16199, - "racuse": 59769, - "rad": 13281, - "rade": 49076, - "rades": 59535, - "radi": 69212, - "radient": 66737, - "radio": 12636, - "radius": 26715, - "rado": 76827, - "rador": 65251, - "radouro": 54640, - "rael": 6196, - "raf": 15453, - "raft": 2944, - "rafted": 60769, - "rag": 4101, - "rage": 47368, - "ragen": 56364, - "ragment": 6017, - "ragments": 41956, - "ragon": 55150, - "rah": 32507, - "raham": 16602, - "rai": 67862, - "raid": 13831, - "raig": 72316, - "rail": 75635, - "rails": 37345, - "rain": 29093, - "rais": 39998, - "raisal": 64259, - "raise": 18704, - "raised": 92513, - "raises": 32271, - "raising": 93680, - "raison": 76503, - "rait": 14350, - "raith": 85782, - "raits": 26287, - "raj": 55386, - "ral": 3461, - "rale": 45040, - "ram": 2396, - "rama": 30373, - "rame": 2373, - "ramento": 35756, - "ramer": 46369, - "rames": 15615, - "ramework": 5794, - "ramid": 31703, - "ramids": 86373, - "rams": 94701, - "ran": 6576, - "rance": 34106, - "rances": 94497, - "rand": 11335, - "random": 11463, - "rang": 92583, - "range": 9669, - "ranges": 66562, - "rangle": 71182, - "rank": 13129, - "ranking": 96546, - "rans": 33389, - "ransition": 84954, - "rant": 34434, - "rap": 4611, - "rape": 19842, - "raph": 1935, - "raphic": 78073, - "raphics": 6348, - "rapid": 85712, - "rapped": 56289, - "rapper": 5518, - "rapy": 60826, - "raq": 10686, - "raquo": 85260, - "rar": 43983, - "rarian": 94920, - "raries": 14876, - "rary": 3451, - "ras": 12784, - "rase": 10632, - "rases": 26565, - "rasing": 96478, - "rastructure": 10314, - "rasında": 127920, - "rat": 17606, - "rate": 7698, - "rated": 54273, - "rates": 66485, - "rather": 73203, - "rating": 21931, - "ratings": 73136, - "ratio": 45358, - "ration": 2165, - "rats": 62937, - "ratulations": 37416, - "raud": 97957, - "raw": 1041, - "rawer": 95112, - "rawid": 139722, - "rawidÅĤow": 139723, - "rawing": 1696, - "rawl": 33683, - "rawler": 33369, - "rawn": 67568, - "rawtypes": 97261, - "rax": 68765, - "ray": 11611, - "rays": 65143, - "raz": 8703, - "razier": 91047, - "razil": 14042, - "razione": 63031, - "razy": 12079, - "rb": 10681, - "rbrace": 75283, - "rbrakk": 74084, - "rc": 1287, - "rch": 49066, - "rchive": 96191, - "rcode": 54796, - "rd": 6498, - "rdf": 77998, - "re": 265, - "rea": 5213, - "reach": 22606, - "reachable": 46550, - "react": 2934, - "reaction": 59207, - "reactstrap": 78352, - "read": 878, - "readOnly": 87703, - "readcr": 12370, - "readcrumb": 17032, - "readcrumbs": 24466, - "reader": 11149, - "reading": 6154, - "readonly": 22569, - "reads": 30358, - "ready": 2307, - "readystatechange": 59811, - "reak": 1108, - "real": 7951, - "realDonaldTrump": 73405, - "realloc": 81590, - "really": 53660, - "realm": 69897, - "ream": 1237, - "reamble": 86706, - "rear": 58408, - "reas": 50418, - "reason": 19895, - "reasonable": 46692, - "reat": 1222, - "reate": 964, - "reated": 2850, - "reater": 28362, - "reatest": 11175, - "reating": 72810, - "reation": 26453, - "reative": 86366, - "reatment": 34220, - "reator": 36886, - "reature": 52251, - "reau": 89949, - "reb": 31475, - "rebbe": 66491, - "rec": 2758, - "recall": 93828, - "recated": 38777, - "rece": 53387, - "receipt": 62623, - "receive": 41893, - "received": 41823, - "receiver": 37553, - "recent": 46643, - "recht": 47631, - "recio": 35658, - "recipe": 25208, - "recipes": 49859, - "recipient": 42610, - "recision": 21079, - "reck": 24638, - "recogn": 33451, - "recognized": 46067, - "recommend": 66589, - "recommended": 85347, - "record": 8548, - "records": 26203, - "recover": 74283, - "rect": 2851, - "rectangle": 55316, - "rection": 30366, - "rections": 67343, - "recur": 75762, - "recursive": 49512, - "recv": 33977, - "red": 1151, - "redd": 32774, - "reddit": 36933, - "rede": 91661, - "redential": 30320, - "redentials": 15735, - "redi": 64599, - "redicate": 16874, - "redict": 8861, - "redient": 14342, - "redients": 10377, - "redirect": 8117, - "redirectTo": 65799, - "redirectToRoute": 89279, - "redis": 21748, - "redit": 10827, - "redits": 29502, - "redni": 127752, - "redo": 63561, - "reds": 53369, - "reduce": 26273, - "reducers": 66398, - "redux": 21178, - "ree": 765, - "reeNode": 31583, - "reece": 89031, - "reed": 28516, - "reek": 10726, - "reement": 17150, - "reements": 57775, - "reen": 4442, - "rees": 7858, - "reesome": 57305, - "reet": 3744, - "reeting": 43632, - "reetings": 56517, - "reeze": 27633, - "ref": 1097, - "refer": 41160, - "reference": 16291, - "references": 35909, - "referer": 88963, - "referrer": 97949, - "reff": 61644, - "reffen": 64260, - "refix": 5060, - "refixer": 89348, - "reflect": 34913, - "reflection": 76998, - "refresh": 17168, - "refs": 16149, - "refund": 68483, - "reg": 1580, - "rega": 38876, - "regar": 33730, - "regation": 95795, - "regex": 26387, - "regexp": 55796, - "region": 3943, - "regions": 57708, - "regist": 53287, - "register": 6343, - "registered": 34909, - "registers": 76937, - "registr": 48464, - "registration": 25862, - "registro": 55346, - "registry": 29172, - "reglo": 52739, - "regn": 39281, - "rego": 67717, - "regon": 17103, - "regor": 65921, - "regs": 30886, - "regular": 22308, - "regulated": 80622, - "regunta": 86273, - "reh": 11063, - "rei": 55314, - "reib": 38013, - "reiben": 60322, - "reibung": 75399, - "reich": 40334, - "reinterpret": 52521, - "reira": 77242, - "reject": 46996, - "rejected": 95353, - "rek": 41861, - "rel": 3748, - "reland": 86466, - "related": 9721, - "relation": 22221, - "relations": 65334, - "relationship": 36095, - "relationships": 85824, - "relative": 20432, - "relay": 90891, - "release": 22998, - "released": 76938, - "relevant": 97573, - "religious": 96150, - "rell": 16285, - "rella": 33042, - "rellas": 72923, - "rello": 74133, - "reload": 38982, - "rels": 53783, - "relu": 31208, - "relude": 85068, - "rem": 1826, - "rema": 89718, - "remain": 47584, - "remainder": 77381, - "remaining": 43436, - "remark": 37448, - "remarks": 14447, - "reme": 9634, - "remely": 53258, - "remember": 29280, - "remen": 61869, - "rement": 54655, - "reminder": 77905, - "remium": 84032, - "remote": 18147, - "remove": 5399, - "removeAttr": 56817, - "removeClass": 14142, - "removed": 45756, - "ren": 1440, - "rena": 22691, - "renal": 46638, - "rename": 51058, - "renc": 62834, - "rence": 15892, - "rench": 6655, - "renched": 53971, - "rend": 9300, - "rende": 85527, - "render": 7322, - "renderer": 26948, - "renders": 54159, - "rending": 61994, - "rends": 78617, - "rene": 46909, - "rength": 17842, - "reno": 54883, - "renom": 44843, - "rens": 77340, - "rent": 7976, - "rente": 71723, - "reo": 29583, - "reon": 49790, - "reopen": 81507, - "rep": 9995, - "repair": 76439, - "repeat": 30624, - "repid": 93594, - "replace": 8156, - "replaceAll": 55860, - "replacement": 83631, - "reply": 21034, - "repo": 23476, - "report": 11736, - "reported": 75733, - "reports": 36906, - "repos": 68354, - "repositories": 81907, - "repository": 23319, - "repr": 30837, - "represent": 35269, - "representation": 83116, - "represented": 52759, - "req": 2958, - "requ": 11019, - "requencies": 71731, - "requency": 15845, - "requent": 69691, - "requently": 69841, - "request": 2035, - "requestCode": 74535, - "requestData": 93478, - "requested": 67105, - "requests": 36242, - "requete": 94342, - "require": 4310, - "required": 6279, - "requirements": 70126, - "requires": 41375, - "rer": 37049, - "res": 416, - "resa": 14315, - "resar": 91198, - "resas": 37954, - "rescia": 97512, - "resco": 71418, - "resden": 57009, - "rese": 70438, - "research": 60464, - "resent": 2695, - "resentation": 13584, - "resenter": 74646, - "resents": 9578, - "reservation": 47684, - "reserve": 56985, - "reserved": 51102, - "reset": 9716, - "resh": 2488, - "reshape": 16137, - "resher": 85424, - "reshold": 7161, - "resident": 39531, - "resize": 17347, - "resizing": 41467, - "reso": 49764, - "resolution": 55756, - "resolve": 17325, - "resolved": 39747, - "resolver": 48943, - "resource": 9233, - "resources": 12745, - "resp": 18243, - "respect": 44634, - "respond": 6818, - "respons": 81589, - "response": 2322, - "responseData": 89278, - "responseObject": 86006, - "responses": 71000, - "responsive": 51297, - "respuesta": 57660, - "ress": 673, - "resse": 21797, - "ressed": 14378, - "resses": 43257, - "ressing": 56781, - "ression": 11185, - "ressive": 47953, - "rest": 3927, - "restart": 50215, - "restaurant": 33226, - "restaurants": 95137, - "reste": 98934, - "restore": 30804, - "restrial": 52586, - "restrict": 27898, - "restricted": 50797, - "restriction": 71331, - "result": 1382, - "resultCode": 87124, - "resultSet": 71451, - "resultado": 32361, - "results": 8074, - "resume": 41395, - "ret": 2122, - "reta": 65698, - "retain": 55372, - "retch": 10209, - "retched": 61737, - "rete": 83505, - "reten": 85885, - "retorno": 96814, - "retrieve": 55527, - "retry": 44848, - "rets": 75330, - "rett": 17261, - "rette": 66928, - "retty": 21322, - "return": 689, - "returnValue": 53015, - "returned": 77591, - "returns": 4216, - "retval": 19843, - "retweeted": 86658, - "reu": 64786, - "reur": 34240, - "reuse": 53049, - "rev": 7282, - "reve": 90976, - "reveal": 94026, - "reverse": 25903, - "review": 19417, - "reviews": 39475, - "revision": 28342, - "revolution": 95722, - "rew": 4266, - "reward": 49007, - "rewrite": 52473, - "rex": 37539, - "rey": 8073, - "rez": 22741, - "rf": 8052, - "rg": 1984, - "rgan": 8443, - "rganization": 68364, - "rgb": 16509, - "rgba": 20400, - "rgctx": 61488, - "rgyz": 98862, - "rh": 40096, - "rho": 40322, - "rhs": 26408, - "ri": 461, - "ria": 4204, - "riad": 46539, - "riage": 8775, - "riages": 37032, - "rial": 6619, - "rian": 7266, - "riangle": 84191, - "rians": 35168, - "rias": 47831, - "rib": 1897, - "riba": 84244, - "ribbon": 54580, - "rible": 12280, - "ribly": 36752, - "ric": 2216, - "rica": 61696, - "rical": 12108, - "ricane": 25053, - "ricanes": 55195, - "ricao": 27673, - "rice": 23120, - "rices": 24419, - "rich": 13851, - "richText": 77498, - "richTextPanel": 82215, - "richt": 36702, - "ricia": 45191, - "ricing": 38806, - "rick": 12649, - "ricks": 77789, - "rico": 55247, - "rics": 6198, - "ricula": 45482, - "ricular": 56233, - "riculum": 23136, - "rid": 1869, - "riday": 6121, - "ridden": 42185, - "ride": 1399, - "rides": 18245, - "ridge": 11183, - "ridged": 79128, - "riding": 49680, - "rido": 69549, - "ridor": 82436, - "rie": 7231, - "rieb": 44914, - "rieben": 73461, - "ried": 4487, - "rief": 4364, - "rieg": 82491, - "riel": 22036, - "rien": 34738, - "riend": 5039, - "riendly": 17784, - "riends": 12067, - "rient": 12986, - "rientation": 17663, - "rients": 31830, - "rier": 7253, - "riere": 84467, - "riers": 17291, - "ries": 4019, - "riet": 64570, - "rieve": 45004, - "rieved": 82612, - "rieving": 67704, - "rif": 92266, - "rift": 41380, - "rig": 14408, - "riger": 63944, - "rigesimal": 40359, - "right": 1291, - "rightarrow": 19491, - "rightness": 36630, - "rights": 76187, - "rij": 20279, - "rijk": 86674, - "rik": 20411, - "rika": 40454, - "rike": 40652, - "rikes": 67631, - "ril": 30560, - "rim": 6283, - "riminal": 57040, - "riminator": 94124, - "rimon": 48759, - "rimp": 43894, - "rin": 25288, - "rina": 39971, - "rine": 39001, - "ring": 12640, - "ringe": 84024, - "rink": 34365, - "rint": 1586, - "rio": 10383, - "rior": 3254, - "riority": 8773, - "riors": 21175, - "rios": 27851, - "riot": 84050, - "riott": 66771, - "rious": 83618, - "rip": 4561, - "ripe": 51091, - "ripp": 54689, - "ripper": 93265, - "ripple": 82373, - "rippling": 90771, - "rips": 75716, - "ripsi": 66683, - "rique": 33295, - "rir": 37215, - "rire": 95413, - "ris": 5963, - "rise": 31509, - "rish": 93907, - "rising": 58923, - "risk": 80943, - "rist": 2819, - "ristol": 40615, - "rists": 93959, - "rit": 1003, - "rita": 97727, - "ritable": 22533, - "ritch": 91589, - "rite": 1247, - "ritel": 58962, - "riteln": 51097, - "riter": 2542, - "riteria": 5094, - "riterion": 12334, - "riters": 31829, - "rites": 23262, - "ritic": 49208, - "ritical": 14509, - "riting": 12201, - "rition": 17026, - "ritional": 36742, - "ritis": 36990, - "rito": 28041, - "ritos": 94012, - "ritt": 54913, - "ritte": 98280, - "ritten": 12153, - "ritz": 56721, - "rium": 40452, - "riv": 76367, - "rive": 56935, - "river": 5469, - "rix": 18356, - "riz": 24741, - "rière": 64120, - "rió": 97301, - "rk": 47272, - "rl": 2381, - "rlen": 69069, - "rm": 8719, - "rms": 90869, - "rn": 35622, - "rna": 89231, - "rnd": 64869, - "rne": 65920, - "rng": 69890, - "ro": 299, - "roach": 64500, - "road": 8546, - "roadcast": 19105, - "roads": 42691, - "roat": 17804, - "rob": 22740, - "robat": 75101, - "robe": 32836, - "robot": 18247, - "robots": 60115, - "roc": 27687, - "rocess": 40848, - "rocessing": 48687, - "rock": 20521, - "rocket": 46790, - "rod": 23505, - "rodu": 4550, - "roduce": 47845, - "roduced": 29217, - "roducing": 59537, - "roduction": 16741, - "roe": 34704, - "rog": 11918, - "rogate": 48373, - "rogen": 25188, - "rogram": 86120, - "roi": 50460, - "roid": 1577, - "roids": 40094, - "roit": 68496, - "rok": 53561, - "roke": 7441, - "roken": 81709, - "roker": 45985, - "rokes": 55037, - "rol": 1080, - "role": 5778, - "roleId": 97491, - "roles": 14643, - "roleum": 39999, - "roll": 1100, - "rollable": 68755, - "rollback": 33559, - "rolled": 20947, - "roller": 1468, - "rollers": 7273, - "rolley": 74043, - "rolling": 16210, - "rollment": 25864, - "rollo": 43684, - "rolls": 38274, - "rom": 441, - "roma": 56984, - "roman": 62014, - "romatic": 98766, - "rome": 6648, - "rometer": 87271, - "romise": 5273, - "romium": 77859, - "romo": 98539, - "romosome": 75118, - "rompt": 14749, - "ron": 2248, - "rone": 77221, - "rones": 31821, - "rong": 14347, - "ronic": 8370, - "ronics": 27329, - "rons": 25610, - "ront": 9411, - "ronym": 46880, - "roof": 75636, - "room": 2966, - "roomId": 86394, - "rooms": 9750, - "root": 2888, - "rootScope": 23553, - "roots": 37165, - "rop": 887, - "ropa": 27557, - "ropdown": 13271, - "roperties": 9249, - "roperty": 8218, - "roph": 21990, - "rophe": 47883, - "rophic": 41710, - "rophy": 57075, - "ropic": 43936, - "ropical": 50072, - "ropol": 22341, - "ropolis": 54322, - "ropolitan": 30511, - "ropp": 75056, - "ropped": 41716, - "ropping": 80204, - "ropri": 6160, - "ropriate": 24278, - "rops": 3702, - "ropsych": 97338, - "ropy": 17764, - "ror": 7632, - "rored": 47643, - "roring": 89579, - "rors": 31686, - "ros": 3630, - "roscope": 89779, - "rose": 24847, - "rosis": 62312, - "ross": 2128, - "rosse": 52356, - "rosso": 32212, - "rossover": 37172, - "rost": 41502, - "rot": 4640, - "rotate": 16213, - "rotation": 13538, - "rotch": 91478, - "rote": 5529, - "rotein": 90648, - "rots": 89229, - "rott": 46689, - "rottle": 27535, - "rou": 581, - "rouch": 74927, - "roud": 42276, - "rough": 1432, - "rought": 6344, - "roulette": 98148, - "round": 1049, - "rounded": 43991, - "roup": 886, - "roupe": 37715, - "roupon": 47003, - "roups": 88410, - "rous": 26522, - "route": 8966, - "routeParams": 70029, - "routeProvider": 83660, - "router": 9937, - "routes": 19794, - "routine": 52980, - "routing": 73320, - "rouw": 71623, - "rov": 39394, - "rove": 50415, - "rovers": 12563, - "row": 651, - "rowCount": 48149, - "rowData": 97959, - "rowable": 14941, - "rowad": 82287, - "rowave": 33703, - "rowing": 24181, - "rown": 4830, - "rowned": 44084, - "rowning": 50420, - "rows": 1811, - "rowsable": 51111, - "rowse": 13397, - "rowser": 4012, - "rowsers": 90558, - "rowsing": 86266, - "rowth": 19089, - "rox": 54789, - "roy": 3352, - "roys": 49193, - "roz": 63989, - "rozen": 42240, - "rp": 22252, - "rparr": 88920, - "rpc": 29414, - "rpm": 73782, - "rq": 52189, - "rr": 634, - "rray": 846, - "rrha": 90495, - "rror": 1275, - "rs": 5428, - "rsa": 60869, - "rschein": 94213, - "rsp": 59976, - "rss": 50623, - "rst": 58025, - "rstrip": 70398, - "rt": 3342, - "rtc": 45892, - "rtl": 48468, - "rtle": 92436, - "rts": 77724, - "rtype": 32513, - "ru": 2672, - "rub": 59430, - "ruby": 46275, - "ruc": 79355, - "rud": 66355, - "rug": 71947, - "ruise": 92653, - "ruit": 21026, - "ruitment": 46133, - "ruits": 67898, - "ruk": 76667, - "rule": 12937, - "rules": 21977, - "rum": 10721, - "run": 6108, - "runner": 41736, - "running": 27173, - "runs": 53310, - "runtime": 22255, - "rup": 30622, - "rupt": 6585, - "ruptcy": 95219, - "rupted": 85954, - "ruption": 14123, - "ruptions": 54681, - "rus": 20341, - "rush": 77177, - "rust": 35788, - "rut": 69446, - "ruta": 80907, - "ruz": 62323, - "rv": 10553, - "rvine": 66574, - "rw": 31768, - "rx": 12651, - "rxjs": 19209, - "ry": 884, - "ryan": 56758, - "ryfall": 73398, - "rying": 27509, - "rylic": 43180, - "ryn": 60243, - "ryo": 96134, - "rypt": 3571, - "rypted": 14026, - "ryption": 15597, - "rypto": 9444, - "ryptography": 46663, - "rypton": 53536, - "rys": 41326, - "rysler": 55356, - "rz": 51960, - "rze": 54074, - "rzy": 87988, - "rzÄħ": 133676, - "rzÄħd": 128705, - "rzÄĻ": 132141, - "rá": 37368, - "ráf": 79043, - "rán": 129216, - "rão": 131200, - "rä": 125245, - "räg": 133053, - "rän": 134291, - "ränk": 134292, - "räu": 137994, - "räume": 141292, - "rÃ¥": 96921, - "rès": 127404, - "ré": 42611, - "rés": 131526, - "rêt": 140104, - "ró": 82037, - "rób": 132822, - "ród": 90945, - "rów": 129491, - "róż": 127420, - "różni": 133109, - "rô": 136033, - "rö": 131315, - "rü": 126354, - "rück": 129579, - "rün": 125334, - "rÃł": 126289, - "rÃŃ": 129358, - "rÃŃa": 128446, - "rı": 128136, - "rÄĻ": 132244, - "rÄĻcz": 132245, - "s": 82, - "sPid": 83815, - "sWith": 16056, - "sa": 9081, - "sad": 82114, - "safe": 18675, - "said": 83259, - "saida": 85750, - "sal": 19222, - "salary": 51610, - "saldo": 92512, - "sale": 32654, - "sales": 29041, - "salt": 42226, - "sam": 45996, - "same": 24063, - "samp": 92303, - "sample": 13611, - "samples": 41118, - "sampling": 96959, - "san": 33082, - "sand": 91246, - "sandbox": 76756, - "sanitize": 65704, - "sans": 76758, - "sanız": 131300, - "sap": 64613, - "sar": 98082, - "sass": 60326, - "sat": 36468, - "sav": 94251, - "save": 6628, - "saved": 32702, - "saving": 83057, - "say": 36790, - "says": 96936, - "sb": 16892, - "sbin": 92263, - "sburg": 90101, - "sburgh": 25254, - "sc": 2388, - "scal": 93207, - "scala": 26822, - "scalar": 35342, - "scale": 12445, - "scaled": 73947, - "scaling": 93052, - "scan": 16405, - "scanf": 26395, - "scanner": 67941, - "scape": 57518, - "scar": 24513, - "scatter": 70250, - "scenario": 61422, - "scene": 22483, - "scenes": 86965, - "sch": 21062, - "sched": 72243, - "schedule": 28630, - "scheduled": 93585, - "scheduler": 63122, - "schema": 17349, - "schemas": 56543, - "scheme": 46141, - "schlie": 138663, - "schlieÃŁen": 138664, - "schlä": 143753, - "schläge": 143754, - "schlü": 143340, - "schlüsse": 143341, - "school": 21850, - "schools": 90656, - "schüt": 137711, - "schütz": 137712, - "sci": 53827, - "science": 39557, - "scient": 55347, - "scientific": 84830, - "scious": 23121, - "sciously": 70788, - "scope": 4186, - "scoped": 78740, - "scopes": 80925, - "scopic": 57410, - "scopy": 50756, - "score": 12338, - "scores": 46695, - "scp": 63063, - "scr": 25065, - "scratch": 54055, - "screen": 8174, - "screens": 48816, - "scri": 11592, - "scribe": 6273, - "scribed": 49785, - "scriber": 20351, - "scribers": 46361, - "scripción": 141275, - "script": 2282, - "scriptId": 48855, - "scription": 12124, - "scriptions": 29966, - "scripts": 19831, - "scrição": 136407, - "scroll": 12605, - "scrollTop": 46724, - "scrollView": 49214, - "scss": 63298, - "sd": 13446, - "sdale": 83682, - "sdk": 51295, - "se": 325, - "sea": 36441, - "sealed": 75940, - "search": 1836, - "searchModel": 64584, - "season": 16798, - "seat": 43058, - "seau": 69399, - "sec": 5024, - "second": 5569, - "secondary": 18699, - "seconds": 17403, - "secret": 20474, - "secs": 53281, - "sect": 9687, - "section": 2809, - "sections": 24661, - "sector": 44757, - "sects": 54429, - "secure": 25132, - "secured": 84308, - "security": 17039, - "secutive": 85780, - "sed": 31324, - "see": 4060, - "seealso": 50762, - "seed": 22602, - "seeing": 65054, - "seek": 25713, - "seen": 28312, - "seg": 14607, - "segment": 23169, - "segments": 56829, - "segue": 46106, - "sehen": 65423, - "sei": 72768, - "sein": 48435, - "seite": 61065, - "sek": 56267, - "sel": 9507, - "select": 1742, - "selectAll": 81473, - "selected": 4525, - "selectedIndex": 74826, - "selection": 23617, - "selector": 8925, - "selectorMethod": 89312, - "selectors": 95264, - "self": 721, - "sell": 34835, - "seller": 34099, - "selling": 37737, - "sem": 6998, - "semantic": 47858, - "semb": 4838, - "sembl": 27013, - "semble": 15790, - "sembled": 25905, - "sembler": 35401, - "sembles": 40694, - "semblies": 45338, - "sembling": 41964, - "sembly": 5642, - "semester": 61536, - "semi": 86598, - "semicolon": 44761, - "sen": 11759, - "senal": 25499, - "send": 6681, - "sendKeys": 63054, - "sendMessage": 61957, - "sender": 11644, - "sending": 79696, - "senha": 61409, - "sense": 97835, - "sensor": 29511, - "sent": 24512, - "sentence": 51889, - "seo": 44666, - "sep": 28036, - "separator": 40120, - "seq": 13262, - "sequ": 6603, - "sequelize": 57856, - "sequence": 15512, - "sequences": 61708, - "sequent": 71357, - "sequential": 92350, - "sequently": 38642, - "ser": 799, - "serde": 47024, - "serial": 10182, - "serialization": 74835, - "serialize": 24166, - "serialized": 75277, - "serializer": 52718, - "serie": 61143, - "series": 19880, - "serious": 93327, - "serir": 98487, - "serrat": 63064, - "sert": 6047, - "serter": 90727, - "serv": 30775, - "serve": 13267, - "server": 4030, - "servername": 69760, - "servers": 67696, - "service": 7936, - "serviceName": 93485, - "services": 12779, - "ses": 9275, - "sess": 39057, - "session": 5920, - "sessionId": 70515, - "sessions": 50964, - "set": 746, - "setAttribute": 31317, - "setBackground": 90525, - "setCellValue": 41269, - "setChecked": 64945, - "setColor": 54091, - "setContent": 68121, - "setCurrent": 62767, - "setData": 43891, - "setDefault": 92174, - "setDescription": 63542, - "setDisplay": 76355, - "setEnabled": 37109, - "setError": 98130, - "setFlash": 62389, - "setFont": 89402, - "setIcon": 69001, - "setId": 63820, - "setImage": 88756, - "setItem": 85023, - "setLabel": 88553, - "setLayout": 58270, - "setMax": 99017, - "setMessage": 73387, - "setName": 40730, - "setOnClickListener": 63628, - "setParameter": 52004, - "setPosition": 49310, - "setProperty": 80307, - "setQuery": 73228, - "setScale": 79674, - "setSize": 96907, - "setState": 78858, - "setStatus": 83451, - "setText": 20989, - "setTimeout": 78700, - "setTitle": 40244, - "setType": 70341, - "setUp": 62852, - "setValue": 22541, - "setVisibility": 95792, - "setVisible": 38262, - "setWidth": 89766, - "setattr": 87170, - "setq": 32526, - "sets": 4917, - "sett": 66514, - "setter": 88479, - "setting": 15320, - "settings": 6511, - "setup": 15188, - "setw": 51822, - "seud": 39412, - "seudo": 21952, - "seven": 80185, - "severity": 77019, - "sex": 11553, - "sexo": 83180, - "sexual": 43587, - "sexy": 98254, - "sey": 8506, - "seys": 36423, - "sez": 51970, - "sf": 17246, - "sg": 1991, - "sgi": 51612, - "sgiving": 31627, - "sh": 927, - "sha": 15247, - "shade": 86054, - "shader": 45534, - "shadow": 32952, - "shaft": 96413, - "shake": 29661, - "shal": 12214, - "shaled": 75303, - "shall": 19012, - "shan": 82127, - "shape": 12231, - "shapes": 92059, - "share": 19368, - "shared": 6100, - "shares": 75047, - "sharing": 83646, - "sharp": 52917, - "shaw": 50004, - "she": 31058, - "shed": 69461, - "sheet": 15119, - "sheets": 91437, - "shelf": 53950, - "shell": 21384, - "sher": 89505, - "shi": 59421, - "shield": 47952, - "shift": 13418, - "shima": 91477, - "shine": 30238, - "shint": 64623, - "ship": 5270, - "shipment": 69087, - "shipping": 26508, - "ships": 17675, - "shire": 14909, - "shirt": 48372, - "shit": 40053, - "shiv": 64730, - "shm": 92137, - "shoot": 67292, - "shop": 8675, - "shopping": 50566, - "shops": 26770, - "shore": 28426, - "short": 8676, - "shortcode": 83387, - "shortcut": 46357, - "shot": 6340, - "shots": 27634, - "should": 5445, - "shouldBe": 77261, - "shouldReceive": 85708, - "show": 3445, - "shown": 69363, - "shows": 59456, - "shr": 66039, - "shuffle": 65355, - "shutdown": 59547, - "si": 6321, - "siblings": 51920, - "sic": 51777, - "sid": 21027, - "side": 2929, - "sidebar": 18989, - "sie": 78612, - "sig": 21339, - "sigma": 24912, - "sigmoid": 88927, - "sign": 7752, - "signIn": 60747, - "signal": 26622, - "signals": 60615, - "signature": 34140, - "signed": 2215, - "significant": 90545, - "signin": 55612, - "signup": 28725, - "sil": 34804, - "silent": 68658, - "silver": 81914, - "sim": 14781, - "simd": 96258, - "similar": 64287, - "simp": 20845, - "simple": 22944, - "simulate": 86711, - "simulation": 83772, - "sin": 15940, - "since": 11284, - "sing": 79307, - "single": 15338, - "singleton": 59915, - "singular": 92309, - "sink": 66738, - "sip": 88250, - "sis": 14406, - "sist": 139224, - "sistência": 139225, - "sit": 46865, - "site": 9513, - "sitemap": 37963, - "sites": 54764, - "six": 50364, - "size": 2141, - "sizei": 60643, - "sizeof": 10318, - "sizes": 53155, - "sión": 128610, - "sj": 22910, - "sk": 4886, - "skb": 66109, - "ski": 32539, - "skill": 29454, - "skills": 53240, - "skin": 36182, - "skins": 49318, - "skip": 20599, - "skirts": 66975, - "sku": 39929, - "sky": 26684, - "skór": 133745, - "skÄħ": 131944, - "sl": 3226, - "sla": 51642, - "slack": 88548, - "slash": 50256, - "slashes": 47629, - "slaught": 77068, - "slave": 52505, - "sleep": 25809, - "slice": 24963, - "slick": 69158, - "slide": 19341, - "slideDown": 89847, - "slideUp": 78274, - "slider": 20349, - "slides": 65821, - "slope": 96512, - "slot": 21537, - "slots": 49767, - "slow": 35211, - "slt": 48893, - "slug": 15125, - "sm": 3563, - "small": 9004, - "smart": 39803, - "smarty": 11818, - "smith": 33017, - "smooth": 56866, - "smouth": 76577, - "sms": 41392, - "smtp": 39854, - "sn": 9613, - "snake": 72139, - "snap": 48854, - "snapshot": 35501, - "snd": 46395, - "snippet": 57615, - "snow": 74478, - "sns": 72494, - "so": 704, - "soap": 35012, - "soc": 57021, - "social": 22386, - "sock": 13199, - "socket": 9556, - "sockets": 76729, - "sockopt": 58576, - "soever": 34554, - "sofar": 93571, - "soft": 3510, - "softmax": 77499, - "software": 36651, - "sol": 38198, - "sold": 62478, - "sole": 1546, - "soles": 40400, - "solete": 27246, - "solid": 31027, - "solution": 49460, - "solve": 59419, - "solver": 75501, - "som": 56739, - "some": 14689, - "someone": 89479, - "something": 33331, - "sometimes": 56653, - "son": 930, - "song": 31751, - "songs": 75052, - "sonian": 77613, - "sono": 73122, - "sons": 37348, - "soon": 66056, - "sorry": 67597, - "sort": 6860, - "sortBy": 65032, - "sortable": 65598, - "sorted": 28298, - "sorting": 67039, - "sound": 27532, - "sounds": 70531, - "soup": 89542, - "source": 2427, - "sources": 39651, - "south": 66484, - "sov": 84293, - "sp": 2154, - "spNet": 14349, - "spa": 89198, - "space": 8746, - "spacer": 97065, - "spaces": 44285, - "spacing": 23436, - "spam": 75545, - "span": 1480, - "spar": 77884, - "spark": 53782, - "sparse": 98223, - "spath": 30089, - "spawn": 46087, - "spb": 43467, - "spd": 90763, - "spe": 33374, - "speaker": 64476, - "spec": 9535, - "special": 15144, - "specialchars": 25520, - "species": 42490, - "specific": 51240, - "specified": 53434, - "specifier": 67251, - "specs": 94531, - "spect": 67082, - "speech": 88225, - "speed": 20374, - "spell": 37655, - "spender": 92825, - "spent": 94364, - "sphere": 87410, - "spi": 39157, - "spiel": 80885, - "spin": 41582, - "spinner": 62091, - "spir": 49077, - "spiracy": 69723, - "spirit": 85290, - "spl": 69095, - "splash": 48632, - "splice": 94960, - "split": 6960, - "spm": 68622, - "spo": 82859, - "spoken": 51758, - "sponsor": 95811, - "sport": 60901, - "sports": 83560, - "spot": 18648, - "spotify": 87388, - "spots": 67010, - "spoÅĤ": 132531, - "spoÅĤec": 132532, - "spoÅĤeczn": 132533, - "spr": 51673, - "spread": 58195, - "spring": 29223, - "sprintf": 49727, - "sprite": 32641, - "sprites": 87470, - "spy": 28191, - "sq": 28343, - "sql": 3544, - "sqlite": 37042, - "sqrt": 26888, - "squ": 97407, - "square": 37476, - "squeeze": 51913, - "sr": 15094, - "src": 3548, - "srv": 40020, - "ss": 778, - "ssa": 52107, - "ssc": 89091, - "sse": 64513, - "ssel": 89182, - "ssf": 83174, - "ssh": 25537, - "ssi": 45656, - "ssid": 61743, - "ssize": 77460, - "ssl": 24635, - "sson": 29931, - "ssp": 67233, - "ssql": 79713, - "sss": 84160, - "sst": 50900, - "sstream": 38366, - "ssue": 83890, - "ssé": 131875, - "st": 267, - "sta": 20491, - "stab": 67488, - "stable": 27992, - "stack": 7693, - "stackoverflow": 42035, - "stackpath": 68194, - "stacle": 43598, - "stacles": 73979, - "stad": 46840, - "stadt": 44278, - "staff": 27122, - "stag": 46680, - "stage": 20743, - "stairs": 30134, - "stakes": 95060, - "staking": 88885, - "stalk": 89749, - "stamp": 49113, - "stan": 24025, - "stanbul": 45116, - "stance": 1309, - "stances": 9436, - "stand": 2685, - "standard": 20270, - "standen": 84884, - "standing": 10070, - "stands": 96715, - "stant": 4706, - "stantial": 75957, - "stantiate": 42251, - "stantiateViewController": 82783, - "stants": 6886, - "star": 11870, - "stars": 36638, - "start": 2468, - "startDate": 40807, - "startIndex": 95311, - "startTime": 40906, - "startdate": 95398, - "started": 46723, - "starter": 31374, - "starting": 39289, - "starts": 65876, - "startsWith": 57936, - "startswith": 69325, - "starttime": 88786, - "startup": 80665, - "stash": 49771, - "stashop": 83074, - "stasy": 72755, - "stat": 9878, - "state": 2454, - "stateParams": 55069, - "stateProvider": 79349, - "statement": 24184, - "statements": 94587, - "states": 32069, - "static": 1978, - "staticmethod": 22215, - "station": 20155, - "stations": 74628, - "statistics": 54120, - "stats": 16260, - "statt": 96346, - "status": 2829, - "statusCode": 44480, - "statuses": 65353, - "staw": 49011, - "stay": 58921, - "std": 1834, - "stdClass": 78848, - "stdafx": 56306, - "stdarg": 88268, - "stdbool": 62556, - "stdcall": 60789, - "stddef": 66397, - "stderr": 36422, - "stdexcept": 94513, - "stdin": 51602, - "stdint": 31435, - "stdio": 10345, - "stdlib": 13149, - "stdout": 36358, - "ste": 5342, - "stead": 42180, - "steady": 71666, - "steam": 46590, - "sted": 23892, - "steder": 41889, - "steel": 61554, - "steen": 93957, - "stein": 12429, - "stell": 41137, - "stellar": 77293, - "stellen": 58158, - "steller": 72511, - "stellung": 54377, - "stem": 64088, - "sten": 15795, - "step": 9520, - "steps": 24080, - "ster": 3667, - "sterdam": 26302, - "stered": 82880, - "sterol": 32182, - "sterreich": 68398, - "sters": 12570, - "stery": 75970, - "sth": 30077, - "sthrough": 86901, - "sti": 83419, - "stial": 50606, - "stice": 93703, - "stick": 29033, - "sticks": 68945, - "sticky": 55442, - "stile": 46504, - "still": 43366, - "stim": 53654, - "stime": 86094, - "stin": 47461, - "stinence": 94721, - "stinian": 87357, - "stit": 3696, - "stitial": 48170, - "stitución": 139535, - "stituição": 136647, - "stitute": 7660, - "stitution": 10446, - "stitutions": 92678, - "stk": 75309, - "stm": 24855, - "stmt": 9215, - "sto": 33052, - "stock": 13479, - "stocks": 68027, - "stoff": 79956, - "stoi": 87241, - "ston": 7720, - "stone": 10812, - "stones": 32510, - "stood": 51684, - "stop": 9495, - "stopped": 89863, - "stops": 98020, - "stor": 47365, - "storage": 16172, - "store": 4314, - "storeId": 84397, - "stored": 71249, - "stores": 43469, - "stories": 68235, - "storm": 26413, - "storms": 82009, - "story": 26485, - "storybook": 90661, - "stown": 42958, - "stp": 91462, - "str": 495, - "stra": 13342, - "stract": 4339, - "straction": 42602, - "stractions": 64690, - "straight": 88192, - "strain": 77626, - "strained": 57727, - "straint": 4655, - "straints": 7458, - "stral": 54970, - "strand": 85881, - "strap": 5092, - "strar": 22189, - "stras": 58787, - "strate": 69915, - "strategy": 61914, - "stration": 54581, - "straÃŁe": 135786, - "strcasecmp": 68852, - "strcmp": 14222, - "strconv": 51848, - "strcpy": 89729, - "stre": 66423, - "stream": 4027, - "streams": 60975, - "street": 27351, - "strength": 74237, - "stress": 94190, - "stretch": 72084, - "strftime": 43737, - "stri": 29872, - "strict": 6627, - "stricted": 73072, - "striction": 51130, - "stride": 47057, - "strike": 73004, - "string": 917, - "stringLiteral": 59305, - "stringValue": 78883, - "strings": 18594, - "stringstream": 28803, - "strip": 13105, - "stripe": 61233, - "strlen": 20877, - "strncmp": 46787, - "stro": 95941, - "stroke": 28241, - "strom": 34055, - "strong": 4519, - "stroy": 10966, - "strpos": 48808, - "strstr": 71266, - "strt": 39126, - "strtolower": 84469, - "strtotime": 50962, - "struct": 1235, - "struction": 3024, - "structions": 19657, - "structor": 3086, - "structors": 91366, - "structural": 95697, - "structure": 7837, - "structured": 51143, - "structures": 46094, - "structuring": 62172, - "struk": 95194, - "strument": 19474, - "struments": 37718, - "strup": 89399, - "stry": 4617, - "sts": 36279, - "stu": 60682, - "stub": 59398, - "stud": 75343, - "student": 12038, - "students": 37218, - "studio": 59019, - "study": 54965, - "stuff": 57304, - "sty": 78755, - "styl": 85588, - "style": 3528, - "styleType": 49509, - "styled": 22849, - "styles": 3954, - "stylesheet": 6793, - "stype": 73520, - "stä": 132684, - "ständ": 47635, - "stände": 138087, - "stär": 139522, - "stärke": 139523, - "stÃ¥": 96490, - "stück": 135522, - "stüt": 57849, - "stÄħ": 131728, - "stÄħpi": 131729, - "stÄĻp": 128860, - "su": 27051, - "sub": 1966, - "subcategory": 79875, - "subclass": 99117, - "subj": 78014, - "subject": 11501, - "subjects": 64782, - "submenu": 60984, - "submission": 57108, - "submit": 5955, - "submitButton": 82047, - "submitted": 72463, - "subnet": 88636, - "subpackage": 42837, - "subplot": 49856, - "subs": 64798, - "subscribe": 9384, - "subscriber": 59205, - "subscription": 34404, - "subscriptions": 72560, - "subsection": 68874, - "subset": 38253, - "subseteq": 52396, - "subst": 52802, - "substr": 28614, - "substring": 33874, - "subtitle": 40417, - "subtotal": 73483, - "subtract": 59442, - "subtype": 77241, - "succ": 64441, - "success": 5630, - "successful": 30950, - "successfully": 60505, - "such": 20805, - "sudo": 18881, - "suffix": 26786, - "suggest": 95761, - "suit": 72040, - "suite": 49992, - "sum": 1242, - "suma": 94809, - "sume": 31323, - "sumer": 11761, - "suming": 61117, - "summ": 69544, - "summary": 1708, - "summer": 62566, - "sun": 39519, - "sup": 12776, - "super": 9522, - "supplier": 39830, - "supply": 94683, - "support": 23362, - "supported": 18216, - "supports": 77709, - "suppress": 96960, - "sur": 19784, - "sure": 19098, - "surf": 77860, - "surface": 39746, - "surname": 51415, - "survey": 47454, - "sus": 85421, - "suspend": 98611, - "sut": 99020, - "sv": 3492, - "svc": 58094, - "svg": 15196, - "sville": 49928, - "svm": 96251, - "svn": 63589, - "svp": 80606, - "sw": 2280, - "swagen": 43577, - "swagger": 74755, - "swana": 93710, - "swap": 25741, - "sweet": 94828, - "swer": 3559, - "swers": 9409, - "swick": 56072, - "swift": 70642, - "swing": 85284, - "swiper": 53227, - "swire": 79725, - "switch": 17338, - "swith": 22177, - "sword": 79038, - "sworth": 60731, - "sx": 48612, - "sy": 22860, - "sylvania": 18480, - "sym": 23802, - "symbol": 18785, - "symbols": 67426, - "syn": 20339, - "sync": 12996, - "syntax": 56193, - "synthesize": 30883, - "sys": 7791, - "syscall": 71069, - "system": 8948, - "systems": 45554, - "sz": 14357, - "szczÄĻ": 132230, - "szed": 139632, - "szedÅĤ": 139633, - "szÄħ": 129343, - "szÄĻ": 130620, - "são": 128791, - "sätze": 140053, - "sı": 126203, - "sına": 129561, - "sında": 128892, - "sını": 129489, - "sının": 130182, - "sınız": 131038, - "sıyla": 131720, - "sız": 128894, - "sÄħd": 141820, - "sÅĤ": 142202, - "sÅĤaw": 132224, - "sÅĤuch": 142203, - "t": 83, - "ta": 2565, - "tab": 6192, - "tabl": 73099, - "tabla": 57354, - "table": 2005, - "tableFuture": 69629, - "tableName": 35977, - "tableView": 14430, - "tablename": 42679, - "tables": 32110, - "tablet": 98693, - "taboola": 48489, - "tabpanel": 73246, - "tabs": 30993, - "tag": 4578, - "tagName": 73273, - "tags": 14082, - "tahun": 65996, - "taient": 84706, - "tail": 14586, - "tails": 39960, - "tain": 22921, - "taire": 70137, - "take": 22769, - "taken": 82161, - "takes": 77979, - "taking": 88794, - "tal": 50877, - "talk": 35241, - "tam": 72707, - "tan": 52591, - "tanggal": 48699, - "tank": 85171, - "tant": 60412, - "tap": 30047, - "tape": 63520, - "tar": 26737, - "target": 5657, - "targets": 45547, - "tas": 47542, - "task": 8202, - "taskId": 80688, - "tasks": 24760, - "tat": 67138, - "tatus": 78321, - "tau": 29143, - "tax": 17616, - "taxonomy": 53004, - "taÅĤ": 128055, - "taÅŁ": 132318, - "tb": 18387, - "tbl": 18064, - "tbody": 10095, - "tc": 10413, - "tcp": 27161, - "td": 1296, - "tdown": 71546, - "te": 665, - "tea": 81594, - "teacher": 23360, - "teachers": 80980, - "team": 9196, - "teams": 38496, - "tearDown": 82892, - "teborg": 77429, - "tec": 54200, - "tech": 17785, - "techn": 25444, - "technical": 72137, - "technology": 58242, - "tection": 39141, - "ted": 6565, - "tee": 6547, - "teen": 14901, - "teenth": 45387, - "tees": 29800, - "tega": 91905, - "teil": 55632, - "tein": 38240, - "tek": 42713, - "tel": 22924, - "tele": 15410, - "telefone": 78130, - "telefono": 51208, - "telegram": 81669, - "telephone": 51927, - "tell": 72357, - "tem": 870, - "tement": 78407, - "temp": 3888, - "temperature": 34558, - "templ": 74860, - "template": 4214, - "templates": 15463, - "temporary": 78090, - "temps": 66280, - "tempt": 4213, - "tempts": 33272, - "tems": 90837, - "ten": 1960, - "tenant": 43919, - "tener": 73500, - "teness": 63097, - "tensor": 46111, - "tensorflow": 84282, - "tent": 72368, - "tep": 90898, - "ter": 465, - "tera": 50037, - "terdam": 50129, - "tere": 54604, - "tered": 33159, - "tering": 59385, - "terior": 40544, - "term": 4991, - "termin": 22969, - "terminal": 36327, - "terminate": 48061, - "terminated": 68659, - "termination": 88676, - "terms": 18347, - "tern": 4160, - "ternal": 15342, - "tero": 90389, - "terr": 68669, - "terra": 47821, - "terraform": 61385, - "terrain": 46782, - "territ": 95215, - "terror": 37388, - "terrorism": 55563, - "ters": 5045, - "tery": 17615, - "tes": 2338, - "test": 1944, - "testCase": 66194, - "testdata": 92425, - "teste": 88999, - "tested": 74936, - "tester": 73358, - "testimonial": 80745, - "testing": 8840, - "tests": 23841, - "tesy": 18882, - "tet": 72442, - "tex": 33344, - "text": 1318, - "textAlign": 81175, - "textBox": 39598, - "textContent": 43435, - "textField": 37782, - "textInput": 66997, - "textTheme": 93723, - "textView": 84228, - "textarea": 11741, - "textbox": 77375, - "textfield": 61763, - "texto": 57003, - "texts": 85942, - "texture": 27496, - "textures": 70030, - "tf": 8935, - "tfoot": 58484, - "tg": 41428, - "tgl": 45078, - "tgt": 85226, - "th": 339, - "tha": 22410, - "thag": 95362, - "thal": 30292, - "thalm": 77643, - "than": 53795, - "thane": 85085, - "thank": 57417, - "thanks": 45493, - "that": 9033, - "the": 1782, - "theValue": 73277, - "thead": 11417, - "theast": 14759, - "thed": 78271, - "theid": 68355, - "their": 49728, - "theless": 19986, - "them": 48718, - "theme": 9047, - "themes": 40715, - "then": 3391, - "thenReturn": 26842, - "theon": 63010, - "theorem": 31515, - "theory": 93204, - "ther": 696, - "therapy": 45655, - "there": 18532, - "thermal": 68118, - "thern": 6322, - "theros": 90782, - "thers": 2985, - "thes": 6375, - "these": 43910, - "theses": 38322, - "thesis": 13189, - "thesize": 26887, - "thesized": 82879, - "thest": 60843, - "theta": 15976, - "thetic": 17556, - "thew": 15765, - "they": 20069, - "thic": 81564, - "thickness": 90967, - "thin": 63671, - "thing": 1596, - "things": 57074, - "think": 26865, - "thinkable": 90103, - "thinking": 82260, - "third": 31727, - "this": 574, - "thon": 4587, - "thood": 31868, - "thora": 64683, - "those": 53619, - "though": 4535, - "thought": 60565, - "thouse": 55034, - "thr": 60024, - "thread": 4528, - "threads": 27286, - "threat": 96129, - "three": 27856, - "thren": 62264, - "thresh": 94382, - "threshold": 28902, - "thritis": 39385, - "thro": 92110, - "throat": 86064, - "throp": 97543, - "through": 19742, - "throw": 7119, - "thrown": 86445, - "throws": 8100, - "ths": 16896, - "thumb": 25036, - "thumbnail": 27786, - "thumbnails": 86109, - "thumbs": 95390, - "thur": 21456, - "thus": 33132, - "thy": 26422, - "thè": 128213, - "thèque": 143536, - "thèse": 143387, - "thé": 131157, - "ti": 10251, - "tic": 28050, - "tica": 81955, - "tical": 34658, - "tick": 34155, - "ticker": 68345, - "ticket": 26534, - "tickets": 68727, - "ticks": 35078, - "tics": 12734, - "tid": 24449, - "tie": 48731, - "tier": 49335, - "ties": 28546, - "tif": 84340, - "tight": 74182, - "til": 1646, - "tile": 21094, - "tiles": 60882, - "tility": 12189, - "tim": 20091, - "time": 1678, - "timeline": 48960, - "timeofday": 59523, - "timeout": 14150, - "timer": 19278, - "times": 15136, - "timestamp": 13035, - "timestamps": 33591, - "timezone": 43271, - "timing": 89760, - "tin": 55971, - "ting": 1280, - "tingham": 59135, - "tings": 2065, - "tiny": 46116, - "tion": 27391, - "tip": 13145, - "tipo": 21194, - "tips": 45454, - "tit": 16903, - "title": 2102, - "titleLabel": 88446, - "titles": 34523, - "titre": 69581, - "titulo": 34963, - "tivitÃł": 138580, - "tiÄŁi": 126570, - "tk": 6242, - "tl": 11544, - "tle": 11239, - "tlement": 44489, - "tls": 34488, - "tm": 13730, - "tml": 3864, - "tmp": 5173, - "tmpl": 71359, - "tn": 1517, - "to": 983, - "toArray": 27774, - "toBe": 8898, - "toBeDefined": 67538, - "toBeFalsy": 87453, - "toBeInTheDocument": 99039, - "toBeTruthy": 28033, - "toContain": 75804, - "toDate": 79459, - "toDouble": 64483, - "toEqual": 13226, - "toFixed": 36529, - "toFloat": 91297, - "toHave": 24720, - "toHaveBeenCalled": 33606, - "toHaveBeenCalledTimes": 82544, - "toHaveBeenCalledWith": 56147, - "toHaveLength": 87947, - "toISOString": 89988, - "toInt": 30960, - "toJson": 73985, - "toList": 41907, - "toLocale": 77385, - "toLowerCase": 27216, - "toMatch": 43548, - "toMatchSnapshot": 61426, - "toPromise": 81659, - "toString": 6575, - "toThrow": 88110, - "toUpperCase": 37086, - "toa": 49095, - "toast": 52101, - "tober": 52144, - "toc": 54780, - "tod": 67887, - "today": 30113, - "todo": 17370, - "todos": 49188, - "tog": 67173, - "toggle": 17703, - "toggleClass": 48279, - "togroup": 82861, - "toi": 52609, - "tok": 29594, - "token": 5839, - "tokenId": 98214, - "tokenizer": 85593, - "tokens": 30566, - "tol": 20576, - "tolist": 52141, - "tolower": 38993, - "tolua": 94681, - "tom": 37401, - "ton": 777, - "tone": 57929, - "tones": 91645, - "tons": 34411, - "too": 36127, - "took": 90353, - "tool": 14172, - "toolStrip": 65539, - "toolbar": 37530, - "toolbox": 87183, - "tools": 15918, - "tooltip": 21539, - "top": 3481, - "topic": 16411, - "topics": 55152, - "topl": 98605, - "tor": 10980, - "torch": 27414, - "torrent": 70230, - "tors": 97166, - "tos": 42581, - "tot": 27779, - "total": 5035, - "totalCount": 97036, - "totals": 84846, - "touch": 22020, - "touches": 76953, - "toupper": 87732, - "tour": 51339, - "tournament": 88079, - "tout": 66333, - "tower": 77578, - "town": 27831, - "toy": 81225, - "tp": 790, - "tparam": 68071, - "tpl": 12620, - "tplib": 94030, - "tps": 96031, - "tr": 376, - "tra": 2172, - "trace": 15067, - "tracer": 94941, - "track": 13131, - "tracked": 58381, - "tracker": 50395, - "tracking": 44553, - "tracks": 49324, - "tract": 2144, - "tracted": 54435, - "traction": 26425, - "tractive": 69078, - "tractor": 54766, - "tracts": 36188, - "trad": 47026, - "trade": 36071, - "traditional": 86908, - "traffic": 53987, - "trag": 52015, - "trail": 77875, - "train": 10397, - "trained": 35722, - "trainer": 83776, - "training": 30654, - "trait": 29432, - "traits": 62633, - "trajectory": 83787, - "trak": 70019, - "tram": 97940, - "tran": 43369, - "trand": 94574, - "trans": 1458, - "transaction": 13528, - "transactions": 41844, - "transfer": 24188, - "transform": 4701, - "transforms": 94833, - "transition": 20454, - "translate": 14045, - "translated": 53242, - "translation": 3053, - "translations": 58450, - "translator": 44357, - "transparent": 28269, - "transport": 26445, - "transpose": 54487, - "trap": 55914, - "tras": 13503, - "trash": 68826, - "trasound": 53765, - "travel": 48510, - "traî": 138377, - "traîn": 138378, - "tre": 10157, - "trecht": 93870, - "tree": 9344, - "trees": 90412, - "treeview": 79205, - "trer": 94820, - "tres": 44532, - "trfs": 80012, - "tri": 22446, - "trial": 47347, - "triangle": 55114, - "trib": 1332, - "tribute": 2199, - "tributes": 3604, - "tribution": 31140, - "tridge": 36877, - "tridges": 62831, - "trie": 8927, - "tries": 4543, - "trieve": 34216, - "trigger": 18468, - "tright": 68976, - "trim": 10666, - "trimmed": 98101, - "tring": 561, - "trinsic": 45002, - "trip": 32981, - "trl": 9599, - "tro": 32442, - "tron": 34685, - "trs": 85385, - "tru": 65253, - "truck": 98318, - "true": 1866, - "truncate": 66054, - "trust": 56655, - "trusted": 83837, - "truth": 58577, - "trx": 72461, - "try": 1539, - "trying": 84034, - "trys": 39607, - "tryside": 44255, - "trzym": 128122, - "trzymaÄĩ": 142411, - "trzymaÅĤ": 140350, - "trä": 140463, - "trägt": 140464, - "tré": 133349, - "tréal": 98177, - "ts": 2576, - "tsky": 81236, - "tsx": 87233, - "tsy": 58960, - "tt": 5566, - "tte": 39836, - "tti": 97465, - "ttl": 62858, - "ttp": 1209, - "tty": 81711, - "tu": 24494, - "tube": 73738, - "tuple": 24590, - "tur": 65367, - "ture": 4974, - "tures": 18513, - "turn": 412, - "turned": 41186, - "turnstile": 56190, - "turtle": 81109, - "tutorial": 91782, - "tv": 22209, - "tw": 15560, - "tweet": 35387, - "tweets": 79721, - "twenty": 93965, - "twig": 71653, - "twitter": 14679, - "two": 19789, - "twor": 142676, - "tworzyÄĩ": 142677, - "twór": 140086, - "tx": 3998, - "txn": 73370, - "txt": 8586, - "ty": 1881, - "tyard": 55536, - "typ": 3653, - "type": 1313, - "typeName": 85491, - "typed": 44181, - "typedef": 5286, - "typeid": 88342, - "typename": 9031, - "typeof": 10222, - "typeorm": 80059, - "typeparam": 26946, - "types": 9242, - "typescript": 49552, - "typically": 86084, - "typing": 89802, - "typings": 85735, - "tz": 37592, - "tá": 128786, - "té": 128294, - "téri": 131783, - "tó": 128644, - "tón": 134823, - "tória": 132327, - "tório": 129741, - "tów": 128771, - "tör": 130457, - "tü": 126439, - "tür": 125601, - "türk": 134631, - "tÃł": 126318, - "tÃŃ": 129459, - "tı": 125453, - "tık": 129763, - "tım": 132948, - "tır": 125501, - "tıģ": 127929, - "tıģı": 129962, - "tıģımız": 142221, - "tıģını": 137550, - "tÄħ": 130124, - "u": 84, - "uC": 91011, - "uD": 71872, - "uParam": 91587, - "ua": 4284, - "uable": 13128, - "uably": 31664, - "uada": 85100, - "uae": 75517, - "uai": 84695, - "uais": 72991, - "ual": 928, - "uala": 70120, - "uale": 49311, - "uales": 40752, - "uali": 51166, - "uality": 10733, - "ually": 1832, - "uan": 10386, - "uang": 68610, - "uania": 62511, - "uant": 27574, - "uar": 18731, - "uard": 11034, - "uards": 54608, - "uario": 6080, - "uarios": 20240, - "uars": 66387, - "uart": 27170, - "uary": 3536, - "uat": 54182, - "uate": 6292, - "uated": 12852, - "uates": 50985, - "uating": 53543, - "uation": 4002, - "uations": 37070, - "uator": 45162, - "uação": 72326, - "ub": 392, - "uba": 30429, - "ubah": 81324, - "ubar": 44497, - "ubb": 20683, - "ubber": 91886, - "ubble": 14600, - "ubbles": 34295, - "ubbo": 97737, - "ubby": 54854, - "ube": 3760, - "ubectl": 53380, - "uben": 75967, - "uber": 29870, - "ubern": 76259, - "ubernetes": 29827, - "ubes": 50625, - "ubi": 54233, - "ubic": 41181, - "ubishi": 62220, - "ubit": 59220, - "ubits": 81402, - "uble": 40472, - "ublic": 475, - "ublish": 2538, - "ublished": 11669, - "ublisher": 15182, - "ubo": 96119, - "ubre": 63259, - "ubs": 15738, - "ubuntu": 37979, - "uby": 20028, - "ubyte": 70388, - "uc": 1754, - "ucas": 48846, - "ucc": 14570, - "ucceed": 29264, - "ucceeded": 43805, - "uccess": 2557, - "ucch": 70566, - "ucchini": 85570, - "ucci": 52369, - "ucción": 67736, - "uce": 10521, - "uced": 23967, - "ucene": 58054, - "ucer": 59396, - "uces": 62271, - "uch": 1387, - "ucha": 54381, - "uchar": 29272, - "uche": 33827, - "uchen": 44977, - "ucher": 73612, - "uchi": 54917, - "uchos": 67250, - "uchs": 53152, - "uchsia": 73391, - "ucht": 32030, - "uci": 42409, - "ucid": 72687, - "ucing": 58044, - "ucion": 42277, - "uciones": 66247, - "ución": 35223, - "uck": 1942, - "ucked": 39358, - "ucken": 96990, - "ucker": 24370, - "ucket": 11152, - "uckets": 38551, - "ucking": 46170, - "uckland": 47878, - "uckle": 55975, - "uckles": 83696, - "ucks": 15582, - "ucky": 10073, - "ucle": 22147, - "uclear": 9637, - "uco": 94414, - "ucose": 93597, - "ucs": 42089, - "ucson": 59285, - "uct": 667, - "uction": 2654, - "uctions": 91463, - "uctive": 58823, - "uctor": 79222, - "uctose": 86773, - "ucumber": 40912, - "ucursal": 82230, - "ucus": 37501, - "ucz": 97567, - "ud": 661, - "uda": 8053, - "udad": 24776, - "udades": 92823, - "udas": 53741, - "udd": 8347, - "udded": 85792, - "udden": 37995, - "uddenly": 43706, - "udder": 56129, - "uddle": 74984, - "uddled": 84101, - "uddy": 33917, - "ude": 793, - "udeau": 40496, - "uded": 37377, - "udem": 87205, - "uden": 60127, - "udence": 73093, - "udent": 4881, - "udents": 16286, - "uder": 32619, - "udes": 28146, - "udev": 77297, - "udge": 19561, - "udget": 6312, - "udging": 87312, - "udi": 20536, - "udiant": 40839, - "udiante": 49663, - "udiantes": 68754, - "udies": 57687, - "uding": 50767, - "udio": 3230, - "udios": 88785, - "udit": 33887, - "udo": 7680, - "udoku": 68302, - "udos": 45079, - "udp": 31101, - "uds": 27988, - "udson": 31678, - "udu": 87207, - "udy": 17858, - "ue": 361, - "ueba": 42412, - "uebas": 90683, - "ueblo": 60750, - "ued": 3260, - "uede": 63667, - "uego": 26681, - "uegos": 86206, - "ueil": 51808, - "uel": 4000, - "uela": 23737, - "uele": 74343, - "ueling": 78997, - "uell": 41658, - "uelle": 29937, - "uellement": 76676, - "uellen": 70628, - "uelles": 64732, - "uels": 60144, - "uelve": 46856, - "uely": 66410, - "uem": 69847, - "uen": 10316, - "uencia": 63972, - "uent": 11680, - "uenta": 38352, - "uentes": 68737, - "uento": 55288, - "uer": 8801, - "uerdo": 52470, - "uers": 83425, - "ues": 1137, - "uesday": 7047, - "uese": 35454, - "uess": 33301, - "uest": 3045, - "uesta": 19441, - "uestas": 57147, - "uestion": 8678, - "uesto": 31491, - "uestos": 64182, - "uestra": 75364, - "uet": 13807, - "uetooth": 16412, - "uetype": 98340, - "ueue": 6318, - "ueur": 78523, - "ueva": 50658, - "uevo": 32321, - "uez": 27600, - "uf": 1704, - "ufact": 4725, - "ufacturer": 31545, - "ufe": 66075, - "ufen": 28421, - "uff": 1362, - "uffed": 40573, - "uffer": 2040, - "uffers": 20342, - "ufficient": 26683, - "uffix": 13554, - "uffle": 13208, - "uffled": 42335, - "uffles": 77453, - "uffling": 79690, - "uffman": 77708, - "uffs": 32568, - "uffy": 29877, - "ufig": 81548, - "uforia": 69754, - "ufreq": 91001, - "ufs": 87083, - "uft": 89131, - "ug": 768, - "uga": 36960, - "ugador": 81420, - "ugal": 44184, - "ugar": 8566, - "ugas": 57831, - "uge": 4733, - "ugen": 68989, - "ugeot": 93422, - "uger": 58420, - "uges": 50159, - "ugg": 2596, - "uggage": 43665, - "ugged": 20146, - "uggest": 3799, - "uggested": 53276, - "uggestion": 42116, - "uggestions": 37882, - "ugging": 35268, - "uggle": 49328, - "uggling": 61931, - "uggy": 60232, - "ugh": 7443, - "ughs": 31343, - "ught": 3863, - "ughter": 7340, - "ughters": 26505, - "ughty": 35516, - "ugi": 50540, - "ugin": 3631, - "ugins": 6840, - "uglify": 86532, - "ugo": 33501, - "ugs": 13299, - "ugu": 29785, - "uguay": 59203, - "uh": 12540, - "uhan": 69886, - "uhe": 91547, - "uhl": 95174, - "uhn": 92164, - "ui": 1963, - "uib": 79623, - "uibModal": 91109, - "uid": 2423, - "uida": 84320, - "uide": 34705, - "uido": 53076, - "uids": 91216, - "uien": 87074, - "uil": 57697, - "uild": 1498, - "uilder": 2511, - "uilt": 11227, - "uiltin": 25628, - "uin": 74621, - "uing": 7471, - "uint": 2496, - "uintptr": 51380, - "uir": 20911, - "uire": 51650, - "uis": 9241, - "uish": 50120, - "uisine": 55140, - "uisse": 91548, - "uit": 3083, - "uitable": 85481, - "uitar": 34746, - "uite": 9302, - "uiten": 86980, - "uition": 37061, - "uitive": 34151, - "uitka": 58840, - "uito": 25572, - "uits": 11797, - "uity": 34494, - "uição": 77023, - "uj": 9635, - "uja": 88708, - "uje": 33867, - "ujemy": 82328, - "ujet": 67907, - "uju": 72301, - "ujÄħ": 48078, - "ujÄħc": 129668, - "ujÄħce": 132869, - "ujÄħcy": 132154, - "ujÄħcych": 132467, - "ujÄĻ": 130813, - "uk": 3101, - "uka": 25196, - "ukan": 27724, - "uke": 10430, - "ukes": 64750, - "uki": 21504, - "ukkan": 67204, - "ukkit": 22793, - "uko": 71058, - "ukt": 37667, - "uktur": 84956, - "uku": 35734, - "ul": 360, - "ula": 5607, - "ulado": 84429, - "ulaire": 73675, - "ulan": 50735, - "ulance": 40832, - "ulant": 68633, - "ular": 1276, - "ulares": 88029, - "ulario": 32330, - "ularity": 28979, - "ulary": 23216, - "ulas": 25541, - "ulate": 6334, - "ulated": 7757, - "ulates": 23156, - "ulating": 15486, - "ulation": 2914, - "ulations": 7455, - "ulative": 22160, - "ulator": 10511, - "ulators": 41291, - "ulatory": 37120, - "ulação": 90503, - "uld": 36568, - "ule": 1111, - "uled": 8448, - "ulen": 94211, - "ulence": 58466, - "ulent": 28480, - "uler": 8479, - "ulerAngles": 58752, - "ulers": 26800, - "ules": 2425, - "ulet": 48418, - "ulf": 14308, - "ulfill": 86516, - "ulfilled": 84993, - "ulg": 54999, - "uli": 23602, - "ulia": 69745, - "uliar": 41618, - "ulin": 23401, - "uling": 12269, - "ulings": 67249, - "ulis": 64030, - "ulist": 96074, - "ulk": 21785, - "ulkan": 60538, - "ull": 617, - "ulla": 34078, - "ullah": 40797, - "ullan": 41120, - "ulle": 40054, - "ulled": 91022, - "ullen": 41474, - "ullet": 22376, - "ullets": 65430, - "ulling": 60636, - "ullivan": 36041, - "ullo": 64588, - "ulls": 70423, - "ully": 21965, - "ulner": 58401, - "ulnerable": 92907, - "ulo": 8763, - "ulong": 32832, - "ulos": 28652, - "ulous": 13540, - "ulously": 37562, - "ulp": 12840, - "ulpt": 23396, - "uls": 14295, - "ulse": 17217, - "ulses": 66016, - "ulsion": 32903, - "ulsive": 57821, - "ult": 494, - "ulta": 27157, - "ultan": 60093, - "ulti": 7068, - "ultimate": 66566, - "ultimo": 84316, - "ultip": 9845, - "ultipart": 18204, - "ultipartFile": 63300, - "ultiple": 12229, - "ultiply": 21352, - "ulton": 75476, - "ultur": 76431, - "ultural": 43447, - "ulture": 10523, - "ultureInfo": 52928, - "ulty": 14728, - "ultz": 54426, - "ulu": 24411, - "ului": 31648, - "ulum": 16496, - "ulumi": 65482, - "ulus": 19425, - "uly": 3901, - "um": 372, - "uma": 13416, - "umably": 74951, - "uman": 7136, - "umann": 63507, - "umar": 30867, - "umas": 53924, - "umat": 45213, - "umatic": 31930, - "umb": 3551, - "umba": 70569, - "umbai": 29855, - "umbed": 98596, - "umber": 890, - "umberland": 68759, - "umbing": 32446, - "umble": 22733, - "umbled": 25817, - "umbledore": 75318, - "umbles": 57099, - "umbling": 41632, - "umblr": 29601, - "umbn": 9670, - "umbnail": 11026, - "umbnails": 31312, - "umbo": 48609, - "umbotron": 57848, - "umbs": 15775, - "umd": 60245, - "ume": 3885, - "umed": 38155, - "umen": 27899, - "ument": 1123, - "uments": 2831, - "umer": 3389, - "umerator": 60969, - "umeric": 12572, - "umericUpDown": 41246, - "umes": 18618, - "umi": 24336, - "umidity": 73926, - "umin": 10110, - "uming": 29489, - "uminium": 39851, - "uminum": 18814, - "uml": 42231, - "umlah": 30327, - "umm": 25964, - "ummer": 62273, - "ummies": 49179, - "ummings": 82433, - "ummy": 8574, - "umn": 21371, - "umni": 56865, - "umno": 48347, - "umnos": 61636, - "umo": 64625, - "umont": 89817, - "umor": 68261, - "ump": 1510, - "umped": 60192, - "umper": 24027, - "umph": 30661, - "umping": 54332, - "umps": 11793, - "umpt": 49874, - "umptech": 62517, - "umption": 60574, - "umpy": 6752, - "ums": 6237, - "umu": 83209, - "un": 359, - "una": 8565, - "unable": 45928, - "unakan": 94104, - "unal": 25581, - "uname": 40379, - "unami": 61003, - "unan": 64634, - "unar": 84992, - "unas": 58264, - "unate": 21769, - "unately": 9505, - "unbind": 73111, - "unc": 1347, - "uncan": 37466, - "uncate": 26900, - "uncated": 38007, - "unce": 96693, - "unch": 3185, - "unchecked": 31684, - "unched": 10653, - "unci": 18424, - "uncia": 94485, - "unciation": 46310, - "uncio": 66044, - "uncios": 62156, - "unct": 19931, - "unction": 598, - "unctuation": 72299, - "uncture": 62874, - "und": 1241, - "unda": 26892, - "undai": 49681, - "undance": 97581, - "unday": 6676, - "unde": 28865, - "unded": 36053, - "undef": 16135, - "undefined": 9614, - "unden": 22157, - "under": 7995, - "underline": 45673, - "unders": 31009, - "underscore": 53933, - "undi": 55898, - "unding": 37189, - "undle": 4206, - "undler": 85365, - "undles": 49204, - "undo": 13499, - "undos": 64854, - "undra": 78730, - "undred": 7114, - "undreds": 45713, - "undry": 27247, - "unds": 42950, - "undy": 59185, - "une": 2886, - "uned": 48883, - "unei": 95223, - "uner": 47037, - "unes": 8531, - "unexpected": 53859, - "unfinished": 15092, - "unfold": 83704, - "unft": 60730, - "ung": 2185, - "unga": 91845, - "ungal": 57167, - "ungalow": 83919, - "ungan": 51188, - "unge": 13884, - "ungen": 11595, - "ungeon": 23452, - "ungeons": 50017, - "unger": 71622, - "ungi": 81490, - "ungkin": 97934, - "ungle": 28647, - "ungs": 28122, - "uni": 15705, - "uniacid": 88558, - "unic": 3525, - "unication": 39195, - "unicip": 13603, - "unicipio": 65167, - "unicode": 24519, - "unicorn": 92357, - "unidad": 82730, - "uniform": 38351, - "unifu": 22241, - "unik": 70449, - "uning": 37202, - "union": 16192, - "uniq": 54398, - "unique": 9587, - "unist": 15779, - "unistd": 27483, - "unit": 3843, - "unitOfWork": 73116, - "unities": 6037, - "units": 25643, - "unittest": 91005, - "unity": 2439, - "unitÃł": 128195, - "universal": 95300, - "unix": 56646, - "unj": 68914, - "unk": 3122, - "unken": 53929, - "unker": 79929, - "unknown": 16088, - "unks": 15296, - "unkt": 43226, - "unky": 69205, - "unless": 38770, - "unlikely": 55013, - "unlink": 67042, - "unload": 92665, - "unlock": 55021, - "unn": 14931, - "unnable": 82211, - "unned": 37990, - "unnel": 40292, - "unner": 54415, - "unning": 11216, - "unny": 27297, - "uno": 16311, - "unordered": 30419, - "unos": 53443, - "unpack": 80774, - "unprocessable": 67760, - "unque": 36527, - "unread": 96818, - "uns": 10862, - "unsafe": 38157, - "unsch": 80791, - "unset": 36804, - "unsigned": 3626, - "unsqueeze": 93636, - "unsubscribe": 90423, - "unsupported": 81145, - "unt": 3850, - "unta": 42050, - "untary": 58956, - "untas": 54572, - "unte": 10830, - "unted": 27636, - "unteer": 40905, - "unteers": 62684, - "unter": 29159, - "until": 38730, - "untime": 4466, - "unting": 26324, - "untlet": 85061, - "unto": 25420, - "untos": 49374, - "unts": 36940, - "untu": 18230, - "unu": 62253, - "unused": 24713, - "unwrap": 15454, - "unya": 81271, - "uo": 23137, - "uong": 68795, - "uos": 83708, - "uous": 9193, - "uously": 65635, - "up": 454, - "upa": 45831, - "upakan": 73736, - "upal": 20534, - "upaten": 74895, - "upd": 76618, - "update": 2386, - "updated": 11768, - "updatedAt": 69289, - "updates": 49661, - "updating": 92054, - "upe": 85477, - "uper": 3466, - "upert": 49480, - "upertino": 78454, - "upgrade": 44230, - "upid": 15884, - "upil": 93645, - "upiter": 19519, - "uple": 6061, - "uples": 28323, - "uplic": 9846, - "uplicate": 14070, - "uplicated": 98984, - "uplicates": 40614, - "upload": 6120, - "uploaded": 56883, - "uploader": 86790, - "uploads": 19374, - "upo": 20106, - "upon": 58623, - "upos": 86447, - "upp": 31832, - "uppe": 58498, - "uppen": 89097, - "upper": 13574, - "uppercase": 79882, - "uppet": 38836, - "uppies": 94747, - "upplier": 71691, - "upply": 83923, - "upport": 2800, - "upportInitialize": 12682, - "upported": 12513, - "uppy": 64029, - "upro": 96101, - "ups": 8602, - "upt": 7564, - "uptime": 74659, - "uptools": 51281, - "upuncture": 68462, - "upy": 57498, - "upyter": 72852, - "ur": 324, - "ura": 5690, - "uraa": 89495, - "urable": 18329, - "uracion": 58768, - "uracy": 29384, - "urahan": 95422, - "urai": 47913, - "ural": 4176, - "urally": 41924, - "uran": 26014, - "urance": 5771, - "urances": 63896, - "urança": 87156, - "urar": 75859, - "uras": 19319, - "urat": 90198, - "urate": 61159, - "uration": 2017, - "urations": 21449, - "urator": 57383, - "urb": 9048, - "urban": 59059, - "urbation": 64816, - "urbed": 74225, - "urch": 2574, - "urchase": 12877, - "urchased": 72250, - "urchases": 74102, - "urd": 16081, - "urdy": 39118, - "ure": 552, - "ureau": 17169, - "ured": 3073, - "ureen": 95572, - "ureka": 60522, - "urement": 38246, - "uren": 21211, - "urence": 86937, - "urent": 75965, - "urer": 7733, - "urers": 11807, - "ures": 1413, - "urette": 72143, - "urf": 29363, - "urface": 10509, - "urg": 5556, - "urga": 90776, - "urge": 39823, - "urgence": 71996, - "urgent": 85053, - "urgeon": 80462, - "urger": 34298, - "urgery": 84292, - "urgical": 56573, - "urgy": 61529, - "uri": 6070, - "uria": 74784, - "uridad": 45098, - "uries": 10396, - "urile": 92348, - "uring": 1677, - "urious": 27526, - "uristic": 34456, - "urities": 37233, - "urity": 5514, - "url": 1085, - "urlencode": 79472, - "urlpatterns": 39584, - "urls": 20502, - "urm": 52370, - "urma": 86579, - "urn": 399, - "urnal": 62450, - "urname": 19312, - "urning": 53344, - "urnished": 83439, - "urniture": 24578, - "uro": 2798, - "uron": 36090, - "urons": 53669, - "urope": 4084, - "uropean": 73287, - "uros": 43386, - "urous": 54609, - "urovision": 63009, - "urple": 35705, - "urpose": 29249, - "urr": 8027, - "urray": 23717, - "urre": 843, - "urrect": 58000, - "urrection": 39204, - "urred": 8130, - "urrenc": 4451, - "urrence": 20559, - "urrences": 33246, - "urrencies": 19607, - "urrency": 5088, - "urrent": 951, - "urret": 41354, - "urrets": 87334, - "urring": 20449, - "urry": 39856, - "urs": 1723, - "ursal": 54683, - "ursday": 7181, - "urse": 29285, - "ursed": 51732, - "urses": 56857, - "ursion": 34280, - "ursions": 75239, - "ursive": 16514, - "ursively": 79737, - "ursor": 3823, - "ursors": 33191, - "ursos": 47922, - "urst": 32612, - "urt": 5639, - "urther": 3917, - "urtle": 21744, - "urtles": 51114, - "uru": 20915, - "urus": 55166, - "urv": 96760, - "urve": 73047, - "urved": 79527, - "urvey": 38278, - "ury": 3350, - "us": 355, - "usa": 30753, - "usable": 22779, - "usage": 17698, - "usaha": 67030, - "usahaan": 75576, - "usal": 35414, - "usalem": 24260, - "usan": 40212, - "usat": 87432, - "usb": 24343, - "usband": 90981, - "usc": 25034, - "usch": 51078, - "use": 810, - "useRal": 88371, - "useRalative": 88372, - "useRalativeImagePath": 88373, - "useState": 55670, - "used": 2591, - "usement": 42665, - "useppe": 92003, - "user": 872, - "userData": 42526, - "userID": 37506, - "userId": 13508, - "userInfo": 36939, - "userManager": 56838, - "userName": 28841, - "userRepository": 85741, - "userService": 72870, - "usercontent": 42417, - "userdata": 23496, - "userid": 20085, - "userinfo": 61510, - "username": 5113, - "users": 4218, - "uses": 4776, - "uset": 18187, - "useum": 11509, - "ush": 1116, - "ushed": 51978, - "usher": 51680, - "ushi": 37074, - "ushima": 75059, - "ushing": 40813, - "ushman": 75481, - "ushort": 40375, - "usi": 52813, - "usic": 11524, - "usiness": 2063, - "using": 970, - "usion": 7560, - "usions": 35707, - "usive": 22010, - "usize": 51878, - "usk": 32779, - "uslim": 43712, - "uso": 46435, - "usp": 29763, - "uspend": 12758, - "uspendLayout": 15475, - "uspended": 66349, - "usr": 7063, - "usra": 89444, - "uss": 1854, - "ussed": 58842, - "ussels": 31864, - "ussen": 42961, - "usses": 82872, - "ussia": 28478, - "ussian": 15579, - "ussion": 17405, - "ussions": 38733, - "ussy": 13447, - "ust": 590, - "usta": 81879, - "ustain": 30773, - "ustainability": 73485, - "ustainable": 41241, - "uste": 85660, - "usted": 27145, - "uster": 4993, - "ustering": 36694, - "usterity": 54155, - "usters": 14605, - "ustin": 44235, - "usting": 37487, - "usto": 60462, - "ustom": 1450, - "ustomed": 49686, - "ustomer": 4394, - "ustr": 3414, - "ustral": 5408, - "ustralia": 28039, - "ustralian": 57149, - "ustria": 84812, - "ustrial": 46379, - "ustry": 17674, - "ustum": 75308, - "usty": 46325, - "usu": 63868, - "usual": 80224, - "usually": 42966, - "usuario": 15219, - "usuarios": 49644, - "usz": 69391, - "ut": 332, - "uta": 15999, - "utable": 5922, - "utan": 48524, - "utar": 40197, - "utas": 16726, - "utation": 22705, - "utations": 82141, - "utc": 28355, - "utch": 14061, - "utches": 87349, - "utdown": 18452, - "ute": 1070, - "uted": 2774, - "utedString": 39530, - "utely": 97366, - "uten": 13160, - "utenant": 37257, - "utenberg": 44433, - "uter": 27951, - "uters": 15558, - "utes": 2095, - "uteur": 38995, - "utex": 9371, - "utf": 4762, - "uth": 940, - "uther": 25487, - "utherford": 92994, - "utherland": 91832, - "uthor": 1553, - "uti": 31873, - "util": 1314, - "utilities": 61134, - "utility": 30900, - "utils": 6031, - "utilus": 90628, - "uting": 10607, - "ution": 1488, - "utions": 3977, - "utive": 6704, - "utivo": 87576, - "utm": 40220, - "uto": 1535, - "utoff": 27440, - "utom": 58624, - "utomation": 85263, - "utor": 4831, - "utorial": 13888, - "utorials": 54927, - "utors": 9475, - "utory": 36145, - "utos": 20435, - "utow": 9616, - "utowired": 9647, - "utr": 79281, - "utra": 77881, - "utral": 14253, - "utron": 74148, - "uts": 6128, - "utsch": 23747, - "utsche": 28932, - "utschein": 75799, - "utschen": 60135, - "utt": 20826, - "utta": 75516, - "utter": 6207, - "utters": 73770, - "utterstock": 62596, - "uttgart": 54143, - "utting": 73981, - "uttle": 98243, - "utto": 55472, - "utton": 959, - "utura": 78707, - "uture": 2976, - "utures": 74606, - "uty": 20237, - "utz": 32997, - "utzer": 59522, - "utzt": 89002, - "uu": 30072, - "uuid": 17128, - "uum": 20434, - "uur": 50381, - "uv": 12058, - "uve": 56023, - "uvian": 98612, - "uvo": 93463, - "uvre": 60380, - "uvw": 61810, - "uvwxyz": 64213, - "uw": 42110, - "ux": 2200, - "uxe": 35322, - "uxt": 76400, - "uxtap": 92362, - "uy": 4076, - "uya": 44544, - "uye": 55611, - "uyen": 37755, - "uyo": 86688, - "uyên": 124527, - "uyến": 125283, - "uyết": 126033, - "uyá»ģn": 125593, - "uyá»ĥn": 125550, - "uyá»ĩn": 124853, - "uz": 5197, - "uze": 90211, - "uzione": 54346, - "uzu": 86325, - "uzz": 8889, - "uzzer": 91447, - "uzzi": 78471, - "uzzle": 14945, - "uzzy": 34758, - "uç": 127177, - "ução": 60967, - "ué": 95459, - "uÃŁ": 134662, - "uÃŁer": 132894, - "uÃŃ": 64125, - "uÄŁu": 127718, - "uÅŁ": 95532, - "v": 85, - "va": 6586, - "vable": 23760, - "vably": 88134, - "vac": 53703, - "vae": 70242, - "vais": 98963, - "vak": 53621, - "val": 831, - "vale": 77729, - "valid": 1891, - "validate": 7067, - "validated": 59590, - "validation": 12284, - "validator": 16112, - "validators": 59424, - "valor": 24782, - "vals": 25596, - "valu": 25510, - "valuate": 19642, - "valuation": 23819, - "valuator": 52389, - "value": 957, - "valueOf": 93013, - "values": 3661, - "van": 15649, - "vana": 67459, - "vanced": 88087, - "vang": 27761, - "vangst": 32943, - "vanished": 87757, - "vanized": 67124, - "vant": 76182, - "var": 947, - "vara": 95950, - "varchar": 32922, - "vard": 21601, - "vari": 29165, - "variable": 9813, - "variables": 18616, - "variably": 69991, - "variant": 15969, - "variants": 54611, - "variation": 75785, - "vars": 15380, - "vary": 82976, - "vas": 4281, - "vascular": 32845, - "vasion": 57993, - "vasive": 77034, - "vat": 49713, - "vation": 60328, - "vature": 56705, - "vault": 82983, - "vb": 42405, - "vc": 7362, - "vd": 16598, - "ve": 586, - "veal": 40611, - "veau": 33467, - "vec": 4083, - "vecs": 94654, - "vect": 75008, - "vection": 79198, - "vector": 3215, - "ved": 2066, - "veedor": 51699, - "veget": 82471, - "veh": 15200, - "vehicle": 19764, - "vehicles": 57115, - "veillance": 60300, - "veis": 43699, - "vel": 889, - "veled": 93964, - "vell": 72212, - "velle": 88481, - "velocity": 14640, - "velop": 1813, - "velope": 18853, - "veloper": 78806, - "velopment": 75831, - "velt": 42421, - "velte": 97679, - "vely": 16239, - "vement": 7830, - "vements": 12477, - "ven": 1037, - "vendor": 19213, - "vendors": 63258, - "venes": 90801, - "venge": 52205, - "venida": 87195, - "venience": 39547, - "venient": 47139, - "venile": 39104, - "venir": 42306, - "vens": 21097, - "vent": 684, - "venta": 52919, - "ventario": 76346, - "ventas": 97101, - "vented": 73128, - "venth": 44607, - "venting": 81820, - "vention": 7459, - "ventional": 43222, - "ventions": 30659, - "ventory": 7223, - "vents": 47664, - "venture": 44943, - "ventus": 66460, - "venue": 7140, - "venues": 45369, - "ver": 423, - "verage": 4355, - "verages": 42868, - "veral": 17539, - "verb": 22328, - "verbatim": 84005, - "verbose": 14883, - "verbosity": 65210, - "verbs": 54939, - "vere": 19289, - "vergence": 80748, - "verification": 50632, - "verified": 21037, - "verify": 12446, - "verige": 74195, - "verity": 26472, - "vern": 75752, - "vero": 88810, - "vers": 3004, - "versation": 22323, - "versations": 72995, - "verse": 4450, - "versed": 43776, - "versible": 64298, - "version": 4366, - "versions": 28290, - "verständ": 142674, - "verständlich": 142675, - "vert": 1621, - "verte": 64832, - "verted": 21630, - "verter": 8721, - "vertex": 12085, - "vertical": 15292, - "vertices": 13030, - "vertime": 80238, - "verting": 49417, - "vertis": 10218, - "vertise": 67787, - "vertisement": 44424, - "vertiser": 84815, - "vertising": 29924, - "verts": 28163, - "verture": 64830, - "verty": 16684, - "very": 1204, - "ves": 2342, - "vest": 7019, - "vester": 82738, - "vestment": 93439, - "vet": 17115, - "vetica": 31212, - "vette": 57230, - "vey": 5617, - "veyor": 68869, - "veys": 49269, - "vez": 19069, - "vf": 45241, - "vfs": 82586, - "vg": 7239, - "vh": 29919, - "vi": 9971, - "via": 20105, - "viar": 68330, - "vic": 44675, - "vice": 1768, - "victim": 90939, - "vid": 1301, - "vida": 75500, - "vide": 19448, - "vided": 42957, - "vidence": 27480, - "video": 9986, - "videos": 34023, - "vider": 3734, - "viders": 17761, - "vides": 67154, - "vidia": 40098, - "vido": 76543, - "vie": 63419, - "vier": 46716, - "view": 1050, - "viewController": 95412, - "viewModel": 73610, - "viewer": 47622, - "viewport": 18272, - "views": 5072, - "vig": 91247, - "vik": 43081, - "vil": 45252, - "villa": 63338, - "ville": 7919, - "vim": 41194, - "vin": 9603, - "vinc": 34133, - "vince": 14748, - "vinces": 78565, - "vincia": 57164, - "vincial": 64327, - "vine": 61201, - "vinfos": 80661, - "ving": 4405, - "vio": 72722, - "viol": 55151, - "violent": 89062, - "vious": 2469, - "viously": 18281, - "vip": 64197, - "vir": 45857, - "viron": 2772, - "vironment": 3105, - "vironments": 17866, - "virt": 47381, - "virtual": 25668, - "vis": 2682, - "visa": 93533, - "vised": 25379, - "visibility": 28176, - "visible": 12601, - "vision": 13013, - "visions": 40015, - "visit": 27460, - "visited": 28868, - "visitor": 39985, - "visión": 133337, - "viso": 72449, - "visor": 38012, - "visual": 29218, - "visualization": 88981, - "visão": 132321, - "vit": 54811, - "viz": 69840, - "vj": 72773, - "vk": 48363, - "vl": 14536, - "vla": 79563, - "vlan": 89622, - "vlc": 98404, - "vm": 7338, - "vn": 28138, - "vo": 3334, - "vocab": 86847, - "vod": 91010, - "voice": 9862, - "voices": 40683, - "void": 1004, - "voie": 87035, - "voir": 34473, - "voke": 7621, - "vol": 12536, - "volatile": 27307, - "volent": 71037, - "volt": 96271, - "volución": 140012, - "volume": 25060, - "volution": 64172, - "volução": 143170, - "von": 58170, - "voor": 86368, - "vor": 36115, - "vore": 90502, - "vos": 47619, - "vote": 29358, - "votes": 37835, - "voucher": 79013, - "vous": 57445, - "vox": 61397, - "voy": 79797, - "vp": 15260, - "vpn": 59589, - "vr": 18920, - "vre": 48506, - "vrier": 90037, - "vrir": 62246, - "vro": 36662, - "vrolet": 37320, - "vron": 29479, - "vs": 11562, - "vsp": 33850, - "vt": 9708, - "vtColor": 48955, - "vtk": 60087, - "vu": 45690, - "vue": 21499, - "vv": 33075, - "vvm": 66682, - "vw": 34431, - "vx": 47280, - "vy": 13714, - "vä": 72050, - "vé": 51174, - "vê": 131514, - "vÃŃ": 129587, - "w": 86, - "wa": 9991, - "wagon": 93119, - "wahl": 71965, - "wait": 11489, - "waitFor": 86205, - "waiting": 49534, - "wake": 89919, - "wal": 26397, - "wald": 52906, - "walk": 19059, - "walker": 44252, - "walking": 80649, - "wall": 16431, - "wallet": 35735, - "walls": 86296, - "wan": 16556, - "wand": 79810, - "wang": 70552, - "want": 52657, - "wanted": 86592, - "wap": 21726, - "war": 11455, - "ward": 1606, - "wards": 4014, - "ware": 1664, - "warehouse": 45546, - "wares": 37903, - "warf": 32634, - "wargs": 6674, - "warm": 82597, - "warn": 33481, - "warning": 18928, - "warnings": 60447, - "wart": 35608, - "warts": 63056, - "warz": 44704, - "was": 16123, - "wash": 69445, - "washer": 47297, - "washing": 97091, - "wat": 58047, - "watch": 14321, - "water": 12987, - "waters": 98659, - "waukee": 32479, - "wav": 52046, - "wave": 30398, - "waves": 57265, - "way": 3117, - "wayne": 89562, - "ways": 2284, - "waÄĩ": 127216, - "waż": 126149, - "ważnie": 142049, - "waÅĤ": 126575, - "wb": 20211, - "wc": 24028, - "wchar": 81604, - "wcs": 34943, - "wcsstore": 39170, - "wd": 6377, - "wdx": 87944, - "we": 896, - "weak": 13150, - "weakSelf": 57832, - "wealth": 30533, - "weapon": 22873, - "weapons": 84765, - "wear": 22744, - "weather": 15206, - "weathermap": 90862, - "web": 2911, - "webElement": 23874, - "webElementProperties": 32686, - "webElementX": 45972, - "webElementXpaths": 45973, - "webView": 70687, - "webdriver": 95477, - "webkit": 25400, - "webpack": 11380, - "webs": 88895, - "website": 19485, - "websocket": 83208, - "webtoken": 64836, - "wechat": 78495, - "wed": 67367, - "weed": 85327, - "week": 10264, - "weekday": 77989, - "weekly": 71767, - "weeks": 80989, - "ween": 1780, - "weeney": 90269, - "weep": 48542, - "weet": 4488, - "weetalert": 66178, - "weeted": 59608, - "weets": 25415, - "weg": 28129, - "wegian": 36565, - "wei": 27105, - "weigh": 56640, - "weight": 4765, - "weighted": 79796, - "weights": 13327, - "weis": 73869, - "weise": 41210, - "weit": 73411, - "wel": 89463, - "welcome": 34084, - "well": 9157, - "wen": 16948, - "wend": 40231, - "wendung": 66671, - "went": 41600, - "wer": 6566, - "were": 51798, - "werk": 58864, - "werp": 94319, - "wers": 23660, - "wert": 54594, - "west": 11039, - "western": 30282, - "wf": 43083, - "wg": 45540, - "wget": 57357, - "wh": 1312, - "what": 12555, - "whatever": 68286, - "wheel": 38590, - "whel": 15631, - "whelming": 93079, - "when": 9309, - "where": 2870, - "whereIn": 85493, - "whether": 48764, - "which": 8206, - "while": 3472, - "white": 5782, - "who": 14623, - "whole": 66633, - "whose": 85143, - "why": 34634, - "wi": 16632, - "wich": 16889, - "wick": 21188, - "wicklung": 69936, - "wid": 43615, - "wide": 9150, - "widget": 9797, - "widgets": 29819, - "width": 3098, - "wie": 45702, - "wife": 47741, - "wifi": 67281, - "wig": 36922, - "wij": 86083, - "wik": 48437, - "wiki": 29707, - "wil": 64636, - "wild": 67874, - "will": 14387, - "willReturn": 44853, - "win": 7526, - "wind": 19154, - "window": 5507, - "windows": 27077, - "wine": 71437, - "wing": 23593, - "wingConstants": 65657, - "winner": 52145, - "wins": 86052, - "winter": 82928, - "wipe": 70109, - "wire": 35531, - "wis": 48043, - "wise": 4482, - "wish": 81099, - "wishlist": 85789, - "wit": 88519, - "witch": 5539, - "with": 4197, - "withErrors": 98211, - "withdraw": 62446, - "within": 55850, - "without": 28996, - "withstanding": 48944, - "witter": 3801, - "wives": 58388, - "wizard": 58593, - "wiÄħ": 59870, - "wiÄħz": 76169, - "wiÄħzan": 132205, - "wiÄĻ": 63998, - "wiÄĻks": 126565, - "wiÄĻksz": 129373, - "wiÄĻt": 127968, - "wiÅĽcie": 128029, - "wj": 66954, - "wjgl": 83680, - "wk": 50522, - "wl": 26417, - "wm": 19557, - "wn": 1522, - "wnd": 23152, - "wner": 4721, - "wo": 1126, - "woff": 68585, - "woke": 95328, - "wolf": 76230, - "woman": 22028, - "women": 64662, - "won": 54667, - "woo": 48774, - "woocommerce": 26470, - "wood": 6660, - "woods": 81029, - "woord": 72506, - "wor": 49710, - "word": 1158, - "wordpress": 58215, - "words": 5761, - "work": 1778, - "worked": 70114, - "worker": 21462, - "workers": 54958, - "workflow": 56249, - "working": 21152, - "works": 18525, - "worksheet": 78937, - "workspace": 42909, - "world": 14615, - "worm": 55641, - "wort": 31151, - "worth": 19501, - "worthy": 42529, - "would": 40350, - "wow": 57454, - "wp": 8421, - "wpdb": 26780, - "wr": 18718, - "wrap": 10097, - "wrapped": 75704, - "wrapper": 21364, - "wright": 52752, - "write": 4934, - "writeln": 93456, - "writer": 18189, - "writers": 61612, - "writes": 59079, - "writing": 25304, - "written": 25569, - "wrong": 34870, - "wró": 127772, - "wróci": 142215, - "wróciÄĩ": 142216, - "ws": 8915, - "wstring": 43890, - "wt": 9306, - "wu": 65465, - "ww": 1250, - "www": 2136, - "wx": 20984, - "wy": 22545, - "wyn": 53656, - "wyż": 126991, - "wä": 129059, - "wód": 127687, - "wództ": 143484, - "wództw": 143485, - "wój": 132444, - "wüns": 141805, - "wünsche": 141806, - "wÄĻ": 130511, - "wÅĤ": 132258, - "wÅĤa": 135251, - "wÅĤasn": 132259, - "wÅĤaÅĽci": 135252, - "wÅĤaÅĽciw": 135253, - "x": 87, - "xA": 14673, - "xAA": 60051, - "xAB": 78146, - "xAC": 79429, - "xAD": 79447, - "xAE": 89728, - "xAF": 83721, - "xB": 14377, - "xBA": 88483, - "xBB": 80197, - "xBC": 80979, - "xBD": 81803, - "xBE": 85449, - "xBF": 71181, - "xC": 12125, - "xCA": 86443, - "xCB": 87480, - "xCC": 72255, - "xCD": 82661, - "xCE": 81695, - "xCF": 77996, - "xD": 15764, - "xDA": 92570, - "xDB": 82344, - "xDC": 83989, - "xDD": 82331, - "xDE": 78979, - "xDF": 73334, - "xE": 12606, - "xEA": 89751, - "xEB": 85211, - "xEC": 86599, - "xED": 83223, - "xEE": 77124, - "xEF": 65769, - "xF": 9770, - "xFA": 72068, - "xFB": 69624, - "xFC": 53473, - "xFD": 63012, - "xFE": 41381, - "xFF": 9264, - "xFFF": 69420, - "xFFFF": 14384, - "xFFFFFF": 72402, - "xFFFFFFFF": 22620, - "xa": 9591, - "xaa": 43300, - "xab": 52616, - "xac": 52642, - "xad": 55254, - "xae": 57052, - "xaf": 54795, - "xampp": 51792, - "xb": 7929, - "xba": 55368, - "xbb": 48939, - "xbc": 43416, - "xbd": 33564, - "xbe": 42459, - "xbf": 47659, - "xc": 8148, - "xca": 56071, - "xcb": 49391, - "xcc": 47380, - "xcd": 53864, - "xce": 55963, - "xcf": 55649, - "xd": 9703, - "xda": 56524, - "xdb": 54555, - "xdc": 48361, - "xdd": 53432, - "xde": 56185, - "xdf": 53833, - "xe": 8371, - "xea": 56570, - "xeb": 54468, - "xec": 52350, - "xed": 51319, - "xee": 50138, - "xef": 47510, - "xes": 89674, - "xf": 5848, - "xfa": 48890, - "xfb": 46071, - "xfc": 40428, - "xfd": 41483, - "xfe": 31469, - "xff": 9020, - "xfff": 87812, - "xffff": 20518, - "xffffff": 68247, - "xffffffff": 41798, - "xford": 22566, - "xhr": 58983, - "xi": 11665, - "xia": 67194, - "xic": 14331, - "xico": 53693, - "xies": 80934, - "xiety": 16308, - "xima": 56492, - "ximity": 91728, - "ximo": 38884, - "xin": 58766, - "xing": 89551, - "xious": 29251, - "xis": 7191, - "xit": 20241, - "xito": 74389, - "xiv": 88733, - "xl": 24310, - "xlabel": 49715, - "xlim": 97414, - "xls": 59520, - "xlsx": 65245, - "xm": 55771, - "xmax": 94032, - "xmin": 86949, - "xml": 6455, - "xmlns": 74155, - "xmm": 75088, - "xn": 42967, - "xo": 40822, - "xon": 61485, - "xoops": 83828, - "xor": 71311, - "xp": 35725, - "xpath": 50151, - "xr": 50997, - "xs": 18561, - "xsd": 82370, - "xt": 2252, - "xx": 4146, - "xxx": 24048, - "xxxx": 18516, - "xxxxxxxx": 44102, - "xy": 4130, - "xygen": 18936, - "xyz": 28854, - "xz": 92955, - "y": 88, - "ya": 7755, - "yah": 94680, - "yahoo": 45792, - "yal": 16453, - "yalty": 24771, - "yaml": 41466, - "yan": 8339, - "yang": 40245, - "yar": 52757, - "yard": 17428, - "yards": 56428, - "yas": 81453, - "yat": 98615, - "yaw": 98586, - "yb": 84307, - "ybrid": 93390, - "yc": 3337, - "ycastle": 93476, - "ych": 5641, - "ycin": 64056, - "ycl": 6179, - "ycle": 5449, - "ycled": 36576, - "ycler": 10760, - "yclerView": 11897, - "yclerview": 33174, - "ycles": 15805, - "yclic": 65304, - "ycling": 16021, - "yclopedia": 45126, - "ycop": 66766, - "ycopg": 71725, - "ycz": 38134, - "yd": 40121, - "ydro": 67007, - "ydı": 132794, - "ye": 9011, - "yeah": 75415, - "year": 3157, - "years": 41720, - "yect": 23516, - "yecto": 29746, - "yectos": 62148, - "yellow": 27869, - "yen": 76151, - "yer": 26161, - "yers": 48472, - "yes": 9693, - "yet": 46392, - "yg": 48765, - "yh": 73801, - "yi": 38072, - "yield": 29696, - "yii": 37164, - "ying": 7024, - "yk": 72540, - "yl": 3923, - "yla": 60722, - "ylabel": 49761, - "ylan": 36478, - "ylation": 78833, - "yle": 967, - "yled": 7601, - "yleft": 62648, - "ylene": 63551, - "yles": 2491, - "ylie": 66477, - "ylim": 47798, - "ylinder": 22868, - "yling": 98607, - "ylko": 49576, - "yll": 24705, - "ylland": 51606, - "ylon": 26004, - "ylum": 27333, - "ylv": 14753, - "ylvania": 17952, - "ym": 1600, - "ymax": 56288, - "ymb": 3356, - "ymbol": 4001, - "ymbols": 11786, - "ymce": 68979, - "yme": 30118, - "ymes": 78709, - "ymi": 76975, - "ymm": 64320, - "ymmetric": 29459, - "ymology": 98074, - "ymoon": 68860, - "ymous": 89392, - "ymph": 31700, - "yms": 75025, - "yn": 1872, - "yna": 52344, - "ynam": 11440, - "ynamic": 5040, - "ynamics": 50148, - "ynamo": 85608, - "ynamodb": 83348, - "ync": 1721, - "ynch": 68481, - "ynchron": 14113, - "ynchronization": 67929, - "ynchronize": 52787, - "ynchronized": 42164, - "ynchronous": 27834, - "ynchronously": 54194, - "yne": 81708, - "ynec": 73930, - "ynes": 83167, - "ynet": 97988, - "ynn": 58260, - "ynom": 61120, - "ynomial": 25358, - "ynomials": 76961, - "ynos": 80393, - "yntax": 13662, - "yntaxException": 76493, - "ynth": 45809, - "ynthesis": 73667, - "ynthia": 63539, - "yny": 56404, - "ynı": 126542, - "yo": 16032, - "yon": 24990, - "yor": 47220, - "you": 9330, - "young": 81179, - "your": 21732, - "youtu": 54860, - "youtube": 43978, - "yp": 1082, - "ypad": 54295, - "ypass": 49911, - "ype": 499, - "yped": 32501, - "yper": 39252, - "ypes": 1804, - "ypi": 80977, - "ypical": 88115, - "ypo": 59300, - "ypress": 47601, - "yps": 75199, - "ypse": 47478, - "ypsum": 67626, - "ypsy": 88267, - "ypy": 54234, - "yr": 10920, - "yre": 71440, - "yro": 66810, - "yrı": 126005, - "yrıca": 127368, - "ys": 1047, - "yscale": 82909, - "yses": 72179, - "ysi": 74284, - "ysical": 18969, - "ysics": 17243, - "ysis": 4448, - "ysize": 69359, - "ysql": 14869, - "ysqli": 34150, - "yssey": 53247, - "yst": 597, - "ystack": 93176, - "ystal": 13946, - "ystals": 91375, - "ystate": 42904, - "ystatechange": 59573, - "ystem": 612, - "ystems": 94790, - "yster": 21848, - "ysterious": 96399, - "ysters": 99063, - "ystery": 95257, - "ystick": 30413, - "ystone": 41266, - "ystore": 63373, - "ysts": 98235, - "ysz": 72345, - "yt": 16415, - "yte": 78361, - "yth": 76896, - "ythe": 95860, - "ython": 26895, - "ytic": 69404, - "ytt": 90138, - "ytut": 88486, - "yu": 40001, - "yum": 89652, - "yun": 42420, - "yw": 84414, - "ywaÄĩ": 135776, - "yx": 51826, - "yy": 4807, - "yyval": 52646, - "yyvsp": 38631, - "yyy": 39319, - "yyyy": 14767, - "yyyyMMdd": 78231, - "yz": 18348, - "yü": 127279, - "yük": 88555, - "yı": 128624, - "yız": 135471, - "yÄĩ": 129460, - "yá»ĩn": 132949, - "z": 89, - "zM": 65215, - "za": 4360, - "zac": 95626, - "zag": 92674, - "zahl": 46728, - "zan": 49126, - "zano": 98998, - "zap": 92371, - "zar": 55900, - "zas": 50355, - "zb": 25329, - "zbek": 75013, - "zbollah": 58504, - "zburg": 78202, - "zc": 34968, - "zcze": 74589, - "zd": 48655, - "ze": 2986, - "zech": 25751, - "zed": 15905, - "zee": 97966, - "zego": 89188, - "zeich": 50591, - "zeichnet": 85740, - "zeigen": 44919, - "zeigt": 96695, - "zeit": 29413, - "zeitig": 97973, - "zej": 45794, - "zek": 63023, - "zel": 27393, - "zelf": 86612, - "zell": 97229, - "zellik": 125961, - "zem": 94133, - "zen": 5679, - "zend": 85348, - "zenia": 35088, - "zenie": 38418, - "zens": 18549, - "zent": 37137, - "zept": 54749, - "zer": 7070, - "zerbai": 56760, - "zero": 14154, - "zeros": 35716, - "zers": 59619, - "zes": 31793, - "zet": 60728, - "zeug": 37400, - "zew": 95204, - "zeÅĦ": 64887, - "zeÅĽ": 127578, - "zf": 69394, - "zh": 23815, - "zheimer": 41260, - "zhou": 51765, - "zi": 8345, - "zia": 67051, - "zial": 59380, - "ziaÅĤ": 69117, - "zie": 13536, - "ziehung": 74991, - "ziej": 77412, - "ziel": 64177, - "zier": 37968, - "zig": 35363, - "zik": 75474, - "zilla": 19330, - "zimmer": 64474, - "zin": 57097, - "zing": 20371, - "zion": 89975, - "zione": 29667, - "zioni": 69182, - "zip": 9964, - "zipcode": 59629, - "zk": 40696, - "zl": 67957, - "zm": 31489, - "zman": 80916, - "zn": 20308, - "zo": 12738, - "zoek": 81613, - "zon": 51619, - "zone": 8684, - "zones": 67534, - "zoom": 28716, - "zos": 53701, - "zp": 93769, - "zs": 40950, - "zsche": 84728, - "zt": 11687, - "zte": 89282, - "zu": 25655, - "zug": 72101, - "zung": 38132, - "zure": 50203, - "zw": 30781, - "zx": 66700, - "zy": 4246, - "zych": 57531, - "zym": 20773, - "zyst": 53981, - "zyÄĩ": 69600, - "zz": 10400, - "zza": 46814, - "zzarella": 95882, - "zzle": 48961, - "zzo": 45648, - "zá": 88543, - "zähl": 134128, - "zÄħ": 27282, - "zÄħd": 76681, - "zÄĻ": 59605, - "zÅĤ": 131511, - "zÅij": 85727, - "{": 90, - "{!!": 54466, - "{\"": 4913, - "{$": 7003, - "{%": 66365, - "{'": 13608, - "{(": 96065, - "{*": 97806, - "{-": 19999, - "{-#": 34376, - "{/": 67678, - "{/*": 94087, - "{//": 55897, - "{:": 44986, - "{@": 59221, - "{EIF": 30727, - "{Name": 63121, - "{T": 76025, - "{\\": 35702, - "{\\\"": 64238, - "{_": 87657, - "{i": 24204, - "{id": 61761, - "{j": 71043, - "{k": 69094, - "{l": 94617, - "{lng": 88754, - "{n": 91362, - "{name": 47006, - "{o": 32531, - "{return": 54678, - "{s": 84386, - "{text": 83021, - "{x": 45340, - "{{": 2979, - "{{$": 29283, - "{{--": 38998, - "{{{": 90691, - "{|": 46115, - "{}": 6257, - "{}\",": 42351, - "{}\".": 42025, - "{}'.": 38238, - "{})": 28875, - "{})Ċ": 37790, - "{},": 22655, - "{},Ċ": 38837, - "{}.": 46391, - "{};Ċ": 45982, - "{}\\": 87963, - "{}]": 78134, - "{}_": 65797, - "{}{Ċ": 67066, - "{}Ċ": 16094, - "{}ĊĊ": 31483, - "{Ċ": 515, - "{ĊĊ": 4257, - "{ĊĊĊ": 53632, - "{čĊ": 1666, - "{čĊčĊ": 25289, - "|": 91, - "|\"": 47576, - "|#": 79450, - "|$": 80050, - "|%": 80166, - "|(": 60016, - "|()Ċ": 66627, - "|(Ċ": 37663, - "|)Ċ": 37275, - "|,Ċ": 50188, - "|-": 50854, - "|--": 80495, - "|--------------------------------------------------------------------------Ċ": 42080, - "|.": 84626, - "|.Ċ": 26280, - "|;Ċ": 34026, - "|=": 87803, - "|=Ċ": 70634, - "|M": 86878, - "|R": 86698, - "|RF": 98578, - "|[": 74723, - "|\\": 22957, - "|^": 96750, - "|`Ċ": 61081, - "|array": 80862, - "|h": 91584, - "|i": 96136, - "|int": 92004, - "|m": 90563, - "|max": 43755, - "|min": 59583, - "|null": 22643, - "|r": 62640, - "|required": 68588, - "|string": 36050, - "|unique": 92983, - "|wx": 83378, - "|x": 62827, - "|{Ċ": 70285, - "||": 8484, - "||(": 82432, - "||||": 76934, - "||Ċ": 90675, - "|}Ċ": 70269, - "|Ċ": 7360, - "|ĊĊ": 43738, - "|čĊ": 84539, - "}": 92, - "}\"": 9863, - "}\")": 55961, - "}\");Ċ": 20305, - "}\");ĊĊ": 64139, - "}\");čĊ": 95140, - "}\")]Ċ": 44665, - "}\")Ċ": 14451, - "}\")ĊĊ": 55266, - "}\")čĊ": 81608, - "}\",": 9545, - "}\",Ċ": 24375, - "}\".": 21901, - "}\";Ċ": 26259, - "}\";ĊĊ": 71612, - "}\">Ċ": 94976, - "}\"Ċ": 11195, - "}\"ĊĊ": 42273, - "}$": 31716, - "}$/": 69153, - "}${": 31192, - "}%": 43715, - "}&": 24778, - "}'": 11661, - "}'\",": 93708, - "}')": 67183, - "}');Ċ": 86321, - "}')Ċ": 32868, - "}')ĊĊ": 74384, - "}',": 16843, - "}','": 49483, - "}',Ċ": 36502, - "}'.": 23495, - "}';Ċ": 83485, - "}'Ċ": 43341, - "}(": 25547, - "}());Ċ": 84693, - "}()Ċ": 69826, - "}()ĊĊ": 66816, - "})": 5410, - "})\",": 78608, - "})\"Ċ": 92349, - "})(": 31888, - "})();": 81174, - "})();Ċ": 52411, - "})();ĊĊ": 94345, - "}))": 65305, - "}));Ċ": 33626, - "}));ĊĊ": 44316, - "}))Ċ": 44194, - "}))ĊĊ": 93596, - "}),": 38842, - "}),Ċ": 30793, - "}).": 16630, - "}):": 90688, - "});": 14088, - "});Ċ": 2960, - "});ĊĊ": 4546, - "});ĊĊĊ": 28348, - "});ĊĊĊĊ": 78137, - "});čĊ": 16240, - "});čĊčĊ": 34083, - "})}Ċ": 92753, - "})Ċ": 3518, - "})ĊĊ": 8824, - "})ĊĊĊ": 43060, - "})čĊ": 35099, - "})čĊčĊ": 70641, - "}*": 92814, - "}*/Ċ": 45434, - "}*/ĊĊ": 67977, - "},": 2137, - "},\"": 51193, - "},${": 91448, - "},'": 76042, - "},{": 16561, - "},{\"": 36828, - "},{Ċ": 65763, - "},Ċ": 1583, - "},ĊĊ": 15766, - "},čĊ": 11557, - "},čĊčĊ": 82979, - "}-": 19732, - "}-${": 54982, - "}->": 57415, - "}->{": 63118, - "}-{": 72013, - "}.": 7810, - "}.${": 77197, - "}.{": 65884, - "}.Ċ": 27275, - "}/": 4472, - "}/#{": 95016, - "}/${": 22805, - "}//": 29450, - "}/>": 87556, - "}/>Ċ": 18769, - "}/{": 22472, - "}:": 16097, - "}:${": 56074, - "}:{": 58146, - "};": 11061, - "};Ċ": 2440, - "};ĊĊ": 2315, - "};ĊĊĊ": 14711, - "};ĊĊĊĊ": 56831, - "};čĊ": 15414, - "};čĊčĊ": 16863, - "};čĊčĊčĊ": 73534, - "}<": 70793, - "}": 13507, - "}><": 71020, - "}>{": 23503, - "}>Ċ": 4877, - "}>čĊ": 59049, - "}?": 52402, - "}@": 80728, - "}[": 43389, - "}\\": 11035, - "}\\\"": 46869, - "}\\.[": 87995, - "}\\\\": 85539, - "}]": 25439, - "}],": 72441, - "}],Ċ": 64054, - "}];Ċ": 75053, - "}]Ċ": 57320, - "}_": 19444, - "}_${": 67661, - "}_{": 51535, - "}`": 5541, - "}`).": 59979, - "}`);Ċ": 18811, - "}`);ĊĊ": 71496, - "}`)Ċ": 27085, - "}`,": 28350, - "}`,Ċ": 27249, - "}`;Ċ": 24840, - "}`;ĊĊ": 72764, - "}`}": 53944, - "}`}>Ċ": 56291, - "}`}Ċ": 44099, - "}`Ċ": 31257, - "}catch": 35262, - "}else": 7825, - "}elseif": 64123, - "}px": 47250, - "}s": 60618, - "}while": 84298, - "}{": 15170, - "}{$": 58373, - "}{Ċ": 59403, - "}|": 52398, - "}}": 3417, - "}}\"": 23386, - "}}\">{{$": 90411, - "}}\">Ċ": 42179, - "}}\"Ċ": 95063, - "}});Ċ": 71230, - "}})Ċ": 71362, - "}},": 38154, - "}},Ċ": 22050, - "}};Ċ": 52481, - "}}": 83697, - "}}>Ċ": 42109, - "}}],Ċ": 83280, - "}}{{": 77286, - "}}}": 75542, - "}}},Ċ": 74869, - "}}Ċ": 11248, - "}}ĊĊ": 47449, - "}Ċ": 532, - "}ĊĊ": 630, - "}ĊĊĊ": 3733, - "}ĊĊĊĊ": 13246, - "}ĊĊĊĊĊ": 33862, - "}ĊĊĊĊĊĊ": 57351, - "}čĊ": 1771, - "}čĊčĊ": 2570, - "}čĊčĊčĊ": 17255, - "}čĊčĊčĊčĊ": 49217, - "}ččĊ": 75531, - "~": 93, - "~\":\"": 73470, - "~,": 54497, - "~-": 49994, - "~-~-": 56746, - "~-~-~-~-": 90007, - "~/": 22714, - "~=": 50633, - "~~": 5817, - "~~~~": 10313, - "~~~~~~~~": 17886, - "~~~~~~~~~~~~~~~~": 32543, - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~": 65648, - "~Ċ": 88141, - "~ĊĊ": 58629, - "¡": 94, - "¡°": 48800, - "¡´": 90557, - "¢": 95, - "¢åįķ": 43720, - "£": 96, - "£¼": 35146, - "¤": 97, - "¤æĸŃ": 79326, - "¤í": 44680, - "¥": 98, - "¥¿": 58098, - "¦": 99, - "¦¬": 56823, - "¦Ĥ": 24447, - "§": 100, - "§è¡Į": 58522, - "¨": 101, - "¨¡": 44401, - "©": 102, - "©½": 101867, - "©ëĭĪëĭ¤": 48458, - "ª": 103, - "ªĮ": 36677, - "«": 104, - "«ìŀIJ": 92187, - "«ĺ": 40419, - "¬": 105, - "¬´": 90734, - "¬¸": 33543, - "¬ģ": 70731, - "®": 106, - "¯": 107, - "°": 108, - "±": 109, - "±Ð¾ÑĤ": 35720, - "±ħ": 127964, - "²": 110, - "³": 111, - "³»": 36097, - "´": 112, - "´Ģ": 70297, - "´Ī": 63046, - "µ": 113, - "µ¬": 44706, - "µľ": 71481, - "¶": 114, - "¶Ī": 27757, - "¶ļ": 89083, - "·": 115, - "·¨": 71933, - "·¸": 32926, - "·»": 34811, - "·»åĬł": 35125, - "·æĸ°": 91050, - "¸": 116, - "¹": 117, - "¹Ħ": 46282, - "º": 118, - "º«": 83643, - "»": 119, - "»¿": 3219, - "¼": 120, - "½": 121, - "½æķ°": 29941, - "½Ķ": 65291, - "½Ķëĵľ": 77047, - "¾": 122, - "¾ç¤º": 46871, - "¿": 123, - "À": 124, - "Á": 125, - "Â": 126, - "¡": 39832, - "¢": 56394, - "£": 21651, - "£o": 84291, - "¤": 81538, - "Â¥": 81093, - "¦": 64621, - "§": 17851, - "§Ãĥ": 96784, - "¨": 75005, - "©": 20043, - "ª": 63905, - "«": 23703, - "¬": 82093, - "®": 11909, - "®,": 66357, - "¯": 33985, - "¯¯": 38195, - "¯¯¯¯": 61707, - "°": 11616, - "°C": 30937, - "°F": 58472, - "±": 37021, - "²": 29456, - "³": 43201, - "´": 28111, - "´s": 55376, - "´t": 96865, - "µ": 73048, - "¶": 54509, - "·": 13935, - "··": 60076, - "¸": 144404, - "¹": 59497, - "º": 28200, - "»": 12992, - "»,": 60212, - "».": 74508, - "»ĊĊ": 60543, - "¼": 41873, - "½": 26062, - "¾": 67396, - "¿": 30182, - "ÂĢ": 41416, - "ÂĢÂ": 42476, - "ÂĢÂĻ": 74709, - "ÂĴ": 75151, - "Âł": 4102, - "³³": 9238, - "³³³": 45393, - "³³³³": 19070, - "³³³³³³³": 86210, - "³³³³³³³³": 45449, - "ÂłĊ": 50950, - "ÂŃ": 5760, - "ÂŃi": 96182, - "ÂŃing": 45331, - "ÂŃs": 71780, - "ÂŃt": 49043, - "ÂŃtion": 68605, - "Ã": 127, - "á": 1953, - "áb": 58560, - "ábado": 80408, - "ább": 80699, - "ác": 29341, - "ách": 53061, - "ácil": 55604, - "áf": 63401, - "áfico": 94183, - "ág": 27693, - "ágenes": 86008, - "ágina": 39190, - "ái": 124900, - "ák": 71442, - "ál": 19003, - "ález": 96365, - "álido": 58066, - "áln": 90165, - "ált": 97620, - "ám": 35234, - "ámara": 84001, - "án": 11390, - "ánchez": 98534, - "ánd": 47580, - "ández": 77046, - "ándose": 139230, - "áng": 124397, - "ánh": 124415, - "ánt": 85433, - "ány": 75353, - "ánÃŃ": 86762, - "áo": 77689, - "áp": 125478, - "ár": 41254, - "ária": 57942, - "ário": 19774, - "ários": 37085, - "ás": 7061, - "ása": 93099, - "ást": 55403, - "át": 16685, - "ática": 48502, - "áticas": 91255, - "ático": 66549, - "átis": 71606, - "áveis": 83012, - "ável": 43315, - "áz": 59821, - "â": 8835, - "âce": 64996, - "âm": 86728, - "ân": 39392, - "ância": 65596, - "ând": 78066, - "ât": 63172, - "âte": 68528, - "âu": 124692, - "ây": 124317, - "âÌ": 138673, - "ậ": 138674, - "âÌģ": 134932, - "ã": 3202, - "ãeste": 84651, - "ãi": 126175, - "ãn": 128211, - "ãng": 135076, - "ão": 3413, - "ä": 2305, - "äch": 31573, - "äche": 94650, - "ächst": 92975, - "ächt": 135573, - "äd": 30875, - "ädchen": 41014, - "äft": 56539, - "äge": 70668, - "äh": 21519, - "ähl": 90785, - "ählen": 85242, - "ählt": 83049, - "ähr": 36956, - "äl": 29802, - "äll": 32251, - "älle": 128209, - "ällt": 78120, - "ält": 41203, - "äm": 66897, - "ämp": 141943, - "ämpfe": 141944, - "än": 15141, - "änd": 21545, - "ände": 90360, - "änder": 57396, - "ändig": 130337, - "äng": 25423, - "änge": 76141, - "änger": 61673, - "änn": 62968, - "änner": 42524, - "är": 13977, - "äre": 46686, - "ären": 96049, - "äs": 54840, - "äsent": 90930, - "ät": 14033, - "äter": 70551, - "ätig": 137186, - "ätt": 49191, - "ätz": 59638, - "ätze": 89493, - "ätzlich": 86759, - "äu": 129076, - "ää": 42443, - "ään": 59346, - "Ã¤ÃŁ": 68947, - "Ã¤ÃŁig": 128123, - "Ã¥": 3785, - "Ã¥de": 66336, - "Ã¥l": 86504, - "Ã¥n": 38731, - "Ã¥r": 17900, - "æ": 9191, - "æk": 47096, - "ække": 76123, - "ælland": 86133, - "ænd": 59577, - "ær": 33471, - "ære": 91016, - "ç": 3131, - "ça": 17472, - "ças": 45278, - "çe": 124806, - "çek": 124726, - "çi": 126325, - "çiler": 139750, - "ço": 20210, - "çois": 67353, - "çon": 52410, - "ços": 47919, - "çu": 78784, - "çãeste": 139684, - "ção": 5903, - "ções": 15249, - "çı": 126435, - "è": 4458, - "ège": 72799, - "èle": 50353, - "èles": 84698, - "ème": 24267, - "èmes": 65374, - "ène": 46999, - "ère": 12068, - "èrent": 140142, - "ères": 30439, - "ès": 12142, - "ète": 65422, - "ètre": 98646, - "ètres": 74004, - "ève": 78251, - "é": 963, - "éal": 62397, - "éc": 19667, - "échange": 139300, - "écial": 69777, - "école": 134670, - "économ": 139301, - "économie": 139302, - "écoute": 140673, - "écran": 140348, - "éd": 15083, - "éducation": 143829, - "ée": 7888, - "ées": 13700, - "éfono": 72397, - "ég": 18863, - "égor": 93729, - "égorie": 96093, - "éis": 87018, - "ék": 74373, - "él": 18503, - "élection": 139980, - "éli": 72411, - "élé": 28882, - "ém": 16647, - "ément": 41525, - "éments": 97842, - "émon": 24149, - "én": 10394, - "énergie": 136348, - "énom": 96978, - "ény": 72291, - "éné": 31353, - "éo": 88477, - "éparation": 137834, - "épo": 140253, - "époque": 140254, - "équipe": 129862, - "ér": 13763, - "éra": 75643, - "ération": 52201, - "érc": 95014, - "érer": 51324, - "éri": 27055, - "éric": 38865, - "érica": 70181, - "érie": 34185, - "érience": 64579, - "érieur": 56563, - "ério": 127785, - "érique": 77029, - "éro": 55671, - "ért": 86353, - "éré": 67762, - "és": 5397, - "ése": 91152, - "ést": 86092, - "ész": 77879, - "ét": 10302, - "éta": 142993, - "établ": 137913, - "établissement": 137914, - "étais": 142994, - "était": 131327, - "état": 133775, - "ética": 87929, - "ético": 86138, - "étique": 98088, - "étr": 142754, - "étranger": 142755, - "étude": 132573, - "été": 38783, - "év": 127990, - "éviter": 139685, - "évolution": 138216, - "évén": 138535, - "événement": 138536, - "ê": 5498, - "êm": 38830, - "ême": 22239, - "ên": 27021, - "ência": 23696, - "ências": 63809, - "ês": 36830, - "êt": 48430, - "ête": 35993, - "êtes": 89176, - "être": 37716, - "êu": 124634, - "êÌ": 127369, - "ệ": 132840, - "êÌģ": 132515, - "êÌī": 138068, - "ë": 12179, - "ël": 73453, - "ële": 135586, - "ën": 87555, - "ër": 72474, - "ì": 23531, - "ìm": 126303, - "ìn": 126368, - "ình": 58506, - "î": 24137, - "ît": 76322, - "ître": 64914, - "ï": 37572, - "ð": 67700, - "ñ": 5653, - "ña": 18324, - "ñana": 87084, - "ñas": 59925, - "ñe": 136936, - "ño": 14529, - "ños": 18219, - "ò": 22190, - "òa": 125832, - "òn": 125437, - "òng": 63775, - "ó": 1794, - "óa": 58875, - "ób": 51109, - "óc": 125877, - "ód": 20511, - "ódigo": 32743, - "óg": 34397, - "ói": 125444, - "ój": 61324, - "ól": 51937, - "ólica": 140091, - "óln": 87209, - "ólogo": 139428, - "óm": 49980, - "ómo": 71461, - "ón": 3165, - "óng": 124890, - "ónica": 91963, - "ónico": 59795, - "ópez": 85726, - "ór": 59377, - "ória": 51077, - "ório": 89466, - "óry": 127947, - "ós": 28732, - "ósito": 98854, - "óst": 94852, - "ót": 50358, - "ów": 12263, - "ówi": 126750, - "ówki": 134036, - "ówn": 41313, - "óż": 57162, - "óÅĤ": 47392, - "ô": 9574, - "ôi": 124312, - "ôle": 56232, - "ôm": 94365, - "ôme": 98657, - "ôn": 61452, - "ông": 24015, - "ônica": 140717, - "ôt": 34557, - "ôte": 89386, - "ôtel": 127412, - "õ": 11151, - "ões": 12652, - "ö": 2956, - "öff": 51176, - "öffent": 91712, - "öffentlich": 132149, - "ög": 61897, - "öh": 84251, - "ök": 76791, - "öl": 49802, - "ölü": 134981, - "öm": 85584, - "ömür": 143714, - "ön": 23348, - "öne": 133406, - "önü": 139399, - "ör": 9416, - "ören": 88287, - "örper": 75024, - "ört": 51817, - "örü": 134126, - "ös": 32454, - "öst": 97682, - "öt": 44226, - "ött": 86764, - "öyle": 127688, - "öz": 125367, - "Ã¶ÃŁe": 78940, - "Ã¶ÄŁ": 139381, - "Ã¶ÄŁret": 139382, - "Ã¶ÄŁretim": 139383, - "÷": 144422, - "ø": 6151, - "ød": 74720, - "øj": 64794, - "ør": 17107, - "øre": 66027, - "øy": 50248, - "ù": 14926, - "ùng": 88771, - "ú": 6654, - "úa": 89639, - "úb": 26790, - "ública": 68074, - "úc": 124411, - "úde": 67388, - "údo": 86702, - "úmer": 21606, - "úmero": 25052, - "úmeros": 63918, - "ún": 24180, - "úng": 125446, - "ús": 33762, - "úsqueda": 86304, - "út": 124931, - "û": 29772, - "ût": 59668, - "ü": 2391, - "üb": 130977, - "über": 48985, - "üc": 127771, - "ück": 19358, - "ücken": 91639, - "ücü": 135636, - "ügen": 82040, - "üh": 21558, - "ühl": 93110, - "ühr": 50753, - "ührung": 92182, - "ük": 39857, - "ül": 35524, - "üler": 92071, - "ült": 89541, - "ülü": 135740, - "üm": 48521, - "ümüz": 127783, - "ün": 16074, - "ünc": 143388, - "ünchen": 51831, - "üncü": 143389, - "ünd": 34271, - "ünde": 97310, - "ündig": 136869, - "ünk": 96307, - "ünkü": 127529, - "üns": 66107, - "ünst": 59391, - "ünü": 129782, - "ünün": 132508, - "üp": 131481, - "ür": 5186, - "ürger": 94858, - "ürlich": 56530, - "ürn": 89220, - "ürnberg": 93356, - "ürü": 125665, - "üs": 126827, - "üss": 30203, - "üsseldorf": 85035, - "üssen": 43961, - "üst": 138417, - "üstü": 138418, - "üsü": 133094, - "üt": 28658, - "üyor": 126645, - "üyü": 142860, - "üz": 78591, - "üzü": 131887, - "Ã¼ÃŁ": 134215, - "Ã¼ÄŁ": 124958, - "Ã¼ÄŁÃ¼": 124959, - "Ã¼ÅŁ": 124911, - "ý": 19622, - "ých": 97855, - "ýt": 96600, - "þ": 134629, - "ÿ": 145059, - "ÃĢ": 71953, - "Ãģ": 43701, - "ÃĤ": 32795, - "ÃĤN": 141570, - "Ãĥ": 18791, - "ÃĥO": 52128, - "ÃĦ": 86975, - "Ãħ": 144044, - "ÃĨ": 144839, - "Ãĩ": 45913, - "ÃĩÃĥO": 74634, - "ÃĪ": 142505, - "Ãī": 26789, - "Ãītat": 135212, - "ÃĬ": 127229, - "Ãĭ": 144679, - "ÃĮ": 144201, - "Ãį": 52220, - "Ãİ": 71807, - "Ãı": 144865, - "ÃIJ": 95199, - "Ãij": 71354, - "ÃĴ": 144086, - "Ãĵ": 39062, - "ÃĵN": 51769, - "ÃĶ": 131371, - "Ãķ": 144335, - "Ãĸ": 63361, - "ÃĸZ": 141452, - "ÃĹ": 17568, - "ÃĹ": 88720, - "Ġ\".": 5933, - "Ġ\".\"": 22760, - "Ġ\".\");Ċ": 87260, - "Ġ\".\",": 68514, - "Ġ\".\";Ċ": 91223, - "Ġ\".$": 14786, - "Ġ\".$_": 88947, - "Ġ\"..": 32213, - "Ġ\"...": 38713, - "Ġ\"../": 7005, - "Ġ\"../../": 10208, - "Ġ\"../../../": 30630, - "Ġ\"../../../../": 63392, - "Ġ\"./": 5924, - "Ġ\".Ċ": 80410, - "Ġ\"/": 3521, - "Ġ\"/\"": 16891, - "Ġ\"/\");Ċ": 97539, - "Ġ\"/\",": 64657, - "Ġ\"/\";Ċ": 79480, - "Ġ\"/\"Ċ": 80455, - "Ġ\"//": 35574, - "Ġ\":": 13022, - "Ġ\":\"": 23427, - "Ġ\"::": 70154, - "Ġ\";": 18963, - "Ġ\";\"": 66150, - "Ġ\";Ċ": 7620, - "Ġ\";ĊĊ": 41620, - "Ġ\";čĊ": 24881, - "Ġ\"<": 4055, - "Ġ\"": 28957, - "Ġ\">\"": 90013, - "Ġ\"><": 96334, - "Ġ\">Ċ": 23478, - "Ġ\"?": 27244, - "Ġ\"?\"": 82729, - "Ġ\"@": 8428, - "Ġ\"@\"": 96848, - "Ġ\"@/": 73735, - "Ġ\"[": 10545, - "Ġ\"[\"": 50681, - "Ġ\"[%": 94090, - "Ġ\"\\": 2917, - "Ġ\"\\\"": 15898, - "Ġ\"\\\"\"": 67622, - "Ġ\"\\\",": 77885, - "Ġ\"\\\">": 83213, - "Ġ\"\\(": 43146, - "Ġ\"\\<": 23435, - "Ġ\"\\\\": 26468, - "Ġ\"\\\\\"": 68937, - "Ġ\"\\Ċ": 93317, - "Ġ\"]": 21299, - "Ġ\"]\"": 87596, - "Ġ\"]\");Ċ": 92723, - "Ġ\"]\";Ċ": 57130, - "Ġ\"^": 39915, - "Ġ\"_": 9000, - "Ġ\"_\"": 32725, - "Ġ\"__": 13265, - "Ġ\"`": 35973, - "Ġ\"{": 13868, - "Ġ\"{\"": 97049, - "Ġ\"{$": 54977, - "Ġ\"{\\\"": 54734, - "Ġ\"{{": 47219, - "Ġ\"{}": 35503, - "Ġ\"|": 25203, - "Ġ\"|\"": 60420, - "Ġ\"}": 80548, - "Ġ\"}\";Ċ": 98274, - "Ġ\"}\\": 90105, - "Ġ\"}Ċ": 43270, - "Ġ\"~": 51269, - "Ġ\"~/": 48188, - "Ġ\"Ċ": 6228, - "Ġ\"ĊĊ": 22746, - "Ġ\"čĊ": 31487, - "Ġ#": 671, - "Ġ#\"": 55050, - "Ġ##": 7704, - "Ġ###": 16600, - "Ġ####": 26274, - "Ġ#####": 68684, - "Ġ########": 26352, - "Ġ############": 76527, - "Ġ################": 37615, - "Ġ########################": 96515, - "Ġ################################": 54301, - "Ġ################################################": 67161, - "Ġ################################################################": 48497, - "Ġ########################################################################": 93858, - "Ġ############################################################################": 86200, - "Ġ########.": 34173, - "Ġ###Ċ": 65287, - "Ġ##Ċ": 47726, - "Ġ#$": 81685, - "Ġ#%": 50594, - "Ġ#'": 42037, - "Ġ#(": 89166, - "Ġ#+#": 20505, - "Ġ#-": 29907, - "Ġ#-}Ċ": 41196, - "Ġ#-}ĊĊ": 75499, - "Ġ#:": 46198, - "Ġ#=>": 98915, - "Ġ#@": 91027, - "Ġ#[": 11506, - "Ġ#__": 96807, - "Ġ#{": 11273, - "Ġ#{@": 54628, - "Ġ#Ċ": 9541, - "Ġ#ĊĊ": 58606, - "Ġ#čĊ": 55223, - "Ġ$": 400, - "Ġ$\"": 23440, - "Ġ$\"{": 37758, - "Ġ$#": 65915, - "Ġ$$": 26107, - "Ġ$$$": 97700, - "Ġ$(": 4930, - "Ġ$(\"": 24148, - "Ġ$(\"#": 5945, - "Ġ$(\"#\"": 82994, - "Ġ$(\".": 13005, - "Ġ$(\"<": 50134, - "Ġ$($": 93977, - "Ġ$('": 15716, - "Ġ$('#": 5484, - "Ġ$('#'": 81036, - "Ġ$('.": 9607, - "Ġ$('<": 37084, - "Ġ$('[": 65678, - "Ġ$.": 8672, - "Ġ$?": 50061, - "Ġ$\\": 57960, - "Ġ$_": 3320, - "Ġ$_[": 73929, - "Ġ$__": 24972, - "Ġ${": 3570, - "Ġ${(": 62067, - "Ġ${({": 54131, - "Ġ${Ċ": 98524, - "Ġ$Ċ": 24437, - "Ġ$ĊĊ": 84500, - "Ġ$čĊ": 95884, - "Ġ%": 1018, - "Ġ%\"": 68868, - "Ġ%#": 52406, - "Ġ%%": 23277, - "Ġ%%Ċ": 64058, - "Ġ%(": 21227, - "Ġ%+": 68524, - "Ġ%-": 50953, - "Ġ%.": 18524, - "Ġ%=": 49132, - "Ġ%>": 79036, - "Ġ%@": 50969, - "Ġ%@\",": 31452, - "Ġ%[": 64353, - "Ġ%{": 63737, - "Ġ%}Ċ": 67914, - "Ġ%Ċ": 32548, - "Ġ%ĊĊ": 91697, - "Ġ&": 609, - "Ġ&#": 44533, - "Ġ&$": 26950, - "Ġ&&": 1009, - "Ġ&&Ċ": 6561, - "Ġ&&čĊ": 41075, - "Ġ&'": 30136, - "Ġ&(": 22796, - "Ġ&)": 65387, - "Ġ&);Ċ": 79394, - "Ġ&,": 51953, - "Ġ&:": 51245, - "Ġ&=": 14581, - "Ġ&[": 44590, - "Ġ&_": 30795, - "Ġ&___": 25483, - "Ġ&Ċ": 27271, - "Ġ'": 364, - "Ġ'!": 61926, - "Ġ'\"": 7127, - "Ġ'\"'": 52090, - "Ġ'\"';Ċ": 94335, - "Ġ'\"+": 52125, - "Ġ'\",": 90949, - "Ġ'\".": 64050, - "Ġ'\".$": 26954, - "Ġ'\".$_": 88181, - "Ġ'\">": 96929, - "Ġ'\">'": 50446, - "Ġ'#": 5875, - "Ġ'#'": 57250, - "Ġ'#{": 77491, - "Ġ'$": 8248, - "Ġ'${": 35165, - "Ġ'%": 7677, - "Ġ'%\"": 81403, - "Ġ'%$": 81388, - "Ġ'%'": 65976, - "Ġ'&": 14723, - "Ġ'&#": 58539, - "Ġ'&'": 85099, - "Ġ''": 3355, - "Ġ'''": 11456, - "Ġ'''Ċ": 11166, - "Ġ'''ĊĊ": 44732, - "Ġ'''čĊ": 53895, - "Ġ'')": 13453, - "Ġ''),": 87775, - "Ġ''),Ċ": 62631, - "Ġ'').": 40691, - "Ġ'');": 91515, - "Ġ'');Ċ": 25249, - "Ġ'');ĊĊ": 75910, - "Ġ''){Ċ": 53995, - "Ġ'')Ċ": 22312, - "Ġ'')ĊĊ": 98422, - "Ġ'',": 8981, - "Ġ'',Ċ": 6870, - "Ġ'',čĊ": 48644, - "Ġ''.": 42863, - "Ġ'':Ċ": 48115, - "Ġ'';": 36803, - "Ġ'';Ċ": 7547, - "Ġ'';ĊĊ": 25501, - "Ġ'';čĊ": 32386, - "Ġ''}Ċ": 75352, - "Ġ''Ċ": 11776, - "Ġ''ĊĊ": 45320, - "Ġ''čĊ": 65138, - "Ġ'(": 22022, - "Ġ'('": 37880, - "Ġ'((": 87114, - "Ġ')": 16667, - "Ġ')'": 79375, - "Ġ')';Ċ": 85490, - "Ġ'))Ċ": 59509, - "Ġ'),": 89384, - "Ġ').": 49884, - "Ġ');": 83853, - "Ġ');Ċ": 25624, - "Ġ');ĊĊ": 93873, - "Ġ');čĊ": 97309, - "Ġ')[": 63481, - "Ġ')Ċ": 21686, - "Ġ')ĊĊ": 87141, - "Ġ')čĊ": 77009, - "Ġ'*": 14879, - "Ġ'*'": 30701, - "Ġ'*',": 80174, - "Ġ'**": 77165, - "Ġ'*.": 72718, - "Ġ'+": 13902, - "Ġ'+'": 33388, - "Ġ',": 6614, - "Ġ','": 22262, - "Ġ',',": 63026, - "Ġ','.": 97680, - "Ġ',Ċ": 31418, - "Ġ'-": 7788, - "Ġ'-'": 20672, - "Ġ'-')": 69163, - "Ġ'-')Ċ": 90096, - "Ġ'-',": 50349, - "Ġ'-';Ċ": 83852, - "Ġ'--": 17304, - "Ġ'.": 6256, - "Ġ'.$": 15808, - "Ġ'.'": 24361, - "Ġ'.')": 70235, - "Ġ'.',": 45669, - "Ġ'.';Ċ": 94502, - "Ġ'..": 45121, - "Ġ'..',": 88542, - "Ġ'../": 4927, - "Ġ'../../": 6356, - "Ġ'../../../": 18554, - "Ġ'../../../../": 37449, - "Ġ'../../../../../": 94645, - "Ġ'./": 2756, - "Ġ'./../": 55100, - "Ġ'./../../": 68106, - "Ġ'/": 3353, - "Ġ'/'": 14853, - "Ġ'/')": 64433, - "Ġ'/');Ċ": 85342, - "Ġ'/')Ċ": 93075, - "Ġ'/',": 56427, - "Ġ'/',Ċ": 59611, - "Ġ'/';Ċ": 77311, - "Ġ'/'Ċ": 68133, - "Ġ'/../": 56512, - "Ġ'//": 59660, - "Ġ':": 13592, - "Ġ':'": 36304, - "Ġ'::": 97752, - "Ġ';": 27825, - "Ġ';'": 81954, - "Ġ';Ċ": 19901, - "Ġ';ĊĊ": 93244, - "Ġ';čĊ": 72473, - "Ġ'<": 3857, - "Ġ'<%=": 95095, - "Ġ'": 55907, - "Ġ'>'": 77774, - "Ġ'?": 31067, - "Ġ'?'": 73516, - "Ġ'@": 3458, - "Ġ'@/": 30110, - "Ġ'[": 18309, - "Ġ'['": 48290, - "Ġ'\\": 5196, - "Ġ'\\\"": 84849, - "Ġ'\\'": 58355, - "Ġ'\\''": 34109, - "Ġ'\\\\": 28078, - "Ġ'\\\\'": 93103, - "Ġ']": 42877, - "Ġ'^": 49438, - "Ġ'_": 9235, - "Ġ'_'": 35302, - "Ġ'_',": 90924, - "Ġ'__": 12112, - "Ġ'`": 55995, - "Ġ'{": 11573, - "Ġ'{\"": 52098, - "Ġ'{$": 44600, - "Ġ'{@": 54073, - "Ġ'{{": 42542, - "Ġ'{}": 32912, - "Ġ'{}'": 69422, - "Ġ'|": 36357, - "Ġ'|'": 84639, - "Ġ'}": 40074, - "Ġ'}';Ċ": 57956, - "Ġ'}Ċ": 52462, - "Ġ'~": 63470, - "Ġ'~/": 71404, - "Ġ'Ċ": 7885, - "Ġ'ĊĊ": 55144, - "Ġ'čĊ": 26861, - "Ġ(": 320, - "Ġ(!": 1505, - "Ġ(!!": 77980, - "Ġ(!$": 11378, - "Ġ(!(": 13836, - "Ġ(!((": 95278, - "Ġ(![": 65831, - "Ġ(!_": 24076, - "Ġ(\"": 3489, - "Ġ(\"%": 50534, - "Ġ(\"-": 98670, - "Ġ(\"/": 88889, - "Ġ(\"<": 90276, - "Ġ(\"\\": 51658, - "Ġ(#": 29083, - "Ġ($": 1711, - "Ġ($(": 39137, - "Ġ($(\"#": 72946, - "Ġ($('#": 70044, - "Ġ($)": 75346, - "Ġ($.": 84330, - "Ġ($_": 17435, - "Ġ(${": 62789, - "Ġ(%": 13456, - "Ġ(%)": 33955, - "Ġ(&": 15899, - "Ġ('": 4319, - "Ġ('$": 59877, - "Ġ('\\": 88744, - "Ġ((": 1781, - "Ġ((!": 44824, - "Ġ((\"": 89101, - "Ġ(($": 26856, - "Ġ(('": 92833, - "Ġ(((": 11600, - "Ġ((((": 51100, - "Ġ(()": 66647, - "Ġ((*": 36456, - "Ġ((_": 63887, - "Ġ((__": 54323, - "Ġ()": 1719, - "Ġ())": 44481, - "Ġ());Ċ": 49323, - "Ġ());ĊĊ": 89684, - "Ġ())Ċ": 58389, - "Ġ(),": 38104, - "Ġ(),Ċ": 84201, - "Ġ()->": 78838, - "Ġ().": 33711, - "Ġ():": 40548, - "Ġ();": 39147, - "Ġ();Ċ": 9563, - "Ġ();ĊĊ": 25162, - "Ġ();čĊ": 54453, - "Ġ()=>": 71630, - "Ġ()=>{Ċ": 73162, - "Ġ(){": 93083, - "Ġ(){Ċ": 40653, - "Ġ()Ċ": 12668, - "Ġ()ĊĊ": 32805, - "Ġ()čĊ": 69540, - "Ġ(*": 4609, - "Ġ(*(": 38707, - "Ġ(*((": 82379, - "Ġ(*)": 44048, - "Ġ(*)(": 74794, - "Ġ(**": 76496, - "Ġ(*.": 57018, - "Ġ(+": 17973, - "Ġ(++": 46338, - "Ġ(-": 10293, - "Ġ(--": 57619, - "Ġ(.": 29465, - "Ġ(...": 48967, - "Ġ(...)": 65777, - "Ġ(/": 46225, - "Ġ(:": 29254, - "Ġ(::": 68590, - "Ġ(;": 30375, - "Ġ(;;": 52489, - "Ġ(;;)": 75600, - "Ġ(<": 22438, - "Ġ(=": 38738, - "Ġ(>": 76852, - "Ġ(?": 44959, - "Ġ(?)": 76540, - "Ġ(?,": 63985, - "Ġ(@": 8006, - "Ġ([": 11743, - "Ġ([[": 60525, - "Ġ([]": 34923, - "Ġ(\\": 19788, - "Ġ(\\<": 24333, - "Ġ(^": 41491, - "Ġ(^)(": 58265, - "Ġ(_": 5453, - "Ġ(_)": 56144, - "Ġ(_,": 39464, - "Ġ(_.": 64360, - "Ġ(__": 22558, - "Ġ(`": 28654, - "Ġ({": 9469, - "Ġ({Ċ": 13861, - "Ġ(~": 30757, - "Ġ(~(": 71265, - "Ġ(£": 53815, - "Ġ(âĢľ": 26087, - "Ġ(âĪ": 94825, - "Ġ(Ċ": 2399, - "Ġ(ĊĊ": 52054, - "Ġ(čĊ": 25315, - "Ġ)": 873, - "Ġ)\"": 90798, - "Ġ)(": 40612, - "Ġ))": 11985, - "Ġ)))": 98952, - "Ġ)),Ċ": 39290, - "Ġ));": 59792, - "Ġ));Ċ": 16518, - "Ġ));ĊĊ": 33351, - "Ġ));čĊ": 77314, - "Ġ))}Ċ": 31715, - "Ġ))Ċ": 19245, - "Ġ))ĊĊ": 48622, - "Ġ)*": 89401, - "Ġ),": 6882, - "Ġ),Ċ": 2837, - "Ġ),ĊĊ": 36984, - "Ġ),čĊ": 21406, - "Ġ)->": 35538, - "Ġ).": 7457, - "Ġ).Ċ": 95605, - "Ġ).ĊĊ": 49270, - "Ġ):": 16512, - "Ġ):Ċ": 21035, - "Ġ):ĊĊ": 58418, - "Ġ);": 6903, - "Ġ);Ċ": 1439, - "Ġ);ĊĊ": 3475, - "Ġ);ĊĊĊ": 35833, - "Ġ);čĊ": 7144, - "Ġ);čĊčĊ": 18772, - "Ġ)[": 74029, - "Ġ)]Ċ": 85925, - "Ġ){": 40023, - "Ġ){Ċ": 10959, - "Ġ){ĊĊ": 58177, - "Ġ){čĊ": 41191, - "Ġ)}Ċ": 17566, - "Ġ)}ĊĊ": 90222, - "Ġ)Ċ": 1727, - "Ġ)ĊĊ": 5125, - "Ġ)ĊĊĊ": 25571, - "Ġ)ĊĊĊĊĊĊĊĊ": 28038, - "Ġ)čĊ": 8616, - "Ġ)čĊčĊ": 52531, - "Ġ*": 353, - "Ġ*\"": 91204, - "Ġ*&": 77745, - "Ġ*(": 12861, - "Ġ*((": 15852, - "Ġ*(*": 86724, - "Ġ*)": 2586, - "Ġ*)\"": 93652, - "Ġ*)&": 22158, - "Ġ*)(": 23585, - "Ġ*)((": 78774, - "Ġ*))": 97591, - "Ġ*));Ċ": 72615, - "Ġ*);Ċ": 27042, - "Ġ*);ĊĊ": 62610, - "Ġ*)[": 78082, - "Ġ*)__": 70247, - "Ġ*)Ċ": 17400, - "Ġ*)ĊĊ": 46644, - "Ġ**": 3070, - "Ġ**)": 27876, - "Ġ**)&": 73593, - "Ġ***": 17160, - "Ġ***!Ċ": 83555, - "Ġ****": 30704, - "Ġ*****": 41423, - "Ġ********": 34145, - "Ġ****************": 46846, - "Ġ************************": 54176, - "Ġ********************************": 22958, - "Ġ****************************************": 61360, - "Ġ************************************************": 71836, - "Ġ********************************************************": 65195, - "Ġ****************************************************************": 22292, - "Ġ************************************************************************": 10534, - "Ġ**************************************************************************": 17535, - "Ġ****************************************************************************": 28644, - "Ġ********************************************************************************": 76550, - "Ġ******************************************************************************/Ċ": 79371, - "Ġ******************************************************************************/ĊĊ": 93682, - "Ġ******************************************************************************Ċ": 85785, - "Ġ***/Ċ": 81554, - "Ġ***Ċ": 75241, - "Ġ**/Ċ": 19546, - "Ġ**/ĊĊ": 68612, - "Ġ**/čĊ": 88490, - "Ġ**Ċ": 36914, - "Ġ*,": 11777, - "Ġ*,Ċ": 74792, - "Ġ*----------------------------------------------------------------": 77149, - "Ġ*.": 31530, - "Ġ*/": 639, - "Ġ*/)": 89855, - "Ġ*/,": 36572, - "Ġ*/,Ċ": 47101, - "Ġ*/;Ċ": 37994, - "Ġ*/}Ċ": 21654, - "Ġ*/Ċ": 735, - "Ġ*/ĊĊ": 2791, - "Ġ*/ĊĊĊ": 21668, - "Ġ*/ĊĊĊĊ": 78435, - "Ġ*/čĊ": 3456, - "Ġ*/čĊčĊ": 15452, - "Ġ*/čĊčĊčĊ": 87442, - "Ġ*": 22948, - "Ġ*>(": 28565, - "Ġ*@": 45637, - "Ġ*[": 97932, - "Ġ*\\": 87787, - "Ġ*_": 19332, - "Ġ*__": 37062, - "Ġ*}": 85779, - "Ġ*}ĊĊ": 98372, - "Ġ*Ċ": 1213, - "Ġ*ĊĊ": 19799, - "Ġ*ĊĊĊ": 71515, - "Ġ*čĊ": 7613, - "Ġ+": 488, - "Ġ+\"": 28184, - "Ġ+#": 94743, - "Ġ+#+": 13223, - "Ġ+#+#+#+": 33856, - "Ġ+#+#+#+#+#+": 33857, - "Ġ+%": 74524, - "Ġ+'": 49210, - "Ġ+(": 61083, - "Ġ++": 3443, - "Ġ++$": 72306, - "Ġ++)": 55589, - "Ġ++)Ċ": 83532, - "Ġ+++": 59092, - "Ġ++;Ċ": 40840, - "Ġ++Ċ": 97347, - "Ġ+-": 77545, - "Ġ+/-": 51615, - "Ġ+:+": 13109, - "Ġ+=": 1421, - "Ġ+=Ċ": 88176, - "Ġ+Ċ": 3610, - "Ġ+ĊĊ": 59454, - "Ġ+čĊ": 19587, - "Ġ,": 1154, - "Ġ,\"": 33821, - "Ġ,$": 86794, - "Ġ,'": 38339, - "Ġ,(": 80592, - "Ġ,,": 80258, - "Ġ,-": 90504, - "Ġ,[": 80280, - "Ġ,Ċ": 13493, - "Ġ,ĊĊ": 21174, - "Ġ,čĊ": 55819, - "Ġ-": 481, - "Ġ-$": 82358, - "Ġ-(": 28406, - "Ġ-*": 8195, - "Ġ-*-": 12017, - "Ġ-*-Ċ": 18754, - "Ġ-*-ĊĊ": 34499, - "Ġ-*-čĊ": 82294, - "Ġ-,": 85922, - "Ġ--": 1177, - "Ġ---": 12448, - "Ġ----": 11304, - "Ġ-----": 34703, - "Ġ------": 55460, - "Ġ-------": 60158, - "Ġ--------": 56136, - "Ġ---------": 80822, - "Ġ----------": 43789, - "Ġ-----------": 92586, - "Ġ------------": 32558, - "Ġ-------------": 96803, - "Ġ----------------": 14393, - "Ġ--------------------": 90781, - "Ġ--------------------------------": 19728, - "Ġ------------------------------------------------": 18036, - "Ġ------------------------------------------------------------": 86632, - "Ġ----------------------------------------------------------------": 8466, - "Ġ-------------------------------------------------------------------------": 90915, - "Ġ----------------------------------------------------------------------------": 23852, - "Ġ--------------------------------------------------------------------------------": 39373, - "Ġ------------------------------------------------------------------------------------------------": 59809, - "Ġ----------------------------------------------------------------------------------------------------------------": 66207, - "Ġ-----------------------------------------------------------------------------Ċ": 51814, - "Ġ----------------------------------------------------------------------------Ċ": 63538, - "Ġ---------------------------------------------------------------------------Ċ": 78757, - "Ġ--------------------------------------------------------------------------Ċ": 97942, - "Ġ-------------------------------------------------------------------------Ċ": 80550, - "Ġ------------------------------------------------------------------------Ċ": 96581, - "Ġ----------------------------------------------------------------------Ċ": 89694, - "Ġ----------Ċ": 30323, - "Ġ--------Ċ": 89138, - "Ġ-------Ċ": 38607, - "Ġ------>": 97200, - "Ġ-----Ċ": 79949, - "Ġ--->": 69726, - "Ġ---Ċ": 53923, - "Ġ-->": 3844, - "Ġ-->Ċ": 3659, - "Ġ-->ĊĊ": 16117, - "Ġ-->ĊĊĊ": 70652, - "Ġ-->čĊ": 15956, - "Ġ-->čĊčĊ": 71610, - "Ġ--}}Ċ": 40304, - "Ġ--Ċ": 39514, - "Ġ--ĊĊ": 59581, - "Ġ-.": 42745, - "Ġ-/Ċ": 66870, - "Ġ-:": 52173, - "Ġ-=": 5982, - "Ġ->": 1464, - "Ġ->Ċ": 12381, - "Ġ-Ċ": 18221, - "Ġ-ĊĊ": 21974, - "Ġ.": 659, - "Ġ.\"": 41348, - "Ġ.$": 45377, - "Ġ.'": 43584, - "Ġ.'": 6206, - "Ġ/>\";Ċ": 60338, - "Ġ/>'": 71042, - "Ġ/>';Ċ": 56045, - "Ġ/>);Ċ": 63191, - "Ġ/>)Ċ": 98436, - "Ġ/>,": 77551, - "Ġ/>,Ċ": 55983, - "Ġ/>;Ċ": 41289, - "Ġ/><": 23976, - "Ġ/>\\": 76246, - "Ġ/>}": 85043, - "Ġ/>}Ċ": 36781, - "Ġ/>Ċ": 2597, - "Ġ/>ĊĊ": 18544, - "Ġ/>čĊ": 17989, - "Ġ/[": 95329, - "Ġ/\\": 23536, - "Ġ/\\.": 45472, - "Ġ/\\.(": 84863, - "Ġ/^": 34510, - "Ġ/^(": 93296, - "Ġ/^[": 75336, - "Ġ/^\\": 80957, - "Ġ/Ċ": 38981, - "Ġ/ĊĊ": 91545, - "Ġ:": 549, - "Ġ:\"": 34638, - "Ġ:\",": 71863, - "Ġ:\";Ċ": 91898, - "Ġ:'": 53546, - "Ġ:(": 39524, - "Ġ:)": 25956, - "Ġ:)Ċ": 89063, - "Ġ:)ĊĊ": 32623, - "Ġ:+:": 15950, - "Ġ:,": 27782, - "Ġ:-": 20955, - "Ġ:-)": 91841, - "Ġ:-Ċ": 62344, - "Ġ::": 3504, - "Ġ:::": 21222, - "Ġ::::::::": 33258, - "Ġ::=": 64154, - "Ġ::Ċ": 80687, - "Ġ:": 47879, - "Ġ<%": 59230, - "Ġ<%=": 90194, - "Ġ<*": 86202, - "Ġ<*>": 69483, - "Ġ<+": 85703, - "Ġ<-": 9119, - "Ġ<--": 70386, - "Ġ<->": 66832, - "ĠĊ": 23600, - "Ġ<:": 47926, - "Ġ<<": 1115, - "Ġ<<\"": 41554, - "Ġ<<-": 75674, - "Ġ<<<": 43662, - "Ġ<<=": 51178, - "Ġ<<Ċ": 48503, - "Ġ<=": 2651, - "Ġ<=>": 71505, - "Ġ<>": 14392, - "Ġ<>Ċ": 20758, - "Ġ": 94331, - "Ġ==>": 32296, - "Ġ==Ċ": 47761, - "Ġ=>": 589, - "Ġ=>$": 60554, - "Ġ=>'": 49807, - "Ġ=>{Ċ": 30634, - "Ġ=>Ċ": 6274, - "Ġ=>čĊ": 48668, - "Ġ=[": 67610, - "Ġ={": 72142, - "Ġ={Ċ": 83724, - "Ġ=~": 20495, - "Ġ=Ċ": 4035, - "Ġ=ĊĊ": 79483, - "Ġ=čĊ": 32203, - "Ġ>": 861, - "Ġ>\",": 82876, - "Ġ>&": 36498, - "Ġ>(": 36720, - "Ġ>/": 61359, - "Ġ>::": 33813, - "Ġ><": 29348, - "Ġ>=": 2604, - "Ġ>>": 3578, - "Ġ>>=": 32971, - "Ġ>>>": 12109, - "Ġ>>ĊĊ": 56948, - "Ġ>Ċ": 6107, - "Ġ>ĊĊ": 25321, - "Ġ>čĊ": 39206, - "Ġ?": 937, - "Ġ?\");Ċ": 90192, - "Ġ?\",": 42313, - "Ġ?\";Ċ": 64253, - "Ġ?',": 57950, - "Ġ?,": 22473, - "Ġ?.": 79928, - "Ġ?:": 27257, - "Ġ?>": 3370, - "Ġ?>\"": 9543, - "Ġ?>\"/>Ċ": 93744, - "Ġ?>\">": 37751, - "Ġ?>\"><": 48782, - "Ġ?>\">\">\">Ċ": 19306, - "Ġ?>\">čĊ": 70931, - "Ġ?>\"Ċ": 64607, - "Ġ?>&": 66706, - "Ġ?>'": 91566, - "Ġ?>/": 27967, - "Ġ?>:;Ċ": 98187, - "Ġ?><": 43269, - "Ġ?>>": 39246, - "Ġ?>>>Ċ": 54130, - "Ġ?>Ċ": 3870, - "Ġ?>ĊĊ": 12279, - "Ġ?>ĊĊĊ": 70193, - "Ġ?>čĊ": 15861, - "Ġ?>čĊčĊ": 54616, - "Ġ??": 9415, - "Ġ???": 51317, - "Ġ?????": 73478, - "Ġ?Ċ": 17607, - "Ġ?ĊĊ": 23754, - "Ġ@": 569, - "Ġ@\"": 7098, - "Ġ@\"\";Ċ": 70878, - "Ġ@\"\\": 67976, - "Ġ@\"Ċ": 98688, - "Ġ@$": 36017, - "Ġ@$_": 98570, - "Ġ@(": 42181, - "Ġ@@": 22307, - "Ġ@@Ċ": 87120, - "Ġ@[": 95800, - "Ġ@_": 64677, - "Ġ@_;Ċ": 42574, - "Ġ@_;ĊĊ": 61163, - "Ġ@{": 33267, - "Ġ@{$": 78600, - "Ġ@{@\"": 92625, - "Ġ@{Ċ": 56247, - "Ġ@}": 93998, - "ĠA": 362, - "ĠAA": 28234, - "ĠAAA": 47097, - "ĠAABB": 88580, - "ĠAAC": 75348, - "ĠAAP": 74752, - "ĠAB": 14137, - "ĠABC": 19360, - "ĠABI": 63214, - "ĠABOUT": 51812, - "ĠABOVE": 92514, - "ĠABS": 36481, - "ĠAC": 10584, - "ĠACA": 64938, - "ĠACC": 25840, - "ĠACCEPT": 54906, - "ĠACCESS": 50552, - "ĠACCOUNT": 62358, - "ĠACE": 40806, - "ĠACK": 53763, - "ĠACL": 43461, - "ĠACLU": 64868, - "ĠACM": 89215, - "ĠACPI": 70118, - "ĠACS": 78084, - "ĠACT": 21116, - "ĠACTION": 16054, - "ĠACTIONS": 63315, - "ĠACTIVE": 74775, - "ĠAD": 9630, - "ĠADA": 78325, - "ĠADC": 22083, - "ĠADD": 15814, - "ĠADDR": 80514, - "ĠADDRESS": 64428, - "ĠADHD": 51464, - "ĠADM": 85001, - "ĠADMIN": 50235, - "ĠADS": 64235, - "ĠADV": 24540, - "ĠADVISED": 29321, - "ĠAE": 42108, - "ĠAES": 38841, - "ĠAF": 19885, - "ĠAFC": 63536, - "ĠAFF": 68938, - "ĠAFL": 56918, - "ĠAFP": 26648, - "ĠAFTER": 48264, - "ĠAG": 15082, - "ĠAGAIN": 66894, - "ĠAGE": 90588, - "ĠAGRE": 75490, - "ĠAH": 47288, - "ĠAHL": 89918, - "ĠAI": 15235, - "ĠAIDS": 44960, - "ĠAIM": 86768, - "ĠAIR": 45894, - "ĠAIS": 94100, - "ĠAJ": 32950, - "ĠAJAX": 57316, - "ĠAK": 30572, - "ĠAL": 8753, - "ĠALERT": 90548, - "ĠALIGN": 63769, - "ĠALL": 13097, - "ĠALLOW": 72260, - "ĠALOG": 79803, - "ĠALPHA": 82797, - "ĠALS": 38423, - "ĠALSO": 49821, - "ĠALT": 49412, - "ĠALTER": 75397, - "ĠALWAYS": 67414, - "ĠAM": 6769, - "ĠAMA": 51789, - "ĠAMAZ": 76520, - "ĠAMC": 74309, - "ĠAMD": 24311, - "ĠAMP": 62908, - "ĠAMS": 97270, - "ĠAN": 2100, - "ĠANAL": 65757, - "ĠANC": 85014, - "ĠAND": 3567, - "ĠANN": 76406, - "ĠANSI": 58014, - "ĠANSW": 96704, - "ĠANT": 86914, - "ĠANY": 4137, - "ĠAO": 65269, - "ĠAOL": 93151, - "ĠAP": 10106, - "ĠAPA": 83540, - "ĠAPC": 86241, - "ĠAPI": 5333, - "ĠAPIs": 33356, - "ĠAPK": 62486, - "ĠAPP": 17912, - "ĠAPPLE": 90336, - "ĠAPPLICATION": 59237, - "ĠAPPLY": 88986, - "ĠAPPRO": 93654, - "ĠAPR": 52426, - "ĠAPS": 91781, - "ĠAQ": 82455, - "ĠAR": 6261, - "ĠARC": 70344, - "ĠARCH": 55213, - "ĠARE": 15824, - "ĠAREA": 69632, - "ĠARG": 32746, - "ĠARGS": 84149, - "ĠARISING": 17549, - "ĠARM": 30486, - "ĠARP": 91337, - "ĠARR": 82079, - "ĠARRAY": 31112, - "ĠART": 33879, - "ĠARTICLE": 91915, - "ĠAS": 5752, - "ĠASA": 88600, - "ĠASAP": 66490, - "ĠASC": 19796, - "ĠASCII": 39316, - "ĠASD": 77194, - "ĠASE": 98867, - "ĠASF": 46268, - "ĠASIC": 93352, - "ĠASM": 65576, - "ĠASN": 54855, - "ĠASP": 48409, - "ĠASS": 35560, - "ĠASSERT": 12208, - "ĠASSIGN": 95571, - "ĠAST": 22465, - "ĠASTM": 61035, - "ĠASUS": 74670, - "ĠAT": 7369, - "ĠATA": 91622, - "ĠATF": 92851, - "ĠATH": 87089, - "ĠATI": 78776, - "ĠATK": 65335, - "ĠATL": 77523, - "ĠATM": 46035, - "ĠATP": 66556, - "ĠATS": 95375, - "ĠATT": 41285, - "ĠATTACK": 98450, - "ĠATTR": 37918, - "ĠATTRIBUTE": 84811, - "ĠATV": 95336, - "ĠAU": 39056, - "ĠAUD": 57580, - "ĠAUDIO": 52124, - "ĠAUG": 94881, - "ĠAUT": 53641, - "ĠAUTH": 16777, - "ĠAUTHOR": 40809, - "ĠAUTHORS": 26688, - "ĠAUTO": 35340, - "ĠAUX": 95755, - "ĠAV": 12155, - "ĠAVAILABLE": 67719, - "ĠAVC": 69318, - "ĠAVCapture": 91409, - "ĠAVG": 70414, - "ĠAVL": 89667, - "ĠAVR": 81313, - "ĠAW": 33338, - "ĠAWS": 23245, - "ĠAX": 40711, - "ĠAXIS": 87226, - "ĠAZ": 30876, - "ĠAad": 79272, - "ĠAaron": 25673, - "ĠAb": 3680, - "ĠAbb": 25973, - "ĠAbbas": 70145, - "ĠAbbey": 64455, - "ĠAbbott": 42127, - "ĠAbby": 84448, - "ĠAbd": 29638, - "ĠAbdel": 92291, - "ĠAbdul": 51598, - "ĠAbdullah": 63432, - "ĠAbe": 55139, - "ĠAbed": 98264, - "ĠAbel": 86849, - "ĠAber": 36574, - "ĠAberdeen": 79251, - "ĠAbilities": 79377, - "ĠAbility": 35983, - "ĠAble": 73850, - "ĠAboriginal": 55410, - "ĠAbort": 76955, - "ĠAbout": 9975, - "ĠAbove": 43610, - "ĠAbr": 36401, - "ĠAbraham": 36388, - "ĠAbram": 90003, - "ĠAbrams": 74231, - "ĠAbs": 22080, - "ĠAbsolute": 48881, - "ĠAbsolutely": 55547, - "ĠAbstract": 13513, - "ĠAbu": 30129, - "ĠAbuse": 45684, - "ĠAbyss": 64958, - "ĠAc": 6381, - "ĠAcad": 12364, - "ĠAcademic": 41070, - "ĠAcademy": 15815, - "ĠAcc": 11429, - "ĠAcceler": 46905, - "ĠAccent": 81809, - "ĠAccept": 20829, - "ĠAccepted": 63289, - "ĠAccess": 9549, - "ĠAccessToken": 94341, - "ĠAccessed": 97300, - "ĠAccessibility": 80272, - "ĠAccessories": 39719, - "ĠAccident": 75504, - "ĠAccom": 52964, - "ĠAccord": 79557, - "ĠAccording": 10548, - "ĠAccordingly": 62809, - "ĠAccount": 8615, - "ĠAccountability": 83690, - "ĠAccounting": 44244, - "ĠAccounts": 40655, - "ĠAccred": 96692, - "ĠAccum": 79525, - "ĠAccuracy": 50175, - "ĠAce": 37707, - "ĠAcer": 75977, - "ĠAch": 45565, - "ĠAchie": 41124, - "ĠAchievement": 65595, - "ĠAchilles": 87636, - "ĠAcid": 49134, - "ĠAck": 50982, - "ĠAcquisition": 72371, - "ĠAcres": 82459, - "ĠAcrobat": 97547, - "ĠAcross": 57137, - "ĠAct": 3218, - "ĠActing": 72689, - "ĠAction": 5586, - "ĠActionBar": 79093, - "ĠActionController": 73452, - "ĠActionListener": 40219, - "ĠActionResult": 16831, - "ĠActionType": 81762, - "ĠActionTypes": 89206, - "ĠActions": 26722, - "ĠActiv": 14708, - "ĠActivate": 51714, - "ĠActivatedRoute": 31417, - "ĠActivation": 49647, - "ĠActive": 9905, - "ĠActiveForm": 80964, - "ĠActiveRecord": 17780, - "ĠActiveSupport": 73001, - "ĠActivities": 43282, - "ĠActivity": 14981, - "ĠActivityCompat": 92444, - "ĠActor": 24718, - "ĠActors": 81361, - "ĠActress": 78439, - "ĠActs": 48818, - "ĠActual": 33359, - "ĠActually": 33763, - "ĠAd": 2410, - "ĠAda": 51149, - "ĠAdam": 15037, - "ĠAdams": 26234, - "ĠAdapt": 58431, - "ĠAdapter": 28807, - "ĠAdapterView": 70497, - "ĠAdaptive": 86408, - "ĠAdd": 2691, - "ĠAdded": 17684, - "ĠAddiction": 78690, - "ĠAdding": 30370, - "ĠAddison": 98994, - "ĠAddition": 78646, - "ĠAdditional": 23208, - "ĠAdditionally": 22406, - "ĠAddr": 72585, - "ĠAddress": 9177, - "ĠAddresses": 91430, - "ĠAdds": 24475, - "ĠAde": 62040, - "ĠAdelaide": 49201, - "ĠAdemás": 87483, - "ĠAdidas": 69889, - "ĠAdj": 62916, - "ĠAdjust": 27196, - "ĠAdjustable": 66728, - "ĠAdjustment": 91949, - "ĠAdler": 98618, - "ĠAdmin": 7582, - "ĠAdministr": 32851, - "ĠAdministration": 16713, - "ĠAdministrative": 51841, - "ĠAdministrator": 28593, - "ĠAdmir": 49469, - "ĠAdmiral": 57994, - "ĠAdmission": 62346, - "ĠAdobe": 28866, - "ĠAdoles": 62637, - "ĠAdolescent": 97482, - "ĠAdolf": 89485, - "ĠAdopt": 85280, - "ĠAdoption": 92017, - "ĠAdresse": 89470, - "ĠAdri": 61343, - "ĠAdrian": 43592, - "ĠAds": 42183, - "ĠAdult": 22133, - "ĠAdults": 57238, - "ĠAdv": 12325, - "ĠAdvance": 46296, - "ĠAdvanced": 21159, - "ĠAdvances": 90858, - "ĠAdvantage": 70359, - "ĠAdvent": 20540, - "ĠAdventure": 32012, - "ĠAdventures": 50579, - "ĠAdvertisement": 66002, - "ĠAdvertising": 46323, - "ĠAdvice": 54720, - "ĠAdvis": 23924, - "ĠAdvisor": 53332, - "ĠAdvisors": 90685, - "ĠAdvisory": 43913, - "ĠAdvoc": 47259, - "ĠAdvocate": 79007, - "ĠAe": 89795, - "ĠAer": 63050, - "ĠAero": 88423, - "ĠAeros": 63150, - "ĠAerospace": 80865, - "ĠAf": 12907, - "ĠAff": 9748, - "ĠAffairs": 22485, - "ĠAffero": 24304, - "ĠAffiliate": 63116, - "ĠAffordable": 42506, - "ĠAfghan": 16795, - "ĠAfghanistan": 20500, - "ĠAfr": 6432, - "ĠAfrica": 10174, - "ĠAfrican": 11643, - "ĠAfricans": 65638, - "ĠAfro": 93600, - "ĠAfter": 4636, - "ĠAfterwards": 86540, - "ĠAg": 4598, - "ĠAgain": 13759, - "ĠAgainst": 29141, - "ĠAge": 13081, - "ĠAgencies": 90186, - "ĠAgency": 16379, - "ĠAgenda": 57562, - "ĠAgent": 20713, - "ĠAgents": 50254, - "ĠAges": 48993, - "ĠAggregate": 56922, - "ĠAgile": 82184, - "ĠAgility": 94719, - "ĠAging": 76088, - "ĠAgo": 96603, - "ĠAgr": 71708, - "ĠAgree": 83203, - "ĠAgreement": 22499, - "ĠAgricult": 27900, - "ĠAgricultural": 59034, - "ĠAgriculture": 36863, - "ĠAgu": 76308, - "ĠAh": 16366, - "ĠAhead": 76444, - "ĠAhmad": 54317, - "ĠAhmed": 40669, - "ĠAi": 55986, - "ĠAid": 37405, - "ĠAim": 70615, - "ĠAin": 81151, - "ĠAir": 6553, - "ĠAirbnb": 60101, - "ĠAirbus": 80374, - "ĠAircraft": 58845, - "ĠAires": 64617, - "ĠAirlines": 34130, - "ĠAirport": 20691, - "ĠAirways": 69402, - "ĠAj": 40657, - "ĠAjax": 41162, - "ĠAk": 16358, - "ĠAkron": 94793, - "ĠAkt": 49096, - "ĠAl": 1674, - "ĠAla": 88662, - "ĠAlabama": 20623, - "ĠAlam": 64950, - "ĠAlamofire": 94074, - "ĠAlan": 25282, - "ĠAlarm": 46284, - "ĠAlaska": 27267, - "ĠAlb": 31572, - "ĠAlban": 56891, - "ĠAlbania": 94633, - "ĠAlbany": 54954, - "ĠAlbert": 17513, - "ĠAlberta": 32554, - "ĠAlberto": 64681, - "ĠAlbum": 25665, - "ĠAlbums": 86723, - "ĠAlbuquerque": 75812, - "ĠAlcohol": 44296, - "ĠAld": 30347, - "ĠAle": 19081, - "ĠAlec": 85016, - "ĠAlejandro": 84919, - "ĠAleks": 89578, - "ĠAleppo": 57121, - "ĠAlert": 13975, - "ĠAlertDialog": 31176, - "ĠAlerts": 68308, - "ĠAless": 69785, - "ĠAlex": 8515, - "ĠAlexa": 49612, - "ĠAlexand": 37477, - "ĠAlexander": 20042, - "ĠAlexandra": 74016, - "ĠAlexandre": 89054, - "ĠAlexandria": 56133, - "ĠAlexis": 58961, - "ĠAlf": 65768, - "ĠAlfred": 41492, - "ĠAlg": 81199, - "ĠAlgebra": 76443, - "ĠAlger": 58509, - "ĠAlgeria": 80241, - "ĠAlgorithm": 40325, - "ĠAlgorithms": 85759, - "ĠAli": 14583, - "ĠAlias": 58040, - "ĠAlibaba": 54364, - "ĠAlic": 63158, - "ĠAlice": 29405, - "ĠAlicia": 78902, - "ĠAlien": 46747, - "ĠAlign": 49472, - "ĠAlignment": 32265, - "ĠAlison": 66363, - "ĠAlive": 65426, - "ĠAll": 2009, - "ĠAlla": 90633, - "ĠAllah": 27371, - "ĠAllan": 60225, - "ĠAlle": 42161, - "ĠAlleg": 57724, - "ĠAllen": 20060, - "ĠAlley": 85989, - "ĠAlliance": 22751, - "ĠAllied": 60755, - "ĠAllies": 80674, - "ĠAllison": 62408, - "ĠAlloc": 46685, - "ĠAllocate": 44625, - "ĠAllocation": 72667, - "ĠAllocator": 80332, - "ĠAllow": 26530, - "ĠAllowed": 57622, - "ĠAllows": 45771, - "ĠAlloy": 60330, - "ĠAlly": 81470, - "ĠAlma": 98472, - "ĠAlmighty": 91314, - "ĠAlmost": 34303, - "ĠAlo": 94454, - "ĠAlone": 69308, - "ĠAlong": 31844, - "ĠAlonso": 74067, - "ĠAlpha": 24708, - "ĠAlphabet": 62797, - "ĠAlpine": 81713, - "ĠAlps": 92900, - "ĠAlready": 39512, - "ĠAlright": 97593, - "ĠAls": 44462, - "ĠAlso": 7281, - "ĠAlt": 23682, - "ĠAlta": 82060, - "ĠAlter": 42851, - "ĠAltern": 19489, - "ĠAlternate": 74724, - "ĠAlternative": 41109, - "ĠAlternatively": 38478, - "ĠAlthough": 10328, - "ĠAlto": 53270, - "ĠAltın": 143109, - "ĠAluminium": 88482, - "ĠAluminum": 45853, - "ĠAlumni": 75426, - "ĠAlv": 68946, - "ĠAlvarez": 76715, - "ĠAlways": 23240, - "ĠAly": 68310, - "ĠAlzheimer": 43431, - "ĠAlém": 133036, - "ĠAm": 3303, - "ĠAmanda": 41759, - "ĠAmar": 73657, - "ĠAmateur": 37983, - "ĠAmazing": 36533, - "ĠAmazon": 8176, - "ĠAmb": 19833, - "ĠAmbassador": 44572, - "ĠAmber": 46664, - "ĠAmbient": 92179, - "ĠAmelia": 90879, - "ĠAmen": 61396, - "ĠAmend": 76713, - "ĠAmendment": 21711, - "ĠAmendments": 98217, - "ĠAmer": 49773, - "ĠAmeric": 2288, - "ĠAmerica": 5159, - "ĠAmerican": 3693, - "ĠAmericans": 8877, - "ĠAmericas": 51148, - "ĠAmes": 95094, - "ĠAmid": 88689, - "ĠAmir": 89151, - "ĠAmit": 83763, - "ĠAmmo": 79481, - "ĠAmnesty": 77696, - "ĠAmong": 21658, - "ĠAmount": 25783, - "ĠAmp": 53687, - "ĠAmph": 92161, - "ĠAmpl": 71615, - "ĠAmsterdam": 37741, - "ĠAmy": 28693, - "ĠAmérica": 97092, - "ĠAn": 1527, - "ĠAna": 32138, - "ĠAnaheim": 71164, - "ĠAnal": 19452, - "ĠAnalog": 63446, - "ĠAnaly": 37427, - "ĠAnalysis": 18320, - "ĠAnalyst": 40470, - "ĠAnalytics": 32427, - "ĠAnalyzer": 78705, - "ĠAnast": 93325, - "ĠAnat": 95564, - "ĠAnatomy": 79182, - "ĠAnc": 30277, - "ĠAnch": 71484, - "ĠAnchor": 48772, - "ĠAncient": 36950, - "ĠAnd": 1597, - "ĠAndAlso": 69390, - "ĠAnda": 39138, - "ĠAnders": 47593, - "ĠAndersen": 85551, - "ĠAnderson": 20642, - "ĠAndr": 77878, - "ĠAndre": 26427, - "ĠAndrea": 40084, - "ĠAndreas": 50062, - "ĠAndres": 95346, - "ĠAndrew": 13615, - "ĠAndrews": 51851, - "ĠAndroid": 8514, - "ĠAndré": 84800, - "ĠAndy": 24832, - "ĠAng": 7416, - "ĠAnge": 10991, - "ĠAngebot": 81020, - "ĠAngel": 23080, - "ĠAngela": 37143, - "ĠAngeles": 11902, - "ĠAngelo": 89377, - "ĠAngels": 42045, - "ĠAngie": 98929, - "ĠAngle": 36237, - "ĠAnglic": 90534, - "ĠAnglo": 59159, - "ĠAngola": 97692, - "ĠAngry": 77818, - "ĠAngular": 28578, - "ĠAngularFire": 67087, - "ĠAngus": 83955, - "ĠAnim": 45465, - "ĠAnimal": 21292, - "ĠAnimals": 46866, - "ĠAnimated": 46888, - "ĠAnimation": 20752, - "ĠAnimator": 45754, - "ĠAnime": 51115, - "ĠAnita": 75626, - "ĠAnk": 56815, - "ĠAnkara": 70244, - "ĠAnn": 9305, - "ĠAnna": 23223, - "ĠAnne": 27926, - "ĠAnnex": 88620, - "ĠAnnie": 51989, - "ĠAnniversary": 46798, - "ĠAnnotation": 45823, - "ĠAnnotations": 93332, - "ĠAnnouncement": 86830, - "ĠAnnual": 24947, - "ĠAnnunci": 63166, - "ĠAnonymous": 30437, - "ĠAnother": 13293, - "ĠAns": 38453, - "ĠAnsi": 72022, - "ĠAnswer": 21806, - "ĠAnswers": 37243, - "ĠAnt": 6755, - "ĠAntar": 47523, - "ĠAntarctic": 79741, - "ĠAntarctica": 71687, - "ĠAnth": 16580, - "ĠAnthem": 89132, - "ĠAnthony": 20696, - "ĠAnthrop": 69284, - "ĠAnti": 22992, - "ĠAntib": 94851, - "ĠAntique": 70070, - "ĠAntoine": 90154, - "ĠAnton": 17500, - "ĠAntonio": 22437, - "ĠAntony": 96628, - "ĠAntwort": 65754, - "ĠAntworten": 95817, - "ĠAnxiety": 80369, - "ĠAny": 5765, - "ĠAnyObject": 41543, - "ĠAnyone": 32534, - "ĠAnything": 40933, - "ĠAnyway": 41569, - "ĠAo": 49364, - "ĠAp": 5232, - "ĠApache": 8914, - "ĠApart": 34702, - "ĠApartment": 52789, - "ĠApartments": 66551, - "ĠApex": 83355, - "ĠAph": 97308, - "ĠApi": 13443, - "ĠApiController": 87826, - "ĠApiException": 82793, - "ĠApiResponse": 71300, - "ĠApiService": 78751, - "ĠApocalypse": 79197, - "ĠApollo": 35150, - "ĠApost": 46759, - "ĠApostle": 80959, - "ĠApp": 1845, - "ĠAppBar": 41301, - "ĠAppBundle": 69135, - "ĠAppCompatActivity": 24125, - "ĠAppComponent": 30492, - "ĠAppConfig": 63385, - "ĠAppDelegate": 35846, - "ĠAppMethodBeat": 83476, - "ĠAppModule": 48537, - "ĠAppRoutingModule": 43207, - "ĠAppState": 74891, - "ĠAppalach": 77727, - "ĠAppalachian": 97927, - "ĠApparel": 81600, - "ĠApparently": 40874, - "ĠAppe": 28054, - "ĠAppeal": 60906, - "ĠAppeals": 47107, - "ĠAppearance": 60616, - "ĠAppears": 93017, - "ĠAppend": 29807, - "ĠAppendix": 64714, - "ĠAppet": 92279, - "ĠAppl": 57845, - "ĠApple": 8162, - "ĠAppleWebKit": 59688, - "ĠAppliances": 96333, - "ĠApplicant": 91653, - "ĠApplicants": 97689, - "ĠApplication": 7323, - "ĠApplicationContext": 91518, - "ĠApplicationController": 30938, - "ĠApplicationDbContext": 73224, - "ĠApplicationException": 95818, - "ĠApplicationRecord": 54826, - "ĠApplicationUser": 93143, - "ĠApplications": 31525, - "ĠApplied": 42508, - "ĠApplies": 82165, - "ĠApply": 20552, - "ĠApplying": 89601, - "ĠAppointment": 56313, - "ĠApprec": 92821, - "ĠApprent": 68064, - "ĠApprentice": 83891, - "ĠAppro": 18642, - "ĠApproach": 53084, - "ĠAppropri": 85722, - "ĠApproval": 63777, - "ĠApproved": 51075, - "ĠApprox": 43819, - "ĠApproximately": 78804, - "ĠApps": 33020, - "ĠApr": 5076, - "ĠApril": 5813, - "ĠAprès": 133846, - "ĠApt": 96987, - "ĠApós": 140227, - "ĠAqu": 22959, - "ĠAqua": 71407, - "ĠAquarium": 80322, - "ĠAr": 1644, - "ĠAra": 87369, - "ĠArab": 10756, - "ĠArabia": 23061, - "ĠArabian": 72598, - "ĠArabic": 34117, - "ĠArabs": 57609, - "ĠAralık": 135680, - "ĠAraÅŁtırma": 142965, - "ĠArb": 86887, - "ĠArbeit": 57803, - "ĠArbeits": 70165, - "ĠArbit": 58795, - "ĠArbitrary": 97898, - "ĠArbor": 64539, - "ĠArc": 19689, - "ĠArcade": 64207, - "ĠArch": 9494, - "ĠArchae": 65002, - "ĠArchbishop": 81211, - "ĠArcher": 58879, - "ĠArchie": 90606, - "ĠArchitect": 24018, - "ĠArchitects": 77013, - "ĠArchitecture": 37843, - "ĠArchive": 29702, - "ĠArchived": 97750, - "ĠArchives": 37229, - "ĠArctic": 36418, - "ĠArd": 73907, - "ĠArduino": 46669, - "ĠAre": 8713, - "ĠArea": 12030, - "ĠAreas": 55716, - "ĠAren": 73504, - "ĠArena": 27047, - "ĠArg": 7638, - "ĠArgentina": 31064, - "ĠArgentine": 81722, - "ĠArgs": 17693, - "ĠArgument": 13818, - "ĠArgumentError": 76884, - "ĠArgumentException": 39808, - "ĠArgumentNullException": 29335, - "ĠArgumentOutOfRangeException": 76521, - "ĠArguments": 27702, - "ĠAri": 41526, - "ĠArial": 52771, - "ĠAriel": 75826, - "ĠArist": 51929, - "ĠAristotle": 77901, - "ĠArithmetic": 92984, - "ĠArizona": 16938, - "ĠArk": 22017, - "ĠArkadaÅŁ": 142026, - "ĠArkansas": 31690, - "ĠArlington": 58696, - "ĠArm": 12990, - "ĠArmed": 41394, - "ĠArmen": 38378, - "ĠArmenia": 71530, - "ĠArmenian": 66742, - "ĠArmor": 31183, - "ĠArmour": 60585, - "ĠArms": 43616, - "ĠArmstrong": 44866, - "ĠArmy": 13011, - "ĠArn": 35094, - "ĠArnold": 43212, - "ĠAround": 32816, - "ĠArr": 18418, - "ĠArrange": 40580, - "ĠArray": 2910, - "ĠArrayAdapter": 49640, - "ĠArrayBuffer": 83005, - "ĠArrayCollection": 98502, - "ĠArrayList": 5056, - "ĠArrays": 22966, - "ĠArrest": 71317, - "ĠArrival": 92098, - "ĠArrow": 33712, - "ĠArs": 72838, - "ĠArsenal": 32002, - "ĠArt": 5166, - "ĠArte": 97500, - "ĠArtem": 78266, - "ĠArthur": 27586, - "ĠArticle": 13355, - "ĠArticles": 28361, - "ĠArtifact": 86082, - "ĠArtificial": 58194, - "ĠArtikel": 50201, - "ĠArtist": 28359, - "ĠArtists": 52104, - "ĠArts": 17520, - "ĠArtÃŃculo": 140308, - "ĠAry": 86310, - "ĠAs": 1634, - "ĠAsc": 39560, - "ĠAsh": 14595, - "ĠAshe": 75179, - "ĠAsheville": 96538, - "ĠAshley": 37118, - "ĠAshton": 86618, - "ĠAsi": 87710, - "ĠAsia": 13622, - "ĠAsian": 14533, - "ĠAsians": 74308, - "ĠAside": 56094, - "ĠAsk": 20437, - "ĠAsked": 52663, - "ĠAsking": 95149, - "ĠAspect": 80053, - "ĠAspen": 93228, - "ĠAsphalt": 89314, - "ĠAss": 2688, - "ĠAssad": 37516, - "ĠAssange": 59407, - "ĠAssass": 98571, - "ĠAssassin": 60001, - "ĠAssault": 48971, - "ĠAssembly": 11738, - "ĠAssemblyCompany": 93891, - "ĠAssemblyCopyright": 94017, - "ĠAssemblyDescription": 91391, - "ĠAssemblyFileVersion": 98143, - "ĠAssemblyProduct": 92435, - "ĠAssemblyTitle": 89590, - "ĠAssemblyTrademark": 95827, - "ĠAssemblyVersion": 65675, - "ĠAssert": 5319, - "ĠAssertion": 46730, - "ĠAssertionError": 66226, - "ĠAssertions": 59806, - "ĠAssess": 81835, - "ĠAssessment": 36257, - "ĠAsset": 22605, - "ĠAssetImage": 92206, - "ĠAssets": 40638, - "ĠAssign": 31639, - "ĠAssigned": 62624, - "ĠAssignment": 34427, - "ĠAssist": 53249, - "ĠAssistance": 45765, - "ĠAssistant": 21388, - "ĠAssoc": 92376, - "ĠAssoci": 7156, - "ĠAssociate": 32368, - "ĠAssociated": 25403, - "ĠAssociates": 39101, - "ĠAssociation": 10024, - "ĠAssociations": 96089, - "ĠAssume": 62197, - "ĠAssumes": 98107, - "ĠAssuming": 63964, - "ĠAssurance": 83782, - "ĠAssy": 97013, - "ĠAst": 20113, - "ĠAster": 67498, - "ĠAston": 65674, - "ĠAstr": 38516, - "ĠAstro": 64129, - "ĠAstronomy": 94703, - "ĠAstroph": 93102, - "ĠAstros": 71458, - "ĠAsus": 75173, - "ĠAsync": 21433, - "ĠAsyncCallback": 91436, - "ĠAsyncStorage": 71621, - "ĠAsyncTask": 65697, - "ĠAsÃŃ": 133920, - "ĠAt": 2411, - "ĠAtari": 83876, - "ĠAtat": 140195, - "ĠAtatür": 140196, - "ĠAtatürk": 140197, - "ĠAth": 19698, - "ĠAthe": 84837, - "ĠAthen": 58552, - "ĠAthena": 78689, - "ĠAthens": 45826, - "ĠAthletic": 50406, - "ĠAthletics": 69731, - "ĠAtkins": 95984, - "ĠAtl": 10843, - "ĠAtlanta": 19440, - "ĠAtlantic": 22375, - "ĠAtlantis": 86935, - "ĠAtlas": 42343, - "ĠAtmos": 53828, - "ĠAtmospheric": 86497, - "ĠAtom": 39516, - "ĠAtomic": 30316, - "ĠAtomicInteger": 85038, - "ĠAtt": 7711, - "ĠAttach": 48384, - "ĠAttached": 83436, - "ĠAttachment": 55748, - "ĠAttack": 20790, - "ĠAttacks": 66142, - "ĠAttempt": 43517, - "ĠAttempts": 83300, - "ĠAttend": 78773, - "ĠAttendance": 78957, - "ĠAttention": 62020, - "ĠAttorney": 18412, - "ĠAttr": 50943, - "ĠAttribute": 16752, - "ĠAttributeError": 53631, - "ĠAttributeSet": 57440, - "ĠAttributes": 34127, - "ĠAttribution": 58318, - "ĠAu": 32050, - "ĠAub": 38587, - "ĠAuburn": 52349, - "ĠAuch": 55448, - "ĠAuckland": 53246, - "ĠAuction": 44100, - "ĠAud": 15066, - "ĠAudi": 39828, - "ĠAudience": 64900, - "ĠAudio": 12352, - "ĠAudioClip": 69137, - "ĠAudioManager": 95881, - "ĠAudioSource": 69221, - "ĠAudit": 47646, - "ĠAuditor": 61392, - "ĠAudrey": 90049, - "ĠAuf": 25714, - "ĠAug": 4928, - "ĠAugust": 6156, - "ĠAugusta": 83475, - "ĠAugustine": 73465, - "ĠAunt": 70222, - "ĠAur": 34631, - "ĠAura": 62286, - "ĠAure": 88215, - "ĠAurora": 46792, - "ĠAus": 20004, - "ĠAuschwitz": 92290, - "ĠAuss": 50244, - "ĠAussie": 86463, - "ĠAust": 12926, - "ĠAustin": 19260, - "ĠAustral": 5998, - "ĠAustralia": 8330, - "ĠAustralian": 13369, - "ĠAustralians": 55837, - "ĠAustria": 34898, - "ĠAustrian": 56969, - "ĠAuswahl": 95830, - "ĠAut": 9460, - "ĠAuth": 7366, - "ĠAuthService": 38598, - "ĠAuthentic": 46367, - "ĠAuthenticate": 93487, - "ĠAuthentication": 23537, - "ĠAuthenticationService": 94733, - "ĠAuthor": 6885, - "ĠAuthorities": 67315, - "ĠAuthority": 21914, - "ĠAuthorization": 30562, - "ĠAuthorized": 90569, - "ĠAuthors": 24124, - "ĠAutism": 77663, - "ĠAuto": 8979, - "ĠAutoMapper": 68082, - "ĠAutodesk": 90235, - "ĠAutof": 93822, - "ĠAutom": 19739, - "ĠAutomated": 94723, - "ĠAutomatic": 33981, - "ĠAutomatically": 70150, - "ĠAutomation": 53778, - "ĠAutomobile": 85141, - "ĠAutomotive": 54418, - "ĠAutonomous": 96448, - "ĠAutor": 56872, - "ĠAutos": 91552, - "ĠAutumn": 59802, - "ĠAux": 50059, - "ĠAuxiliary": 95500, - "ĠAuÃŁen": 142791, - "ĠAuÃŁerdem": 141196, - "ĠAv": 7519, - "ĠAva": 91657, - "ĠAvailability": 51810, - "ĠAvailable": 16136, - "ĠAval": 48978, - "ĠAvalanche": 98707, - "ĠAvatar": 37609, - "ĠAve": 21294, - "ĠAvec": 61193, - "ĠAvengers": 43097, - "ĠAvenue": 17131, - "ĠAverage": 23565, - "ĠAvery": 67480, - "ĠAvg": 62080, - "ĠAviation": 48947, - "ĠAviv": 65847, - "ĠAvoid": 34006, - "ĠAw": 17889, - "ĠAwait": 98195, - "ĠAwake": 41222, - "ĠAwakening": 93657, - "ĠAward": 17318, - "ĠAwards": 22658, - "ĠAware": 54540, - "ĠAwareness": 62035, - "ĠAway": 41481, - "ĠAwesome": 38305, - "ĠAws": 40083, - "ĠAx": 25171, - "ĠAxe": 71851, - "ĠAxel": 86679, - "ĠAxes": 89704, - "ĠAxios": 50214, - "ĠAxis": 34474, - "ĠAy": 23905, - "ĠAydın": 142228, - "ĠAynı": 139673, - "ĠAyrıca": 132839, - "ĠAz": 15395, - "ĠAzerbai": 64323, - "ĠAzerbaijan": 73477, - "ĠAzure": 34119, - "ĠAç": 139657, - "ĠAçık": 139658, - "ĠAÄŁ": 136777, - "ĠAÄŁust": 136778, - "ĠAÄŁustos": 136779, - "ĠB": 425, - "ĠBA": 33489, - "ĠBAB": 59311, - "ĠBACK": 32082, - "ĠBACKGROUND": 96614, - "ĠBAD": 47718, - "ĠBAL": 69145, - "ĠBALL": 83848, - "ĠBAM": 92127, - "ĠBANK": 66010, - "ĠBAR": 44187, - "ĠBAS": 10765, - "ĠBASE": 22194, - "ĠBASIC": 80048, - "ĠBASIS": 11389, - "ĠBAT": 77981, - "ĠBATCH": 98791, - "ĠBB": 18270, - "ĠBBB": 94458, - "ĠBBC": 18096, - "ĠBBQ": 45277, - "ĠBC": 18040, - "ĠBCE": 78577, - "ĠBCH": 61172, - "ĠBCHP": 78726, - "ĠBCM": 48220, - "ĠBD": 39310, - "ĠBDS": 59827, - "ĠBDSM": 84750, - "ĠBE": 7206, - "ĠBED": 82264, - "ĠBEEN": 74653, - "ĠBEFORE": 56482, - "ĠBEGIN": 22203, - "ĠBEL": 68259, - "ĠBELOW": 64393, - "ĠBEN": 82834, - "ĠBER": 93574, - "ĠBEST": 45782, - "ĠBET": 40349, - "ĠBETWEEN": 56639, - "ĠBF": 50504, - "ĠBFS": 90351, - "ĠBG": 43011, - "ĠBH": 67747, - "ĠBI": 47053, - "ĠBIG": 36854, - "ĠBILL": 92646, - "ĠBIN": 82609, - "ĠBIND": 91370, - "ĠBIO": 72066, - "ĠBIOS": 52863, - "ĠBIT": 24247, - "ĠBITS": 91149, - "ĠBJ": 86499, - "ĠBJP": 40067, - "ĠBK": 76782, - "ĠBL": 14850, - "ĠBLACK": 36647, - "ĠBLE": 51718, - "ĠBLL": 87933, - "ĠBLOCK": 28677, - "ĠBLUE": 55892, - "ĠBM": 19800, - "ĠBMC": 81706, - "ĠBMI": 46124, - "ĠBMP": 75194, - "ĠBMW": 29764, - "ĠBN": 45316, - "ĠBO": 7811, - "ĠBOARD": 51353, - "ĠBODY": 68583, - "ĠBOOK": 47098, - "ĠBOOL": 16573, - "ĠBOOLEAN": 59393, - "ĠBOOST": 21203, - "ĠBOOT": 83676, - "ĠBORDER": 84272, - "ĠBOT": 82330, - "ĠBOTH": 85489, - "ĠBOTTOM": 90571, - "ĠBOX": 52683, - "ĠBP": 29067, - "ĠBPM": 88219, - "ĠBR": 18803, - "ĠBRA": 73763, - "ĠBRAND": 89954, - "ĠBRE": 80562, - "ĠBREAK": 69647, - "ĠBRO": 77587, - "ĠBS": 27618, - "ĠBSD": 23102, - "ĠBSON": 76235, - "ĠBSP": 60417, - "ĠBST": 43541, - "ĠBT": 21111, - "ĠBTC": 36045, - "ĠBTN": 80415, - "ĠBTS": 82068, - "ĠBU": 54029, - "ĠBUF": 73178, - "ĠBUFF": 94924, - "ĠBUFFER": 52135, - "ĠBUG": 68534, - "ĠBUILD": 47697, - "ĠBUS": 22673, - "ĠBUSINESS": 26595, - "ĠBUT": 10915, - "ĠBUTTON": 41389, - "ĠBUY": 51762, - "ĠBV": 40100, - "ĠBW": 51120, - "ĠBX": 63275, - "ĠBY": 7710, - "ĠBYTE": 35377, - "ĠBYU": 92354, - "ĠBa": 14322, - "ĠBab": 25369, - "ĠBaba": 96352, - "ĠBabe": 73348, - "ĠBabies": 92692, - "ĠBaby": 20617, - "ĠBabylon": 63578, - "ĠBac": 68296, - "ĠBach": 41158, - "ĠBachelor": 40990, - "ĠBack": 6841, - "ĠBackbone": 53907, - "ĠBackend": 55260, - "ĠBackground": 24800, - "ĠBackpack": 71660, - "ĠBackup": 43438, - "ĠBacon": 61384, - "ĠBad": 11461, - "ĠBadRequest": 36403, - "ĠBadge": 59083, - "ĠBag": 19708, - "ĠBaghd": 52241, - "ĠBaghdad": 55218, - "ĠBags": 63723, - "ĠBah": 31329, - "ĠBahamas": 83129, - "ĠBahrain": 65639, - "ĠBai": 84908, - "ĠBail": 82144, - "ĠBailey": 42214, - "ĠBain": 81253, - "ĠBair": 97678, - "ĠBak": 35669, - "ĠBakan": 127762, - "ĠBakanlıģı": 135490, - "ĠBakanı": 138935, - "ĠBake": 52074, - "ĠBaker": 28392, - "ĠBakery": 90615, - "ĠBal": 19420, - "ĠBalance": 30846, - "ĠBalanced": 97109, - "ĠBald": 39102, - "ĠBaldwin": 54918, - "ĠBale": 83130, - "ĠBali": 63228, - "ĠBalk": 59869, - "ĠBall": 12836, - "ĠBallard": 97716, - "ĠBallet": 86636, - "ĠBalls": 70603, - "ĠBalt": 20581, - "ĠBaltic": 71989, - "ĠBaltimore": 23947, - "ĠBam": 55007, - "ĠBamboo": 96928, - "ĠBan": 22730, - "ĠBanana": 75824, - "ĠBanc": 83077, - "ĠBanco": 76687, - "ĠBand": 16936, - "ĠBands": 87302, - "ĠBang": 16914, - "ĠBangalore": 58125, - "ĠBangkok": 59016, - "ĠBangladesh": 38501, - "ĠBank": 8547, - "ĠBanking": 49499, - "ĠBanks": 37766, - "ĠBanner": 39614, - "ĠBannon": 54165, - "ĠBans": 93961, - "ĠBapt": 34876, - "ĠBaptist": 42648, - "ĠBar": 4716, - "ĠBarack": 23539, - "ĠBarang": 87607, - "ĠBarb": 46042, - "ĠBarbar": 90070, - "ĠBarbara": 31107, - "ĠBarber": 68135, - "ĠBarbie": 83239, - "ĠBarcelona": 26937, - "ĠBarcl": 67912, - "ĠBarclays": 88745, - "ĠBarcode": 86732, - "ĠBard": 63204, - "ĠBare": 60792, - "ĠBarg": 86714, - "ĠBark": 59529, - "ĠBarker": 80404, - "ĠBarn": 22421, - "ĠBarnes": 43854, - "ĠBarnett": 85320, - "ĠBarney": 93429, - "ĠBaron": 52907, - "ĠBarr": 31717, - "ĠBarrel": 63971, - "ĠBarrett": 55759, - "ĠBarrier": 70987, - "ĠBarry": 30758, - "ĠBars": 56106, - "ĠBart": 28527, - "ĠBarth": 88664, - "ĠBarton": 69217, - "ĠBas": 14662, - "ĠBase": 5351, - "ĠBaseActivity": 74645, - "ĠBaseController": 55461, - "ĠBaseEntity": 74082, - "ĠBaseModel": 64605, - "ĠBaseService": 98563, - "ĠBaseType": 88338, - "ĠBaseball": 37158, - "ĠBased": 20205, - "ĠBasel": 89458, - "ĠBasement": 92043, - "ĠBash": 38530, - "ĠBashar": 70260, - "ĠBasic": 14625, - "ĠBasically": 40712, - "ĠBasics": 67176, - "ĠBasil": 65970, - "ĠBasin": 60258, - "ĠBasis": 69028, - "ĠBasket": 33117, - "ĠBasketball": 46489, - "ĠBass": 35953, - "ĠBast": 45068, - "ĠBat": 16098, - "ĠBatch": 33904, - "ĠBates": 73862, - "ĠBath": 19161, - "ĠBathroom": 36832, - "ĠBaths": 74442, - "ĠBatman": 26707, - "ĠBaton": 85169, - "ĠBatt": 32167, - "ĠBattalion": 73639, - "ĠBatter": 72918, - "ĠBattery": 33612, - "ĠBattle": 16115, - "ĠBattlefield": 70635, - "ĠBattles": 70156, - "ĠBau": 73360, - "ĠBauer": 78601, - "ĠBaum": 82220, - "ĠBav": 76980, - "ĠBaxter": 91747, - "ĠBay": 9154, - "ĠBayer": 85420, - "ĠBayern": 55591, - "ĠBayesian": 98134, - "ĠBaylor": 70047, - "ĠBaz": 91711, - "ĠBaÅŁ": 97505, - "ĠBaÅŁb": 140160, - "ĠBaÅŁbakan": 140161, - "ĠBaÅŁkan": 125685, - "ĠBaÅŁkanlıģı": 142877, - "ĠBaÅŁkanı": 129580, - "ĠBbw": 85597, - "ĠBd": 73560, - "ĠBe": 2823, - "ĠBea": 60714, - "ĠBeach": 12721, - "ĠBeacon": 58620, - "ĠBeam": 50130, - "ĠBean": 33723, - "ĠBeans": 80736, - "ĠBear": 23985, - "ĠBeard": 87430, - "ĠBearing": 38668, - "ĠBearings": 64316, - "ĠBears": 35968, - "ĠBeast": 33182, - "ĠBeat": 26796, - "ĠBeatles": 54857, - "ĠBeats": 84520, - "ĠBeau": 79227, - "ĠBeaut": 14469, - "ĠBeautiful": 19490, - "ĠBeautifulSoup": 35910, - "ĠBeauty": 30585, - "ĠBeaver": 91434, - "ĠBec": 31046, - "ĠBecame": 90044, - "ĠBecause": 9211, - "ĠBeck": 28718, - "ĠBecker": 77384, - "ĠBeckham": 80003, - "ĠBecky": 87601, - "ĠBecome": 50278, - "ĠBed": 13093, - "ĠBedford": 72668, - "ĠBedroom": 32855, - "ĠBedrooms": 67730, - "ĠBeds": 66254, - "ĠBee": 37430, - "ĠBeef": 63125, - "ĠBeen": 50578, - "ĠBeer": 33384, - "ĠBeet": 73949, - "ĠBeetle": 91696, - "ĠBefore": 13235, - "ĠBeg": 43693, - "ĠBegin": 18597, - "ĠBeginner": 92175, - "ĠBeginners": 90168, - "ĠBeginning": 51850, - "ĠBegins": 91308, - "ĠBeh": 14612, - "ĠBehavior": 26675, - "ĠBehaviorSubject": 61638, - "ĠBehavioral": 71984, - "ĠBehaviour": 79254, - "ĠBehind": 42374, - "ĠBei": 47436, - "ĠBeijing": 26549, - "ĠBeing": 20690, - "ĠBeirut": 94311, - "ĠBeispiel": 79192, - "ĠBeit": 75030, - "ĠBeitrag": 98552, - "ĠBek": 70219, - "ĠBel": 7828, - "ĠBelarus": 69506, - "ĠBelfast": 54239, - "ĠBelg": 22475, - "ĠBelgi": 143391, - "ĠBelgian": 48062, - "ĠBelgium": 32961, - "ĠBelgië": 143392, - "ĠBelieve": 58021, - "ĠBelize": 97004, - "ĠBell": 17884, - "ĠBella": 54500, - "ĠBelle": 50508, - "ĠBellev": 85605, - "ĠBelly": 96585, - "ĠBelmont": 94966, - "ĠBelow": 21193, - "ĠBelt": 32893, - "ĠBen": 7355, - "ĠBench": 35258, - "ĠBenchmark": 61622, - "ĠBend": 47738, - "ĠBender": 96545, - "ĠBene": 86591, - "ĠBened": 51620, - "ĠBenedict": 61145, - "ĠBenef": 26276, - "ĠBenefit": 66350, - "ĠBenefits": 38095, - "ĠBeng": 25250, - "ĠBengal": 49020, - "ĠBengals": 63829, - "ĠBenghazi": 67768, - "ĠBenjamin": 29311, - "ĠBenn": 29780, - "ĠBennett": 38286, - "ĠBenny": 94185, - "ĠBenson": 71188, - "ĠBent": 40514, - "ĠBentley": 73420, - "ĠBenton": 92683, - "ĠBenz": 77542, - "ĠBer": 8907, - "ĠBere": 43157, - "ĠBereich": 74219, - "ĠBerg": 30682, - "ĠBergen": 78999, - "ĠBerger": 68625, - "ĠBerk": 50191, - "ĠBerkeley": 32008, - "ĠBerkshire": 90275, - "ĠBerlin": 19846, - "ĠBerm": 75072, - "ĠBermuda": 90266, - "ĠBern": 14168, - "ĠBernard": 34252, - "ĠBernardino": 85757, - "ĠBernie": 29224, - "ĠBernstein": 81315, - "ĠBerry": 43585, - "ĠBers": 86275, - "ĠBert": 50675, - "ĠBes": 18078, - "ĠBesch": 77814, - "ĠBesides": 30809, - "ĠBest": 7107, - "ĠBeste": 69351, - "ĠBet": 13017, - "ĠBeta": 34243, - "ĠBeth": 28003, - "ĠBethesda": 78331, - "ĠBethlehem": 94958, - "ĠBett": 67588, - "ĠBetter": 23434, - "ĠBetting": 83985, - "ĠBetty": 55011, - "ĠBetween": 27133, - "ĠBever": 37999, - "ĠBeverage": 92035, - "ĠBeverly": 57674, - "ĠBew": 37210, - "ĠBewert": 85651, - "ĠBey": 53892, - "ĠBeyond": 30786, - "ĠBez": 96889, - "ĠBh": 30830, - "ĠBhar": 66592, - "ĠBi": 12100, - "ĠBian": 66945, - "ĠBias": 82990, - "ĠBiaÅĤ": 139425, - "ĠBib": 29445, - "ĠBible": 16947, - "ĠBibli": 61826, - "ĠBiblical": 67101, - "ĠBicycle": 78347, - "ĠBid": 40402, - "ĠBiden": 37080, - "ĠBieber": 76220, - "ĠBien": 73556, - "ĠBig": 6164, - "ĠBigDecimal": 20618, - "ĠBigInt": 62608, - "ĠBigInteger": 34042, - "ĠBigNumber": 53673, - "ĠBiggest": 85521, - "ĠBihar": 92274, - "ĠBij": 79566, - "ĠBik": 75378, - "ĠBike": 37830, - "ĠBil": 38058, - "ĠBild": 44492, - "ĠBilder": 56580, - "ĠBill": 8596, - "ĠBillboard": 66193, - "ĠBilling": 72450, - "ĠBillion": 65709, - "ĠBills": 45640, - "ĠBilly": 32819, - "ĠBin": 29344, - "ĠBinary": 17718, - "ĠBinaryTree": 98070, - "ĠBind": 29189, - "ĠBinder": 90163, - "ĠBinding": 25901, - "ĠBindingFlags": 58678, - "ĠBing": 53487, - "ĠBingo": 92048, - "ĠBio": 23525, - "ĠBiography": 78169, - "ĠBiol": 80794, - "ĠBiological": 62611, - "ĠBiology": 38923, - "ĠBiom": 90508, - "ĠBios": 76848, - "ĠBip": 97848, - "ĠBir": 36819, - "ĠBirch": 86988, - "ĠBird": 23331, - "ĠBirds": 56528, - "ĠBirliÄŁi": 141302, - "ĠBirmingham": 35837, - "ĠBirth": 35027, - "ĠBirthday": 36240, - "ĠBis": 42584, - "ĠBishop": 33242, - "ĠBison": 88043, - "ĠBit": 6495, - "ĠBitConverter": 72884, - "ĠBitSet": 57227, - "ĠBitcoin": 13127, - "ĠBitcoins": 81825, - "ĠBite": 88208, - "ĠBitmap": 17533, - "ĠBitmapFactory": 69896, - "ĠBits": 49457, - "ĠBitte": 84276, - "ĠBiz": 61450, - "ĠBj": 68741, - "ĠBl": 2502, - "ĠBlack": 5235, - "ĠBlackBerry": 63428, - "ĠBlackburn": 88353, - "ĠBlackhawks": 92392, - "ĠBlackjack": 87092, - "ĠBlacks": 66488, - "ĠBlade": 35980, - "ĠBlades": 88960, - "ĠBlair": 41869, - "ĠBlake": 30894, - "ĠBlanc": 68925, - "ĠBlanch": 91429, - "ĠBlanco": 98823, - "ĠBlank": 42441, - "ĠBlasio": 92393, - "ĠBlast": 57336, - "ĠBlaze": 83427, - "ĠBlazers": 89689, - "ĠBle": 38185, - "ĠBlend": 54148, - "ĠBlender": 87568, - "ĠBless": 43261, - "ĠBlessed": 75997, - "ĠBlick": 81287, - "ĠBlind": 54270, - "ĠBlink": 73679, - "ĠBliss": 91570, - "ĠBlitz": 88128, - "ĠBlizzard": 52033, - "ĠBlo": 39391, - "ĠBlob": 49439, - "ĠBloc": 71396, - "ĠBlock": 8362, - "ĠBlockPos": 79064, - "ĠBlockchain": 42885, - "ĠBlocked": 63996, - "ĠBlocking": 81945, - "ĠBlockly": 81918, - "ĠBlocks": 45678, - "ĠBlog": 14163, - "ĠBlogger": 87675, - "ĠBlogs": 75236, - "ĠBlond": 91998, - "ĠBlonde": 52456, - "ĠBlood": 20070, - "ĠBloody": 93572, - "ĠBloom": 24503, - "ĠBloomberg": 36553, - "ĠBloss": 88759, - "ĠBlow": 45852, - "ĠBlowjob": 84010, - "ĠBlu": 37769, - "ĠBlue": 8697, - "ĠBlueprint": 30003, - "ĠBlueprintReadOnly": 93125, - "ĠBlues": 32325, - "ĠBluetooth": 23843, - "ĠBlur": 98160, - "ĠBlvd": 49441, - "ĠBo": 2516, - "ĠBoard": 8751, - "ĠBoards": 71086, - "ĠBoat": 44232, - "ĠBob": 14261, - "ĠBobby": 37381, - "ĠBoca": 98557, - "ĠBod": 44602, - "ĠBodies": 80346, - "ĠBody": 13958, - "ĠBoeh": 69197, - "ĠBoehner": 77167, - "ĠBoeing": 41859, - "ĠBog": 41548, - "ĠBoh": 51350, - "ĠBoiler": 45665, - "ĠBoise": 78573, - "ĠBol": 24043, - "ĠBold": 46002, - "ĠBolivia": 76610, - "ĠBollywood": 64186, - "ĠBols": 67257, - "ĠBolshevik": 91401, - "ĠBolt": 45947, - "ĠBolton": 61577, - "ĠBom": 47352, - "ĠBomb": 32809, - "ĠBombay": 96613, - "ĠBon": 13481, - "ĠBond": 23618, - "ĠBonds": 84026, - "ĠBone": 45601, - "ĠBones": 71299, - "ĠBonnie": 73195, - "ĠBonus": 28198, - "ĠBoo": 73684, - "ĠBook": 5893, - "ĠBooker": 64995, - "ĠBooking": 44176, - "ĠBookmark": 55418, - "ĠBooks": 17833, - "ĠBool": 12608, - "ĠBoolean": 6992, - "ĠBoom": 53411, - "ĠBoone": 90595, - "ĠBoost": 33407, - "ĠBooster": 74192, - "ĠBoot": 15004, - "ĠBooth": 63270, - "ĠBoots": 45468, - "ĠBootstrap": 26059, - "ĠBor": 22918, - "ĠBord": 97885, - "ĠBordeaux": 83957, - "ĠBorder": 13992, - "ĠBorderLayout": 48357, - "ĠBorderRadius": 31594, - "ĠBorderSide": 72401, - "ĠBorders": 80712, - "ĠBorg": 64482, - "ĠBoris": 51671, - "ĠBorn": 37816, - "ĠBorough": 84203, - "ĠBorrow": 77947, - "ĠBos": 27971, - "ĠBosch": 71225, - "ĠBose": 93458, - "ĠBosnia": 76328, - "ĠBoss": 31569, - "ĠBoston": 10196, - "ĠBot": 23007, - "ĠBoth": 11733, - "ĠBott": 36230, - "ĠBottle": 53985, - "ĠBottom": 25737, - "ĠBou": 29954, - "ĠBought": 77162, - "ĠBoulder": 55643, - "ĠBoulevard": 47440, - "ĠBound": 37176, - "ĠBoundary": 76416, - "ĠBounds": 69130, - "ĠBounty": 94189, - "ĠBour": 38375, - "ĠBourbon": 92504, - "ĠBout": 63103, - "ĠBoutique": 90117, - "ĠBow": 18436, - "ĠBowen": 95520, - "ĠBowie": 67247, - "ĠBowl": 20288, - "ĠBowling": 82969, - "ĠBowman": 84596, - "ĠBox": 8261, - "ĠBoxDecoration": 36093, - "ĠBoxFit": 69354, - "ĠBoxes": 71267, - "ĠBoxing": 71583, - "ĠBoy": 16180, - "ĠBoyd": 62621, - "ĠBoyle": 82059, - "ĠBoys": 29757, - "ĠBr": 3240, - "ĠBra": 25453, - "ĠBrace": 69206, - "ĠBracket": 85497, - "ĠBrad": 17041, - "ĠBradford": 59829, - "ĠBradley": 36448, - "ĠBrady": 35370, - "ĠBrah": 76984, - "ĠBrain": 30317, - "ĠBrake": 75261, - "ĠBram": 70784, - "ĠBran": 75918, - "ĠBranch": 25119, - "ĠBrand": 16430, - "ĠBrandon": 31766, - "ĠBrands": 54232, - "ĠBras": 61124, - "ĠBrasil": 41925, - "ĠBrass": 58029, - "ĠBraun": 69603, - "ĠBrave": 69208, - "ĠBraves": 70677, - "ĠBravo": 70723, - "ĠBray": 87820, - "ĠBraz": 72311, - "ĠBrazil": 15948, - "ĠBrazilian": 34983, - "ĠBre": 11427, - "ĠBread": 49041, - "ĠBreak": 15623, - "ĠBreakfast": 43191, - "ĠBreaking": 51524, - "ĠBreast": 56498, - "ĠBreath": 57192, - "ĠBreed": 74152, - "ĠBreitbart": 55876, - "ĠBren": 43708, - "ĠBrend": 38964, - "ĠBrenda": 89034, - "ĠBrendan": 55843, - "ĠBrennan": 58750, - "ĠBrent": 46331, - "ĠBret": 71677, - "ĠBrett": 39103, - "ĠBrew": 20923, - "ĠBrewer": 82967, - "ĠBrewers": 80411, - "ĠBrewery": 65627, - "ĠBrewing": 43113, - "ĠBrexit": 23907, - "ĠBri": 54758, - "ĠBrian": 17083, - "ĠBrick": 44614, - "ĠBrid": 31337, - "ĠBride": 77060, - "ĠBridge": 19874, - "ĠBridges": 76239, - "ĠBrief": 36518, - "ĠBrig": 37789, - "ĠBrigade": 66214, - "ĠBriggs": 93117, - "ĠBrigham": 95185, - "ĠBright": 26410, - "ĠBrighton": 57419, - "ĠBrill": 66644, - "ĠBrilliant": 93274, - "ĠBring": 39124, - "ĠBringing": 97073, - "ĠBris": 43731, - "ĠBrisbane": 46235, - "ĠBristol": 43939, - "ĠBrit": 5450, - "ĠBritain": 13224, - "ĠBritann": 97420, - "ĠBritish": 7855, - "ĠBritt": 63017, - "ĠBrittany": 88154, - "ĠBro": 5906, - "ĠBroad": 15894, - "ĠBroadcast": 31965, - "ĠBroadcastReceiver": 96064, - "ĠBroadcasting": 63460, - "ĠBroadcom": 95917, - "ĠBroadway": 36676, - "ĠBrock": 47577, - "ĠBroken": 53583, - "ĠBroker": 52701, - "ĠBrom": 64598, - "ĠBron": 19820, - "ĠBroncos": 41594, - "ĠBronx": 65136, - "ĠBronze": 44867, - "ĠBrook": 15605, - "ĠBrooke": 78461, - "ĠBrooklyn": 25748, - "ĠBrooks": 38019, - "ĠBros": 33221, - "ĠBrother": 26348, - "ĠBrotherhood": 49236, - "ĠBrothers": 33079, - "ĠBrow": 28377, - "ĠBrown": 10471, - "ĠBrowns": 45199, - "ĠBrowse": 41712, - "ĠBrowser": 16482, - "ĠBrowserAnimationsModule": 71436, - "ĠBrowserModule": 37371, - "ĠBrowserRouter": 62485, - "ĠBru": 18697, - "ĠBruce": 23845, - "ĠBruins": 64902, - "ĠBrun": 34461, - "ĠBruno": 51110, - "ĠBrunswick": 60150, - "ĠBrush": 32988, - "ĠBrushes": 66872, - "ĠBrussels": 37169, - "ĠBrut": 70725, - "ĠBry": 19248, - "ĠBryan": 36353, - "ĠBryant": 39592, - "ĠBryce": 83024, - "ĠBs": 82186, - "ĠBtn": 56308, - "ĠBu": 27227, - "ĠBubble": 53324, - "ĠBucc": 78247, - "ĠBuccane": 85770, - "ĠBuccaneers": 92068, - "ĠBuch": 33278, - "ĠBuchanan": 84190, - "ĠBuck": 26064, - "ĠBucket": 47768, - "ĠBuckingham": 94911, - "ĠBuckley": 93303, - "ĠBucks": 65048, - "ĠBud": 36135, - "ĠBudapest": 69595, - "ĠBudd": 18586, - "ĠBuddh": 49518, - "ĠBuddha": 44954, - "ĠBuddhism": 60224, - "ĠBuddhist": 46741, - "ĠBuddy": 59526, - "ĠBudget": 27269, - "ĠBuen": 53841, - "ĠBuenos": 68073, - "ĠBuf": 69013, - "ĠBuff": 18961, - "ĠBuffalo": 31389, - "ĠBuffer": 10312, - "ĠBuffered": 30702, - "ĠBufferedImage": 56170, - "ĠBufferedReader": 25568, - "ĠBufferedWriter": 63129, - "ĠBuffett": 85452, - "ĠBuffy": 70840, - "ĠBug": 30501, - "ĠBugs": 86501, - "ĠBugün": 138213, - "ĠBuild": 7854, - "ĠBuilder": 20626, - "ĠBuilders": 75748, - "ĠBuilding": 16858, - "ĠBuildings": 73148, - "ĠBuilds": 67118, - "ĠBuilt": 33054, - "ĠBuk": 69850, - "ĠBukkit": 94672, - "ĠBul": 13497, - "ĠBulg": 41250, - "ĠBulgaria": 58719, - "ĠBulgarian": 88624, - "ĠBulk": 60920, - "ĠBull": 21622, - "ĠBulld": 56654, - "ĠBulldogs": 75464, - "ĠBullet": 31812, - "ĠBulletin": 59963, - "ĠBulls": 43689, - "ĠBun": 65247, - "ĠBund": 29608, - "ĠBundes": 46307, - "ĠBundesliga": 84803, - "ĠBundle": 13182, - "ĠBundy": 95821, - "ĠBunifu": 67321, - "ĠBunny": 72062, - "ĠBur": 12369, - "ĠBurb": 91633, - "ĠBureau": 21802, - "ĠBurg": 40009, - "ĠBurger": 51771, - "ĠBurgess": 97467, - "ĠBurk": 70640, - "ĠBurke": 49623, - "ĠBurl": 61333, - "ĠBurlington": 72505, - "ĠBurma": 91571, - "ĠBurn": 18039, - "ĠBurnett": 98894, - "ĠBurning": 54692, - "ĠBurns": 49916, - "ĠBurr": 86184, - "ĠBurst": 77467, - "ĠBurton": 53655, - "ĠBus": 18598, - "ĠBush": 14079, - "ĠBusiness": 8025, - "ĠBusinessException": 96994, - "ĠBusinesses": 70090, - "ĠBust": 70333, - "ĠBuster": 95487, - "ĠBusty": 85823, - "ĠBusy": 94709, - "ĠBut": 1988, - "ĠButler": 37225, - "ĠButt": 69349, - "ĠButter": 30357, - "ĠButterKnife": 95217, - "ĠButterfly": 77720, - "ĠButton": 6601, - "ĠButtons": 52700, - "ĠBuy": 11292, - "ĠBuyer": 61078, - "ĠBuyers": 88707, - "ĠBuying": 54309, - "ĠBuzz": 37951, - "ĠBuzzFeed": 71822, - "ĠBy": 3216, - "ĠByVal": 27089, - "ĠBye": 89325, - "ĠByrne": 80321, - "ĠByron": 70884, - "ĠByte": 10906, - "ĠByteArray": 32920, - "ĠByteArrayInputStream": 85625, - "ĠByteArrayOutputStream": 56263, - "ĠByteBuffer": 50299, - "ĠByteString": 95302, - "ĠBytes": 30024, - "ĠByz": 81660, - "ĠByÅĤ": 139727, - "ĠBá": 132040, - "ĠBáo": 133602, - "ĠBên": 133802, - "ĠBình": 129336, - "ĠBöl": 138918, - "ĠBölge": 138919, - "ĠBöyle": 136064, - "ĠBü": 68557, - "ĠBücher": 140918, - "ĠBürger": 136458, - "ĠBüro": 141506, - "ĠBüyük": 127827, - "ĠBüyükÅŁehir": 140018, - "ĠBÃł": 132934, - "ĠBÃłi": 130590, - "ĠBÃŃ": 134082, - "ĠBạn": 129096, - "ĠBản": 130164, - "ĠBảo": 132847, - "ĠBắc": 130726, - "ĠBá»ĩnh": 135256, - "ĠBá»Ļ": 129029, - "ĠBợi": 139194, - "ĠC": 356, - "ĠCA": 9183, - "ĠCAB": 80117, - "ĠCACHE": 65656, - "ĠCAD": 47265, - "ĠCAL": 32907, - "ĠCALC": 88249, - "ĠCALL": 25752, - "ĠCALLBACK": 73293, - "ĠCAM": 28297, - "ĠCAMERA": 66798, - "ĠCAN": 19508, - "ĠCAP": 26101, - "ĠCAPITAL": 77287, - "ĠCAR": 27776, - "ĠCARD": 41700, - "ĠCARE": 62327, - "ĠCART": 78032, - "ĠCAS": 41790, - "ĠCASCADE": 97059, - "ĠCASE": 38319, - "ĠCAST": 61687, - "ĠCAT": 43981, - "ĠCATEGORY": 86047, - "ĠCAUSED": 30377, - "ĠCActive": 77704, - "ĠCB": 21318, - "ĠCBC": 45512, - "ĠCBD": 22059, - "ĠCBS": 24029, - "ĠCC": 13534, - "ĠCCC": 91474, - "ĠCCD": 92733, - "ĠCCP": 75921, - "ĠCCS": 73092, - "ĠCCT": 54997, - "ĠCCTV": 70238, - "ĠCD": 11078, - "ĠCDC": 39309, - "ĠCDDL": 97919, - "ĠCDN": 88365, - "ĠCDs": 61337, - "ĠCE": 26711, - "ĠCEL": 90421, - "ĠCELL": 59695, - "ĠCENT": 61963, - "ĠCENTER": 65992, - "ĠCEO": 12156, - "ĠCEOs": 74217, - "ĠCERT": 62357, - "ĠCES": 80413, - "ĠCET": 87320, - "ĠCF": 20795, - "ĠCFG": 46825, - "ĠCFL": 96316, - "ĠCFO": 93752, - "ĠCFR": 69821, - "ĠCG": 6159, - "ĠCGAffineTransform": 68789, - "ĠCGContext": 54243, - "ĠCGFloat": 15931, - "ĠCGI": 63427, - "ĠCGPoint": 26353, - "ĠCGPointMake": 59747, - "ĠCGRect": 16006, - "ĠCGRectGet": 62250, - "ĠCGRectMake": 32830, - "ĠCGSize": 31815, - "ĠCGSizeMake": 78687, - "ĠCH": 6826, - "ĠCHANGE": 43039, - "ĠCHANNEL": 58756, - "ĠCHAPTER": 95324, - "ĠCHAR": 23997, - "ĠCHARACTER": 70805, - "ĠCHARSET": 97701, - "ĠCHE": 49521, - "ĠCHECK": 13644, - "ĠCHILD": 72520, - "ĠCHIP": 76483, - "ĠCHK": 87276, - "ĠCHO": 82353, - "ĠCHR": 61576, - "ĠCHRIST": 83565, - "ĠCHUNK": 98617, - "ĠCHtml": 51336, - "ĠCI": 20694, - "ĠCIA": 21474, - "ĠCID": 68212, - "ĠCIF": 97590, - "ĠCIM": 82364, - "ĠCIS": 74780, - "ĠCIT": 97477, - "ĠCITY": 46552, - "ĠCJ": 60876, - "ĠCK": 30066, - "ĠCL": 6976, - "ĠCLAIM": 25825, - "ĠCLASS": 27939, - "ĠCLEAN": 77000, - "ĠCLEAR": 55219, - "ĠCLI": 39277, - "ĠCLICK": 57232, - "ĠCLIENT": 40297, - "ĠCLK": 61342, - "ĠCLL": 50296, - "ĠCLLocation": 52659, - "ĠCLLocationCoordinate": 97363, - "ĠCLOCK": 84043, - "ĠCLOSE": 49706, - "ĠCLOSED": 97313, - "ĠCLR": 60690, - "ĠCLUB": 92926, - "ĠCM": 18090, - "ĠCMD": 26913, - "ĠCMP": 72601, - "ĠCMS": 36241, - "ĠCN": 24872, - "ĠCNBC": 72259, - "ĠCNC": 59697, - "ĠCNN": 19769, - "ĠCNS": 92543, - "ĠCO": 7284, - "ĠCOD": 67401, - "ĠCODE": 13765, - "ĠCOL": 25578, - "ĠCOLL": 62508, - "ĠCOLLECTION": 94076, - "ĠCOLOR": 25419, - "ĠCOLORS": 86822, - "ĠCOLUMN": 39023, - "ĠCOM": 7682, - "ĠCOMM": 51285, - "ĠCOMMAND": 40218, - "ĠCOMMENT": 50505, - "ĠCOMMENTS": 94742, - "ĠCOMMIT": 83230, - "ĠCOMMON": 66677, - "ĠCOMP": 21968, - "ĠCOMPANY": 65448, - "ĠCOMPLETE": 77031, - "ĠCOMPONENT": 70303, - "ĠCOMPUT": 65798, - "ĠCOMPUTER": 88801, - "ĠCON": 3418, - "ĠCONCAT": 78143, - "ĠCONDITION": 10985, - "ĠCONDITIONS": 11342, - "ĠCONF": 45189, - "ĠCONFIG": 13202, - "ĠCONNECT": 63022, - "ĠCONNECTION": 24006, - "ĠCONS": 72906, - "ĠCONSEQUENTIAL": 27415, - "ĠCONST": 29602, - "ĠCONSTANT": 99051, - "ĠCONSTANTS": 93233, - "ĠCONSTRAINT": 93763, - "ĠCONT": 16120, - "ĠCONTACT": 62487, - "ĠCONTENT": 35768, - "ĠCONTEXT": 87336, - "ĠCONTR": 11570, - "ĠCONTRACT": 17126, - "ĠCONTRIBUT": 21076, - "ĠCONTRIBUTORS": 21740, - "ĠCONTROL": 53179, - "ĠCONVERT": 67287, - "ĠCOOKIE": 41565, - "ĠCOP": 67572, - "ĠCOPY": 12249, - "ĠCOPYING": 43263, - "ĠCOPYRIGHT": 14537, - "ĠCOR": 26465, - "ĠCORE": 50183, - "ĠCORPOR": 79383, - "ĠCORPORATION": 88740, - "ĠCORS": 90666, - "ĠCOS": 72944, - "ĠCOST": 63712, - "ĠCOUNT": 23989, - "ĠCOUNTY": 76076, - "ĠCOUR": 53448, - "ĠCOURT": 95700, - "ĠCOVER": 95039, - "ĠCOVID": 19966, - "ĠCP": 15284, - "ĠCPA": 86277, - "ĠCPC": 95146, - "ĠCPF": 45450, - "ĠCPI": 86539, - "ĠCPL": 89480, - "ĠCPP": 37671, - "ĠCPPUNIT": 51526, - "ĠCPR": 76798, - "ĠCPS": 71784, - "ĠCPU": 13940, - "ĠCPUs": 65475, - "ĠCR": 12617, - "ĠCRA": 93667, - "ĠCRC": 29395, - "ĠCRE": 49608, - "ĠCREATE": 30776, - "ĠCREATED": 92794, - "ĠCRM": 40341, - "ĠCROSS": 97773, - "ĠCRS": 94242, - "ĠCRT": 95034, - "ĠCRUD": 64133, - "ĠCS": 10006, - "ĠCSA": 93407, - "ĠCSC": 79676, - "ĠCSI": 87064, - "ĠCSL": 71656, - "ĠCSP": 90510, - "ĠCSR": 62976, - "ĠCSRF": 78595, - "ĠCSS": 15179, - "ĠCST": 58939, - "ĠCSV": 27445, - "ĠCString": 56956, - "ĠCT": 18572, - "ĠCTL": 86886, - "ĠCTRL": 52486, - "ĠCType": 18623, - "ĠCU": 40743, - "ĠCUDA": 54809, - "ĠCUR": 18548, - "ĠCURL": 70669, - "ĠCURLOPT": 22244, - "ĠCURRENT": 43107, - "ĠCUSTOM": 43299, - "ĠCUT": 72857, - "ĠCV": 14165, - "ĠCVE": 45769, - "ĠCVS": 77365, - "ĠCW": 40035, - "ĠCWE": 50860, - "ĠCX": 48483, - "ĠCY": 29569, - "ĠCZ": 69775, - "ĠCa": 14413, - "ĠCab": 26108, - "ĠCabin": 24764, - "ĠCabinet": 32946, - "ĠCabinets": 77389, - "ĠCable": 33485, - "ĠCabr": 98794, - "ĠCache": 19479, - "ĠCached": 74205, - "ĠCad": 32060, - "ĠCadillac": 77495, - "ĠCaesar": 53653, - "ĠCaf": 52641, - "ĠCafe": 42773, - "ĠCafé": 65671, - "ĠCage": 57889, - "ĠCah": 95010, - "ĠCain": 66088, - "ĠCair": 94841, - "ĠCairo": 52550, - "ĠCait": 75332, - "ĠCaj": 95779, - "ĠCake": 32760, - "ĠCal": 3319, - "ĠCalc": 34215, - "ĠCalcium": 95004, - "ĠCalcul": 31359, - "ĠCalculate": 20517, - "ĠCalculates": 59853, - "ĠCalculation": 74216, - "ĠCalculator": 36028, - "ĠCald": 71795, - "ĠCalder": 75300, - "ĠCaldwell": 81224, - "ĠCaleb": 83062, - "ĠCalendar": 16841, - "ĠCalgary": 37875, - "ĠCalibration": 96295, - "ĠCalif": 40789, - "ĠCaliforn": 78769, - "ĠCalifornia": 7043, - "ĠCall": 7143, - "ĠCallable": 53123, - "ĠCallback": 22668, - "ĠCalled": 21154, - "ĠCaller": 56068, - "ĠCalling": 32291, - "ĠCallingConvention": 58413, - "ĠCalls": 40127, - "ĠCalories": 82937, - "ĠCalvin": 50883, - "ĠCam": 8055, - "ĠCamb": 33796, - "ĠCambodia": 61038, - "ĠCambridge": 23641, - "ĠCamden": 82468, - "ĠCame": 75178, - "ĠCamel": 68154, - "ĠCamera": 14332, - "ĠCameras": 88770, - "ĠCameron": 26426, - "ĠCameroon": 94008, - "ĠCamp": 9512, - "ĠCampaign": 26545, - "ĠCampbell": 29424, - "ĠCamping": 72041, - "ĠCampo": 58153, - "ĠCampos": 88465, - "ĠCampus": 38580, - "ĠCan": 2980, - "ĠCanada": 6864, - "ĠCanadian": 11888, - "ĠCanadians": 35162, - "ĠCanadiens": 87593, - "ĠCanal": 52648, - "ĠCanary": 98956, - "ĠCanberra": 68790, - "ĠCanc": 80323, - "ĠCancel": 23542, - "ĠCancellationToken": 37237, - "ĠCancer": 25153, - "ĠCand": 69554, - "ĠCandid": 93816, - "ĠCandidate": 49583, - "ĠCandidates": 64438, - "ĠCandle": 72897, - "ĠCandy": 48428, - "ĠCann": 29468, - "ĠCannabis": 48565, - "ĠCannes": 83520, - "ĠCannon": 50723, - "ĠCannot": 34655, - "ĠCanon": 38116, - "ĠCanonical": 95177, - "ĠCant": 41831, - "ĠCanter": 74893, - "ĠCanterbury": 83500, - "ĠCanton": 72366, - "ĠCanucks": 80502, - "ĠCanvas": 25698, - "ĠCanyon": 40460, - "ĠCap": 8012, - "ĠCapability": 98551, - "ĠCapac": 97103, - "ĠCapacity": 40110, - "ĠCapcom": 93553, - "ĠCape": 28615, - "ĠCapital": 18374, - "ĠCapitals": 94284, - "ĠCapitol": 31533, - "ĠCaps": 43365, - "ĠCapt": 16603, - "ĠCaptain": 21316, - "ĠCaption": 37600, - "ĠCapture": 39885, - "ĠCar": 3261, - "ĠCara": 78913, - "ĠCarb": 68477, - "ĠCarbon": 21487, - "ĠCard": 6795, - "ĠCardiff": 60592, - "ĠCardinal": 45914, - "ĠCardinals": 43327, - "ĠCardio": 91876, - "ĠCards": 26766, - "ĠCare": 10627, - "ĠCareer": 40476, - "ĠCareers": 98355, - "ĠCarey": 65218, - "ĠCargo": 61288, - "ĠCaribbean": 34274, - "ĠCarl": 21998, - "ĠCarla": 93770, - "ĠCarlo": 57770, - "ĠCarlos": 29297, - "ĠCarlson": 69973, - "ĠCarlton": 89878, - "ĠCarly": 78091, - "ĠCarm": 34452, - "ĠCarmen": 69958, - "ĠCarn": 31649, - "ĠCarnegie": 63273, - "ĠCarnival": 77744, - "ĠCarol": 10252, - "ĠCarolina": 12740, - "ĠCaroline": 53391, - "ĠCarolyn": 82258, - "ĠCarousel": 66202, - "ĠCarp": 48777, - "ĠCarpenter": 67038, - "ĠCarpet": 71208, - "ĠCarr": 29374, - "ĠCarrie": 64451, - "ĠCarrier": 50861, - "ĠCarroll": 46109, - "ĠCarry": 62742, - "ĠCars": 35131, - "ĠCarson": 40176, - "ĠCart": 13115, - "ĠCarter": 24563, - "ĠCartesian": 80715, - "ĠCartoon": 68430, - "ĠCary": 91564, - "ĠCas": 11054, - "ĠCasa": 50071, - "ĠCasc": 95006, - "ĠCascade": 56770, - "ĠCascadeType": 90290, - "ĠCase": 11538, - "ĠCases": 46024, - "ĠCasey": 44524, - "ĠCash": 22338, - "ĠCasino": 20481, - "ĠCasinos": 76904, - "ĠCass": 25442, - "ĠCassandra": 81242, - "ĠCassidy": 91797, - "ĠCast": 11264, - "ĠCastillo": 95683, - "ĠCasting": 65748, - "ĠCastle": 26889, - "ĠCastro": 46524, - "ĠCasual": 48822, - "ĠCat": 17358, - "ĠCata": 88472, - "ĠCatal": 31444, - "ĠCatalan": 80844, - "ĠCatalog": 31221, - "ĠCatalonia": 95852, - "ĠCatalyst": 87857, - "ĠCatch": 20930, - "ĠCategoria": 72582, - "ĠCategories": 28212, - "ĠCategory": 10054, - "ĠCater": 60136, - "ĠCath": 12234, - "ĠCathedral": 56729, - "ĠCatherine": 41563, - "ĠCatholic": 16473, - "ĠCatholics": 50871, - "ĠCathy": 81348, - "ĠCats": 50749, - "ĠCaucas": 59432, - "ĠCaucasian": 84419, - "ĠCaucus": 79017, - "ĠCaught": 92314, - "ĠCaul": 89438, - "ĠCause": 44346, - "ĠCauses": 73005, - "ĠCav": 51066, - "ĠCaval": 49130, - "ĠCavaliers": 71856, - "ĠCave": 49392, - "ĠCavs": 95635, - "ĠCay": 52783, - "ĠCbd": 49350, - "ĠCd": 83990, - "ĠCe": 23769, - "ĠCec": 49145, - "ĠCecil": 89127, - "ĠCed": 78513, - "ĠCedar": 56648, - "ĠCeiling": 64425, - "ĠCel": 46543, - "ĠCele": 22687, - "ĠCelebr": 32192, - "ĠCelebration": 74100, - "ĠCelebrity": 64338, - "ĠCell": 13972, - "ĠCells": 58090, - "ĠCellular": 87107, - "ĠCelsius": 61347, - "ĠCelt": 35307, - "ĠCeltic": 54664, - "ĠCeltics": 57696, - "ĠCement": 61332, - "ĠCemetery": 58478, - "ĠCena": 88563, - "ĠCensus": 45527, - "ĠCent": 5719, - "ĠCentOS": 95513, - "ĠCenter": 5832, - "ĠCenters": 40891, - "ĠCentral": 10684, - "ĠCentre": 14481, - "ĠCentro": 56574, - "ĠCentury": 27101, - "ĠCer": 27664, - "ĠCeramic": 78250, - "ĠCeremony": 94652, - "ĠCert": 15304, - "ĠCertain": 34111, - "ĠCertainly": 52366, - "ĠCertificate": 31402, - "ĠCertification": 50210, - "ĠCertified": 35442, - "ĠCes": 61363, - "ĠCette": 61308, - "ĠCf": 89894, - "ĠCh": 910, - "ĠCha": 27721, - "ĠChad": 42030, - "ĠChain": 28525, - "ĠChains": 81769, - "ĠChair": 16090, - "ĠChairman": 26294, - "ĠChairs": 68124, - "ĠChall": 69385, - "ĠChallenge": 25257, - "ĠChallenger": 86483, - "ĠChallenges": 68678, - "ĠCham": 41783, - "ĠChamber": 31379, - "ĠChambers": 64176, - "ĠChamp": 55590, - "ĠChampagne": 87539, - "ĠChampion": 32497, - "ĠChampions": 28808, - "ĠChampionship": 18621, - "ĠChampionships": 47754, - "ĠChan": 41302, - "ĠChance": 38934, - "ĠChancellor": 46963, - "ĠChand": 66636, - "ĠChandler": 60348, - "ĠChanel": 90372, - "ĠChang": 43372, - "ĠChange": 10388, - "ĠChanged": 46294, - "ĠChanges": 28140, - "ĠChanging": 50169, - "ĠChannel": 13434, - "ĠChannels": 62900, - "ĠChaos": 43105, - "ĠChap": 26649, - "ĠChapel": 53362, - "ĠChapman": 59814, - "ĠChapter": 15585, - "ĠChapters": 68381, - "ĠChar": 4864, - "ĠCharSequence": 57457, - "ĠCharSet": 66991, - "ĠCharacter": 15633, - "ĠCharacteristics": 83984, - "ĠCharacters": 44516, - "ĠCharg": 27617, - "ĠCharge": 36795, - "ĠCharger": 72408, - "ĠChargers": 59593, - "ĠCharges": 77969, - "ĠCharging": 89798, - "ĠCharity": 65931, - "ĠCharl": 45366, - "ĠCharles": 14927, - "ĠCharleston": 52293, - "ĠCharlie": 24927, - "ĠCharlotte": 28373, - "ĠCharlottesville": 63638, - "ĠCharm": 57500, - "ĠCharset": 87871, - "ĠChart": 21266, - "ĠCharter": 48605, - "ĠCharts": 66276, - "ĠChase": 34574, - "ĠChat": 12853, - "ĠChatColor": 79320, - "ĠChatt": 78213, - "ĠChattanooga": 96843, - "ĠChavez": 76241, - "ĠChe": 8436, - "ĠCheap": 35934, - "ĠCheat": 98023, - "ĠCheck": 4248, - "ĠCheckBox": 45365, - "ĠCheckbox": 60041, - "ĠChecked": 93361, - "ĠChecker": 80678, - "ĠChecking": 46093, - "ĠChecklist": 94969, - "ĠCheckout": 56735, - "ĠChecks": 24843, - "ĠCheer": 92631, - "ĠCheers": 78989, - "ĠCheese": 44319, - "ĠChef": 35975, - "ĠChelsea": 26518, - "ĠChem": 18994, - "ĠChemical": 35324, - "ĠChemistry": 41746, - "ĠChen": 24495, - "ĠCheney": 80246, - "ĠCheng": 56707, - "ĠChennai": 63821, - "ĠCher": 55107, - "ĠChern": 90659, - "ĠCherokee": 70041, - "ĠCherry": 44705, - "ĠCheryl": 79837, - "ĠChes": 73654, - "ĠChess": 47387, - "ĠChest": 41771, - "ĠChester": 52412, - "ĠChevrolet": 42377, - "ĠChevron": 89993, - "ĠChevy": 57298, - "ĠChew": 89865, - "ĠChi": 33282, - "ĠChic": 70720, - "ĠChicago": 10557, - "ĠChick": 62126, - "ĠChicken": 33519, - "ĠChief": 14344, - "ĠChiefs": 44744, - "ĠChild": 9391, - "ĠChildhood": 71310, - "ĠChildren": 15044, - "ĠChile": 33000, - "ĠChili": 81415, - "ĠChill": 86489, - "ĠChim": 81448, - "ĠChin": 48235, - "ĠChina": 5616, - "ĠChinese": 8453, - "ĠChip": 30913, - "ĠChips": 86668, - "ĠChiến": 142226, - "ĠChloe": 59370, - "ĠChlor": 91379, - "ĠCho": 32580, - "ĠChocolate": 38420, - "ĠChoi": 86573, - "ĠChoice": 27107, - "ĠChoices": 78191, - "ĠChoir": 98332, - "ĠChoose": 22201, - "ĠChoosing": 76251, - "ĠChop": 63997, - "ĠChore": 95538, - "ĠChow": 73958, - "ĠChr": 52207, - "ĠChris": 11266, - "ĠChrist": 3686, - "ĠChristian": 8876, - "ĠChristianity": 31086, - "ĠChristians": 21410, - "ĠChristie": 43306, - "ĠChristina": 59671, - "ĠChristine": 45893, - "ĠChristmas": 10074, - "ĠChristoph": 94593, - "ĠChristopher": 24986, - "ĠChrom": 34218, - "ĠChrome": 17225, - "ĠChromium": 57165, - "ĠChron": 25481, - "ĠChronic": 72682, - "ĠChronicle": 41059, - "ĠChronicles": 65316, - "ĠChrysler": 63935, - "ĠChu": 61011, - "ĠChuck": 33249, - "ĠChun": 89354, - "ĠChung": 87325, - "ĠChunk": 45513, - "ĠChurch": 9257, - "ĠChurches": 93541, - "ĠChurchill": 57174, - "ĠChâu": 132690, - "ĠChúa": 132756, - "ĠChúng": 131272, - "ĠChÃŃ": 131868, - "ĠChÃŃnh": 129591, - "ĠChương": 131786, - "ĠChá»§": 130085, - "ĠChá»ī": 132026, - "ĠChá»ĭ": 141654, - "ĠCi": 31644, - "ĠCialis": 32302, - "ĠCic": 73951, - "ĠCin": 28911, - "ĠCincinnati": 35139, - "ĠCinder": 77330, - "ĠCindy": 69331, - "ĠCinema": 48218, - "ĠCipher": 63288, - "ĠCir": 40909, - "ĠCirc": 16338, - "ĠCircle": 21224, - "ĠCircuit": 27218, - "ĠCircular": 45761, - "ĠCircularProgress": 78197, - "ĠCircularProgressIndicator": 98479, - "ĠCircus": 86821, - "ĠCisco": 42134, - "ĠCit": 17543, - "ĠCitadel": 96226, - "ĠCitation": 69323, - "ĠCities": 37273, - "ĠCitizen": 46217, - "ĠCitizens": 39896, - "ĠCitizenship": 93736, - "ĠCity": 4311, - "ĠCiudad": 74145, - "ĠCiv": 79135, - "ĠCivic": 54829, - "ĠCivil": 16398, - "ĠCivilization": 90678, - "ĠCl": 2435, - "ĠCla": 56338, - "ĠClaim": 37502, - "ĠClaims": 50098, - "ĠClair": 92510, - "ĠClaire": 42575, - "ĠClamp": 92818, - "ĠClan": 54595, - "ĠClar": 30081, - "ĠClara": 50557, - "ĠClare": 61040, - "ĠClarence": 87730, - "ĠClark": 21304, - "ĠClarke": 42555, - "ĠClarkson": 93194, - "ĠClash": 84570, - "ĠClass": 3228, - "ĠClassName": 98457, - "ĠClassNotFoundException": 65641, - "ĠClasse": 91887, - "ĠClasses": 33869, - "ĠClassic": 21837, - "ĠClassical": 67433, - "ĠClassics": 72315, - "ĠClassification": 54882, - "ĠClassified": 79436, - "ĠClassifier": 89186, - "ĠClassroom": 76029, - "ĠClaud": 61312, - "ĠClaude": 74330, - "ĠClaudia": 80056, - "ĠClaus": 67019, - "ĠClause": 55797, - "ĠClaw": 87010, - "ĠClay": 31401, - "ĠClayton": 63444, - "ĠCle": 36002, - "ĠClean": 9590, - "ĠCleaner": 75219, - "ĠCleaning": 46655, - "ĠCleans": 85662, - "ĠCleanup": 53512, - "ĠClear": 12023, - "ĠClearance": 92130, - "ĠClearly": 53404, - "ĠClears": 78071, - "ĠClem": 45168, - "ĠClement": 52127, - "ĠClemson": 62031, - "ĠCler": 40776, - "ĠClerk": 62140, - "ĠCleveland": 23475, - "ĠCli": 96971, - "ĠClick": 9189, - "ĠClient": 8423, - "ĠCliente": 40831, - "ĠClients": 47408, - "ĠCliff": 47852, - "ĠClifford": 85683, - "ĠClim": 61830, - "ĠClimate": 30536, - "ĠClin": 18398, - "ĠClinic": 39224, - "ĠClinical": 32035, - "ĠClint": 55029, - "ĠClinton": 8120, - "ĠClintons": 92030, - "ĠClip": 29692, - "ĠClipboard": 81327, - "ĠClippers": 71012, - "ĠClips": 83373, - "ĠClo": 18679, - "ĠClock": 26142, - "ĠClone": 27913, - "ĠClose": 13032, - "ĠClosed": 44679, - "ĠCloset": 99140, - "ĠClosing": 61113, - "ĠClosure": 55567, - "ĠCloth": 83635, - "ĠClothes": 76524, - "ĠClothing": 53658, - "ĠCloud": 14817, - "ĠClover": 94801, - "ĠClown": 98323, - "ĠClub": 10140, - "ĠClubs": 69032, - "ĠCluster": 35380, - "ĠCly": 68288, - "ĠClyde": 90394, - "ĠCmd": 40210, - "ĠCo": 3539, - "ĠCoach": 27176, - "ĠCoaching": 74378, - "ĠCoal": 24813, - "ĠCoalition": 35792, - "ĠCoast": 15994, - "ĠCoastal": 71558, - "ĠCoat": 67767, - "ĠCob": 45951, - "ĠCobb": 67905, - "ĠCobra": 84475, - "ĠCoc": 76388, - "ĠCoca": 62854, - "ĠCoch": 94395, - "ĠCock": 33927, - "ĠCocktail": 92716, - "ĠCoco": 83382, - "ĠCocoa": 75651, - "ĠCoconut": 71279, - "ĠCod": 33677, - "ĠCodable": 80482, - "ĠCode": 6119, - "ĠCodec": 67077, - "ĠCodes": 40561, - "ĠCoding": 48075, - "ĠCody": 57282, - "ĠCoff": 75133, - "ĠCoffee": 26079, - "ĠCognitive": 72135, - "ĠCoh": 83575, - "ĠCohen": 31096, - "ĠCoil": 67665, - "ĠCoin": 26233, - "ĠCoinbase": 79808, - "ĠCoins": 61776, - "ĠCoke": 73262, - "ĠCol": 4254, - "ĠColbert": 78647, - "ĠCold": 23185, - "ĠCole": 23407, - "ĠColeman": 49432, - "ĠColin": 39879, - "ĠColl": 12905, - "ĠCollabor": 48581, - "ĠCollaboration": 86587, - "ĠCollapse": 75818, - "ĠCollect": 20513, - "ĠCollection": 11101, - "ĠCollections": 25326, - "ĠCollective": 58918, - "ĠCollector": 58548, - "ĠColleg": 56565, - "ĠCollege": 9126, - "ĠColleges": 78119, - "ĠCollider": 73821, - "ĠCollins": 28670, - "ĠCollision": 51548, - "ĠColo": 95075, - "ĠCologne": 78058, - "ĠColomb": 30802, - "ĠColombia": 38033, - "ĠColombian": 83553, - "ĠColon": 30942, - "ĠColonel": 51698, - "ĠColonial": 72748, - "ĠColony": 81846, - "ĠColor": 3478, - "ĠColorado": 15383, - "ĠColoring": 52794, - "ĠColors": 9526, - "ĠColour": 40862, - "ĠColt": 90384, - "ĠColts": 51984, - "ĠColum": 13901, - "ĠColumbia": 18796, - "ĠColumbus": 31817, - "ĠColumn": 9332, - "ĠColumns": 53573, - "ĠCom": 1198, - "ĠComVisible": 54315, - "ĠComb": 22454, - "ĠCombat": 35982, - "ĠCombination": 85856, - "ĠCombine": 46812, - "ĠCombined": 57652, - "ĠCombo": 53023, - "ĠComboBox": 54153, - "ĠComcast": 57004, - "ĠCome": 15565, - "ĠComedy": 43751, - "ĠComes": 53228, - "ĠComet": 98098, - "ĠComey": 34978, - "ĠComfort": 43742, - "ĠComic": 39963, - "ĠComics": 34056, - "ĠComing": 39891, - "ĠComm": 6804, - "ĠCommand": 7348, - "ĠCommandLine": 78218, - "ĠCommandType": 36927, - "ĠCommander": 34138, - "ĠCommands": 47183, - "ĠComment": 12255, - "ĠCommentary": 72444, - "ĠComments": 17681, - "ĠCommerce": 30380, - "ĠCommercial": 27843, - "ĠCommission": 9652, - "ĠCommissioner": 29354, - "ĠCommissioners": 96245, - "ĠCommit": 9205, - "ĠCommittee": 10341, - "ĠCommittees": 67917, - "ĠCommod": 78180, - "ĠCommon": 7718, - "ĠCommonModule": 37638, - "ĠCommons": 25585, - "ĠCommonwealth": 37198, - "ĠCommun": 56198, - "ĠCommunic": 16433, - "ĠCommunication": 30866, - "ĠCommunications": 25466, - "ĠCommunist": 36861, - "ĠCommunities": 57343, - "ĠCommunity": 12062, - "ĠComo": 45674, - "ĠComp": 13317, - "ĠCompact": 54782, - "ĠCompanies": 31786, - "ĠCompanion": 68975, - "ĠCompany": 8188, - "ĠCompar": 22771, - "ĠComparable": 58106, - "ĠComparative": 96180, - "ĠComparator": 50541, - "ĠCompare": 23768, - "ĠCompared": 58713, - "ĠComparison": 42451, - "ĠCompass": 59580, - "ĠCompatibility": 77995, - "ĠCompatible": 66265, - "ĠCompensation": 69296, - "ĠCompet": 25440, - "ĠCompetition": 41221, - "ĠCompetitive": 78050, - "ĠCompilation": 70081, - "ĠCompile": 54467, - "ĠCompiled": 96471, - "ĠCompiler": 45631, - "ĠComplaint": 67438, - "ĠComple": 42354, - "ĠCompletableFuture": 91535, - "ĠComplete": 18608, - "ĠCompleted": 45494, - "ĠCompletely": 85114, - "ĠCompletion": 56250, - "ĠComplex": 22096, - "ĠComplexity": 70618, - "ĠCompliance": 59170, - "ĠComponent": 5578, - "ĠComponentFixture": 28363, - "ĠComponents": 34085, - "ĠComposer": 78771, - "ĠComposite": 40639, - "ĠComposition": 67106, - "ĠCompound": 61572, - "ĠComprehensive": 66863, - "ĠCompression": 66161, - "ĠComput": 23144, - "ĠComputational": 91928, - "ĠCompute": 22603, - "ĠComputer": 17407, - "ĠComputers": 68449, - "ĠComputes": 64975, - "ĠComputing": 45779, - "ĠCon": 1200, - "ĠConan": 78812, - "ĠConc": 62698, - "ĠConcat": 78195, - "ĠConce": 78618, - "ĠConcent": 61161, - "ĠConcept": 34355, - "ĠConcepts": 75772, - "ĠConcern": 51247, - "ĠConcert": 46684, - "ĠConclusion": 73877, - "ĠConcord": 63093, - "ĠConcrete": 36532, - "ĠConcurrent": 42704, - "ĠConcurrentHashMap": 89075, - "ĠCond": 44826, - "ĠCondition": 15180, - "ĠConditional": 91973, - "ĠConditioning": 82392, - "ĠConditions": 31834, - "ĠConduct": 49835, - "ĠCone": 46412, - "ĠConexion": 72468, - "ĠConf": 14974, - "ĠConfeder": 38044, - "ĠConfederate": 56357, - "ĠConference": 14872, - "ĠConfidence": 86324, - "ĠConfidential": 73365, - "ĠConfig": 5532, - "ĠConfiguration": 12221, - "ĠConfigurationManager": 55831, - "ĠConfigure": 22169, - "ĠConfigureServices": 96608, - "ĠConfirm": 33563, - "ĠConfirmation": 68309, - "ĠConflict": 58585, - "ĠCong": 7261, - "ĠCongo": 53832, - "ĠCongratulations": 70541, - "ĠCongress": 7992, - "ĠCongressional": 38373, - "ĠCongressman": 70383, - "ĠConj": 97157, - "ĠConn": 18213, - "ĠConnect": 13015, - "ĠConnected": 49486, - "ĠConnecticut": 30361, - "ĠConnecting": 83938, - "ĠConnection": 11032, - "ĠConnectionState": 71693, - "ĠConnections": 65952, - "ĠConnectivity": 96054, - "ĠConnector": 54814, - "ĠConnie": 96063, - "ĠConnor": 57180, - "ĠConor": 84115, - "ĠConrad": 75989, - "ĠCons": 7292, - "ĠConscious": 91652, - "ĠConse": 66466, - "ĠConsent": 92387, - "ĠConsequently": 52023, - "ĠConserv": 20049, - "ĠConservation": 44335, - "ĠConservative": 28971, - "ĠConservatives": 48244, - "ĠConsider": 21144, - "ĠConsidering": 55777, - "ĠConsole": 5277, - "ĠConsoleColor": 58834, - "ĠConsolid": 78880, - "ĠConsort": 67603, - "ĠConsortium": 72447, - "ĠConspiracy": 97152, - "ĠConst": 24522, - "ĠConstant": 19305, - "ĠConstantin": 91187, - "ĠConstants": 16605, - "ĠConstit": 75604, - "ĠConstitution": 17579, - "ĠConstitutional": 62185, - "ĠConstr": 95584, - "ĠConstraint": 44264, - "ĠConstraints": 87473, - "ĠConstruct": 18678, - "ĠConstruction": 24026, - "ĠConstructor": 16786, - "ĠConstructors": 51768, - "ĠConstructs": 47213, - "ĠConsult": 19960, - "ĠConsultant": 55446, - "ĠConsultants": 90050, - "ĠConsulting": 46411, - "ĠConsum": 40962, - "ĠConsumer": 25197, - "ĠConsumers": 81991, - "ĠConsumption": 86166, - "ĠCont": 2093, - "ĠContact": 9180, - "ĠContacts": 46039, - "ĠContainer": 9678, - "ĠContainers": 98293, - "ĠContains": 30811, - "ĠConte": 93378, - "ĠContemporary": 47202, - "ĠContent": 8883, - "ĠContentType": 70431, - "ĠContentValues": 55929, - "ĠContentView": 93928, - "ĠContents": 35862, - "ĠContest": 46533, - "ĠContext": 9608, - "ĠContin": 20297, - "ĠContinent": 97745, - "ĠContinental": 60734, - "ĠContinue": 15003, - "ĠContinued": 50621, - "ĠContinuing": 81017, - "ĠContinuous": 68967, - "ĠContr": 34241, - "ĠContract": 19185, - "ĠContractor": 86518, - "ĠContractors": 97793, - "ĠContracts": 70559, - "ĠContrast": 90048, - "ĠContrib": 23177, - "ĠContribution": 93528, - "ĠContributions": 96004, - "ĠContributor": 64724, - "ĠContributors": 39536, - "ĠControl": 7779, - "ĠControlled": 81345, - "ĠController": 9771, - "ĠControllerBase": 79024, - "ĠControllers": 85476, - "ĠControls": 32070, - "ĠConv": 28988, - "ĠConvenience": 80648, - "ĠConvenient": 92950, - "ĠConvention": 25872, - "ĠConvers": 55396, - "ĠConversation": 50830, - "ĠConversely": 81571, - "ĠConversion": 42509, - "ĠConvert": 7169, - "ĠConverted": 93693, - "ĠConverter": 39328, - "ĠConverts": 41729, - "ĠConveyor": 99155, - "ĠConway": 59474, - "ĠCook": 12514, - "ĠCookbook": 88203, - "ĠCooke": 98739, - "ĠCookie": 24356, - "ĠCookies": 25994, - "ĠCooking": 56310, - "ĠCool": 23931, - "ĠCooler": 94143, - "ĠCooling": 82305, - "ĠCooper": 23517, - "ĠCooperation": 72708, - "ĠCooperative": 85705, - "ĠCoord": 47849, - "ĠCoordinate": 41035, - "ĠCoordinates": 62501, - "ĠCoordinator": 42324, - "ĠCop": 24946, - "ĠCopa": 84531, - "ĠCopenhagen": 63061, - "ĠCopies": 79568, - "ĠCopp": 80999, - "ĠCopper": 42540, - "ĠCopy": 14540, - "ĠCopyright": 2955, - "ĠCor": 4463, - "ĠCoral": 63816, - "ĠCorbyn": 41656, - "ĠCord": 36887, - "ĠCore": 9518, - "ĠCoreData": 91122, - "ĠCorey": 54652, - "ĠCorinth": 59793, - "ĠCorinthians": 72974, - "ĠCork": 51936, - "ĠCorm": 96189, - "ĠCorn": 21330, - "ĠCornel": 97945, - "ĠCornell": 55719, - "ĠCorner": 38248, - "ĠCornwall": 75950, - "ĠCoron": 47083, - "ĠCorona": 60229, - "ĠCoronavirus": 69820, - "ĠCoroutine": 87466, - "ĠCorp": 21863, - "ĠCorpor": 10858, - "ĠCorporate": 35465, - "ĠCorporation": 13034, - "ĠCorps": 30142, - "ĠCorpus": 75734, - "ĠCorrect": 39970, - "ĠCorrection": 63069, - "ĠCorrections": 90472, - "ĠCorrespond": 50942, - "ĠCorruption": 89794, - "ĠCors": 52518, - "ĠCort": 35675, - "ĠCortex": 89902, - "ĠCorvette": 85825, - "ĠCory": 63528, - "ĠCos": 18114, - "ĠCosby": 91951, - "ĠCosmetic": 76321, - "ĠCosmic": 94689, - "ĠCosmos": 83424, - "ĠCost": 11194, - "ĠCosta": 31280, - "ĠCostco": 80295, - "ĠCosts": 63041, - "ĠCostume": 63689, - "ĠCot": 67725, - "ĠCottage": 75395, - "ĠCotton": 37696, - "ĠCou": 18232, - "ĠCouch": 61128, - "ĠCougar": 89757, - "ĠCoul": 66848, - "ĠCould": 16503, - "ĠCouldn": 72688, - "ĠCoun": 31254, - "ĠCouncil": 9074, - "ĠCounsel": 36645, - "ĠCounseling": 88449, - "ĠCount": 4504, - "ĠCountdown": 86386, - "ĠCounter": 19735, - "ĠCounties": 92888, - "ĠCountries": 53737, - "ĠCountry": 14106, - "ĠCounts": 85659, - "ĠCounty": 6272, - "ĠCoupe": 80420, - "ĠCouple": 65825, - "ĠCouples": 89150, - "ĠCoupon": 44930, - "ĠCoupons": 67067, - "ĠCour": 6244, - "ĠCourage": 98530, - "ĠCourier": 74593, - "ĠCourse": 16615, - "ĠCourses": 47678, - "ĠCourt": 7154, - "ĠCourtesy": 53097, - "ĠCourtney": 70682, - "ĠCourts": 65463, - "ĠCous": 60469, - "ĠCousins": 77604, - "ĠCout": 71253, - "ĠCov": 62636, - "ĠCove": 64379, - "ĠCovenant": 62941, - "ĠCovent": 88717, - "ĠCover": 17757, - "ĠCoverage": 55669, - "ĠCovered": 72195, - "ĠCovers": 70425, - "ĠCovid": 36974, - "ĠCow": 21851, - "ĠCowboy": 95022, - "ĠCowboys": 40305, - "ĠCox": 38660, - "ĠCoy": 61973, - "ĠCp": 64256, - "ĠCr": 4553, - "ĠCra": 23243, - "ĠCrab": 74104, - "ĠCrack": 54945, - "ĠCraft": 24009, - "ĠCrafting": 97169, - "ĠCrafts": 64941, - "ĠCraig": 28417, - "ĠCraigslist": 72292, - "ĠCran": 66430, - "ĠCrane": 72899, - "ĠCrash": 50335, - "ĠCrate": 68390, - "ĠCraw": 43666, - "ĠCrawford": 53176, - "ĠCrazy": 50263, - "ĠCre": 7792, - "ĠCream": 29700, - "ĠCreat": 17667, - "ĠCreate": 4230, - "ĠCreateMap": 89924, - "ĠCreateTable": 88604, - "ĠCreateUser": 95021, - "ĠCreated": 4290, - "ĠCreates": 14684, - "ĠCreating": 31306, - "ĠCreation": 34286, - "ĠCreative": 24263, - "ĠCreator": 35678, - "ĠCreature": 52514, - "ĠCreatures": 97412, - "ĠCredential": 93379, - "ĠCredentials": 61260, - "ĠCredit": 16267, - "ĠCredits": 48700, - "ĠCree": 95788, - "ĠCreed": 60377, - "ĠCreek": 23198, - "ĠCres": 60910, - "ĠCrescent": 76469, - "ĠCrest": 70441, - "ĠCrew": 34937, - "ĠCri": 91140, - "ĠCricket": 57919, - "ĠCrime": 23900, - "ĠCrimea": 60711, - "ĠCrimes": 76908, - "ĠCriminal": 32736, - "ĠCrimson": 66077, - "ĠCrisis": 45150, - "ĠCrist": 34118, - "ĠCristiano": 99115, - "ĠCristina": 99114, - "ĠCrit": 33207, - "ĠCriteria": 14243, - "ĠCriterion": 68400, - "ĠCritical": 34661, - "ĠCritics": 76413, - "ĠCro": 24592, - "ĠCroat": 44082, - "ĠCroatia": 57211, - "ĠCroatian": 99070, - "ĠCrom": 91607, - "ĠCron": 55817, - "ĠCrop": 67320, - "ĠCros": 60719, - "ĠCrosby": 75736, - "ĠCross": 11261, - "ĠCrossAxisAlignment": 43289, - "ĠCrossRef": 65673, - "ĠCrossing": 64993, - "ĠCrow": 26893, - "ĠCrowd": 97984, - "ĠCrowley": 82008, - "ĠCrown": 28643, - "ĠCru": 14423, - "ĠCruc": 75004, - "ĠCrud": 75078, - "ĠCruise": 46377, - "ĠCruiser": 91899, - "ĠCrunch": 77213, - "ĠCrus": 50103, - "ĠCrush": 12048, - "ĠCrusher": 16200, - "ĠCrushers": 52197, - "ĠCrushing": 40394, - "ĠCruz": 20842, - "ĠCry": 42705, - "ĠCrypt": 37447, - "ĠCrypto": 32886, - "ĠCrystal": 27916, - "ĠCré": 135893, - "ĠCs": 67332, - "ĠCss": 79214, - "ĠCsv": 91671, - "ĠCt": 62279, - "ĠCtrl": 37014, - "ĠCu": 26462, - "ĠCuando": 87914, - "ĠCub": 18030, - "ĠCuba": 31677, - "ĠCuban": 43710, - "ĠCube": 42592, - "ĠCubs": 50043, - "ĠCue": 96894, - "ĠCuisine": 80861, - "ĠCul": 31694, - "ĠCult": 25594, - "ĠCultural": 40233, - "ĠCulture": 20397, - "ĠCultureInfo": 44467, - "ĠCum": 31578, - "ĠCumberland": 91682, - "ĠCummings": 87371, - "ĠCunning": 67745, - "ĠCunningham": 73828, - "ĠCuomo": 67207, - "ĠCup": 10861, - "ĠCupertino": 96735, - "ĠCups": 78106, - "ĠCur": 12886, - "ĠCure": 69719, - "ĠCurl": 78338, - "ĠCurrency": 28453, - "ĠCurrent": 9125, - "ĠCurrently": 24150, - "ĠCurriculum": 74206, - "ĠCurry": 45975, - "ĠCurse": 70627, - "ĠCurso": 92538, - "ĠCursor": 28067, - "ĠCursors": 93166, - "ĠCurt": 30423, - "ĠCurtain": 83557, - "ĠCurtis": 50716, - "ĠCurve": 53677, - "ĠCush": 83659, - "ĠCust": 72222, - "ĠCustom": 8406, - "ĠCustomer": 12277, - "ĠCustomers": 39589, - "ĠCustomize": 46334, - "ĠCustoms": 45671, - "ĠCut": 19649, - "ĠCute": 57539, - "ĠCutter": 89778, - "ĠCutting": 62425, - "ĠCuá»Ļc": 141380, - "ĠCv": 52742, - "ĠCy": 17748, - "ĠCyan": 92143, - "ĠCyber": 33611, - "ĠCyc": 80981, - "ĠCycl": 71445, - "ĠCycle": 41292, - "ĠCycling": 59970, - "ĠCylinder": 86662, - "ĠCynthia": 74571, - "ĠCypress": 79793, - "ĠCyprus": 56684, - "ĠCyr": 47315, - "ĠCyril": 94705, - "ĠCyrus": 70824, - "ĠCzech": 33150, - "ĠCá": 130494, - "ĠCác": 128678, - "ĠCách": 131577, - "ĠCâm": 138955, - "ĠCâmara": 138956, - "ĠCòn": 135466, - "ĠCó": 129016, - "ĠCódigo": 140003, - "ĠCô": 131249, - "ĠCông": 128534, - "ĠCùng": 139602, - "ĠCÅ©ng": 139014, - "ĠCÆ¡": 134695, - "ĠCảnh": 141555, - "ĠCần": 138310, - "ĠCá»Ļng": 138465, - "ĠD": 422, - "ĠDA": 24543, - "ĠDAC": 39196, - "ĠDACA": 79574, - "ĠDAG": 79987, - "ĠDAL": 49366, - "ĠDAM": 12360, - "ĠDAMAGE": 28204, - "ĠDAMAGES": 16501, - "ĠDAN": 83410, - "ĠDAO": 44368, - "ĠDAR": 96127, - "ĠDARK": 88652, - "ĠDAT": 39362, - "ĠDATA": 14112, - "ĠDATABASE": 42859, - "ĠDATE": 28543, - "ĠDAY": 37688, - "ĠDAYS": 82831, - "ĠDB": 5952, - "ĠDBG": 37392, - "ĠDBHelper": 93705, - "ĠDBNull": 54750, - "ĠDC": 10922, - "ĠDCHECK": 46224, - "ĠDD": 30904, - "ĠDDR": 43760, - "ĠDDS": 64972, - "ĠDE": 3385, - "ĠDEA": 74910, - "ĠDEAD": 78069, - "ĠDEAL": 25491, - "ĠDEALINGS": 28470, - "ĠDEBUG": 12657, - "ĠDEC": 42817, - "ĠDECL": 41960, - "ĠDECLARE": 70819, - "ĠDEF": 23865, - "ĠDEFAULT": 11955, - "ĠDEFIN": 60926, - "ĠDEFINE": 66914, - "ĠDEL": 23777, - "ĠDELETE": 17197, - "ĠDEM": 50814, - "ĠDEN": 66186, - "ĠDER": 46777, - "ĠDERP": 71029, - "ĠDES": 12732, - "ĠDESC": 16089, - "ĠDESCRIPTION": 32185, - "ĠDESIGN": 67243, - "ĠDEST": 71990, - "ĠDET": 40243, - "ĠDETAILS": 76996, - "ĠDEV": 50895, - "ĠDEVELO": 70261, - "ĠDEVICE": 44632, - "ĠDF": 43376, - "ĠDFA": 93631, - "ĠDFS": 56383, - "ĠDG": 50275, - "ĠDH": 32787, - "ĠDHCP": 57587, - "ĠDHS": 72603, - "ĠDI": 16536, - "ĠDIAG": 98167, - "ĠDIC": 97760, - "ĠDID": 59119, - "ĠDIE": 71406, - "ĠDIFF": 68549, - "ĠDIG": 55296, - "ĠDIM": 50859, - "ĠDIN": 77259, - "ĠDIR": 39052, - "ĠDIRECT": 20230, - "ĠDIRECTORY": 54140, - "ĠDIS": 11977, - "ĠDISABLE": 56671, - "ĠDISCLAIM": 24717, - "ĠDISCLAIMED": 31201, - "ĠDISCLAIMER": 97097, - "ĠDISCLAIMS": 83306, - "ĠDISP": 84040, - "ĠDISPATCH": 94581, - "ĠDISPLAY": 52264, - "ĠDIST": 36103, - "ĠDISTINCT": 59086, - "ĠDISTRIBUT": 97841, - "ĠDIV": 46260, - "ĠDIY": 31458, - "ĠDJ": 21387, - "ĠDJs": 92527, - "ĠDK": 55240, - "ĠDL": 32975, - "ĠDLC": 42919, - "ĠDLL": 47192, - "ĠDM": 20192, - "ĠDMA": 25450, - "ĠDN": 60656, - "ĠDNA": 15552, - "ĠDNC": 51965, - "ĠDNS": 27598, - "ĠDO": 9319, - "ĠDOC": 60355, - "ĠDOCUMENT": 57013, - "ĠDOE": 92057, - "ĠDOES": 57263, - "ĠDOI": 58570, - "ĠDOJ": 60810, - "ĠDOM": 18051, - "ĠDOMAIN": 84586, - "ĠDON": 44273, - "ĠDONE": 54685, - "ĠDOS": 58480, - "ĠDOT": 48326, - "ĠDOUBLE": 56272, - "ĠDOWN": 27494, - "ĠDOWNLOAD": 42471, - "ĠDP": 31757, - "ĠDPI": 97025, - "ĠDPR": 87901, - "ĠDPS": 58483, - "ĠDR": 14309, - "ĠDRAW": 71652, - "ĠDRIVE": 95787, - "ĠDRIVER": 48729, - "ĠDRM": 60397, - "ĠDROP": 56942, - "ĠDRV": 71332, - "ĠDS": 20578, - "ĠDSL": 45558, - "ĠDSM": 79167, - "ĠDSP": 56593, - "ĠDST": 77100, - "ĠDT": 25014, - "ĠDTO": 80325, - "ĠDU": 47055, - "ĠDUI": 72851, - "ĠDUP": 87524, - "ĠDV": 51244, - "ĠDVD": 18092, - "ĠDVDs": 63336, - "ĠDVR": 93886, - "ĠDW": 37752, - "ĠDWC": 70259, - "ĠDWORD": 20301, - "ĠDX": 30808, - "ĠDXGI": 74500, - "ĠDY": 95858, - "ĠDa": 14235, - "ĠDabei": 96943, - "ĠDad": 32521, - "ĠDaddy": 53446, - "ĠDaemon": 92236, - "ĠDag": 77027, - "ĠDagger": 82183, - "ĠDah": 75291, - "ĠDahl": 86867, - "ĠDai": 79123, - "ĠDaily": 13385, - "ĠDairy": 78022, - "ĠDaisy": 70164, - "ĠDak": 24648, - "ĠDakota": 27872, - "ĠDal": 28110, - "ĠDale": 36728, - "ĠDallas": 18542, - "ĠDalton": 71454, - "ĠDaly": 94435, - "ĠDam": 16354, - "ĠDamage": 20765, - "ĠDamascus": 57023, - "ĠDame": 40698, - "ĠDamen": 93084, - "ĠDamian": 90955, - "ĠDamien": 88912, - "ĠDamn": 82415, - "ĠDamon": 72249, - "ĠDan": 11563, - "ĠDana": 46613, - "ĠDance": 29604, - "ĠDancing": 69529, - "ĠDane": 79872, - "ĠDanger": 47299, - "ĠDangerous": 73032, - "ĠDani": 29539, - "ĠDaniel": 15118, - "ĠDanielle": 71616, - "ĠDaniels": 49535, - "ĠDanish": 43680, - "ĠDank": 70407, - "ĠDann": 72915, - "ĠDanny": 32599, - "ĠDans": 45606, - "ĠDante": 73300, - "ĠDao": 51581, - "ĠDar": 15017, - "ĠDare": 66831, - "ĠDark": 12258, - "ĠDarkness": 53696, - "ĠDarling": 94539, - "ĠDarren": 56990, - "ĠDart": 48097, - "ĠDarth": 80416, - "ĠDarwin": 44380, - "ĠDas": 19000, - "ĠDash": 36670, - "ĠDashboard": 26808, - "ĠDat": 21631, - "ĠData": 2885, - "ĠDataAccess": 68555, - "ĠDataBase": 66930, - "ĠDataColumn": 72515, - "ĠDataContext": 81577, - "ĠDataFrame": 45786, - "ĠDataGridView": 30253, - "ĠDataGridViewCellStyle": 75263, - "ĠDataLoader": 67188, - "ĠDataManager": 87007, - "ĠDataRow": 50184, - "ĠDataService": 76555, - "ĠDataSet": 27036, - "ĠDataSource": 43384, - "ĠDataTable": 16922, - "ĠDataType": 33172, - "ĠDataTypes": 35043, - "ĠDataView": 94570, - "ĠDatabase": 9994, - "ĠDatabaseReference": 80046, - "ĠDatagram": 96804, - "ĠDataset": 39183, - "ĠDate": 2631, - "ĠDateFormat": 67857, - "ĠDateFormatter": 97953, - "ĠDatePicker": 63426, - "ĠDateTime": 6520, - "ĠDateTimeKind": 96209, - "ĠDateTimeOffset": 78494, - "ĠDaten": 46954, - "ĠDatensch": 91741, - "ĠDates": 51624, - "ĠDating": 17332, - "ĠDatos": 72359, - "ĠDatum": 68459, - "ĠDaughter": 63294, - "ĠDav": 5347, - "ĠDave": 20238, - "ĠDavid": 6798, - "ĠDavidson": 53245, - "ĠDavies": 55772, - "ĠDavis": 16782, - "ĠDaw": 36751, - "ĠDawn": 34507, - "ĠDawson": 66212, - "ĠDay": 6059, - "ĠDays": 21192, - "ĠDayton": 48173, - "ĠDaytona": 86912, - "ĠDb": 11988, - "ĠDbContext": 60194, - "ĠDbSet": 31150, - "ĠDbType": 49231, - "ĠDe": 1581, - "ĠDeV": 72596, - "ĠDead": 15021, - "ĠDeadline": 61956, - "ĠDeadly": 94837, - "ĠDeadpool": 93224, - "ĠDeal": 26263, - "ĠDealer": 51896, - "ĠDealers": 78189, - "ĠDeals": 41182, - "ĠDean": 24061, - "ĠDear": 42822, - "ĠDeath": 15911, - "ĠDeaths": 84712, - "ĠDeb": 35461, - "ĠDebate": 82788, - "ĠDebbie": 63389, - "ĠDebian": 56607, - "ĠDeborah": 69525, - "ĠDebt": 57554, - "ĠDebug": 11091, - "ĠDebugger": 93646, - "ĠDec": 3714, - "ĠDecay": 97286, - "ĠDecember": 6652, - "ĠDecide": 98881, - "ĠDecimal": 26728, - "ĠDecimalFormat": 80796, - "ĠDecision": 40425, - "ĠDeck": 28416, - "ĠDecl": 31625, - "ĠDeclaration": 40921, - "ĠDeclarations": 88275, - "ĠDeclare": 61310, - "ĠDecode": 50194, - "ĠDecoder": 50472, - "ĠDecom": 96378, - "ĠDecomp": 62378, - "ĠDecompiled": 79417, - "ĠDecor": 26971, - "ĠDecorating": 97220, - "ĠDecoration": 64019, - "ĠDecre": 64101, - "ĠDecrypt": 89146, - "ĠDed": 50399, - "ĠDedicated": 95558, - "ĠDee": 54904, - "ĠDeep": 18183, - "ĠDeepCopy": 75931, - "ĠDeer": 63091, - "ĠDef": 3892, - "ĠDefault": 7899, - "ĠDefaultValue": 97780, - "ĠDefaults": 35990, - "ĠDefence": 38907, - "ĠDefendant": 87545, - "ĠDefendants": 98839, - "ĠDefender": 65014, - "ĠDefense": 16373, - "ĠDefensive": 70148, - "ĠDeferred": 75515, - "ĠDefine": 18614, - "ĠDefined": 68846, - "ĠDefines": 37826, - "ĠDefinitely": 59898, - "ĠDefinition": 19709, - "ĠDefinitions": 46513, - "ĠDeg": 57237, - "ĠDegree": 37082, - "ĠDegrees": 92901, - "ĠDek": 74463, - "ĠDel": 7313, - "ĠDelaware": 39738, - "ĠDelay": 39793, - "ĠDelegate": 40180, - "ĠDelete": 10428, - "ĠDeleted": 54117, - "ĠDeletes": 55524, - "ĠDeleting": 81850, - "ĠDelhi": 21996, - "ĠDelicious": 84688, - "ĠDeliver": 64652, - "ĠDelivery": 26211, - "ĠDell": 38324, - "ĠDelta": 24957, - "ĠDeluxe": 52961, - "ĠDem": 4724, - "ĠDemand": 54253, - "ĠDemo": 28523, - "ĠDemocr": 6251, - "ĠDemocracy": 47089, - "ĠDemocrat": 23901, - "ĠDemocratic": 11396, - "ĠDemocrats": 12363, - "ĠDemon": 32305, - "ĠDemonstr": 85401, - "ĠDemp": 97744, - "ĠDems": 69591, - "ĠDen": 9774, - "ĠDeng": 91729, - "ĠDenied": 87112, - "ĠDenis": 60603, - "ĠDenise": 80249, - "ĠDenmark": 34340, - "ĠDenn": 71161, - "ĠDennis": 34627, - "ĠDense": 42522, - "ĠDensity": 72610, - "ĠDent": 42811, - "ĠDental": 47704, - "ĠDenver": 22117, - "ĠDep": 4148, - "ĠDepart": 39755, - "ĠDepartment": 5887, - "ĠDepartments": 84508, - "ĠDepend": 98328, - "ĠDependencies": 80490, - "ĠDependency": 32977, - "ĠDependencyProperty": 56552, - "ĠDepending": 39630, - "ĠDepends": 94011, - "ĠDeploy": 70595, - "ĠDeployment": 66292, - "ĠDepos": 77050, - "ĠDeposit": 48471, - "ĠDepot": 46970, - "ĠDeprecated": 83916, - "ĠDepression": 45804, - "ĠDept": 50221, - "ĠDepth": 43920, - "ĠDepths": 95918, - "ĠDeputy": 31624, - "ĠDer": 12741, - "ĠDerby": 45773, - "ĠDere": 89678, - "ĠDerek": 42323, - "ĠDerived": 67849, - "ĠDerm": 75408, - "ĠDerne": 142213, - "ĠDerneÄŁi": 142214, - "ĠDerrick": 72089, - "ĠDes": 3874, - "ĠDesc": 31185, - "ĠDescribe": 60785, - "ĠDescription": 7662, - "ĠDescriptor": 55692, - "ĠDesde": 97943, - "ĠDeserialize": 48440, - "ĠDesert": 42186, - "ĠDesign": 6982, - "ĠDesigned": 47425, - "ĠDesigner": 15569, - "ĠDesigns": 43266, - "ĠDesire": 81424, - "ĠDesired": 88061, - "ĠDesk": 38694, - "ĠDesktop": 35300, - "ĠDesmond": 96523, - "ĠDespite": 17715, - "ĠDespués": 141005, - "ĠDess": 69496, - "ĠDest": 28531, - "ĠDestination": 41728, - "ĠDestiny": 50397, - "ĠDestroy": 22251, - "ĠDestruction": 79747, - "ĠDestructor": 59068, - "ĠDet": 16423, - "ĠDetail": 25771, - "ĠDetailed": 62665, - "ĠDetails": 12309, - "ĠDetay": 139461, - "ĠDetaylı": 139462, - "ĠDetect": 33287, - "ĠDetected": 87950, - "ĠDetection": 57353, - "ĠDetective": 55279, - "ĠDetector": 79019, - "ĠDetermin": 34907, - "ĠDetermine": 29901, - "ĠDetermines": 52712, - "ĠDetroit": 19761, - "ĠDeus": 71785, - "ĠDeutsch": 33315, - "ĠDeutsche": 57671, - "ĠDeutschland": 44979, - "ĠDev": 6040, - "ĠDevComponents": 41225, - "ĠDevExpress": 10056, - "ĠDevelop": 7843, - "ĠDeveloped": 79010, - "ĠDeveloper": 24879, - "ĠDevelopers": 46617, - "ĠDeveloping": 80645, - "ĠDevelopment": 10816, - "ĠDevice": 13903, - "ĠDevices": 40377, - "ĠDevil": 39201, - "ĠDevils": 58954, - "ĠDevin": 79992, - "ĠDevon": 59334, - "ĠDew": 49300, - "ĠDex": 72642, - "ĠDexter": 86364, - "ĠDez": 74882, - "ĠDeze": 87836, - "ĠDh": 43227, - "ĠDhabi": 72779, - "ĠDi": 7767, - "ĠDia": 65303, - "ĠDiabetes": 52589, - "ĠDiablo": 73237, - "ĠDiagnosis": 94352, - "ĠDiagnostic": 49988, - "ĠDiagram": 35261, - "ĠDial": 66155, - "ĠDialog": 13393, - "ĠDialogInterface": 46308, - "ĠDialogResult": 36510, - "ĠDialogue": 69489, - "ĠDiameter": 75561, - "ĠDiamond": 24334, - "ĠDiamonds": 90110, - "ĠDiana": 44409, - "ĠDiane": 53090, - "ĠDiary": 52025, - "ĠDias": 87339, - "ĠDiaz": 57031, - "ĠDice": 56645, - "ĠDich": 97703, - "ĠDick": 22557, - "ĠDickens": 92899, - "ĠDickinson": 97237, - "ĠDict": 29126, - "ĠDictionary": 10466, - "ĠDid": 14568, - "ĠDidn": 56972, - "ĠDie": 8408, - "ĠDied": 87887, - "ĠDiego": 18336, - "ĠDien": 60404, - "ĠDies": 23980, - "ĠDiese": 54068, - "ĠDiesel": 53794, - "ĠDiet": 26212, - "ĠDietary": 82708, - "ĠDiff": 28369, - "ĠDifference": 55080, - "ĠDifferences": 85797, - "ĠDifferent": 33396, - "ĠDifferential": 98736, - "ĠDifficulty": 54946, - "ĠDig": 37969, - "ĠDigest": 53289, - "ĠDigit": 71465, - "ĠDigital": 14102, - "ĠDil": 52767, - "ĠDillon": 82566, - "ĠDim": 8126, - "ĠDimension": 27923, - "ĠDimensions": 32023, - "ĠDimit": 87590, - "ĠDin": 44773, - "ĠDing": 79373, - "ĠDining": 38090, - "ĠDinner": 48091, - "ĠDio": 84942, - "ĠDion": 64057, - "ĠDios": 68098, - "ĠDip": 55047, - "ĠDipl": 45462, - "ĠDiploma": 76031, - "ĠDir": 30094, - "ĠDire": 44511, - "ĠDirect": 7139, - "ĠDirectX": 66764, - "ĠDirected": 77205, - "ĠDirection": 18904, - "ĠDirections": 53486, - "ĠDirective": 56752, - "ĠDirector": 10560, - "ĠDirectorate": 93366, - "ĠDirectors": 44985, - "ĠDirectory": 18033, - "ĠDirectoryInfo": 81688, - "ĠDirk": 83929, - "ĠDirt": 86319, - "ĠDirty": 54291, - "ĠDis": 4093, - "ĠDisabilities": 97449, - "ĠDisability": 74268, - "ĠDisable": 28027, - "ĠDisabled": 58206, - "ĠDisaster": 72278, - "ĠDisc": 11735, - "ĠDiscipline": 97546, - "ĠDisclaimer": 66829, - "ĠDisclosure": 77254, - "ĠDisco": 93629, - "ĠDisconnect": 69090, - "ĠDiscord": 34064, - "ĠDiscount": 32659, - "ĠDiscounts": 98374, - "ĠDiscover": 32939, - "ĠDiscovery": 38093, - "ĠDiscrim": 77300, - "ĠDiscuss": 65279, - "ĠDiscussion": 35513, - "ĠDiscussions": 97125, - "ĠDise": 24002, - "ĠDisease": 30874, - "ĠDiseases": 69574, - "ĠDish": 48168, - "ĠDisk": 38868, - "ĠDisney": 16390, - "ĠDisneyland": 74074, - "ĠDisorder": 62777, - "ĠDisorders": 72033, - "ĠDisp": 69730, - "ĠDispatch": 21133, - "ĠDispatchQueue": 47851, - "ĠDispatcher": 58969, - "ĠDisplay": 10623, - "ĠDisplayName": 81783, - "ĠDisplays": 49606, - "ĠDisposable": 51286, - "ĠDispose": 16469, - "ĠDisqus": 80751, - "ĠDiss": 51032, - "ĠDissertation": 98016, - "ĠDist": 27604, - "ĠDistance": 31135, - "ĠDistrib": 53591, - "ĠDistributed": 43955, - "ĠDistribution": 33909, - "ĠDistrict": 10942, - "ĠDit": 52418, - "ĠDiv": 8765, - "ĠDive": 88517, - "ĠDiversity": 64971, - "ĠDivide": 62902, - "ĠDivider": 47457, - "ĠDivine": 42261, - "ĠDivision": 14489, - "ĠDix": 75143, - "ĠDixon": 63695, - "ĠDiy": 94904, - "ĠDiÄŁer": 138556, - "ĠDiá»ħn": 141351, - "ĠDj": 51062, - "ĠDjango": 52604, - "ĠDmit": 66121, - "ĠDmitry": 87131, - "ĠDo": 3155, - "ĠDob": 64251, - "ĠDoc": 21709, - "ĠDoch": 78021, - "ĠDock": 44101, - "ĠDocker": 40549, - "ĠDocs": 60691, - "ĠDoctor": 18635, - "ĠDoctors": 53843, - "ĠDoctrine": 28632, - "ĠDocument": 11789, - "ĠDocumentary": 98787, - "ĠDocumentation": 44465, - "ĠDocuments": 44790, - "ĠDod": 35868, - "ĠDodd": 82993, - "ĠDodge": 42881, - "ĠDodgers": 55467, - "ĠDoe": 49628, - "ĠDoes": 12553, - "ĠDoesn": 48832, - "ĠDog": 14254, - "ĠDogs": 38425, - "ĠDoing": 43145, - "ĠDok": 66850, - "ĠDol": 24244, - "ĠDoll": 38757, - "ĠDollar": 42364, - "ĠDollars": 80189, - "ĠDolphin": 94996, - "ĠDolphins": 53712, - "ĠDom": 20751, - "ĠDomain": 21070, - "ĠDome": 68445, - "ĠDomestic": 51749, - "ĠDomin": 22474, - "ĠDoming": 77757, - "ĠDominic": 67034, - "ĠDominican": 66013, - "ĠDominion": 75421, - "ĠDomino": 93765, - "ĠDon": 4320, - "ĠDonald": 9453, - "ĠDonate": 96202, - "ĠDonation": 77230, - "ĠDone": 27357, - "ĠDonetsk": 97351, - "ĠDong": 52383, - "ĠDonna": 46763, - "ĠDonne": 69983, - "ĠDonovan": 70700, - "ĠDont": 61484, - "ĠDoom": 50234, - "ĠDoor": 24191, - "ĠDoors": 49617, - "ĠDop": 96574, - "ĠDor": 24242, - "ĠDorm": 97532, - "ĠDorothy": 72558, - "ĠDort": 58616, - "ĠDortmund": 71450, - "ĠDos": 56920, - "ĠDot": 31262, - "ĠDota": 85127, - "ĠDou": 17007, - "ĠDoub": 54864, - "ĠDouble": 7093, - "ĠDoug": 31508, - "ĠDough": 89295, - "ĠDouglas": 30064, - "ĠDove": 88984, - "ĠDover": 86826, - "ĠDow": 42432, - "ĠDown": 6285, - "ĠDowning": 83679, - "ĠDownload": 8577, - "ĠDownloads": 49161, - "ĠDowns": 84678, - "ĠDowntown": 43885, - "ĠDoyle": 65209, - "ĠDoÄŁu": 138709, - "ĠDr": 2926, - "ĠDra": 73102, - "ĠDraco": 71702, - "ĠDraft": 28564, - "ĠDrag": 24861, - "ĠDragon": 16145, - "ĠDragons": 48009, - "ĠDrain": 61268, - "ĠDrake": 41765, - "ĠDram": 79110, - "ĠDrama": 46469, - "ĠDraw": 11992, - "ĠDrawable": 58016, - "ĠDrawer": 48260, - "ĠDrawing": 37759, - "ĠDraws": 83432, - "ĠDre": 65010, - "ĠDread": 81204, - "ĠDream": 17829, - "ĠDreams": 52618, - "ĠDresden": 85445, - "ĠDress": 28218, - "ĠDresses": 93517, - "ĠDrew": 40108, - "ĠDrill": 76874, - "ĠDrink": 47473, - "ĠDrinking": 82581, - "ĠDrinks": 96998, - "ĠDrive": 16150, - "ĠDriver": 14577, - "ĠDriverManager": 63508, - "ĠDrivers": 45737, - "ĠDriving": 52253, - "ĠDro": 56867, - "ĠDrone": 73481, - "ĠDrop": 15733, - "ĠDropDownList": 98755, - "ĠDropIndex": 94176, - "ĠDropbox": 72584, - "ĠDropdown": 45594, - "ĠDropout": 81132, - "ĠDrops": 89636, - "ĠDrug": 25109, - "ĠDrugs": 50666, - "ĠDruid": 72635, - "ĠDrum": 45406, - "ĠDrupal": 35044, - "ĠDry": 30841, - "ĠDt": 94151, - "ĠDtype": 86627, - "ĠDu": 15687, - "ĠDual": 33659, - "ĠDub": 17095, - "ĠDubai": 34038, - "ĠDublin": 32877, - "ĠDuc": 79773, - "ĠDuch": 60022, - "ĠDuchess": 94939, - "ĠDuck": 45770, - "ĠDucks": 67782, - "ĠDud": 73167, - "ĠDude": 85209, - "ĠDudley": 86902, - "ĠDue": 23662, - "ĠDuel": 57194, - "ĠDuffy": 85862, - "ĠDuis": 96215, - "ĠDuke": 26356, - "ĠDul": 62615, - "ĠDum": 63982, - "ĠDumbledore": 80983, - "ĠDummy": 50567, - "ĠDump": 29693, - "ĠDumpster": 43264, - "ĠDun": 28738, - "ĠDuncan": 41309, - "ĠDund": 73915, - "ĠDungeon": 50847, - "ĠDungeons": 93001, - "ĠDunk": 68683, - "ĠDunn": 63745, - "ĠDuo": 73212, - "ĠDup": 50283, - "ĠDuplicate": 71071, - "ĠDur": 20138, - "ĠDurant": 66340, - "ĠDuration": 21045, - "ĠDurch": 60423, - "ĠDurham": 57714, - "ĠDuring": 11954, - "ĠDust": 31993, - "ĠDustin": 78318, - "ĠDut": 43536, - "ĠDutch": 23234, - "ĠDuterte": 63452, - "ĠDuty": 35589, - "ĠDw": 48707, - "ĠDwarf": 79730, - "ĠDwight": 71745, - "ĠDx": 88797, - "ĠDy": 41948, - "ĠDylan": 43358, - "ĠDyn": 43938, - "ĠDynam": 32493, - "ĠDynamic": 21886, - "ĠDynamics": 52611, - "ĠDynamo": 71813, - "ĠDynasty": 73395, - "ĠDys": 64042, - "ĠDysfunction": 87166, - "ĠDzi": 134288, - "ĠDziÄĻki": 134289, - "ĠDé": 49401, - "ĠDön": 140901, - "ĠDü": 131634, - "ĠDünya": 131635, - "ĠDÅ©ng": 142840, - "ĠDương": 130695, - "ĠDá»±": 133784, - "ĠDá»ĭch": 134586, - "ĠE": 468, - "ĠEA": 38362, - "ĠEACH": 94413, - "ĠEAR": 90296, - "ĠEAST": 77625, - "ĠEB": 49142, - "ĠEC": 20633, - "ĠECB": 79947, - "ĠECC": 77316, - "ĠECM": 79600, - "ĠECS": 87664, - "ĠED": 16036, - "ĠEDGE": 82806, - "ĠEDIT": 32257, - "ĠEDM": 98017, - "ĠEDT": 47923, - "ĠEDUC": 92977, - "ĠEE": 41352, - "ĠEEG": 75808, - "ĠEEPROM": 61195, - "ĠEF": 43990, - "ĠEFF": 95188, - "ĠEFFECT": 62053, - "ĠEFI": 39082, - "ĠEG": 56111, - "ĠEGL": 58655, - "ĠEH": 94686, - "ĠEI": 92811, - "ĠEIF": 27695, - "ĠEINA": 95382, - "ĠEINVAL": 76269, - "ĠEITHER": 93475, - "ĠEL": 17258, - "ĠELECT": 72477, - "ĠELEMENT": 62356, - "ĠELF": 72568, - "ĠELSE": 52926, - "ĠEM": 16902, - "ĠEMAIL": 51708, - "ĠEMC": 73704, - "ĠEMP": 51592, - "ĠEMPTY": 41314, - "ĠEMS": 70065, - "ĠEN": 5190, - "ĠENABLE": 33240, - "ĠENC": 72262, - "ĠEND": 11176, - "ĠENERGY": 83276, - "ĠENG": 70539, - "ĠENGINE": 48360, - "ĠENT": 27816, - "ĠENTER": 52905, - "ĠENTITY": 73871, - "ĠENTRY": 72792, - "ĠENUM": 68404, - "ĠENV": 32791, - "ĠEO": 92526, - "ĠEOF": 29457, - "ĠEOS": 48901, - "ĠEP": 19072, - "ĠEPA": 26158, - "ĠEPS": 40607, - "ĠEQ": 38994, - "ĠEQUAL": 91609, - "ĠEQUI": 85399, - "ĠER": 26492, - "ĠERA": 44020, - "ĠERC": 56052, - "ĠERP": 65179, - "ĠERR": 10165, - "ĠERROR": 12874, - "ĠES": 19287, - "ĠESA": 91643, - "ĠESC": 43274, - "ĠESL": 68322, - "ĠESP": 18117, - "ĠESPN": 26198, - "ĠEST": 25877, - "ĠESV": 83011, - "ĠET": 17768, - "ĠETA": 89014, - "ĠETF": 53063, - "ĠETH": 37742, - "ĠEU": 9812, - "ĠEUR": 37088, - "ĠEURO": 90434, - "ĠEV": 14892, - "ĠEVAL": 96392, - "ĠEVE": 86635, - "ĠEVEN": 26657, - "ĠEVENT": 12742, - "ĠEVENTS": 58619, - "ĠEVER": 73666, - "ĠEVERY": 44874, - "ĠEVP": 72758, - "ĠEVT": 93257, - "ĠEW": 62995, - "ĠEX": 4063, - "ĠEXAMPLE": 66246, - "ĠEXCEPTION": 80452, - "ĠEXEC": 62247, - "ĠEXEMPLARY": 30542, - "ĠEXISTS": 34839, - "ĠEXIT": 29839, - "ĠEXP": 13460, - "ĠEXPECT": 8921, - "ĠEXPER": 80081, - "ĠEXPORT": 74584, - "ĠEXPRESS": 16427, - "ĠEXT": 33757, - "ĠEXTI": 85018, - "ĠEXTRA": 65393, - "ĠEZ": 63286, - "ĠEa": 96088, - "ĠEach": 8886, - "ĠEag": 20916, - "ĠEagle": 35795, - "ĠEagles": 31609, - "ĠEar": 6809, - "ĠEarl": 47410, - "ĠEarlier": 46893, - "ĠEarly": 22752, - "ĠEarn": 47693, - "ĠEarth": 9237, - "ĠEase": 94021, - "ĠEasily": 45991, - "ĠEast": 6326, - "ĠEaster": 32400, - "ĠEastern": 18028, - "ĠEasy": 18609, - "ĠEat": 44514, - "ĠEating": 59538, - "ĠEaton": 95866, - "ĠEb": 25570, - "ĠEbay": 91316, - "ĠEbola": 46982, - "ĠEbony": 72114, - "ĠEbook": 88671, - "ĠEc": 36111, - "ĠEcc": 80660, - "ĠEcho": 37806, - "ĠEck": 81640, - "ĠEclipse": 36123, - "ĠEco": 50851, - "ĠEcology": 77275, - "ĠEcon": 12413, - "ĠEconom": 50083, - "ĠEconomic": 22546, - "ĠEconomics": 34200, - "ĠEconomist": 82938, - "ĠEconomy": 37561, - "ĠEcuador": 53991, - "ĠEd": 3199, - "ĠEddie": 40680, - "ĠEden": 50815, - "ĠEdgar": 58991, - "ĠEdge": 10349, - "ĠEdgeInsets": 15396, - "ĠEdinburgh": 40306, - "ĠEdison": 73776, - "ĠEdit": 8340, - "ĠEditText": 30483, - "ĠEdited": 65789, - "ĠEditing": 61053, - "ĠEdition": 14069, - "ĠEditor": 12580, - "ĠEditorGUI": 94408, - "ĠEditorGUILayout": 52822, - "ĠEditorial": 65133, - "ĠEditors": 81786, - "ĠEdmonton": 45287, - "ĠEdmund": 70811, - "ĠEdu": 46273, - "ĠEduardo": 76554, - "ĠEduc": 10145, - "ĠEducación": 142597, - "ĠEducation": 11668, - "ĠEducational": 45845, - "ĠEducação": 137911, - "ĠEdward": 21891, - "ĠEdwards": 36763, - "ĠEdwin": 75149, - "ĠEen": 56418, - "ĠEf": 94089, - "ĠEff": 30022, - "ĠEffect": 13449, - "ĠEffective": 46923, - "ĠEffects": 29146, - "ĠEfficiency": 66567, - "ĠEfficient": 89006, - "ĠEg": 38075, - "ĠEgg": 41213, - "ĠEggs": 75792, - "ĠEgypt": 14867, - "ĠEgyptian": 32489, - "ĠEgyptians": 81504, - "ĠEh": 60551, - "ĠEid": 85744, - "ĠEig": 90080, - "ĠEigen": 24092, - "ĠEight": 35844, - "ĠEighth": 96488, - "ĠEin": 18069, - "ĠEine": 51310, - "ĠEins": 60352, - "ĠEinsatz": 84247, - "ĠEinstein": 54052, - "ĠEis": 96880, - "ĠEisen": 54493, - "ĠEisenhower": 88081, - "ĠEither": 20988, - "ĠEj": 52758, - "ĠEk": 48988, - "ĠEl": 3984, - "ĠElaine": 82147, - "ĠElastic": 51910, - "ĠElasticsearch": 58887, - "ĠEld": 26867, - "ĠElder": 38569, - "ĠEle": 25949, - "ĠEleanor": 89430, - "ĠElect": 9884, - "ĠElection": 25754, - "ĠElections": 57501, - "ĠElectoral": 66576, - "ĠElectric": 20598, - "ĠElectrical": 43934, - "ĠElectricity": 73356, - "ĠElectro": 68290, - "ĠElectron": 76876, - "ĠElectronic": 34169, - "ĠElectronics": 37684, - "ĠElegant": 80210, - "ĠElem": 78768, - "ĠElement": 8543, - "ĠElementRef": 57690, - "ĠElementType": 80526, - "ĠElemental": 70638, - "ĠElementary": 40663, - "ĠElements": 34157, - "ĠElena": 68575, - "ĠElephant": 78089, - "ĠElev": 54564, - "ĠElevated": 96593, - "ĠEleven": 81393, - "ĠElf": 43600, - "ĠEli": 33262, - "ĠElias": 85656, - "ĠElig": 68024, - "ĠElijah": 82592, - "ĠElim": 42320, - "ĠElis": 90086, - "ĠElite": 33764, - "ĠElizabeth": 20731, - "ĠElk": 87606, - "ĠEll": 13542, - "ĠElla": 77796, - "ĠElle": 45308, - "ĠEllen": 46585, - "ĠElli": 46712, - "ĠEllie": 88261, - "ĠElliot": 68418, - "ĠElliott": 47544, - "ĠEllis": 43607, - "ĠEllison": 81647, - "ĠElm": 64229, - "ĠElo": 99069, - "ĠElon": 68539, - "ĠElsa": 47964, - "ĠElse": 18804, - "ĠElseIf": 62223, - "ĠElves": 97604, - "ĠElvis": 66206, - "ĠEm": 5748, - "ĠEmacs": 63476, - "ĠEmail": 8299, - "ĠEmails": 71866, - "ĠEmanuel": 76660, - "ĠEmb": 29127, - "ĠEmbassy": 52427, - "ĠEmbed": 37068, - "ĠEmbedded": 61383, - "ĠEmber": 48234, - "ĠEmblem": 93136, - "ĠEmer": 20543, - "ĠEmerald": 63096, - "ĠEmergency": 31608, - "ĠEmerging": 85048, - "ĠEmerson": 79454, - "ĠEmil": 87724, - "ĠEmily": 34166, - "ĠEmin": 80400, - "ĠEmirates": 48701, - "ĠEmit": 61537, - "ĠEmm": 65455, - "ĠEmma": 34935, - "ĠEmmanuel": 60444, - "ĠEmmy": 66012, - "ĠEmoji": 82367, - "ĠEmotional": 94200, - "ĠEmp": 13409, - "ĠEmperor": 34314, - "ĠEmpire": 20448, - "ĠEmploy": 20782, - "ĠEmployee": 16850, - "ĠEmployees": 43641, - "ĠEmployer": 74852, - "ĠEmployment": 40852, - "ĠEmpresa": 83673, - "ĠEmpty": 22228, - "ĠEn": 2925, - "ĠEnable": 18567, - "ĠEnabled": 29653, - "ĠEnables": 76316, - "ĠEnc": 10751, - "ĠEncode": 56562, - "ĠEncoder": 55115, - "ĠEncoding": 29330, - "ĠEncore": 99078, - "ĠEncounter": 91857, - "ĠEncrypt": 55459, - "ĠEncryption": 62055, - "ĠEncyclopedia": 67098, - "ĠEnd": 3972, - "ĠEnde": 51292, - "ĠEnded": 76071, - "ĠEnding": 73421, - "ĠEndpoint": 47269, - "ĠEnds": 60560, - "ĠEnemies": 60481, - "ĠEnemy": 30751, - "ĠEnerg": 74001, - "ĠEnergy": 12354, - "ĠEnforcement": 42956, - "ĠEng": 3285, - "ĠEngagement": 59363, - "ĠEngel": 90890, - "ĠEngine": 8200, - "ĠEngineer": 28383, - "ĠEngineering": 16595, - "ĠEngineers": 48696, - "ĠEngines": 94318, - "ĠEngl": 98630, - "ĠEngland": 9448, - "ĠEnglish": 6364, - "ĠEnh": 28657, - "ĠEnhanced": 61449, - "ĠEnhancement": 52517, - "ĠEnjoy": 22656, - "ĠEnlight": 74050, - "ĠEnlightenment": 91831, - "ĠEnough": 61592, - "ĠEnrique": 84030, - "ĠEnrollment": 87984, - "ĠEns": 57868, - "ĠEnsemble": 88357, - "ĠEnsure": 29279, - "ĠEnt": 4863, - "ĠEnter": 11252, - "ĠEntered": 74975, - "ĠEnterprise": 25472, - "ĠEnterprises": 65956, - "ĠEntertainment": 22518, - "ĠEntire": 79240, - "ĠEntities": 52249, - "ĠEntity": 10390, - "ĠEntityManager": 48767, - "ĠEntityState": 65187, - "ĠEntityType": 73117, - "ĠEntr": 47141, - "ĠEntrance": 83120, - "ĠEntre": 41659, - "ĠEntrepreneur": 68002, - "ĠEntries": 65193, - "ĠEntry": 15788, - "ĠEntryPoint": 72685, - "ĠEnts": 93403, - "ĠEntwicklung": 92979, - "ĠEntão": 139848, - "ĠEnum": 14086, - "ĠEnumerable": 44125, - "ĠEnumerableStream": 71916, - "ĠEnumeration": 77125, - "ĠEnumerator": 76511, - "ĠEnums": 82947, - "ĠEnv": 37039, - "ĠEnvironment": 11586, - "ĠEnvironmental": 24060, - "ĠEp": 11020, - "ĠEph": 68372, - "ĠEpic": 39367, - "ĠEpid": 68180, - "ĠEpidemi": 87853, - "ĠEpiscopal": 95954, - "ĠEpisode": 19832, - "ĠEpisodes": 89137, - "ĠEpoch": 87379, - "ĠEpstein": 80032, - "ĠEq": 33122, - "ĠEqu": 11702, - "ĠEqual": 38474, - "ĠEquality": 51037, - "ĠEquals": 38735, - "ĠEquation": 84670, - "ĠEquip": 69714, - "ĠEquipment": 20236, - "ĠEquity": 57488, - "ĠEquivalent": 91228, - "ĠEr": 9740, - "ĠEra": 47588, - "ĠErd": 44693, - "ĠErdogan": 56089, - "ĠErdoÄŁan": 133757, - "ĠEre": 95013, - "ĠErect": 79155, - "ĠErectile": 88789, - "ĠErf": 41663, - "ĠErg": 73202, - "ĠErgebn": 78796, - "ĠEric": 16247, - "ĠErica": 91835, - "ĠErick": 79915, - "ĠErie": 78487, - "ĠErik": 41346, - "ĠErin": 55814, - "ĠErl": 80834, - "ĠErnest": 60923, - "ĠErnst": 73110, - "ĠErot": 27964, - "ĠErotic": 81842, - "ĠErotik": 83162, - "ĠErotische": 65652, - "ĠErr": 15495, - "ĠError": 4600, - "ĠErrorCode": 60084, - "ĠErrorHandler": 88331, - "ĠErrorMessage": 41827, - "ĠErrorResponse": 95724, - "ĠErrors": 39256, - "ĠEs": 9236, - "ĠEsc": 15547, - "ĠEscape": 45643, - "ĠEscort": 26585, - "ĠEscorts": 49654, - "ĠEsk": 58369, - "ĠEsp": 26514, - "ĠEspañ": 88982, - "ĠEspaña": 56508, - "ĠEspañol": 142658, - "ĠEspecially": 35525, - "ĠEsper": 69528, - "ĠEspresso": 98490, - "ĠEss": 12838, - "ĠEssay": 25957, - "ĠEssays": 55614, - "ĠEssen": 98675, - "ĠEssence": 83770, - "ĠEssential": 47733, - "ĠEssentially": 70754, - "ĠEssentials": 75160, - "ĠEssex": 63058, - "ĠEst": 9403, - "ĠEsta": 55708, - "ĠEstablish": 39398, - "ĠEstablished": 86250, - "ĠEstablishment": 86765, - "ĠEstado": 40174, - "ĠEstados": 63893, - "ĠEstate": 24443, - "ĠEstates": 91600, - "ĠEste": 38676, - "ĠEsther": 83638, - "ĠEstimate": 72715, - "ĠEstimated": 81986, - "ĠEstimates": 94519, - "ĠEsto": 92025, - "ĠEston": 53323, - "ĠEstonia": 68362, - "ĠEstr": 81484, - "ĠEstá": 136473, - "ĠEt": 18888, - "ĠEternal": 66772, - "ĠEth": 14356, - "ĠEthan": 62164, - "ĠEther": 34878, - "ĠEthereum": 33946, - "ĠEthernet": 45408, - "ĠEthi": 44058, - "ĠEthics": 49181, - "ĠEthiopia": 59357, - "ĠEthiopian": 95534, - "ĠEthnic": 91418, - "ĠEtsy": 64529, - "ĠEu": 21963, - "ĠEug": 40059, - "ĠEugene": 50458, - "ĠEuler": 80018, - "ĠEur": 84377, - "ĠEuras": 87077, - "ĠEuro": 19461, - "ĠEurop": 67015, - "ĠEuropa": 38500, - "ĠEurope": 4505, - "ĠEuropean": 7513, - "ĠEuropeans": 50507, - "ĠEuros": 85466, - "ĠEv": 10424, - "ĠEva": 54392, - "ĠEval": 58239, - "ĠEvalu": 75098, - "ĠEvaluate": 54115, - "ĠEvaluation": 39288, - "ĠEvan": 43943, - "ĠEvangel": 54706, - "ĠEvans": 29463, - "ĠEve": 31360, - "ĠEvel": 80996, - "ĠEvelyn": 95325, - "ĠEven": 7418, - "ĠEvening": 56102, - "ĠEvent": 3665, - "ĠEventArgs": 8124, - "ĠEventBus": 89567, - "ĠEventEmitter": 30004, - "ĠEventHandler": 31957, - "ĠEventType": 63128, - "ĠEvents": 17627, - "ĠEventually": 37174, - "ĠEver": 17892, - "ĠEverest": 86478, - "ĠEverett": 77095, - "ĠEverton": 62439, - "ĠEvery": 7209, - "ĠEverybody": 50798, - "ĠEveryday": 78616, - "ĠEveryone": 21455, - "ĠEverything": 20094, - "ĠEverywhere": 97225, - "ĠEvidence": 43696, - "ĠEvil": 33719, - "ĠEvo": 97870, - "ĠEvolution": 37221, - "ĠEx": 1374, - "ĠExact": 74480, - "ĠExactly": 68490, - "ĠExam": 32310, - "ĠExamination": 71494, - "ĠExaminer": 78246, - "ĠExample": 13383, - "ĠExamples": 25311, - "ĠExc": 38895, - "ĠExcel": 21029, - "ĠExcell": 49907, - "ĠExcellence": 57140, - "ĠExcellent": 36766, - "ĠExcept": 37167, - "ĠException": 4112, - "ĠExceptions": 64629, - "ĠExchange": 18705, - "ĠExclude": 98477, - "ĠExclusive": 48280, - "ĠExec": 10290, - "ĠExecute": 20848, - "ĠExecutes": 55542, - "ĠExecution": 30928, - "ĠExecutionContext": 85451, - "ĠExecutive": 17880, - "ĠExecutor": 56032, - "ĠExecutors": 95093, - "ĠExercise": 32818, - "ĠExercises": 90454, - "ĠExhaust": 88234, - "ĠExhib": 39274, - "ĠExhibit": 76495, - "ĠExhibition": 66933, - "ĠExist": 61809, - "ĠExisting": 68471, - "ĠExists": 72426, - "ĠExit": 18995, - "ĠExiting": 86262, - "ĠExodus": 87842, - "ĠExp": 7787, - "ĠExpand": 50141, - "ĠExpanded": 39237, - "ĠExpansion": 54554, - "ĠExpect": 32085, - "ĠExpected": 31021, - "ĠExped": 63312, - "ĠExpedition": 83774, - "ĠExpense": 67531, - "ĠExpenses": 91423, - "ĠExperience": 20796, - "ĠExperienced": 99023, - "ĠExperiment": 46793, - "ĠExperimental": 56608, - "ĠExpert": 32157, - "ĠExperts": 50759, - "ĠExpires": 97410, - "ĠExpl": 18006, - "ĠExplain": 81917, - "ĠExplanation": 71287, - "ĠExplicit": 31330, - "ĠExploration": 74922, - "ĠExplore": 44052, - "ĠExplorer": 29152, - "ĠExplos": 84866, - "ĠExplosion": 92686, - "ĠExpo": 51323, - "ĠExport": 22191, - "ĠExposure": 70766, - "ĠExpr": 28819, - "ĠExpress": 17399, - "ĠExpression": 16378, - "ĠExt": 9447, - "ĠExtend": 70083, - "ĠExtended": 40565, - "ĠExtension": 26473, - "ĠExtensions": 55795, - "ĠExterior": 70681, - "ĠExternal": 30936, - "ĠExtr": 71234, - "ĠExtra": 24992, - "ĠExtract": 22826, - "ĠExtraction": 94506, - "ĠExtras": 87917, - "ĠExtreme": 49395, - "ĠExtremely": 92696, - "ĠExxon": 76027, - "ĠEy": 43411, - "ĠEye": 27829, - "ĠEyes": 41996, - "ĠEyl": 135120, - "ĠEylül": 135121, - "ĠEz": 38626, - "ĠEzek": 97379, - "ĠEzra": 84318, - "ĠEÄŁ": 132386, - "ĠEÄŁer": 135039, - "ĠEÄŁitim": 132387, - "ĠF": 434, - "ĠFA": 15008, - "ĠFAA": 65936, - "ĠFAC": 84303, - "ĠFACE": 58227, - "ĠFACT": 58543, - "ĠFAG": 86180, - "ĠFAIL": 33107, - "ĠFAILED": 49671, - "ĠFAILURE": 64024, - "ĠFALL": 87492, - "ĠFALSE": 7833, - "ĠFAMILY": 87469, - "ĠFAQ": 30972, - "ĠFAQs": 86584, - "ĠFAR": 56315, - "ĠFAST": 50733, - "ĠFAT": 67953, - "ĠFB": 31921, - "ĠFBI": 13839, - "ĠFC": 16013, - "ĠFCC": 37576, - "ĠFD": 35318, - "ĠFDA": 29373, - "ĠFE": 27931, - "ĠFEATURE": 46760, - "ĠFEATURES": 93262, - "ĠFEC": 92311, - "ĠFEMA": 91689, - "ĠFETCH": 32316, - "ĠFF": 29942, - "ĠFFT": 60036, - "ĠFG": 48297, - "ĠFH": 81198, - "ĠFHA": 77740, - "ĠFI": 50535, - "ĠFIELD": 40278, - "ĠFIFA": 43642, - "ĠFIFO": 47007, - "ĠFIG": 37599, - "ĠFIL": 63335, - "ĠFILE": 11837, - "ĠFILES": 78745, - "ĠFILTER": 35352, - "ĠFIN": 24344, - "ĠFINAL": 66959, - "ĠFIND": 63758, - "ĠFINSEQ": 70127, - "ĠFIR": 77608, - "ĠFIRE": 60463, - "ĠFIRST": 34813, - "ĠFIT": 7456, - "ĠFITNESS": 7721, - "ĠFIX": 20151, - "ĠFIXED": 91549, - "ĠFIXME": 27475, - "ĠFK": 84246, - "ĠFL": 12772, - "ĠFLAC": 89099, - "ĠFLAG": 30379, - "ĠFLAGS": 47239, - "ĠFLASH": 52326, - "ĠFLOAT": 50116, - "ĠFLT": 96061, - "ĠFM": 23447, - "ĠFML": 82927, - "ĠFN": 49487, - "ĠFName": 96524, - "ĠFO": 21763, - "ĠFOLLOW": 57672, - "ĠFONT": 61068, - "ĠFOOD": 87127, - "ĠFOOT": 80037, - "ĠFOR": 4613, - "ĠFORCE": 82589, - "ĠFORE": 43923, - "ĠFOREIGN": 81356, - "ĠFORM": 27824, - "ĠFORMAT": 52225, - "ĠFORWARD": 90079, - "ĠFOUND": 52559, - "ĠFOUR": 74091, - "ĠFOX": 44188, - "ĠFP": 33551, - "ĠFPGA": 89462, - "ĠFPS": 43628, - "ĠFR": 16654, - "ĠFRAME": 56416, - "ĠFRE": 62606, - "ĠFREE": 16257, - "ĠFRIEND": 79343, - "ĠFROM": 4295, - "ĠFRONT": 81547, - "ĠFS": 24289, - "ĠFSM": 70967, - "ĠFStar": 48150, - "ĠFString": 65236, - "ĠFT": 23301, - "ĠFTC": 78260, - "ĠFTP": 47550, - "ĠFU": 95512, - "ĠFUCK": 75021, - "ĠFULL": 39741, - "ĠFUN": 35449, - "ĠFUNC": 43352, - "ĠFUNCT": 62355, - "ĠFUNCTION": 24819, - "ĠFUNCTIONS": 52164, - "ĠFVector": 70284, - "ĠFW": 48029, - "ĠFX": 28901, - "ĠFXMLLoader": 90239, - "ĠFY": 46366, - "ĠFa": 17677, - "ĠFab": 19243, - "ĠFabric": 36307, - "ĠFac": 16945, - "ĠFace": 18596, - "ĠFacebook": 5573, - "ĠFaces": 51226, - "ĠFach": 78765, - "ĠFacial": 74522, - "ĠFacilities": 65289, - "ĠFacility": 46650, - "ĠFacing": 95318, - "ĠFact": 36712, - "ĠFaction": 90307, - "ĠFactor": 37729, - "ĠFactors": 67218, - "ĠFactory": 16937, - "ĠFactoryBot": 88469, - "ĠFactoryGirl": 57540, - "ĠFacts": 44983, - "ĠFaculty": 41804, - "ĠFade": 56660, - "ĠFah": 73507, - "ĠFahr": 77200, - "ĠFahrenheit": 68723, - "ĠFail": 39645, - "ĠFailed": 21379, - "ĠFailure": 32260, - "ĠFair": 14588, - "ĠFairfax": 76536, - "ĠFairfield": 87429, - "ĠFairy": 55076, - "ĠFaith": 32953, - "ĠFake": 36965, - "ĠFaker": 46027, - "ĠFal": 22869, - "ĠFalcon": 42861, - "ĠFalcons": 53339, - "ĠFalk": 71464, - "ĠFall": 14785, - "ĠFallen": 82988, - "ĠFalling": 84199, - "ĠFallon": 87068, - "ĠFallout": 58540, - "ĠFalls": 29643, - "ĠFalse": 3557, - "ĠFam": 33601, - "ĠFame": 38527, - "ĠFamil": 52159, - "ĠFamilie": 88537, - "ĠFamilies": 49456, - "ĠFamily": 12238, - "ĠFamous": 66788, - "ĠFan": 24714, - "ĠFancy": 81799, - "ĠFang": 57927, - "ĠFans": 41796, - "ĠFant": 19663, - "ĠFantastic": 56938, - "ĠFantasy": 26484, - "ĠFar": 13452, - "ĠFarage": 93906, - "ĠFare": 66471, - "ĠFargo": 57650, - "ĠFarm": 18438, - "ĠFarmer": 67464, - "ĠFarmers": 62322, - "ĠFarms": 67021, - "ĠFarr": 73906, - "ĠFarrell": 85345, - "ĠFasc": 69607, - "ĠFashion": 30600, - "ĠFast": 17288, - "ĠFaster": 84486, - "ĠFat": 25348, - "ĠFatal": 65629, - "ĠFate": 58925, - "ĠFather": 20322, - "ĠFathers": 75905, - "ĠFauc": 96362, - "ĠFaul": 96243, - "ĠFault": 59149, - "ĠFav": 80941, - "ĠFavor": 73787, - "ĠFavorite": 39722, - "ĠFavorites": 63218, - "ĠFax": 55364, - "ĠFay": 89305, - "ĠFayette": 98815, - "ĠFe": 3841, - "ĠFear": 41967, - "ĠFeast": 90928, - "ĠFeather": 78876, - "ĠFeature": 19998, - "ĠFeatured": 50219, - "ĠFeatures": 19710, - "ĠFeaturing": 51231, - "ĠFeb": 13498, - "ĠFebruary": 7400, - "ĠFecha": 60478, - "ĠFed": 23608, - "ĠFedEx": 85235, - "ĠFeder": 21099, - "ĠFederal": 12137, - "ĠFederation": 27232, - "ĠFedora": 79506, - "ĠFee": 40458, - "ĠFeed": 28870, - "ĠFeedback": 36857, - "ĠFeel": 31733, - "ĠFeeling": 73558, - "ĠFees": 58578, - "ĠFeet": 61189, - "ĠFehler": 91265, - "ĠFeinstein": 84789, - "ĠFel": 26154, - "ĠFeld": 49753, - "ĠFelipe": 81447, - "ĠFelix": 55923, - "ĠFell": 62605, - "ĠFellow": 36846, - "ĠFellowship": 64642, - "ĠFem": 34195, - "ĠFemale": 28638, - "ĠFemin": 56301, - "ĠFemme": 57525, - "ĠFen": 44306, - "ĠFence": 79963, - "ĠFeng": 42658, - "ĠFer": 28462, - "ĠFerd": 82327, - "ĠFerdinand": 92507, - "ĠFerguson": 37376, - "ĠFerm": 98262, - "ĠFern": 25987, - "ĠFernandez": 82626, - "ĠFernando": 50385, - "ĠFerr": 27942, - "ĠFerrari": 45753, - "ĠFerry": 78449, - "ĠFest": 38650, - "ĠFestival": 17322, - "ĠFet": 68037, - "ĠFetch": 22104, - "ĠFetchType": 77182, - "ĠFetish": 98919, - "ĠFever": 83901, - "ĠFew": 42915, - "ĠFey": 88220, - "ĠFi": 39871, - "ĠFiat": 69299, - "ĠFib": 42464, - "ĠFiber": 53627, - "ĠFibonacci": 79683, - "ĠFiction": 42654, - "ĠField": 8601, - "ĠFieldType": 84614, - "ĠFields": 24580, - "ĠFiesta": 93803, - "ĠFif": 18502, - "ĠFifth": 22843, - "ĠFifty": 74920, - "ĠFig": 23095, - "ĠFight": 18629, - "ĠFighter": 41567, - "ĠFighters": 77967, - "ĠFighting": 49317, - "ĠFigure": 19037, - "ĠFigures": 68256, - "ĠFiji": 85096, - "ĠFil": 16402, - "ĠFile": 2887, - "ĠFileAccess": 92843, - "ĠFileInfo": 56189, - "ĠFileInputStream": 40185, - "ĠFileManager": 79288, - "ĠFileMode": 59348, - "ĠFileName": 47157, - "ĠFileNotFoundError": 95841, - "ĠFileNotFoundException": 68299, - "ĠFileOutputStream": 42656, - "ĠFilePath": 62703, - "ĠFileReader": 40733, - "ĠFileStream": 50771, - "ĠFileSystem": 53461, - "ĠFileType": 93238, - "ĠFileUtils": 59974, - "ĠFileWriter": 55821, - "ĠFiled": 83001, - "ĠFilename": 49811, - "ĠFiles": 17378, - "ĠFilip": 41278, - "ĠFilipino": 62417, - "ĠFill": 21979, - "ĠFilm": 16631, - "ĠFilme": 96185, - "ĠFilms": 45464, - "ĠFilter": 12339, - "ĠFiltering": 81531, - "ĠFilters": 45012, - "ĠFin": 5649, - "ĠFinal": 13023, - "ĠFinally": 17375, - "ĠFinals": 45047, - "ĠFinance": 22453, - "ĠFinancial": 17503, - "ĠFinancing": 92548, - "ĠFinch": 95233, - "ĠFind": 7379, - "ĠFindObjectOfType": 91422, - "ĠFinder": 57170, - "ĠFinding": 42797, - "ĠFinds": 50630, - "ĠFine": 30153, - "ĠFinger": 62861, - "ĠFinish": 35533, - "ĠFinished": 52626, - "ĠFinite": 93619, - "ĠFinland": 36255, - "ĠFinn": 34062, - "ĠFinnish": 57853, - "ĠFiona": 88843, - "ĠFior": 99003, - "ĠFir": 79247, - "ĠFire": 6647, - "ĠFirearms": 82517, - "ĠFirebase": 19683, - "ĠFirebaseAuth": 51981, - "ĠFirebaseDatabase": 68474, - "ĠFirebaseFirestore": 92240, - "ĠFired": 74830, - "ĠFirefox": 25929, - "ĠFireplace": 83728, - "ĠFires": 82830, - "ĠFirestore": 94266, - "ĠFirewall": 96231, - "ĠFirm": 37625, - "ĠFirmware": 80830, - "ĠFirst": 5512, - "ĠFirstName": 49467, - "ĠFirstly": 76695, - "ĠFiscal": 62972, - "ĠFischer": 61916, - "ĠFish": 16608, - "ĠFisher": 35504, - "ĠFisheries": 93405, - "ĠFishing": 52308, - "ĠFist": 81419, - "ĠFit": 29890, - "ĠFitness": 35708, - "ĠFits": 78245, - "ĠFitz": 36678, - "ĠFitzgerald": 61214, - "ĠFive": 20924, - "ĠFix": 19716, - "ĠFixed": 20149, - "ĠFixedUpdate": 86602, - "ĠFixes": 85963, - "ĠFixture": 73252, - "ĠFl": 2988, - "ĠFla": 53197, - "ĠFlag": 22666, - "ĠFlags": 33205, - "ĠFlake": 95315, - "ĠFlam": 96857, - "ĠFlame": 48857, - "ĠFlames": 72197, - "ĠFlash": 17263, - "ĠFlask": 28173, - "ĠFlat": 23577, - "ĠFlatButton": 74617, - "ĠFlatten": 85638, - "ĠFlavor": 64999, - "ĠFle": 46690, - "ĠFleet": 43455, - "ĠFlem": 64022, - "ĠFleming": 85197, - "ĠFlesh": 98055, - "ĠFletcher": 68068, - "ĠFlex": 26141, - "ĠFlexible": 52311, - "ĠFlickr": 54358, - "ĠFlight": 26577, - "ĠFlint": 52836, - "ĠFlip": 40284, - "ĠFlo": 19580, - "ĠFloat": 13001, - "ĠFloating": 47512, - "ĠFloatingActionButton": 81248, - "ĠFlood": 56127, - "ĠFloor": 16581, - "ĠFlooring": 77958, - "ĠFloors": 96405, - "ĠFlor": 8780, - "ĠFloral": 90652, - "ĠFlorence": 47506, - "ĠFlores": 72952, - "ĠFlorian": 96056, - "ĠFlorida": 9589, - "ĠFlour": 89028, - "ĠFlow": 22452, - "ĠFlower": 42686, - "ĠFlowers": 51545, - "ĠFloyd": 45799, - "ĠFlu": 60526, - "ĠFluent": 59797, - "ĠFluid": 59596, - "ĠFlush": 57626, - "ĠFlutter": 50795, - "ĠFlux": 69278, - "ĠFly": 20182, - "ĠFlyers": 73734, - "ĠFlying": 46052, - "ĠFlynn": 39386, - "ĠFn": 50182, - "ĠFo": 31657, - "ĠFoam": 76456, - "ĠFocus": 25806, - "ĠFog": 58148, - "ĠFol": 39455, - "ĠFold": 60473, - "ĠFolder": 35843, - "ĠFolding": 91150, - "ĠFoley": 79806, - "ĠFolk": 64237, - "ĠFollow": 11112, - "ĠFollowers": 85550, - "ĠFollowing": 22713, - "ĠFon": 70493, - "ĠFond": 91541, - "ĠFont": 9562, - "ĠFontAwesome": 58911, - "ĠFontStyle": 76227, - "ĠFontWeight": 26706, - "ĠFonts": 61621, - "ĠFoo": 33428, - "ĠFood": 12098, - "ĠFoods": 39060, - "ĠFool": 71535, - "ĠFoot": 15455, - "ĠFootball": 20761, - "ĠFooter": 26477, - "ĠFor": 1752, - "ĠForCanBeConverted": 79269, - "ĠForCanBeConvertedToF": 79270, - "ĠForCanBeConvertedToForeach": 79271, - "ĠForbes": 47281, - "ĠForbidden": 66440, - "ĠForce": 11732, - "ĠForced": 83313, - "ĠForces": 29400, - "ĠFord": 14010, - "ĠFore": 8207, - "ĠForecast": 55675, - "ĠForeign": 19078, - "ĠForeignKey": 78915, - "ĠForest": 19988, - "ĠForever": 54606, - "ĠForex": 36862, - "ĠForg": 69575, - "ĠForge": 57261, - "ĠForget": 60228, - "ĠForgot": 66174, - "ĠForgotten": 94447, - "ĠFork": 47850, - "ĠForm": 3377, - "ĠFormBuilder": 43480, - "ĠFormControl": 27677, - "ĠFormData": 46593, - "ĠFormGroup": 30926, - "ĠFormal": 79367, - "ĠFormat": 15042, - "ĠFormation": 71366, - "ĠFormats": 79348, - "ĠFormatter": 81387, - "ĠFormatting": 89588, - "ĠFormer": 32500, - "ĠForms": 23572, - "ĠFormsModule": 36224, - "ĠFormula": 30822, - "ĠForrest": 83730, - "ĠFors": 49890, - "ĠFort": 11002, - "ĠFortnite": 86420, - "ĠFortress": 71435, - "ĠFortunately": 41436, - "ĠFortune": 45231, - "ĠForty": 84943, - "ĠForum": 17538, - "ĠForums": 44515, - "ĠForward": 22164, - "ĠFoster": 38174, - "ĠFot": 73211, - "ĠFoto": 49342, - "ĠFotos": 66419, - "ĠFou": 94210, - "ĠFound": 12315, - "ĠFoundation": 5007, - "ĠFoundations": 98512, - "ĠFounded": 77711, - "ĠFounder": 54528, - "ĠFountain": 77224, - "ĠFour": 13322, - "ĠFourier": 88954, - "ĠFourth": 35074, - "ĠFowler": 74143, - "ĠFox": 13282, - "ĠFr": 2869, - "ĠFra": 22700, - "ĠFraction": 51893, - "ĠFrag": 58089, - "ĠFrage": 67232, - "ĠFragen": 70777, - "ĠFragment": 19034, - "ĠFram": 65140, - "ĠFrame": 16321, - "ĠFrames": 64597, - "ĠFramework": 23752, - "ĠFran": 30825, - "ĠFranc": 9694, - "ĠFrance": 9625, - "ĠFrances": 42733, - "ĠFrancesco": 88599, - "ĠFrancis": 25127, - "ĠFrancisco": 12879, - "ĠFranco": 43843, - "ĠFrancois": 91371, - "ĠFrank": 9270, - "ĠFranken": 90715, - "ĠFrankfurt": 55184, - "ĠFrankie": 93445, - "ĠFranklin": 18841, - "ĠFranz": 65520, - "ĠFranç": 83839, - "ĠFrançais": 138861, - "ĠFrançois": 84707, - "ĠFraser": 55130, - "ĠFrau": 51743, - "ĠFraud": 65947, - "ĠFrauen": 47610, - "ĠFre": 7577, - "ĠFreak": 80125, - "ĠFred": 27488, - "ĠFreddie": 67262, - "ĠFreddy": 95782, - "ĠFreder": 35432, - "ĠFrederick": 50664, - "ĠFree": 3574, - "ĠFreeBSD": 74560, - "ĠFreed": 86876, - "ĠFreedom": 24327, - "ĠFreel": 79933, - "ĠFreem": 95086, - "ĠFreeman": 49564, - "ĠFreeze": 78592, - "ĠFreight": 90238, - "ĠFrem": 67210, - "ĠFrench": 8585, - "ĠFrequ": 34032, - "ĠFrequency": 42380, - "ĠFrequently": 92620, - "ĠFres": 59650, - "ĠFresh": 29160, - "ĠFresno": 81170, - "ĠFreud": 71534, - "ĠFreund": 77779, - "ĠFri": 30402, - "ĠFrid": 63004, - "ĠFriday": 6602, - "ĠFridays": 79423, - "ĠFried": 30251, - "ĠFriedman": 61358, - "ĠFriedrich": 79374, - "ĠFriend": 11587, - "ĠFriendly": 48417, - "ĠFriends": 22508, - "ĠFriendship": 72069, - "ĠFritz": 89983, - "ĠFrm": 91995, - "ĠFro": 23413, - "ĠFrog": 71419, - "ĠFrom": 5542, - "ĠFront": 14902, - "ĠFrontier": 57318, - "ĠFrost": 41220, - "ĠFrozen": 57746, - "ĠFruit": 43087, - "ĠFry": 52417, - "ĠFs": 84619, - "ĠFt": 44379, - "ĠFu": 29253, - "ĠFuck": 25090, - "ĠFucked": 63562, - "ĠFucking": 65860, - "ĠFuel": 36284, - "ĠFuj": 62270, - "ĠFuji": 87053, - "ĠFuk": 62659, - "ĠFukushima": 88739, - "ĠFul": 47450, - "ĠFull": 8627, - "ĠFullName": 97147, - "ĠFuller": 70469, - "ĠFully": 48156, - "ĠFulton": 88884, - "ĠFun": 16071, - "ĠFunc": 18016, - "ĠFunction": 5712, - "ĠFunctional": 54450, - "ĠFunctions": 23550, - "ĠFunctor": 87632, - "ĠFund": 13190, - "ĠFundamental": 91439, - "ĠFunding": 63715, - "ĠFunds": 60188, - "ĠFuneral": 58349, - "ĠFunk": 39610, - "ĠFunktion": 71065, - "ĠFunny": 52840, - "ĠFur": 49840, - "ĠFurious": 92331, - "ĠFurn": 64472, - "ĠFurniture": 29239, - "ĠFurther": 15533, - "ĠFurthermore": 23405, - "ĠFury": 49379, - "ĠFus": 93300, - "ĠFuse": 73515, - "ĠFusion": 42237, - "ĠFut": 42547, - "ĠFuture": 12498, - "ĠFutures": 76267, - "ĠFuÃŁ": 91062, - "ĠFuÃŁball": 143575, - "ĠFälle": 143053, - "ĠFé": 88150, - "ĠFör": 86467, - "ĠFörder": 142407, - "ĠFührung": 142332, - "ĠFür": 45481, - "ĠG": 479, - "ĠGA": 26341, - "ĠGAL": 83362, - "ĠGAM": 81811, - "ĠGAME": 31336, - "ĠGANG": 96477, - "ĠGAP": 89887, - "ĠGAR": 96591, - "ĠGAS": 89709, - "ĠGB": 18865, - "ĠGBP": 83261, - "ĠGC": 22381, - "ĠGCBO": 82746, - "ĠGCC": 44938, - "ĠGD": 39627, - "ĠGDK": 73886, - "ĠGDP": 29730, - "ĠGDPR": 90948, - "ĠGE": 29857, - "ĠGEN": 42674, - "ĠGENER": 28108, - "ĠGENERAL": 52312, - "ĠGENERATED": 72032, - "ĠGENERIC": 94360, - "ĠGEO": 85109, - "ĠGER": 89221, - "ĠGET": 7890, - "ĠGETGLOBAL": 90854, - "ĠGF": 40026, - "ĠGFP": 60070, - "ĠGFX": 76155, - "ĠGG": 56698, - "ĠGH": 47484, - "ĠGHC": 83716, - "ĠGHz": 51305, - "ĠGI": 48509, - "ĠGIF": 46766, - "ĠGIR": 85009, - "ĠGIS": 82371, - "ĠGIT": 90092, - "ĠGIVEN": 89836, - "ĠGK": 97409, - "ĠGL": 5588, - "ĠGLES": 78648, - "ĠGLFW": 41570, - "ĠGLOBAL": 41287, - "ĠGLUT": 69273, - "ĠGLenum": 52672, - "ĠGLfloat": 46482, - "ĠGLint": 48165, - "ĠGLsizei": 79703, - "ĠGLuint": 43252, - "ĠGM": 19172, - "ĠGMC": 91568, - "ĠGMO": 66220, - "ĠGMT": 24488, - "ĠGN": 41002, - "ĠGNOME": 97586, - "ĠGNU": 4253, - "ĠGNUNET": 99099, - "ĠGO": 12604, - "ĠGOD": 58378, - "ĠGOLD": 72763, - "ĠGOOD": 21722, - "ĠGOODMAN": 94946, - "ĠGOODS": 29666, - "ĠGOOGLE": 90216, - "ĠGOP": 18106, - "ĠGOT": 79909, - "ĠGObject": 79125, - "ĠGP": 23690, - "ĠGPA": 70055, - "ĠGPI": 96537, - "ĠGPIO": 10703, - "ĠGPL": 22942, - "ĠGPLv": 82602, - "ĠGPS": 23344, - "ĠGPU": 22670, - "ĠGPUs": 70403, - "ĠGR": 14773, - "ĠGRA": 64020, - "ĠGRAPH": 68636, - "ĠGRAT": 94241, - "ĠGRE": 61896, - "ĠGREAT": 60993, - "ĠGREEN": 53559, - "ĠGRID": 64927, - "ĠGROUP": 26870, - "ĠGS": 35270, - "ĠGSL": 97368, - "ĠGSM": 67555, - "ĠGST": 32834, - "ĠGT": 11911, - "ĠGTA": 58745, - "ĠGTK": 37379, - "ĠGTX": 33940, - "ĠGU": 45272, - "ĠGUI": 16435, - "ĠGUIContent": 82520, - "ĠGUID": 30221, - "ĠGUIDATA": 91388, - "ĠGUIDE": 94657, - "ĠGUILayout": 46429, - "ĠGUIStyle": 98550, - "ĠGURL": 93419, - "ĠGV": 80800, - "ĠGW": 41253, - "ĠGX": 62052, - "ĠGa": 18373, - "ĠGab": 23732, - "ĠGabri": 70714, - "ĠGabriel": 38743, - "ĠGad": 70942, - "ĠGael": 88638, - "ĠGaga": 80574, - "ĠGain": 49709, - "ĠGaines": 82679, - "ĠGal": 10620, - "ĠGala": 75441, - "ĠGalactic": 75217, - "ĠGalaxy": 19662, - "ĠGale": 78232, - "ĠGall": 24877, - "ĠGallagher": 77987, - "ĠGallery": 19295, - "ĠGallup": 79801, - "ĠGam": 29979, - "ĠGamb": 66789, - "ĠGambling": 85343, - "ĠGame": 4050, - "ĠGameController": 96896, - "ĠGameManager": 48714, - "ĠGameObject": 10705, - "ĠGameState": 47987, - "ĠGameplay": 85898, - "ĠGamer": 75659, - "ĠGames": 11610, - "ĠGaming": 30462, - "ĠGamma": 57682, - "ĠGan": 49081, - "ĠGand": 38321, - "ĠGandhi": 47894, - "ĠGang": 34417, - "ĠGap": 57915, - "ĠGar": 12193, - "ĠGarage": 38896, - "ĠGarc": 29314, - "ĠGarcia": 37710, - "ĠGarcÃŃa": 84241, - "ĠGard": 22443, - "ĠGarden": 19021, - "ĠGardens": 42043, - "ĠGardner": 56629, - "ĠGareth": 87047, - "ĠGarland": 78974, - "ĠGarlic": 94725, - "ĠGarmin": 88169, - "ĠGarn": 64032, - "ĠGarner": 85988, - "ĠGarr": 94157, - "ĠGarrett": 57616, - "ĠGarrison": 98486, - "ĠGarten": 93912, - "ĠGary": 23826, - "ĠGas": 20854, - "ĠGast": 62642, - "ĠGat": 72113, - "ĠGate": 29243, - "ĠGates": 35493, - "ĠGateway": 39378, - "ĠGather": 48995, - "ĠGathering": 75585, - "ĠGauge": 72060, - "ĠGaul": 94526, - "ĠGauss": 93216, - "ĠGaussian": 48568, - "ĠGaut": 95054, - "ĠGavin": 63395, - "ĠGaw": 85538, - "ĠGay": 20677, - "ĠGaz": 43292, - "ĠGaza": 28662, - "ĠGazette": 74582, - "ĠGda": 141844, - "ĠGdaÅĦsk": 141845, - "ĠGdk": 75540, - "ĠGe": 4229, - "ĠGeForce": 37520, - "ĠGear": 27503, - "ĠGeb": 44336, - "ĠGebä": 142417, - "ĠGebäude": 142418, - "ĠGecko": 42599, - "ĠGed": 64477, - "ĠGee": 95597, - "ĠGeek": 70365, - "ĠGef": 55857, - "ĠGefühl": 141176, - "ĠGeg": 98863, - "ĠGeh": 73580, - "ĠGeile": 76404, - "ĠGel": 44382, - "ĠGeld": 51239, - "ĠGeli": 143571, - "ĠGeliÅŁ": 143572, - "ĠGem": 31145, - "ĠGeme": 77775, - "ĠGemini": 85711, - "ĠGems": 81072, - "ĠGen": 9316, - "ĠGender": 28217, - "ĠGene": 24022, - "ĠGener": 2607, - "ĠGeneral": 3251, - "ĠGenerally": 43393, - "ĠGenerate": 19813, - "ĠGenerated": 30488, - "ĠGenerates": 52492, - "ĠGenerating": 96454, - "ĠGeneration": 23470, - "ĠGenerationType": 55700, - "ĠGenerator": 28358, - "ĠGeneric": 21281, - "ĠGenesis": 40788, - "ĠGenetic": 74126, - "ĠGenetics": 83286, - "ĠGeneva": 44245, - "ĠGenius": 77801, - "ĠGenome": 81817, - "ĠGenre": 40295, - "ĠGent": 35723, - "ĠGentle": 73469, - "ĠGenuine": 82882, - "ĠGenç": 138734, - "ĠGeo": 31910, - "ĠGeoff": 50430, - "ĠGeoffrey": 88139, - "ĠGeographic": 65442, - "ĠGeography": 83325, - "ĠGeological": 79750, - "ĠGeometry": 38918, - "ĠGeorg": 13326, - "ĠGeorge": 9857, - "ĠGeorges": 94259, - "ĠGeorgetown": 64939, - "ĠGeorgia": 15893, - "ĠGeorgian": 86442, - "ĠGer": 19929, - "ĠGerald": 54257, - "ĠGerard": 81118, - "ĠGerm": 36735, - "ĠGerman": 5938, - "ĠGermans": 40937, - "ĠGermany": 9856, - "ĠGerr": 85865, - "ĠGerry": 90987, - "ĠGerät": 136800, - "ĠGerçek": 143033, - "ĠGes": 20404, - "ĠGesch": 35346, - "ĠGeschichte": 77930, - "ĠGeschä": 137193, - "ĠGeschäfts": 137194, - "ĠGespr": 142126, - "ĠGespräch": 142127, - "ĠGest": 53899, - "ĠGesture": 49864, - "ĠGestureDetector": 63132, - "ĠGet": 2126, - "ĠGetAll": 45587, - "ĠGetById": 92085, - "ĠGetComponent": 27750, - "ĠGetCurrent": 94098, - "ĠGetData": 75016, - "ĠGetEnumerator": 46479, - "ĠGetHashCode": 81678, - "ĠGetLastError": 79362, - "ĠGetMessage": 94229, - "ĠGetName": 92788, - "ĠGetString": 97921, - "ĠGetType": 66859, - "ĠGetUser": 85937, - "ĠGetValue": 68921, - "ĠGets": 10310, - "ĠGetter": 56130, - "ĠGetting": 24515, - "ĠGetty": 20530, - "ĠGew": 42678, - "ĠGh": 23908, - "ĠGhana": 47568, - "ĠGhost": 25044, - "ĠGi": 15392, - "ĠGian": 78604, - "ĠGiant": 40741, - "ĠGiants": 29735, - "ĠGib": 28379, - "ĠGibbs": 83551, - "ĠGibraltar": 98803, - "ĠGibson": 43422, - "ĠGift": 22062, - "ĠGifts": 55960, - "ĠGig": 44134, - "ĠGil": 20793, - "ĠGilbert": 44992, - "ĠGiles": 84831, - "ĠGill": 32726, - "ĠGilles": 76124, - "ĠGim": 85671, - "ĠGin": 50583, - "ĠGina": 76212, - "ĠGing": 74746, - "ĠGinger": 67294, - "ĠGingrich": 86393, - "ĠGinny": 93154, - "ĠGins": 85729, - "ĠGio": 66665, - "ĠGiov": 60578, - "ĠGiovanni": 75852, - "ĠGir": 46935, - "ĠGiriÅŁ": 140666, - "ĠGirl": 11363, - "ĠGirlfriend": 98493, - "ĠGirls": 20065, - "ĠGit": 21120, - "ĠGitHub": 32095, - "ĠGithub": 48923, - "ĠGiul": 62551, - "ĠGiuliani": 88050, - "ĠGive": 20678, - "ĠGiven": 16246, - "ĠGives": 68913, - "ĠGiving": 57851, - "ĠGiz": 66288, - "ĠGiá": 131310, - "ĠGiám": 137295, - "ĠGiáo": 133218, - "ĠGiải": 135816, - "ĠGiấy": 140288, - "ĠGiỼi": 138290, - "ĠGl": 8280, - "ĠGlacier": 95386, - "ĠGlad": 51641, - "ĠGladiator": 95128, - "ĠGlam": 86713, - "ĠGlas": 37832, - "ĠGlasgow": 42897, - "ĠGlass": 20734, - "ĠGlasses": 98266, - "ĠGle": 71397, - "ĠGlen": 39961, - "ĠGlenn": 39108, - "ĠGlide": 56026, - "ĠGlo": 24373, - "ĠGlob": 62288, - "ĠGlobal": 7962, - "ĠGlobalKey": 85358, - "ĠGlobals": 50176, - "ĠGlobe": 40810, - "ĠGlock": 98980, - "ĠGloria": 74993, - "ĠGlory": 58161, - "ĠGloss": 66042, - "ĠGlouce": 86486, - "ĠGlover": 94083, - "ĠGloves": 67454, - "ĠGlow": 87348, - "ĠGluten": 94912, - "ĠGly": 78083, - "ĠGlyph": 87413, - "ĠGlück": 135972, - "ĠGmail": 60946, - "ĠGmbH": 31477, - "ĠGn": 95151, - "ĠGo": 5994, - "ĠGoa": 85522, - "ĠGoal": 39947, - "ĠGoals": 54193, - "ĠGoat": 92772, - "ĠGobierno": 84072, - "ĠGoblin": 80164, - "ĠGod": 4264, - "ĠGoddess": 60685, - "ĠGods": 43775, - "ĠGodzilla": 86996, - "ĠGoes": 60161, - "ĠGoing": 34871, - "ĠGoku": 76036, - "ĠGol": 54579, - "ĠGold": 7421, - "ĠGoldberg": 71575, - "ĠGolden": 17809, - "ĠGoldman": 47328, - "ĠGolf": 27033, - "ĠGomez": 62298, - "ĠGon": 79706, - "ĠGone": 55255, - "ĠGong": 97375, - "ĠGonz": 32455, - "ĠGonzalez": 51086, - "ĠGood": 7684, - "ĠGoodman": 70392, - "ĠGoods": 41595, - "ĠGoogle": 5085, - "ĠGoose": 81107, - "ĠGor": 46147, - "ĠGord": 98334, - "ĠGordon": 25867, - "ĠGore": 48525, - "ĠGorgeous": 86961, - "ĠGors": 97674, - "ĠGos": 62381, - "ĠGospel": 43368, - "ĠGot": 24528, - "ĠGoth": 31937, - "ĠGotham": 73882, - "ĠGothic": 43101, - "ĠGott": 68009, - "ĠGould": 84331, - "ĠGov": 24424, - "ĠGover": 93884, - "ĠGovern": 7955, - "ĠGovernance": 80589, - "ĠGovernment": 10212, - "ĠGovernments": 87699, - "ĠGovernor": 23358, - "ĠGovernors": 89989, - "ĠGow": 92471, - "ĠGr": 2825, - "ĠGra": 39013, - "ĠGrab": 36194, - "ĠGrace": 31071, - "ĠGrad": 21794, - "ĠGrade": 23812, - "ĠGrades": 95220, - "ĠGradient": 53107, - "ĠGraduate": 43725, - "ĠGraf": 74629, - "ĠGraham": 25124, - "ĠGrain": 74274, - "ĠGram": 28837, - "ĠGrammar": 61977, - "ĠGrammy": 73579, - "ĠGran": 26524, - "ĠGrand": 10304, - "ĠGrande": 36523, - "ĠGrandma": 97968, - "ĠGranite": 64494, - "ĠGranny": 88140, - "ĠGrant": 23736, - "ĠGranted": 72843, - "ĠGrants": 72801, - "ĠGrape": 79529, - "ĠGraph": 12165, - "ĠGraphQL": 35087, - "ĠGraphic": 43951, - "ĠGraphics": 20296, - "ĠGrass": 39946, - "ĠGrat": 42081, - "ĠGratis": 23775, - "ĠGratuit": 53509, - "ĠGrave": 73742, - "ĠGraves": 79058, - "ĠGravity": 47490, - "ĠGray": 23366, - "ĠGraz": 92930, - "ĠGre": 13532, - "ĠGreat": 8513, - "ĠGreater": 32281, - "ĠGreatest": 61812, - "ĠGree": 20422, - "ĠGreece": 24427, - "ĠGreek": 17860, - "ĠGreeks": 60680, - "ĠGreen": 7840, - "ĠGreene": 58074, - "ĠGreenland": 72678, - "ĠGreens": 41591, - "ĠGreenville": 92554, - "ĠGreenwich": 85838, - "ĠGreenwood": 89974, - "ĠGreg": 16046, - "ĠGregg": 80696, - "ĠGregory": 42969, - "ĠGren": 38124, - "ĠGret": 87552, - "ĠGrey": 25685, - "ĠGri": 62904, - "ĠGrid": 10587, - "ĠGridBagConstraints": 51923, - "ĠGridLayout": 80079, - "ĠGridView": 40935, - "ĠGriff": 27794, - "ĠGriffin": 40396, - "ĠGriffith": 63540, - "ĠGrill": 49848, - "ĠGrim": 73304, - "ĠGrimm": 84792, - "ĠGrinder": 68500, - "ĠGrinding": 38612, - "ĠGrip": 78821, - "ĠGro": 17888, - "ĠGrocery": 95581, - "ĠGron": 86230, - "ĠGros": 69852, - "ĠGross": 42807, - "ĠGround": 25413, - "ĠGroup": 5737, - "ĠGroupLayout": 91843, - "ĠGroups": 34580, - "ĠGrove": 40134, - "ĠGrow": 46560, - "ĠGrowing": 59680, - "ĠGrowth": 33771, - "ĠGroÃŁ": 133661, - "ĠGrund": 47227, - "ĠGrupo": 74907, - "ĠGry": 98448, - "ĠGrÃ¶ÃŁe": 137208, - "ĠGrü": 94063, - "ĠGründe": 140917, - "ĠGson": 38394, - "ĠGst": 80320, - "ĠGtk": 27296, - "ĠGtkWidget": 66108, - "ĠGu": 4570, - "ĠGuam": 91688, - "ĠGuang": 64437, - "ĠGuantanamo": 98300, - "ĠGuar": 39000, - "ĠGuarantee": 64676, - "ĠGuaranteed": 80437, - "ĠGuard": 12262, - "ĠGuardian": 24454, - "ĠGuardians": 61731, - "ĠGuards": 69285, - "ĠGuatemala": 61978, - "ĠGuerr": 79783, - "ĠGuerrero": 97736, - "ĠGuess": 54279, - "ĠGuest": 26215, - "ĠGuests": 61582, - "ĠGui": 49998, - "ĠGuid": 12157, - "ĠGuidance": 81561, - "ĠGuide": 12712, - "ĠGuidelines": 47428, - "ĠGuides": 59445, - "ĠGuil": 92568, - "ĠGuild": 32492, - "ĠGuill": 73638, - "ĠGuinea": 47803, - "ĠGuinness": 88459, - "ĠGuitar": 46659, - "ĠGujar": 55631, - "ĠGujarat": 61853, - "ĠGul": 58889, - "ĠGulf": 26847, - "ĠGum": 74489, - "ĠGun": 21707, - "ĠGund": 69380, - "ĠGundam": 87376, - "ĠGunn": 65149, - "ĠGuns": 59465, - "ĠGupta": 73698, - "ĠGur": 60933, - "ĠGuru": 61979, - "ĠGus": 81379, - "ĠGust": 48620, - "ĠGut": 51583, - "ĠGutenberg": 51586, - "ĠGuth": 91755, - "ĠGuy": 25273, - "ĠGuys": 50200, - "ĠGuzzle": 96833, - "ĠGwen": 94784, - "ĠGy": 54915, - "ĠGym": 45531, - "ĠGä": 94589, - "ĠGäste": 136088, - "ĠGòn": 136942, - "ĠGór": 137785, - "ĠGö": 82146, - "ĠGör": 132906, - "ĠGü": 80163, - "ĠGül": 135210, - "ĠGün": 130022, - "ĠGünc": 141677, - "ĠGüncelle": 141678, - "ĠGüncelleme": 141679, - "ĠGüzel": 141378, - "ĠGÅĤ": 141783, - "ĠGÅĤówn": 141784, - "ĠH": 472, - "ĠHA": 41316, - "ĠHACK": 95123, - "ĠHAL": 20533, - "ĠHALF": 95322, - "ĠHAND": 52469, - "ĠHANDLE": 45273, - "ĠHAPP": 86777, - "ĠHAR": 86488, - "ĠHARD": 69902, - "ĠHAS": 35748, - "ĠHASH": 58857, - "ĠHAVE": 18590, - "ĠHB": 39701, - "ĠHBO": 42878, - "ĠHC": 45828, - "ĠHCI": 84335, - "ĠHD": 12169, - "ĠHDC": 96317, - "ĠHDD": 68523, - "ĠHDF": 80240, - "ĠHDMI": 41050, - "ĠHDR": 54391, - "ĠHE": 11685, - "ĠHEAD": 33080, - "ĠHEADER": 39665, - "ĠHEALTH": 72625, - "ĠHEAP": 99091, - "ĠHEIGHT": 41900, - "ĠHEL": 37657, - "ĠHELP": 55471, - "ĠHER": 15645, - "ĠHERE": 19249, - "ĠHERO": 86617, - "ĠHEX": 72221, - "ĠHF": 50558, - "ĠHG": 69397, - "ĠHH": 24756, - "ĠHI": 33411, - "ĠHID": 61415, - "ĠHIGH": 37617, - "ĠHIM": 88894, - "ĠHIP": 80296, - "ĠHIS": 65126, - "ĠHISTORY": 61779, - "ĠHIT": 78403, - "ĠHIV": 22664, - "ĠHK": 42217, - "ĠHL": 52487, - "ĠHLS": 92177, - "ĠHM": 45414, - "ĠHMAC": 95927, - "ĠHMS": 96070, - "ĠHO": 30250, - "ĠHOL": 95622, - "ĠHOLD": 17542, - "ĠHOLDER": 60693, - "ĠHOLDERS": 20620, - "ĠHOME": 40567, - "ĠHOR": 83566, - "ĠHOST": 44578, - "ĠHOT": 53373, - "ĠHOUR": 95964, - "ĠHOUSE": 68361, - "ĠHOW": 23532, - "ĠHOWEVER": 29316, - "ĠHP": 12200, - "ĠHPV": 73369, - "ĠHQ": 45255, - "ĠHR": 22299, - "ĠHRESULT": 29603, - "ĠHS": 33414, - "ĠHSV": 80311, - "ĠHT": 5260, - "ĠHTC": 48267, - "ĠHTML": 9308, - "ĠHTMLElement": 43899, - "ĠHTTP": 10130, - "ĠHTTPS": 61044, - "ĠHUD": 48596, - "ĠHUGE": 72656, - "ĠHV": 48217, - "ĠHVAC": 65333, - "ĠHW": 26670, - "ĠHWND": 60384, - "ĠHY": 63252, - "ĠHa": 14101, - "ĠHab": 28876, - "ĠHabit": 94078, - "ĠHabitat": 98588, - "ĠHack": 34982, - "ĠHacker": 88065, - "ĠHad": 23864, - "ĠHag": 66539, - "ĠHague": 84926, - "ĠHai": 62682, - "ĠHair": 25697, - "ĠHairst": 88315, - "ĠHait": 42402, - "ĠHaiti": 55190, - "ĠHaj": 83426, - "ĠHak": 71298, - "ĠHal": 19851, - "ĠHale": 66151, - "ĠHaley": 67711, - "ĠHalf": 25839, - "ĠHalifax": 69669, - "ĠHall": 10926, - "ĠHalloween": 26613, - "ĠHalo": 45249, - "ĠHam": 9582, - "ĠHamas": 40641, - "ĠHamburg": 50462, - "ĠHamilton": 23176, - "ĠHamm": 73347, - "ĠHammer": 36894, - "ĠHammond": 64343, - "ĠHamp": 28414, - "ĠHampshire": 30897, - "ĠHampton": 63674, - "ĠHan": 20644, - "ĠHancock": 80267, - "ĠHand": 8536, - "ĠHandbook": 48824, - "ĠHandle": 13760, - "ĠHandler": 19954, - "ĠHandlers": 95563, - "ĠHandles": 21008, - "ĠHandling": 55713, - "ĠHands": 42296, - "ĠHandy": 71559, - "ĠHang": 40775, - "ĠHanging": 89555, - "ĠHank": 54661, - "ĠHann": 27729, - "ĠHanna": 84763, - "ĠHannah": 47261, - "ĠHannity": 89693, - "ĠHans": 24807, - "ĠHansen": 57153, - "ĠHanson": 75213, - "ĠHao": 93709, - "ĠHapp": 34700, - "ĠHappiness": 78144, - "ĠHappy": 23355, - "ĠHar": 5227, - "ĠHaram": 84542, - "ĠHarbor": 39182, - "ĠHarbour": 62007, - "ĠHard": 11232, - "ĠHardcore": 59550, - "ĠHardcover": 97527, - "ĠHarden": 89793, - "ĠHarding": 96493, - "ĠHardware": 36765, - "ĠHardy": 57274, - "ĠHari": 97445, - "ĠHarlem": 82752, - "ĠHarley": 51676, - "ĠHarm": 90971, - "ĠHarmon": 39659, - "ĠHarmony": 65380, - "ĠHarness": 93899, - "ĠHarold": 52115, - "ĠHarper": 32007, - "ĠHarr": 15234, - "ĠHarris": 21071, - "ĠHarrison": 35527, - "ĠHarry": 13928, - "ĠHart": 22900, - "ĠHartford": 72120, - "ĠHarvard": 24951, - "ĠHarvest": 55835, - "ĠHarvey": 33322, - "ĠHas": 11443, - "ĠHasan": 98972, - "ĠHash": 6531, - "ĠHashMap": 10528, - "ĠHashSet": 18931, - "ĠHashtable": 49224, - "ĠHaskell": 62176, - "ĠHass": 42022, - "ĠHassan": 59677, - "ĠHast": 59507, - "ĠHastings": 78744, - "ĠHat": 21341, - "ĠHatch": 58894, - "ĠHate": 65812, - "ĠHath": 90568, - "ĠHats": 90215, - "ĠHaupt": 89931, - "ĠHaus": 47375, - "ĠHaut": 83234, - "ĠHav": 55108, - "ĠHavana": 85875, - "ĠHave": 12243, - "ĠHaven": 41614, - "ĠHaving": 20035, - "ĠHaw": 12611, - "ĠHawai": 21437, - "ĠHawaii": 27521, - "ĠHawaiian": 58003, - "ĠHawk": 55323, - "ĠHawkins": 69587, - "ĠHawks": 56612, - "ĠHawth": 85783, - "ĠHay": 17798, - "ĠHayden": 76185, - "ĠHayes": 52422, - "ĠHayward": 92205, - "ĠHaz": 31495, - "ĠHazard": 68774, - "ĠHazel": 75379, - "ĠHd": 64916, - "ĠHe": 1260, - "ĠHead": 11203, - "ĠHeader": 12104, - "ĠHeaderComponent": 93112, - "ĠHeaders": 21426, - "ĠHeading": 51349, - "ĠHeadquarters": 69636, - "ĠHeads": 70507, - "ĠHeal": 81030, - "ĠHealing": 48641, - "ĠHealth": 6267, - "ĠHealthcare": 38335, - "ĠHealthy": 43354, - "ĠHeap": 47307, - "ĠHear": 56099, - "ĠHeard": 94108, - "ĠHearing": 65450, - "ĠHeart": 17965, - "ĠHearth": 84893, - "ĠHearts": 52776, - "ĠHeat": 26070, - "ĠHeater": 87428, - "ĠHeath": 47462, - "ĠHeather": 46263, - "ĠHeating": 67854, - "ĠHeaven": 31350, - "ĠHeavenly": 87050, - "ĠHeavy": 28101, - "ĠHeb": 84319, - "ĠHebrew": 36266, - "ĠHeck": 72717, - "ĠHector": 88040, - "ĠHed": 74163, - "ĠHedge": 79021, - "ĠHeg": 70117, - "ĠHeidi": 81836, - "ĠHeight": 21432, - "ĠHeights": 39403, - "ĠHein": 63682, - "ĠHel": 15806, - "ĠHeld": 82431, - "ĠHelen": 42781, - "ĠHelena": 71946, - "ĠHell": 23887, - "ĠHeller": 92793, - "ĠHello": 21927, - "ĠHelloWorld": 90071, - "ĠHelm": 62042, - "ĠHelmet": 66529, - "ĠHelp": 11479, - "ĠHelper": 12906, - "ĠHelpers": 48314, - "ĠHelpful": 46554, - "ĠHelping": 90701, - "ĠHelps": 88516, - "ĠHelsinki": 76334, - "ĠHelvetica": 59546, - "ĠHem": 32824, - "ĠHemisphere": 95778, - "ĠHemp": 56208, - "ĠHen": 13070, - "ĠHence": 31040, - "ĠHend": 29494, - "ĠHenderson": 44577, - "ĠHenri": 73210, - "ĠHenrik": 98087, - "ĠHenry": 17599, - "ĠHentai": 92042, - "ĠHep": 60145, - "ĠHer": 6252, - "ĠHera": 82557, - "ĠHerald": 41669, - "ĠHerb": 73856, - "ĠHerbal": 86872, - "ĠHerbert": 57363, - "ĠHerc": 77152, - "ĠHercules": 93534, - "ĠHere": 5692, - "ĠHeritage": 33143, - "ĠHerm": 31465, - "ĠHerman": 60238, - "ĠHermes": 93963, - "ĠHermione": 53499, - "ĠHern": 40456, - "ĠHernandez": 53421, - "ĠHero": 16498, - "ĠHeroes": 36999, - "ĠHerr": 42250, - "ĠHerrera": 96008, - "ĠHers": 64366, - "ĠHerz": 52639, - "ĠHess": 98705, - "ĠHet": 33166, - "ĠHew": 59250, - "ĠHex": 27228, - "ĠHexatrigesimal": 78640, - "ĠHey": 27553, - "ĠHezbollah": 61894, - "ĠHi": 21018, - "ĠHib": 91736, - "ĠHibernate": 63448, - "ĠHick": 77928, - "ĠHicks": 73505, - "ĠHidden": 34242, - "ĠHide": 25590, - "ĠHier": 38747, - "ĠHiggins": 82097, - "ĠHigh": 5124, - "ĠHigher": 34221, - "ĠHighest": 59613, - "ĠHighland": 64087, - "ĠHighlander": 48630, - "ĠHighlands": 82925, - "ĠHighlight": 55994, - "ĠHighlights": 52200, - "ĠHighly": 52385, - "ĠHighway": 28766, - "ĠHij": 67990, - "ĠHil": 38596, - "ĠHilfe": 92660, - "ĠHill": 8108, - "ĠHillary": 15033, - "ĠHills": 24919, - "ĠHilton": 52765, - "ĠHim": 20426, - "ĠHimal": 75338, - "ĠHimself": 65469, - "ĠHin": 49633, - "ĠHind": 19825, - "ĠHindered": 94389, - "ĠHinderedRotor": 95065, - "ĠHindi": 43980, - "ĠHindu": 35042, - "ĠHindus": 81629, - "ĠHint": 51830, - "ĠHip": 44528, - "ĠHipp": 74363, - "ĠHir": 79635, - "ĠHire": 61628, - "ĠHiring": 88197, - "ĠHiro": 56292, - "ĠHis": 5301, - "ĠHispan": 72647, - "ĠHispanic": 40885, - "ĠHispanics": 83832, - "ĠHist": 65905, - "ĠHistogram": 82138, - "ĠHistor": 21683, - "ĠHistoric": 50787, - "ĠHistorical": 40043, - "ĠHistory": 11099, - "ĠHit": 15882, - "ĠHitch": 70364, - "ĠHitler": 30554, - "ĠHits": 53651, - "ĠHive": 68178, - "ĠHiá»ĩn": 132743, - "ĠHiá»ĩp": 140923, - "ĠHmm": 88190, - "ĠHo": 17275, - "ĠHob": 36776, - "ĠHobby": 72592, - "ĠHoch": 67775, - "ĠHockey": 40242, - "ĠHod": 50934, - "ĠHodg": 82884, - "ĠHoe": 86369, - "ĠHof": 71712, - "ĠHoff": 42722, - "ĠHoffman": 61882, - "ĠHog": 49769, - "ĠHogan": 57271, - "ĠHogwarts": 77153, - "ĠHok": 95165, - "ĠHol": 15696, - "ĠHold": 22749, - "ĠHolden": 86385, - "ĠHolder": 40333, - "ĠHolding": 54677, - "ĠHoldings": 53542, - "ĠHolds": 65984, - "ĠHole": 50929, - "ĠHoliday": 31669, - "ĠHolidays": 67003, - "ĠHoll": 24504, - "ĠHolland": 37815, - "ĠHollande": 93331, - "ĠHollow": 48693, - "ĠHolly": 52325, - "ĠHollywood": 17236, - "ĠHolmes": 39301, - "ĠHolocaust": 43098, - "ĠHolt": 58906, - "ĠHoly": 18710, - "ĠHom": 13222, - "ĠHome": 5379, - "ĠHomeComponent": 56852, - "ĠHomeController": 60878, - "ĠHomePage": 44137, - "ĠHomeland": 43704, - "ĠHomemade": 84808, - "ĠHomepage": 67435, - "ĠHomer": 65705, - "ĠHomes": 36564, - "ĠHomework": 82713, - "ĠHomo": 83397, - "ĠHon": 16549, - "ĠHond": 58115, - "ĠHonda": 28887, - "ĠHonduras": 70315, - "ĠHonest": 53184, - "ĠHonestly": 70947, - "ĠHoney": 39615, - "ĠHong": 19180, - "ĠHonolulu": 81540, - "ĠHonor": 41944, - "ĠHonour": 95814, - "ĠHood": 35343, - "ĠHook": 28171, - "ĠHooks": 38430, - "ĠHoover": 72309, - "ĠHop": 25553, - "ĠHope": 17758, - "ĠHopefully": 37894, - "ĠHopkins": 44216, - "ĠHor": 14741, - "ĠHorde": 70382, - "ĠHorizon": 55451, - "ĠHorizontal": 39909, - "ĠHorm": 91108, - "ĠHorn": 26114, - "ĠHornets": 95327, - "ĠHorny": 68254, - "ĠHorror": 51712, - "ĠHorse": 33292, - "ĠHort": 96109, - "ĠHorton": 94595, - "ĠHos": 63990, - "ĠHose": 55584, - "ĠHosp": 56933, - "ĠHospital": 15079, - "ĠHospitality": 87605, - "ĠHospitals": 84297, - "ĠHost": 16102, - "ĠHosting": 68423, - "ĠHot": 8007, - "ĠHotel": 14552, - "ĠHotels": 44771, - "ĠHou": 59600, - "ĠHour": 30833, - "ĠHours": 29092, - "ĠHouse": 4678, - "ĠHousehold": 75973, - "ĠHouses": 57659, - "ĠHousing": 30333, - "ĠHouston": 16003, - "ĠHover": 85569, - "ĠHow": 2585, - "ĠHoward": 19870, - "ĠHowe": 85531, - "ĠHowell": 96179, - "ĠHowever": 4354, - "ĠHoy": 79692, - "ĠHoÃłng": 130597, - "ĠHp": 87833, - "ĠHtml": 19200, - "ĠHtmlWebpackPlugin": 92415, - "ĠHttp": 4823, - "ĠHttpClient": 18674, - "ĠHttpClientModule": 53649, - "ĠHttpContext": 43555, - "ĠHttpHeaders": 43572, - "ĠHttpMethod": 77765, - "ĠHttpNotFound": 73568, - "ĠHttpRequest": 44049, - "ĠHttpResponse": 17580, - "ĠHttpResponseMessage": 68704, - "ĠHttpResponseRedirect": 53030, - "ĠHttpServlet": 46219, - "ĠHttpServletRequest": 49594, - "ĠHttpServletResponse": 24988, - "ĠHttpSession": 75568, - "ĠHttpStatus": 39003, - "ĠHttpStatusCode": 49339, - "ĠHttpStatusCodeResult": 80202, - "ĠHttpURLConnection": 94327, - "ĠHu": 21793, - "ĠHuang": 58409, - "ĠHuawei": 50607, - "ĠHub": 26538, - "ĠHubb": 77593, - "ĠHubbard": 79900, - "ĠHuck": 78364, - "ĠHuckabee": 96084, - "ĠHud": 92905, - "ĠHudson": 38153, - "ĠHue": 65951, - "ĠHuff": 35041, - "ĠHuffPost": 93454, - "ĠHuffington": 63641, - "ĠHuffman": 88497, - "ĠHuge": 50783, - "ĠHugh": 29106, - "ĠHughes": 40311, - "ĠHugo": 51094, - "ĠHulk": 60846, - "ĠHull": 57386, - "ĠHulu": 77392, - "ĠHum": 19858, - "ĠHuman": 11097, - "ĠHumanities": 86245, - "ĠHumanity": 82595, - "ĠHumans": 64994, - "ĠHumb": 87309, - "ĠHumph": 70925, - "ĠHun": 14494, - "ĠHund": 97914, - "ĠHundred": 87270, - "ĠHundreds": 72336, - "ĠHung": 25523, - "ĠHungarian": 56769, - "ĠHungary": 42776, - "ĠHunger": 66536, - "ĠHunt": 26592, - "ĠHunter": 23133, - "ĠHunters": 81888, - "ĠHunting": 44254, - "ĠHuntington": 74751, - "ĠHunts": 70626, - "ĠHur": 20995, - "ĠHurricane": 37101, - "ĠHurricanes": 88503, - "ĠHurt": 86249, - "ĠHus": 27897, - "ĠHusband": 73359, - "ĠHuss": 78981, - "ĠHussein": 60528, - "ĠHust": 85450, - "ĠHut": 66313, - "ĠHutch": 59687, - "ĠHutchinson": 98971, - "ĠHv": 91987, - "ĠHwy": 78977, - "ĠHy": 10112, - "ĠHybrid": 49627, - "ĠHyde": 64339, - "ĠHyderabad": 68447, - "ĠHydra": 86861, - "ĠHydraulic": 80004, - "ĠHydro": 39502, - "ĠHyp": 38415, - "ĠHyper": 32732, - "ĠHyundai": 59840, - "ĠHz": 36092, - "ĠHá": 135611, - "ĠHã": 132546, - "ĠHãy": 132547, - "ĠHä": 90593, - "ĠHình": 137515, - "ĠHòa": 134315, - "ĠHóa": 140304, - "ĠHôm": 143958, - "ĠHö": 70264, - "ĠHöhe": 136142, - "ĠHü": 134883, - "ĠHÃł": 128521, - "ĠHÃłn": 130442, - "ĠHÃłng": 137327, - "ĠHÆ¡n": 142121, - "ĠHưng": 139203, - "ĠHương": 139177, - "ĠHÆ°á»Ľng": 136745, - "ĠHạ": 132922, - "ĠHải": 131039, - "ĠHữu": 143965, - "ĠHá»ĩ": 138907, - "ĠHá»į": 136935, - "ĠHá»įc": 133907, - "ĠHá»ĵ": 129785, - "ĠHá»ĵng": 135196, - "ĠHá»Ļi": 129935, - "ĠI": 358, - "ĠIA": 43090, - "ĠIAM": 88186, - "ĠIActionResult": 34514, - "ĠIB": 12102, - "ĠIBM": 27922, - "ĠIBOutlet": 22347, - "ĠIC": 19288, - "ĠICC": 58232, - "ĠICE": 40563, - "ĠICMP": 83988, - "ĠICO": 46536, - "ĠICON": 59324, - "ĠICT": 74202, - "ĠICU": 83915, - "ĠICollection": 36558, - "ĠICommand": 49966, - "ĠIConfiguration": 64490, - "ĠID": 3034, - "ĠIDC": 25000, - "ĠIDD": 80883, - "ĠIDE": 27975, - "ĠIDEA": 72045, - "ĠIDENT": 72754, - "ĠIDEOGRAPH": 96602, - "ĠIDF": 71555, - "ĠIDM": 81455, - "ĠIDR": 96654, - "ĠIDS": 39197, - "ĠIDX": 95937, - "ĠIData": 75876, - "ĠIDb": 85756, - "ĠIDictionary": 59331, - "ĠIDirect": 96632, - "ĠIDisposable": 53889, - "ĠIDs": 28360, - "ĠIE": 18160, - "ĠIEEE": 39035, - "ĠIEntity": 91458, - "ĠIEnumerable": 13050, - "ĠIEnumerator": 27952, - "ĠIF": 11551, - "ĠIG": 46180, - "ĠIGN": 49839, - "ĠIGNORE": 81290, - "ĠIH": 45311, - "ĠIHttp": 73519, - "ĠIHttpActionResult": 91457, - "ĠII": 7946, - "ĠIID": 62121, - "ĠIII": 14429, - "ĠIK": 47391, - "ĠIKE": 84364, - "ĠIL": 11344, - "ĠIList": 28714, - "ĠILogger": 51693, - "ĠIM": 6517, - "ĠIMAGE": 33669, - "ĠIMAGES": 84864, - "ĠIMD": 77263, - "ĠIMDb": 86401, - "ĠIMF": 59070, - "ĠIMG": 43583, - "ĠIMM": 68393, - "ĠIMO": 84071, - "ĠIMP": 39440, - "ĠIMPLEMENT": 80611, - "ĠIMPLIED": 12867, - "ĠIMPORT": 43603, - "ĠIMPORTANT": 67140, - "ĠIMS": 87277, - "ĠIMapper": 90499, - "ĠIMessage": 89937, - "ĠIN": 1964, - "ĠINA": 96299, - "ĠINC": 18118, - "ĠINCIDENT": 28167, - "ĠINCIDENTAL": 28553, - "ĠINCLUDE": 50393, - "ĠINCLUDED": 76451, - "ĠINCLUDING": 16092, - "ĠIND": 19317, - "ĠINDEX": 39300, - "ĠINDIRECT": 27072, - "ĠINF": 34972, - "ĠINFO": 30771, - "ĠINFORMATION": 44513, - "ĠINIT": 29964, - "ĠINITIAL": 56854, - "ĠINLINE": 65586, - "ĠINNER": 30348, - "ĠINPUT": 26149, - "ĠINS": 25692, - "ĠINSERT": 39518, - "ĠINST": 65344, - "ĠINSTALL": 79353, - "ĠINSTANCE": 61127, - "ĠINT": 9221, - "ĠINTEGER": 30381, - "ĠINTER": 29342, - "ĠINTERFACE": 89205, - "ĠINTERN": 61671, - "ĠINTERNAL": 72655, - "ĠINTERNATIONAL": 91411, - "ĠINTERRU": 29082, - "ĠINTERRUPTION": 30569, - "ĠINTERVAL": 91143, - "ĠINTO": 12496, - "ĠINV": 66924, - "ĠINVALID": 32269, - "ĠIO": 6429, - "ĠIOC": 96903, - "ĠIOCTL": 98544, - "ĠIOError": 60961, - "ĠIOException": 9346, - "ĠIOS": 64080, - "ĠIP": 6790, - "ĠIPA": 55747, - "ĠIPAddress": 83296, - "ĠIPC": 45833, - "ĠIPCC": 94561, - "ĠIPL": 76255, - "ĠIPO": 66892, - "ĠIPP": 63673, - "ĠIPPROTO": 86938, - "ĠIPS": 63157, - "ĠIPT": 45473, - "ĠIPV": 91498, - "ĠIPs": 96319, - "ĠIPv": 31560, - "ĠIQ": 36711, - "ĠIQueryable": 61789, - "ĠIR": 16248, - "ĠIRA": 58683, - "ĠIRC": 59328, - "ĠIRQ": 41668, - "ĠIRS": 33383, - "ĠIReadOnly": 82096, - "ĠIRepository": 66476, - "ĠIRequest": 81566, - "ĠIS": 3424, - "ĠISA": 84290, - "ĠISBN": 33426, - "ĠISC": 96181, - "ĠISI": 77201, - "ĠISIL": 82069, - "ĠISIS": 22647, - "ĠISO": 21940, - "ĠISP": 53433, - "ĠISPs": 80594, - "ĠISR": 77913, - "ĠISS": 36396, - "ĠISSN": 86686, - "ĠISSUE": 85901, - "ĠIST": 75458, - "ĠIService": 65725, - "ĠIT": 8700, - "ĠITE": 66956, - "ĠITEM": 35932, - "ĠITEMS": 77465, - "ĠITER": 87816, - "ĠITS": 46075, - "ĠITV": 93355, - "ĠIU": 80625, - "ĠIUser": 50894, - "ĠIV": 16824, - "ĠIW": 74536, - "ĠIX": 39712, - "ĠIan": 28235, - "ĠIb": 57497, - "ĠIbid": 75468, - "ĠIbn": 72286, - "ĠIbrahim": 65633, - "ĠIce": 19939, - "ĠIceland": 38396, - "ĠIcelandic": 99148, - "ĠIch": 25861, - "ĠIcon": 11226, - "ĠIconButton": 45586, - "ĠIconData": 65464, - "ĠIcons": 31187, - "ĠId": 5223, - "ĠIdaho": 39587, - "ĠIde": 13804, - "ĠIdea": 51001, - "ĠIdeal": 48427, - "ĠIdeally": 66701, - "ĠIdeas": 22898, - "ĠIdent": 22507, - "ĠIdentification": 58676, - "ĠIdentified": 96337, - "ĠIdentifier": 34621, - "ĠIdentify": 64547, - "ĠIdentity": 26540, - "ĠIdle": 70300, - "ĠIdol": 77864, - "ĠIf": 1416, - "ĠIg": 38451, - "ĠIgn": 33781, - "ĠIgnore": 38971, - "ĠIgor": 80998, - "ĠIh": 19051, - "ĠIhnen": 43860, - "ĠIhr": 35783, - "ĠIhre": 38472, - "ĠIhrem": 77065, - "ĠIhren": 70836, - "ĠIhrer": 75077, - "ĠIk": 41333, - "ĠIke": 98634, - "ĠIkea": 74439, - "ĠIl": 7543, - "ĠIll": 12516, - "ĠIllegal": 15038, - "ĠIllegalAccessException": 88780, - "ĠIllegalArgumentException": 21374, - "ĠIllegalStateException": 40827, - "ĠIllinois": 18657, - "ĠIllum": 60620, - "ĠIlluminate": 7518, - "ĠIllustr": 38054, - "ĠIllustrated": 70061, - "ĠIllustrator": 99060, - "ĠIls": 80145, - "ĠIm": 2362, - "ĠImGui": 38541, - "ĠImVec": 97132, - "ĠImag": 76433, - "ĠImage": 4654, - "ĠImageButton": 74098, - "ĠImageIcon": 48671, - "ĠImageView": 25677, - "ĠImages": 11779, - "ĠImagine": 37791, - "ĠImaging": 64506, - "ĠImam": 89812, - "ĠImg": 49930, - "ĠImm": 15335, - "ĠImmediate": 80310, - "ĠImmediately": 68252, - "ĠImmigration": 39682, - "ĠImmun": 66235, - "ĠImmutable": 39262, - "ĠImmutableList": 92255, - "ĠImp": 14390, - "ĠImpact": 28580, - "ĠImper": 24505, - "ĠImperial": 29913, - "ĠImpl": 88092, - "ĠImplement": 31075, - "ĠImplementation": 30813, - "ĠImplemented": 87013, - "ĠImplements": 49960, - "ĠImplicit": 97032, - "ĠImport": 13213, - "ĠImportError": 54065, - "ĠImportance": 93000, - "ĠImportant": 43821, - "ĠImported": 72266, - "ĠImports": 66098, - "ĠImpossible": 82652, - "ĠImpress": 96783, - "ĠImpro": 21961, - "ĠImprove": 64084, - "ĠImproved": 58123, - "ĠImprovement": 52651, - "ĠIn": 758, - "ĠInbox": 95579, - "ĠInc": 4848, - "ĠInch": 54592, - "ĠInches": 85929, - "ĠIncident": 68735, - "ĠInclude": 29734, - "ĠIncluded": 45964, - "ĠIncludes": 25954, - "ĠIncluding": 55121, - "ĠIncome": 32520, - "ĠIncoming": 96143, - "ĠIncontri": 54030, - "ĠIncorpor": 53704, - "ĠIncorporated": 66695, - "ĠIncorrect": 81857, - "ĠIncre": 31611, - "ĠIncrease": 39633, - "ĠIncreased": 61597, - "ĠIncreases": 67048, - "ĠIncreasing": 73440, - "ĠIncredible": 79853, - "ĠIncrement": 52835, - "ĠInd": 2263, - "ĠIndeed": 22348, - "ĠIndepend": 17127, - "ĠIndependence": 43077, - "ĠIndependent": 21994, - "ĠIndex": 8008, - "ĠIndexError": 60203, - "ĠIndexPath": 32896, - "ĠIndexed": 84404, - "ĠIndia": 6747, - "ĠIndian": 7748, - "ĠIndiana": 21591, - "ĠIndianapolis": 41351, - "ĠIndians": 29407, - "ĠIndicates": 44267, - "ĠIndicator": 63604, - "ĠIndices": 85769, - "ĠIndie": 76339, - "ĠIndies": 84218, - "ĠIndigenous": 46003, - "ĠIndividual": 29340, - "ĠIndividuals": 61425, - "ĠIndo": 75885, - "ĠIndones": 20263, - "ĠIndonesia": 23968, - "ĠIndonesian": 58829, - "ĠIndoor": 63268, - "ĠIndust": 17210, - "ĠIndustrial": 24545, - "ĠIndustries": 36428, - "ĠIndustry": 23840, - "ĠIndy": 56470, - "ĠInetAddress": 94890, - "ĠInf": 14921, - "ĠInfant": 82388, - "ĠInfantry": 64556, - "ĠInfect": 87811, - "ĠInfer": 62658, - "ĠInfinite": 54543, - "ĠInfinity": 39889, - "ĠInflate": 68738, - "ĠInflu": 87554, - "ĠInfluence": 74940, - "ĠInfo": 13074, - "ĠInform": 30601, - "ĠInformation": 8085, - "ĠInformationen": 48842, - "ĠInfos": 77070, - "ĠInfragistics": 54902, - "ĠInfrastructure": 44487, - "ĠIng": 24871, - "ĠIngen": 94468, - "ĠIngram": 94366, - "ĠIngredient": 54897, - "ĠIngredients": 51175, - "ĠInhal": 91912, - "ĠInherits": 72467, - "ĠIni": 73767, - "ĠInit": 15690, - "ĠIniti": 31397, - "ĠInitial": 4127, - "ĠInitialise": 71340, - "ĠInitialization": 39267, - "ĠInitialize": 9008, - "ĠInitializeComponent": 16233, - "ĠInitialized": 7590, - "ĠInitializes": 31882, - "ĠInitializing": 94312, - "ĠInitially": 58556, - "ĠInitiative": 37656, - "ĠInject": 21843, - "ĠInjectable": 29515, - "ĠInjection": 53811, - "ĠInjector": 91965, - "ĠInjury": 65076, - "ĠInk": 41083, - "ĠInkWell": 84840, - "ĠInline": 54235, - "ĠInn": 16952, - "ĠInner": 36356, - "ĠInnoc": 83493, - "ĠInnov": 54847, - "ĠInnovation": 37610, - "ĠInnovative": 97569, - "ĠInput": 5571, - "ĠInputDecoration": 54478, - "ĠInputStream": 24857, - "ĠInputStreamReader": 40287, - "ĠInputs": 46281, - "ĠInquiry": 65702, - "ĠIns": 9726, - "ĠInsert": 17101, - "ĠInserts": 84753, - "ĠInsets": 75367, - "ĠInside": 27368, - "ĠInsider": 44999, - "ĠInsight": 70971, - "ĠInsights": 72037, - "ĠInsp": 29916, - "ĠInspection": 65946, - "ĠInspector": 44495, - "ĠInspir": 88857, - "ĠInspiration": 78477, - "ĠInspired": 64825, - "ĠInst": 5984, - "ĠInstagram": 13991, - "ĠInstall": 19242, - "ĠInstallation": 39145, - "ĠInstalled": 98077, - "ĠInstaller": 88091, - "ĠInstalling": 79800, - "ĠInstance": 19283, - "ĠInstances": 89241, - "ĠInstant": 18058, - "ĠInstantiate": 32288, - "ĠInstead": 12090, - "ĠInstit": 31896, - "ĠInstitut": 95462, - "ĠInstitute": 9976, - "ĠInstitutes": 72728, - "ĠInstitution": 42864, - "ĠInstitutional": 97884, - "ĠInstitutions": 87780, - "ĠInstituto": 86716, - "ĠInstruction": 29051, - "ĠInstructions": 38297, - "ĠInstructor": 62362, - "ĠInstrument": 42305, - "ĠInstruments": 57413, - "ĠInsurance": 21674, - "ĠInt": 1333, - "ĠIntPtr": 23936, - "ĠInteger": 4440, - "ĠIntegr": 29001, - "ĠIntegral": 91660, - "ĠIntegrated": 49421, - "ĠIntegration": 40069, - "ĠIntegrity": 64807, - "ĠIntel": 15611, - "ĠIntellectual": 76856, - "ĠIntelli": 84549, - "ĠIntelliJ": 94082, - "ĠIntelligence": 21392, - "ĠIntelligent": 77088, - "ĠIntent": 8829, - "ĠInter": 5665, - "ĠInteraction": 42707, - "ĠInteractive": 41866, - "ĠIntercept": 98338, - "ĠInterest": 24106, - "ĠInterested": 76262, - "ĠInteresting": 70670, - "ĠInterestingly": 57503, - "ĠInterface": 20019, - "ĠInterfaces": 79857, - "ĠInterior": 28858, - "ĠIntermediate": 60648, - "ĠIntern": 4414, - "ĠInternacional": 95067, - "ĠInternal": 15412, - "ĠInternalEnumerator": 75609, - "ĠInternational": 7179, - "ĠInternet": 8031, - "ĠInterpret": 72077, - "ĠInterpreter": 82493, - "ĠInterr": 79380, - "ĠInterracial": 97063, - "ĠInterrupt": 22145, - "ĠInterruptedException": 35620, - "ĠIntersection": 79014, - "ĠInterstate": 65493, - "ĠInterval": 40584, - "ĠIntervention": 70578, - "ĠInterview": 31467, - "ĠInterviews": 88072, - "ĠIntl": 84578, - "ĠInto": 31645, - "ĠIntr": 60794, - "ĠIntro": 51986, - "ĠIntroduced": 41689, - "ĠIntroduction": 28338, - "ĠInv": 18807, - "ĠInvalid": 13882, - "ĠInvalidArgumentException": 80518, - "ĠInvalidOperationException": 52612, - "ĠInvalidate": 95246, - "ĠInvasion": 94404, - "ĠInvent": 92158, - "ĠInventory": 28126, - "ĠInvest": 12748, - "ĠInvestig": 32080, - "ĠInvestigation": 46897, - "ĠInvestigations": 88105, - "ĠInvestigators": 95752, - "ĠInvesting": 92596, - "ĠInvestment": 32250, - "ĠInvestments": 76890, - "ĠInvestor": 75712, - "ĠInvestors": 69533, - "ĠInvisible": 89038, - "ĠInvitation": 83242, - "ĠInvite": 84923, - "ĠInvocation": 78493, - "ĠInvoice": 40190, - "ĠInvoke": 39667, - "ĠIo": 29655, - "ĠIoT": 49080, - "ĠIon": 44805, - "ĠIonic": 39574, - "ĠIonicModule": 81182, - "ĠIonicPage": 93168, - "ĠIowa": 20700, - "ĠIp": 35033, - "ĠIps": 88962, - "ĠIpsum": 61362, - "ĠIr": 11960, - "ĠIran": 10259, - "ĠIranian": 27401, - "ĠIranians": 89331, - "ĠIraq": 11093, - "ĠIraqi": 30234, - "ĠIre": 13892, - "ĠIreland": 14648, - "ĠIrene": 87213, - "ĠIris": 65721, - "ĠIrish": 17623, - "ĠIrma": 98392, - "ĠIron": 16570, - "ĠIronically": 93880, - "ĠIrr": 78041, - "ĠIrvine": 71285, - "ĠIrving": 55210, - "ĠIs": 2160, - "ĠIsActive": 94600, - "ĠIsNot": 68243, - "ĠIsPlainOldData": 53623, - "ĠIsValid": 70647, - "ĠIsa": 28005, - "ĠIsaac": 41508, - "ĠIsabel": 86786, - "ĠIsaiah": 63430, - "ĠIsh": 56604, - "ĠIsis": 53967, - "ĠIsl": 9219, - "ĠIslam": 14910, - "ĠIslamabad": 91432, - "ĠIslamic": 15203, - "ĠIslamist": 51493, - "ĠIsland": 10720, - "ĠIslanders": 78453, - "ĠIslands": 22235, - "ĠIsle": 54265, - "ĠIsles": 85943, - "ĠIsn": 52196, - "ĠIso": 86943, - "ĠIsrael": 6778, - "ĠIsraeli": 15907, - "ĠIsraelis": 55623, - "ĠIss": 15935, - "ĠIssue": 25226, - "ĠIssues": 36443, - "ĠIst": 59490, - "ĠIstanbul": 53368, - "ĠIt": 1084, - "ĠItal": 83083, - "ĠItalia": 52122, - "ĠItalian": 14811, - "ĠItalians": 96233, - "ĠItaly": 15344, - "ĠItem": 5739, - "ĠItemStack": 38115, - "ĠItemType": 73081, - "ĠItems": 19410, - "ĠIter": 13704, - "ĠIterable": 38016, - "ĠIterate": 54340, - "ĠIterator": 23023, - "ĠIts": 11445, - "ĠIv": 33483, - "ĠIvan": 41421, - "ĠIvanka": 82332, - "ĠIve": 86650, - "ĠIvory": 76609, - "ĠIvy": 56879, - "ĠIz": 47823, - "ĠJ": 619, - "ĠJA": 53739, - "ĠJACK": 91042, - "ĠJADX": 88508, - "ĠJAN": 83487, - "ĠJAVA": 85560, - "ĠJAXB": 60640, - "ĠJAXBElement": 80140, - "ĠJB": 76279, - "ĠJButton": 27117, - "ĠJC": 60583, - "ĠJComboBox": 87649, - "ĠJD": 43937, - "ĠJDBC": 88320, - "ĠJDK": 97425, - "ĠJE": 70330, - "ĠJFK": 83299, - "ĠJFactory": 74304, - "ĠJFrame": 50363, - "ĠJIT": 96187, - "ĠJJ": 70040, - "ĠJK": 93226, - "ĠJL": 89435, - "ĠJLabel": 23466, - "ĠJM": 82052, - "ĠJMP": 88251, - "ĠJMenuItem": 73260, - "ĠJNI": 70829, - "ĠJNICALL": 60940, - "ĠJNIEnv": 85753, - "ĠJO": 10247, - "ĠJOB": 61659, - "ĠJOHN": 75175, - "ĠJOIN": 13069, - "ĠJObject": 65369, - "ĠJOptionPane": 27080, - "ĠJP": 48780, - "ĠJPEG": 54562, - "ĠJPG": 88956, - "ĠJPanel": 27728, - "ĠJQuery": 86645, - "ĠJR": 52566, - "ĠJS": 12162, - "ĠJSBracketAccess": 96684, - "ĠJSGlobal": 93735, - "ĠJSImport": 78752, - "ĠJSName": 96481, - "ĠJSON": 4718, - "ĠJSONArray": 40461, - "ĠJSONException": 84690, - "ĠJSONObject": 17883, - "ĠJSX": 55496, - "ĠJScrollPane": 81905, - "ĠJT": 87504, - "ĠJText": 38555, - "ĠJTextField": 37298, - "ĠJUL": 87060, - "ĠJUST": 47530, - "ĠJV": 95461, - "ĠJVM": 72379, - "ĠJW": 95476, - "ĠJWT": 47567, - "ĠJa": 22871, - "ĠJab": 52982, - "ĠJac": 15035, - "ĠJack": 7607, - "ĠJacket": 54770, - "ĠJackets": 85564, - "ĠJackie": 50865, - "ĠJackson": 13658, - "ĠJacksonville": 47946, - "ĠJacob": 24521, - "ĠJacobs": 51656, - "ĠJacqu": 79077, - "ĠJacqueline": 98664, - "ĠJacques": 63750, - "ĠJad": 72724, - "ĠJade": 57527, - "ĠJae": 95560, - "ĠJag": 29411, - "ĠJaguar": 73537, - "ĠJaguars": 69326, - "ĠJah": 34624, - "ĠJahr": 37419, - "ĠJahre": 48015, - "ĠJahren": 45506, - "ĠJahres": 97748, - "ĠJail": 56146, - "ĠJaime": 77723, - "ĠJain": 95117, - "ĠJak": 34834, - "ĠJakarta": 63033, - "ĠJake": 32072, - "ĠJal": 71895, - "ĠJam": 20016, - "ĠJama": 40159, - "ĠJamaica": 56175, - "ĠJamal": 95657, - "ĠJame": 92088, - "ĠJames": 7801, - "ĠJamie": 35757, - "ĠJan": 4350, - "ĠJane": 21475, - "ĠJaneiro": 60323, - "ĠJanet": 53665, - "ĠJanuary": 6058, - "ĠJapan": 6323, - "ĠJapanese": 10769, - "ĠJar": 30551, - "ĠJared": 43228, - "ĠJarvis": 98520, - "ĠJas": 85116, - "ĠJasmine": 81352, - "ĠJason": 18477, - "ĠJasper": 70484, - "ĠJaune": 86125, - "ĠJava": 7943, - "ĠJavaScript": 12914, - "ĠJavascript": 31852, - "ĠJavier": 70209, - "ĠJaw": 33194, - "ĠJay": 18919, - "ĠJays": 65735, - "ĠJazeera": 84924, - "ĠJazz": 35867, - "ĠJe": 14133, - "ĠJean": 19685, - "ĠJeans": 81407, - "ĠJeb": 70096, - "ĠJed": 65132, - "ĠJedi": 40395, - "ĠJeep": 49902, - "ĠJeff": 11885, - "ĠJefferson": 33544, - "ĠJeffrey": 41007, - "ĠJeg": 53117, - "ĠJeh": 61933, - "ĠJehovah": 78560, - "ĠJelly": 73139, - "ĠJen": 24893, - "ĠJenkins": 44136, - "ĠJenn": 22923, - "ĠJenna": 87254, - "ĠJenner": 76064, - "ĠJennifer": 29650, - "ĠJennings": 70190, - "ĠJenny": 51079, - "ĠJens": 95030, - "ĠJensen": 64009, - "ĠJer": 8403, - "ĠJeremiah": 82625, - "ĠJeremy": 27118, - "ĠJerome": 69774, - "ĠJerry": 28708, - "ĠJersey": 15849, - "ĠJerseys": 80542, - "ĠJerusalem": 25445, - "ĠJes": 9066, - "ĠJess": 23039, - "ĠJesse": 39171, - "ĠJessica": 32367, - "ĠJessie": 79117, - "ĠJest": 93469, - "ĠJesus": 10588, - "ĠJesús": 142115, - "ĠJet": 24366, - "ĠJetBrains": 75124, - "ĠJets": 36489, - "ĠJetzt": 77717, - "ĠJew": 7958, - "ĠJewel": 83204, - "ĠJewelry": 61868, - "ĠJewish": 13350, - "ĠJews": 16987, - "ĠJeżeli": 136851, - "ĠJeÅĽli": 130602, - "ĠJi": 54451, - "ĠJian": 87304, - "ĠJiang": 60822, - "ĠJihad": 90139, - "ĠJill": 47211, - "ĠJim": 11387, - "ĠJimmy": 27833, - "ĠJin": 38511, - "ĠJing": 85439, - "ĠJinping": 93386, - "ĠJo": 10946, - "ĠJoan": 50106, - "ĠJoanna": 90062, - "ĠJob": 12011, - "ĠJobs": 23076, - "ĠJoe": 12846, - "ĠJoel": 38347, - "ĠJoey": 54735, - "ĠJog": 86407, - "ĠJoh": 26176, - "ĠJohan": 88807, - "ĠJohann": 87864, - "ĠJohannes": 54105, - "ĠJohannesburg": 85541, - "ĠJohn": 3757, - "ĠJohnny": 31880, - "ĠJohns": 52140, - "ĠJohnson": 11351, - "ĠJohnston": 60482, - "ĠJoi": 41168, - "ĠJoin": 16471, - "ĠJoined": 40782, - "ĠJoint": 29733, - "ĠJoker": 60277, - "ĠJon": 12285, - "ĠJonah": 93628, - "ĠJonas": 68086, - "ĠJonathan": 23269, - "ĠJones": 11935, - "ĠJong": 39548, - "ĠJoomla": 72005, - "ĠJord": 80155, - "ĠJordan": 17089, - "ĠJorge": 55400, - "ĠJos": 27878, - "ĠJose": 10860, - "ĠJosef": 97441, - "ĠJoseph": 15115, - "ĠJosh": 18246, - "ĠJoshua": 39492, - "ĠJosé": 43265, - "ĠJou": 96048, - "ĠJournal": 9936, - "ĠJournalism": 68553, - "ĠJourney": 42580, - "ĠJoy": 27138, - "ĠJoyce": 53626, - "ĠJoão": 135970, - "ĠJpaRepository": 65618, - "ĠJr": 15640, - "ĠJs": 39122, - "ĠJson": 8308, - "ĠJsonConvert": 38867, - "ĠJsonObject": 49343, - "ĠJsonRequest": 68709, - "ĠJsonRequestBehavior": 69831, - "ĠJsonResponse": 38263, - "ĠJsonResult": 58178, - "ĠJsonSerializer": 70919, - "ĠJu": 21671, - "ĠJuan": 28504, - "ĠJub": 79280, - "ĠJud": 11213, - "ĠJuda": 57461, - "ĠJudaism": 63183, - "ĠJude": 61634, - "ĠJudge": 20207, - "ĠJudges": 85855, - "ĠJudgment": 88562, - "ĠJudicial": 67208, - "ĠJudiciary": 52029, - "ĠJudith": 78093, - "ĠJudy": 54058, - "ĠJug": 55319, - "ĠJugend": 90167, - "ĠJuice": 65751, - "ĠJul": 10057, - "ĠJuli": 72124, - "ĠJulia": 39294, - "ĠJulian": 37797, - "ĠJulie": 41187, - "ĠJulien": 87642, - "ĠJuliet": 71024, - "ĠJulio": 80825, - "ĠJulius": 69245, - "ĠJuly": 5768, - "ĠJump": 28788, - "ĠJun": 11782, - "ĠJunction": 67956, - "ĠJune": 5534, - "ĠJung": 49332, - "ĠJungle": 59663, - "ĠJuni": 80157, - "ĠJunior": 30770, - "ĠJunk": 66552, - "ĠJupiter": 49689, - "ĠJur": 38798, - "ĠJurassic": 83374, - "ĠJury": 95271, - "ĠJust": 4599, - "ĠJusti": 140232, - "ĠJustice": 11745, - "ĠJustin": 22467, - "ĠJustiça": 140233, - "ĠJuventus": 77121, - "ĠJwt": 54369, - "ĠJá": 134179, - "ĠK": 730, - "ĠKA": 88978, - "ĠKB": 25016, - "ĠKC": 21084, - "ĠKD": 62990, - "ĠKDE": 75083, - "ĠKE": 11090, - "ĠKEEP": 95809, - "ĠKERNEL": 79691, - "ĠKEY": 12013, - "ĠKG": 70087, - "ĠKH": 80355, - "ĠKIND": 9297, - "ĠKING": 73811, - "ĠKK": 96432, - "ĠKL": 67710, - "ĠKM": 55776, - "ĠKN": 31292, - "ĠKNOW": 58027, - "ĠKO": 37512, - "ĠKP": 77524, - "ĠKR": 65169, - "ĠKS": 46374, - "ĠKT": 77461, - "ĠKV": 84648, - "ĠKW": 71915, - "ĠKY": 49479, - "ĠKa": 22309, - "ĠKab": 40436, - "ĠKabul": 86545, - "ĠKad": 73676, - "ĠKaepernick": 78614, - "ĠKafka": 57025, - "ĠKag": 75991, - "ĠKah": 84007, - "ĠKahn": 98566, - "ĠKai": 50610, - "ĠKaiser": 66965, - "ĠKak": 74471, - "ĠKal": 26832, - "ĠKale": 96742, - "ĠKam": 28449, - "ĠKami": 98866, - "ĠKamp": 70944, - "ĠKan": 30563, - "ĠKane": 45556, - "ĠKang": 54276, - "ĠKann": 77211, - "ĠKansas": 20148, - "ĠKant": 62162, - "ĠKanye": 58717, - "ĠKap": 31665, - "ĠKaplan": 80137, - "ĠKapoor": 81369, - "ĠKar": 13225, - "ĠKara": 78350, - "ĠKarachi": 88608, - "ĠKardash": 61262, - "ĠKardashian": 68007, - "ĠKare": 95231, - "ĠKaren": 34645, - "ĠKarl": 34031, - "ĠKarma": 74880, - "ĠKarn": 60223, - "ĠKarnataka": 78049, - "ĠKart": 60097, - "ĠKas": 37542, - "ĠKash": 41608, - "ĠKashmir": 49180, - "ĠKasich": 74981, - "ĠKasım": 135335, - "ĠKat": 17363, - "ĠKata": 98838, - "ĠKate": 29201, - "ĠKath": 32895, - "ĠKatherine": 61326, - "ĠKathleen": 64063, - "ĠKathryn": 91068, - "ĠKathy": 64198, - "ĠKatie": 44463, - "ĠKatrina": 68656, - "ĠKaty": 72127, - "ĠKatz": 77109, - "ĠKauf": 58154, - "ĠKavanaugh": 37183, - "ĠKaw": 50516, - "ĠKawasaki": 97438, - "ĠKay": 30145, - "ĠKaz": 34974, - "ĠKazakhstan": 72437, - "ĠKaż": 142278, - "ĠKażdy": 142279, - "ĠKb": 98086, - "ĠKe": 6569, - "ĠKear": 99038, - "ĠKee": 95728, - "ĠKeep": 13655, - "ĠKeeper": 81627, - "ĠKeeping": 55378, - "ĠKeeps": 90820, - "ĠKeith": 31502, - "ĠKel": 27164, - "ĠKeller": 65503, - "ĠKelley": 73713, - "ĠKelly": 18661, - "ĠKelvin": 90973, - "ĠKem": 65966, - "ĠKemp": 80508, - "ĠKen": 14259, - "ĠKend": 38117, - "ĠKendall": 73076, - "ĠKendrick": 87613, - "ĠKenn": 15378, - "ĠKennedy": 23651, - "ĠKenneth": 48398, - "ĠKenny": 48319, - "ĠKens": 73023, - "ĠKensington": 95733, - "ĠKent": 17734, - "ĠKentucky": 24987, - "ĠKenya": 36666, - "ĠKepler": 97743, - "ĠKer": 35158, - "ĠKerala": 60407, - "ĠKern": 84687, - "ĠKernel": 36603, - "ĠKerr": 59195, - "ĠKerry": 39240, - "ĠKes": 82977, - "ĠKet": 67084, - "ĠKeto": 76345, - "ĠKevin": 16364, - "ĠKey": 5309, - "ĠKeyCode": 65152, - "ĠKeyError": 38094, - "ĠKeyEvent": 48275, - "ĠKeyValue": 98620, - "ĠKeyValuePair": 53604, - "ĠKeyboard": 25616, - "ĠKeyboardInterrupt": 84188, - "ĠKeynes": 81503, - "ĠKeys": 24133, - "ĠKeystone": 70573, - "ĠKeyword": 48970, - "ĠKeywords": 55695, - "ĠKg": 86722, - "ĠKh": 20165, - "ĠKhal": 51609, - "ĠKhan": 24287, - "ĠKhá": 141872, - "ĠKhách": 138053, - "ĠKhánh": 141425, - "ĠKhông": 129182, - "ĠKi": 29458, - "ĠKia": 80270, - "ĠKick": 26678, - "ĠKickstarter": 39980, - "ĠKid": 31566, - "ĠKidd": 97138, - "ĠKids": 22522, - "ĠKiev": 61625, - "ĠKil": 37888, - "ĠKill": 26835, - "ĠKilled": 43796, - "ĠKiller": 52953, - "ĠKilling": 69577, - "ĠKills": 60853, - "ĠKim": 13509, - "ĠKimber": 63807, - "ĠKimberly": 85653, - "ĠKin": 30891, - "ĠKind": 16840, - "ĠKinder": 43999, - "ĠKindle": 34312, - "ĠKinect": 94503, - "ĠKing": 6210, - "ĠKingdom": 15072, - "ĠKings": 24019, - "ĠKingston": 62469, - "ĠKir": 25527, - "ĠKirby": 57711, - "ĠKirk": 31346, - "ĠKirst": 80677, - "ĠKis": 85637, - "ĠKiss": 43630, - "ĠKit": 20951, - "ĠKitchen": 19354, - "ĠKits": 61893, - "ĠKitt": 80667, - "ĠKitty": 66181, - "ĠKiÅŁi": 141508, - "ĠKl": 27941, - "ĠKlan": 87341, - "ĠKlaus": 81097, - "ĠKle": 26349, - "ĠKlein": 42141, - "ĠKling": 79027, - "ĠKlo": 73641, - "ĠKlopp": 93831, - "ĠKm": 92482, - "ĠKn": 13620, - "ĠKnee": 97212, - "ĠKnicks": 61412, - "ĠKnife": 61202, - "ĠKnight": 22984, - "ĠKnights": 39576, - "ĠKnock": 63794, - "ĠKnot": 92144, - "ĠKnow": 14187, - "ĠKnowing": 57633, - "ĠKnowledge": 31925, - "ĠKnown": 48286, - "ĠKnox": 53350, - "ĠKnoxville": 94902, - "ĠKo": 29317, - "ĠKob": 59148, - "ĠKobe": 69311, - "ĠKoch": 39493, - "ĠKod": 67302, - "ĠKodi": 81312, - "ĠKoh": 33875, - "ĠKohana": 82673, - "ĠKok": 64715, - "ĠKol": 45515, - "ĠKolkata": 81534, - "ĠKom": 26692, - "ĠKomm": 87727, - "ĠKomment": 67489, - "ĠKon": 23388, - "ĠKong": 18211, - "ĠKont": 36866, - "ĠKontakt": 65608, - "ĠKop": 58009, - "ĠKor": 35070, - "ĠKore": 8062, - "ĠKorea": 11862, - "ĠKorean": 16134, - "ĠKoreans": 69711, - "ĠKos": 37108, - "ĠKosovo": 79897, - "ĠKosten": 40866, - "ĠKostenlos": 81442, - "ĠKostenlose": 86784, - "ĠKot": 61663, - "ĠKota": 92215, - "ĠKotlin": 92854, - "ĠKou": 75865, - "ĠKov": 92881, - "ĠKr": 16447, - "ĠKra": 61067, - "ĠKraft": 64560, - "ĠKrak": 88443, - "ĠKramer": 89477, - "ĠKrank": 91970, - "ĠKre": 29618, - "ĠKremlin": 50324, - "ĠKris": 52002, - "ĠKrish": 60964, - "ĠKrishna": 79309, - "ĠKrist": 26875, - "ĠKristen": 76114, - "ĠKro": 67817, - "ĠKron": 96560, - "ĠKsi": 143833, - "ĠKsiÄĻ": 143834, - "ĠKu": 32379, - "ĠKuala": 86333, - "ĠKub": 62549, - "ĠKubernetes": 66374, - "ĠKul": 84506, - "ĠKum": 85241, - "ĠKumar": 40140, - "ĠKun": 42783, - "ĠKund": 92887, - "ĠKunden": 61291, - "ĠKunst": 80331, - "ĠKur": 31275, - "ĠKurd": 33423, - "ĠKurdish": 41640, - "ĠKurdistan": 78944, - "ĠKurds": 67014, - "ĠKurt": 42923, - "ĠKush": 49175, - "ĠKushner": 61331, - "ĠKut": 95907, - "ĠKuwait": 56011, - "ĠKv": 88321, - "ĠKw": 64362, - "ĠKy": 22878, - "ĠKyle": 30259, - "ĠKylie": 97164, - "ĠKyoto": 81022, - "ĠKö": 64894, - "ĠKöln": 141377, - "ĠKön": 141774, - "ĠKönig": 141775, - "ĠKörper": 135720, - "ĠKü": 69252, - "ĠKüche": 136112, - "ĠKültür": 139223, - "ĠKı": 143804, - "ĠKısa": 143805, - "ĠKết": 136909, - "ĠKỳ": 133169, - "ĠL": 444, - "ĠLA": 12959, - "ĠLAB": 30974, - "ĠLABEL": 56874, - "ĠLAN": 46425, - "ĠLAND": 91856, - "ĠLANG": 65997, - "ĠLANGUAGE": 34800, - "ĠLAP": 71328, - "ĠLARGE": 76656, - "ĠLAS": 64131, - "ĠLAST": 47295, - "ĠLAT": 53187, - "ĠLATIN": 92244, - "ĠLAW": 66603, - "ĠLB": 40150, - "ĠLC": 30871, - "ĠLCD": 21976, - "ĠLCS": 83868, - "ĠLD": 28877, - "ĠLDAP": 56379, - "ĠLDL": 85443, - "ĠLDS": 71536, - "ĠLE": 11148, - "ĠLED": 13113, - "ĠLEDs": 55572, - "ĠLEFT": 21920, - "ĠLEG": 35426, - "ĠLEGO": 55801, - "ĠLEN": 83099, - "ĠLENG": 69635, - "ĠLENGTH": 71838, - "ĠLES": 96429, - "ĠLESS": 74948, - "ĠLET": 35657, - "ĠLETTER": 44428, - "ĠLEVEL": 42709, - "ĠLF": 57136, - "ĠLG": 23403, - "ĠLGBT": 23111, - "ĠLGBTQ": 49942, - "ĠLGPL": 47529, - "ĠLH": 82763, - "ĠLI": 7555, - "ĠLIABILITY": 14162, - "ĠLIABLE": 17386, - "ĠLIB": 30271, - "ĠLIC": 83238, - "ĠLICENSE": 12096, - "ĠLIFE": 59994, - "ĠLIGHT": 52203, - "ĠLIKE": 20529, - "ĠLIMIT": 10376, - "ĠLIMITED": 13104, - "ĠLIN": 64789, - "ĠLINE": 30851, - "ĠLINK": 40491, - "ĠLINUX": 91618, - "ĠLIS": 99026, - "ĠLIST": 26966, - "ĠLIVE": 44169, - "ĠLJ": 96688, - "ĠLL": 19504, - "ĠLLC": 15262, - "ĠLLP": 67965, - "ĠLLVM": 52339, - "ĠLM": 46414, - "ĠLN": 88182, - "ĠLNG": 87830, - "ĠLO": 5017, - "ĠLOAD": 38340, - "ĠLOC": 27096, - "ĠLOCAL": 42501, - "ĠLOCATION": 65583, - "ĠLOCK": 49463, - "ĠLOD": 86963, - "ĠLOG": 8081, - "ĠLOGGER": 28088, - "ĠLOGIN": 48131, - "ĠLOL": 55333, - "ĠLONG": 33942, - "ĠLOOK": 49869, - "ĠLOOP": 69530, - "ĠLORD": 57377, - "ĠLOS": 52687, - "ĠLOSS": 27353, - "ĠLOT": 53360, - "ĠLOVE": 39735, - "ĠLOW": 40505, - "ĠLOWER": 85457, - "ĠLP": 17102, - "ĠLPARAM": 66987, - "ĠLPC": 49075, - "ĠLR": 44550, - "ĠLS": 29202, - "ĠLSB": 93310, - "ĠLSD": 71070, - "ĠLSM": 90474, - "ĠLSTM": 85471, - "ĠLSU": 64412, - "ĠLT": 34469, - "ĠLTC": 95939, - "ĠLTD": 50185, - "ĠLTE": 51398, - "ĠLTS": 79028, - "ĠLU": 74950, - "ĠLUA": 70505, - "ĠLV": 39169, - "ĠLW": 55741, - "ĠLX": 75798, - "ĠLY": 86005, - "ĠLZ": 94480, - "ĠLa": 4929, - "ĠLaTeX": 97913, - "ĠLab": 11607, - "ĠLabel": 9402, - "ĠLabels": 60996, - "ĠLabor": 14930, - "ĠLaboratories": 77617, - "ĠLaboratory": 31084, - "ĠLabour": 18486, - "ĠLabrador": 79276, - "ĠLabs": 40640, - "ĠLac": 54041, - "ĠLace": 74139, - "ĠLack": 67402, - "ĠLad": 69030, - "ĠLaden": 51384, - "ĠLadies": 48013, - "ĠLady": 20621, - "ĠLaf": 60844, - "ĠLafayette": 77181, - "ĠLag": 32371, - "ĠLage": 95506, - "ĠLager": 84758, - "ĠLagos": 75996, - "ĠLaguna": 93098, - "ĠLah": 67442, - "ĠLahore": 98089, - "ĠLair": 57096, - "ĠLak": 47662, - "ĠLake": 11678, - "ĠLakers": 46496, - "ĠLakes": 41579, - "ĠLal": 83783, - "ĠLam": 32694, - "ĠLama": 82559, - "ĠLamar": 61184, - "ĠLamb": 31302, - "ĠLambda": 44521, - "ĠLambert": 69543, - "ĠLamp": 41177, - "ĠLan": 34782, - "ĠLana": 94787, - "ĠLanc": 38534, - "ĠLancaster": 65123, - "ĠLance": 48931, - "ĠLand": 11426, - "ĠLanding": 46424, - "ĠLands": 37423, - "ĠLandscape": 62541, - "ĠLane": 26018, - "ĠLang": 22463, - "ĠLange": 87722, - "ĠLanguage": 11434, - "ĠLanguages": 54964, - "ĠLanka": 42479, - "ĠLans": 67836, - "ĠLansing": 96484, - "ĠLantern": 67492, - "ĠLaos": 95744, - "ĠLap": 49055, - "ĠLaptop": 56125, - "ĠLar": 31304, - "ĠLara": 72157, - "ĠLaravel": 64206, - "ĠLarge": 20286, - "ĠLarger": 80808, - "ĠLargest": 83319, - "ĠLarry": 29290, - "ĠLars": 58176, - "ĠLarson": 85078, - "ĠLas": 15755, - "ĠLaser": 39608, - "ĠLast": 7996, - "ĠLastName": 48946, - "ĠLastly": 70709, - "ĠLat": 9926, - "ĠLatLng": 47165, - "ĠLate": 35831, - "ĠLater": 24885, - "ĠLatest": 28157, - "ĠLatin": 19458, - "ĠLatina": 58763, - "ĠLatino": 43762, - "ĠLatinos": 86799, - "ĠLatitude": 67340, - "ĠLatter": 89066, - "ĠLatvia": 78158, - "ĠLau": 84991, - "ĠLaud": 70036, - "ĠLauderdale": 77155, - "ĠLaugh": 83035, - "ĠLaunch": 23205, - "ĠLauncher": 52230, - "ĠLaundry": 81632, - "ĠLaur": 53200, - "ĠLaura": 29828, - "ĠLaure": 32667, - "ĠLaurel": 80464, - "ĠLauren": 42360, - "ĠLaurent": 63221, - "ĠLaurie": 79523, - "ĠLav": 42850, - "ĠLaw": 7506, - "ĠLawn": 68392, - "ĠLawrence": 27474, - "ĠLaws": 40989, - "ĠLawson": 74851, - "ĠLawyer": 70214, - "ĠLawyers": 70408, - "ĠLay": 43924, - "ĠLayer": 22735, - "ĠLayers": 83822, - "ĠLayout": 13821, - "ĠLayoutInflater": 28569, - "ĠLaz": 97803, - "ĠLazar": 86158, - "ĠLazy": 44263, - "ĠLe": 1967, - "ĠLeBron": 57235, - "ĠLead": 29882, - "ĠLeader": 23030, - "ĠLeaders": 27886, - "ĠLeadership": 36163, - "ĠLeading": 58043, - "ĠLeads": 81528, - "ĠLeaf": 26869, - "ĠLeafs": 64150, - "ĠLeague": 8953, - "ĠLeah": 66861, - "ĠLeak": 37140, - "ĠLeakage": 42026, - "ĠLean": 62106, - "ĠLeap": 71282, - "ĠLear": 59978, - "ĠLearn": 14934, - "ĠLearned": 89396, - "ĠLearning": 20909, - "ĠLease": 80651, - "ĠLeast": 90516, - "ĠLeather": 31078, - "ĠLeave": 25193, - "ĠLeaves": 77514, - "ĠLeaving": 72962, - "ĠLeban": 31224, - "ĠLebanese": 68245, - "ĠLebanon": 39271, - "ĠLeben": 55397, - "ĠLebens": 65314, - "ĠLect": 40943, - "ĠLecture": 66972, - "ĠLed": 31655, - "ĠLedger": 70306, - "ĠLee": 12066, - "ĠLeeds": 51529, - "ĠLeer": 92798, - "ĠLeft": 13727, - "ĠLeg": 7610, - "ĠLegacy": 37887, - "ĠLegal": 24678, - "ĠLegend": 26935, - "ĠLegendary": 59089, - "ĠLegends": 41886, - "ĠLegion": 39835, - "ĠLegisl": 32715, - "ĠLegislation": 71967, - "ĠLegislative": 67405, - "ĠLegislature": 46026, - "ĠLego": 64670, - "ĠLegs": 89934, - "ĠLeh": 62558, - "ĠLehr": 91853, - "ĠLei": 72210, - "ĠLeia": 87329, - "ĠLeicester": 57749, - "ĠLeigh": 73022, - "ĠLeipzig": 86547, - "ĠLeisure": 90399, - "ĠLem": 47406, - "ĠLemma": 85810, - "ĠLemon": 51210, - "ĠLen": 24250, - "ĠLena": 81062, - "ĠLength": 17287, - "ĠLenin": 62812, - "ĠLennon": 79740, - "ĠLenovo": 63699, - "ĠLens": 42671, - "ĠLent": 83370, - "ĠLeo": 36748, - "ĠLeon": 20932, - "ĠLeonard": 40854, - "ĠLeonardo": 65386, - "ĠLeone": 65391, - "ĠLeopard": 97538, - "ĠLer": 79840, - "ĠLes": 11615, - "ĠLesb": 59961, - "ĠLesbian": 52543, - "ĠLeslie": 53683, - "ĠLess": 9668, - "ĠLesser": 13907, - "ĠLesson": 48915, - "ĠLessons": 60466, - "ĠLester": 82658, - "ĠLet": 6771, - "ĠLets": 57066, - "ĠLetter": 26659, - "ĠLetters": 44297, - "ĠLev": 27022, - "ĠLevel": 9395, - "ĠLevels": 52693, - "ĠLever": 78579, - "ĠLevi": 55041, - "ĠLevin": 66877, - "ĠLevine": 80602, - "ĠLevitra": 69148, - "ĠLevy": 67190, - "ĠLew": 17195, - "ĠLewis": 20607, - "ĠLex": 26819, - "ĠLexer": 85082, - "ĠLexington": 70658, - "ĠLexus": 87869, - "ĠLey": 53425, - "ĠLi": 14511, - "ĠLia": 83657, - "ĠLiability": 90043, - "ĠLiam": 60642, - "ĠLib": 5688, - "ĠLiber": 94297, - "ĠLiberal": 30058, - "ĠLiberals": 51381, - "ĠLiberation": 71884, - "ĠLiberia": 83525, - "ĠLibert": 51081, - "ĠLibertarian": 84723, - "ĠLiberties": 91486, - "ĠLiberty": 31392, - "ĠLibraries": 54512, - "ĠLibrary": 11635, - "ĠLibre": 75168, - "ĠLibya": 36959, - "ĠLibyan": 78497, - "ĠLic": 32575, - "ĠLicence": 53275, - "ĠLicense": 1876, - "ĠLicensed": 10103, - "ĠLicensing": 72325, - "ĠLicht": 88937, - "ĠLid": 80609, - "ĠLie": 21491, - "ĠLiebe": 93719, - "ĠLies": 77086, - "ĠLieutenant": 54137, - "ĠLif": 64763, - "ĠLife": 9414, - "ĠLifecycle": 74392, - "ĠLifestyle": 68156, - "ĠLifetime": 64352, - "ĠLift": 52435, - "ĠLig": 98178, - "ĠLiga": 59027, - "ĠLight": 8658, - "ĠLighting": 44523, - "ĠLightning": 33844, - "ĠLights": 34170, - "ĠLightweight": 83267, - "ĠLik": 32929, - "ĠLike": 8909, - "ĠLikely": 93637, - "ĠLikes": 50914, - "ĠLikewise": 49387, - "ĠLil": 40478, - "ĠLilly": 81834, - "ĠLily": 47290, - "ĠLim": 13589, - "ĠLima": 61953, - "ĠLime": 70496, - "ĠLimit": 28008, - "ĠLimited": 18905, - "ĠLimits": 71855, - "ĠLin": 8564, - "ĠLincoln": 24379, - "ĠLind": 27219, - "ĠLinda": 38062, - "ĠLinden": 99065, - "ĠLindsay": 62784, - "ĠLindsey": 64279, - "ĠLine": 7083, - "ĠLinear": 28263, - "ĠLinearGradient": 96492, - "ĠLinearLayout": 27146, - "ĠLinearLayoutManager": 45851, - "ĠLines": 38233, - "ĠLing": 50858, - "ĠLingu": 88233, - "ĠLink": 5948, - "ĠLinked": 13114, - "ĠLinkedHashMap": 64333, - "ĠLinkedIn": 32767, - "ĠLinkedList": 22917, - "ĠLinkedin": 91939, - "ĠLinks": 25422, - "ĠLinux": 14340, - "ĠLion": 32099, - "ĠLionel": 83124, - "ĠLions": 32765, - "ĠLip": 41139, - "ĠLips": 95263, - "ĠLiqu": 68518, - "ĠLiquid": 41258, - "ĠLis": 43072, - "ĠLisa": 28556, - "ĠLisbon": 80701, - "ĠLisp": 54975, - "ĠList": 1759, - "ĠListBox": 98206, - "ĠListItem": 40924, - "ĠListNode": 20501, - "ĠListTile": 63421, - "ĠListView": 26636, - "ĠListViewItem": 95659, - "ĠLista": 53002, - "ĠListe": 73086, - "ĠListed": 68448, - "ĠListen": 32149, - "ĠListener": 47999, - "ĠListening": 76697, - "ĠListing": 38764, - "ĠListings": 83884, - "ĠLists": 37905, - "ĠLit": 38251, - "ĠLite": 40865, - "ĠLitecoin": 94092, - "ĠLiter": 25471, - "ĠLiteral": 49674, - "ĠLiterary": 73624, - "ĠLiterature": 46370, - "ĠLith": 40578, - "ĠLithuania": 70506, - "ĠLittle": 14671, - "ĠLiu": 37705, - "ĠLiv": 36211, - "ĠLive": 11158, - "ĠLiveData": 62291, - "ĠLiver": 21859, - "ĠLiverpool": 24688, - "ĠLives": 39395, - "ĠLiving": 18539, - "ĠLivingston": 93974, - "ĠLiz": 47199, - "ĠLiên": 130578, - "ĠLloyd": 45196, - "ĠLn": 97819, - "ĠLo": 6485, - "ĠLoad": 8893, - "ĠLoaded": 62639, - "ĠLoader": 27811, - "ĠLoading": 17937, - "ĠLoads": 51223, - "ĠLoan": 35081, - "ĠLoans": 47515, - "ĠLob": 67517, - "ĠLobby": 62966, - "ĠLoc": 13600, - "ĠLocal": 8774, - "ĠLocalDate": 40816, - "ĠLocalDateTime": 47465, - "ĠLocale": 34526, - "ĠLocalization": 80820, - "ĠLocate": 95210, - "ĠLocated": 41767, - "ĠLocation": 9866, - "ĠLocations": 41469, - "ĠLocator": 98653, - "ĠLoch": 82703, - "ĠLock": 15701, - "ĠLocke": 81922, - "ĠLocked": 92945, - "ĠLocker": 93978, - "ĠLockheed": 84136, - "ĠLod": 87940, - "ĠLodge": 43568, - "ĠLoft": 83154, - "ĠLog": 2835, - "ĠLogLevel": 63321, - "ĠLogManager": 69365, - "ĠLogan": 43046, - "ĠLogged": 57055, - "ĠLogger": 9514, - "ĠLoggerFactory": 35086, - "ĠLogging": 41706, - "ĠLogic": 36101, - "ĠLogical": 62069, - "ĠLogin": 8779, - "ĠLoginActivity": 98346, - "ĠLoginComponent": 59754, - "ĠLoginForm": 69995, - "ĠLoginPage": 63411, - "ĠLogistic": 78068, - "ĠLogistics": 70322, - "ĠLogo": 30052, - "ĠLogout": 46285, - "ĠLogs": 54570, - "ĠLois": 83946, - "ĠLok": 57401, - "ĠLoki": 83755, - "ĠLol": 79137, - "ĠLola": 96357, - "ĠLomb": 62818, - "ĠLon": 48181, - "ĠLond": 79593, - "ĠLondon": 7148, - "ĠLone": 75181, - "ĠLonely": 85723, - "ĠLong": 5724, - "ĠLonger": 93326, - "ĠLongitude": 79109, - "ĠLook": 9192, - "ĠLooking": 21131, - "ĠLooks": 41806, - "ĠLookup": 50311, - "ĠLoop": 21359, - "ĠLoose": 86002, - "ĠLoot": 83054, - "ĠLopez": 44215, - "ĠLor": 68730, - "ĠLord": 10214, - "ĠLords": 56048, - "ĠLore": 53233, - "ĠLorem": 46931, - "ĠLoren": 51190, - "ĠLorenzo": 73400, - "ĠLori": 81085, - "ĠLos": 9656, - "ĠLose": 60689, - "ĠLosing": 98139, - "ĠLoss": 24704, - "ĠLost": 27252, - "ĠLot": 21755, - "ĠLots": 40215, - "ĠLottery": 72237, - "ĠLotto": 97713, - "ĠLotus": 60169, - "ĠLou": 9729, - "ĠLoud": 79548, - "ĠLouis": 11876, - "ĠLouise": 55478, - "ĠLouisiana": 28874, - "ĠLouisville": 45034, - "ĠLounge": 49667, - "ĠLov": 34293, - "ĠLove": 10689, - "ĠLoved": 84027, - "ĠLovely": 64365, - "ĠLover": 89490, - "ĠLoves": 84023, - "ĠLoving": 89322, - "ĠLow": 12041, - "ĠLowe": 64587, - "ĠLowell": 95130, - "ĠLower": 27536, - "ĠLowest": 68530, - "ĠLoy": 67242, - "ĠLt": 41870, - "ĠLtd": 12324, - "ĠLu": 18360, - "ĠLua": 37662, - "ĠLub": 57651, - "ĠLuc": 13784, - "ĠLuca": 83178, - "ĠLucas": 31003, - "ĠLucia": 79174, - "ĠLucifer": 93394, - "ĠLuck": 28772, - "ĠLuckily": 47500, - "ĠLucky": 48567, - "ĠLucy": 44070, - "ĠLud": 45170, - "ĠLudwig": 84450, - "ĠLuft": 88049, - "ĠLug": 92490, - "ĠLuigi": 82083, - "ĠLuis": 33197, - "ĠLuk": 54657, - "ĠLuke": 24453, - "ĠLum": 42601, - "ĠLumia": 91351, - "ĠLump": 74293, - "ĠLumpur": 86244, - "ĠLun": 44349, - "ĠLuna": 49805, - "ĠLunar": 78095, - "ĠLunch": 55599, - "ĠLund": 68181, - "ĠLung": 77236, - "ĠLuo": 66383, - "ĠLup": 78703, - "ĠLust": 73255, - "ĠLuther": 35202, - "ĠLutheran": 81981, - "ĠLux": 26369, - "ĠLuxembourg": 64871, - "ĠLuxury": 51250, - "ĠLuz": 81639, - "ĠLuáºŃt": 136786, - "ĠLv": 62205, - "ĠLy": 15953, - "ĠLydia": 91206, - "ĠLyft": 84439, - "ĠLyme": 93116, - "ĠLyn": 21136, - "ĠLynch": 37106, - "ĠLynn": 44538, - "ĠLyon": 55201, - "ĠLyons": 90966, - "ĠLyrics": 56243, - "ĠLâm": 134925, - "ĠLänder": 140275, - "ĠLê": 131699, - "ĠLópez": 90975, - "ĠLö": 132678, - "ĠLös": 89452, - "ĠLúc": 138933, - "ĠLý": 134129, - "ĠLÃł": 127314, - "ĠLÃłm": 134330, - "ĠLưu": 138019, - "ĠLá»ĭch": 141034, - "ĠM": 386, - "ĠMA": 9718, - "ĠMAC": 22884, - "ĠMACHINE": 86011, - "ĠMAD": 75373, - "ĠMADE": 78699, - "ĠMAG": 49520, - "ĠMAGIC": 59249, - "ĠMAIL": 75384, - "ĠMAIN": 34339, - "ĠMAK": 71411, - "ĠMAKE": 36821, - "ĠMAL": 88039, - "ĠMAN": 25735, - "ĠMANAGEMENT": 93278, - "ĠMANUAL": 92423, - "ĠMANY": 98256, - "ĠMAP": 27223, - "ĠMAR": 37499, - "ĠMARK": 18018, - "ĠMART": 89565, - "ĠMAS": 87048, - "ĠMASK": 55094, - "ĠMASS": 92613, - "ĠMASTER": 71197, - "ĠMAT": 24795, - "ĠMATCH": 48171, - "ĠMATERIAL": 75123, - "ĠMATLAB": 49347, - "ĠMATRIX": 68559, - "ĠMAV": 80819, - "ĠMAX": 8334, - "ĠMAY": 39230, - "ĠMB": 13339, - "ĠMBA": 53454, - "ĠMC": 20869, - "ĠMCC": 98252, - "ĠMCP": 79148, - "ĠMCS": 93193, - "ĠMCU": 66227, - "ĠMD": 13979, - "ĠMDB": 86352, - "ĠMDMA": 98728, - "ĠME": 16292, - "ĠMED": 51599, - "ĠMEDIA": 60186, - "ĠMEDIATEK": 50709, - "ĠMEM": 24478, - "ĠMEMBER": 81824, - "ĠMEMORY": 80962, - "ĠMEN": 67928, - "ĠMENU": 35697, - "ĠMEP": 90836, - "ĠMER": 72373, - "ĠMERCHANTABILITY": 7935, - "ĠMES": 92318, - "ĠMESSAGE": 40758, - "ĠMET": 36822, - "ĠMETA": 79341, - "ĠMETH": 77824, - "ĠMETHOD": 32397, - "ĠMETHODS": 55229, - "ĠMF": 38254, - "ĠMG": 51192, - "ĠMGM": 98391, - "ĠMH": 45560, - "ĠMHz": 36494, - "ĠMI": 18476, - "ĠMIC": 44741, - "ĠMICRO": 86165, - "ĠMID": 69784, - "ĠMIDI": 47039, - "ĠMIL": 41809, - "ĠMILF": 73298, - "ĠMILL": 82485, - "ĠMIME": 57477, - "ĠMIN": 16701, - "ĠMIPS": 98662, - "ĠMIS": 67025, - "ĠMISS": 62747, - "ĠMISSING": 98779, - "ĠMIT": 14865, - "ĠMIX": 80209, - "ĠMJ": 60945, - "ĠMK": 26859, - "ĠML": 19614, - "ĠMLA": 79231, - "ĠMLB": 40117, - "ĠMLM": 90182, - "ĠMLP": 94891, - "ĠMLS": 28898, - "ĠMM": 21665, - "ĠMMA": 42567, - "ĠMMC": 67935, - "ĠMMI": 93087, - "ĠMMM": 56105, - "ĠMMO": 77185, - "ĠMMP": 89204, - "ĠMN": 34995, - "ĠMO": 11418, - "ĠMOCK": 83015, - "ĠMOD": 18669, - "ĠMODE": 22690, - "ĠMODEL": 47970, - "ĠMODIFY": 69665, - "ĠMODULE": 40374, - "ĠMOM": 92972, - "ĠMON": 28537, - "ĠMONEY": 93462, - "ĠMONTH": 57980, - "ĠMOR": 71313, - "ĠMORE": 18447, - "ĠMOS": 73074, - "ĠMOST": 79099, - "ĠMOT": 45847, - "ĠMOTOR": 86272, - "ĠMOUSE": 83190, - "ĠMOV": 37628, - "ĠMOVE": 34926, - "ĠMOZ": 63744, - "ĠMP": 9412, - "ĠMPC": 91598, - "ĠMPEG": 69989, - "ĠMPG": 90398, - "ĠMPH": 87656, - "ĠMPI": 17104, - "ĠMPL": 47356, - "ĠMPS": 92943, - "ĠMPU": 61323, - "ĠMPs": 36661, - "ĠMQ": 42983, - "ĠMQTT": 61424, - "ĠMR": 28333, - "ĠMRI": 51360, - "ĠMS": 10292, - "ĠMSC": 83513, - "ĠMSD": 71395, - "ĠMSE": 94599, - "ĠMSG": 23317, - "ĠMSI": 67398, - "ĠMSM": 67491, - "ĠMSNBC": 55815, - "ĠMSP": 68373, - "ĠMSR": 99068, - "ĠMSS": 91649, - "ĠMST": 84280, - "ĠMT": 19087, - "ĠMTV": 61099, - "ĠMU": 59786, - "ĠMUCH": 78333, - "ĠMULT": 50154, - "ĠMULTI": 82737, - "ĠMUSIC": 74973, - "ĠMUST": 27732, - "ĠMUT": 87420, - "ĠMV": 42271, - "ĠMVC": 67996, - "ĠMVP": 31866, - "ĠMW": 44482, - "ĠMX": 27585, - "ĠMY": 18224, - "ĠMYSQL": 54197, - "ĠMa": 11331, - "ĠMaar": 83967, - "ĠMac": 7401, - "ĠMacBook": 57579, - "ĠMacDonald": 80873, - "ĠMacOS": 89717, - "ĠMaced": 56452, - "ĠMacedonia": 76409, - "ĠMach": 18294, - "ĠMachine": 12960, - "ĠMachinery": 44106, - "ĠMachines": 43904, - "ĠMack": 32391, - "ĠMacro": 53317, - "ĠMacron": 62301, - "ĠMacros": 98447, - "ĠMacy": 96273, - "ĠMad": 9483, - "ĠMadagascar": 94628, - "ĠMadame": 83176, - "ĠMadd": 43537, - "ĠMadden": 83583, - "ĠMade": 18802, - "ĠMadison": 29915, - "ĠMadness": 70328, - "ĠMadonna": 80569, - "ĠMadrid": 24081, - "ĠMaduro": 77702, - "ĠMae": 64814, - "ĠMafia": 80895, - "ĠMag": 6879, - "ĠMagazine": 21451, - "ĠMage": 23371, - "ĠMagento": 35585, - "ĠMaggie": 61695, - "ĠMagic": 15485, - "ĠMagicMock": 89708, - "ĠMagical": 72710, - "ĠMagick": 87154, - "ĠMagn": 20300, - "ĠMagnet": 81228, - "ĠMagnetic": 62655, - "ĠMagnum": 93861, - "ĠMagnus": 73799, - "ĠMah": 16171, - "ĠMahar": 52590, - "ĠMaharashtra": 67419, - "ĠMaher": 96168, - "ĠMahm": 71611, - "ĠMahmoud": 93186, - "ĠMai": 42256, - "ĠMaid": 47085, - "ĠMaiden": 82842, - "ĠMail": 14874, - "ĠMain": 4697, - "ĠMainActivity": 27457, - "ĠMainAxisAlignment": 33214, - "ĠMainForm": 74677, - "ĠMainMenu": 77171, - "ĠMainPage": 70076, - "ĠMainWindow": 23846, - "ĠMaine": 29790, - "ĠMaint": 42887, - "ĠMaintain": 86377, - "ĠMaintenance": 38206, - "ĠMais": 33347, - "ĠMaison": 87883, - "ĠMaj": 30679, - "ĠMajesty": 66244, - "ĠMajor": 17121, - "ĠMajority": 54035, - "ĠMak": 39324, - "ĠMake": 7405, - "ĠMaker": 40528, - "ĠMakes": 36870, - "ĠMakeup": 72914, - "ĠMaking": 24288, - "ĠMal": 8394, - "ĠMalay": 79140, - "ĠMalays": 22914, - "ĠMalaysia": 27696, - "ĠMalaysian": 65431, - "ĠMalcolm": 46969, - "ĠMale": 19396, - "ĠMali": 63894, - "ĠMalik": 72220, - "ĠMalk": 97891, - "ĠMall": 31398, - "ĠMalone": 83071, - "ĠMalta": 60650, - "ĠMam": 47769, - "ĠMama": 60706, - "ĠMan": 2363, - "ĠMana": 49338, - "ĠManafort": 57813, - "ĠManage": 42650, - "ĠManaged": 60744, - "ĠManagement": 9551, - "ĠManager": 10567, - "ĠManagers": 61434, - "ĠManaging": 48307, - "ĠManchester": 19361, - "ĠMand": 23849, - "ĠMandal": 88879, - "ĠMandarin": 82771, - "ĠMandatory": 70782, - "ĠMandela": 87330, - "ĠMane": 78074, - "ĠMang": 59048, - "ĠManga": 69935, - "ĠMango": 90863, - "ĠManhattan": 28790, - "ĠManifest": 39361, - "ĠManila": 56564, - "ĠManip": 60911, - "ĠManit": 53235, - "ĠManitoba": 63240, - "ĠMann": 29860, - "ĠManning": 39523, - "ĠManny": 94155, - "ĠManor": 69951, - "ĠMans": 43135, - "ĠMansion": 82296, - "ĠManson": 98133, - "ĠMant": 50968, - "ĠManual": 14539, - "ĠManuals": 58841, - "ĠManuel": 43581, - "ĠManufact": 17657, - "ĠManufacturer": 34451, - "ĠManufacturers": 46098, - "ĠManufacturing": 41077, - "ĠManus": 95333, - "ĠMany": 8999, - "ĠMao": 56178, - "ĠMap": 5027, - "ĠMaple": 43470, - "ĠMapper": 45734, - "ĠMapping": 38446, - "ĠMaps": 27408, - "ĠMar": 2876, - "ĠMara": 85504, - "ĠMarathon": 50173, - "ĠMarble": 72521, - "ĠMarc": 18880, - "ĠMarcel": 48871, - "ĠMarch": 5470, - "ĠMarco": 34181, - "ĠMarcos": 65505, - "ĠMarcus": 35683, - "ĠMare": 63798, - "ĠMarg": 23201, - "ĠMargaret": 37549, - "ĠMargin": 71124, - "ĠMari": 28729, - "ĠMaria": 23016, - "ĠMarian": 95419, - "ĠMarie": 32016, - "ĠMarijuana": 64839, - "ĠMarilyn": 76360, - "ĠMarin": 63377, - "ĠMarina": 51536, - "ĠMarine": 22963, - "ĠMariners": 81862, - "ĠMarines": 50789, - "ĠMarino": 88266, - "ĠMario": 23381, - "ĠMarion": 55579, - "ĠMaritime": 76231, - "ĠMark": 4389, - "ĠMarkdown": 73192, - "ĠMarker": 39875, - "ĠMarket": 7993, - "ĠMarketable": 23058, - "ĠMarketing": 18228, - "ĠMarketplace": 57258, - "ĠMarkets": 46810, - "ĠMarks": 48095, - "ĠMarkt": 98317, - "ĠMarkup": 98561, - "ĠMarkus": 75840, - "ĠMarl": 57667, - "ĠMarlins": 88890, - "ĠMarr": 68598, - "ĠMarriage": 46099, - "ĠMarried": 64524, - "ĠMarriott": 75822, - "ĠMars": 21048, - "ĠMarseille": 87693, - "ĠMarsh": 39063, - "ĠMarshal": 35667, - "ĠMarshall": 29408, - "ĠMart": 8127, - "ĠMartha": 50870, - "ĠMartial": 71261, - "ĠMartian": 81028, - "ĠMartin": 11565, - "ĠMartinez": 42927, - "ĠMartins": 89699, - "ĠMarty": 55154, - "ĠMarvel": 22105, - "ĠMarvin": 73526, - "ĠMarx": 27088, - "ĠMarxism": 82715, - "ĠMarxist": 68950, - "ĠMary": 10244, - "ĠMaryland": 22652, - "ĠMarÃŃa": 82205, - "ĠMas": 19868, - "ĠMasc": 88898, - "ĠMash": 68179, - "ĠMask": 19924, - "ĠMasks": 61132, - "ĠMason": 28827, - "ĠMass": 9167, - "ĠMassachusetts": 21393, - "ĠMassage": 26385, - "ĠMassive": 81464, - "ĠMast": 36482, - "ĠMaster": 10824, - "ĠMasters": 33622, - "ĠMastery": 93043, - "ĠMat": 6867, - "ĠMatButtonModule": 93692, - "ĠMatDialog": 52475, - "ĠMatSnackBar": 98509, - "ĠMatTable": 84447, - "ĠMata": 88354, - "ĠMatch": 14152, - "ĠMatcher": 60632, - "ĠMatchers": 92709, - "ĠMatches": 61254, - "ĠMatching": 70691, - "ĠMate": 43570, - "ĠMater": 98308, - "ĠMaterial": 10230, - "ĠMaterialApp": 82548, - "ĠMaterialPageRoute": 55267, - "ĠMaterials": 30909, - "ĠMath": 4149, - "ĠMathematic": 71040, - "ĠMathematical": 91002, - "ĠMathematics": 49795, - "ĠMathf": 26196, - "ĠMaths": 92578, - "ĠMatlab": 97589, - "ĠMatrix": 11631, - "ĠMats": 67179, - "ĠMatt": 13374, - "ĠMatte": 64082, - "ĠMatter": 33364, - "ĠMatters": 57264, - "ĠMatth": 68198, - "ĠMatthew": 18939, - "ĠMatthews": 50684, - "ĠMatthias": 89487, - "ĠMattis": 86354, - "ĠMature": 42159, - "ĠMaui": 92450, - "ĠMaul": 93201, - "ĠMaur": 33392, - "ĠMaurice": 67429, - "ĠMaurit": 88213, - "ĠMaven": 98575, - "ĠMaver": 64112, - "ĠMavericks": 86156, - "ĠMax": 7487, - "ĠMaxim": 55525, - "ĠMaximum": 26599, - "ĠMaxwell": 58397, - "ĠMay": 3217, - "ĠMaya": 50344, - "ĠMaybe": 10696, - "ĠMayer": 73711, - "ĠMayo": 57057, - "ĠMayor": 22093, - "ĠMayweather": 97334, - "ĠMayıs": 134032, - "ĠMaz": 38991, - "ĠMazda": 61942, - "ĠMaze": 65091, - "ĠMb": 50265, - "ĠMbps": 79475, - "ĠMc": 4483, - "ĠMcA": 64713, - "ĠMcB": 98874, - "ĠMcC": 14249, - "ĠMcCabe": 84958, - "ĠMcCain": 35535, - "ĠMcCart": 86458, - "ĠMcCarthy": 43940, - "ĠMcCartney": 90393, - "ĠMcCl": 59640, - "ĠMcConnell": 46683, - "ĠMcCorm": 87971, - "ĠMcCoy": 70632, - "ĠMcD": 50253, - "ĠMcDon": 71574, - "ĠMcDonald": 30914, - "ĠMcG": 22927, - "ĠMcGill": 92976, - "ĠMcGr": 87750, - "ĠMcGregor": 68016, - "ĠMcGu": 83064, - "ĠMcInt": 84481, - "ĠMcK": 25636, - "ĠMcKay": 89870, - "ĠMcKenzie": 92623, - "ĠMcKin": 66393, - "ĠMcL": 45607, - "ĠMcLaren": 71364, - "ĠMcM": 81714, - "ĠMcMahon": 79828, - "ĠMcMaster": 99042, - "ĠMcN": 54651, - "ĠMd": 53110, - "ĠMe": 2157, - "ĠMeadow": 88742, - "ĠMeadows": 77042, - "ĠMeal": 56388, - "ĠMeals": 95250, - "ĠMean": 16327, - "ĠMeaning": 48103, - "ĠMeans": 59707, - "ĠMeanwhile": 25894, - "ĠMeasure": 34104, - "ĠMeasurement": 54240, - "ĠMeasurements": 76817, - "ĠMeasures": 72556, - "ĠMeat": 44865, - "ĠMech": 90498, - "ĠMechan": 27801, - "ĠMechanical": 50584, - "ĠMechanics": 76823, - "ĠMed": 3264, - "ĠMedal": 17411, - "ĠMedi": 91757, - "ĠMedia": 7816, - "ĠMediaPlayer": 71010, - "ĠMediaQuery": 42591, - "ĠMediaTek": 84902, - "ĠMediaType": 50423, - "ĠMedian": 62590, - "ĠMedic": 12566, - "ĠMedicaid": 33029, - "ĠMedical": 12939, - "ĠMedicare": 30722, - "ĠMedicine": 18637, - "ĠMedieval": 77148, - "ĠMedina": 84166, - "ĠMeditation": 76471, - "ĠMediterr": 36437, - "ĠMediterranean": 37685, - "ĠMedium": 24355, - "ĠMeer": 94716, - "ĠMeet": 25826, - "ĠMeeting": 29055, - "ĠMeetings": 85583, - "ĠMeg": 27343, - "ĠMega": 34256, - "ĠMegan": 54529, - "ĠMeghan": 79034, - "ĠMeh": 67224, - "ĠMehr": 54412, - "ĠMei": 90933, - "ĠMein": 59330, - "ĠMej": 86145, - "ĠMel": 10978, - "ĠMelania": 82170, - "ĠMelanie": 84250, - "ĠMelbourne": 26437, - "ĠMelee": 63239, - "ĠMelissa": 47048, - "ĠMell": 60185, - "ĠMellon": 87387, - "ĠMem": 13550, - "ĠMember": 12039, - "ĠMembers": 16954, - "ĠMembership": 42552, - "ĠMemo": 56201, - "ĠMemor": 72666, - "ĠMemorial": 26774, - "ĠMemories": 86616, - "ĠMemory": 13850, - "ĠMemoryStream": 36598, - "ĠMemphis": 42062, - "ĠMen": 11012, - "ĠMend": 45111, - "ĠMeng": 60054, - "ĠMens": 23276, - "ĠMenschen": 42786, - "ĠMent": 48593, - "ĠMental": 37795, - "ĠMention": 85148, - "ĠMentor": 91191, - "ĠMenu": 9738, - "ĠMenuItem": 31274, - "ĠMer": 8755, - "ĠMerc": 24171, - "ĠMercedes": 33228, - "ĠMercer": 80011, - "ĠMerch": 65025, - "ĠMerchant": 55399, - "ĠMercury": 43562, - "ĠMercy": 63694, - "ĠMeredith": 83677, - "ĠMerge": 40085, - "ĠMerkel": 46420, - "ĠMerlin": 75966, - "ĠMerr": 47861, - "ĠMerrill": 87683, - "ĠMerry": 76701, - "ĠMes": 35584, - "ĠMesa": 54865, - "ĠMesh": 25122, - "ĠMess": 18713, - "ĠMessage": 4856, - "ĠMessageBox": 10299, - "ĠMessageBoxButton": 97603, - "ĠMessageBoxButtons": 31407, - "ĠMessageBoxIcon": 34036, - "ĠMessageLookup": 98774, - "ĠMessageType": 62336, - "ĠMessages": 26729, - "ĠMessaging": 73170, - "ĠMessenger": 41519, - "ĠMessi": 70005, - "ĠMessiah": 80341, - "ĠMet": 6212, - "ĠMeta": 15819, - "ĠMetadata": 33589, - "ĠMetal": 19206, - "ĠMetallic": 86871, - "ĠMetals": 92715, - "ĠMeteor": 39632, - "ĠMeter": 52539, - "ĠMeth": 56075, - "ĠMethod": 6730, - "ĠMethodInfo": 23837, - "ĠMethodInvocation": 66672, - "ĠMethodist": 67501, - "ĠMethods": 18801, - "ĠMetodo": 94656, - "ĠMetric": 52458, - "ĠMetrics": 54190, - "ĠMetro": 20957, - "ĠMetroFramework": 51355, - "ĠMetropolitan": 44778, - "ĠMets": 56435, - "ĠMex": 9369, - "ĠMexican": 23279, - "ĠMexicans": 96762, - "ĠMexico": 12270, - "ĠMey": 83862, - "ĠMeyer": 47190, - "ĠMg": 72593, - "ĠMi": 20740, - "ĠMia": 60597, - "ĠMiami": 17584, - "ĠMic": 26997, - "ĠMich": 5271, - "ĠMicha": 69920, - "ĠMichael": 7937, - "ĠMichaels": 86756, - "ĠMiche": 62700, - "ĠMichel": 44406, - "ĠMichele": 73306, - "ĠMichelle": 32026, - "ĠMichigan": 14630, - "ĠMick": 59233, - "ĠMickey": 56559, - "ĠMicro": 18157, - "ĠMicrosoft": 5100, - "ĠMicrosystems": 94661, - "ĠMicrowave": 97541, - "ĠMid": 13699, - "ĠMiddle": 12592, - "ĠMiddleton": 91614, - "ĠMiddleware": 72012, - "ĠMidi": 83076, - "ĠMidlands": 80151, - "ĠMidnight": 63580, - "ĠMidwest": 51157, - "ĠMig": 37551, - "ĠMight": 33251, - "ĠMighty": 74168, - "ĠMigration": 21248, - "ĠMiguel": 45891, - "ĠMik": 42242, - "ĠMike": 11268, - "ĠMikhail": 91451, - "ĠMil": 10147, - "ĠMilan": 38755, - "ĠMilano": 74867, - "ĠMild": 60189, - "ĠMile": 38597, - "ĠMiles": 35203, - "ĠMilf": 51558, - "ĠMilit": 67185, - "ĠMilitary": 26960, - "ĠMilk": 43825, - "ĠMilky": 88719, - "ĠMill": 8220, - "ĠMillenn": 51328, - "ĠMillennials": 96643, - "ĠMillennium": 70937, - "ĠMiller": 17035, - "ĠMillion": 33529, - "ĠMillionen": 98435, - "ĠMillions": 73318, - "ĠMills": 33102, - "ĠMilo": 84446, - "ĠMilton": 57347, - "ĠMilwaukee": 35818, - "ĠMim": 91846, - "ĠMime": 82430, - "ĠMin": 3386, - "ĠMind": 22904, - "ĠMinds": 60310, - "ĠMine": 30683, - "ĠMinecraft": 40230, - "ĠMiner": 89912, - "ĠMineral": 49316, - "ĠMinerals": 83786, - "ĠMines": 65782, - "ĠMing": 55883, - "ĠMinh": 92155, - "ĠMini": 19643, - "ĠMinimal": 75112, - "ĠMinimum": 30925, - "ĠMining": 25832, - "ĠMinist": 64892, - "ĠMinister": 9486, - "ĠMinisters": 77973, - "ĠMinistry": 19640, - "ĠMinistério": 139506, - "ĠMinneapolis": 41858, - "ĠMinnesota": 18925, - "ĠMinor": 29793, - "ĠMinority": 70058, - "ĠMint": 41310, - "ĠMinute": 55167, - "ĠMinuten": 80624, - "ĠMinutes": 40999, - "ĠMir": 14268, - "ĠMiracle": 75964, - "ĠMirage": 98142, - "ĠMiranda": 58314, - "ĠMirror": 33854, - "ĠMis": 32559, - "ĠMisc": 39051, - "ĠMiscellaneous": 78277, - "ĠMish": 77476, - "ĠMiss": 8906, - "ĠMissile": 67770, - "ĠMissing": 35264, - "ĠMission": 23220, - "ĠMississippi": 28438, - "ĠMissouri": 24378, - "ĠMist": 34098, - "ĠMister": 91608, - "ĠMistress": 96029, - "ĠMit": 21766, - "ĠMitar": 78722, - "ĠMitarbeiter": 96428, - "ĠMitch": 22586, - "ĠMitchell": 29938, - "ĠMitgli": 77094, - "ĠMits": 59576, - "ĠMitsubishi": 78553, - "ĠMitt": 32618, - "ĠMix": 19219, - "ĠMixed": 50168, - "ĠMixer": 71292, - "ĠMixing": 96599, - "ĠMiy": 66459, - "ĠMiz": 71595, - "ĠMk": 52848, - "ĠMn": 56731, - "ĠMo": 6050, - "ĠMob": 34906, - "ĠMobil": 69830, - "ĠMobile": 13411, - "ĠMobility": 62310, - "ĠMock": 14563, - "ĠMockito": 47109, - "ĠMod": 5650, - "ĠModal": 21311, - "ĠMode": 14562, - "ĠModel": 4903, - "ĠModelAndView": 35068, - "ĠModelRenderer": 81010, - "ĠModelState": 70048, - "ĠModeling": 76249, - "ĠModelo": 90518, - "ĠModels": 26874, - "ĠModer": 43427, - "ĠModerate": 94975, - "ĠModerator": 91442, - "ĠModern": 18265, - "ĠModes": 81689, - "ĠModi": 34389, - "ĠModification": 73855, - "ĠModifications": 95616, - "ĠModified": 29053, - "ĠModifier": 45208, - "ĠModify": 49370, - "ĠMods": 85064, - "ĠModular": 84848, - "ĠModule": 13711, - "ĠModules": 43565, - "ĠMoff": 96381, - "ĠMog": 59921, - "ĠMoh": 19822, - "ĠMohamed": 59659, - "ĠMohammad": 64452, - "ĠMohammed": 45292, - "ĠMoines": 77058, - "ĠMoist": 81704, - "ĠMoj": 89337, - "ĠMojo": 95649, - "ĠMol": 32418, - "ĠMold": 54163, - "ĠMolecular": 59725, - "ĠMolly": 57400, - "ĠMom": 22180, - "ĠMoment": 38996, - "ĠMoments": 82021, - "ĠMomentum": 95110, - "ĠMoms": 83295, - "ĠMon": 3128, - "ĠMona": 98783, - "ĠMonaco": 61551, - "ĠMonad": 59685, - "ĠMond": 50872, - "ĠMonday": 7014, - "ĠMondays": 90171, - "ĠMonetary": 73114, - "ĠMoney": 17633, - "ĠMong": 43439, - "ĠMongo": 24415, - "ĠMongoClient": 60432, - "ĠMongoDB": 45328, - "ĠMongolia": 90750, - "ĠMonica": 45744, - "ĠMonitor": 23519, - "ĠMonitoring": 50703, - "ĠMonk": 75681, - "ĠMonkey": 57837, - "ĠMono": 12691, - "ĠMonoBehaviour": 15714, - "ĠMonroe": 49787, - "ĠMons": 49501, - "ĠMonsanto": 72926, - "ĠMonster": 27973, - "ĠMonsters": 62708, - "ĠMont": 9795, - "ĠMontana": 36005, - "ĠMonte": 45767, - "ĠMonter": 64998, - "ĠMonterey": 97395, - "ĠMontgomery": 43025, - "ĠMonth": 19397, - "ĠMonthly": 44334, - "ĠMonths": 51346, - "ĠMontreal": 29513, - "ĠMonument": 71277, - "ĠMoo": 81996, - "ĠMood": 93567, - "ĠMoodle": 59443, - "ĠMoody": 71301, - "ĠMoon": 17330, - "ĠMoor": 83448, - "ĠMoore": 20219, - "ĠMoose": 68128, - "ĠMor": 8446, - "ĠMoral": 88506, - "ĠMorales": 75502, - "ĠMoran": 92235, - "ĠMore": 4398, - "ĠMoreno": 78175, - "ĠMoreover": 22827, - "ĠMorg": 78060, - "ĠMorgan": 22954, - "ĠMori": 94197, - "ĠMorm": 31294, - "ĠMormon": 36597, - "ĠMormons": 91873, - "ĠMorning": 27984, - "ĠMoroccan": 93967, - "ĠMorocco": 58130, - "ĠMorph": 74640, - "ĠMorr": 44857, - "ĠMorris": 29183, - "ĠMorrison": 48954, - "ĠMorrow": 86274, - "ĠMorse": 86239, - "ĠMort": 22031, - "ĠMortgage": 47680, - "ĠMorton": 71936, - "ĠMos": 12562, - "ĠMoscow": 22415, - "ĠMoses": 40948, - "ĠMosque": 98931, - "ĠMoss": 43510, - "ĠMost": 7496, - "ĠMostly": 63185, - "ĠMosul": 61813, - "ĠMot": 18977, - "ĠMother": 21043, - "ĠMothers": 84935, - "ĠMotion": 26562, - "ĠMotionEvent": 56957, - "ĠMoto": 47498, - "ĠMotor": 17614, - "ĠMotorcycle": 69662, - "ĠMotorola": 62490, - "ĠMotors": 36692, - "ĠMou": 72834, - "ĠMount": 10423, - "ĠMountain": 18634, - "ĠMountains": 40014, - "ĠMounted": 92741, - "ĠMour": 50548, - "ĠMourinho": 65318, - "ĠMouse": 17721, - "ĠMouseButton": 91203, - "ĠMouseEvent": 66217, - "ĠMouseEventArgs": 81904, - "ĠMouth": 65155, - "ĠMov": 53285, - "ĠMove": 14561, - "ĠMoved": 89697, - "ĠMovement": 27998, - "ĠMoves": 56599, - "ĠMovie": 13944, - "ĠMovies": 25930, - "ĠMoving": 37627, - "ĠMoy": 76538, - "ĠMoz": 51443, - "ĠMozart": 94669, - "ĠMozilla": 34733, - "ĠMoż": 141416, - "ĠMoże": 133590, - "ĠMożna": 141417, - "ĠMp": 49965, - "ĠMr": 4392, - "ĠMrs": 17618, - "ĠMs": 16064, - "ĠMsg": 24205, - "ĠMsgBox": 51566, - "ĠMt": 35508, - "ĠMu": 14787, - "ĠMuch": 23309, - "ĠMud": 68340, - "ĠMueller": 31667, - "ĠMug": 63474, - "ĠMuhammad": 35731, - "ĠMuj": 57236, - "ĠMuk": 69219, - "ĠMul": 29351, - "ĠMull": 51527, - "ĠMult": 22162, - "ĠMulti": 17439, - "ĠMultimedia": 82222, - "ĠMultip": 58712, - "ĠMultiple": 28811, - "ĠMultiply": 71059, - "ĠMum": 66837, - "ĠMumbai": 34712, - "ĠMun": 27882, - "ĠMund": 66561, - "ĠMundo": 89823, - "ĠMunich": 46204, - "ĠMunicip": 35703, - "ĠMunicipal": 44240, - "ĠMur": 15006, - "ĠMurder": 51383, - "ĠMurdoch": 78609, - "ĠMurphy": 29953, - "ĠMurray": 27154, - "ĠMus": 5331, - "ĠMuscle": 67327, - "ĠMuse": 50008, - "ĠMuseum": 16328, - "ĠMush": 58105, - "ĠMushroom": 90197, - "ĠMusic": 10717, - "ĠMusical": 56257, - "ĠMusik": 75410, - "ĠMusk": 39538, - "ĠMuslim": 10240, - "ĠMuslims": 19503, - "ĠMuss": 89714, - "ĠMust": 15465, - "ĠMustang": 52779, - "ĠMut": 31228, - "ĠMutable": 31143, - "ĠMutableList": 78024, - "ĠMutableLiveData": 55281, - "ĠMutation": 67203, - "ĠMutex": 66215, - "ĠMutual": 74042, - "ĠMvc": 97585, - "ĠMy": 3017, - "ĠMyApp": 54016, - "ĠMyBase": 60133, - "ĠMyClass": 83826, - "ĠMySQL": 26339, - "ĠMySql": 25725, - "ĠMySqlCommand": 58307, - "ĠMySqlConnection": 81987, - "ĠMyanmar": 52355, - "ĠMyers": 50223, - "ĠMyst": 29627, - "ĠMystery": 48005, - "ĠMystic": 88525, - "ĠMyth": 46495, - "ĠMá": 127428, - "ĠMás": 83875, - "ĠMáy": 133151, - "ĠMã": 137017, - "ĠMädchen": 78596, - "ĠMänner": 98376, - "ĠMär": 84132, - "ĠMärz": 135777, - "ĠMé": 42931, - "ĠMéd": 97390, - "ĠMét": 61258, - "ĠMétodo": 80376, - "ĠMéxico": 62171, - "ĠMö": 48682, - "ĠMöglich": 66461, - "ĠMöglichkeit": 90817, - "ĠMü": 63630, - "ĠMüd": 139913, - "ĠMüdü": 137463, - "ĠMüdürl": 137464, - "ĠMüdürlÃ¼ÄŁÃ¼": 137465, - "ĠMüdürü": 139914, - "ĠMüller": 98918, - "ĠMünchen": 89266, - "ĠMüsl": 141413, - "ĠMüslü": 141414, - "ĠMüslüman": 141415, - "ĠMÃł": 137701, - "ĠMặc": 139333, - "ĠMặt": 140366, - "ĠMẹ": 137864, - "ĠMỹ": 128819, - "ĠMá»įi": 141206, - "ĠMá»Ĺi": 138824, - "ĠMá»Ļt": 129005, - "ĠN": 451, - "ĠNA": 20662, - "ĠNAFTA": 84719, - "ĠNAME": 19122, - "ĠNAMES": 90910, - "ĠNAN": 92129, - "ĠNAND": 76457, - "ĠNAS": 16086, - "ĠNASA": 21431, - "ĠNASCAR": 64590, - "ĠNAT": 18248, - "ĠNATIONAL": 93681, - "ĠNATO": 29234, - "ĠNAV": 53303, - "ĠNB": 34979, - "ĠNBA": 17390, - "ĠNBC": 23521, - "ĠNC": 20059, - "ĠNCAA": 33160, - "ĠND": 38444, - "ĠNDEBUG": 98529, - "ĠNDP": 53650, - "ĠNE": 7856, - "ĠNEC": 82268, - "ĠNEED": 48133, - "ĠNEG": 84065, - "ĠNEGLIGENCE": 28548, - "ĠNEO": 86583, - "ĠNES": 73213, - "ĠNET": 24977, - "ĠNETWORK": 57436, - "ĠNEVER": 55025, - "ĠNEW": 16165, - "ĠNEWS": 40126, - "ĠNEXT": 45011, - "ĠNF": 44727, - "ĠNFC": 47205, - "ĠNFL": 12588, - "ĠNFS": 87815, - "ĠNG": 20018, - "ĠNGO": 46786, - "ĠNGOs": 71514, - "ĠNGX": 89105, - "ĠNH": 34831, - "ĠNHL": 23677, - "ĠNHS": 36281, - "ĠNI": 41501, - "ĠNIC": 64215, - "ĠNIGHT": 75031, - "ĠNIH": 83270, - "ĠNIL": 64147, - "ĠNIR": 98754, - "ĠNJ": 26718, - "ĠNK": 70063, - "ĠNL": 32160, - "ĠNM": 39714, - "ĠNN": 44678, - "ĠNO": 5664, - "ĠNOAA": 85648, - "ĠNODE": 34817, - "ĠNOI": 24767, - "ĠNOM": 97711, - "ĠNON": 20575, - "ĠNONE": 42869, - "ĠNONINFRINGEMENT": 27986, - "ĠNOP": 86376, - "ĠNOR": 69088, - "ĠNORMAL": 52431, - "ĠNORTH": 74759, - "ĠNOT": 4183, - "ĠNOTE": 16743, - "ĠNOTES": 69946, - "ĠNOTHING": 86081, - "ĠNOTICE": 29229, - "ĠNOTIFY": 83102, - "ĠNOW": 22407, - "ĠNP": 43240, - "ĠNPC": 29717, - "ĠNPCs": 73570, - "ĠNPR": 44200, - "ĠNR": 39295, - "ĠNRA": 52409, - "ĠNRF": 72010, - "ĠNRL": 94154, - "ĠNS": 3043, - "ĠNSA": 30783, - "ĠNSArray": 25504, - "ĠNSAttributedString": 93237, - "ĠNSCoder": 68962, - "ĠNSData": 49770, - "ĠNSDate": 45267, - "ĠNSDictionary": 28896, - "ĠNSError": 31238, - "ĠNSF": 79528, - "ĠNSIndexPath": 65168, - "ĠNSInteger": 37962, - "ĠNSK": 82142, - "ĠNSLayoutConstraint": 59582, - "ĠNSLocalizedString": 60272, - "ĠNSLog": 18322, - "ĠNSMutable": 21092, - "ĠNSMutableArray": 33268, - "ĠNSMutableDictionary": 51905, - "ĠNSNumber": 48473, - "ĠNSObject": 26209, - "ĠNSRange": 92096, - "ĠNSS": 56008, - "ĠNSString": 9335, - "ĠNSStringFromClass": 86361, - "ĠNST": 38542, - "ĠNSTextAlignment": 74234, - "ĠNSUInteger": 60132, - "ĠNSURL": 39863, - "ĠNSW": 37908, - "ĠNT": 17658, - "ĠNTN": 78815, - "ĠNU": 60725, - "ĠNUIT": 73976, - "ĠNUITKA": 74420, - "ĠNULL": 1770, - "ĠNUM": 15943, - "ĠNUMBER": 36836, - "ĠNUnit": 52450, - "ĠNV": 24458, - "ĠNVIC": 85932, - "ĠNVIDIA": 33561, - "ĠNW": 41074, - "ĠNX": 57185, - "ĠNXT": 90401, - "ĠNY": 12271, - "ĠNYC": 33285, - "ĠNYPD": 73155, - "ĠNYT": 98712, - "ĠNZ": 41757, - "ĠNa": 12812, - "ĠNaN": 32178, - "ĠNab": 87306, - "ĠNach": 28275, - "ĠNachricht": 80072, - "ĠNacht": 98359, - "ĠNacional": 44589, - "ĠNack": 95062, - "ĠNad": 34662, - "ĠNadu": 74805, - "ĠNag": 29062, - "ĠNagar": 87194, - "ĠNah": 71988, - "ĠNail": 74428, - "ĠNairobi": 96525, - "ĠNaj": 66353, - "ĠNak": 43229, - "ĠNaked": 53738, - "ĠNam": 29974, - "ĠName": 3988, - "ĠNamed": 40459, - "ĠNamen": 84100, - "ĠNames": 34875, - "ĠNamespace": 41962, - "ĠNaming": 96475, - "ĠNan": 32142, - "ĠNancy": 34236, - "ĠNano": 62951, - "ĠNaomi": 77722, - "ĠNap": 28476, - "ĠNaples": 82621, - "ĠNapoleon": 69427, - "ĠNapoli": 85676, - "ĠNar": 28753, - "ĠNarc": 78320, - "ĠNarendra": 66332, - "ĠNarr": 56869, - "ĠNarrative": 95721, - "ĠNarrow": 82311, - "ĠNaruto": 48994, - "ĠNas": 38222, - "ĠNash": 27412, - "ĠNashville": 36540, - "ĠNass": 71902, - "ĠNasıl": 137038, - "ĠNat": 23833, - "ĠNatal": 41601, - "ĠNatalie": 63020, - "ĠNatasha": 86666, - "ĠNate": 54669, - "ĠNath": 60809, - "ĠNathan": 36737, - "ĠNation": 17227, - "ĠNational": 5055, - "ĠNationals": 61091, - "ĠNations": 19140, - "ĠNationwide": 89654, - "ĠNative": 16703, - "ĠNatur": 39449, - "ĠNatural": 18448, - "ĠNaturally": 59742, - "ĠNature": 21331, - "ĠNatürlich": 142839, - "ĠNaughty": 86741, - "ĠNav": 11966, - "ĠNavBar": 78666, - "ĠNavController": 55762, - "ĠNavLink": 94216, - "ĠNavParams": 75900, - "ĠNaval": 45729, - "ĠNavbar": 38309, - "ĠNavigate": 81739, - "ĠNavigation": 17980, - "ĠNavigator": 26542, - "ĠNavy": 19036, - "ĠNaw": 89710, - "ĠNay": 98073, - "ĠNaz": 28774, - "ĠNazi": 31427, - "ĠNazis": 48433, - "ĠNb": 77483, - "ĠNd": 87368, - "ĠNe": 4182, - "ĠNeal": 65449, - "ĠNear": 30394, - "ĠNearby": 95548, - "ĠNearly": 48569, - "ĠNeb": 51709, - "ĠNebraska": 37279, - "ĠNec": 63124, - "ĠNecessary": 94533, - "ĠNeck": 42955, - "ĠNecklace": 85360, - "ĠNed": 69999, - "ĠNederland": 65392, - "ĠNeed": 14656, - "ĠNeeded": 56561, - "ĠNeedle": 88800, - "ĠNeedless": 82283, - "ĠNeeds": 43140, - "ĠNeg": 23995, - "ĠNegative": 50857, - "ĠNegot": 74211, - "ĠNegro": 56047, - "ĠNeh": 72436, - "ĠNeighbor": 97163, - "ĠNeighborhood": 61512, - "ĠNeil": 33121, - "ĠNeither": 24233, - "ĠNel": 88361, - "ĠNelson": 26464, - "ĠNem": 62168, - "ĠNeo": 40644, - "ĠNeon": 76964, - "ĠNep": 36569, - "ĠNepal": 48964, - "ĠNeptune": 79624, - "ĠNer": 65804, - "ĠNero": 84078, - "ĠNes": 91408, - "ĠNess": 87502, - "ĠNest": 38905, - "ĠNested": 71742, - "ĠNet": 9374, - "ĠNetanyahu": 44642, - "ĠNetflix": 22642, - "ĠNetherlands": 25662, - "ĠNets": 58387, - "ĠNetwork": 8141, - "ĠNetworking": 59463, - "ĠNetworks": 38710, - "ĠNetz": 92283, - "ĠNeu": 44850, - "ĠNeue": 75563, - "ĠNeural": 60477, - "ĠNeuro": 31259, - "ĠNeuroscience": 84779, - "ĠNeutral": 58694, - "ĠNev": 24324, - "ĠNevada": 26868, - "ĠNever": 14695, - "ĠNevertheless": 33953, - "ĠNeville": 81235, - "ĠNew": 1532, - "ĠNewark": 64499, - "ĠNewcastle": 43126, - "ĠNewest": 78697, - "ĠNewfoundland": 88296, - "ĠNewly": 98835, - "ĠNewman": 55621, - "ĠNewport": 58800, - "ĠNews": 5398, - "ĠNewsletter": 38593, - "ĠNewsp": 60003, - "ĠNewspaper": 86739, - "ĠNewton": 20668, - "ĠNewtonsoft": 31579, - "ĠNewtown": 91829, - "ĠNex": 87829, - "ĠNext": 9295, - "ĠNexus": 40022, - "ĠNey": 95048, - "ĠNg": 16619, - "ĠNgModule": 27823, - "ĠNgb": 66289, - "ĠNgh": 128018, - "ĠNghá»ĩ": 138770, - "ĠNghá»ĭ": 141127, - "ĠNgo": 126949, - "ĠNgoÃłi": 130676, - "ĠNgoại": 142769, - "ĠNguy": 128983, - "ĠNguyen": 63161, - "ĠNguyên": 132019, - "ĠNguyá»ħn": 128984, - "ĠNgân": 138737, - "ĠNgô": 137192, - "ĠNgÃłi": 142562, - "ĠNgÃły": 131160, - "ĠNgưá»Ŀi": 129639, - "ĠNgá»įc": 132896, - "ĠNh": 90453, - "ĠNhi": 135996, - "ĠNhiá»ģu": 135997, - "ĠNhân": 133404, - "ĠNhÃł": 129645, - "ĠNhư": 133958, - "ĠNhưng": 129840, - "ĠNhất": 140285, - "ĠNháºŃn": 142435, - "ĠNháºŃt": 129898, - "ĠNhững": 128965, - "ĠNi": 21890, - "ĠNiagara": 77877, - "ĠNic": 17552, - "ĠNicar": 66038, - "ĠNicaragua": 76324, - "ĠNice": 28859, - "ĠNich": 25671, - "ĠNicholas": 39696, - "ĠNichols": 80150, - "ĠNicholson": 88883, - "ĠNicht": 86417, - "ĠNick": 14991, - "ĠNickel": 66842, - "ĠNico": 74035, - "ĠNicol": 82340, - "ĠNicola": 78441, - "ĠNicolas": 51736, - "ĠNicole": 44030, - "ĠNie": 52283, - "ĠNielsen": 63451, - "ĠNiet": 59298, - "ĠNietzsche": 93106, - "ĠNigel": 65816, - "ĠNiger": 20369, - "ĠNigeria": 28158, - "ĠNigerian": 54333, - "ĠNight": 12826, - "ĠNightmare": 74125, - "ĠNights": 63543, - "ĠNik": 21573, - "ĠNike": 33144, - "ĠNikki": 69107, - "ĠNikol": 95557, - "ĠNikola": 96315, - "ĠNikon": 62152, - "ĠNil": 32274, - "ĠNile": 76190, - "ĠNim": 46583, - "ĠNimbus": 71493, - "ĠNin": 26727, - "ĠNina": 63888, - "ĠNine": 37066, - "ĠNing": 85083, - "ĠNinja": 46985, - "ĠNintendo": 22799, - "ĠNinth": 85758, - "ĠNir": 77743, - "ĠNissan": 41881, - "ĠNit": 49516, - "ĠNixon": 41626, - "ĠNo": 2308, - "ĠNoSuch": 47977, - "ĠNoSuchElementException": 94449, - "ĠNoah": 41984, - "ĠNob": 19017, - "ĠNobel": 46978, - "ĠNoble": 48587, - "ĠNobody": 36458, - "ĠNode": 6018, - "ĠNodeList": 98711, - "ĠNodeType": 82749, - "ĠNodes": 52501, - "ĠNodo": 94129, - "ĠNoel": 69561, - "ĠNoir": 72714, - "ĠNoise": 50523, - "ĠNokia": 35706, - "ĠNolan": 61632, - "ĠNom": 36900, - "ĠNombre": 47695, - "ĠNome": 58275, - "ĠNon": 11581, - "ĠNone": 2240, - "ĠNonetheless": 55633, - "ĠNoon": 82856, - "ĠNope": 85719, - "ĠNor": 8011, - "ĠNora": 72545, - "ĠNord": 29181, - "ĠNordic": 63366, - "ĠNorfolk": 58692, - "ĠNorm": 20317, - "ĠNormal": 18437, - "ĠNormalize": 68092, - "ĠNormally": 51683, - "ĠNorman": 40068, - "ĠNorris": 70765, - "ĠNorse": 93514, - "ĠNorte": 82293, - "ĠNorth": 4787, - "ĠNortheast": 44580, - "ĠNorthern": 16926, - "ĠNorthwest": 39405, - "ĠNorthwestern": 66263, - "ĠNorton": 59264, - "ĠNorway": 31503, - "ĠNorwegian": 44621, - "ĠNorwich": 83123, - "ĠNos": 49997, - "ĠNose": 92123, - "ĠNot": 2806, - "ĠNotFound": 23420, - "ĠNotFoundException": 66646, - "ĠNotImplemented": 21548, - "ĠNotImplementedError": 38199, - "ĠNotImplementedException": 33146, - "ĠNotSupportedException": 92990, - "ĠNote": 7036, - "ĠNotebook": 68655, - "ĠNotes": 18068, - "ĠNothing": 12064, - "ĠNotice": 24742, - "ĠNoticed": 70134, - "ĠNotices": 95253, - "ĠNotification": 16571, - "ĠNotificationCenter": 83335, - "ĠNotifications": 52938, - "ĠNotify": 34970, - "ĠNotre": 43464, - "ĠNottingham": 66559, - "ĠNotÃŃc": 140352, - "ĠNotÃŃcias": 140353, - "ĠNou": 59187, - "ĠNous": 47009, - "ĠNov": 4620, - "ĠNova": 34641, - "ĠNovel": 52876, - "ĠNovember": 6702, - "ĠNow": 4695, - "ĠNowadays": 86481, - "ĠNpgsql": 78879, - "ĠNr": 69093, - "ĠNu": 32324, - "ĠNuclear": 37444, - "ĠNude": 54668, - "ĠNuevo": 87758, - "ĠNug": 58245, - "ĠNuggets": 84477, - "ĠNull": 18084, - "ĠNullPointerException": 56850, - "ĠNullable": 52655, - "ĠNum": 16212, - "ĠNumber": 5624, - "ĠNumberOf": 98349, - "ĠNumbers": 34713, - "ĠNumer": 47124, - "ĠNumeric": 50367, - "ĠNumero": 90985, - "ĠNumerous": 85815, - "ĠNun": 63678, - "ĠNunes": 85112, - "ĠNur": 56231, - "ĠNurs": 32341, - "ĠNurse": 48776, - "ĠNursery": 92185, - "ĠNurses": 95236, - "ĠNursing": 45253, - "ĠNut": 18372, - "ĠNutrition": 38600, - "ĠNutzung": 84605, - "ĠNvidia": 61367, - "ĠNx": 81047, - "ĠNy": 36732, - "ĠNylon": 90662, - "ĠNz": 98692, - "ĠNº": 140124, - "ĠNão": 57649, - "ĠNä": 84974, - "ĠNähe": 137900, - "ĠNó": 131031, - "ĠNÄĥm": 133670, - "ĠNẵ": 135240, - "ĠNẵng": 135241, - "ĠNếu": 129024, - "ĠNữ": 140870, - "ĠNá»Ļi": 128685, - "ĠO": 506, - "ĠOA": 80442, - "ĠOAuth": 38316, - "ĠOB": 43173, - "ĠOBJ": 42583, - "ĠOBJECT": 39786, - "ĠOBS": 75860, - "ĠOC": 31867, - "ĠOCC": 88013, - "ĠOCD": 97924, - "ĠOCI": 92087, - "ĠOCR": 80577, - "ĠOCT": 66177, - "ĠOD": 52732, - "ĠOE": 55530, - "ĠOECD": 78417, - "ĠOEM": 40762, - "ĠOF": 3008, - "ĠOFF": 17611, - "ĠOFFSET": 48104, - "ĠOG": 66359, - "ĠOH": 28722, - "ĠOID": 76358, - "ĠOK": 10402, - "ĠOL": 55270, - "ĠOLD": 64891, - "ĠOLED": 70952, - "ĠOM": 47337, - "ĠOMAP": 94536, - "ĠOMG": 97545, - "ĠOMIT": 69400, - "ĠOMX": 59830, - "ĠON": 6197, - "ĠONE": 24038, - "ĠONLINE": 52274, - "ĠONLY": 26687, - "ĠOO": 86818, - "ĠOP": 13134, - "ĠOPC": 86371, - "ĠOPEN": 29841, - "ĠOPER": 41376, - "ĠOPERATION": 98684, - "ĠOPP": 94181, - "ĠOPS": 82855, - "ĠOPT": 40034, - "ĠOPTION": 29895, - "ĠOPTIONAL": 76232, - "ĠOPTIONS": 51280, - "ĠOR": 2726, - "ĠORD": 69269, - "ĠORDER": 15520, - "ĠORIGINAL": 86782, - "ĠORM": 53590, - "ĠOS": 10085, - "ĠOSC": 74509, - "ĠOSD": 93522, - "ĠOSError": 74242, - "ĠOSI": 88078, - "ĠOSP": 96539, - "ĠOSS": 83233, - "ĠOST": 93301, - "ĠOSX": 87746, - "ĠOT": 8605, - "ĠOTA": 96747, - "ĠOTHER": 10065, - "ĠOTHERWISE": 18071, - "ĠOTP": 80868, - "ĠOU": 62835, - "ĠOUR": 44913, - "ĠOUT": 9808, - "ĠOUTER": 89675, - "ĠOUTPUT": 30990, - "ĠOV": 74302, - "ĠOVER": 35464, - "ĠOVERRIDE": 87301, - "ĠOW": 28869, - "ĠOWN": 68469, - "ĠOWNER": 50178, - "ĠOak": 18283, - "ĠOakland": 29681, - "ĠOaks": 74256, - "ĠOasis": 87291, - "ĠOb": 4657, - "ĠObama": 7105, - "ĠObamacare": 35996, - "ĠOber": 51145, - "ĠObesity": 94071, - "ĠObj": 26639, - "ĠObject": 3002, - "ĠObjectId": 50090, - "ĠObjectMapper": 54350, - "ĠObjectOutputStream": 97786, - "ĠObjectType": 78886, - "ĠObjective": 54289, - "ĠObjects": 24114, - "ĠObl": 55775, - "ĠObs": 50441, - "ĠObserv": 30843, - "ĠObservable": 11231, - "ĠObservableCollection": 44464, - "ĠObservation": 86429, - "ĠObservatory": 57874, - "ĠObserver": 34041, - "ĠObst": 94844, - "ĠObt": 56647, - "ĠObtain": 63424, - "ĠObviously": 35430, - "ĠOc": 82452, - "ĠOcc": 19927, - "ĠOccasionally": 88326, - "ĠOccup": 32412, - "ĠOccupation": 98352, - "ĠOccupational": 84155, - "ĠOccupy": 73935, - "ĠOcean": 21575, - "ĠOct": 4915, - "ĠOctober": 6527, - "ĠOculus": 55384, - "ĠOczy": 141295, - "ĠOczywiÅĽcie": 141296, - "ĠOd": 24560, - "ĠOdd": 55036, - "ĠOdds": 83357, - "ĠOdin": 91073, - "ĠOdyssey": 65781, - "ĠOf": 4940, - "ĠOff": 4114, - "ĠOffensive": 75489, - "ĠOffer": 24498, - "ĠOffering": 66018, - "ĠOffers": 51318, - "ĠOffice": 8246, - "ĠOfficer": 19577, - "ĠOfficers": 48847, - "ĠOffices": 86538, - "ĠOfficial": 22651, - "ĠOfficials": 63139, - "ĠOffline": 66370, - "ĠOffset": 16861, - "ĠOften": 34916, - "ĠOg": 40837, - "ĠOgre": 63822, - "ĠOh": 8670, - "ĠOhio": 14352, - "ĠOil": 15526, - "ĠOilers": 89227, - "ĠOk": 7622, - "ĠOkHttpClient": 78920, - "ĠOkay": 35439, - "ĠOklahoma": 22797, - "ĠOktober": 73208, - "ĠOl": 11959, - "ĠOld": 10621, - "ĠOlder": 53925, - "ĠOle": 32697, - "ĠOleDb": 56845, - "ĠOliv": 64284, - "ĠOlive": 46714, - "ĠOliveira": 95314, - "ĠOliver": 30246, - "ĠOlivia": 59287, - "ĠOlivier": 77018, - "ĠOlsen": 81781, - "ĠOlson": 74255, - "ĠOlymp": 14792, - "ĠOlympia": 95729, - "ĠOlympic": 24900, - "ĠOlympics": 31963, - "ĠOlympus": 96791, - "ĠOm": 18603, - "ĠOmaha": 67205, - "ĠOman": 81125, - "ĠOmar": 53558, - "ĠOmega": 43309, - "ĠOmn": 89834, - "ĠOmni": 85225, - "ĠOn": 1913, - "ĠOnClickListener": 67307, - "ĠOnCollision": 92511, - "ĠOnDestroy": 45889, - "ĠOnInit": 10972, - "ĠOnPropertyChanged": 49281, - "ĠOnTrigger": 50576, - "ĠOnTriggerEnter": 64104, - "ĠOnc": 76754, - "ĠOnce": 9646, - "ĠOne": 3776, - "ĠOnePlus": 80965, - "ĠOnes": 73833, - "ĠOnion": 85935, - "ĠOnline": 8105, - "ĠOnly": 8278, - "ĠOnt": 17819, - "ĠOntario": 20551, - "ĠOok": 94555, - "ĠOops": 95252, - "ĠOp": 10672, - "ĠOpCode": 97779, - "ĠOpcode": 78899, - "ĠOpen": 5264, - "ĠOpenFileDialog": 94086, - "ĠOpenGL": 36703, - "ĠOpenSSL": 65617, - "ĠOpening": 40037, - "ĠOpens": 66179, - "ĠOper": 7461, - "ĠOpera": 38579, - "ĠOperand": 61085, - "ĠOperating": 35133, - "ĠOperation": 16730, - "ĠOperational": 89296, - "ĠOperations": 24883, - "ĠOperator": 28498, - "ĠOperators": 64420, - "ĠOpinion": 59667, - "ĠOpp": 28610, - "ĠOpport": 34278, - "ĠOpportunities": 65785, - "ĠOpportunity": 47279, - "ĠOpposition": 65559, - "ĠOpr": 77518, - "ĠOprah": 91158, - "ĠOps": 55158, - "ĠOpt": 16554, - "ĠOptical": 74839, - "ĠOptim": 30097, - "ĠOptimization": 57739, - "ĠOption": 6959, - "ĠOptional": 12256, - "ĠOptionally": 96195, - "ĠOptions": 14566, - "ĠOr": 2521, - "ĠOracle": 21422, - "ĠOral": 53401, - "ĠOrange": 21958, - "ĠOrb": 42988, - "ĠOrbit": 84457, - "ĠOrc": 56586, - "ĠOrch": 54305, - "ĠOrchard": 83152, - "ĠOrchestra": 53517, - "ĠOrd": 30037, - "ĠOrden": 96845, - "ĠOrder": 7217, - "ĠOrdered": 39581, - "ĠOrderedDict": 53213, - "ĠOrdering": 68621, - "ĠOrders": 31836, - "ĠOrdinary": 97911, - "ĠOre": 33443, - "ĠOregon": 18784, - "ĠOrg": 33706, - "ĠOrgan": 10762, - "ĠOrganic": 42937, - "ĠOrganisation": 46743, - "ĠOrganization": 20395, - "ĠOrganizations": 66692, - "ĠOrganizer": 85837, - "ĠOri": 37898, - "ĠOrient": 61474, - "ĠOriental": 70951, - "ĠOrientation": 54134, - "ĠOrig": 45498, - "ĠOrigin": 17116, - "ĠOriginal": 17230, - "ĠOriginally": 24805, - "ĠOrigins": 69491, - "ĠOrioles": 79260, - "ĠOrion": 68673, - "ĠOrlando": 27844, - "ĠOrleans": 25919, - "ĠOrn": 87839, - "ĠOro": 59729, - "ĠOrr": 86019, - "ĠOrt": 44340, - "ĠOrth": 31110, - "ĠOrthodox": 45173, - "ĠOrtiz": 78550, - "ĠOrwell": 82753, - "ĠOs": 15433, - "ĠOsaka": 86985, - "ĠOsama": 82242, - "ĠOsborne": 70129, - "ĠOsc": 55636, - "ĠOscar": 30697, - "ĠOscars": 88796, - "ĠOslo": 57858, - "ĠOsman": 140411, - "ĠOsmanlı": 140412, - "ĠOst": 65435, - "ĠOsw": 65221, - "ĠOswald": 89350, - "ĠOt": 30576, - "ĠOther": 6944, - "ĠOthers": 25028, - "ĠOtherwise": 18214, - "ĠOtt": 23930, - "ĠOttawa": 32166, - "ĠOtto": 65891, - "ĠOttoman": 69010, - "ĠOu": 68227, - "ĠOur": 5633, - "ĠOut": 4371, - "ĠOutcome": 94609, - "ĠOutdoor": 32682, - "ĠOuter": 55197, - "ĠOutlet": 75649, - "ĠOutline": 51909, - "ĠOutlineInputBorder": 82537, - "ĠOutlook": 41058, - "ĠOutput": 9258, - "ĠOutputStream": 52058, - "ĠOutputs": 58414, - "ĠOutreach": 96450, - "ĠOuts": 85400, - "ĠOutside": 41151, - "ĠOutstanding": 75341, - "ĠOval": 55689, - "ĠOven": 86113, - "ĠOver": 6065, - "ĠOverall": 27893, - "ĠOverflow": 70447, - "ĠOverlay": 64867, - "ĠOvernight": 92468, - "ĠOverride": 38258, - "ĠOverrides": 46083, - "ĠOvers": 61561, - "ĠOverse": 85303, - "ĠOversight": 89851, - "ĠOverview": 34807, - "ĠOverwatch": 72338, - "ĠOw": 40796, - "ĠOwen": 46709, - "ĠOwens": 63357, - "ĠOwl": 73695, - "ĠOwn": 20547, - "ĠOwned": 85093, - "ĠOwner": 25833, - "ĠOwners": 39466, - "ĠOwnership": 84936, - "ĠOx": 50615, - "ĠOxford": 25210, - "ĠOxygen": 86569, - "ĠOz": 35604, - "ĠP": 393, - "ĠPA": 12878, - "ĠPAC": 39864, - "ĠPACK": 33332, - "ĠPACKAGE": 66258, - "ĠPACKET": 73205, - "ĠPAD": 61754, - "ĠPAGE": 25040, - "ĠPAL": 51469, - "ĠPAN": 72281, - "ĠPANEL": 80024, - "ĠPAR": 26081, - "ĠPARA": 50400, - "ĠPARAM": 28608, - "ĠPARAMETERS": 68079, - "ĠPARK": 66284, - "ĠPART": 6766, - "ĠPARTIC": 7550, - "ĠPARTICULAR": 7652, - "ĠPARTY": 63227, - "ĠPAS": 59917, - "ĠPASS": 50835, - "ĠPASSWORD": 50671, - "ĠPAT": 44370, - "ĠPATCH": 59345, - "ĠPATH": 26773, - "ĠPAY": 49377, - "ĠPB": 30934, - "ĠPBS": 59045, - "ĠPC": 6673, - "ĠPCA": 60929, - "ĠPCB": 50077, - "ĠPCI": 27789, - "ĠPCIe": 90690, - "ĠPCM": 75007, - "ĠPCR": 66691, - "ĠPCS": 91097, - "ĠPCs": 46831, - "ĠPD": 26474, - "ĠPDF": 11358, - "ĠPDO": 24964, - "ĠPDT": 45457, - "ĠPE": 21804, - "ĠPED": 93753, - "ĠPEM": 96734, - "ĠPEN": 80670, - "ĠPEOPLE": 66725, - "ĠPER": 17854, - "ĠPERF": 78377, - "ĠPERFORMANCE": 80946, - "ĠPERMISSION": 96540, - "ĠPERSON": 56377, - "ĠPET": 49259, - "ĠPF": 28415, - "ĠPG": 30044, - "ĠPGA": 79785, - "ĠPH": 14659, - "ĠPHI": 84835, - "ĠPHONE": 91083, - "ĠPHOTO": 64777, - "ĠPHP": 13119, - "ĠPHPUnit": 62186, - "ĠPHY": 57241, - "ĠPHYS": 83987, - "ĠPI": 22578, - "ĠPIC": 60606, - "ĠPICK": 83537, - "ĠPID": 35771, - "ĠPIE": 79455, - "ĠPIL": 42075, - "ĠPIN": 27129, - "ĠPIO": 86521, - "ĠPIPE": 71674, - "ĠPIT": 92919, - "ĠPIX": 61601, - "ĠPIXEL": 95822, - "ĠPIXI": 93570, - "ĠPJ": 64980, - "ĠPK": 24826, - "ĠPKK": 97958, - "ĠPL": 10315, - "ĠPLA": 96966, - "ĠPLACE": 81882, - "ĠPLAN": 72566, - "ĠPLATFORM": 68670, - "ĠPLAY": 41988, - "ĠPLAYER": 44717, - "ĠPLC": 69352, - "ĠPLEASE": 53133, - "ĠPLL": 54345, - "ĠPLUGIN": 82507, - "ĠPLUS": 58453, - "ĠPM": 5851, - "ĠPMC": 87032, - "ĠPMID": 60941, - "ĠPN": 61901, - "ĠPNG": 41639, - "ĠPO": 12932, - "ĠPOD": 90501, - "ĠPOINT": 46595, - "ĠPOINTER": 78031, - "ĠPOL": 31640, - "ĠPOLIT": 83220, - "ĠPOLITICO": 98439, - "ĠPOLL": 93115, - "ĠPOP": 45728, - "ĠPOR": 57870, - "ĠPORT": 19075, - "ĠPOS": 26494, - "ĠPOSITION": 73723, - "ĠPOSIX": 72147, - "ĠPOSS": 27556, - "ĠPOSSIBILITY": 29382, - "ĠPOST": 12869, - "ĠPOT": 61502, - "ĠPOV": 74521, - "ĠPOW": 69793, - "ĠPOWER": 42637, - "ĠPP": 29850, - "ĠPPC": 69727, - "ĠPPP": 74038, - "ĠPQ": 61717, - "ĠPR": 8575, - "ĠPRE": 20952, - "ĠPREF": 98002, - "ĠPREFIX": 69978, - "ĠPRES": 78764, - "ĠPRESS": 73819, - "ĠPRI": 50167, - "ĠPRICE": 59052, - "ĠPRIMARY": 37467, - "ĠPRINT": 35893, - "ĠPRIV": 89345, - "ĠPRIVATE": 57793, - "ĠPRO": 5308, - "ĠPROC": 24363, - "ĠPROCESS": 51437, - "ĠPROCUREMENT": 30332, - "ĠPRODUCT": 38083, - "ĠPRODUCTS": 87290, - "ĠPROF": 25518, - "ĠPROFILE": 70950, - "ĠPROFITS": 28224, - "ĠPROGMEM": 89960, - "ĠPROGRAM": 45661, - "ĠPROJECT": 39892, - "ĠPROM": 67688, - "ĠPROP": 41977, - "ĠPROPERTY": 55640, - "ĠPROT": 90828, - "ĠPROVID": 15476, - "ĠPROVIDED": 16525, - "ĠPS": 11405, - "ĠPSA": 69486, - "ĠPSD": 73634, - "ĠPSG": 92677, - "ĠPSI": 88178, - "ĠPSP": 68814, - "ĠPST": 40984, - "ĠPSU": 87993, - "ĠPT": 19370, - "ĠPTR": 55196, - "ĠPTS": 96261, - "ĠPTSD": 61319, - "ĠPU": 52088, - "ĠPUB": 76744, - "ĠPUBLIC": 31416, - "ĠPUR": 7330, - "ĠPURE": 83488, - "ĠPURPOSE": 7515, - "ĠPUSH": 70509, - "ĠPUT": 34380, - "ĠPV": 37864, - "ĠPVC": 49866, - "ĠPVOID": 81576, - "ĠPW": 58293, - "ĠPWM": 36034, - "ĠPX": 55484, - "ĠPY": 42760, - "ĠPYTHON": 76678, - "ĠPa": 15681, - "ĠPablo": 52763, - "ĠPac": 12637, - "ĠPace": 84519, - "ĠPacers": 84537, - "ĠPacific": 16462, - "ĠPack": 13795, - "ĠPackage": 16906, - "ĠPackageManager": 56395, - "ĠPackages": 63384, - "ĠPackaging": 69788, - "ĠPackers": 43528, - "ĠPacket": 28889, - "ĠPacking": 97818, - "ĠPacks": 89532, - "ĠPact": 98373, - "ĠPad": 25299, - "ĠPadding": 23024, - "ĠPadres": 90645, - "ĠPag": 42355, - "ĠPage": 5755, - "ĠPageInfo": 96293, - "ĠPageSize": 94832, - "ĠPager": 87308, - "ĠPages": 21772, - "ĠPagination": 44898, - "ĠPaginator": 93064, - "ĠPaging": 96038, - "ĠPai": 87514, - "ĠPaid": 54082, - "ĠPaige": 86411, - "ĠPain": 34467, - "ĠPaint": 17203, - "ĠPainter": 96764, - "ĠPainting": 54043, - "ĠPair": 25995, - "ĠPais": 81787, - "ĠPak": 13358, - "ĠPakistan": 16663, - "ĠPakistani": 44452, - "ĠPal": 10925, - "ĠPalace": 30296, - "ĠPaladin": 96500, - "ĠPale": 12349, - "ĠPaleo": 87407, - "ĠPalest": 13930, - "ĠPalestin": 16331, - "ĠPalestine": 40934, - "ĠPalestinian": 21841, - "ĠPalestinians": 33134, - "ĠPalette": 66409, - "ĠPalin": 77321, - "ĠPall": 71360, - "ĠPalm": 32478, - "ĠPalmer": 41116, - "ĠPalo": 84151, - "ĠPam": 43413, - "ĠPamela": 82143, - "ĠPan": 10990, - "ĠPanama": 48036, - "ĠPanasonic": 79642, - "ĠPanc": 96214, - "ĠPand": 33506, - "ĠPanda": 72410, - "ĠPandora": 71981, - "ĠPane": 98542, - "ĠPanel": 18946, - "ĠPanels": 80492, - "ĠPang": 99136, - "ĠPanic": 83740, - "ĠPant": 53122, - "ĠPanther": 58512, - "ĠPanthers": 44167, - "ĠPants": 66453, - "ĠPaolo": 83369, - "ĠPap": 31643, - "ĠPapa": 64573, - "ĠPaper": 17862, - "ĠPaperback": 69132, - "ĠPapers": 44131, - "ĠPapua": 89081, - "ĠPar": 4270, - "ĠPara": 22989, - "ĠParad": 39272, - "ĠParade": 62554, - "ĠParadise": 47591, - "ĠParagraph": 49351, - "ĠParallel": 49272, - "ĠParam": 6991, - "ĠParameter": 15168, - "ĠParameterDirection": 65927, - "ĠParameters": 13522, - "ĠParamount": 81810, - "ĠParams": 34352, - "ĠParan": 97284, - "ĠParas": 93037, - "ĠParcel": 42994, - "ĠParcelable": 82992, - "ĠPare": 74185, - "ĠParen": 45686, - "ĠParent": 17022, - "ĠParenthood": 49165, - "ĠParents": 42926, - "ĠParis": 12095, - "ĠParish": 59247, - "ĠPark": 5540, - "ĠParker": 28206, - "ĠParking": 40182, - "ĠParkinson": 61045, - "ĠParks": 38172, - "ĠParkway": 67153, - "ĠParl": 94887, - "ĠParliament": 19723, - "ĠParliamentary": 86315, - "ĠParm": 55644, - "ĠParr": 80530, - "ĠPars": 52711, - "ĠParse": 14775, - "ĠParseException": 61849, - "ĠParser": 21102, - "ĠParses": 73430, - "ĠParsing": 74789, - "ĠParsons": 77244, - "ĠPart": 3660, - "ĠPartial": 24552, - "ĠPartialEq": 55039, - "ĠPartialView": 90081, - "ĠParticip": 43481, - "ĠParticipant": 46376, - "ĠParticipants": 51778, - "ĠParticipation": 63403, - "ĠParticle": 35854, - "ĠParticularly": 96385, - "ĠParties": 59905, - "ĠPartition": 54626, - "ĠPartner": 31313, - "ĠPartners": 22817, - "ĠPartnership": 46262, - "ĠParts": 26303, - "ĠParty": 8554, - "ĠPas": 24010, - "ĠPasadena": 82450, - "ĠPascal": 57359, - "ĠPaso": 66329, - "ĠPass": 9970, - "ĠPassage": 98475, - "ĠPassed": 49120, - "ĠPassenger": 67634, - "ĠPassing": 76292, - "ĠPassion": 63788, - "ĠPassive": 71589, - "ĠPassport": 66800, - "ĠPassword": 12362, - "ĠPast": 23640, - "ĠPasta": 97346, - "ĠPaste": 57225, - "ĠPastor": 58666, - "ĠPat": 7135, - "ĠPatch": 30412, - "ĠPatel": 62755, - "ĠPatent": 57990, - "ĠPath": 7933, - "ĠPathfinder": 84181, - "ĠPaths": 55606, - "ĠPatient": 28924, - "ĠPatients": 43330, - "ĠPatio": 63986, - "ĠPatreon": 65112, - "ĠPatri": 22999, - "ĠPatricia": 53934, - "ĠPatrick": 19626, - "ĠPatriot": 66931, - "ĠPatriots": 32517, - "ĠPatrol": 44398, - "ĠPatron": 89400, - "ĠPatt": 44303, - "ĠPattern": 18834, - "ĠPatterns": 62723, - "ĠPatterson": 57634, - "ĠPatton": 95122, - "ĠPatty": 88245, - "ĠPaul": 6898, - "ĠPaula": 61153, - "ĠPaulo": 36926, - "ĠPause": 49656, - "ĠPav": 42756, - "ĠPavel": 78269, - "ĠPavilion": 74479, - "ĠPaw": 59971, - "ĠPawn": 82871, - "ĠPax": 70321, - "ĠPay": 11471, - "ĠPayPal": 35331, - "ĠPayload": 52916, - "ĠPayment": 20453, - "ĠPayments": 57876, - "ĠPayne": 68495, - "ĠPaypal": 68021, - "ĠPays": 93608, - "ĠPaz": 87882, - "ĠPaÃŃs": 141754, - "ĠPaÅĦst": 142009, - "ĠPaÅĦstwo": 142010, - "ĠPb": 97354, - "ĠPc": 88833, - "ĠPdf": 28150, - "ĠPdfP": 76516, - "ĠPdfPCell": 90562, - "ĠPe": 5139, - "ĠPeace": 25803, - "ĠPeach": 63595, - "ĠPeak": 43162, - "ĠPeaks": 88270, - "ĠPeanut": 92944, - "ĠPear": 23041, - "ĠPearce": 93056, - "ĠPearl": 36243, - "ĠPearson": 58542, - "ĠPeb": 88905, - "ĠPed": 19318, - "ĠPediatric": 94836, - "ĠPediatrics": 98771, - "ĠPedido": 97686, - "ĠPedro": 42482, - "ĠPee": 95308, - "ĠPeek": 96587, - "ĠPeel": 88594, - "ĠPeer": 45147, - "ĠPeg": 49666, - "ĠPeggy": 85552, - "ĠPel": 23663, - "ĠPell": 87908, - "ĠPelosi": 58980, - "ĠPemb": 68283, - "ĠPen": 13294, - "ĠPenal": 90658, - "ĠPenalty": 95242, - "ĠPence": 45960, - "ĠPend": 62400, - "ĠPendant": 80401, - "ĠPending": 41840, - "ĠPendingIntent": 71420, - "ĠPeng": 51050, - "ĠPenguin": 70144, - "ĠPenguins": 74844, - "ĠPeninsula": 49614, - "ĠPenis": 53318, - "ĠPenn": 13505, - "ĠPennsylvania": 19771, - "ĠPenny": 52915, - "ĠPens": 63380, - "ĠPension": 80457, - "ĠPent": 22633, - "ĠPentagon": 34536, - "ĠPeople": 8853, - "ĠPeoples": 80298, - "ĠPep": 52986, - "ĠPepper": 51782, - "ĠPepsi": 83078, - "ĠPer": 3616, - "ĠPerc": 51626, - "ĠPercent": 55348, - "ĠPercentage": 63241, - "ĠPerception": 85850, - "ĠPercy": 74686, - "ĠPere": 72478, - "ĠPerez": 49365, - "ĠPerf": 71448, - "ĠPerfect": 23239, - "ĠPerform": 25001, - "ĠPerformance": 20651, - "ĠPerforming": 69648, - "ĠPerforms": 57716, - "ĠPerhaps": 18765, - "ĠPeriod": 25492, - "ĠPeripheral": 83000, - "ĠPerkins": 64911, - "ĠPerl": 44432, - "ĠPerm": 90721, - "ĠPermanent": 56216, - "ĠPermission": 18135, - "ĠPermissions": 53357, - "ĠPermit": 80639, - "ĠPero": 55432, - "ĠPerr": 85748, - "ĠPerry": 30321, - "ĠPers": 20465, - "ĠPersian": 49861, - "ĠPersist": 93343, - "ĠPersistence": 64236, - "ĠPersistent": 66544, - "ĠPerson": 7357, - "ĠPersona": 53890, - "ĠPersonal": 19207, - "ĠPersonality": 64815, - "ĠPersonally": 62547, - "ĠPersonen": 87040, - "ĠPersonnel": 69977, - "ĠPersons": 61930, - "ĠPerspective": 69188, - "ĠPerspectives": 93885, - "ĠPert": 81784, - "ĠPerth": 49444, - "ĠPeru": 47747, - "ĠPes": 56856, - "ĠPessoa": 79576, - "ĠPest": 88145, - "ĠPet": 11333, - "ĠPete": 36273, - "ĠPeter": 11044, - "ĠPeters": 31184, - "ĠPetersburg": 53948, - "ĠPeterson": 39791, - "ĠPetit": 91817, - "ĠPetite": 86983, - "ĠPetr": 95776, - "ĠPetra": 83937, - "ĠPetro": 61479, - "ĠPetroleum": 71926, - "ĠPets": 35886, - "ĠPetsc": 52951, - "ĠPett": 82496, - "ĠPetty": 94698, - "ĠPew": 56617, - "ĠPey": 72880, - "ĠPeyton": 85456, - "ĠPf": 42068, - "ĠPfizer": 96854, - "ĠPg": 97265, - "ĠPh": 2350, - "ĠPhD": 29561, - "ĠPhantom": 46197, - "ĠPhar": 87571, - "ĠPharm": 24584, - "ĠPharma": 78781, - "ĠPharmac": 70781, - "ĠPharmaceutical": 58273, - "ĠPharmaceuticals": 90671, - "ĠPharmacy": 47075, - "ĠPhase": 27573, - "ĠPhaser": 63668, - "ĠPhelps": 97515, - "ĠPhen": 68783, - "ĠPhi": 63813, - "ĠPhil": 7155, - "ĠPhiladelphia": 19335, - "ĠPhilip": 25179, - "ĠPhilipp": 19945, - "ĠPhilippe": 66854, - "ĠPhilippine": 56181, - "ĠPhilippines": 25296, - "ĠPhilips": 73503, - "ĠPhill": 24517, - "ĠPhillies": 82986, - "ĠPhillip": 58709, - "ĠPhillips": 36414, - "ĠPhilly": 65154, - "ĠPhilosoph": 37256, - "ĠPhilosophy": 45869, - "ĠPhoenix": 22672, - "ĠPhon": 70324, - "ĠPhone": 14307, - "ĠPhoneNumber": 73674, - "ĠPhones": 84575, - "ĠPhonetic": 95734, - "ĠPhot": 17762, - "ĠPhoto": 10828, - "ĠPhotograph": 32155, - "ĠPhotographer": 74739, - "ĠPhotography": 40047, - "ĠPhoton": 62138, - "ĠPhotos": 16505, - "ĠPhotoshop": 44879, - "ĠPhp": 31134, - "ĠPhpStorm": 43881, - "ĠPhrase": 68000, - "ĠPhy": 92582, - "ĠPhys": 12809, - "ĠPhysical": 27379, - "ĠPhysician": 87198, - "ĠPhysicians": 87499, - "ĠPhysics": 27315, - "ĠPhysiology": 94846, - "ĠPháp": 132034, - "ĠPhát": 135322, - "ĠPhòng": 132850, - "ĠPhó": 133761, - "ĠPhú": 130751, - "ĠPhương": 132352, - "ĠPhạm": 136290, - "ĠPhần": 137572, - "ĠPháºŃt": 133319, - "ĠPhụ": 137265, - "ĠPi": 20636, - "ĠPiano": 55391, - "ĠPic": 25898, - "ĠPicasso": 66183, - "ĠPick": 19725, - "ĠPicker": 85383, - "ĠPicks": 65190, - "ĠPickup": 74460, - "ĠPics": 59835, - "ĠPicture": 24568, - "ĠPictureBox": 79649, - "ĠPictures": 28385, - "ĠPie": 39997, - "ĠPiece": 28930, - "ĠPieces": 67540, - "ĠPied": 83330, - "ĠPier": 20718, - "ĠPierce": 49830, - "ĠPierre": 36977, - "ĠPiet": 85188, - "ĠPig": 48554, - "ĠPik": 61162, - "ĠPikachu": 96919, - "ĠPike": 68729, - "ĠPil": 36351, - "ĠPill": 34136, - "ĠPillow": 80735, - "ĠPills": 47865, - "ĠPilot": 44499, - "ĠPin": 17471, - "ĠPine": 41509, - "ĠPing": 48657, - "ĠPink": 26119, - "ĠPins": 69250, - "ĠPinterest": 25051, - "ĠPioneer": 65350, - "ĠPip": 77382, - "ĠPipe": 27805, - "ĠPipeline": 40907, - "ĠPiper": 69807, - "ĠPipes": 78723, - "ĠPir": 38493, - "ĠPirate": 61148, - "ĠPirates": 52405, - "ĠPis": 90942, - "ĠPist": 44496, - "ĠPistol": 83814, - "ĠPistons": 94708, - "ĠPit": 38979, - "ĠPitch": 45576, - "ĠPitt": 21139, - "ĠPittsburgh": 27527, - "ĠPivot": 97893, - "ĠPix": 49466, - "ĠPixar": 99123, - "ĠPixel": 27469, - "ĠPixels": 85446, - "ĠPizza": 34818, - "ĠPl": 1818, - "ĠPlace": 10771, - "ĠPlaceholder": 86721, - "ĠPlacement": 77416, - "ĠPlaces": 44736, - "ĠPlain": 43199, - "ĠPlains": 62811, - "ĠPlaint": 56311, - "ĠPlaintiff": 77282, - "ĠPlan": 9680, - "ĠPlane": 43044, - "ĠPlanet": 28835, - "ĠPlanned": 46140, - "ĠPlanner": 74765, - "ĠPlanning": 27680, - "ĠPlans": 34595, - "ĠPlant": 17838, - "ĠPlants": 49198, - "ĠPlasma": 64532, - "ĠPlastic": 36008, - "ĠPlat": 86642, - "ĠPlate": 30303, - "ĠPlates": 79293, - "ĠPlatform": 17458, - "ĠPlatforms": 95109, - "ĠPlatinum": 43992, - "ĠPlato": 68061, - "ĠPlatt": 94678, - "ĠPlatz": 72055, - "ĠPlay": 7054, - "ĠPlayStation": 31265, - "ĠPlayback": 95301, - "ĠPlayboy": 89979, - "ĠPlayed": 74006, - "ĠPlayer": 7312, - "ĠPlayerPrefs": 59283, - "ĠPlayers": 24618, - "ĠPlayground": 88592, - "ĠPlaying": 39451, - "ĠPlaylist": 54269, - "ĠPlayoff": 94113, - "ĠPlays": 76165, - "ĠPlaystation": 92767, - "ĠPlaza": 40307, - "ĠPle": 32440, - "ĠPleasant": 63812, - "ĠPlease": 5209, - "ĠPlenty": 68389, - "ĠPlex": 95732, - "ĠPlot": 26033, - "ĠPlug": 52809, - "ĠPlugin": 21245, - "ĠPlugins": 62498, - "ĠPlum": 83309, - "ĠPlumbing": 92600, - "ĠPlus": 12343, - "ĠPluto": 77581, - "ĠPly": 53170, - "ĠPlymouth": 70998, - "ĠPo": 13808, - "ĠPocket": 45724, - "ĠPod": 16821, - "ĠPodcast": 29769, - "ĠPodesta": 87128, - "ĠPods": 52232, - "ĠPodsDummy": 70290, - "ĠPoe": 81595, - "ĠPoetry": 67687, - "ĠPoint": 5126, - "ĠPointF": 71174, - "ĠPointer": 21635, - "ĠPoints": 20725, - "ĠPoison": 51112, - "ĠPok": 22364, - "ĠPoke": 97626, - "ĠPokemon": 27731, - "ĠPoker": 37568, - "ĠPokémon": 26621, - "ĠPol": 3651, - "ĠPoland": 27602, - "ĠPolar": 55896, - "ĠPole": 52627, - "ĠPolic": 98112, - "ĠPolice": 10082, - "ĠPolicies": 62248, - "ĠPolicy": 10974, - "ĠPolish": 31984, - "ĠPolit": 15928, - "ĠPolitical": 30497, - "ĠPolitico": 70733, - "ĠPolitics": 34879, - "ĠPoll": 24385, - "ĠPollution": 95101, - "ĠPolly": 93417, - "ĠPolo": 72771, - "ĠPols": 57719, - "ĠPoly": 18767, - "ĠPolyester": 74849, - "ĠPolygon": 48159, - "ĠPolymer": 96670, - "ĠPolynomial": 75153, - "ĠPolÃŃcia": 142252, - "ĠPolÃŃtica": 139366, - "ĠPom": 38312, - "ĠPompe": 61411, - "ĠPompeo": 89634, - "ĠPon": 65315, - "ĠPond": 70865, - "ĠPont": 39770, - "ĠPony": 68035, - "ĠPool": 22728, - "ĠPoor": 44673, - "ĠPop": 10254, - "ĠPope": 29360, - "ĠPopular": 31395, - "ĠPopulate": 70938, - "ĠPopulation": 39529, - "ĠPopup": 46190, - "ĠPor": 19801, - "ĠPork": 83934, - "ĠPorn": 16472, - "ĠPornhub": 76907, - "ĠPorno": 20687, - "ĠPorsche": 50021, - "ĠPort": 5776, - "ĠPortable": 41485, - "ĠPortal": 33731, - "ĠPorter": 37937, - "ĠPortfolio": 46192, - "ĠPortions": 77797, - "ĠPortland": 23077, - "ĠPorto": 69698, - "ĠPortrait": 78582, - "ĠPorts": 69866, - "ĠPortsmouth": 86570, - "ĠPortug": 22234, - "ĠPortugal": 33311, - "ĠPortuguese": 42188, - "ĠPos": 18876, - "ĠPose": 50373, - "ĠPosition": 12380, - "ĠPositioned": 89981, - "ĠPositions": 75383, - "ĠPositive": 43903, - "ĠPoss": 41045, - "ĠPossible": 36107, - "ĠPossibly": 79191, - "ĠPost": 3877, - "ĠPostal": 54217, - "ĠPosted": 15275, - "ĠPoster": 62386, - "ĠPostgreSQL": 73601, - "ĠPosting": 78673, - "ĠPosts": 15419, - "ĠPosté": 136530, - "ĠPot": 13706, - "ĠPotato": 77603, - "ĠPotential": 53957, - "ĠPotion": 74841, - "ĠPotter": 29327, - "ĠPou": 89023, - "ĠPound": 78252, - "ĠPour": 25968, - "ĠPoverty": 69174, - "ĠPow": 23605, - "ĠPowder": 43656, - "ĠPowell": 43009, - "ĠPower": 7420, - "ĠPowerPoint": 53500, - "ĠPowerShell": 73962, - "ĠPowered": 59620, - "ĠPowerful": 74358, - "ĠPowers": 45037, - "ĠPoz": 78985, - "ĠPr": 2340, - "ĠPra": 40365, - "ĠPract": 17891, - "ĠPractical": 65636, - "ĠPractice": 26984, - "ĠPractices": 63713, - "ĠPradesh": 42358, - "ĠPrague": 67289, - "ĠPrairie": 70949, - "ĠPratt": 73987, - "ĠPrayer": 54960, - "ĠPre": 4968, - "ĠPrec": 41670, - "ĠPrecision": 51359, - "ĠPreconditions": 85916, - "ĠPred": 29824, - "ĠPredator": 87187, - "ĠPredicate": 49827, - "ĠPredict": 32710, - "ĠPrediction": 61865, - "ĠPredictor": 60418, - "ĠPref": 42588, - "ĠPrefer": 84468, - "ĠPreference": 48805, - "ĠPreferences": 47870, - "ĠPreferred": 62503, - "ĠPrefix": 56483, - "ĠPregn": 59647, - "ĠPregnancy": 82527, - "ĠPreis": 60939, - "ĠPrel": 40088, - "ĠPrelude": 52562, - "ĠPrem": 11767, - "ĠPremier": 19637, - "ĠPremiere": 68824, - "ĠPremiership": 96888, - "ĠPremium": 25661, - "ĠPrep": 48069, - "ĠPreparation": 73335, - "ĠPrepare": 31166, - "ĠPrepared": 87167, - "ĠPreparedStatement": 42058, - "ĠPres": 4111, - "ĠPresbyterian": 85364, - "ĠPrescott": 90779, - "ĠPrescription": 76075, - "ĠPresence": 78623, - "ĠPresent": 26642, - "ĠPresentation": 50868, - "ĠPresented": 87021, - "ĠPresenter": 96223, - "ĠPresents": 82736, - "ĠPreservation": 90941, - "ĠPreserve": 81306, - "ĠPresidency": 86648, - "ĠPresident": 4795, - "ĠPresidential": 41755, - "ĠPresidents": 78639, - "ĠPress": 8445, - "ĠPressure": 38990, - "ĠPrest": 34902, - "ĠPreston": 62225, - "ĠPret": 61939, - "ĠPretty": 35316, - "ĠPrev": 59001, - "ĠPrevent": 38068, - "ĠPrevention": 35847, - "ĠPreview": 31241, - "ĠPrevious": 28913, - "ĠPreviously": 58687, - "ĠPri": 27785, - "ĠPrice": 8483, - "ĠPrices": 36033, - "ĠPricing": 59326, - "ĠPride": 42146, - "ĠPriest": 48903, - "ĠPrim": 35183, - "ĠPrimary": 25094, - "ĠPrime": 12518, - "ĠPrimer": 87025, - "ĠPrimitive": 51460, - "ĠPrince": 19351, - "ĠPrincess": 29289, - "ĠPrinceton": 49321, - "ĠPrincip": 44529, - "ĠPrincipal": 36309, - "ĠPrinciple": 80986, - "ĠPrinciples": 56914, - "ĠPrint": 8213, - "ĠPrintWriter": 48011, - "ĠPrintable": 64753, - "ĠPrinted": 69965, - "ĠPrinter": 45933, - "ĠPrintf": 90908, - "ĠPrinting": 50769, - "ĠPrints": 49285, - "ĠPrior": 31399, - "ĠPriority": 31920, - "ĠPriorityQueue": 84102, - "ĠPrism": 71931, - "ĠPrison": 41518, - "ĠPriv": 15438, - "ĠPrivacy": 18874, - "ĠPrivate": 9679, - "ĠPrix": 43294, - "ĠPrize": 31193, - "ĠPro": 1298, - "ĠProb": 25627, - "ĠProbability": 86639, - "ĠProbably": 37154, - "ĠProbe": 77278, - "ĠProble": 74890, - "ĠProblem": 22079, - "ĠProblems": 44535, - "ĠProc": 41087, - "ĠProcedure": 44446, - "ĠProcedures": 74011, - "ĠProceed": 40770, - "ĠProceedings": 54127, - "ĠProcess": 8603, - "ĠProcesses": 62303, - "ĠProcessing": 28125, - "ĠProcessor": 43377, - "ĠProd": 71272, - "ĠProdu": 12042, - "ĠProduce": 86888, - "ĠProduced": 87265, - "ĠProducer": 43359, - "ĠProduct": 5643, - "ĠProductService": 93198, - "ĠProduction": 24039, - "ĠProductions": 51864, - "ĠProducto": 63864, - "ĠProducts": 15530, - "ĠProduk": 83600, - "ĠProdukt": 69342, - "ĠProdukte": 87479, - "ĠProduto": 67254, - "ĠProf": 8459, - "ĠProfession": 49211, - "ĠProfessional": 21237, - "ĠProfessionals": 70402, - "ĠProfessor": 16642, - "ĠProfile": 12329, - "ĠProfiles": 71727, - "ĠProfit": 57782, - "ĠProgram": 6687, - "ĠProgramm": 73910, - "ĠProgramme": 46416, - "ĠProgrammer": 88024, - "ĠProgramming": 38424, - "ĠPrograms": 37616, - "ĠProgress": 16033, - "ĠProgressBar": 62044, - "ĠProgressDialog": 61831, - "ĠProgressive": 51770, - "ĠProj": 42952, - "ĠProject": 5787, - "ĠProjectile": 83602, - "ĠProjection": 69315, - "ĠProjects": 31223, - "ĠProjekt": 77742, - "ĠProm": 17582, - "ĠPrometheus": 97137, - "ĠPromise": 7303, - "ĠPromo": 57403, - "ĠPromotion": 56104, - "ĠPrompt": 59501, - "ĠPron": 86915, - "ĠProof": 36991, - "ĠProp": 3911, - "ĠPropTypes": 9602, - "ĠPropel": 43859, - "ĠPropelException": 85293, - "ĠProper": 64558, - "ĠProperties": 11831, - "ĠProperty": 8655, - "ĠPropertyChanged": 43189, - "ĠPropertyChangedEventArgs": 92116, - "ĠPropertyInfo": 94423, - "ĠPropertyValue": 94338, - "ĠProphet": 36628, - "ĠProposal": 65890, - "ĠProposed": 98883, - "ĠProposition": 86755, - "ĠProps": 29306, - "ĠPros": 31034, - "ĠProsec": 51170, - "ĠProsecutor": 87328, - "ĠProspect": 77815, - "ĠProsper": 88713, - "ĠProstit": 52817, - "ĠProstitutas": 98226, - "ĠProt": 11708, - "ĠProte": 15187, - "ĠProtect": 33663, - "ĠProtected": 36995, - "ĠProtection": 19171, - "ĠProtective": 71142, - "ĠProtector": 81119, - "ĠProtein": 48375, - "ĠProtest": 36659, - "ĠProtestant": 59653, - "ĠProto": 57677, - "ĠProtocol": 24572, - "ĠPrototype": 76033, - "ĠProud": 83249, - "ĠProv": 58329, - "ĠProvid": 20516, - "ĠProvide": 39565, - "ĠProvided": 53874, - "ĠProvidence": 57841, - "ĠProvider": 22916, - "ĠProviders": 69929, - "ĠProvides": 36617, - "ĠProviding": 80100, - "ĠProvince": 37794, - "ĠProvincial": 79695, - "ĠProvision": 71573, - "ĠProxy": 32778, - "ĠProzent": 78233, - "ĠPru": 73308, - "ĠPruitt": 77806, - "ĠPry": 73414, - "ĠPrä": 138971, - "ĠPré": 134282, - "ĠPs": 11802, - "ĠPsalm": 81876, - "ĠPsi": 53451, - "ĠPsr": 89422, - "ĠPsy": 40018, - "ĠPsych": 17235, - "ĠPsychiat": 60664, - "ĠPsychiatry": 68144, - "ĠPsychic": 92875, - "ĠPsycho": 69176, - "ĠPsychological": 68969, - "ĠPsychology": 35573, - "ĠPt": 51070, - "ĠPtr": 46409, - "ĠPty": 78992, - "ĠPu": 22199, - "ĠPub": 22611, - "ĠPubMed": 52668, - "ĠPubli": 138190, - "ĠPublic": 3066, - "ĠPublicKey": 70280, - "ĠPublication": 56894, - "ĠPublications": 61670, - "ĠPublish": 23499, - "ĠPublished": 29014, - "ĠPublisher": 39133, - "ĠPublishers": 71614, - "ĠPublishing": 36833, - "ĠPublié": 138191, - "ĠPuerto": 30219, - "ĠPul": 34862, - "ĠPulitzer": 95715, - "ĠPull": 31828, - "ĠPulse": 49249, - "ĠPump": 33726, - "ĠPumpkin": 75257, - "ĠPun": 30436, - "ĠPunch": 53175, - "ĠPune": 75238, - "ĠPunjab": 59317, - "ĠPunk": 51333, - "ĠPuppet": 73880, - "ĠPuppy": 95533, - "ĠPur": 14532, - "ĠPurch": 52692, - "ĠPurchase": 30988, - "ĠPurdue": 72234, - "ĠPure": 29588, - "ĠPureComponent": 89088, - "ĠPurple": 40389, - "ĠPurpose": 29045, - "ĠPurs": 70660, - "ĠPush": 22950, - "ĠPussy": 46845, - "ĠPut": 10224, - "ĠPutin": 21126, - "ĠPutting": 77890, - "ĠPuzzle": 60012, - "ĠPv": 50339, - "ĠPvP": 65852, - "ĠPvt": 60675, - "ĠPx": 95493, - "ĠPy": 5355, - "ĠPyErr": 75667, - "ĠPyObject": 15891, - "ĠPyQt": 48677, - "ĠPyTuple": 80824, - "ĠPyongyang": 60059, - "ĠPyramid": 82395, - "ĠPython": 13027, - "ĠPÃ¥": 93025, - "ĠPé": 79867, - "ĠPúb": 140039, - "ĠPública": 140006, - "ĠPúblico": 140040, - "ĠQ": 1207, - "ĠQA": 65908, - "ĠQAction": 55062, - "ĠQApplication": 62449, - "ĠQB": 36570, - "ĠQByteArray": 49399, - "ĠQC": 42607, - "ĠQCOMPARE": 59145, - "ĠQColor": 55758, - "ĠQDateTime": 98724, - "ĠQDialog": 69077, - "ĠQDir": 83842, - "ĠQDom": 98523, - "ĠQE": 99016, - "ĠQFile": 78970, - "ĠQFont": 97600, - "ĠQGraphics": 78303, - "ĠQHBoxLayout": 81291, - "ĠQIcon": 94401, - "ĠQImage": 77427, - "ĠQLD": 92567, - "ĠQLabel": 43458, - "ĠQLatin": 74800, - "ĠQLineEdit": 78649, - "ĠQList": 37251, - "ĠQMainWindow": 92922, - "ĠQMap": 98261, - "ĠQMessageBox": 41218, - "ĠQModelIndex": 48599, - "ĠQName": 76381, - "ĠQObject": 35050, - "ĠQPainter": 97337, - "ĠQPixmap": 80430, - "ĠQPoint": 47743, - "ĠQPointF": 76385, - "ĠQPushButton": 52522, - "ĠQQ": 73115, - "ĠQR": 38699, - "ĠQRect": 65049, - "ĠQS": 77746, - "ĠQSize": 86257, - "ĠQSql": 74988, - "ĠQString": 7879, - "ĠQStringList": 42862, - "ĠQStringLiteral": 70697, - "ĠQT": 47305, - "ĠQTableWidgetItem": 90483, - "ĠQTest": 93656, - "ĠQText": 65818, - "ĠQTimer": 96669, - "ĠQU": 25999, - "ĠQUAL": 70275, - "ĠQUE": 29676, - "ĠQUERY": 67135, - "ĠQUEST": 56728, - "ĠQUESTION": 89922, - "ĠQUEUE": 97239, - "ĠQUI": 88530, - "ĠQUICK": 93012, - "ĠQVBoxLayout": 75155, - "ĠQVERIFY": 66034, - "ĠQVariant": 40066, - "ĠQVector": 54255, - "ĠQWidget": 36278, - "ĠQaeda": 53018, - "ĠQatar": 41918, - "ĠQed": 60588, - "ĠQgs": 61008, - "ĠQi": 56994, - "ĠQin": 73351, - "ĠQing": 61912, - "ĠQt": 10594, - "ĠQtAws": 92805, - "ĠQtCore": 53347, - "ĠQtGui": 39640, - "ĠQtWidgets": 32536, - "ĠQty": 76557, - "ĠQu": 3406, - "ĠQuad": 38018, - "ĠQuadr": 63948, - "ĠQual": 19572, - "ĠQualcomm": 61402, - "ĠQualified": 60306, - "ĠQuality": 17927, - "ĠQualität": 98060, - "ĠQuando": 91666, - "ĠQuant": 31441, - "ĠQuantity": 33523, - "ĠQuantum": 55313, - "ĠQuar": 92745, - "ĠQuarry": 71083, - "ĠQuart": 69084, - "ĠQuarter": 34394, - "ĠQuarterly": 74383, - "ĠQuartz": 65088, - "ĠQuaternion": 24801, - "ĠQue": 9418, - "ĠQuebec": 34095, - "ĠQueen": 16259, - "ĠQueens": 27063, - "ĠQueensland": 40206, - "ĠQuentin": 90051, - "ĠQueries": 85873, - "ĠQuery": 11361, - "ĠQuest": 15053, - "ĠQuestion": 15846, - "ĠQuestions": 23382, - "ĠQueue": 18745, - "ĠQui": 41115, - "ĠQuick": 17251, - "ĠQuickly": 96817, - "ĠQuiet": 67487, - "ĠQuincy": 97398, - "ĠQuinn": 40523, - "ĠQuint": 50699, - "ĠQuit": 53552, - "ĠQuite": 57695, - "ĠQuiz": 41148, - "ĠQuote": 24535, - "ĠQuotes": 35613, - "ĠQur": 67111, - "ĠQuran": 65660, - "ĠQuân": 137833, - "ĠQué": 65603, - "ĠQuébec": 79188, - "ĠQuý": 135595, - "ĠQuản": 140428, - "ĠQuảng": 133314, - "ĠQuáºŃn": 135642, - "ĠQuá»ijc": 128494, - "ĠR": 431, - "ĠRA": 28456, - "ĠRAD": 74150, - "ĠRADIO": 82160, - "ĠRAF": 71052, - "ĠRAID": 77632, - "ĠRAM": 22038, - "ĠRAND": 72854, - "ĠRANDOM": 82711, - "ĠRANGE": 86506, - "ĠRAT": 97880, - "ĠRATE": 92470, - "ĠRAW": 52851, - "ĠRB": 27974, - "ĠRBI": 52941, - "ĠRC": 21594, - "ĠRCA": 98331, - "ĠRCC": 31917, - "ĠRCMP": 74624, - "ĠRCS": 79156, - "ĠRD": 37992, - "ĠRDD": 77255, - "ĠRDF": 68399, - "ĠRE": 3596, - "ĠREAD": 18666, - "ĠREADME": 61945, - "ĠREADY": 85332, - "ĠREAL": 25272, - "ĠREALLY": 65700, - "ĠREC": 74136, - "ĠRECE": 42285, - "ĠRECEIVE": 88875, - "ĠRECEIVER": 76176, - "ĠRECORD": 55993, - "ĠRECT": 75803, - "ĠRED": 25810, - "ĠREF": 38029, - "ĠREFER": 68685, - "ĠREFERENCES": 78656, - "ĠREG": 13676, - "ĠREGARD": 96567, - "ĠREGION": 64160, - "ĠREGISTER": 52637, - "ĠREL": 31512, - "ĠRELATED": 84347, - "ĠRELEASE": 53034, - "ĠREM": 25587, - "ĠREMOVE": 48783, - "ĠRENDER": 91788, - "ĠREP": 49260, - "ĠREPL": 92580, - "ĠREPLACE": 84371, - "ĠREPORT": 44076, - "ĠREPRESENT": 97122, - "ĠREQ": 78696, - "ĠREQUEST": 33416, - "ĠREQUIRE": 27972, - "ĠREQUIRED": 66577, - "ĠRES": 13170, - "ĠRESERVED": 77739, - "ĠRESET": 53215, - "ĠRESOURCE": 76065, - "ĠRESP": 45477, - "ĠRESPONS": 88979, - "ĠRESPONSE": 76173, - "ĠREST": 25414, - "ĠRESULT": 28536, - "ĠRESULTS": 53028, - "ĠRET": 18496, - "ĠRETURN": 30880, - "ĠRETURNS": 68039, - "ĠREUTERS": 51791, - "ĠREV": 65823, - "ĠREVIEW": 80051, - "ĠRF": 22060, - "ĠRFC": 39233, - "ĠRFID": 85879, - "ĠRG": 50388, - "ĠRGB": 20978, - "ĠRGBA": 79954, - "ĠRH": 56156, - "ĠRHS": 73832, - "ĠRI": 47497, - "ĠRID": 27326, - "ĠRIGHT": 27477, - "ĠRIGHTS": 77436, - "ĠRIP": 90864, - "ĠRJ": 76304, - "ĠRK": 67137, - "ĠRL": 47496, - "ĠRM": 30815, - "ĠRMS": 77178, - "ĠRN": 45816, - "ĠRNA": 40114, - "ĠRNG": 72606, - "ĠRO": 11813, - "ĠROAD": 82193, - "ĠROC": 97826, - "ĠROCK": 78520, - "ĠROI": 50652, - "ĠROLE": 69676, - "ĠROM": 30686, - "ĠROOM": 57948, - "ĠROOT": 35736, - "ĠROS": 37417, - "ĠROT": 58211, - "ĠROUND": 76138, - "ĠROUT": 53181, - "ĠROW": 45715, - "ĠRP": 41461, - "ĠRPC": 34008, - "ĠRPG": 33502, - "ĠRPM": 53774, - "ĠRR": 43398, - "ĠRS": 23229, - "ĠRSA": 45641, - "ĠRSS": 29274, - "ĠRSVP": 81889, - "ĠRT": 10635, - "ĠRTAL": 76160, - "ĠRTBU": 93707, - "ĠRTC": 35047, - "ĠRTE": 81855, - "ĠRTL": 63735, - "ĠRTP": 85627, - "ĠRTS": 84948, - "ĠRTVF": 87578, - "ĠRTWF": 62685, - "ĠRU": 68825, - "ĠRULE": 43797, - "ĠRUN": 30760, - "ĠRUNNING": 97677, - "ĠRV": 32470, - "ĠRVA": 44596, - "ĠRW": 46206, - "ĠRX": 28170, - "ĠRa": 18482, - "ĠRab": 35724, - "ĠRabbi": 70869, - "ĠRabbit": 48331, - "ĠRac": 55706, - "ĠRace": 23659, - "ĠRaces": 97100, - "ĠRach": 83385, - "ĠRachel": 31432, - "ĠRacing": 32282, - "ĠRack": 50039, - "ĠRad": 20605, - "ĠRadar": 67786, - "ĠRadeon": 37429, - "ĠRadi": 34869, - "ĠRadiation": 89226, - "ĠRadical": 87881, - "ĠRadio": 13484, - "ĠRadioButton": 64511, - "ĠRadius": 40453, - "ĠRae": 89499, - "ĠRaf": 39577, - "ĠRafael": 54400, - "ĠRag": 50259, - "ĠRage": 65467, - "ĠRagnar": 94262, - "ĠRah": 32248, - "ĠRahman": 97276, - "ĠRahmen": 89507, - "ĠRahul": 85136, - "ĠRai": 86434, - "ĠRaid": 32700, - "ĠRaider": 80354, - "ĠRaiders": 42036, - "ĠRail": 23786, - "ĠRailroad": 69017, - "ĠRails": 36405, - "ĠRailway": 54456, - "ĠRain": 21911, - "ĠRainbow": 46645, - "ĠRaise": 42546, - "ĠRaisePropertyChanged": 89330, - "ĠRaised": 53731, - "ĠRaisedButton": 79701, - "ĠRaises": 60311, - "ĠRaj": 25225, - "ĠRajasthan": 86340, - "ĠRak": 68792, - "ĠRaleigh": 64083, - "ĠRally": 58700, - "ĠRalph": 39804, - "ĠRam": 15152, - "ĠRamadan": 81808, - "ĠRamirez": 70993, - "ĠRamos": 68813, - "ĠRamp": 74570, - "ĠRams": 37503, - "ĠRamsey": 64546, - "ĠRan": 38331, - "ĠRanch": 41882, - "ĠRand": 23963, - "ĠRandall": 67344, - "ĠRandolph": 85752, - "ĠRandom": 10612, - "ĠRandomForest": 90714, - "ĠRandy": 45215, - "ĠRange": 16437, - "ĠRanger": 48322, - "ĠRangers": 33187, - "ĠRank": 19298, - "ĠRanked": 96948, - "ĠRanking": 64075, - "ĠRankings": 82799, - "ĠRao": 87900, - "ĠRap": 22300, - "ĠRape": 52605, - "ĠRaphael": 89886, - "ĠRapid": 46990, - "ĠRapids": 54186, - "ĠRaptors": 73578, - "ĠRaq": 96409, - "ĠRaqqa": 97860, - "ĠRare": 34959, - "ĠRarity": 65724, - "ĠRas": 58030, - "ĠRash": 59383, - "ĠRaspberry": 47565, - "ĠRat": 40577, - "ĠRate": 19775, - "ĠRated": 37460, - "ĠRates": 46976, - "ĠRath": 85455, - "ĠRather": 25764, - "ĠRating": 19216, - "ĠRatings": 56965, - "ĠRatio": 50748, - "ĠRational": 54525, - "ĠRaum": 95602, - "ĠRav": 33974, - "ĠRaven": 45107, - "ĠRavens": 47480, - "ĠRaw": 23022, - "ĠRay": 13255, - "ĠRaycastHit": 95869, - "ĠRaymond": 42570, - "ĠRays": 79675, - "ĠRaz": 76819, - "ĠRazor": 73868, - "ĠRc": 81463, - "ĠRd": 27467, - "ĠRe": 1032, - "ĠReSharper": 52155, - "ĠReach": 49842, - "ĠReached": 57325, - "ĠReact": 3592, - "ĠReactDOM": 39117, - "ĠReaction": 66841, - "ĠReactive": 39822, - "ĠReactiveFormsModule": 52671, - "ĠRead": 4457, - "ĠReadOnly": 43406, - "ĠReader": 25166, - "ĠReaders": 64414, - "ĠReading": 17769, - "ĠReadonly": 93359, - "ĠReads": 43721, - "ĠReady": 30982, - "ĠReagan": 34126, - "ĠReal": 8800, - "ĠReality": 43774, - "ĠReally": 28208, - "ĠRealm": 41106, - "ĠRealt": 87872, - "ĠRealty": 68014, - "ĠReaper": 83422, - "ĠRear": 45902, - "ĠReason": 26759, - "ĠReasons": 65031, - "ĠReb": 51643, - "ĠRebecca": 44457, - "ĠRebel": 63164, - "ĠRebellion": 93979, - "ĠRebels": 89335, - "ĠRec": 4067, - "ĠRecall": 79540, - "ĠRecap": 98034, - "ĠRece": 60296, - "ĠReceipt": 72896, - "ĠReceive": 37422, - "ĠReceived": 38417, - "ĠReceiver": 50952, - "ĠRecent": 34290, - "ĠRecently": 40996, - "ĠReception": 75951, - "ĠRecipe": 25303, - "ĠRecipes": 44202, - "ĠReco": 31462, - "ĠRecogn": 66875, - "ĠRecognition": 47598, - "ĠRecognitionException": 79316, - "ĠRecomm": 29801, - "ĠRecommend": 46606, - "ĠRecommendation": 96531, - "ĠRecommendations": 88420, - "ĠRecommended": 50662, - "ĠRecon": 82981, - "ĠReconstruction": 94694, - "ĠRecord": 13583, - "ĠRecorded": 96364, - "ĠRecorder": 85519, - "ĠRecording": 60547, - "ĠRecords": 21566, - "ĠRecover": 76112, - "ĠRecovery": 33911, - "ĠRecreation": 56757, - "ĠRecru": 82640, - "ĠRecruitment": 56444, - "ĠRect": 11920, - "ĠRectTransform": 96697, - "ĠRectangle": 19280, - "ĠRecursive": 85896, - "ĠRecyclerView": 22562, - "ĠRecycling": 80585, - "ĠRed": 3731, - "ĠReddit": 26630, - "ĠRede": 72131, - "ĠRedemption": 88641, - "ĠRedirect": 16029, - "ĠRedirectTo": 26641, - "ĠRedirectToAction": 28177, - "ĠRedis": 34158, - "ĠRedistribution": 31943, - "ĠRedistributions": 19605, - "ĠReds": 54808, - "ĠRedskins": 59278, - "ĠReduce": 52153, - "ĠReduced": 79469, - "ĠReduction": 58100, - "ĠRedux": 68011, - "ĠRee": 56821, - "ĠReed": 35421, - "ĠReef": 75936, - "ĠReese": 81539, - "ĠReeves": 81752, - "ĠRef": 8550, - "ĠRefer": 28634, - "ĠReference": 17207, - "ĠReferences": 44078, - "ĠReferentialAction": 58770, - "ĠReflect": 34598, - "ĠReflection": 42876, - "ĠReflex": 93393, - "ĠReform": 39265, - "ĠRefresh": 29007, - "ĠRefriger": 74158, - "ĠRefuge": 51119, - "ĠRefugee": 97072, - "ĠReg": 3184, - "ĠRegExp": 28487, - "ĠRegarding": 72673, - "ĠRegardless": 43740, - "ĠRegards": 91079, - "ĠRegel": 97504, - "ĠRegents": 77677, - "ĠRegex": 26146, - "ĠRegexOptions": 84598, - "ĠReggie": 88882, - "ĠRegiment": 72686, - "ĠRegina": 69680, - "ĠRegion": 17152, - "ĠRegional": 25294, - "ĠRegions": 77347, - "ĠRegister": 8451, - "ĠRegistered": 35539, - "ĠRegisters": 54774, - "ĠRegistr": 74559, - "ĠRegistrar": 80226, - "ĠRegistration": 24516, - "ĠRegistro": 83637, - "ĠRegistry": 32112, - "ĠRegression": 47470, - "ĠRegular": 28800, - "ĠRegulation": 47238, - "ĠRegulations": 48257, - "ĠRegulatory": 68722, - "ĠRehab": 60379, - "ĠRehabilitation": 80218, - "ĠRei": 83141, - "ĠReich": 50559, - "ĠReid": 37674, - "ĠReign": 80871, - "ĠRein": 46069, - "ĠReject": 87293, - "ĠRel": 6512, - "ĠRelated": 24369, - "ĠRelation": 50024, - "ĠRelations": 31367, - "ĠRelationship": 32807, - "ĠRelationships": 68568, - "ĠRelative": 39402, - "ĠRelativeLayout": 69228, - "ĠRelatives": 75477, - "ĠRelax": 67585, - "ĠRelay": 46172, - "ĠRelayCommand": 76843, - "ĠRelease": 17381, - "ĠReleased": 44794, - "ĠReleases": 61015, - "ĠRelevant": 87416, - "ĠReliable": 91563, - "ĠRelief": 52395, - "ĠReligion": 43093, - "ĠReligious": 52076, - "ĠReload": 56341, - "ĠRem": 4926, - "ĠRemain": 91592, - "ĠRemaining": 89630, - "ĠRemark": 82733, - "ĠRemarks": 84582, - "ĠRemed": 96870, - "ĠRemember": 19881, - "ĠReminder": 95902, - "ĠRemix": 50027, - "ĠRemote": 20738, - "ĠRemoteException": 60209, - "ĠRemoval": 56717, - "ĠRemove": 10783, - "ĠRemoved": 51083, - "ĠRemoves": 38775, - "ĠRemoving": 66703, - "ĠRen": 13775, - "ĠRena": 48794, - "ĠRenaissance": 54283, - "ĠRename": 63708, - "ĠRenault": 66331, - "ĠRencontre": 44585, - "ĠRencontres": 93373, - "ĠRender": 13848, - "ĠRenderer": 41367, - "ĠRendering": 64637, - "ĠRenders": 93733, - "ĠRene": 66427, - "ĠRenew": 48986, - "ĠRenewable": 92338, - "ĠReno": 63418, - "ĠRent": 29737, - "ĠRental": 39198, - "ĠRentals": 83117, - "ĠRep": 3321, - "ĠRepair": 27167, - "ĠRepeat": 44801, - "ĠReplace": 29558, - "ĠReplacement": 46212, - "ĠReplay": 59061, - "ĠReplica": 94036, - "ĠReplies": 63339, - "ĠReply": 17841, - "ĠRepo": 71509, - "ĠReport": 8259, - "ĠReported": 78611, - "ĠReporter": 46981, - "ĠReporting": 46693, - "ĠReports": 28040, - "ĠRepos": 24286, - "ĠRepository": 26377, - "ĠRepresent": 21950, - "ĠRepresentation": 78046, - "ĠRepresentative": 37266, - "ĠRepresentatives": 39745, - "ĠRepresents": 38893, - "ĠRepublic": 5429, - "ĠRepublican": 9356, - "ĠRepublicans": 12773, - "ĠReputation": 88080, - "ĠRepública": 136962, - "ĠReq": 82458, - "ĠRequest": 6145, - "ĠRequestContext": 90057, - "ĠRequestMethod": 29557, - "ĠRequestOptions": 82349, - "ĠRequests": 50882, - "ĠRequire": 24046, - "ĠRequired": 12659, - "ĠRequirement": 75938, - "ĠRequirements": 33784, - "ĠRequires": 44089, - "ĠRes": 1800, - "ĠRescue": 44403, - "ĠResearch": 8319, - "ĠResearchers": 58150, - "ĠReservation": 53312, - "ĠReserve": 24785, - "ĠReserved": 15163, - "ĠReset": 16932, - "ĠResets": 96997, - "ĠResidence": 71760, - "ĠResident": 59676, - "ĠResidential": 54455, - "ĠResidents": 63248, - "ĠResist": 78868, - "ĠResistance": 39880, - "ĠResize": 63343, - "ĠResolution": 37116, - "ĠResolve": 47302, - "ĠResolver": 81854, - "ĠResort": 33837, - "ĠResorts": 85271, - "ĠResource": 11765, - "ĠResourceBundle": 95361, - "ĠResourceManager": 87269, - "ĠResourceType": 97801, - "ĠResources": 16209, - "ĠResp": 79786, - "ĠRespect": 77038, - "ĠRespir": 76834, - "ĠRespond": 39533, - "ĠRespons": 32071, - "ĠResponse": 5949, - "ĠResponseEntity": 19803, - "ĠResponses": 80467, - "ĠResponsibilities": 73012, - "ĠResponsibility": 77612, - "ĠResponsible": 67628, - "ĠResponsive": 70465, - "ĠRest": 9063, - "ĠRestClient": 96536, - "ĠRestart": 56801, - "ĠRestaurant": 25488, - "ĠRestaurants": 58093, - "ĠRestoration": 66825, - "ĠRestore": 43820, - "ĠRestr": 41327, - "ĠRestricted": 93860, - "ĠRestrictions": 91975, - "ĠResult": 5714, - "ĠResultSet": 33582, - "ĠResults": 18099, - "ĠResume": 33398, - "ĠRet": 10392, - "ĠRetail": 34039, - "ĠRetirement": 69189, - "ĠRetorna": 94111, - "ĠRetreat": 87394, - "ĠRetrie": 19470, - "ĠRetrieve": 31562, - "ĠRetrieved": 57791, - "ĠRetrieves": 48661, - "ĠRetro": 36526, - "ĠRetrofit": 57398, - "ĠRetry": 78870, - "ĠReturn": 3411, - "ĠReturnType": 88156, - "ĠReturnValue": 96584, - "ĠReturned": 75264, - "ĠReturning": 73247, - "ĠReturns": 5184, - "ĠReuters": 22841, - "ĠRev": 10107, - "ĠReve": 66553, - "ĠRevel": 54743, - "ĠRevelation": 75507, - "ĠRevenge": 80549, - "ĠRevenue": 37393, - "ĠRever": 82179, - "ĠReverse": 24277, - "ĠReview": 10294, - "ĠReviewed": 77751, - "ĠReviews": 19276, - "ĠRevised": 66730, - "ĠRevision": 26795, - "ĠRevolution": 22126, - "ĠRevolutionary": 66579, - "ĠRew": 31691, - "ĠReward": 55800, - "ĠRewards": 49768, - "ĠRewrite": 93213, - "ĠRex": 41807, - "ĠRey": 48212, - "ĠReyes": 76159, - "ĠReyn": 39083, - "ĠReynolds": 45072, - "ĠRh": 17968, - "ĠRhe": 70536, - "ĠRhino": 79465, - "ĠRhode": 49881, - "ĠRhodes": 56611, - "ĠRi": 51730, - "ĠRib": 63105, - "ĠRibbon": 76467, - "ĠRic": 32552, - "ĠRica": 51949, - "ĠRican": 95664, - "ĠRicardo": 65950, - "ĠRice": 29516, - "ĠRich": 8107, - "ĠRichard": 11867, - "ĠRichards": 52972, - "ĠRichardson": 45723, - "ĠRichie": 98974, - "ĠRichmond": 34248, - "ĠRicht": 57123, - "ĠRick": 22388, - "ĠRicky": 65793, - "ĠRico": 33148, - "ĠRid": 44895, - "ĠRide": 40913, - "ĠRider": 53842, - "ĠRiders": 86070, - "ĠRidge": 34205, - "ĠRiding": 76319, - "ĠRidley": 92301, - "ĠRif": 89731, - "ĠRifle": 47038, - "ĠRift": 56327, - "ĠRig": 51532, - "ĠRight": 10083, - "ĠRights": 10512, - "ĠRigidbody": 64608, - "ĠRihanna": 95427, - "ĠRiley": 46835, - "ĠRim": 51379, - "ĠRin": 57368, - "ĠRing": 21525, - "ĠRings": 46280, - "ĠRio": 26961, - "ĠRiot": 64706, - "ĠRip": 35437, - "ĠRipple": 69707, - "ĠRis": 53363, - "ĠRise": 42677, - "ĠRising": 48887, - "ĠRisk": 31288, - "ĠRit": 70122, - "ĠRita": 70968, - "ĠRitch": 96882, - "ĠRitual": 87788, - "ĠRiv": 50668, - "ĠRiver": 10948, - "ĠRivera": 63110, - "ĠRivers": 35639, - "ĠRiverside": 62841, - "ĠRiy": 78790, - "ĠRiyadh": 89790, - "ĠRo": 11830, - "ĠRoad": 9536, - "ĠRoads": 79253, - "ĠRob": 4892, - "ĠRobbie": 73132, - "ĠRobbins": 87215, - "ĠRobert": 8397, - "ĠRoberto": 54083, - "ĠRoberts": 30148, - "ĠRobertson": 52496, - "ĠRobin": 17143, - "ĠRobinson": 27181, - "ĠRobot": 25860, - "ĠRobotics": 76464, - "ĠRobots": 96046, - "ĠRoc": 90826, - "ĠRoch": 35869, - "ĠRochester": 52368, - "ĠRock": 9127, - "ĠRockefeller": 84638, - "ĠRocket": 39218, - "ĠRockets": 60900, - "ĠRockies": 79051, - "ĠRocks": 68031, - "ĠRocky": 47541, - "ĠRod": 13308, - "ĠRodgers": 49017, - "ĠRodney": 74943, - "ĠRodr": 56725, - "ĠRodrig": 36385, - "ĠRodrigo": 77768, - "ĠRodriguez": 40632, - "ĠRoe": 78452, - "ĠRog": 15259, - "ĠRoger": 28507, - "ĠRogers": 33367, - "ĠRogue": 49784, - "ĠRoh": 40987, - "ĠRohing": 91160, - "ĠRohingya": 96751, - "ĠRoku": 95992, - "ĠRol": 30976, - "ĠRoland": 57806, - "ĠRole": 15404, - "ĠRoles": 50907, - "ĠRolex": 96532, - "ĠRoll": 14686, - "ĠRolled": 93391, - "ĠRoller": 44542, - "ĠRolling": 44948, - "ĠRolls": 69610, - "ĠRom": 11774, - "ĠRoma": 45501, - "ĠRoman": 12751, - "ĠRomance": 51156, - "ĠRomania": 46049, - "ĠRomanian": 73597, - "ĠRomans": 48717, - "ĠRomantic": 75730, - "ĠRome": 21718, - "ĠRomeo": 70192, - "ĠRomero": 77387, - "ĠRomney": 25318, - "ĠRon": 14325, - "ĠRonald": 38648, - "ĠRonaldo": 64415, - "ĠRonnie": 83705, - "ĠRoo": 66714, - "ĠRoof": 46349, - "ĠRookie": 82125, - "ĠRoom": 10420, - "ĠRooms": 47303, - "ĠRooney": 79630, - "ĠRoose": 44318, - "ĠRoosevelt": 45942, - "ĠRoot": 18854, - "ĠRootState": 97312, - "ĠRoots": 74587, - "ĠRope": 97896, - "ĠRory": 82321, - "ĠRos": 16465, - "ĠRosa": 46830, - "ĠRose": 15964, - "ĠRosen": 34020, - "ĠRosenberg": 96607, - "ĠRosenstein": 90018, - "ĠRoses": 80370, - "ĠRosie": 96767, - "ĠRoss": 20482, - "ĠRossi": 76069, - "ĠRot": 27360, - "ĠRotary": 74856, - "ĠRotate": 49720, - "ĠRotation": 47528, - "ĠRoth": 36412, - "ĠRoths": 95915, - "ĠRotterdam": 97777, - "ĠRou": 28522, - "ĠRouge": 55647, - "ĠRough": 57321, - "ĠRoulette": 79504, - "ĠRound": 17097, - "ĠRounded": 57450, - "ĠRoundedRectangle": 77715, - "ĠRoundedRectangleBorder": 82957, - "ĠRounds": 97823, - "ĠRousse": 97889, - "ĠRout": 92022, - "ĠRoute": 9572, - "ĠRouteServiceProvider": 85702, - "ĠRoutedEventArgs": 31066, - "ĠRouter": 10554, - "ĠRouterModule": 34787, - "ĠRoutes": 22356, - "ĠRoutine": 71062, - "ĠRouting": 65707, - "ĠRover": 52176, - "ĠRow": 10801, - "ĠRowe": 94840, - "ĠRowling": 95507, - "ĠRows": 61706, - "ĠRox": 71423, - "ĠRoy": 11038, - "ĠRoyal": 16194, - "ĠRoyale": 86199, - "ĠRoyals": 69531, - "ĠRoz": 90480, - "ĠRp": 68108, - "ĠRpc": 79961, - "ĠRs": 19215, - "ĠRt": 75483, - "ĠRu": 27914, - "ĠRub": 12839, - "ĠRubber": 52306, - "ĠRubin": 81926, - "ĠRubio": 43914, - "ĠRuby": 23726, - "ĠRud": 47438, - "ĠRudd": 85363, - "ĠRudy": 79119, - "ĠRue": 78051, - "ĠRuf": 98157, - "ĠRug": 36350, - "ĠRugby": 50902, - "ĠRuiz": 89883, - "ĠRule": 18100, - "ĠRules": 22847, - "ĠRum": 45232, - "ĠRun": 6452, - "ĠRune": 70778, - "ĠRunnable": 22109, - "ĠRunner": 44946, - "ĠRunning": 28025, - "ĠRuns": 49990, - "ĠRuntime": 10954, - "ĠRuntimeError": 44543, - "ĠRuntimeException": 21247, - "ĠRuntimeMethod": 38778, - "ĠRuntimeObject": 53659, - "ĠRupert": 86169, - "ĠRural": 57220, - "ĠRus": 40976, - "ĠRush": 34075, - "ĠRuss": 4507, - "ĠRussell": 24909, - "ĠRussia": 8359, - "ĠRussian": 8522, - "ĠRussians": 33966, - "ĠRusso": 92891, - "ĠRust": 33789, - "ĠRut": 47121, - "ĠRutgers": 70991, - "ĠRuth": 41793, - "ĠRw": 55294, - "ĠRwanda": 78104, - "ĠRx": 35376, - "ĠRy": 25691, - "ĠRyan": 13646, - "ĠRyder": 88023, - "ĠRyu": 98231, - "ĠRyzen": 92736, - "ĠRé": 50123, - "ĠRück": 75074, - "ĠS": 328, - "ĠSA": 16589, - "ĠSAC": 89933, - "ĠSAF": 84104, - "ĠSAFE": 65869, - "ĠSAL": 53109, - "ĠSALE": 63880, - "ĠSAM": 46587, - "ĠSAME": 83490, - "ĠSAMPLE": 62420, - "ĠSAN": 59700, - "ĠSAND": 97241, - "ĠSAP": 36221, - "ĠSAR": 68778, - "ĠSAS": 50726, - "ĠSAT": 42254, - "ĠSATA": 72178, - "ĠSAVE": 50622, - "ĠSAX": 74226, - "ĠSAY": 84629, - "ĠSB": 25247, - "ĠSC": 7531, - "ĠSCALE": 78123, - "ĠSCAN": 98315, - "ĠSCC": 79299, - "ĠSCE": 93081, - "ĠSCH": 74838, - "ĠSCHOOL": 70401, - "ĠSCI": 80463, - "ĠSCIP": 82250, - "ĠSCM": 68548, - "ĠSCN": 92525, - "ĠSCO": 63134, - "ĠSCORE": 69254, - "ĠSCP": 48523, - "ĠSCR": 76700, - "ĠSCREEN": 35073, - "ĠSCRIPT": 53679, - "ĠSCSI": 81626, - "ĠSCT": 94285, - "ĠSD": 8030, - "ĠSDK": 26623, - "ĠSDL": 14653, - "ĠSDLK": 61906, - "ĠSDS": 95612, - "ĠSE": 5052, - "ĠSEA": 77811, - "ĠSEAL": 87579, - "ĠSEARCH": 49766, - "ĠSEC": 21638, - "ĠSECOND": 68695, - "ĠSECRET": 69956, - "ĠSECTION": 42333, - "ĠSECURITY": 70610, - "ĠSEE": 26103, - "ĠSEEK": 46240, - "ĠSEG": 65022, - "ĠSEL": 40838, - "ĠSELECT": 19094, - "ĠSELF": 66225, - "ĠSEM": 45444, - "ĠSEN": 84807, - "ĠSEND": 55663, - "ĠSENSOR": 67282, - "ĠSENT": 95751, - "ĠSEO": 24980, - "ĠSEP": 73769, - "ĠSEQ": 71408, - "ĠSER": 13984, - "ĠSERIAL": 70718, - "ĠSERIES": 95844, - "ĠSERVER": 39664, - "ĠSERVICE": 38086, - "ĠSERVICES": 25633, - "ĠSES": 91750, - "ĠSESSION": 65342, - "ĠSET": 9019, - "ĠSETTINGS": 73991, - "ĠSETUP": 90857, - "ĠSEX": 73487, - "ĠSEXP": 86040, - "ĠSF": 23463, - "ĠSG": 29626, - "ĠSGD": 93983, - "ĠSH": 6434, - "ĠSHA": 21721, - "ĠSHALL": 16681, - "ĠSHARE": 53670, - "ĠSHARES": 90794, - "ĠSHE": 53595, - "ĠSHIFT": 82503, - "ĠSHIPPING": 87318, - "ĠSHOP": 75795, - "ĠSHORT": 64924, - "ĠSHOULD": 60875, - "ĠSHOW": 38481, - "ĠSHR": 77048, - "ĠSI": 30548, - "ĠSID": 56021, - "ĠSIDE": 79324, - "ĠSIG": 25038, - "ĠSIGN": 43172, - "ĠSIGNAL": 24502, - "ĠSIL": 59723, - "ĠSIM": 22889, - "ĠSIMD": 66631, - "ĠSIMPLE": 91484, - "ĠSIN": 70002, - "ĠSINGLE": 66759, - "ĠSIP": 65441, - "ĠSITE": 54671, - "ĠSIX": 97638, - "ĠSIZE": 25341, - "ĠSJ": 68223, - "ĠSK": 12072, - "ĠSKF": 70207, - "ĠSKIP": 81404, - "ĠSKU": 77986, - "ĠSL": 16797, - "ĠSLOT": 25485, - "ĠSM": 13716, - "ĠSMA": 95896, - "ĠSMALL": 49197, - "ĠSMART": 79608, - "ĠSMB": 63658, - "ĠSME": 78767, - "ĠSMP": 92800, - "ĠSMS": 29909, - "ĠSMTP": 51819, - "ĠSN": 17924, - "ĠSNAP": 92533, - "ĠSND": 83536, - "ĠSNMP": 88133, - "ĠSNP": 59318, - "ĠSO": 5627, - "ĠSOAP": 63232, - "ĠSOC": 37650, - "ĠSOCIAL": 97080, - "ĠSOCK": 34551, - "ĠSOCKET": 68978, - "ĠSOFTWARE": 8562, - "ĠSOL": 35923, - "ĠSOLD": 83151, - "ĠSOLUTION": 97897, - "ĠSOM": 73290, - "ĠSOME": 65555, - "ĠSON": 76412, - "ĠSOP": 86507, - "ĠSORT": 57376, - "ĠSOS": 81203, - "ĠSOUND": 84273, - "ĠSOUR": 48763, - "ĠSOURCE": 53331, - "ĠSOUTH": 79615, - "ĠSP": 9256, - "ĠSPA": 76408, - "ĠSPACE": 52060, - "ĠSPD": 62724, - "ĠSPDX": 35486, - "ĠSPE": 67735, - "ĠSPEC": 47104, - "ĠSPECIAL": 23027, - "ĠSPEED": 73843, - "ĠSPELL": 47844, - "ĠSPF": 86748, - "ĠSPI": 20429, - "ĠSPL": 64700, - "ĠSPORT": 72495, - "ĠSPR": 51267, - "ĠSQ": 51618, - "ĠSQL": 7870, - "ĠSQLAlchemy": 84729, - "ĠSQLException": 24393, - "ĠSQLITE": 55252, - "ĠSQLite": 28334, - "ĠSQLiteDatabase": 62436, - "ĠSQUARE": 92282, - "ĠSR": 20880, - "ĠSRC": 49510, - "ĠSS": 18180, - "ĠSSA": 93853, - "ĠSSC": 97365, - "ĠSSD": 36362, - "ĠSSE": 73473, - "ĠSSH": 40463, - "ĠSSL": 25316, - "ĠSSP": 84989, - "ĠSSR": 95304, - "ĠSST": 91416, - "ĠST": 3928, - "ĠSTA": 88672, - "ĠSTACK": 69967, - "ĠSTANDARD": 76357, - "ĠSTAR": 56745, - "ĠSTART": 20998, - "ĠSTAT": 24981, - "ĠSTATE": 22425, - "ĠSTATES": 72900, - "ĠSTATIC": 63549, - "ĠSTATS": 75982, - "ĠSTATUS": 24014, - "ĠSTD": 29859, - "ĠSTDCALL": 69500, - "ĠSTDERR": 68637, - "ĠSTDMETHOD": 39765, - "ĠSTDMETHODCALLTYPE": 50125, - "ĠSTDOUT": 87907, - "ĠSTE": 26499, - "ĠSTEM": 63082, - "ĠSTEP": 48356, - "ĠSTILL": 92250, - "ĠSTL": 69849, - "ĠSTM": 47173, - "ĠSTOCK": 82651, - "ĠSTOP": 45537, - "ĠSTORAGE": 90484, - "ĠSTORE": 53771, - "ĠSTORY": 82840, - "ĠSTR": 12152, - "ĠSTREAM": 69811, - "ĠSTREET": 84561, - "ĠSTRICT": 29010, - "ĠSTRING": 35255, - "ĠSTRUCT": 59578, - "ĠSTUD": 57516, - "ĠSTYLE": 62947, - "ĠSU": 15490, - "ĠSUB": 16140, - "ĠSUBJECT": 95880, - "ĠSUBSTITUTE": 30530, - "ĠSUCCESS": 33941, - "ĠSUCH": 26094, - "ĠSUM": 30735, - "ĠSUMMARY": 95785, - "ĠSUN": 56228, - "ĠSUP": 53622, - "ĠSUPER": 54802, - "ĠSUPPORT": 50736, - "ĠSUR": 51983, - "ĠSUS": 89029, - "ĠSUV": 38673, - "ĠSV": 17481, - "ĠSVC": 88212, - "ĠSVG": 39800, - "ĠSVM": 90009, - "ĠSVN": 75714, - "ĠSW": 13387, - "ĠSWAT": 97054, - "ĠSWITCH": 72543, - "ĠSWT": 46700, - "ĠSX": 54768, - "ĠSY": 16079, - "ĠSYMBOL": 74538, - "ĠSYN": 61694, - "ĠSYNC": 86677, - "ĠSYS": 32560, - "ĠSYSTEM": 34752, - "ĠSZ": 69244, - "ĠSa": 15854, - "ĠSab": 20603, - "ĠSabb": 69246, - "ĠSabbath": 80176, - "ĠSabha": 86464, - "ĠSac": 23047, - "ĠSach": 37337, - "ĠSachs": 59927, - "ĠSacr": 97839, - "ĠSacramento": 40234, - "ĠSacred": 60018, - "ĠSad": 30681, - "ĠSadd": 57683, - "ĠSaddam": 66347, - "ĠSadly": 56143, - "ĠSaf": 12582, - "ĠSafari": 28761, - "ĠSafe": 22291, - "ĠSafety": 18702, - "ĠSag": 54261, - "ĠSaga": 61712, - "ĠSage": 53284, - "ĠSah": 41959, - "ĠSahara": 87978, - "ĠSai": 70741, - "ĠSaid": 50124, - "ĠSail": 56995, - "ĠSailor": 97902, - "ĠSaint": 14205, - "ĠSaints": 32219, - "ĠSak": 38767, - "ĠSakura": 78307, - "ĠSal": 8211, - "ĠSala": 79048, - "ĠSalad": 63546, - "ĠSalah": 87385, - "ĠSalary": 41758, - "ĠSale": 13315, - "ĠSalem": 59381, - "ĠSales": 15829, - "ĠSalesforce": 80935, - "ĠSalisbury": 91955, - "ĠSally": 52291, - "ĠSalman": 68643, - "ĠSalmon": 61726, - "ĠSalon": 55173, - "ĠSalt": 27040, - "ĠSalv": 30966, - "ĠSalvador": 48359, - "ĠSalvation": 85685, - "ĠSam": 8224, - "ĠSamantha": 62808, - "ĠSamar": 85256, - "ĠSame": 25739, - "ĠSammy": 90029, - "ĠSamoa": 87020, - "ĠSamp": 90174, - "ĠSample": 19143, - "ĠSampler": 98604, - "ĠSamples": 58350, - "ĠSampling": 95309, - "ĠSamsung": 18400, - "ĠSamuel": 31907, - "ĠSamurai": 88018, - "ĠSan": 5836, - "ĠSanchez": 47154, - "ĠSanct": 58002, - "ĠSanctuary": 74233, - "ĠSand": 8677, - "ĠSandbox": 96860, - "ĠSanders": 16859, - "ĠSandra": 55686, - "ĠSands": 78170, - "ĠSandwich": 66736, - "ĠSandy": 38385, - "ĠSanford": 94041, - "ĠSang": 50922, - "ĠSanity": 96302, - "ĠSans": 14747, - "ĠSant": 22896, - "ĠSanta": 15993, - "ĠSantana": 91695, - "ĠSantiago": 54578, - "ĠSanto": 76637, - "ĠSantos": 47623, - "ĠSao": 89872, - "ĠSap": 80175, - "ĠSapphire": 81999, - "ĠSar": 13637, - "ĠSara": 42920, - "ĠSarah": 20445, - "ĠSaras": 94814, - "ĠSark": 78645, - "ĠSas": 61089, - "ĠSasha": 82178, - "ĠSask": 48646, - "ĠSaskatchewan": 65153, - "ĠSass": 84862, - "ĠSat": 13177, - "ĠSatan": 43351, - "ĠSatellite": 60557, - "ĠSatisfaction": 93857, - "ĠSatoshi": 92152, - "ĠSaturday": 7728, - "ĠSaturdays": 75214, - "ĠSaturn": 49153, - "ĠSau": 41016, - "ĠSauce": 60176, - "ĠSaud": 63568, - "ĠSaudi": 17904, - "ĠSaudis": 87835, - "ĠSaul": 67524, - "ĠSaunders": 77217, - "ĠSav": 20079, - "ĠSavage": 52936, - "ĠSavannah": 72076, - "ĠSave": 10255, - "ĠSaved": 49162, - "ĠSaves": 65567, - "ĠSaving": 48438, - "ĠSavings": 57679, - "ĠSavior": 75946, - "ĠSaw": 37007, - "ĠSawyer": 91119, - "ĠSax": 66927, - "ĠSay": 24917, - "ĠSaying": 95998, - "ĠSays": 46459, - "ĠSaúde": 136360, - "ĠSaÄŁ": 136373, - "ĠSaÄŁlık": 136374, - "ĠSc": 2463, - "ĠScaffold": 34267, - "ĠScal": 68834, - "ĠScala": 65250, - "ĠScalar": 35176, - "ĠScalars": 80537, - "ĠScale": 24613, - "ĠScalia": 93649, - "ĠScaling": 88001, - "ĠScan": 31108, - "ĠScandin": 59180, - "ĠScandinavian": 84574, - "ĠScanner": 17170, - "ĠScar": 29660, - "ĠScarborough": 85432, - "ĠScarlet": 80718, - "ĠScarlett": 95472, - "ĠScatter": 94359, - "ĠScenario": 58663, - "ĠScene": 17494, - "ĠSceneManager": 53592, - "ĠScenes": 83183, - "ĠSch": 5016, - "ĠScha": 91718, - "ĠSche": 53672, - "ĠSchedule": 23512, - "ĠScheduled": 77096, - "ĠScheduler": 44759, - "ĠSchema": 12539, - "ĠScheme": 43781, - "ĠSchiff": 87583, - "ĠSchl": 49279, - "ĠSchmidt": 51065, - "ĠSchn": 60074, - "ĠSchneider": 53787, - "ĠScho": 56184, - "ĠScholar": 24525, - "ĠScholars": 98294, - "ĠScholarship": 57884, - "ĠSchool": 6022, - "ĠSchools": 30383, - "ĠSchro": 94582, - "ĠSchul": 52990, - "ĠSchultz": 66805, - "ĠSchumer": 64671, - "ĠSchw": 29505, - "ĠSchwar": 65764, - "ĠSchwartz": 64785, - "ĠSchwarz": 86028, - "ĠSchwe": 55734, - "ĠSchön": 139349, - "ĠSchüler": 137845, - "ĠSci": 40372, - "ĠScience": 9965, - "ĠSciences": 22393, - "ĠScient": 20649, - "ĠScientific": 37030, - "ĠScientist": 67309, - "ĠScientists": 56016, - "ĠScientology": 69985, - "ĠSco": 49059, - "ĠScope": 34920, - "ĠScoped": 98687, - "ĠScor": 79335, - "ĠScore": 18115, - "ĠScores": 69994, - "ĠScot": 15468, - "ĠScotch": 91950, - "ĠScotia": 62866, - "ĠScotland": 19085, - "ĠScots": 74267, - "ĠScott": 9815, - "ĠScottish": 26096, - "ĠScout": 47535, - "ĠScouts": 69307, - "ĠScr": 32134, - "ĠScrap": 79085, - "ĠScratch": 79974, - "ĠScre": 81698, - "ĠScreen": 13948, - "ĠScreening": 69089, - "ĠScreens": 68681, - "ĠScrew": 72175, - "ĠScri": 75680, - "ĠScript": 13710, - "ĠScripts": 63621, - "ĠScripture": 53150, - "ĠScriptures": 89196, - "ĠScroll": 22392, - "ĠScrollView": 68540, - "ĠScrolls": 78229, - "ĠSculpt": 82697, - "ĠSe": 1345, - "ĠSea": 15029, - "ĠSeah": 42169, - "ĠSeahawks": 44926, - "ĠSeal": 52525, - "ĠSeam": 77966, - "ĠSeamless": 96962, - "ĠSean": 24995, - "ĠSearch": 7542, - "ĠSearchResult": 96597, - "ĠSearches": 81169, - "ĠSearching": 79893, - "ĠSears": 73234, - "ĠSeas": 92396, - "ĠSeason": 14263, - "ĠSeasons": 67200, - "ĠSeat": 39223, - "ĠSeats": 74435, - "ĠSeattle": 16355, - "ĠSebast": 93713, - "ĠSebastian": 43509, - "ĠSec": 4520, - "ĠSecond": 10440, - "ĠSecondary": 43534, - "ĠSecondly": 71031, - "ĠSeconds": 60983, - "ĠSecret": 8599, - "ĠSecretary": 12386, - "ĠSecrets": 52079, - "ĠSect": 94766, - "ĠSection": 11113, - "ĠSections": 59037, - "ĠSector": 40724, - "ĠSecure": 34502, - "ĠSecurities": 45172, - "ĠSecurity": 8234, - "ĠSed": 35278, - "ĠSee": 3496, - "ĠSeed": 35822, - "ĠSeeder": 70738, - "ĠSeeds": 72989, - "ĠSeeing": 55024, - "ĠSeek": 29739, - "ĠSeeking": 58705, - "ĠSeems": 63957, - "ĠSeen": 73512, - "ĠSeg": 17209, - "ĠSega": 79849, - "ĠSegment": 37103, - "ĠSegún": 139015, - "ĠSeit": 96520, - "ĠSeite": 47404, - "ĠSeiten": 82276, - "ĠSek": 49241, - "ĠSeks": 76394, - "ĠSel": 23204, - "ĠSelbst": 91452, - "ĠSele": 94093, - "ĠSelect": 8427, - "ĠSelectList": 52902, - "ĠSelectListItem": 95883, - "ĠSelected": 29302, - "ĠSelection": 24145, - "ĠSelector": 49610, - "ĠSelenium": 85717, - "ĠSelf": 10115, - "ĠSell": 42063, - "ĠSeller": 48232, - "ĠSellers": 81088, - "ĠSelling": 53720, - "ĠSem": 14248, - "ĠSemantic": 74333, - "ĠSemaphore": 87920, - "ĠSemester": 86848, - "ĠSemi": 54638, - "ĠSemiconductor": 78434, - "ĠSeminar": 82182, - "ĠSen": 5363, - "ĠSenate": 9891, - "ĠSenator": 22276, - "ĠSenators": 53718, - "ĠSend": 11000, - "ĠSendMessage": 62292, - "ĠSender": 54610, - "ĠSending": 57646, - "ĠSends": 64402, - "ĠSenior": 19342, - "ĠSens": 31152, - "ĠSense": 46229, - "ĠSensor": 30045, - "ĠSensors": 94420, - "ĠSent": 23361, - "ĠSentence": 79542, - "ĠSentinel": 56793, - "ĠSentry": 94060, - "ĠSeoul": 50189, - "ĠSep": 17449, - "ĠSepar": 33099, - "ĠSeparate": 76140, - "ĠSeparator": 78289, - "ĠSept": 5375, - "ĠSeptember": 6122, - "ĠSeq": 23744, - "ĠSequ": 24811, - "ĠSequelize": 32040, - "ĠSequence": 28871, - "ĠSequential": 59009, - "ĠSer": 8245, - "ĠSerbia": 58714, - "ĠSerbian": 87164, - "ĠSerena": 90990, - "ĠSerg": 54247, - "ĠSerge": 31922, - "ĠSergeant": 64544, - "ĠSergei": 83998, - "ĠSergey": 73429, - "ĠSergio": 65194, - "ĠSerial": 11215, - "ĠSerializable": 24859, - "ĠSerialization": 72034, - "ĠSerialize": 39900, - "ĠSerialized": 91472, - "ĠSerializer": 58822, - "ĠSerie": 56740, - "ĠSeries": 11131, - "ĠSerif": 20003, - "ĠSerious": 73496, - "ĠSeriously": 56506, - "ĠSerum": 93491, - "ĠServ": 26224, - "ĠServe": 52932, - "ĠServer": 8422, - "ĠServers": 71797, - "ĠService": 5362, - "ĠServiceException": 72107, - "ĠServiceProvider": 87617, - "ĠServices": 8307, - "ĠServing": 71643, - "ĠServlet": 23124, - "ĠServletException": 30091, - "ĠSes": 62927, - "ĠSession": 9164, - "ĠSessions": 30800, - "ĠSesso": 53547, - "ĠSet": 2573, - "ĠSetLastError": 99002, - "ĠSetProperty": 87046, - "ĠSetUp": 92101, - "ĠSetValue": 61293, - "ĠSeth": 44218, - "ĠSets": 12525, - "ĠSetter": 69264, - "ĠSetting": 20037, - "ĠSettings": 11296, - "ĠSettlement": 69048, - "ĠSetup": 18626, - "ĠSeven": 29948, - "ĠSevent": 77218, - "ĠSeventh": 74625, - "ĠSever": 58216, - "ĠSeveral": 25694, - "ĠSeverity": 51139, - "ĠSevilla": 94894, - "ĠSew": 49213, - "ĠSex": 6695, - "ĠSexe": 45492, - "ĠSexo": 56814, - "ĠSext": 66949, - "ĠSexual": 38667, - "ĠSexy": 28279, - "ĠSey": 57880, - "ĠSeymour": 93511, - "ĠSgt": 55660, - "ĠSh": 1417, - "ĠSha": 27970, - "ĠShack": 85423, - "ĠShade": 79818, - "ĠShader": 34788, - "ĠShades": 80147, - "ĠShadow": 24298, - "ĠShadows": 66449, - "ĠShaft": 95759, - "ĠShah": 36517, - "ĠShak": 86565, - "ĠShake": 72323, - "ĠShakespeare": 41382, - "ĠShall": 85461, - "ĠSham": 72091, - "ĠShaman": 91961, - "ĠShame": 87535, - "ĠShan": 59767, - "ĠShane": 49975, - "ĠShanghai": 37047, - "ĠShank": 82810, - "ĠShannon": 53663, - "ĠShape": 22526, - "ĠShapes": 61531, - "ĠShapiro": 79731, - "ĠShar": 35116, - "ĠShard": 95366, - "ĠShare": 11775, - "ĠSharePoint": 76146, - "ĠShared": 16990, - "ĠSharedModule": 83639, - "ĠSharedPreferences": 35084, - "ĠShares": 44185, - "ĠSharia": 89995, - "ĠSharing": 56035, - "ĠShark": 60436, - "ĠSharks": 70823, - "ĠSharma": 60015, - "ĠSharon": 51852, - "ĠSharp": 39261, - "ĠShaun": 76271, - "ĠShaw": 35185, - "ĠShawn": 55537, - "ĠShay": 73884, - "ĠShe": 2932, - "ĠShea": 84968, - "ĠShed": 94452, - "ĠSheep": 82908, - "ĠSheet": 27741, - "ĠSheets": 60472, - "ĠSheffield": 60025, - "ĠSheikh": 71529, - "ĠSheila": 94075, - "ĠShel": 36840, - "ĠShelby": 69408, - "ĠSheldon": 77610, - "ĠShelf": 70346, - "ĠShell": 29402, - "ĠShelley": 90509, - "ĠShelter": 74821, - "ĠShemale": 73447, - "ĠShen": 57780, - "ĠShepard": 71819, - "ĠShepherd": 58546, - "ĠSher": 17092, - "ĠSheridan": 94123, - "ĠSheriff": 28683, - "ĠSherlock": 60626, - "ĠSherman": 51883, - "ĠShi": 40704, - "ĠShia": 77409, - "ĠShib": 95337, - "ĠShield": 29743, - "ĠShields": 74797, - "ĠShift": 26510, - "ĠShiite": 93506, - "ĠShim": 53485, - "ĠShin": 34449, - "ĠShine": 86155, - "ĠShip": 26803, - "ĠShipping": 23954, - "ĠShips": 73532, - "ĠShir": 49256, - "ĠShirley": 75237, - "ĠShirt": 54707, - "ĠShiv": 89813, - "ĠSho": 62940, - "ĠShock": 46983, - "ĠShoe": 67081, - "ĠShoes": 38629, - "ĠShoot": 49266, - "ĠShooter": 98307, - "ĠShooting": 60781, - "ĠShop": 14028, - "ĠShopify": 95025, - "ĠShopping": 28964, - "ĠShoppingCart": 90907, - "ĠShops": 74544, - "ĠShore": 44719, - "ĠShort": 10698, - "ĠShortcut": 95465, - "ĠShortly": 66487, - "ĠShorts": 90682, - "ĠShot": 32347, - "ĠShotgun": 97107, - "ĠShots": 91032, - "ĠShould": 12260, - "ĠShoulder": 79772, - "ĠShow": 6928, - "ĠShowcase": 87063, - "ĠShower": 47371, - "ĠShowing": 70930, - "ĠShows": 36280, - "ĠShr": 94738, - "ĠShrine": 93474, - "ĠShuffle": 88925, - "ĠShut": 48274, - "ĠShutdown": 65379, - "ĠShutterstock": 84042, - "ĠShuttle": 77687, - "ĠSi": 11832, - "ĠSiber": 67500, - "ĠSic": 55854, - "ĠSicher": 74303, - "ĠSick": 81311, - "ĠSid": 33889, - "ĠSidd": 84713, - "ĠSide": 16659, - "ĠSidebar": 38700, - "ĠSidney": 75896, - "ĠSie": 8495, - "ĠSiege": 86990, - "ĠSiemens": 90224, - "ĠSierra": 35803, - "ĠSig": 41560, - "ĠSight": 65337, - "ĠSigma": 49537, - "ĠSign": 7075, - "ĠSignIn": 55189, - "ĠSignUp": 57077, - "ĠSignal": 27230, - "ĠSignals": 82499, - "ĠSignature": 32232, - "ĠSigned": 52453, - "ĠSignificant": 89362, - "ĠSigning": 87424, - "ĠSigns": 58024, - "ĠSignup": 54726, - "ĠSik": 77349, - "ĠSikh": 82562, - "ĠSil": 8051, - "ĠSilence": 68088, - "ĠSilent": 59455, - "ĠSilicon": 37150, - "ĠSilicone": 98800, - "ĠSilk": 51036, - "ĠSilva": 41041, - "ĠSilver": 14997, - "ĠSim": 4467, - "ĠSimilar": 21476, - "ĠSimilarly": 34239, - "ĠSimmons": 50096, - "ĠSimon": 21315, - "ĠSimone": 79432, - "ĠSimpl": 61242, - "ĠSimple": 8993, - "ĠSimpleDateFormat": 26180, - "ĠSimpleName": 40799, - "ĠSimply": 28424, - "ĠSimpson": 34666, - "ĠSimpsons": 84633, - "ĠSims": 51623, - "ĠSimulation": 43120, - "ĠSimulator": 52238, - "ĠSin": 17632, - "ĠSinai": 78885, - "ĠSinatra": 92739, - "ĠSince": 8704, - "ĠSinclair": 73189, - "ĠSind": 96681, - "ĠSing": 10833, - "ĠSingapore": 20539, - "ĠSinger": 54670, - "ĠSingh": 26894, - "ĠSingle": 11327, - "ĠSingleChildScrollView": 88554, - "ĠSingles": 46322, - "ĠSingleton": 38685, - "ĠSingular": 94930, - "ĠSink": 56451, - "ĠSinn": 84579, - "ĠSioux": 81593, - "ĠSir": 16759, - "ĠSiri": 74974, - "ĠSirius": 60034, - "ĠSistema": 76254, - "ĠSister": 47268, - "ĠSisters": 60988, - "ĠSit": 28408, - "ĠSite": 12911, - "ĠSites": 31938, - "ĠSith": 71492, - "ĠSitting": 83754, - "ĠSituation": 68378, - "ĠSix": 18680, - "ĠSixth": 66977, - "ĠSize": 8478, - "ĠSized": 21967, - "ĠSizedBox": 22905, - "ĠSizes": 70182, - "ĠSk": 4818, - "ĠSkate": 96696, - "ĠSke": 62181, - "ĠSkeleton": 65933, - "ĠSketch": 38401, - "ĠSki": 60495, - "ĠSkill": 27482, - "ĠSkills": 30240, - "ĠSkin": 26951, - "ĠSkinner": 97042, - "ĠSkinny": 94224, - "ĠSkip": 25784, - "ĠSkipping": 96118, - "ĠSkull": 60791, - "ĠSky": 14722, - "ĠSkyl": 93011, - "ĠSkype": 41209, - "ĠSkyrim": 64929, - "ĠSkywalker": 76662, - "ĠSl": 6852, - "ĠSlack": 57244, - "ĠSlam": 73623, - "ĠSlash": 72057, - "ĠSlate": 68319, - "ĠSlater": 97003, - "ĠSlave": 59368, - "ĠSlayer": 74623, - "ĠSle": 88458, - "ĠSlee": 46463, - "ĠSleep": 23774, - "ĠSleeping": 74147, - "ĠSleeve": 60262, - "ĠSlice": 56476, - "ĠSlide": 43364, - "ĠSlider": 38129, - "ĠSlim": 44391, - "ĠSlip": 58532, - "ĠSlo": 25603, - "ĠSloan": 93093, - "ĠSlot": 31316, - "ĠSlots": 52348, - "ĠSlovak": 61264, - "ĠSlovakia": 80685, - "ĠSloven": 59395, - "ĠSlovenia": 78217, - "ĠSlow": 38147, - "ĠSlug": 93613, - "ĠSlut": 96344, - "ĠSly": 90736, - "ĠSm": 4388, - "ĠSmall": 14994, - "ĠSmart": 15770, - "ĠSmartphone": 73937, - "ĠSmarty": 50314, - "ĠSmash": 47294, - "ĠSmile": 78305, - "ĠSmith": 9082, - "ĠSmithsonian": 88189, - "ĠSmoke": 53204, - "ĠSmoking": 72599, - "ĠSmooth": 50725, - "ĠSms": 95389, - "ĠSmy": 93402, - "ĠSn": 13059, - "ĠSnackbar": 56254, - "ĠSnake": 39656, - "ĠSnap": 28232, - "ĠSnapchat": 55179, - "ĠSnapdragon": 82055, - "ĠSnape": 85684, - "ĠSnapshot": 68697, - "ĠSne": 50013, - "ĠSniper": 75054, - "ĠSno": 92671, - "ĠSnow": 18901, - "ĠSnowden": 46360, - "ĠSnyder": 53131, - "ĠSo": 2055, - "ĠSoap": 60631, - "ĠSob": 66437, - "ĠSoc": 26572, - "ĠSoccer": 37533, - "ĠSoci": 41409, - "ĠSocial": 9784, - "ĠSocialist": 56110, - "ĠSociety": 13278, - "ĠSociology": 96057, - "ĠSocket": 20954, - "ĠSoda": 96072, - "ĠSodium": 82441, - "ĠSof": 35547, - "ĠSofa": 60848, - "ĠSofia": 78563, - "ĠSoft": 24079, - "ĠSoftware": 4377, - "ĠSoil": 75519, - "ĠSok": 84114, - "ĠSol": 11473, - "ĠSolar": 24446, - "ĠSold": 27140, - "ĠSoldier": 52429, - "ĠSoldiers": 74431, - "ĠSole": 64515, - "ĠSolic": 76194, - "ĠSolid": 22138, - "ĠSolidColorBrush": 91251, - "ĠSolo": 35123, - "ĠSolomon": 49799, - "ĠSolution": 12478, - "ĠSolutions": 22676, - "ĠSolve": 63284, - "ĠSolver": 68295, - "ĠSom": 17564, - "ĠSomali": 84694, - "ĠSomalia": 59751, - "ĠSome": 4329, - "ĠSomebody": 93092, - "ĠSomehow": 79047, - "ĠSomeone": 34172, - "ĠSomerset": 71132, - "ĠSomething": 24656, - "ĠSometimes": 17688, - "ĠSommer": 79509, - "ĠSon": 11840, - "ĠSonata": 94351, - "ĠSong": 18971, - "ĠSongs": 39100, - "ĠSonia": 89391, - "ĠSonic": 43217, - "ĠSons": 50738, - "ĠSony": 20864, - "ĠSoon": 31762, - "ĠSoph": 33840, - "ĠSophia": 70371, - "ĠSophie": 59310, - "ĠSor": 29531, - "ĠSoros": 70187, - "ĠSorry": 32286, - "ĠSort": 15967, - "ĠSorted": 52688, - "ĠSorting": 77143, - "ĠSou": 9240, - "ĠSoul": 29142, - "ĠSouls": 57670, - "ĠSound": 14594, - "ĠSounds": 44141, - "ĠSoup": 60334, - "ĠSour": 94488, - "ĠSource": 8748, - "ĠSources": 47032, - "ĠSous": 88478, - "ĠSouth": 4882, - "ĠSouthampton": 61151, - "ĠSoutheast": 35564, - "ĠSouthern": 16244, - "ĠSouthwest": 45685, - "ĠSov": 17867, - "ĠSovere": 88221, - "ĠSoviet": 19390, - "ĠSoviets": 84289, - "ĠSox": 38545, - "ĠSoy": 62003, - "ĠSp": 3089, - "ĠSpa": 34814, - "ĠSpace": 11487, - "ĠSpaceX": 61924, - "ĠSpacer": 70173, - "ĠSpaces": 68056, - "ĠSpain": 17689, - "ĠSpam": 81667, - "ĠSpan": 11903, - "ĠSpanish": 15154, - "ĠSpar": 69806, - "ĠSpare": 95205, - "ĠSpark": 26467, - "ĠSparks": 93794, - "ĠSparse": 71794, - "ĠSpart": 48351, - "ĠSpartan": 76186, - "ĠSpatial": 74697, - "ĠSpawn": 47361, - "ĠSpaÃŁ": 140748, - "ĠSpe": 12307, - "ĠSpeak": 67201, - "ĠSpeaker": 29073, - "ĠSpeakers": 80096, - "ĠSpeaking": 43972, - "ĠSpear": 77437, - "ĠSpears": 93955, - "ĠSpec": 10956, - "ĠSpecial": 9785, - "ĠSpecialist": 39320, - "ĠSpecialists": 91694, - "ĠSpecialty": 81514, - "ĠSpecies": 50467, - "ĠSpecific": 28262, - "ĠSpecifically": 44763, - "ĠSpecification": 51277, - "ĠSpecifications": 62588, - "ĠSpecifies": 44980, - "ĠSpecify": 47395, - "ĠSpecs": 79892, - "ĠSpect": 26628, - "ĠSpectrum": 51839, - "ĠSpeech": 38741, - "ĠSpeed": 15181, - "ĠSpeedway": 85649, - "ĠSpell": 29080, - "ĠSpells": 78053, - "ĠSpencer": 35121, - "ĠSpend": 77037, - "ĠSpending": 86653, - "ĠSphere": 54499, - "ĠSphinx": 94193, - "ĠSpi": 19751, - "ĠSpice": 67821, - "ĠSpicer": 79666, - "ĠSpider": 28390, - "ĠSpiel": 31380, - "ĠSpielberg": 93616, - "ĠSpiele": 69462, - "ĠSpieler": 81574, - "ĠSpike": 60252, - "ĠSpin": 40685, - "ĠSpinner": 47545, - "ĠSpir": 65047, - "ĠSpiral": 88788, - "ĠSpirit": 16899, - "ĠSpirits": 81777, - "ĠSpiritual": 62749, - "ĠSpit": 81741, - "ĠSpl": 51198, - "ĠSplash": 45442, - "ĠSplashScreen": 90324, - "ĠSplit": 27810, - "ĠSpo": 55949, - "ĠSpokane": 88180, - "ĠSponge": 80743, - "ĠSponsor": 47561, - "ĠSponsored": 73747, - "ĠSpoon": 93513, - "ĠSport": 18207, - "ĠSporting": 64303, - "ĠSports": 13180, - "ĠSpot": 23297, - "ĠSpotify": 40537, - "ĠSpotlight": 80299, - "ĠSpr": 15515, - "ĠSpray": 60561, - "ĠSpread": 47716, - "ĠSpreadsheet": 98501, - "ĠSpring": 12252, - "ĠSpringApplication": 91751, - "ĠSpringer": 66815, - "ĠSpringfield": 52424, - "ĠSprings": 29204, - "ĠSprint": 44812, - "ĠSprite": 21556, - "ĠSpurs": 45042, - "ĠSpy": 46314, - "ĠSq": 64571, - "ĠSql": 7224, - "ĠSqlCommand": 21354, - "ĠSqlConnection": 27981, - "ĠSqlDataAdapter": 46843, - "ĠSqlDataReader": 65511, - "ĠSqlDbType": 27567, - "ĠSqlParameter": 21923, - "ĠSqu": 20084, - "ĠSquad": 34707, - "ĠSquadron": 70072, - "ĠSquare": 15619, - "ĠSr": 33588, - "ĠSrc": 67684, - "ĠSri": 33345, - "ĠSt": 794, - "ĠStObject": 29439, - "ĠSta": 59820, - "ĠStability": 80138, - "ĠStable": 83341, - "ĠStack": 14284, - "ĠStacy": 97325, - "ĠStadium": 22636, - "ĠStadt": 54092, - "ĠStaff": 16951, - "ĠStafford": 62474, - "ĠStage": 22112, - "ĠStainless": 32490, - "ĠStake": 98246, - "ĠStalin": 46665, - "ĠStall": 71870, - "ĠStam": 68080, - "ĠStamford": 98287, - "ĠStamina": 94272, - "ĠStamp": 54787, - "ĠStan": 15205, - "ĠStand": 15577, - "ĠStandard": 11766, - "ĠStandards": 34553, - "ĠStanding": 45227, - "ĠStanford": 30688, - "ĠStanley": 30452, - "ĠStanton": 80664, - "ĠStap": 62506, - "ĠStaples": 91398, - "ĠStar": 7679, - "ĠStarbucks": 48784, - "ĠStard": 97828, - "ĠStark": 46749, - "ĠStarr": 75022, - "ĠStars": 24651, - "ĠStart": 5145, - "ĠStartCoroutine": 45212, - "ĠStartTime": 96798, - "ĠStarted": 35812, - "ĠStarter": 59787, - "ĠStarting": 27657, - "ĠStarts": 47728, - "ĠStartup": 38414, - "ĠStat": 12166, - "ĠState": 3234, - "ĠStatefulWidget": 37642, - "ĠStateless": 35857, - "ĠStatelessWidget": 36798, - "ĠStatement": 21756, - "ĠStatements": 69716, - "ĠStaten": 95306, - "ĠStates": 4180, - "ĠStatic": 23105, - "ĠStation": 16629, - "ĠStations": 86916, - "ĠStatistical": 65694, - "ĠStatistics": 24624, - "ĠStats": 29927, - "ĠStatue": 88575, - "ĠStatus": 8104, - "ĠStatusBar": 68023, - "ĠStatusCode": 53403, - "ĠStay": 28737, - "ĠStd": 42517, - "ĠSte": 3360, - "ĠSteak": 84243, - "ĠStealth": 73467, - "ĠSteam": 21825, - "ĠSteel": 12500, - "ĠSteele": 56393, - "ĠSteelers": 50455, - "ĠSteering": 78721, - "ĠStef": 68320, - "ĠStefan": 48902, - "ĠStein": 34506, - "ĠStella": 74598, - "ĠStellar": 94542, - "ĠStem": 80848, - "ĠStep": 14822, - "ĠSteph": 40559, - "ĠStephan": 38364, - "ĠStephanie": 48143, - "ĠStephen": 18095, - "ĠStephens": 75923, - "ĠSteps": 39861, - "ĠSter": 26063, - "ĠStereo": 71975, - "ĠSterling": 43735, - "ĠStern": 50750, - "ĠSteve": 13809, - "ĠSteven": 23644, - "ĠStevens": 35077, - "ĠStevenson": 81948, - "ĠStewart": 28768, - "ĠStick": 46461, - "ĠSticky": 92643, - "ĠStill": 16377, - "ĠStim": 70772, - "ĠSting": 82870, - "ĠStir": 64192, - "ĠStitch": 67923, - "ĠStmt": 97023, - "ĠSto": 70783, - "ĠStock": 12648, - "ĠStockholm": 52082, - "ĠStocks": 79236, - "ĠStoke": 83597, - "ĠStokes": 97520, - "ĠSton": 35119, - "ĠStone": 14302, - "ĠStones": 56100, - "ĠStop": 14215, - "ĠStops": 88973, - "ĠStopwatch": 70887, - "ĠStorage": 14693, - "ĠStore": 9129, - "ĠStored": 93785, - "ĠStores": 38302, - "ĠStories": 29029, - "ĠStorm": 21862, - "ĠStory": 15106, - "ĠStout": 91030, - "ĠStr": 4509, - "ĠStra": 26647, - "ĠStraight": 45810, - "ĠStrait": 82063, - "ĠStrand": 77302, - "ĠStrange": 42593, - "ĠStranger": 72744, - "ĠStrap": 84406, - "ĠStrat": 52935, - "ĠStrateg": 28223, - "ĠStrategic": 45561, - "ĠStrategies": 55519, - "ĠStrategy": 27745, - "ĠStrauss": 93411, - "ĠStraw": 56844, - "ĠStrawberry": 87977, - "ĠStraÃŁen": 143089, - "ĠStre": 35672, - "ĠStream": 9203, - "ĠStreamLazy": 71918, - "ĠStreamReader": 46811, - "ĠStreamWriter": 57257, - "ĠStreaming": 44810, - "ĠStreams": 94522, - "ĠStreet": 6686, - "ĠStreets": 65518, - "ĠStrength": 31837, - "ĠStress": 50468, - "ĠStretch": 60105, - "ĠStrict": 52881, - "ĠStrike": 35378, - "ĠStrikes": 97026, - "ĠString": 923, - "ĠStringBuffer": 29891, - "ĠStringBuilder": 11410, - "ĠStringComparison": 47687, - "ĠStringField": 59002, - "ĠStringIO": 66935, - "ĠStringSplitOptions": 79876, - "ĠStringTokenizer": 71601, - "ĠStringType": 93635, - "ĠStringUtil": 69280, - "ĠStringUtils": 42938, - "ĠStringWriter": 84787, - "ĠStrings": 41651, - "ĠStrip": 34899, - "ĠStripe": 59566, - "ĠStroke": 68934, - "ĠStrom": 92603, - "ĠStrong": 26099, - "ĠStruct": 16139, - "ĠStructural": 72700, - "ĠStructure": 28596, - "ĠStructures": 70050, - "ĠStuart": 43532, - "ĠStub": 66611, - "ĠStud": 7659, - "ĠStudent": 11726, - "ĠStudents": 20173, - "ĠStudies": 18720, - "ĠStudio": 18563, - "ĠStudios": 30262, - "ĠStudy": 19173, - "ĠStuff": 45486, - "ĠStunden": 80544, - "ĠStunning": 92353, - "ĠStuttgart": 82139, - "ĠSty": 46565, - "ĠStyle": 11913, - "ĠStyleSheet": 24757, - "ĠStyled": 57299, - "ĠStyles": 37370, - "ĠStück": 137296, - "ĠSu": 16931, - "ĠSuarez": 93663, - "ĠSub": 3719, - "ĠSubLObject": 79057, - "ĠSubaru": 59906, - "ĠSubcommittee": 98156, - "ĠSubject": 17450, - "ĠSubjects": 64718, - "ĠSubmission": 58734, - "ĠSubmit": 29170, - "ĠSubmitted": 71889, - "ĠSubscribe": 27270, - "ĠSubscriber": 69653, - "ĠSubscription": 29617, - "ĠSubset": 73223, - "ĠSubstance": 94287, - "ĠSubstitute": 87149, - "ĠSubtract": 93210, - "ĠSubway": 85081, - "ĠSuc": 67890, - "ĠSucc": 88179, - "ĠSuccess": 13047, - "ĠSuccessful": 45526, - "ĠSuccessfully": 34591, - "ĠSuch": 15132, - "ĠSuche": 79041, - "ĠSud": 26333, - "ĠSudan": 42454, - "ĠSuddenly": 57701, - "ĠSudoku": 94254, - "ĠSue": 47649, - "ĠSuff": 59263, - "ĠSuffolk": 80783, - "ĠSug": 83767, - "ĠSugar": 30919, - "ĠSuggestions": 87615, - "ĠSuicide": 64800, - "ĠSuit": 32611, - "ĠSuitable": 85246, - "ĠSuite": 20977, - "ĠSuites": 76012, - "ĠSuk": 73774, - "ĠSul": 45862, - "ĠSullivan": 41989, - "ĠSultan": 74986, - "ĠSum": 8116, - "ĠSummary": 21517, - "ĠSummer": 18836, - "ĠSummers": 79648, - "ĠSummit": 34669, - "ĠSummon": 53906, - "ĠSun": 8059, - "ĠSund": 36802, - "ĠSunday": 7270, - "ĠSundays": 61080, - "ĠSunder": 72061, - "ĠSunderland": 82665, - "ĠSung": 59571, - "ĠSunni": 55010, - "ĠSunny": 55038, - "ĠSunrise": 87188, - "ĠSuns": 72968, - "ĠSunset": 62690, - "ĠSunshine": 61294, - "ĠSup": 6299, - "ĠSuper": 7297, - "ĠSuperintendent": 67884, - "ĠSuperior": 40941, - "ĠSuperman": 37709, - "ĠSupern": 95948, - "ĠSuperv": 61824, - "ĠSupervisor": 57107, - "ĠSupplement": 42391, - "ĠSupplementary": 98271, - "ĠSupplements": 91310, - "ĠSupplier": 31704, - "ĠSuppliers": 46989, - "ĠSupplies": 50252, - "ĠSupply": 29809, - "ĠSupport": 9186, - "ĠSupported": 48980, - "ĠSupporters": 90263, - "ĠSupporting": 73996, - "ĠSupports": 66446, - "ĠSuppose": 82610, - "ĠSuppress": 86798, - "ĠSupreme": 13506, - "ĠSur": 8082, - "ĠSure": 22555, - "ĠSurely": 64188, - "ĠSurf": 64097, - "ĠSurface": 26963, - "ĠSurg": 33276, - "ĠSurge": 56157, - "ĠSurgery": 47090, - "ĠSurgical": 70112, - "ĠSurprise": 84484, - "ĠSurre": 54066, - "ĠSurrey": 66964, - "ĠSurround": 98960, - "ĠSurv": 28778, - "ĠSurveillance": 75358, - "ĠSurvey": 23591, - "ĠSurvival": 53351, - "ĠSurvivor": 64480, - "ĠSus": 16288, - "ĠSusan": 29933, - "ĠSusp": 52206, - "ĠSuspension": 90010, - "ĠSussex": 69508, - "ĠSustainability": 88712, - "ĠSustainable": 60493, - "ĠSutton": 73013, - "ĠSuz": 34387, - "ĠSuzanne": 84152, - "ĠSuzuki": 55746, - "ĠSv": 63605, - "ĠSvens": 86173, - "ĠSvg": 81055, - "ĠSw": 4492, - "ĠSwagger": 79631, - "ĠSwal": 59073, - "ĠSwamp": 82811, - "ĠSwan": 43401, - "ĠSwansea": 77803, - "ĠSwap": 43849, - "ĠSwarm": 96470, - "ĠSwe": 36226, - "ĠSweat": 85960, - "ĠSweden": 23190, - "ĠSwedish": 30109, - "ĠSweep": 85022, - "ĠSweet": 26589, - "ĠSwift": 23670, - "ĠSwiftUI": 74881, - "ĠSwim": 68233, - "ĠSwimming": 74700, - "ĠSwing": 52086, - "ĠSwinger": 60165, - "ĠSwipe": 63800, - "ĠSwiss": 29691, - "ĠSwitch": 15586, - "ĠSwitzerland": 29121, - "ĠSword": 35651, - "ĠSwords": 88351, - "ĠSy": 5718, - "ĠSydney": 21273, - "ĠSylv": 46037, - "ĠSylvia": 88306, - "ĠSym": 11375, - "ĠSymbol": 19612, - "ĠSymbols": 83580, - "ĠSymfony": 16015, - "ĠSymphony": 62206, - "ĠSymposium": 73838, - "ĠSymptoms": 76317, - "ĠSyn": 23153, - "ĠSync": 28937, - "ĠSynd": 41219, - "ĠSyndrome": 56396, - "ĠSynopsis": 87998, - "ĠSyntax": 32117, - "ĠSynthetic": 74828, - "ĠSyracuse": 61596, - "ĠSyria": 12623, - "ĠSyrian": 18141, - "ĠSyrians": 78956, - "ĠSys": 28909, - "ĠSystem": 739, - "ĠSystems": 14917, - "ĠSz": 44190, - "ĠSão": 47690, - "ĠSé": 72387, - "ĠSöz": 135191, - "ĠSü": 77549, - "ĠSüd": 137256, - "ĠSÃłi": 136313, - "ĠSÅĤow": 143407, - "ĠSÆ¡n": 131279, - "ĠSản": 134360, - "ĠSá»±": 133357, - "ĠSá»ij": 134175, - "ĠSợ": 133827, - "ĠSá»Ń": 136091, - "ĠT": 350, - "ĠTA": 38891, - "ĠTAB": 49176, - "ĠTABLE": 14363, - "ĠTAG": 21494, - "ĠTAKE": 85139, - "ĠTAM": 91620, - "ĠTAR": 74574, - "ĠTARGET": 41033, - "ĠTAS": 91288, - "ĠTASK": 42979, - "ĠTAX": 90773, - "ĠTArray": 95273, - "ĠTB": 30080, - "ĠTBD": 72264, - "ĠTBranch": 92126, - "ĠTC": 24591, - "ĠTCHAR": 67069, - "ĠTCL": 65231, - "ĠTCP": 26656, - "ĠTD": 27716, - "ĠTE": 18289, - "ĠTEAM": 58103, - "ĠTECH": 53428, - "ĠTECHNO": 87534, - "ĠTED": 83196, - "ĠTELE": 89240, - "ĠTEM": 75670, - "ĠTEMP": 57431, - "ĠTEMPLATE": 67387, - "ĠTEN": 74266, - "ĠTER": 48848, - "ĠTERM": 88552, - "ĠTERMIN": 93760, - "ĠTERMS": 98928, - "ĠTEST": 13602, - "ĠTESTING": 95535, - "ĠTEX": 76224, - "ĠTEXT": 15762, - "ĠTEntity": 90800, - "ĠTF": 29145, - "ĠTFT": 98601, - "ĠTForm": 93617, - "ĠTG": 55872, - "ĠTH": 4434, - "ĠTHAN": 90006, - "ĠTHANK": 80857, - "ĠTHAT": 25269, - "ĠTHC": 48490, - "ĠTHE": 3168, - "ĠTHEIR": 83604, - "ĠTHEM": 73703, - "ĠTHEME": 86655, - "ĠTHEN": 24117, - "ĠTHEORY": 29657, - "ĠTHERE": 61107, - "ĠTHESE": 82335, - "ĠTHEY": 62493, - "ĠTHINK": 92119, - "ĠTHIRD": 68157, - "ĠTHIS": 10039, - "ĠTHR": 90586, - "ĠTHREAD": 56515, - "ĠTHREE": 14040, - "ĠTHROUGH": 93105, - "ĠTHROW": 77534, - "ĠTI": 38137, - "ĠTICK": 75711, - "ĠTIFF": 74121, - "ĠTILE": 52849, - "ĠTIM": 17742, - "ĠTIME": 22236, - "ĠTIMEOUT": 90846, - "ĠTIMER": 49931, - "ĠTIMES": 86930, - "ĠTIMESTAMP": 92592, - "ĠTITLE": 48573, - "ĠTInt": 71238, - "ĠTJ": 72957, - "ĠTK": 44299, - "ĠTKey": 88750, - "ĠTL": 29615, - "ĠTLC": 90482, - "ĠTLS": 41654, - "ĠTLabel": 80997, - "ĠTM": 23975, - "ĠTMP": 66253, - "ĠTMPro": 87926, - "ĠTMZ": 98955, - "ĠTN": 30923, - "ĠTNT": 88131, - "ĠTO": 5146, - "ĠTOD": 34174, - "ĠTODAY": 40262, - "ĠTODO": 5343, - "ĠTOK": 79501, - "ĠTOKEN": 43574, - "ĠTOM": 82465, - "ĠTOO": 92576, - "ĠTOOL": 92813, - "ĠTOP": 25012, - "ĠTOR": 69961, - "ĠTORT": 17791, - "ĠTOTAL": 46962, - "ĠTOUCH": 88779, - "ĠTOUR": 80301, - "ĠTObject": 31711, - "ĠTP": 29070, - "ĠTPM": 63644, - "ĠTPP": 69011, - "ĠTR": 4984, - "ĠTRACE": 37519, - "ĠTRACK": 73502, - "ĠTRADE": 96861, - "ĠTRAIN": 67509, - "ĠTRAN": 40347, - "ĠTRANS": 47533, - "ĠTRANSACTION": 93923, - "ĠTRE": 76886, - "ĠTREE": 71761, - "ĠTRI": 54563, - "ĠTRUE": 8214, - "ĠTRY": 78481, - "ĠTResult": 46940, - "ĠTS": 22965, - "ĠTSA": 78904, - "ĠTSR": 74671, - "ĠTSRMLS": 86966, - "ĠTString": 52226, - "ĠTT": 32744, - "ĠTTC": 87800, - "ĠTTL": 78532, - "ĠTU": 69414, - "ĠTURN": 82369, - "ĠTV": 5883, - "ĠTValue": 56374, - "ĠTVs": 59766, - "ĠTW": 35555, - "ĠTWO": 46258, - "ĠTX": 17031, - "ĠTXT": 72429, - "ĠTY": 48862, - "ĠTYPE": 12454, - "ĠTYPES": 82325, - "ĠTYPO": 77274, - "ĠTZ": 87105, - "ĠTa": 23291, - "ĠTab": 15139, - "ĠTable": 6633, - "ĠTableCell": 84370, - "ĠTableColumn": 72322, - "ĠTableName": 81790, - "ĠTableRow": 80217, - "ĠTableView": 95497, - "ĠTables": 42152, - "ĠTablet": 57303, - "ĠTablets": 84382, - "ĠTabs": 52614, - "ĠTac": 55509, - "ĠTaco": 78897, - "ĠTacoma": 84528, - "ĠTactical": 70558, - "ĠTactics": 93838, - "ĠTag": 12353, - "ĠTage": 71177, - "ĠTags": 27683, - "ĠTah": 56987, - "ĠTahoe": 95886, - "ĠTai": 21705, - "ĠTail": 36079, - "ĠTaipei": 96345, - "ĠTaiwan": 28289, - "ĠTaiwanese": 92937, - "ĠTaj": 66699, - "ĠTak": 33290, - "ĠTake": 11778, - "ĠTaken": 55974, - "ĠTakes": 37607, - "ĠTaking": 35825, - "ĠTal": 17589, - "ĠTale": 54348, - "ĠTalent": 54507, - "ĠTales": 53855, - "ĠTaliban": 40670, - "ĠTalk": 18976, - "ĠTalking": 60922, - "ĠTalks": 80447, - "ĠTall": 41102, - "ĠTam": 28888, - "ĠTamb": 58126, - "ĠTambién": 90130, - "ĠTambém": 141016, - "ĠTamil": 43783, - "ĠTampa": 32125, - "ĠTan": 24548, - "ĠTang": 40362, - "ĠTango": 98348, - "ĠTank": 31394, - "ĠTanks": 82781, - "ĠTanner": 89796, - "ĠTantra": 88211, - "ĠTanz": 57680, - "ĠTanzania": 68794, - "ĠTao": 59508, - "ĠTap": 36134, - "ĠTape": 57486, - "ĠTar": 23959, - "ĠTara": 69697, - "ĠTarget": 13483, - "ĠTargets": 84947, - "ĠTart": 77541, - "ĠTas": 44687, - "ĠTask": 5430, - "ĠTasks": 46471, - "ĠTasmania": 92428, - "ĠTaste": 57981, - "ĠTat": 62467, - "ĠTata": 87145, - "ĠTate": 67008, - "ĠTatto": 60092, - "ĠTattoo": 75534, - "ĠTau": 80085, - "ĠTavern": 80300, - "ĠTax": 15190, - "ĠTaxes": 71737, - "ĠTaxi": 78275, - "ĠTay": 57528, - "ĠTaylor": 16439, - "ĠTb": 98782, - "ĠTcl": 56491, - "ĠTcp": 64876, - "ĠTe": 2655, - "ĠTea": 30025, - "ĠTeach": 69277, - "ĠTeacher": 29069, - "ĠTeachers": 46702, - "ĠTeaching": 44277, - "ĠTeam": 7909, - "ĠTeams": 39613, - "ĠTear": 76982, - "ĠTears": 90914, - "ĠTec": 92487, - "ĠTech": 17374, - "ĠTechn": 7001, - "ĠTechnical": 26668, - "ĠTechnician": 59056, - "ĠTechnique": 77619, - "ĠTechniques": 64944, - "ĠTechnologies": 24561, - "ĠTechnology": 11791, - "ĠTecn": 87220, - "ĠTed": 23115, - "ĠTeddy": 70066, - "ĠTee": 66999, - "ĠTeen": 23257, - "ĠTeens": 69053, - "ĠTeeth": 97878, - "ĠTeh": 44889, - "ĠTehran": 52695, - "ĠTeil": 47355, - "ĠTek": 55434, - "ĠTel": 22836, - "ĠTele": 13563, - "ĠTelecom": 70864, - "ĠTelefon": 68987, - "ĠTelegram": 42963, - "ĠTelegraph": 48806, - "ĠTelephone": 56930, - "ĠTelerik": 38846, - "ĠTelescope": 85962, - "ĠTelevision": 40345, - "ĠTell": 24647, - "ĠTells": 98890, - "ĠTem": 8647, - "ĠTemp": 19944, - "ĠTempData": 80967, - "ĠTemper": 74683, - "ĠTemperature": 37022, - "ĠTempl": 78810, - "ĠTemplate": 14355, - "ĠTemplates": 19264, - "ĠTemple": 18659, - "ĠTempo": 87503, - "ĠTemporary": 54448, - "ĠTen": 17695, - "ĠTenant": 73724, - "ĠTencent": 69921, - "ĠTender": 93867, - "ĠTenn": 75526, - "ĠTennessee": 23219, - "ĠTennis": 57151, - "ĠTensor": 26036, - "ĠTensorFlow": 94986, - "ĠTent": 66580, - "ĠTer": 10127, - "ĠTeresa": 63440, - "ĠTerm": 17519, - "ĠTermin": 45945, - "ĠTerminal": 34090, - "ĠTerminator": 97361, - "ĠTerms": 19591, - "ĠTerr": 17655, - "ĠTerra": 49426, - "ĠTerrace": 79170, - "ĠTerrain": 62018, - "ĠTerraria": 85592, - "ĠTerritories": 86343, - "ĠTerritory": 48087, - "ĠTerror": 37156, - "ĠTerrorism": 79664, - "ĠTerry": 31518, - "ĠTes": 23099, - "ĠTesla": 27199, - "ĠTess": 91045, - "ĠTest": 3393, - "ĠTestBed": 17722, - "ĠTestCase": 30573, - "ĠTestData": 93200, - "ĠTestUtils": 84745, - "ĠTestament": 39114, - "ĠTested": 88505, - "ĠTester": 76816, - "ĠTesting": 26768, - "ĠTests": 20150, - "ĠTet": 49762, - "ĠTeuchos": 85089, - "ĠTex": 31468, - "ĠTexans": 52691, - "ĠTexas": 8257, - "ĠText": 2918, - "ĠTextAlign": 54410, - "ĠTextArea": 88728, - "ĠTextBox": 29694, - "ĠTextEditingController": 45998, - "ĠTextField": 28435, - "ĠTextFormField": 78111, - "ĠTextInput": 42232, - "ĠTextInputType": 92551, - "ĠTextStyle": 15981, - "ĠTextView": 13865, - "ĠTexture": 18757, - "ĠTf": 91456, - "ĠTh": 663, - "ĠThai": 26392, - "ĠThailand": 29467, - "ĠThames": 81188, - "ĠThan": 33676, - "ĠThank": 9731, - "ĠThankfully": 62454, - "ĠThanks": 11114, - "ĠThanksgiving": 36150, - "ĠThat": 2938, - "ĠThatcher": 80985, - "ĠThe": 576, - "ĠTheater": 37471, - "ĠTheatre": 26221, - "ĠTheft": 60999, - "ĠTheir": 10964, - "ĠThem": 47938, - "ĠThema": 61150, - "ĠTheme": 16442, - "ĠThemeData": 95550, - "ĠThemes": 62087, - "ĠThen": 5005, - "ĠTheo": 84137, - "ĠTheodore": 76349, - "ĠTheory": 30435, - "ĠTher": 22450, - "ĠTherapy": 39043, - "ĠThere": 2619, - "ĠTherefore": 15277, - "ĠTheresa": 42712, - "ĠTherm": 67272, - "ĠThermal": 65626, - "ĠThese": 4220, - "ĠThesis": 73997, - "ĠTheta": 68710, - "ĠThey": 2379, - "ĠThi": 59123, - "ĠThick": 81277, - "ĠThickness": 69401, - "ĠThief": 85598, - "ĠThin": 69622, - "ĠThing": 37200, - "ĠThings": 20093, - "ĠThink": 21149, - "ĠThinking": 52289, - "ĠThird": 20861, - "ĠThirty": 66620, - "ĠThis": 1096, - "ĠThiên": 131460, - "ĠThiết": 133086, - "ĠThom": 8715, - "ĠThomas": 11108, - "ĠThompson": 25164, - "ĠThomson": 64232, - "ĠThor": 28450, - "ĠThorn": 76924, - "ĠThornton": 78234, - "ĠThose": 12969, - "ĠThou": 85371, - "ĠThough": 17594, - "ĠThought": 35187, - "ĠThoughts": 60299, - "ĠThousand": 74353, - "ĠThousands": 62194, - "ĠThr": 29565, - "ĠThread": 8752, - "ĠThreadPool": 72716, - "ĠThreads": 74742, - "ĠThreat": 52335, - "ĠThree": 14513, - "ĠThreshold": 58079, - "ĠThrone": 90601, - "ĠThrones": 46394, - "ĠThrough": 16904, - "ĠThroughout": 45882, - "ĠThrow": 31345, - "ĠThrowable": 22124, - "ĠThrows": 66847, - "ĠThu": 35892, - "ĠThumb": 92256, - "ĠThumbnail": 87792, - "ĠThumbnails": 93722, - "ĠThunder": 26691, - "ĠThur": 75055, - "ĠThurs": 82685, - "ĠThursday": 7794, - "ĠThus": 14301, - "ĠThy": 66575, - "ĠThái": 131053, - "ĠTháng": 132493, - "ĠThánh": 139329, - "ĠThông": 130303, - "ĠThÃłnh": 129932, - "ĠThư": 138532, - "ĠThương": 137048, - "ĠThưá»Ŀng": 141948, - "ĠThảo": 142235, - "ĠThần": 140255, - "ĠThế": 131346, - "ĠThá»§": 130390, - "ĠThứ": 132496, - "ĠThá»±c": 136138, - "ĠThá»ĥ": 141770, - "ĠThá»ĭ": 130934, - "ĠThá»Ŀi": 132809, - "ĠTi": 22325, - "ĠTian": 47343, - "ĠTib": 36816, - "ĠTibet": 44161, - "ĠTibetan": 71974, - "ĠTic": 78426, - "ĠTick": 53092, - "ĠTicket": 28397, - "ĠTickets": 35615, - "ĠTide": 71016, - "ĠTie": 58725, - "ĠTier": 35232, - "ĠTiffany": 67473, - "ĠTig": 93879, - "ĠTiger": 35745, - "ĠTigers": 39716, - "ĠTight": 74346, - "ĠTik": 72742, - "ĠTil": 57669, - "ĠTile": 20744, - "ĠTiles": 71580, - "ĠTill": 39688, - "ĠTillerson": 74180, - "ĠTim": 9354, - "ĠTimber": 44148, - "ĠTime": 4120, - "ĠTimeInterval": 98548, - "ĠTimeSpan": 29158, - "ĠTimeUnit": 36767, - "ĠTimeZone": 88709, - "ĠTimeline": 49528, - "ĠTimeout": 39380, - "ĠTimer": 17759, - "ĠTimes": 8523, - "ĠTimestamp": 32758, - "ĠTiming": 70813, - "ĠTimothy": 44468, - "ĠTin": 56255, - "ĠTina": 63687, - "ĠTinder": 65356, - "ĠTing": 98532, - "ĠTiny": 47974, - "ĠTip": 29873, - "ĠTipo": 45020, - "ĠTips": 25704, - "ĠTir": 82555, - "ĠTire": 67855, - "ĠTit": 24016, - "ĠTitan": 27447, - "ĠTitanic": 88762, - "ĠTitanium": 79354, - "ĠTitans": 46611, - "ĠTitle": 10869, - "ĠTitles": 84387, - "ĠTits": 68986, - "ĠTiên": 137713, - "ĠTiến": 133778, - "ĠTiếp": 141937, - "ĠTiá»ģn": 141630, - "ĠTiá»ĥu": 136746, - "ĠTk": 49160, - "ĠTmax": 65774, - "ĠTmin": 67423, - "ĠTo": 2014, - "ĠToDo": 67053, - "ĠToString": 32128, - "ĠToast": 9609, - "ĠToastr": 90419, - "ĠTob": 31756, - "ĠTobacco": 65110, - "ĠTobias": 79002, - "ĠToby": 78379, - "ĠTod": 58583, - "ĠToday": 11201, - "ĠTodd": 29434, - "ĠTodo": 25404, - "ĠTodos": 63231, - "ĠToe": 89804, - "ĠTogether": 31155, - "ĠToggle": 37105, - "ĠToilet": 81894, - "ĠTok": 21447, - "ĠToken": 9660, - "ĠTokenType": 56582, - "ĠTokens": 58166, - "ĠTokyo": 26194, - "ĠTol": 58502, - "ĠToledo": 72277, - "ĠTolkien": 79303, - "ĠToll": 85294, - "ĠTom": 8364, - "ĠTomas": 87936, - "ĠTomato": 92991, - "ĠTomb": 56172, - "ĠTome": 93866, - "ĠTommy": 39039, - "ĠTomorrow": 54996, - "ĠTon": 30716, - "ĠTone": 66904, - "ĠTong": 50391, - "ĠToni": 89302, - "ĠTonight": 54214, - "ĠTony": 18528, - "ĠToo": 24599, - "ĠTook": 89696, - "ĠTool": 13474, - "ĠToolStrip": 61591, - "ĠToolbar": 44284, - "ĠToolbox": 95962, - "ĠToolkit": 54776, - "ĠTools": 13852, - "ĠTooltip": 59223, - "ĠTooth": 82399, - "ĠTop": 6909, - "ĠTopic": 32911, - "ĠTopics": 40894, - "ĠTops": 92405, - "ĠTor": 8444, - "ĠTorah": 71950, - "ĠTorch": 78743, - "ĠTories": 65969, - "ĠToro": 83980, - "ĠToronto": 14632, - "ĠTorrent": 63786, - "ĠTorres": 54407, - "ĠTort": 55827, - "ĠTory": 46150, - "ĠTos": 69303, - "ĠToshiba": 95441, - "ĠTot": 38020, - "ĠTotal": 10657, - "ĠTotally": 81965, - "ĠTottenham": 55548, - "ĠTou": 56795, - "ĠTouch": 19338, - "ĠTouchableOpacity": 63743, - "ĠTough": 77054, - "ĠTour": 14644, - "ĠTourism": 51552, - "ĠTournament": 18371, - "ĠTours": 56049, - "ĠTout": 79805, - "ĠTow": 40393, - "ĠTowards": 93865, - "ĠTower": 21938, - "ĠTowers": 67357, - "ĠTown": 13971, - "ĠTownsend": 95682, - "ĠTownship": 52667, - "ĠToxic": 66402, - "ĠToy": 21603, - "ĠToyota": 29200, - "ĠToys": 48381, - "ĠTr": 1163, - "ĠTra": 17298, - "ĠTrace": 27163, - "ĠTrack": 19785, - "ĠTracker": 40179, - "ĠTracking": 46070, - "ĠTracks": 64740, - "ĠTracy": 59242, - "ĠTrad": 15065, - "ĠTradable": 23070, - "ĠTrade": 17214, - "ĠTrader": 66431, - "ĠTrades": 95780, - "ĠTrading": 31604, - "ĠTradition": 80478, - "ĠTraditional": 45460, - "ĠTraff": 66748, - "ĠTraffic": 36981, - "ĠTrafford": 94646, - "ĠTrail": 18660, - "ĠTrailer": 36942, - "ĠTrails": 93741, - "ĠTrain": 26125, - "ĠTrainer": 46055, - "ĠTraining": 16151, - "ĠTrait": 68301, - "ĠTraits": 67026, - "ĠTran": 57228, - "ĠTrans": 4058, - "ĠTransaction": 17869, - "ĠTransactions": 55285, - "ĠTranscript": 90303, - "ĠTransfer": 23200, - "ĠTransform": 15226, - "ĠTransformation": 53652, - "ĠTransformer": 62379, - "ĠTransformers": 80532, - "ĠTransit": 45855, - "ĠTransition": 37721, - "ĠTransitional": 66216, - "ĠTranslate": 37740, - "ĠTranslation": 38041, - "ĠTranslator": 76191, - "ĠTransmission": 47025, - "ĠTransmit": 97657, - "ĠTransparency": 94131, - "ĠTransparent": 89868, - "ĠTransport": 16742, - "ĠTransportation": 29878, - "ĠTrap": 52820, - "ĠTrash": 70623, - "ĠTrav": 42259, - "ĠTravel": 18097, - "ĠTraverse": 86733, - "ĠTravis": 40710, - "ĠTray": 64616, - "ĠTre": 12475, - "ĠTreasure": 57148, - "ĠTreasurer": 87875, - "ĠTreasury": 31891, - "ĠTreat": 18877, - "ĠTreatment": 30869, - "ĠTreaty": 51031, - "ĠTree": 8942, - "ĠTreeMap": 76883, - "ĠTreeNode": 17111, - "ĠTreeSet": 90427, - "ĠTrees": 58884, - "ĠTrek": 30471, - "ĠTrem": 75163, - "ĠTrend": 30653, - "ĠTrends": 49630, - "ĠTrent": 47520, - "ĠTrev": 45001, - "ĠTrevor": 53551, - "ĠTrey": 81460, - "ĠTri": 12359, - "ĠTrial": 40474, - "ĠTrials": 69444, - "ĠTriangle": 38031, - "ĠTrib": 20523, - "ĠTribal": 90112, - "ĠTribe": 62704, - "ĠTribunal": 56971, - "ĠTribune": 40339, - "ĠTribute": 95202, - "ĠTrick": 69225, - "ĠTricks": 84176, - "ĠTrident": 92066, - "ĠTrie": 62783, - "ĠTried": 84083, - "ĠTrigger": 30291, - "ĠTrilogy": 96213, - "ĠTrim": 44376, - "ĠTrinidad": 85130, - "ĠTrinity": 44559, - "ĠTrio": 84995, - "ĠTrip": 26754, - "ĠTripAdvisor": 83966, - "ĠTriple": 36649, - "ĠTristan": 96590, - "ĠTrit": 84183, - "ĠTriumph": 95894, - "ĠTriá»ģu": 143656, - "ĠTro": 19321, - "ĠTrojan": 95515, - "ĠTroll": 92637, - "ĠTrom": 93367, - "ĠTrophy": 55104, - "ĠTropical": 70243, - "ĠTrot": 89230, - "ĠTrotsky": 90893, - "ĠTrou": 41682, - "ĠTrouble": 80263, - "ĠTrout": 87538, - "ĠTroy": 43399, - "ĠTruck": 33685, - "ĠTrucks": 85335, - "ĠTrudeau": 43709, - "ĠTrue": 3007, - "ĠTruly": 87148, - "ĠTruman": 79836, - "ĠTrump": 3339, - "ĠTrust": 16816, - "ĠTrusted": 95425, - "ĠTrustees": 84096, - "ĠTruth": 29098, - "ĠTruyá»ģn": 141901, - "ĠTry": 9735, - "ĠTrying": 49858, - "ĠTrên": 136067, - "ĠTrÆ°á»Ľc": 133884, - "ĠTrưá»Ŀng": 131431, - "ĠTrần": 131479, - "ĠTrá»įng": 142741, - "ĠTs": 25076, - "ĠTu": 28649, - "ĠTub": 39540, - "ĠTube": 29024, - "ĠTubes": 94370, - "ĠTucker": 55156, - "ĠTucson": 66852, - "ĠTud": 90151, - "ĠTue": 39167, - "ĠTues": 82683, - "ĠTuesday": 7589, - "ĠTul": 42216, - "ĠTulsa": 74562, - "ĠTumblr": 43599, - "ĠTun": 27456, - "ĠTune": 74174, - "ĠTunis": 94677, - "ĠTunisia": 76835, - "ĠTunnel": 65601, - "ĠTup": 96097, - "ĠTuple": 24622, - "ĠTur": 8705, - "ĠTurbo": 47175, - "ĠTuring": 94430, - "ĠTurk": 20545, - "ĠTurkey": 17009, - "ĠTurkish": 23734, - "ĠTurks": 71757, - "ĠTurn": 11999, - "ĠTurnbull": 67846, - "ĠTurner": 33031, - "ĠTurning": 71533, - "ĠTurns": 57234, - "ĠTurtle": 66806, - "ĠTus": 70904, - "ĠTut": 65963, - "ĠTutor": 80619, - "ĠTutorial": 48007, - "ĠTuấn": 140593, - "ĠTv": 49553, - "ĠTw": 11753, - "ĠTwe": 61698, - "ĠTween": 66335, - "ĠTweet": 25155, - "ĠTweets": 77701, - "ĠTwelve": 69232, - "ĠTwenty": 43856, - "ĠTwice": 93566, - "ĠTwig": 41631, - "ĠTwilight": 51045, - "ĠTwin": 34947, - "ĠTwins": 65268, - "ĠTwist": 73374, - "ĠTwitch": 50801, - "ĠTwitter": 6271, - "ĠTwo": 9043, - "ĠTx": 39850, - "ĠTxt": 79104, - "ĠTy": 13897, - "ĠTyler": 31220, - "ĠTyp": 17518, - "ĠType": 3990, - "ĠTypeError": 25030, - "ĠTypeInfo": 72452, - "ĠTypeName": 97725, - "ĠTypeScript": 87457, - "ĠTyped": 50554, - "ĠTypeface": 95184, - "ĠTypes": 20768, - "ĠTypical": 72925, - "ĠTypically": 45302, - "ĠTypography": 46863, - "ĠTyr": 49495, - "ĠTyson": 62814, - "ĠTâm": 137257, - "ĠTân": 133508, - "ĠTây": 130951, - "ĠTélé": 94088, - "ĠTìm": 137328, - "ĠTình": 138458, - "ĠTôi": 129718, - "ĠTüm": 134091, - "ĠTür": 57358, - "ĠTürk": 126441, - "ĠTürkiye": 128504, - "ĠTürkçe": 136891, - "ĠTÃłi": 134352, - "ĠTư": 132590, - "ĠTại": 131677, - "ĠTất": 137388, - "ĠTết": 136832, - "ĠTáºŃp": 137408, - "ĠTừ": 130232, - "ĠTá»ķ": 126778, - "ĠTá»ķng": 130017, - "ĠTá»Ń": 136690, - "ĠU": 547, - "ĠUA": 45570, - "ĠUAE": 46849, - "ĠUART": 23267, - "ĠUAV": 94496, - "ĠUB": 73061, - "ĠUC": 30513, - "ĠUCHAR": 76989, - "ĠUCLA": 49651, - "ĠUCS": 79246, - "ĠUClass": 84844, - "ĠUD": 78551, - "ĠUDP": 42394, - "ĠUE": 29988, - "ĠUEFA": 78715, - "ĠUF": 68592, - "ĠUFC": 27295, - "ĠUFO": 47944, - "ĠUI": 3689, - "ĠUIAlert": 30049, - "ĠUIAlertAction": 55610, - "ĠUIAlertController": 53255, - "ĠUIAlertView": 84860, - "ĠUIApplication": 34904, - "ĠUIB": 40547, - "ĠUIBar": 50785, - "ĠUIBarButtonItem": 53502, - "ĠUIButton": 21098, - "ĠUICollectionView": 28577, - "ĠUICollectionViewCell": 79613, - "ĠUIColor": 18628, - "ĠUIControl": 77904, - "ĠUID": 37428, - "ĠUIEdgeInsets": 69257, - "ĠUIF": 44404, - "ĠUIFont": 46007, - "ĠUIG": 49058, - "ĠUIGraphics": 61669, - "ĠUIImage": 20681, - "ĠUIImagePickerController": 77733, - "ĠUIImageView": 28968, - "ĠUIKit": 18151, - "ĠUIL": 15737, - "ĠUILabel": 16238, - "ĠUIManager": 92765, - "ĠUINT": 13661, - "ĠUINavigationController": 66067, - "ĠUIP": 57142, - "ĠUIPickerView": 92231, - "ĠUIResponder": 68821, - "ĠUIS": 28797, - "ĠUIScreen": 88007, - "ĠUIScrollView": 73652, - "ĠUIStoryboard": 91942, - "ĠUIStoryboardSegue": 69160, - "ĠUIT": 19923, - "ĠUITableView": 13797, - "ĠUITableViewCell": 27330, - "ĠUITableViewController": 96726, - "ĠUITableViewDataSource": 79768, - "ĠUITableViewDelegate": 82057, - "ĠUITapGestureRecognizer": 79885, - "ĠUITextField": 32063, - "ĠUITextView": 88199, - "ĠUIView": 17620, - "ĠUIViewController": 20784, - "ĠUIWindow": 57700, - "ĠUInt": 22275, - "ĠUK": 6424, - "ĠUL": 22143, - "ĠULONG": 30676, - "ĠUM": 57122, - "ĠUN": 6643, - "ĠUNC": 75255, - "ĠUNDER": 56218, - "ĠUNESCO": 80776, - "ĠUNICODE": 98608, - "ĠUNION": 77553, - "ĠUNIQUE": 72350, - "ĠUNIT": 38202, - "ĠUNITED": 84510, - "ĠUNITY": 56084, - "ĠUNIVERS": 64799, - "ĠUNIVERSITY": 81273, - "ĠUNIX": 54810, - "ĠUNKNOWN": 61395, - "ĠUNS": 45983, - "ĠUNSIGNED": 94178, - "ĠUNU": 66925, - "ĠUNUSED": 68001, - "ĠUObject": 55112, - "ĠUP": 11982, - "ĠUPC": 95129, - "ĠUPDATE": 22893, - "ĠUPDATED": 77861, - "ĠUPLOAD": 83818, - "ĠUPPER": 96312, - "ĠUPS": 57046, - "ĠUR": 34414, - "ĠURI": 16020, - "ĠURL": 5548, - "ĠURLRequest": 95833, - "ĠURLSession": 85820, - "ĠURLWithString": 59579, - "ĠURLs": 35006, - "ĠUS": 2274, - "ĠUSA": 7279, - "ĠUSAGE": 89740, - "ĠUSART": 38885, - "ĠUSB": 11348, - "ĠUSC": 43279, - "ĠUSD": 19551, - "ĠUSDA": 59991, - "ĠUSE": 9457, - "ĠUSED": 65217, - "ĠUSER": 13872, - "ĠUSERNAME": 92115, - "ĠUSERS": 90248, - "ĠUSHORT": 97694, - "ĠUSING": 62051, - "ĠUSPS": 84876, - "ĠUSS": 38508, - "ĠUSSR": 72215, - "ĠUT": 25558, - "ĠUTC": 27403, - "ĠUTF": 20076, - "ĠUTIL": 68107, - "ĠUUID": 23698, - "ĠUV": 29036, - "ĠUW": 65616, - "ĠUX": 61493, - "ĠUb": 26461, - "ĠUber": 27612, - "ĠUbisoft": 86897, - "ĠUbuntu": 34960, - "ĠUd": 66880, - "ĠUg": 46330, - "ĠUganda": 57049, - "ĠUh": 68049, - "ĠUhr": 38183, - "ĠUi": 31634, - "ĠUint": 27883, - "ĠUk": 59313, - "ĠUkr": 14299, - "ĠUkrain": 30604, - "ĠUkraine": 18753, - "ĠUkrainian": 33625, - "ĠUl": 16582, - "ĠUlt": 20604, - "ĠUltimate": 28850, - "ĠUltimately": 54006, - "ĠUltr": 66857, - "ĠUltra": 28213, - "ĠUm": 23334, - "ĠUma": 85768, - "ĠUmb": 65959, - "ĠUn": 1230, - "ĠUna": 42971, - "ĠUnable": 41444, - "ĠUnary": 86951, - "ĠUnauthorized": 63102, - "ĠUnblock": 76288, - "ĠUnc": 28779, - "ĠUncategorized": 80928, - "ĠUncle": 50421, - "ĠUncomment": 63858, - "ĠUnd": 16887, - "ĠUndefined": 62370, - "ĠUnder": 9449, - "ĠUnderground": 53887, - "ĠUnderstand": 70894, - "ĠUnderstanding": 45451, - "ĠUndert": 98673, - "ĠUndo": 70809, - "ĠUne": 38683, - "ĠUnexpected": 70400, - "ĠUnfortunately": 18656, - "ĠUng": 91717, - "ĠUni": 48866, - "ĠUnicode": 35897, - "ĠUnicorn": 94970, - "ĠUnidos": 68419, - "ĠUnified": 72434, - "ĠUniform": 47889, - "ĠUnion": 9145, - "ĠUnique": 28650, - "ĠUnit": 7954, - "ĠUnited": 3639, - "ĠUnits": 35181, - "ĠUnity": 21717, - "ĠUnityEditor": 75417, - "ĠUnityEngine": 7207, - "ĠUniv": 66512, - "ĠUnivers": 15545, - "ĠUniversal": 25500, - "ĠUniverse": 28749, - "ĠUniversidad": 66513, - "ĠUniversities": 74798, - "ĠUniversity": 3822, - "ĠUniversität": 142485, - "ĠUnix": 46995, - "ĠUnknown": 21693, - "ĠUnless": 10878, - "ĠUnlike": 26048, - "ĠUnlimited": 48505, - "ĠUnlock": 57430, - "ĠUno": 83101, - "ĠUnreal": 79919, - "ĠUns": 61043, - "ĠUnsafe": 73067, - "ĠUnsigned": 97747, - "ĠUnsupported": 33081, - "ĠUnsupportedOperationException": 42978, - "ĠUnsure": 77831, - "ĠUnt": 15098, - "ĠUnter": 33312, - "ĠUnternehmen": 61197, - "ĠUnters": 91513, - "ĠUnterstüt": 141785, - "ĠUnterstützung": 141786, - "ĠUntil": 28970, - "ĠUnused": 86473, - "ĠUp": 3138, - "ĠUpdate": 5549, - "ĠUpdated": 16073, - "ĠUpdates": 27500, - "ĠUpdating": 78118, - "ĠUpgrade": 40713, - "ĠUph": 98905, - "ĠUpload": 24996, - "ĠUploaded": 68204, - "ĠUpon": 29438, - "ĠUpper": 30614, - "ĠUps": 71316, - "ĠUr": 16809, - "ĠUran": 79670, - "ĠUrb": 71213, - "ĠUrban": 28322, - "ĠUrdu": 93335, - "ĠUrg": 85486, - "ĠUri": 17226, - "ĠUrl": 22840, - "ĠUrs": 70038, - "ĠUruguay": 72290, - "ĠUs": 3985, - "ĠUsa": 95938, - "ĠUsage": 24567, - "ĠUse": 5443, - "ĠUsed": 12199, - "ĠUseful": 50512, - "ĠUser": 2657, - "ĠUserControl": 72665, - "ĠUserController": 58704, - "ĠUserDao": 97104, - "ĠUserData": 71294, - "ĠUserDefaults": 61792, - "ĠUserDetails": 88286, - "ĠUserID": 68567, - "ĠUserId": 40883, - "ĠUserInfo": 47757, - "ĠUserManager": 56234, - "ĠUserModel": 52784, - "ĠUserName": 47398, - "ĠUserProfile": 55099, - "ĠUserRepository": 60233, - "ĠUserRole": 95019, - "ĠUserService": 30119, - "ĠUserType": 93372, - "ĠUsername": 29545, - "ĠUsers": 14627, - "ĠUsersController": 96427, - "ĠUses": 38823, - "ĠUsing": 12091, - "ĠUsually": 32967, - "ĠUsuario": 28816, - "ĠUsuarios": 94993, - "ĠUt": 17139, - "ĠUtah": 22389, - "ĠUtf": 43432, - "ĠUtil": 10167, - "ĠUtilities": 34994, - "ĠUtility": 25169, - "ĠUtils": 17954, - "ĠUtt": 66962, - "ĠUttar": 85673, - "ĠUzbek": 89859, - "ĠV": 647, - "ĠVA": 20901, - "ĠVAL": 9714, - "ĠVALID": 43291, - "ĠVALUE": 26827, - "ĠVALUES": 14710, - "ĠVAN": 96653, - "ĠVAR": 43508, - "ĠVARCHAR": 37589, - "ĠVARIABLE": 54293, - "ĠVARIABLES": 76753, - "ĠVARIANT": 82346, - "ĠVAT": 47592, - "ĠVB": 63439, - "ĠVBox": 97992, - "ĠVC": 43495, - "ĠVE": 60888, - "ĠVECTOR": 71459, - "ĠVER": 29261, - "ĠVERBOSE": 87041, - "ĠVERIFY": 78204, - "ĠVERSION": 33792, - "ĠVERY": 47074, - "ĠVF": 72892, - "ĠVG": 57818, - "ĠVGA": 75356, - "ĠVH": 98022, - "ĠVI": 29668, - "ĠVIA": 98427, - "ĠVIC": 70103, - "ĠVID": 83952, - "ĠVIDEO": 41769, - "ĠVIEW": 40656, - "ĠVII": 44969, - "ĠVIII": 57233, - "ĠVIN": 83030, - "ĠVIP": 35069, - "ĠVIR": 74695, - "ĠVIS": 59491, - "ĠVK": 21559, - "ĠVL": 60222, - "ĠVLAN": 75880, - "ĠVLC": 93505, - "ĠVM": 17792, - "ĠVMware": 64912, - "ĠVN": 97507, - "ĠVO": 43652, - "ĠVOC": 92521, - "ĠVOID": 59257, - "ĠVOL": 68226, - "ĠVP": 36010, - "ĠVPN": 30747, - "ĠVR": 19168, - "ĠVS": 30650, - "ĠVStack": 94659, - "ĠVT": 32951, - "ĠVW": 52185, - "ĠVX": 78177, - "ĠVa": 26615, - "ĠVac": 30526, - "ĠVacation": 69151, - "ĠVacc": 58688, - "ĠVaccine": 98958, - "ĠVacuum": 75010, - "ĠVad": 92112, - "ĠVader": 68409, - "ĠVal": 4104, - "ĠVale": 53969, - "ĠValencia": 60249, - "ĠValent": 76940, - "ĠValentine": 38769, - "ĠValerie": 89257, - "ĠValid": 7818, - "ĠValidate": 23282, - "ĠValidates": 97843, - "ĠValidation": 18954, - "ĠValidationError": 53029, - "ĠValidationResult": 98594, - "ĠValidator": 32566, - "ĠValidators": 24659, - "ĠValk": 85162, - "ĠVall": 78663, - "ĠValle": 77494, - "ĠValley": 13046, - "ĠValor": 61728, - "ĠValue": 5162, - "ĠValueError": 15402, - "ĠValueEventListener": 98145, - "ĠValueType": 55545, - "ĠValues": 24979, - "ĠValve": 44293, - "ĠVampire": 60114, - "ĠVan": 12710, - "ĠVance": 91268, - "ĠVancouver": 22575, - "ĠVand": 96847, - "ĠVander": 58042, - "ĠVanderbilt": 83026, - "ĠVanessa": 70519, - "ĠVanguard": 75821, - "ĠVanilla": 65582, - "ĠVanity": 68394, - "ĠVapor": 88654, - "ĠVar": 8735, - "ĠVari": 27868, - "ĠVariable": 12407, - "ĠVariables": 21419, - "ĠVariant": 39292, - "ĠVariation": 88485, - "ĠVariety": 70732, - "ĠVarious": 39641, - "ĠVas": 52834, - "ĠVatican": 46547, - "ĠVaugh": 62955, - "ĠVaughan": 95148, - "ĠVault": 41397, - "ĠVaults": 93555, - "ĠVe": 22584, - "ĠVec": 11312, - "ĠVect": 90156, - "ĠVector": 4196, - "ĠVed": 74787, - "ĠVeg": 89913, - "ĠVega": 64606, - "ĠVegan": 62115, - "ĠVegas": 17596, - "ĠVeget": 42700, - "ĠVegetable": 94292, - "ĠVehicle": 24707, - "ĠVehicles": 55020, - "ĠVel": 30198, - "ĠVelocity": 54434, - "ĠVelvet": 73027, - "ĠVen": 18231, - "ĠVend": 84553, - "ĠVendor": 45136, - "ĠVenez": 27983, - "ĠVenezuel": 70814, - "ĠVenezuela": 35903, - "ĠVenezuelan": 82649, - "ĠVenice": 55650, - "ĠVenom": 89586, - "ĠVent": 26407, - "ĠVentura": 84654, - "ĠVenture": 70374, - "ĠVentures": 74796, - "ĠVenue": 68360, - "ĠVenus": 48976, - "ĠVer": 6250, - "ĠVera": 67100, - "ĠVeranst": 92610, - "ĠVerb": 59214, - "ĠVerd": 92707, - "ĠVerde": 72848, - "ĠVere": 68832, - "ĠVerfüg": 83279, - "ĠVerfügung": 90769, - "ĠVerg": 51309, - "ĠVerification": 55473, - "ĠVerified": 63169, - "ĠVerify": 25429, - "ĠVerizon": 42314, - "ĠVerm": 29247, - "ĠVermont": 34639, - "ĠVern": 48745, - "ĠVernon": 59137, - "ĠVeronica": 82521, - "ĠVers": 24209, - "ĠVerse": 84068, - "ĠVersion": 6079, - "ĠVersions": 85174, - "ĠVert": 15058, - "ĠVertex": 23225, - "ĠVertical": 35463, - "ĠVery": 15308, - "ĠVes": 78462, - "ĠVest": 55888, - "ĠVet": 80340, - "ĠVeter": 25745, - "ĠVeteran": 67526, - "ĠVeterans": 39332, - "ĠVeterinary": 77003, - "ĠVi": 11401, - "ĠVia": 44799, - "ĠViagra": 30478, - "ĠVib": 96564, - "ĠVibr": 59188, - "ĠVic": 43747, - "ĠVice": 22461, - "ĠVick": 70262, - "ĠVict": 11760, - "ĠVictim": 93024, - "ĠVictims": 88126, - "ĠVictor": 32312, - "ĠVictoria": 22417, - "ĠVictorian": 43177, - "ĠVictory": 48327, - "ĠVid": 47554, - "ĠVide": 81501, - "ĠVideo": 8354, - "ĠVideos": 19544, - "ĠVie": 59302, - "ĠVienna": 46287, - "ĠViet": 17731, - "ĠVietnam": 22500, - "ĠVietnamese": 48477, - "ĠView": 2738, - "ĠViewBag": 27044, - "ĠViewChild": 68507, - "ĠViewController": 25295, - "ĠViewData": 62066, - "ĠViewGroup": 23801, - "ĠViewHolder": 36410, - "ĠViewModel": 33614, - "ĠViewPager": 90185, - "ĠViewState": 72414, - "ĠViewer": 58503, - "ĠViewing": 94057, - "ĠViews": 24942, - "ĠVig": 57101, - "ĠVij": 78027, - "ĠVik": 28376, - "ĠViking": 64350, - "ĠVikings": 40348, - "ĠViktor": 76016, - "ĠVil": 63649, - "ĠVill": 16550, - "ĠVilla": 36812, - "ĠVillage": 24069, - "ĠVille": 89130, - "ĠVim": 94484, - "ĠVimeo": 98825, - "ĠVin": 20391, - "ĠVince": 55132, - "ĠVincent": 34307, - "ĠVinci": 96766, - "ĠVine": 49695, - "ĠVintage": 35845, - "ĠVinyl": 53534, - "ĠViol": 29455, - "ĠViolence": 46632, - "ĠViolet": 73474, - "ĠVir": 9542, - "ĠVirgin": 11214, - "ĠVirginia": 12989, - "ĠVirt": 47775, - "ĠVirtual": 20721, - "ĠVirus": 63992, - "ĠVis": 7656, - "ĠVisa": 43334, - "ĠVish": 87152, - "ĠVisibility": 33735, - "ĠVisible": 70296, - "ĠVision": 30441, - "ĠVisit": 19008, - "ĠVisitor": 55882, - "ĠVisitors": 68840, - "ĠVista": 34612, - "ĠVisual": 20185, - "ĠVisualization": 90760, - "ĠVit": 28460, - "ĠVita": 54624, - "ĠVital": 54271, - "ĠVitamin": 44674, - "ĠViv": 41036, - "ĠVive": 65854, - "ĠVivo": 88168, - "ĠViá»ĩc": 133817, - "ĠViá»ĩn": 141004, - "ĠViá»ĩt": 128324, - "ĠVk": 32656, - "ĠVlad": 29634, - "ĠVladimir": 34911, - "ĠVo": 28079, - "ĠVoc": 86045, - "ĠVocabulary": 98172, - "ĠVocal": 97303, - "ĠVocê": 80797, - "ĠVog": 65911, - "ĠVogue": 89972, - "ĠVoice": 27930, - "ĠVoices": 82326, - "ĠVoid": 19193, - "ĠVol": 10882, - "ĠVoldemort": 80691, - "ĠVolk": 42514, - "ĠVolkswagen": 50839, - "ĠVoll": 96382, - "ĠVolley": 77179, - "ĠVolt": 65389, - "ĠVoltage": 60938, - "ĠVolume": 20265, - "ĠVolunteer": 64435, - "ĠVolunteers": 85170, - "ĠVolvo": 67252, - "ĠVon": 42079, - "ĠVoor": 68395, - "ĠVor": 33328, - "ĠVote": 34034, - "ĠVoter": 94024, - "ĠVoters": 82722, - "ĠVotes": 65293, - "ĠVoting": 63131, - "ĠVous": 40521, - "ĠVox": 79612, - "ĠVoy": 43623, - "ĠVoyage": 95272, - "ĠVoyager": 85160, - "ĠVs": 42982, - "ĠVu": 56602, - "ĠVue": 22256, - "ĠVuex": 88339, - "ĠVul": 37406, - "ĠVulcan": 93055, - "ĠVulkan": 85864, - "ĠVulner": 80111, - "ĠVy": 95000, - "ĠVân": 136269, - "ĠVì": 130629, - "ĠVÃł": 129758, - "ĠVÄ©nh": 142193, - "ĠVÄĥn": 129126, - "ĠVÅ©": 132644, - "ĠVương": 138219, - "ĠVáºŃy": 136241, - "ĠVá»ģ": 135433, - "ĠVỼi": 129496, - "ĠW": 467, - "ĠWA": 28566, - "ĠWAIT": 54390, - "ĠWAL": 73792, - "ĠWALL": 78375, - "ĠWAN": 98802, - "ĠWANT": 71206, - "ĠWAR": 57983, - "ĠWARN": 68509, - "ĠWARNING": 26479, - "ĠWARRANT": 4750, - "ĠWARRANTIES": 7427, - "ĠWARRANTY": 8236, - "ĠWAS": 37776, - "ĠWATCH": 47407, - "ĠWATER": 75247, - "ĠWAV": 88330, - "ĠWAY": 24400, - "ĠWB": 52503, - "ĠWC": 36646, - "ĠWCHAR": 73264, - "ĠWCS": 98351, - "ĠWD": 63612, - "ĠWE": 19677, - "ĠWEB": 43956, - "ĠWEEK": 57429, - "ĠWEIGHT": 95820, - "ĠWELL": 90152, - "ĠWEST": 65090, - "ĠWF": 72324, - "ĠWG": 98075, - "ĠWH": 8494, - "ĠWHAT": 37435, - "ĠWHATSOEVER": 91892, - "ĠWHEN": 33633, - "ĠWHERE": 5288, - "ĠWHETHER": 17647, - "ĠWHICH": 78164, - "ĠWHILE": 92134, - "ĠWHITE": 42767, - "ĠWHO": 39212, - "ĠWHY": 81694, - "ĠWI": 41923, - "ĠWIDTH": 42810, - "ĠWIFI": 69576, - "ĠWILL": 27915, - "ĠWIN": 22064, - "ĠWINAPI": 53910, - "ĠWINDOW": 39259, - "ĠWINDOWS": 75165, - "ĠWITH": 4769, - "ĠWITHOUT": 6007, - "ĠWK": 67350, - "ĠWL": 59514, - "ĠWLAN": 70847, - "ĠWM": 23155, - "ĠWN": 77264, - "ĠWOM": 80275, - "ĠWON": 97367, - "ĠWORD": 36891, - "ĠWORK": 31804, - "ĠWORLD": 50891, - "ĠWOW": 61300, - "ĠWP": 23253, - "ĠWPARAM": 84428, - "ĠWR": 24328, - "ĠWRITE": 38552, - "ĠWRONG": 98660, - "ĠWS": 24906, - "ĠWT": 58099, - "ĠWTF": 77170, - "ĠWTO": 99133, - "ĠWV": 74425, - "ĠWW": 28044, - "ĠWWE": 33438, - "ĠWWII": 60030, - "ĠWWW": 67945, - "ĠWX": 77441, - "ĠWa": 28514, - "ĠWade": 42882, - "ĠWag": 85893, - "ĠWage": 94437, - "ĠWagner": 51375, - "ĠWah": 69590, - "ĠWahl": 74857, - "ĠWaist": 94685, - "ĠWait": 13824, - "ĠWaitFor": 37601, - "ĠWaitForSeconds": 44878, - "ĠWaiting": 52186, - "ĠWak": 85537, - "ĠWake": 40574, - "ĠWal": 14574, - "ĠWald": 50568, - "ĠWales": 22931, - "ĠWalk": 12554, - "ĠWalker": 22278, - "ĠWalking": 39055, - "ĠWall": 9736, - "ĠWallace": 38856, - "ĠWallet": 36483, - "ĠWallpaper": 70796, - "ĠWalls": 71178, - "ĠWalmart": 35767, - "ĠWalnut": 85202, - "ĠWalsh": 51194, - "ĠWalt": 35267, - "ĠWalter": 32205, - "ĠWalters": 90536, - "ĠWalton": 70409, - "ĠWan": 71018, - "ĠWand": 68929, - "ĠWander": 68885, - "ĠWang": 28246, - "ĠWanna": 95708, - "ĠWant": 23252, - "ĠWanted": 66610, - "ĠWants": 77478, - "ĠWar": 5004, - "ĠWarcraft": 63652, - "ĠWard": 26640, - "ĠWare": 68734, - "ĠWarehouse": 51366, - "ĠWarfare": 66594, - "ĠWarm": 45763, - "ĠWarn": 67746, - "ĠWarner": 31680, - "ĠWarning": 26858, - "ĠWarp": 77810, - "ĠWarranty": 56529, - "ĠWarren": 25631, - "ĠWarrior": 39222, - "ĠWarriors": 31887, - "ĠWars": 14968, - "ĠWarsaw": 72176, - "ĠWarwick": 77102, - "ĠWas": 14804, - "ĠWash": 5985, - "ĠWasher": 96082, - "ĠWashing": 81138, - "ĠWashington": 6515, - "ĠWass": 74519, - "ĠWasser": 73794, - "ĠWaste": 48422, - "ĠWat": 20693, - "ĠWatch": 10357, - "ĠWatches": 98260, - "ĠWatching": 68576, - "ĠWater": 9959, - "ĠWaterloo": 76375, - "ĠWaterproof": 78889, - "ĠWaters": 46878, - "ĠWatkins": 78288, - "ĠWatson": 31480, - "ĠWatt": 58975, - "ĠWatts": 58236, - "ĠWave": 31318, - "ĠWaves": 80458, - "ĠWax": 75742, - "ĠWay": 12149, - "ĠWayne": 27540, - "ĠWays": 41319, - "ĠWe": 1205, - "ĠWeak": 41164, - "ĠWealth": 59741, - "ĠWeapon": 27777, - "ĠWeapons": 46564, - "ĠWear": 41062, - "ĠWeather": 22629, - "ĠWeaver": 66272, - "ĠWeb": 4895, - "ĠWebClient": 93354, - "ĠWebDriver": 41896, - "ĠWebDriverWait": 63646, - "ĠWebElement": 39882, - "ĠWebGL": 85841, - "ĠWebSocket": 47042, - "ĠWebView": 69551, - "ĠWebb": 54388, - "ĠWebcam": 46573, - "ĠWeber": 55520, - "ĠWebseite": 94376, - "ĠWebsite": 16023, - "ĠWebsites": 63637, - "ĠWebster": 63277, - "ĠWed": 6521, - "ĠWedding": 30817, - "ĠWednesday": 7920, - "ĠWeed": 93309, - "ĠWeek": 10348, - "ĠWeekend": 47434, - "ĠWeekly": 33014, - "ĠWeeks": 63037, - "ĠWeg": 58534, - "ĠWei": 52448, - "ĠWeight": 16516, - "ĠWein": 70513, - "ĠWeiner": 93666, - "ĠWeinstein": 55582, - "ĠWeird": 76153, - "ĠWeiss": 41155, - "ĠWeiter": 72998, - "ĠWel": 25006, - "ĠWelch": 84163, - "ĠWelcome": 20166, - "ĠWeld": 60486, - "ĠWelfare": 65087, - "ĠWell": 8325, - "ĠWellington": 56004, - "ĠWellness": 60183, - "ĠWells": 36858, - "ĠWelsh": 45781, - "ĠWelt": 44966, - "ĠWen": 61223, - "ĠWend": 41268, - "ĠWendy": 54576, - "ĠWenger": 76927, - "ĠWenn": 43997, - "ĠWent": 53759, - "ĠWer": 35780, - "ĠWere": 38970, - "ĠWerk": 89423, - "ĠWerner": 79735, - "ĠWert": 78445, - "ĠWes": 36376, - "ĠWesley": 57606, - "ĠWest": 4312, - "ĠWestbrook": 88218, - "ĠWestern": 10867, - "ĠWestminster": 46943, - "ĠWeston": 90019, - "ĠWet": 44856, - "ĠWh": 1232, - "ĠWhale": 96002, - "ĠWhat": 3555, - "ĠWhatever": 32639, - "ĠWhats": 29756, - "ĠWhatsApp": 40013, - "ĠWhatsapp": 71901, - "ĠWhe": 32004, - "ĠWheat": 55638, - "ĠWheel": 32342, - "ĠWheeler": 60346, - "ĠWheels": 51449, - "ĠWhen": 3197, - "ĠWhenever": 42533, - "ĠWhere": 10967, - "ĠWhereas": 60595, - "ĠWhether": 13139, - "ĠWhich": 15920, - "ĠWhile": 5976, - "ĠWhilst": 70728, - "ĠWhip": 94302, - "ĠWhisper": 96974, - "ĠWhit": 26386, - "ĠWhite": 5807, - "ĠWhites": 72462, - "ĠWhitney": 66097, - "ĠWho": 10479, - "ĠWhoever": 90295, - "ĠWhole": 40493, - "ĠWholesale": 55416, - "ĠWhy": 8429, - "ĠWi": 17220, - "ĠWiFi": 33307, - "ĠWich": 76589, - "ĠWichita": 87618, - "ĠWick": 74106, - "ĠWid": 47640, - "ĠWide": 32745, - "ĠWideString": 98115, - "ĠWidget": 12980, - "ĠWidgets": 77176, - "ĠWidow": 88020, - "ĠWidth": 24627, - "ĠWie": 42616, - "ĠWien": 98886, - "ĠWife": 42408, - "ĠWifi": 59871, - "ĠWig": 97156, - "ĠWii": 39192, - "ĠWik": 42105, - "ĠWiki": 29228, - "ĠWikiLeaks": 58547, - "ĠWikimedia": 89840, - "ĠWikipedia": 26587, - "ĠWil": 10562, - "ĠWild": 13630, - "ĠWildcats": 96850, - "ĠWilde": 88923, - "ĠWilderness": 84092, - "ĠWildlife": 41549, - "ĠWiley": 74802, - "ĠWilhelm": 92437, - "ĠWilkinson": 94566, - "ĠWill": 4841, - "ĠWilliam": 12375, - "ĠWilliams": 13612, - "ĠWilliamson": 68531, - "ĠWillie": 61885, - "ĠWillis": 66642, - "ĠWillow": 64349, - "ĠWilmington": 84505, - "ĠWilson": 17426, - "ĠWimbledon": 90157, - "ĠWin": 12190, - "ĠWinchester": 79471, - "ĠWind": 22087, - "ĠWindow": 13642, - "ĠWindowManager": 77755, - "ĠWindows": 5515, - "ĠWinds": 43283, - "ĠWindsor": 56455, - "ĠWine": 31826, - "ĠWing": 34522, - "ĠWings": 45097, - "ĠWinn": 40531, - "ĠWinner": 45920, - "ĠWinners": 76312, - "ĠWinning": 72965, - "ĠWinnipeg": 51882, - "ĠWins": 48444, - "ĠWinston": 47108, - "ĠWinter": 20101, - "ĠWir": 34903, - "ĠWire": 19378, - "ĠWired": 86285, - "ĠWireless": 33642, - "ĠWiring": 47853, - "ĠWis": 15830, - "ĠWisconsin": 20441, - "ĠWisdom": 56101, - "ĠWise": 61001, - "ĠWish": 37647, - "ĠWishlist": 84757, - "ĠWit": 71859, - "ĠWitch": 38350, - "ĠWith": 3085, - "ĠWithEvents": 16371, - "ĠWithdraw": 67381, - "ĠWithin": 24236, - "ĠWithout": 17147, - "ĠWitness": 48899, - "ĠWitnesses": 86339, - "ĠWitt": 82176, - "ĠWizard": 38387, - "ĠWizards": 57594, - "ĠWo": 27258, - "ĠWoW": 87645, - "ĠWoche": 81440, - "ĠWochen": 69713, - "ĠWohn": 52795, - "ĠWohnung": 98344, - "ĠWoj": 96160, - "ĠWol": 29543, - "ĠWolf": 25230, - "ĠWolfe": 79552, - "ĠWolff": 95145, - "ĠWolfgang": 86498, - "ĠWolver": 58518, - "ĠWolverine": 83179, - "ĠWolves": 63479, - "ĠWoman": 24511, - "ĠWomen": 10973, - "ĠWomens": 68619, - "ĠWon": 42449, - "ĠWonder": 26113, - "ĠWonderful": 67863, - "ĠWonderland": 88924, - "ĠWong": 55628, - "ĠWoo": 55846, - "ĠWooCommerce": 88206, - "ĠWood": 12131, - "ĠWooden": 62492, - "ĠWoods": 34748, - "ĠWoodward": 86118, - "ĠWoody": 74959, - "ĠWool": 46300, - "ĠWor": 35536, - "ĠWorce": 73188, - "ĠWorcester": 88369, - "ĠWord": 9322, - "ĠWordPress": 19807, - "ĠWordpress": 88069, - "ĠWords": 27630, - "ĠWork": 5547, - "ĠWorkbook": 83462, - "ĠWorker": 33086, - "ĠWorkers": 35698, - "ĠWorkflow": 60173, - "ĠWorking": 22150, - "ĠWorkout": 69142, - "ĠWorkplace": 93187, - "ĠWorks": 21104, - "ĠWorksheet": 82631, - "ĠWorksheets": 76179, - "ĠWorkshop": 35102, - "ĠWorkspace": 70934, - "ĠWorld": 4337, - "ĠWorlds": 51847, - "ĠWorldwide": 51935, - "ĠWorm": 73030, - "ĠWorse": 86804, - "ĠWorship": 86122, - "ĠWorst": 69092, - "ĠWort": 93504, - "ĠWorth": 36146, - "ĠWould": 18885, - "ĠWouldn": 89864, - "ĠWow": 45717, - "ĠWr": 31630, - "ĠWrap": 42187, - "ĠWrapped": 94715, - "ĠWrapper": 35488, - "ĠWrath": 89515, - "ĠWrest": 44937, - "ĠWrestle": 98299, - "ĠWrestling": 61568, - "ĠWright": 26741, - "ĠWrite": 9645, - "ĠWriteLine": 83926, - "ĠWriter": 29404, - "ĠWriters": 58698, - "ĠWrites": 53288, - "ĠWriting": 23893, - "ĠWritten": 33891, - "ĠWroc": 139221, - "ĠWrocÅĤaw": 139222, - "ĠWrong": 40756, - "ĠWu": 36130, - "ĠWww": 81210, - "ĠWy": 23222, - "ĠWyatt": 87462, - "ĠWyn": 76085, - "ĠWyoming": 48732, - "ĠWäh": 142072, - "ĠWährend": 142073, - "ĠX": 1599, - "ĠXB": 74660, - "ĠXBOOLE": 71645, - "ĠXC": 60342, - "ĠXCT": 15929, - "ĠXCTAssert": 20272, - "ĠXCTAssertEqual": 32550, - "ĠXCTAssertTrue": 79462, - "ĠXCTest": 41240, - "ĠXCTestCase": 62810, - "ĠXD": 71190, - "ĠXElement": 58165, - "ĠXF": 95690, - "ĠXHTML": 64852, - "ĠXI": 53243, - "ĠXII": 86815, - "ĠXIII": 95760, - "ĠXIV": 93415, - "ĠXK": 65723, - "ĠXL": 29881, - "ĠXM": 51020, - "ĠXML": 11874, - "ĠXMLHttpRequest": 45838, - "ĠXO": 98080, - "ĠXOR": 69887, - "ĠXP": 24799, - "ĠXPAR": 91154, - "ĠXPath": 65142, - "ĠXR": 67589, - "ĠXS": 57866, - "ĠXSS": 88502, - "ĠXT": 61866, - "ĠXV": 52594, - "ĠXVI": 93837, - "ĠXX": 29288, - "ĠXXX": 19975, - "ĠXY": 57319, - "ĠXYZ": 71089, - "ĠXamarin": 44361, - "ĠXavier": 61760, - "ĠXbox": 20577, - "ĠXen": 48229, - "ĠXi": 42426, - "ĠXia": 40135, - "ĠXiao": 65590, - "ĠXiaomi": 71449, - "ĠXin": 69661, - "ĠXm": 67559, - "ĠXml": 19201, - "ĠXmlDocument": 75431, - "ĠXmlNode": 75533, - "ĠXperia": 85889, - "ĠXt": 45453, - "ĠXu": 56414, - "ĠXunit": 59361, - "ĠXuân": 133361, - "ĠXxx": 49028, - "ĠY": 809, - "ĠYA": 78150, - "ĠYAML": 53127, - "ĠYE": 76948, - "ĠYEAR": 50905, - "ĠYEARS": 88813, - "ĠYELLOW": 81276, - "ĠYES": 14080, - "ĠYM": 84445, - "ĠYORK": 46304, - "ĠYOU": 14985, - "ĠYOUR": 20922, - "ĠYT": 81992, - "ĠYY": 16866, - "ĠYYS": 96787, - "ĠYYSTACK": 86814, - "ĠYYSTYPE": 97588, - "ĠYYYY": 60591, - "ĠYa": 39384, - "ĠYad": 84983, - "ĠYah": 82462, - "ĠYahoo": 30689, - "ĠYak": 70868, - "ĠYale": 43452, - "ĠYam": 33554, - "ĠYamaha": 58435, - "ĠYan": 24213, - "ĠYang": 24474, - "ĠYankee": 85576, - "ĠYankees": 44283, - "ĠYao": 89930, - "ĠYap": 136668, - "ĠYapı": 136669, - "ĠYard": 38237, - "ĠYas": 69928, - "ĠYates": 83713, - "ĠYay": 138496, - "ĠYayın": 138497, - "ĠYaz": 88570, - "ĠYazı": 138055, - "ĠYaÅŁ": 135255, - "ĠYe": 31169, - "ĠYeah": 21607, - "ĠYear": 9742, - "ĠYears": 22315, - "ĠYellow": 25462, - "ĠYellowstone": 95079, - "ĠYelp": 85314, - "ĠYemen": 32690, - "ĠYep": 84194, - "ĠYes": 7414, - "ĠYesterday": 60033, - "ĠYet": 14626, - "ĠYi": 47834, - "ĠYield": 77378, - "ĠYii": 18258, - "ĠYin": 82858, - "ĠYing": 87670, - "ĠYo": 43088, - "ĠYog": 94571, - "ĠYoga": 37573, - "ĠYok": 93536, - "ĠYong": 67954, - "ĠYork": 4261, - "ĠYorker": 63774, - "ĠYorkers": 88173, - "ĠYorkshire": 50227, - "ĠYosemite": 94827, - "ĠYosh": 73008, - "ĠYoshi": 89642, - "ĠYou": 1446, - "ĠYouTube": 13370, - "ĠYoung": 13263, - "ĠYour": 4615, - "ĠYours": 96918, - "ĠYourself": 58905, - "ĠYouth": 29060, - "ĠYoutube": 37303, - "ĠYu": 27273, - "ĠYuan": 68884, - "ĠYue": 81031, - "ĠYug": 69725, - "ĠYugosl": 74451, - "ĠYugoslavia": 96777, - "ĠYuk": 57663, - "ĠYun": 53992, - "ĠYup": 53853, - "ĠYuri": 85773, - "ĠYus": 93348, - "ĠYên": 138902, - "ĠYö": 137177, - "ĠYönet": 137178, - "ĠYönetim": 137179, - "ĠYük": 139257, - "ĠYüksek": 139258, - "ĠYıl": 138477, - "ĠZ": 1863, - "ĠZEND": 92370, - "ĠZERO": 54593, - "ĠZIP": 56674, - "ĠZX": 71669, - "ĠZZ": 90181, - "ĠZa": 64708, - "ĠZac": 91646, - "ĠZach": 38215, - "ĠZack": 70466, - "ĠZag": 88618, - "ĠZah": 96855, - "ĠZahl": 82745, - "ĠZak": 67453, - "ĠZam": 73889, - "ĠZambia": 94004, - "ĠZap": 69231, - "ĠZar": 61431, - "ĠZe": 9919, - "ĠZealand": 16911, - "ĠZeit": 28831, - "ĠZelda": 54631, - "ĠZen": 31789, - "ĠZend": 31117, - "ĠZero": 18306, - "ĠZeroConstructor": 54714, - "ĠZeus": 74357, - "ĠZh": 33349, - "ĠZhang": 36020, - "ĠZhao": 69281, - "ĠZheng": 76447, - "ĠZhou": 66827, - "ĠZhu": 67744, - "ĠZi": 93284, - "ĠZiel": 77356, - "ĠZig": 73761, - "ĠZika": 80926, - "ĠZimbabwe": 51220, - "ĠZimmer": 40407, - "ĠZimmerman": 65658, - "ĠZinc": 95399, - "ĠZion": 40335, - "ĠZionist": 77473, - "ĠZip": 29232, - "ĠZo": 44803, - "ĠZodiac": 97079, - "ĠZoe": 74641, - "ĠZombie": 56991, - "ĠZombies": 88837, - "ĠZone": 22178, - "ĠZones": 94586, - "ĠZoo": 40860, - "ĠZoom": 37529, - "ĠZot": 88824, - "ĠZu": 60082, - "ĠZub": 95714, - "ĠZucker": 54504, - "ĠZuckerberg": 65934, - "ĠZug": 76716, - "ĠZuk": 88019, - "ĠZukunft": 99122, - "ĠZum": 71474, - "ĠZur": 49192, - "ĠZurich": 71726, - "ĠZus": 58485, - "ĠZusammen": 76604, - "ĠZust": 93716, - "ĠZw": 63165, - "ĠZwe": 83126, - "ĠZy": 86554, - "Ġ[": 508, - "Ġ[\"": 4383, - "Ġ[#": 83703, - "Ġ[$": 24264, - "Ġ[%": 23610, - "Ġ[&": 34336, - "Ġ[&](": 61338, - "Ġ['": 2509, - "Ġ['#": 90084, - "Ġ['$": 44509, - "Ġ['',": 43660, - "Ġ['-": 87641, - "Ġ['.": 95225, - "Ġ['./": 18201, - "Ġ['/": 73805, - "Ġ[(": 17826, - "Ġ[(\"": 84019, - "Ġ[('": 51128, - "Ġ[*": 60974, - "Ġ[+": 78801, - "Ġ[,": 78168, - "Ġ[-": 10055, - "Ġ[--": 73817, - "Ġ[-]:": 23086, - "Ġ[.": 48339, - "Ġ[...": 16303, - "Ġ[...]": 48179, - "Ġ[...]ĊĊ": 36979, - "Ġ[/": 64928, - "Ġ[:": 20865, - "Ġ[<": 67226, - "Ġ[=": 87076, - "Ġ[=[": 90297, - "Ġ[@": 73879, - "Ġ[[": 4318, - "Ġ[[\"": 78686, - "Ġ[['": 31827, - "Ġ[[[": 46727, - "Ġ[[]": 84507, - "Ġ[\\": 93815, - "Ġ[]": 3056, - "Ġ[](": 39444, - "Ġ[])": 42182, - "Ġ[]),Ċ": 96033, - "Ġ[]).": 61556, - "Ġ[]);Ċ": 42197, - "Ġ[]);ĊĊ": 41401, - "Ġ[])Ċ": 27614, - "Ġ[])ĊĊ": 61969, - "Ġ[]*": 29838, - "Ġ[],": 10071, - "Ġ[],Ċ": 10239, - "Ġ[],čĊ": 93227, - "Ġ[].": 72375, - "Ġ[]:Ċ": 96021, - "Ġ[];": 39371, - "Ġ[];Ċ": 5907, - "Ġ[];ĊĊ": 15436, - "Ġ[];čĊ": 34327, - "Ġ[][]": 52931, - "Ġ[]Ċ": 4167, - "Ġ[]ĊĊ": 14599, - "Ġ[]ĊĊĊ": 89238, - "Ġ[]čĊ": 23147, - "Ġ[]čĊčĊ": 79993, - "Ġ[_": 15133, - "Ġ[`": 40518, - "Ġ[{": 18466, - "Ġ[{\"": 61753, - "Ġ[{'": 61108, - "Ġ[{Ċ": 18396, - "Ġ[|": 81537, - "Ġ[~,": 93877, - "Ġ[â̦": 10205, - "Ġ[â̦]": 27524, - "Ġ[â̦]ĊĊ": 12706, - "Ġ[Ċ": 2278, - "Ġ[ĊĊ": 51308, - "Ġ[čĊ": 23637, - "Ġ\\": 1124, - "Ġ\\\"": 7245, - "Ġ\\\"\"": 34768, - "Ġ\\\"$": 65486, - "Ġ\\\"%": 32328, - "Ġ\\\"{": 77782, - "Ġ\\$": 32882, - "Ġ\\%": 96292, - "Ġ\\'": 27152, - "Ġ\\''": 86659, - "Ġ\\(": 17767, - "Ġ\\/": 36815, - "Ġ\\<": 4444, - "Ġ\\<^": 76889, - "Ġ\\@": 74080, - "Ġ\\\\": 24984, - "Ġ\\\\Ċ": 90155, - "Ġ\\`": 95547, - "Ġ\\|": 97155, - "Ġ\\Ċ": 3044, - "Ġ\\ĊĊ": 69911, - "Ġ\\čĊ": 21672, - "Ġ]": 2279, - "Ġ])": 41573, - "Ġ]),Ċ": 38408, - "Ġ])->": 91413, - "Ġ]).": 96711, - "Ġ]);": 76768, - "Ġ]);Ċ": 13201, - "Ġ]);ĊĊ": 22712, - "Ġ])Ċ": 23474, - "Ġ])ĊĊ": 56993, - "Ġ],": 10654, - "Ġ],Ċ": 3211, - "Ġ],ĊĊ": 39774, - "Ġ],čĊ": 34341, - "Ġ].": 20455, - "Ġ];": 13084, - "Ġ];Ċ": 9747, - "Ġ];ĊĊ": 15424, - "Ġ];čĊ": 65383, - "Ġ][": 35640, - "Ġ]]": 40596, - "Ġ]];": 27481, - "Ġ]]Ċ": 63040, - "Ġ]}Ċ": 68165, - "Ġ]Ċ": 5133, - "Ġ]ĊĊ": 10444, - "Ġ]ĊĊĊ": 83007, - "Ġ]čĊ": 48064, - "Ġ^": 6306, - "Ġ^(": 75097, - "Ġ^.": 97291, - "Ġ^=": 31602, - "Ġ^^": 57583, - "Ġ^{Ċ": 47423, - "Ġ^Ċ": 75396, - "Ġ_": 716, - "Ġ_$": 32186, - "Ġ_(": 52617, - "Ġ_(\"": 24816, - "Ġ_('": 35755, - "Ġ_)": 27439, - "Ġ_,": 8358, - "Ġ_.": 13194, - "Ġ_:": 58536, - "Ġ__": 1304, - "Ġ__(": 15617, - "Ġ__(\"": 55561, - "Ġ__('": 14414, - "Ġ___": 7436, - "Ġ____": 30743, - "Ġ_____": 65892, - "Ġ______": 32671, - "Ġ_______,": 56537, - "Ġ__________________": 43841, - "Ġ__________________________________": 81008, - "Ġ__________________ĊĊ": 79364, - "Ġ_|": 85137, - "Ġ_Ċ": 22983, - "Ġ_ĊĊ": 87951, - "Ġ_čĊ": 76564, - "Ġ`": 1565, - "Ġ`\"": 53305, - "Ġ`$": 55693, - "Ġ`${": 11518, - "Ġ`%": 61400, - "Ġ`'": 72911, - "Ġ`(": 48651, - "Ġ`,": 90190, - "Ġ`,Ċ": 63545, - "Ġ`-": 93797, - "Ġ`.": 74090, - "Ġ`/": 37301, - "Ġ`;Ċ": 64417, - "Ġ`<": 30586, - "Ġ`[": 77644, - "Ġ`\\": 91405, - "Ġ`_": 91621, - "Ġ``": 9902, - "Ġ``(": 39595, - "Ġ```": 54275, - "Ġ```Ċ": 41233, - "Ġ`{": 53692, - "Ġ`}Ċ": 91479, - "Ġ`Ċ": 22074, - "Ġa": 264, - "ĠaDecoder": 66050, - "ĠaValue": 89911, - "ĠaVar": 93662, - "Ġaa": 29009, - "Ġaaa": 83465, - "Ġaalborg": 75844, - "Ġaan": 18455, - "Ġaantal": 96511, - "Ġab": 668, - "Ġaba": 74791, - "Ġabaixo": 88792, - "Ġabandon": 15313, - "Ġabandoned": 22978, - "Ġabandoning": 77239, - "Ġabandonment": 90302, - "Ġabb": 29095, - "Ġabbiamo": 94296, - "Ġabbrev": 39515, - "Ġabbreviated": 94775, - "Ġabbreviation": 71478, - "Ġabc": 39022, - "Ġabdom": 35984, - "Ġabdomen": 63672, - "Ġabdominal": 55956, - "Ġabducted": 83445, - "Ġabduction": 96124, - "Ġaber": 19104, - "Ġaberr": 81002, - "Ġabi": 61050, - "Ġabide": 57199, - "Ġabilities": 17541, - "Ġability": 5726, - "Ġabl": 97392, - "Ġable": 2952, - "Ġabnormal": 34563, - "Ġabnormalities": 74715, - "Ġaboard": 36506, - "Ġabol": 36176, - "Ġabolish": 89276, - "Ġabolished": 79981, - "Ġabolition": 75345, - "Ġabort": 11326, - "Ġaborted": 58892, - "Ġabortion": 20107, - "Ġabortions": 53273, - "Ġabound": 86590, - "Ġabout": 911, - "Ġabove": 3403, - "Ġabras": 58581, - "Ġabrasive": 93704, - "Ġabre": 66341, - "Ġabril": 87287, - "Ġabrir": 72563, - "Ġabroad": 22131, - "Ġabrupt": 42977, - "Ġabruptly": 59745, - "Ġabs": 3647, - "Ġabsence": 19265, - "Ġabsent": 27211, - "Ġabsentee": 93090, - "Ġabsl": 88302, - "Ġabsol": 87561, - "Ġabsolut": 63162, - "Ġabsolute": 10740, - "Ġabsolutely": 10875, - "Ġabsor": 15567, - "Ġabsorb": 34306, - "Ġabsorbed": 41001, - "Ġabsorbing": 69175, - "Ġabsorbs": 90011, - "Ġabsorption": 43125, - "Ġabst": 62844, - "Ġabstract": 8115, - "Ġabstraction": 58751, - "Ġabsurd": 31577, - "Ġabund": 22509, - "Ġabundance": 36392, - "Ġabundant": 43511, - "Ġabuse": 11480, - "Ġabused": 35565, - "Ġabuses": 49062, - "Ġabusing": 68479, - "Ġabusive": 42558, - "Ġaby": 42715, - "Ġabyss": 87214, - "Ġac": 1613, - "Ġacab": 66062, - "Ġacad": 10406, - "Ġacademia": 66571, - "Ġacademic": 14250, - "Ġacademics": 47609, - "Ġacademy": 43345, - "Ġacc": 1029, - "Ġaccel": 66511, - "Ġacceler": 14177, - "Ġaccelerate": 42780, - "Ġaccelerated": 48758, - "Ġaccelerating": 68641, - "Ġacceleration": 30803, - "Ġaccelerator": 64356, - "Ġaccelerometer": 96748, - "Ġaccent": 29100, - "Ġaccents": 58470, - "Ġaccept": 4193, - "Ġacceptable": 21555, - "Ġacceptance": 25505, - "Ġaccepted": 11666, - "Ġaccepting": 24667, - "Ġaccepts": 26344, - "Ġacces": 84095, - "Ġacceso": 68529, - "Ġaccess": 2615, - "ĠaccessToken": 37725, - "Ġaccessed": 24758, - "Ġaccesses": 77648, - "Ġaccessibility": 39700, - "Ġaccessible": 15614, - "Ġaccessing": 31788, - "Ġaccession": 83945, - "Ġaccessor": 44384, - "Ġaccessories": 22293, - "Ġaccessory": 41981, - "Ġaccident": 11423, - "Ġaccidental": 48916, - "Ġaccidentally": 32384, - "Ġaccidents": 32688, - "Ġacciones": 93385, - "Ġacción": 89064, - "Ġacclaim": 96863, - "Ġacclaimed": 48982, - "Ġaccol": 85543, - "Ġaccom": 5725, - "Ġaccommod": 13927, - "Ġaccommodate": 28276, - "Ġaccommodating": 76041, - "Ġaccommodation": 27278, - "Ġaccommodations": 54613, - "Ġaccomp": 57333, - "Ġaccompagn": 87678, - "Ġaccompanied": 23943, - "Ġaccompanies": 48056, - "Ġaccompany": 19226, - "Ġaccompanying": 23534, - "Ġaccompl": 13089, - "Ġaccomplish": 22054, - "Ġaccomplished": 26237, - "Ġaccomplishment": 60138, - "Ġaccomplishments": 52781, - "Ġaccord": 14560, - "Ġaccordance": 18353, - "Ġaccording": 4092, - "Ġaccordingly": 27079, - "Ġaccordion": 86999, - "Ġaccount": 2692, - "ĠaccountId": 60443, - "Ġaccountability": 38142, - "Ġaccountable": 35877, - "Ġaccountant": 74921, - "Ġaccounted": 40753, - "Ġaccounting": 23168, - "Ġaccounts": 9618, - "Ġaccr": 85559, - "Ġaccred": 40471, - "Ġaccreditation": 83384, - "Ġaccredited": 54225, - "Ġaccru": 82732, - "Ġaccrued": 98116, - "Ġacct": 88567, - "Ġaccum": 15421, - "Ġaccumulate": 46276, - "Ġaccumulated": 40065, - "Ġaccumulating": 91585, - "Ġaccumulation": 45735, - "Ġaccumulator": 56312, - "Ġaccur": 7419, - "Ġaccuracy": 13403, - "Ġaccurate": 13382, - "Ġaccurately": 29257, - "Ġaccus": 25508, - "Ġaccusation": 64406, - "Ġaccusations": 35469, - "Ġaccuse": 61642, - "Ġaccused": 13185, - "Ġaccuses": 86056, - "Ġaccusing": 48479, - "Ġaccustomed": 52084, - "Ġace": 26747, - "Ġacept": 54888, - "Ġacess": 84970, - "Ġacesso": 83707, - "Ġacest": 58609, - "Ġacet": 64702, - "Ġach": 33261, - "Ġache": 77731, - "Ġacheter": 98390, - "Ġachie": 6087, - "Ġachievable": 88153, - "Ġachieve": 11075, - "Ġachieved": 16994, - "Ġachievement": 25426, - "Ġachievements": 32897, - "Ġachieves": 82591, - "Ġachieving": 31045, - "Ġachter": 86808, - "Ġacid": 13621, - "Ġacidic": 83803, - "Ġacidity": 96926, - "Ġacids": 32869, - "Ġack": 10725, - "Ġacknow": 11861, - "Ġacknowled": 15823, - "Ġacknowledge": 24645, - "Ġacknowledged": 25498, - "Ġacknowledgement": 66923, - "Ġacknowledges": 54930, - "Ġacknowledging": 60608, - "Ġacknowledgment": 77470, - "Ġacl": 57120, - "Ġacne": 45805, - "Ġacomp": 85701, - "Ġacompan": 51410, - "Ġacompanh": 60797, - "Ġacompañ": 92871, - "Ġacompaña": 137174, - "Ġaconte": 67050, - "Ġacordo": 76926, - "Ġacos": 80211, - "Ġacoustic": 44066, - "Ġacqu": 19274, - "Ġacquaint": 53527, - "Ġacquaintance": 81307, - "Ġacquainted": 72634, - "Ġacquire": 21256, - "Ġacquired": 18892, - "Ġacquiring": 41890, - "Ġacquisition": 23390, - "Ġacquisitions": 62848, - "Ġacquitted": 90433, - "Ġacre": 45223, - "Ġacres": 26367, - "Ġacronym": 74514, - "Ġacross": 3941, - "Ġacrylic": 58641, - "Ġact": 1160, - "Ġacted": 30432, - "Ġacting": 15358, - "Ġaction": 1917, - "ĠactionBar": 89136, - "ĠactionPerformed": 24059, - "ĠactionTypes": 67134, - "Ġactionable": 91078, - "Ġactions": 6168, - "Ġactiv": 4105, - "Ġactivate": 20276, - "Ġactivated": 21985, - "Ġactivates": 73942, - "Ġactivating": 71092, - "Ġactivation": 15099, - "Ġactivations": 92495, - "Ġactive": 4541, - "ĠactiveClassName": 98122, - "Ġactively": 22040, - "Ġactividad": 68740, - "Ġactividades": 72979, - "Ġactivism": 54180, - "Ġactivist": 27841, - "Ġactivists": 20902, - "Ġactivities": 7488, - "Ġactivity": 5702, - "Ġactivités": 137596, - "Ġactor": 12089, - "Ġactors": 19571, - "Ġactress": 23654, - "Ġactresses": 90028, - "Ġacts": 14056, - "Ġactu": 80453, - "Ġactual": 5042, - "Ġactualizar": 78629, - "Ġactually": 3520, - "Ġacuerdo": 62860, - "Ġacum": 68093, - "Ġacupuncture": 88438, - "Ġacute": 29783, - "Ġad": 993, - "Ġada": 34234, - "Ġadalah": 37560, - "Ġadam": 48966, - "Ġadamant": 83288, - "Ġadap": 38632, - "Ġadapt": 10515, - "Ġadaptable": 93748, - "Ġadaptation": 33085, - "Ġadaptations": 76665, - "Ġadapted": 29364, - "Ġadapter": 12956, - "Ġadapters": 69025, - "Ġadapting": 69717, - "Ġadaptive": 47132, - "Ġadaptor": 91941, - "Ġadapté": 140322, - "Ġadb": 82412, - "Ġadc": 47445, - "Ġadd": 912, - "ĠaddAction": 86010, - "ĠaddButton": 88196, - "ĠaddChild": 62959, - "ĠaddCriterion": 18724, - "ĠaddItem": 63928, - "ĠaddObject": 28723, - "ĠaddObserver": 76939, - "ĠaddSubview": 18171, - "ĠaddTarget": 49927, - "ĠaddTo": 53417, - "ĠaddUser": 77475, - "Ġadded": 3694, - "Ġaddict": 38226, - "Ġaddicted": 56627, - "Ġaddiction": 26373, - "Ġaddictive": 56307, - "Ġaddicts": 77474, - "Ġadding": 7842, - "Ġaddition": 5256, - "Ġadditional": 5107, - "Ġadditionally": 36838, - "Ġadditions": 37214, - "Ġadditive": 63238, - "Ġadditives": 84186, - "Ġaddon": 47997, - "Ġaddons": 89145, - "Ġaddr": 10789, - "Ġaddress": 2621, - "Ġaddressed": 20068, - "Ġaddresses": 14230, - "Ġaddressing": 27020, - "Ġadds": 11367, - "Ġaddslashes": 77307, - "Ġade": 17108, - "Ġadec": 86718, - "Ġadel": 71969, - "Ġademás": 62330, - "Ġaden": 99113, - "Ġadept": 75488, - "Ġadequ": 40128, - "Ġadequate": 25532, - "Ġadequately": 48572, - "Ġadher": 34951, - "Ġadhere": 48453, - "Ġadherence": 70528, - "Ġadhesive": 64458, - "Ġadicion": 80367, - "Ġadidas": 75190, - "Ġadip": 29266, - "Ġadipiscing": 57924, - "Ġadipisicing": 56681, - "Ġadj": 12469, - "Ġadjacency": 73849, - "Ġadjacent": 23942, - "Ġadjective": 84492, - "Ġadjoining": 90758, - "Ġadjud": 69180, - "Ġadjunct": 89595, - "Ġadjust": 7500, - "Ġadjustable": 35930, - "Ġadjusted": 23368, - "Ġadjusting": 42368, - "Ġadjustment": 27075, - "Ġadjustments": 32974, - "Ġadjusts": 83331, - "Ġadm": 14591, - "Ġadmin": 3986, - "Ġadminister": 26093, - "Ġadministered": 36918, - "Ġadministering": 85561, - "Ġadministr": 11150, - "Ġadministration": 8567, - "Ġadministrations": 77073, - "Ġadministrative": 22707, - "Ġadministrator": 28093, - "Ġadministrators": 37112, - "Ġadmins": 57095, - "Ġadmir": 62598, - "Ġadmirable": 84584, - "Ġadmiration": 65839, - "Ġadmire": 49763, - "Ġadmired": 63647, - "Ġadmission": 25293, - "Ġadmissions": 47811, - "Ġadmit": 16698, - "Ġadmits": 37139, - "Ġadmitted": 16188, - "Ġadmittedly": 78713, - "Ġadmitting": 54589, - "Ġadmon": 81985, - "Ġado": 55185, - "Ġadoles": 23109, - "Ġadolescence": 82809, - "Ġadolescent": 34988, - "Ġadolescente": 81935, - "Ġadolescents": 50416, - "Ġadopt": 10902, - "Ġadopted": 17827, - "Ġadopting": 47710, - "Ġadoption": 24376, - "Ġadopts": 85957, - "Ġadorable": 40608, - "Ġadore": 60635, - "Ġadorn": 57946, - "Ġadorned": 83173, - "Ġadr": 93133, - "Ġadrenal": 59464, - "Ġadrenaline": 78392, - "Ġadres": 65761, - "Ġadress": 62782, - "Ġadresse": 62174, - "Ġads": 13740, - "Ġadul": 39594, - "Ġadult": 6683, - "Ġadulte": 55330, - "Ġadultery": 95596, - "Ġadultes": 86925, - "Ġadulthood": 62933, - "Ġadulti": 77250, - "Ġadultos": 88631, - "Ġadults": 12598, - "Ġadv": 3358, - "Ġadvance": 11912, - "Ġadvanced": 10847, - "Ġadvancement": 49825, - "Ġadvancements": 82687, - "Ġadvances": 29903, - "Ġadvancing": 43069, - "Ġadvant": 7871, - "Ġadvantage": 9423, - "Ġadvantageous": 75724, - "Ġadvantages": 22146, - "Ġadvent": 11345, - "Ġadventure": 17943, - "Ġadventurer": 99135, - "Ġadventurers": 87713, - "Ġadventures": 30978, - "Ġadventurous": 67088, - "Ġadvers": 28411, - "Ġadversaries": 87391, - "Ġadversary": 81399, - "Ġadverse": 30859, - "Ġadversely": 68114, - "Ġadversity": 89830, - "Ġadvert": 7690, - "Ġadvertis": 19220, - "Ġadvertise": 50836, - "Ġadvertised": 45741, - "Ġadvertisement": 32689, - "Ġadvertisements": 42649, - "Ġadvertiser": 86286, - "Ġadvertisers": 49170, - "Ġadvertising": 12876, - "Ġadverts": 87725, - "Ġadvice": 9462, - "Ġadvis": 9622, - "Ġadvisable": 68819, - "Ġadvise": 31013, - "Ġadvised": 25104, - "Ġadviser": 31753, - "Ġadvisers": 50975, - "Ġadvises": 68974, - "Ġadvising": 62679, - "Ġadvisor": 36613, - "Ġadvisors": 57684, - "Ġadvisory": 40437, - "Ġadvoc": 12237, - "Ġadvocacy": 34854, - "Ġadvocate": 28015, - "Ġadvocated": 63754, - "Ġadvocates": 27324, - "Ġadvocating": 58316, - "Ġadım": 135081, - "Ġadına": 136880, - "Ġae": 41856, - "Ġaer": 33448, - "Ġaerial": 40784, - "Ġaerobic": 90390, - "Ġaeros": 48725, - "Ġaerospace": 77064, - "Ġaes": 56575, - "Ġaest": 26816, - "Ġaesthetic": 36537, - "Ġaesthetics": 66223, - "Ġaf": 7977, - "Ġafar": 98278, - "Ġafect": 67264, - "Ġaff": 3527, - "Ġaffair": 29917, - "Ġaffairs": 21978, - "Ġaffect": 7802, - "Ġaffected": 11495, - "Ġaffecting": 27887, - "Ġaffection": 36705, - "Ġaffects": 21501, - "Ġaffid": 49782, - "Ġaffidavit": 59935, - "Ġaffili": 11938, - "Ġaffiliate": 21597, - "Ġaffiliated": 36406, - "Ġaffiliates": 31033, - "Ġaffiliation": 52791, - "Ġaffine": 68809, - "Ġaffinity": 50452, - "Ġaffirm": 32349, - "Ġaffirmation": 95863, - "Ġaffirmative": 67641, - "Ġaffirmed": 73449, - "Ġafflict": 94523, - "Ġafflicted": 91168, - "Ġaffluent": 80779, - "Ġafford": 9946, - "Ġaffordability": 77910, - "Ġaffordable": 16637, - "Ġafforded": 65599, - "Ġaficion": 93805, - "Ġafin": 53301, - "Ġafirm": 85438, - "Ġafl": 98057, - "Ġafore": 43773, - "Ġaforementioned": 45652, - "Ġafr": 84964, - "Ġafraid": 16575, - "Ġafrica": 44281, - "Ġafrican": 74400, - "Ġafs": 66713, - "Ġaft": 59701, - "Ġafter": 1283, - "ĠafterEach": 73491, - "Ġaftermarket": 89892, - "Ġaftermath": 39596, - "Ġafternoon": 13354, - "Ġafterward": 47943, - "Ġafterwards": 26807, - "Ġag": 933, - "Ġagain": 1549, - "Ġagainst": 2348, - "Ġagar": 69379, - "Ġage": 4231, - "Ġaged": 19749, - "Ġageing": 78943, - "Ġagencies": 13304, - "Ġagency": 9088, - "Ġagenda": 18402, - "Ġagendas": 82929, - "Ġagent": 8315, - "Ġagents": 13009, - "Ġages": 16639, - "Ġagg": 50020, - "Ġaggi": 68369, - "Ġaggrav": 44941, - "Ġaggravated": 62268, - "Ġaggreg": 25198, - "Ġaggregate": 23192, - "Ġaggregated": 70822, - "Ġaggregates": 70543, - "Ġaggregation": 51629, - "Ġaggregator": 96680, - "Ġaggress": 13329, - "Ġaggression": 39207, - "Ġaggressive": 19188, - "Ġaggressively": 48039, - "Ġagile": 61465, - "Ġagility": 66641, - "Ġaging": 28984, - "Ġagitation": 90217, - "Ġagli": 98682, - "Ġago": 4134, - "Ġagon": 56670, - "Ġagony": 78830, - "Ġagora": 65783, - "Ġagosto": 82189, - "Ġagr": 39474, - "Ġagre": 4294, - "Ġagree": 7503, - "Ġagreed": 7230, - "Ġagreeing": 38327, - "Ġagreement": 9128, - "Ġagreements": 19473, - "Ġagrees": 32908, - "Ġagreg": 78194, - "Ġagregar": 72106, - "Ġagricult": 17295, - "Ġagricultural": 28049, - "Ġagriculture": 28929, - "Ġagré": 141521, - "Ġagréable": 141522, - "Ġagua": 55462, - "Ġah": 22327, - "Ġahead": 8305, - "Ġahora": 46317, - "Ġai": 16391, - "Ġaid": 12296, - "Ġaide": 40575, - "Ġaided": 62857, - "Ġaider": 90778, - "Ġaides": 52889, - "Ġaiding": 85287, - "Ġaids": 51697, - "Ġail": 59143, - "Ġailments": 81807, - "Ġaim": 9213, - "Ġaime": 85707, - "Ġaimed": 19469, - "Ġaiming": 37078, - "Ġaims": 21538, - "Ġain": 36102, - "Ġainda": 43909, - "Ġainsi": 43251, - "Ġaio": 83943, - "Ġair": 3720, - "Ġairborne": 69763, - "Ġaircraft": 14135, - "Ġaire": 84108, - "Ġaired": 41987, - "Ġairflow": 73020, - "Ġairing": 70253, - "Ġairl": 82657, - "Ġairline": 32475, - "Ġairlines": 47358, - "Ġairplane": 42924, - "Ġairplanes": 75381, - "Ġairport": 16733, - "Ġairports": 45063, - "Ġairs": 78891, - "Ġairspace": 87182, - "Ġairst": 58310, - "Ġairstrikes": 79273, - "Ġairy": 96963, - "Ġais": 88695, - "Ġaisle": 59679, - "Ġaj": 25437, - "Ġajax": 26281, - "Ġajout": 88996, - "Ġajud": 86059, - "Ġajust": 73134, - "Ġak": 17324, - "Ġaka": 37141, - "Ġakan": 32670, - "Ġakin": 51907, - "Ġakka": 51342, - "Ġako": 78714, - "Ġakt": 22318, - "Ġaktiv": 49183, - "Ġaktual": 84301, - "Ġaktuellen": 97268, - "Ġaku": 86195, - "ĠakÅŁ": 140245, - "ĠakÅŁam": 140246, - "Ġal": 452, - "Ġalan": 72562, - "Ġalanı": 139111, - "Ġalanında": 140379, - "Ġalarm": 16624, - "Ġalarmed": 81040, - "Ġalarming": 56276, - "Ġalarms": 62311, - "Ġalas": 88098, - "Ġalb": 81598, - "Ġalbeit": 42069, - "Ġalbum": 8017, - "Ġalbums": 27685, - "Ġalc": 41624, - "Ġalcan": 75771, - "Ġalcanç": 142913, - "Ġalcohol": 12904, - "Ġalcoholic": 55361, - "Ġalcuni": 96356, - "Ġald": 80304, - "Ġaldı": 132984, - "Ġaldıģı": 136390, - "Ġale": 21463, - "Ġalert": 5115, - "ĠalertController": 72681, - "ĠalertDialog": 62557, - "Ġalerted": 66669, - "Ġalerts": 29250, - "Ġalex": 56478, - "Ġalf": 84666, - "Ġalg": 17345, - "Ġalgae": 67851, - "Ġalgebra": 46876, - "Ġalgo": 27928, - "Ġalgorithm": 12111, - "Ġalgorithms": 25185, - "Ġalgu": 140030, - "Ġalguien": 88319, - "Ġalgum": 96675, - "Ġalgumas": 92012, - "Ġalgun": 36471, - "Ġalguna": 72027, - "Ġalgunas": 73754, - "Ġalgunos": 57210, - "Ġalguns": 77269, - "Ġalguém": 140031, - "Ġalgún": 84309, - "Ġali": 18991, - "Ġalias": 15534, - "Ġaliases": 40386, - "Ġalice": 70433, - "Ġalien": 19594, - "Ġaliens": 36119, - "Ġalign": 5285, - "ĠalignItems": 21716, - "ĠalignSelf": 67578, - "Ġaligned": 26118, - "Ġalignment": 17189, - "Ġalignments": 92816, - "Ġalike": 25992, - "Ġaliment": 37350, - "Ġalimentos": 89491, - "Ġaliqu": 42291, - "Ġaliqua": 85927, - "Ġalist": 95695, - "Ġalive": 13675, - "Ġalk": 57898, - "Ġalkal": 65687, - "Ġall": 678, - "Ġalla": 22702, - "Ġalle": 12304, - "Ġalleen": 71173, - "Ġalleg": 7034, - "Ġallegation": 57394, - "Ġallegations": 18367, - "Ġallege": 82617, - "Ġalleged": 10491, - "Ġallegedly": 19204, - "Ġalleges": 58697, - "Ġallegiance": 66978, - "Ġalleging": 61446, - "Ġallele": 69410, - "Ġalleles": 97160, - "Ġallem": 60297, - "Ġallen": 50041, - "Ġaller": 47808, - "Ġallerdings": 85725, - "Ġallerg": 24401, - "Ġallergic": 56496, - "Ġallergies": 57642, - "Ġallergy": 59654, - "Ġalles": 35951, - "Ġallev": 45549, - "Ġalleviate": 60605, - "Ġalley": 52950, - "Ġalliance": 29664, - "Ġalliances": 69700, - "Ġallied": 53402, - "Ġallies": 20120, - "Ġallo": 62647, - "Ġalloc": 5574, - "Ġallocate": 22089, - "Ġallocated": 20204, - "Ġallocating": 72762, - "Ġallocation": 23757, - "Ġallocations": 69642, - "Ġallocator": 43655, - "Ġallot": 84174, - "Ġallotted": 91543, - "Ġallow": 2138, - "ĠallowNull": 41440, - "Ġallowable": 84752, - "Ġallowance": 40358, - "Ġallowances": 89020, - "Ġallowed": 5420, - "Ġallowing": 10693, - "Ġallows": 6147, - "Ġalloy": 45864, - "Ġalloys": 94751, - "Ġallure": 87403, - "Ġally": 30853, - "Ġalm": 89484, - "Ġalma": 81480, - "Ġalmacen": 83227, - "Ġalmond": 62068, - "Ġalmonds": 87822, - "Ġalmost": 4558, - "Ġalo": 53166, - "Ġaload": 49620, - "Ġalone": 7484, - "Ġalong": 3156, - "Ġalongside": 16263, - "Ġalors": 44475, - "Ġalot": 56238, - "Ġaloud": 70411, - "Ġalph": 64595, - "Ġalpha": 8287, - "Ġalphabet": 27790, - "Ġalphabetical": 83298, - "Ġalphanumeric": 98979, - "Ġalready": 2669, - "Ġalright": 50117, - "Ġals": 10712, - "Ġalso": 1083, - "Ġalt": 4797, - "Ġalta": 45362, - "Ġaltar": 50843, - "Ġalte": 43908, - "Ġalter": 11596, - "Ġalteration": 72581, - "Ġalterations": 59986, - "Ġaltercation": 97687, - "Ġaltered": 28752, - "Ġaltering": 59823, - "Ġaltern": 6919, - "Ġalternate": 24609, - "Ġalternating": 72362, - "Ġalternative": 10555, - "Ġalternatively": 68387, - "Ġalternatives": 26450, - "Ġalters": 87587, - "Ġalthough": 7892, - "Ġaltijd": 87769, - "Ġaltitude": 35858, - "Ġalto": 23299, - "Ġaltogether": 30055, - "Ġaltre": 93560, - "Ġaltri": 66168, - "Ġaltro": 91917, - "Ġaltru": 92492, - "Ġaltura": 59252, - "Ġaltın": 133518, - "Ġaltında": 131564, - "Ġalum": 32960, - "Ġaluminium": 54893, - "Ġaluminum": 24649, - "Ġalumni": 51021, - "Ġalumno": 98095, - "Ġalumnos": 97859, - "Ġaluno": 76260, - "Ġalunos": 93144, - "Ġalways": 2677, - "Ġalém": 83669, - "Ġalın": 128925, - "ĠalÄ±ÅŁ": 141863, - "ĠalÄ±ÅŁver": 141864, - "ĠalÄ±ÅŁveriÅŁ": 141865, - "Ġam": 1079, - "Ġama": 70762, - "Ġamacı": 128092, - "Ġamacıyla": 139854, - "Ġamalg": 89765, - "Ġamassed": 92150, - "Ġamat": 42133, - "Ġamateur": 18566, - "Ġamateurs": 75550, - "Ġamatør": 72528, - "Ġamazed": 45204, - "Ġamazing": 7897, - "Ġamazingly": 62515, - "Ġamazon": 38416, - "Ġamb": 8873, - "Ġambassador": 36656, - "Ġambassadors": 95562, - "Ġamber": 67605, - "Ġambiance": 94573, - "Ġambient": 34188, - "Ġambiente": 66413, - "Ġambigu": 61297, - "Ġambiguity": 71768, - "Ġambiguous": 54761, - "Ġambit": 29398, - "Ġambition": 44615, - "Ġambitions": 50466, - "Ġambitious": 31755, - "Ġambos": 90693, - "Ġambulance": 50532, - "Ġambush": 78965, - "Ġamd": 75562, - "Ġamen": 29119, - "Ġamend": 29469, - "Ġamended": 29911, - "Ġamendment": 27139, - "Ġamendments": 40593, - "Ġamenities": 35383, - "Ġamer": 26720, - "Ġameric": 65779, - "Ġamerica": 63666, - "Ġamerican": 38442, - "Ġamet": 27212, - "Ġami": 51727, - "Ġamid": 22617, - "Ġamidst": 64804, - "Ġamigo": 70211, - "Ġamigos": 56557, - "Ġamino": 41400, - "Ġamis": 86792, - "Ġammo": 37904, - "Ġammon": 68811, - "Ġammonia": 90903, - "Ġammunition": 36668, - "Ġamnesty": 85135, - "Ġamo": 86100, - "Ġamong": 4221, - "Ġamongst": 23183, - "Ġamor": 44165, - "Ġamore": 71275, - "Ġamort": 92264, - "Ġamount": 3311, - "Ġamounted": 73219, - "Ġamounts": 14713, - "Ġamour": 98153, - "Ġamp": 22758, - "Ġamph": 64992, - "Ġamphib": 87922, - "Ġampl": 22395, - "Ġample": 41753, - "Ġamplified": 82498, - "Ġamplifier": 60066, - "Ġamplify": 96068, - "Ġamplitude": 44109, - "Ġamps": 79962, - "Ġamsterdam": 55939, - "Ġamt": 61169, - "Ġamused": 85224, - "Ġamusement": 61368, - "Ġamusing": 59886, - "Ġamy": 63283, - "Ġaméric": 137391, - "Ġaméricain": 137392, - "Ġan": 458, - "Ġana": 40290, - "Ġanak": 83255, - "Ġanal": 3181, - "Ġanale": 78237, - "Ġanalog": 23400, - "Ġanalogous": 78183, - "Ġanalogue": 90243, - "Ġanalogy": 55103, - "Ġanalsex": 89832, - "Ġanaly": 8510, - "Ġanalys": 21488, - "Ġanalyse": 48486, - "Ġanalysed": 66358, - "Ġanalyses": 27960, - "Ġanalysis": 6358, - "Ġanalyst": 18237, - "Ġanalysts": 30399, - "Ġanalytic": 78036, - "Ġanalytical": 42964, - "Ġanalytics": 27875, - "Ġanalyze": 23643, - "Ġanalyzed": 29139, - "Ġanalyzer": 54660, - "Ġanalyzes": 85181, - "Ġanalyzing": 41018, - "Ġanarch": 43465, - "Ġanarchist": 77331, - "Ġanarchists": 92034, - "Ġanatom": 74793, - "Ġanatomy": 61590, - "Ġanc": 45745, - "Ġance": 43160, - "Ġancest": 25918, - "Ġancestor": 45731, - "Ġancestors": 37518, - "Ġancestral": 77671, - "Ġancestry": 64904, - "Ġanch": 33230, - "Ġanche": 28057, - "Ġanchor": 17105, - "Ġanchored": 77119, - "Ġanchors": 55439, - "Ġancient": 13833, - "Ġancor": 60891, - "Ġancora": 63414, - "Ġand": 323, - "Ġanda": 44001, - "Ġander": 61805, - "Ġandere": 32936, - "Ġanderen": 38684, - "Ġanders": 66653, - "Ġandra": 89814, - "Ġandre": 59672, - "Ġandroid": 2103, - "Ġandroidx": 9527, - "Ġanecd": 49650, - "Ġanecdotes": 92966, - "Ġanesthesia": 90806, - "Ġanew": 92292, - "Ġang": 6454, - "Ġange": 32175, - "Ġangel": 33326, - "Ġangels": 45868, - "Ġanger": 19234, - "Ġangered": 86494, - "Ġangi": 91862, - "Ġangl": 55304, - "Ġanglais": 75085, - "Ġangle": 9210, - "Ġangled": 98310, - "Ġangles": 25941, - "Ġangrily": 86525, - "Ġangry": 18514, - "Ġangst": 90319, - "Ġanguish": 94922, - "Ġangular": 20314, - "Ġani": 51988, - "Ġanim": 3952, - "Ġanimal": 9864, - "Ġanimals": 9898, - "Ġanimate": 25063, - "ĠanimateWithDuration": 81456, - "Ġanimated": 11371, - "Ġanimation": 10355, - "Ġanimations": 26053, - "Ġanimator": 39044, - "Ġanime": 22809, - "Ġank": 70472, - "Ġankle": 38348, - "Ġankles": 89613, - "Ġanlam": 137511, - "Ġanlamı": 137512, - "ĠanlaÅŁ": 141596, - "ĠanlaÅŁma": 141168, - "ĠanlaÅŁÄ±l": 141597, - "Ġanmeld": 61061, - "Ġann": 2935, - "Ġanne": 85897, - "Ġannex": 53268, - "Ġanni": 44574, - "Ġannihil": 97345, - "Ġanniversary": 21582, - "Ġanno": 18344, - "Ġannon": 62891, - "Ġannonce": 45220, - "Ġannonces": 75739, - "Ġannot": 36042, - "Ġannotate": 88398, - "Ġannotated": 62851, - "Ġannotation": 21223, - "Ġannotations": 32207, - "Ġannounc": 5353, - "Ġannounce": 21483, - "Ġannounced": 7228, - "Ġannouncement": 17043, - "Ġannouncements": 44876, - "Ġannounces": 47682, - "Ġannouncing": 37687, - "Ġannoy": 37192, - "Ġannoyance": 90804, - "Ġannoyed": 56030, - "Ġannoying": 29831, - "Ġannual": 9775, - "Ġannually": 29071, - "Ġannum": 86657, - "Ġannunci": 28885, - "Ġannée": 75032, - "Ġannées": 64738, - "Ġano": 38024, - "Ġanom": 36682, - "Ġanomal": 69573, - "Ġanomalies": 74459, - "Ġanomaly": 62948, - "Ġanon": 74812, - "Ġanonym": 31148, - "Ġanonymity": 48512, - "Ġanonymous": 22151, - "Ġanonymously": 72151, - "Ġanos": 37001, - "Ġanother": 2441, - "Ġans": 8099, - "Ġansch": 93644, - "Ġansible": 90719, - "Ġanswer": 4226, - "Ġanswered": 18577, - "Ġanswering": 35764, - "Ġanswers": 11253, - "Ġant": 3196, - "Ġantagon": 42115, - "Ġantagonist": 81059, - "Ġante": 39424, - "Ġantenn": 71477, - "Ġantenna": 39932, - "Ġantennas": 86751, - "Ġanterior": 36129, - "Ġantes": 33335, - "Ġanth": 22268, - "Ġanthem": 55564, - "Ġanthology": 83008, - "Ġanthrop": 40316, - "Ġanthropology": 93944, - "Ġanti": 7147, - "Ġantib": 20554, - "Ġantibiot": 32109, - "Ġantibiotic": 59495, - "Ġantibiotics": 45750, - "Ġantibodies": 58754, - "Ġantibody": 61952, - "Ġantic": 87043, - "Ġanticip": 16552, - "Ġanticipate": 47148, - "Ġanticipated": 29099, - "Ġanticipating": 85259, - "Ġanticipation": 49819, - "Ġantics": 87123, - "Ġantid": 89587, - "Ġantidepress": 64111, - "Ġantig": 67837, - "Ġantigen": 81989, - "Ġantim": 78212, - "Ġantioxid": 45712, - "Ġantioxidant": 69239, - "Ġantioxidants": 80015, - "Ġantiqu": 60286, - "Ġantique": 46591, - "Ġantis": 64517, - "Ġantivirus": 79549, - "Ġantlr": 85269, - "Ġants": 60395, - "Ġanunci": 90833, - "Ġanus": 81308, - "Ġanv": 59481, - "Ġanvänd": 83948, - "Ġanx": 73784, - "Ġanxiety": 18056, - "Ġanxious": 37000, - "Ġany": 894, - "Ġanybody": 21061, - "Ġanyhow": 88964, - "Ġanymore": 14584, - "Ġanyone": 5489, - "Ġanything": 4113, - "Ġanytime": 29094, - "Ġanyway": 13657, - "Ġanyways": 62345, - "Ġanywhere": 12379, - "Ġanz": 77868, - "Ġanzeigen": 83797, - "Ġanál": 71290, - "Ġanálise": 138482, - "Ġanálisis": 141108, - "Ġao": 14845, - "Ġaos": 42814, - "Ġaoût": 137228, - "Ġap": 1443, - "Ġapa": 60593, - "Ġapache": 73406, - "Ġapar": 57216, - "Ġapare": 55170, - "Ġapart": 10747, - "Ġapartheid": 91959, - "Ġapartment": 13154, - "Ġapartments": 31629, - "Ġape": 84880, - "Ġapellido": 63885, - "Ġapenas": 46667, - "Ġaperture": 57001, - "Ġapex": 71527, - "Ġaph": 88011, - "Ġapi": 6330, - "ĠapiKey": 44924, - "ĠapiUrl": 88231, - "Ġapis": 97723, - "Ġapk": 58033, - "Ġapl": 52920, - "Ġaplic": 29440, - "Ġaplicación": 74327, - "Ġaplik": 76245, - "Ġapo": 72890, - "Ġapocalypse": 87814, - "Ġapolog": 20419, - "Ġapologies": 72173, - "Ġapologise": 81385, - "Ġapologize": 36879, - "Ġapologized": 56977, - "Ġapology": 40158, - "Ġapopt": 82946, - "Ġapoptosis": 94774, - "Ġapost": 38471, - "Ġapp": 906, - "ĠappBar": 42287, - "ĠappDelegate": 96255, - "ĠappId": 50556, - "ĠappName": 67819, - "Ġappalling": 84805, - "Ġappar": 33288, - "Ġapparatus": 40605, - "Ġappare": 96162, - "Ġapparel": 54325, - "Ġapparent": 9981, - "Ġapparently": 13812, - "Ġappart": 73656, - "Ġappe": 2642, - "Ġappeal": 14303, - "Ġappealed": 52282, - "Ġappealing": 32252, - "Ġappeals": 34630, - "Ġappear": 4994, - "Ġappearance": 11094, - "Ġappearances": 26255, - "Ġappeared": 9723, - "Ġappearing": 25377, - "Ġappears": 7952, - "Ġappel": 75090, - "Ġappell": 51951, - "Ġappellant": 89100, - "Ġappellate": 97487, - "Ġappend": 8737, - "ĠappendString": 96340, - "Ġappended": 51187, - "Ġappending": 93283, - "Ġappendix": 87577, - "Ġappet": 29068, - "Ġappetite": 37475, - "Ġappl": 17099, - "Ġapplaud": 51390, - "Ġapplauded": 95628, - "Ġapplause": 63526, - "Ġapple": 23268, - "Ġapples": 40676, - "Ġappliance": 55354, - "Ġappliances": 33702, - "Ġapplic": 4563, - "Ġapplicable": 8415, - "Ġapplicant": 31268, - "Ġapplicants": 31077, - "Ġapplication": 3766, - "ĠapplicationContext": 85299, - "ĠapplicationWill": 92367, - "Ġapplications": 8357, - "Ġapplied": 9251, - "Ġapplies": 16790, - "Ġapply": 3796, - "ĠapplyMiddleware": 83364, - "Ġapplying": 18950, - "Ġappoint": 9540, - "Ġappointed": 20822, - "Ġappointment": 17635, - "Ġappointments": 36156, - "Ġappraisal": 78292, - "Ġapprec": 9790, - "Ġappreciate": 15401, - "Ġappreciated": 25808, - "Ġappreciation": 34896, - "Ġappreh": 46191, - "Ġapprent": 45330, - "Ġapprentice": 82199, - "Ġapprentices": 71251, - "Ġappro": 2984, - "Ġapproach": 5486, - "Ġapproached": 24706, - "Ġapproaches": 19827, - "Ġapproaching": 29947, - "Ġappropri": 7185, - "Ġappropriate": 8311, - "Ġappropriated": 86413, - "Ġappropriately": 34901, - "Ġappropriation": 85640, - "Ġappropriations": 92566, - "Ġapproval": 14427, - "Ġapprovals": 82823, - "Ġapprove": 28151, - "Ġapproved": 11792, - "Ġapproves": 93830, - "Ġapproving": 76158, - "Ġapprox": 9848, - "Ġapproximate": 44868, - "Ġapproximately": 13187, - "Ġapproximation": 56204, - "Ġappré": 141758, - "Ġappréci": 141759, - "Ġapps": 10500, - "Ġapr": 21049, - "Ġaprend": 67346, - "Ġaprender": 92717, - "Ġapresent": 54762, - "Ġapril": 73700, - "Ġapro": 75855, - "Ġaprove": 87801, - "Ġaprox": 72233, - "Ġaproxim": 94424, - "Ġaprès": 41038, - "Ġapt": 20095, - "Ġapós": 75081, - "Ġaqu": 15355, - "Ġaquarium": 61183, - "Ġaquatic": 71391, - "Ġaque": 65200, - "Ġaquel": 78276, - "Ġaqui": 43576, - "ĠaquÃŃ": 53089, - "Ġar": 796, - "Ġara": 127238, - "Ġarab": 51312, - "Ġaracı": 136296, - "Ġaras": 126448, - "Ġarasında": 129010, - "Ġarasındaki": 138451, - "Ġaraç": 132048, - "ĠaraÅŁtırma": 134349, - "Ġarb": 58488, - "Ġarbe": 80044, - "Ġarbit": 16699, - "Ġarbitr": 57957, - "Ġarbitrarily": 85657, - "Ġarbitrary": 24168, - "Ġarbitration": 53608, - "Ġarc": 15580, - "Ġarcade": 47212, - "Ġarcane": 89353, - "Ġarch": 5325, - "Ġarchae": 38111, - "Ġarchaeological": 68537, - "Ġarchetype": 85157, - "Ġarchitect": 11470, - "Ġarchitects": 54935, - "Ġarchitectural": 42463, - "Ġarchitecture": 17646, - "Ġarchitectures": 77235, - "Ġarchival": 93947, - "Ġarchive": 18132, - "Ġarchived": 51993, - "Ġarchives": 38004, - "Ġarchivo": 29718, - "Ġarchivos": 87395, - "Ġarcpy": 91893, - "Ġarcs": 66750, - "Ġard": 83909, - "Ġardından": 131985, - "Ġare": 525, - "Ġarea": 3082, - "Ġareas": 5671, - "Ġaren": 7629, - "Ġarena": 24902, - "Ġarenas": 97667, - "Ġarg": 1392, - "Ġargc": 11844, - "Ġargent": 88144, - "Ġargparse": 22321, - "Ġargs": 2827, - "Ġarguably": 35559, - "Ġargue": 17585, - "Ġargued": 18280, - "Ġargues": 28533, - "Ġarguing": 29574, - "Ġargument": 5693, - "Ġarguments": 5977, - "Ġargv": 10213, - "Ġaria": 7131, - "Ġarise": 30789, - "Ġarisen": 89854, - "Ġarises": 47182, - "Ġarising": 39886, - "Ġarist": 63738, - "Ġarithmetic": 34784, - "Ġarity": 79932, - "Ġark": 55217, - "ĠarkadaÅŁ": 129255, - "Ġarm": 6773, - "Ġarma": 51605, - "Ġarmed": 17445, - "Ġarmies": 46883, - "Ġarmor": 20033, - "Ġarmored": 64645, - "Ġarmour": 46677, - "Ġarms": 11715, - "Ġarmy": 13390, - "Ġarom": 31269, - "Ġaroma": 54179, - "Ġaromatic": 81588, - "Ġarose": 49963, - "Ġarou": 65108, - "Ġaround": 2163, - "Ġarous": 74023, - "Ġarousal": 86817, - "Ġaroused": 91524, - "Ġarp": 98598, - "Ġarquivo": 43405, - "Ġarr": 2890, - "Ġarrang": 16700, - "Ġarrange": 30893, - "Ġarranged": 27802, - "Ġarrangement": 26112, - "Ġarrangements": 27804, - "Ġarranging": 76118, - "Ġarray": 1334, - "ĠarrayList": 47400, - "ĠarrayOf": 43254, - "ĠarrayWith": 61152, - "Ġarrays": 18386, - "Ġarreglo": 80581, - "Ġarrest": 8004, - "Ġarrested": 12517, - "Ġarresting": 83766, - "Ġarrests": 37711, - "Ġarriv": 67903, - "Ġarrival": 18647, - "Ġarrivals": 69047, - "Ġarrive": 17331, - "Ġarrived": 11465, - "Ġarrives": 29682, - "Ġarriving": 32011, - "Ġarrog": 43736, - "Ġarrogance": 82743, - "Ġarrogant": 65368, - "Ġarrow": 17921, - "Ġarrows": 36957, - "Ġarsch": 93236, - "Ġarsen": 86264, - "Ġarsenal": 56931, - "Ġarson": 86750, - "Ġart": 1947, - "Ġarte": 51348, - "Ġarter": 46257, - "Ġarterial": 79835, - "Ġarteries": 84548, - "Ġartery": 64315, - "Ġarthritis": 54552, - "Ġartic": 27564, - "Ġarticle": 4549, - "Ġarticles": 9709, - "Ġarticulate": 68218, - "Ġarticulated": 82180, - "Ġartifact": 36639, - "Ġartifacts": 35036, - "Ġartificial": 20443, - "Ġartificially": 77120, - "Ġartikel": 88849, - "Ġartillery": 53135, - "Ġartisan": 66119, - "Ġartisans": 99030, - "Ġartist": 10049, - "Ġartistic": 31592, - "Ġartists": 13511, - "Ġarts": 18560, - "Ġarttır": 141653, - "Ġartwork": 28309, - "Ġartworks": 96449, - "Ġarty": 135024, - "Ġartyku": 135025, - "ĠartykuÅĤ": 135026, - "ĠartÃŃculo": 79589, - "Ġartık": 131818, - "Ġartır": 137080, - "ĠartÄ±ÅŁ": 140542, - "Ġary": 72921, - "Ġas": 438, - "Ġasbestos": 76135, - "Ġasc": 14601, - "Ġascend": 75312, - "Ġascending": 35388, - "Ġascent": 74989, - "Ġascertain": 76177, - "Ġascii": 47120, - "Ġaseg": 64744, - "Ġash": 23828, - "Ġashamed": 50875, - "Ġashes": 66001, - "Ġasi": 46631, - "Ġasia": 83499, - "Ġasian": 35625, - "Ġasiat": 73848, - "Ġaside": 15663, - "Ġasign": 60079, - "Ġask": 2548, - "Ġasked": 4588, - "Ġasking": 10161, - "Ġasks": 17064, - "Ġasleep": 32073, - "Ġaslı": 138714, - "Ġaslında": 138715, - "Ġasm": 32828, - "Ġasn": 75252, - "Ġasoci": 68996, - "Ġaspect": 12893, - "Ġaspects": 13566, - "Ġasphalt": 45262, - "Ġaspir": 24663, - "Ġaspiration": 97641, - "Ġaspirations": 57422, - "Ġaspire": 83511, - "Ġaspiring": 59113, - "Ġass": 1071, - "Ġassail": 78688, - "Ġassass": 25732, - "Ġassassin": 67669, - "Ġassassination": 48317, - "Ġassault": 11703, - "Ġassaulted": 45571, - "Ġassaulting": 78226, - "Ġassaults": 56819, - "Ġassay": 63933, - "Ġassays": 98492, - "Ġassemble": 41740, - "Ġassembled": 34005, - "Ġassembler": 88524, - "Ġassemblies": 61307, - "Ġassembling": 80659, - "Ġassembly": 14614, - "Ġassert": 2060, - "ĠassertEquals": 10037, - "ĠassertFalse": 44397, - "ĠassertNotNull": 44328, - "ĠassertNull": 72609, - "ĠassertThat": 16981, - "ĠassertTrue": 21627, - "Ġasserted": 49597, - "Ġasserting": 42425, - "Ġassertion": 27419, - "Ġassertions": 54836, - "Ġasserts": 56776, - "Ġasses": 79040, - "Ġassess": 8552, - "Ġassessed": 31348, - "Ġassessing": 46514, - "Ġassessment": 15449, - "Ġassessments": 40200, - "Ġasset": 9329, - "Ġassets": 11770, - "Ġassez": 78280, - "Ġassh": 48552, - "Ġasshole": 58863, - "Ġassign": 9793, - "Ġassignable": 89447, - "Ġassigned": 12607, - "Ġassigning": 60753, - "Ġassignment": 16319, - "Ġassignments": 31172, - "Ġassigns": 49912, - "Ġassim": 38954, - "Ġassist": 7789, - "Ġassistance": 12994, - "Ġassistant": 17847, - "Ġassistants": 56519, - "Ġassisted": 37961, - "Ġassisting": 45827, - "Ġassistir": 88515, - "Ġassists": 28844, - "Ġassms": 41071, - "Ġassoc": 59607, - "Ġassoci": 4097, - "Ġassociate": 21946, - "Ġassociated": 5815, - "Ġassociates": 39431, - "Ġassociation": 15010, - "Ġassociations": 29157, - "Ġassociative": 68903, - "Ġassort": 49934, - "Ġassorted": 83442, - "Ġassortment": 55295, - "Ġassum": 7736, - "Ġassume": 9658, - "Ġassumed": 19110, - "Ġassumes": 21484, - "Ġassuming": 25538, - "Ġassumption": 24335, - "Ġassumptions": 31846, - "Ġassurance": 43601, - "Ġassurances": 84045, - "Ġassure": 34915, - "Ġassured": 27378, - "Ġassures": 92987, - "Ġast": 11763, - "Ġaster": 33937, - "Ġasteroid": 54379, - "Ġasteroids": 84222, - "Ġasthma": 50543, - "Ġaston": 36373, - "Ġastonished": 99074, - "Ġastonishing": 48913, - "Ġastore": 91807, - "Ġastounding": 73054, - "Ġastr": 22311, - "Ġastro": 46704, - "Ġastrology": 90847, - "Ġastronaut": 46633, - "Ġastronauts": 68422, - "Ġastronom": 45282, - "Ġastronomers": 86787, - "Ġastronomical": 86183, - "Ġastronomy": 81113, - "Ġasylum": 32170, - "Ġasym": 53295, - "Ġasymmetric": 96829, - "Ġasympt": 96254, - "Ġasync": 3312, - "Ġasynchronous": 39007, - "Ġasynchronously": 67781, - "Ġasyncio": 44918, - "ĠasÃŃ": 36460, - "Ġat": 518, - "ĠatIndex": 92749, - "Ġata": 73476, - "Ġatan": 57846, - "Ġatas": 87418, - "Ġatau": 38372, - "Ġate": 29812, - "Ġatención": 80541, - "Ġatenção": 138314, - "ĠateÅŁ": 140367, - "Ġath": 11742, - "Ġathe": 37814, - "Ġatheist": 66364, - "Ġatheists": 78525, - "Ġathlete": 33780, - "Ġathletes": 22742, - "Ġathletic": 28603, - "Ġathleticism": 92074, - "Ġathletics": 73075, - "Ġativ": 68332, - "Ġatl": 70454, - "Ġatlas": 60932, - "Ġatleast": 89928, - "Ġatm": 69787, - "Ġatmos": 13720, - "Ġatmosphere": 16566, - "Ġatmospheric": 44375, - "Ġatof": 64957, - "Ġatoi": 25227, - "Ġatol": 88655, - "Ġatom": 19124, - "Ġatomic": 24510, - "Ġatoms": 32199, - "Ġatop": 45988, - "Ġatr": 29570, - "Ġatrav": 70406, - "Ġatravés": 78116, - "Ġatrib": 52012, - "Ġatroc": 57728, - "Ġatrocities": 71236, - "Ġatrás": 135486, - "Ġatt": 1619, - "Ġattach": 15498, - "Ġattached": 12392, - "Ġattaches": 84503, - "Ġattaching": 71808, - "Ġattachment": 19984, - "Ġattachments": 33679, - "Ġattack": 3359, - "Ġattacked": 18349, - "Ġattacker": 30710, - "Ġattackers": 40965, - "Ġattacking": 22818, - "Ġattacks": 8776, - "Ġattain": 35761, - "Ġattained": 62160, - "Ġattainment": 92865, - "Ġatte": 92281, - "Ġattempt": 4774, - "Ġattempted": 17201, - "Ġattempting": 19405, - "Ġattempts": 13553, - "Ġattend": 9417, - "Ġattendance": 27018, - "Ġattendant": 63922, - "Ġattended": 18178, - "Ġattendee": 93565, - "Ġattendees": 39185, - "Ġattending": 23218, - "Ġattends": 74012, - "Ġattent": 51209, - "Ġattention": 6529, - "Ġattentive": 72798, - "Ġattenu": 56632, - "Ġattenuation": 94118, - "Ġattest": 86917, - "Ġattic": 73621, - "Ġattire": 68160, - "Ġattitude": 18915, - "Ġattitudes": 32626, - "ĠattivitÃł": 131201, - "Ġattn": 97817, - "Ġattorney": 13747, - "Ġattorneys": 30334, - "Ġattr": 6376, - "Ġattract": 9320, - "Ġattracted": 28023, - "Ġattracting": 50547, - "Ġattraction": 32364, - "Ġattractions": 38491, - "Ġattractive": 18879, - "Ġattractiveness": 98945, - "Ġattracts": 60091, - "Ġattravers": 97307, - "Ġattrib": 17329, - "Ġattributable": 70426, - "Ġattribute": 7035, - "ĠattributeName": 93259, - "Ġattributed": 29606, - "Ġattributes": 8201, - "Ġattribution": 62024, - "Ġattrs": 16204, - "Ġatual": 40875, - "Ġaté": 38483, - "Ġau": 7906, - "Ġauc": 45953, - "Ġauch": 10928, - "Ġauction": 21165, - "Ġauctions": 70132, - "Ġaucun": 84524, - "Ġaud": 6136, - "Ġaudi": 46368, - "Ġaudible": 79315, - "Ġaudience": 10650, - "Ġaudiences": 29894, - "Ġaudio": 7699, - "Ġaudit": 24275, - "Ġauditing": 92496, - "Ġaudition": 61888, - "Ġauditor": 53306, - "Ġauditory": 82529, - "Ġaudits": 74520, - "Ġauf": 7219, - "Ġaug": 19303, - "Ġaugment": 48706, - "Ġaugmentation": 78785, - "Ġaugmented": 55988, - "Ġaugust": 70619, - "Ġaujourd": 74704, - "Ġaument": 40780, - "Ġaumento": 81636, - "Ġaun": 89168, - "Ġaunque": 58366, - "Ġaunt": 50066, - "Ġaup": 97444, - "Ġauprès": 138807, - "Ġaur": 43421, - "Ġaura": 39042, - "Ġaure": 85668, - "Ġaus": 9421, - "Ġausge": 65078, - "Ġausp": 89096, - "Ġauss": 24131, - "Ġaussi": 27363, - "Ġaust": 99106, - "Ġausterity": 60530, - "Ġaustralia": 43232, - "Ġaut": 3078, - "Ġaute": 88037, - "Ġauth": 4166, - "ĠauthDomain": 97906, - "ĠauthService": 64696, - "ĠauthToken": 86022, - "Ġauthentic": 13210, - "Ġauthenticate": 33189, - "Ġauthenticated": 37260, - "Ġauthentication": 16653, - "Ġauthenticity": 53248, - "Ġauthor": 3150, - "Ġauthored": 66113, - "Ġauthorised": 69384, - "Ġauthoritarian": 57921, - "Ġauthoritative": 64593, - "Ġauthorities": 11276, - "Ġauthority": 11198, - "Ġauthorization": 23715, - "Ġauthorize": 36826, - "Ġauthorized": 18630, - "Ġauthors": 12014, - "Ġautism": 37181, - "Ġautistic": 80291, - "Ġauto": 3233, - "ĠautoComplete": 72486, - "ĠautoFocus": 94481, - "Ġautob": 98999, - "Ġautobi": 67065, - "Ġautobiography": 90437, - "Ġautoc": 56153, - "Ġautocomplete": 31705, - "Ġautof": 44445, - "Ġautofocus": 53032, - "Ġautogenerated": 81833, - "Ġautoimmune": 87091, - "Ġautoload": 80497, - "Ġautom": 5006, - "Ġautomat": 60752, - "Ġautomate": 68611, - "Ġautomated": 27498, - "Ġautomatic": 16962, - "Ġautomatically": 9463, - "Ġautomation": 32662, - "Ġautomobile": 34428, - "Ġautomobiles": 78548, - "Ġautomotive": 39408, - "Ġautomát": 79347, - "Ġautomáticamente": 83587, - "Ġautonom": 94003, - "Ġautonomous": 38193, - "Ġautonomy": 50260, - "Ġautop": 71158, - "Ġautoplay": 57310, - "Ġautopsy": 75801, - "Ġautor": 26767, - "Ġautorelease": 74566, - "Ġautos": 46872, - "Ġautour": 88953, - "Ġautre": 46738, - "Ġautres": 45006, - "Ġautumn": 41674, - "Ġaux": 10047, - "Ġauxiliary": 53458, - "Ġav": 1822, - "Ġava": 83664, - "Ġavail": 37911, - "Ġavailability": 18048, - "Ġavailable": 2500, - "Ġavait": 49490, - "Ġaval": 40535, - "Ġavalanche": 95594, - "Ġavalia": 139270, - "Ġavaliação": 138044, - "Ġavaliações": 139271, - "Ġavant": 32570, - "Ġavanz": 98292, - "Ġavatar": 20701, - "Ġave": 41638, - "Ġavec": 9753, - "Ġavent": 90706, - "Ġavenue": 61703, - "Ġavenues": 72134, - "Ġaver": 17302, - "Ġaverage": 5461, - "Ġaveraged": 36856, - "Ġaverages": 48820, - "Ġaveraging": 43764, - "Ġavere": 82825, - "Ġavez": 46492, - "Ġavg": 19712, - "Ġavi": 98188, - "Ġaviation": 45530, - "Ġavid": 55553, - "Ġavis": 54747, - "Ġavocado": 67246, - "Ġavoid": 5648, - "Ġavoidance": 64311, - "Ġavoided": 30790, - "Ġavoiding": 30426, - "Ġavoids": 54852, - "Ġavoir": 38829, - "Ġavons": 55938, - "Ġavril": 99036, - "Ġaw": 1360, - "Ġawait": 2535, - "Ġawaited": 78478, - "Ġawaiting": 43988, - "Ġawaits": 70804, - "Ġawake": 34347, - "ĠawakeFromNib": 74949, - "Ġawaken": 41418, - "Ġawakened": 89247, - "Ġawakening": 74049, - "Ġaward": 10084, - "Ġawarded": 21328, - "Ġawards": 22344, - "Ġaware": 7853, - "Ġawareness": 17526, - "Ġaway": 3123, - "Ġawe": 50417, - "Ġawesome": 12456, - "Ġawful": 24607, - "Ġawhile": 50469, - "Ġawk": 19976, - "Ġawkward": 28759, - "Ġaws": 31521, - "Ġax": 3859, - "Ġaxe": 50464, - "Ġaxes": 24745, - "Ġaxial": 97180, - "Ġaxiom": 88177, - "Ġaxios": 12974, - "Ġaxis": 8024, - "Ġaxle": 72100, - "Ġaxs": 75162, - "Ġay": 18898, - "Ġayant": 85771, - "Ġaynı": 129301, - "Ġayr": 135502, - "Ġayrı": 133353, - "Ġayrıca": 137241, - "Ġayrıl": 135503, - "Ġayud": 58137, - "Ġayuda": 73659, - "Ġayında": 139830, - "Ġayır": 141523, - "Ġaz": 12376, - "Ġazi": 74062, - "Ġazimuth": 91960, - "Ġazt": 97894, - "Ġazure": 76530, - "Ġaç": 62910, - "Ġaçık": 129245, - "Ġaçıkl": 130165, - "Ġaçıklama": 130166, - "Ġaçıl": 131358, - "Ġaçıs": 136697, - "Ġaçısından": 136698, - "Ġañ": 72186, - "Ġaño": 35816, - "Ġaños": 26748, - "Ġaún": 77558, - "ĠaÄŁ": 127485, - "ĠaÄŁrı": 140757, - "Ġaģır": 133504, - "ĠaÅŁ": 125409, - "ĠaÅŁama": 139898, - "ĠaÅŁaģı": 128120, - "ĠaÅŁaģıd": 142961, - "ĠaÅŁaģıdaki": 142962, - "ĠaÅŁk": 138124, - "Ġb": 293, - "Ġba": 12789, - "Ġbab": 16584, - "Ġbabe": 40246, - "Ġbabel": 79826, - "Ġbabes": 59500, - "Ġbabies": 23920, - "Ġbaby": 8770, - "Ġbabys": 70583, - "Ġbac": 79880, - "Ġbach": 47019, - "Ġbacheca": 61545, - "Ġbachelor": 48583, - "Ġback": 1182, - "ĠbackButton": 89726, - "Ġbackbone": 55427, - "Ġbackdrop": 38477, - "Ġbacked": 21411, - "Ġbackend": 19163, - "Ġbackers": 53630, - "Ġbackground": 4004, - "ĠbackgroundColor": 12694, - "ĠbackgroundImage": 67029, - "Ġbackgrounds": 35476, - "Ġbacking": 24668, - "Ġbacklash": 47056, - "Ġbacklight": 94322, - "Ġbacklog": 70722, - "Ġbackpack": 33136, - "Ġbackpage": 94959, - "Ġbacks": 27578, - "Ġbackstage": 89725, - "Ġbackstory": 92271, - "Ġbacktrack": 98921, - "Ġbackup": 15725, - "Ġbackups": 59666, - "Ġbackward": 27555, - "Ġbackwards": 28412, - "Ġbackyard": 35660, - "Ġbacon": 40352, - "Ġbacter": 17398, - "Ġbacteria": 23157, - "Ġbacterial": 44864, - "Ġbad": 3873, - "Ġbada": 143378, - "Ġbadass": 86302, - "ĠbadaÅĦ": 143379, - "Ġbadge": 23961, - "Ġbadges": 60434, - "Ġbadly": 24569, - "Ġbaff": 64416, - "Ġbag": 8968, - "Ġbaggage": 60549, - "Ġbagi": 85650, - "Ġbags": 17899, - "Ġbah": 41929, - "Ġbahwa": 77336, - "Ġbahçe": 143827, - "Ġbaik": 79187, - "Ġbail": 24479, - "Ġbailout": 74664, - "Ġbais": 96904, - "Ġbaise": 34816, - "Ġbaiser": 78682, - "Ġbait": 48060, - "Ġbaj": 90741, - "Ġbaja": 87648, - "Ġbajo": 62412, - "Ġbak": 36203, - "Ġbake": 22544, - "Ġbakeca": 39957, - "Ġbaked": 40678, - "Ġbakeka": 81943, - "Ġbaker": 75828, - "Ġbakery": 65144, - "Ġbaking": 27815, - "Ġbakım": 134364, - "Ġbal": 9642, - "Ġbalance": 8172, - "Ġbalanced": 23831, - "Ġbalances": 38854, - "Ġbalancing": 43363, - "Ġbalcon": 37305, - "Ġbalcony": 43852, - "Ġbald": 47553, - "Ġbalk": 91982, - "Ġball": 4935, - "Ġballet": 70210, - "Ġballistic": 59533, - "Ġballo": 56853, - "Ġballoon": 46756, - "Ġballoons": 69480, - "Ġballot": 25853, - "Ġballots": 48636, - "Ġballpark": 96741, - "Ġballs": 20332, - "Ġbam": 41304, - "Ġbamb": 75993, - "Ġbamboo": 58882, - "Ġban": 8943, - "Ġbanana": 43096, - "Ġbananas": 67342, - "Ġbanc": 68307, - "Ġbanco": 52465, - "Ġband": 7055, - "Ġbanda": 96111, - "Ġbande": 94038, - "Ġbands": 20892, - "Ġbandwidth": 33394, - "Ġbang": 25441, - "Ġbanged": 93599, - "Ġbanging": 86111, - "Ġbank": 6073, - "Ġbanker": 71659, - "Ġbankers": 63143, - "Ġbanking": 22798, - "Ġbankrupt": 28220, - "Ġbankruptcy": 35607, - "Ġbanks": 13959, - "Ġbanned": 20834, - "Ġbanner": 23323, - "Ġbanners": 58372, - "Ġbanning": 48536, - "Ġbanquet": 86738, - "Ġbans": 47509, - "Ġbanyak": 61892, - "Ġbapt": 42624, - "Ġbaptism": 73827, - "Ġbaptized": 89125, - "Ġbar": 3619, - "Ġbara": 81087, - "Ġbarang": 95704, - "Ġbarbar": 53390, - "Ġbarbecue": 61212, - "Ġbarber": 95994, - "Ġbarcelona": 81414, - "Ġbarcode": 49407, - "Ġbard": 41810, - "Ġbardzo": 56858, - "Ġbare": 12461, - "Ġbarely": 19460, - "Ġbarg": 25881, - "Ġbargain": 44563, - "Ġbargaining": 54209, - "Ġbark": 53742, - "Ġbarley": 80717, - "Ġbarn": 32319, - "Ġbarr": 30939, - "Ġbarracks": 94764, - "Ġbarrage": 80590, - "Ġbarred": 58944, - "Ġbarrel": 20311, - "Ġbarrels": 41875, - "Ġbarren": 93988, - "Ġbarric": 77580, - "Ġbarrier": 22103, - "Ġbarriers": 29640, - "Ġbarring": 86699, - "Ġbars": 15904, - "Ġbart": 61518, - "Ġbartender": 90405, - "Ġbaru": 68343, - "Ġbas": 3046, - "Ġbasal": 79610, - "Ġbase": 2331, - "ĠbasePath": 71577, - "ĠbaseURL": 56741, - "ĠbaseUrl": 39775, - "Ġbaseball": 19507, - "Ġbased": 3118, - "Ġbaseline": 25869, - "Ġbaseman": 83303, - "Ġbasement": 30641, - "Ġbasename": 38196, - "Ġbases": 23092, - "Ġbash": 27023, - "Ġbasic": 6770, - "Ġbasically": 13221, - "Ġbasics": 31774, - "Ġbasil": 67086, - "Ġbasin": 57209, - "Ġbasis": 8037, - "Ġbask": 138832, - "Ġbasket": 14024, - "Ġbasketball": 19240, - "Ġbaskets": 68344, - "Ġbaskı": 138833, - "Ġbass": 21529, - "Ġbast": 31977, - "Ġbastante": 70562, - "Ġbastard": 73577, - "Ġbasın": 138010, - "Ġbat": 15743, - "Ġbatch": 7162, - "ĠbatchSize": 97400, - "Ġbatches": 44792, - "Ġbatching": 84256, - "Ġbath": 8885, - "Ġbathing": 72409, - "Ġbathroom": 14852, - "Ġbathrooms": 39883, - "Ġbaths": 58200, - "Ġbathtub": 80088, - "Ġbats": 42208, - "Ġbatt": 14754, - "Ġbattalion": 90416, - "Ġbatter": 8745, - "Ġbattered": 79656, - "Ġbatteries": 26264, - "Ġbattery": 11602, - "Ġbatting": 50810, - "Ġbattle": 8049, - "Ġbattled": 74340, - "Ġbattlefield": 37386, - "Ġbattleground": 90566, - "Ġbattles": 24554, - "Ġbattling": 46236, - "Ġbaud": 56822, - "Ġbay": 22708, - "Ġbaz": 50247, - "Ġbazı": 130330, - "Ġbaño": 140521, - "ĠbaÄŁ": 125791, - "ĠbaÄŁl": 139159, - "ĠbaÄŁlant": 139160, - "ĠbaÄŁlantı": 139161, - "ĠbaÄŁlı": 132155, - "ĠbaÅŁ": 46555, - "ĠbaÅŁar": 137133, - "ĠbaÅŁarı": 132962, - "ĠbaÅŁarılı": 137134, - "ĠbaÅŁka": 129149, - "ĠbaÅŁladı": 131727, - "ĠbaÅŁlat": 137188, - "ĠbaÅŁlayan": 139324, - "ĠbaÅŁv": 135667, - "ĠbaÅŁvuru": 135668, - "ĠbaÅŁÄ±na": 139358, - "ĠbaÅŁÄ±nda": 137835, - "Ġbb": 16520, - "Ġbbc": 90626, - "Ġbbox": 29749, - "Ġbbw": 40760, - "Ġbc": 17916, - "Ġbcm": 56768, - "Ġbcrypt": 33520, - "Ġbd": 21486, - "Ġbdsm": 41697, - "Ġbe": 387, - "Ġbeach": 11321, - "Ġbeaches": 34809, - "Ġbeacon": 51302, - "Ġbead": 74507, - "Ġbeads": 54208, - "Ġbeam": 23418, - "Ġbeams": 49945, - "Ġbean": 20427, - "Ġbeans": 26896, - "Ġbear": 11722, - "Ġbeard": 47688, - "Ġbearer": 69771, - "Ġbearing": 18043, - "Ġbearings": 34453, - "Ġbears": 29724, - "Ġbeast": 31136, - "Ġbeasts": 56436, - "Ġbeat": 9382, - "Ġbeaten": 30294, - "Ġbeating": 26150, - "Ġbeats": 33327, - "Ġbeau": 70906, - "Ġbeaucoup": 47388, - "Ġbeaut": 4912, - "Ġbeautiful": 6233, - "Ġbeautifully": 31619, - "Ġbeauty": 13143, - "Ġbeb": 67046, - "Ġbeberapa": 84938, - "Ġbecame": 6116, - "Ġbecause": 1576, - "Ġbeck": 91086, - "Ġbecome": 3635, - "Ġbecomes": 9044, - "Ġbecoming": 10454, - "Ġbed": 4845, - "Ġbedding": 60153, - "Ġbedeut": 81831, - "Ġbedroom": 13829, - "Ġbedrooms": 27589, - "Ġbeds": 26938, - "Ġbedside": 95703, - "Ġbedtime": 88507, - "Ġbee": 37228, - "Ġbeef": 24317, - "Ġbeen": 1012, - "Ġbeep": 90954, - "Ġbeer": 12883, - "Ġbeers": 36966, - "Ġbees": 39458, - "Ġbeet": 48012, - "Ġbeetle": 97386, - "Ġbef": 56946, - "Ġbefind": 81616, - "Ġbefore": 1573, - "ĠbeforeEach": 17723, - "ĠbeforeSend": 91512, - "Ġbeforehand": 51059, - "Ġbeg": 2148, - "Ġbegan": 6009, - "Ġbegged": 79292, - "Ġbegging": 59106, - "Ġbegin": 3161, - "Ġbeginner": 48948, - "Ġbeginners": 46850, - "Ġbeginning": 7167, - "Ġbeginnings": 66382, - "Ġbegins": 12033, - "Ġbegr": 87541, - "Ġbegs": 85201, - "Ġbegun": 21376, - "Ġbeh": 2755, - "Ġbehalf": 17522, - "Ġbehand": 72202, - "Ġbehave": 35692, - "Ġbehaved": 88731, - "Ġbehaves": 73057, - "Ġbehaving": 86557, - "Ġbehavior": 7709, - "Ġbehavioral": 35595, - "Ġbehaviors": 27099, - "Ġbehaviour": 16999, - "Ġbehavioural": 87879, - "Ġbehaviours": 70077, - "Ġbehind": 4815, - "Ġbehold": 56115, - "Ġbei": 13279, - "Ġbeide": 97144, - "Ġbeiden": 69791, - "Ġbeige": 78265, - "Ġbeim": 28789, - "Ġbeing": 1660, - "Ġbeings": 22977, - "Ġbek": 49933, - "Ġbekan": 61606, - "Ġbekannt": 81331, - "Ġbekom": 93077, - "Ġbekommen": 74675, - "Ġbel": 1656, - "Ġbelang": 83246, - "Ġbele": 70056, - "Ġbelie": 2818, - "Ġbelief": 16396, - "Ġbeliefs": 20799, - "Ġbelievable": 91395, - "Ġbelieve": 4411, - "Ġbelieved": 11585, - "Ġbeliever": 61279, - "Ġbelievers": 50913, - "Ġbelieves": 13605, - "Ġbelieving": 33990, - "Ġbell": 28419, - "Ġbella": 96460, - "Ġbelle": 38792, - "Ġbells": 60694, - "Ġbelly": 35417, - "Ġbelong": 9173, - "Ġbelonged": 45859, - "Ġbelonging": 32052, - "Ġbelongings": 62928, - "Ġbelongs": 17180, - "Ġbeloved": 27430, - "Ġbelow": 3685, - "Ġbelt": 19125, - "Ġbelts": 52679, - "Ġbelum": 90757, - "Ġbem": 31915, - "Ġben": 3318, - "Ġbench": 13425, - "Ġbenches": 78409, - "Ġbenchmark": 28431, - "Ġbenchmarks": 62019, - "Ġbend": 36820, - "Ġbending": 57118, - "Ġbends": 92797, - "Ġbene": 19750, - "Ġbeneath": 23969, - "Ġbenef": 4177, - "Ġbenefici": 36945, - "Ġbeneficial": 23699, - "Ġbeneficiaries": 60568, - "Ġbeneficiary": 62832, - "Ġbeneficiation": 78219, - "Ġbenefit": 8760, - "Ġbenefited": 55028, - "Ġbenefiting": 82915, - "Ġbenefits": 7567, - "Ġbenign": 64209, - "Ġbent": 29180, - "Ġbenz": 70946, - "Ġbenöt": 91304, - "Ġber": 10207, - "Ġbere": 26933, - "Ġbereits": 47143, - "Ġberg": 45885, - "Ġbergen": 77325, - "Ġberhasil": 75582, - "Ġberk": 96583, - "Ġberlin": 44581, - "Ġbern": 89263, - "Ġberries": 62394, - "Ġberry": 85088, - "Ġbers": 58554, - "Ġbert": 67099, - "Ġberth": 95447, - "Ġbes": 9057, - "Ġbesar": 84885, - "Ġbesch": 41852, - "Ġbeside": 29388, - "Ġbesides": 27758, - "Ġbesie": 91628, - "Ġbesoin": 62569, - "Ġbesonders": 75590, - "Ġbespoke": 75549, - "Ġbesser": 70336, - "Ġbest": 1850, - "Ġbeste": 28822, - "Ġbesteht": 98421, - "Ġbestellen": 97791, - "Ġbesten": 52747, - "Ġbestimm": 94718, - "Ġbestowed": 94729, - "Ġbestselling": 70902, - "Ġbet": 1274, - "Ġbeta": 13440, - "Ġbetr": 81314, - "Ġbetray": 33468, - "Ġbetrayal": 67276, - "Ġbetrayed": 64297, - "Ġbets": 42077, - "Ġbetter": 2664, - "Ġbetting": 25181, - "Ġbetween": 1948, - "Ġbeurette": 81712, - "Ġbev": 94808, - "Ġbeverage": 42350, - "Ġbeverages": 46397, - "Ġbevor": 94505, - "Ġbew": 26956, - "Ġbeware": 83805, - "Ġbewild": 98674, - "Ġbey": 7732, - "Ġbeyond": 7797, - "Ġbez": 22996, - "Ġbezier": 83066, - "ĠbezpieczeÅĦst": 142329, - "ĠbezpieczeÅĦstwa": 142330, - "Ġbezpo": 138350, - "ĠbezpoÅĽ": 138351, - "ĠbezpoÅĽredni": 138352, - "ĠbeÄŁ": 139264, - "ĠbeÄŁen": 139265, - "Ġbf": 39093, - "Ġbfd": 94047, - "Ġbfs": 66564, - "Ġbg": 8951, - "ĠbgColor": 73130, - "Ġbgcolor": 30195, - "Ġbh": 42989, - "Ġbi": 6032, - "Ġbian": 96489, - "Ġbias": 15470, - "Ġbiased": 47661, - "Ġbiases": 49083, - "Ġbib": 23829, - "Ġbible": 60201, - "Ġbibli": 43515, - "Ġbiblical": 52540, - "Ġbibliography": 93698, - "Ġbic": 59731, - "Ġbicy": 51417, - "Ġbicycle": 34986, - "Ġbicycles": 72861, - "Ġbid": 14103, - "Ġbidder": 77531, - "Ġbidding": 48400, - "Ġbidi": 79922, - "Ġbids": 43499, - "Ġbied": 97476, - "Ġbien": 14370, - "Ġbieten": 66238, - "Ġbietet": 60729, - "Ġbif": 91540, - "Ġbig": 2409, - "Ġbigger": 11243, - "Ġbiggest": 8538, - "Ġbigint": 79663, - "Ġbigot": 65703, - "Ġbigotry": 76746, - "Ġbij": 22424, - "Ġbik": 37545, - "Ġbike": 12963, - "Ġbikes": 30453, - "Ġbiking": 66080, - "Ġbikini": 54205, - "Ġbil": 20316, - "Ġbilateral": 51203, - "Ġbild": 71211, - "Ġbilder": 33700, - "Ġbile": 72294, - "Ġbilingual": 90289, - "Ġbill": 4031, - "Ġbillboard": 85206, - "Ġbilled": 49446, - "Ġbilleder": 95440, - "Ġbillig": 95139, - "Ġbilling": 33531, - "Ġbillion": 7094, - "Ġbillionaire": 46694, - "Ġbillionaires": 89286, - "Ġbillions": 32051, - "Ġbills": 18610, - "Ġbin": 9544, - "Ġbinaries": 69737, - "Ġbinary": 7868, - "Ġbind": 10719, - "ĠbindActionCreators": 78220, - "Ġbinder": 54014, - "Ġbinding": 10970, - "Ġbindings": 35700, - "Ġbinds": 57485, - "Ġbinge": 72822, - "Ġbingo": 77024, - "Ġbinnen": 82985, - "Ġbins": 28518, - "Ġbio": 16905, - "Ġbiochemical": 92432, - "Ġbiod": 55494, - "Ġbiodiversity": 72019, - "Ġbiography": 47245, - "Ġbiological": 23275, - "Ġbiologist": 87604, - "Ġbiology": 33358, - "Ġbiom": 38438, - "Ġbiomass": 57658, - "Ġbiome": 83610, - "Ġbiomedical": 93512, - "Ġbiopsy": 98547, - "Ġbios": 48454, - "Ġbip": 28878, - "Ġbipartisan": 50908, - "Ġbipolar": 64819, - "Ġbir": 15248, - "Ġbird": 11958, - "Ġbirds": 19654, - "Ġbirka": 137653, - "Ġbirkaç": 137654, - "Ġbirth": 7194, - "Ġbirthday": 15198, - "Ġbirthdays": 91850, - "Ġbirths": 65232, - "Ġbirç": 131653, - "Ġbirçok": 131654, - "Ġbis": 14840, - "Ġbisa": 39988, - "Ġbisc": 59459, - "Ġbiscuits": 85976, - "Ġbisexual": 55732, - "Ġbisher": 96042, - "Ġbishop": 53206, - "Ġbishops": 65623, - "Ġbist": 77528, - "Ġbit": 2699, - "Ġbitch": 39430, - "Ġbitcoin": 17873, - "Ġbitcoins": 57002, - "Ġbite": 22721, - "Ġbites": 48333, - "Ġbiting": 67096, - "Ġbitmap": 19746, - "Ġbitmask": 90961, - "Ġbitrate": 82643, - "Ġbits": 9472, - "Ġbitte": 67382, - "Ġbitten": 77449, - "Ġbitter": 25180, - "Ġbitterly": 98845, - "Ġbitterness": 78996, - "Ġbitwise": 97970, - "Ġbiz": 42378, - "Ġbizarre": 32188, - "Ġbiç": 137454, - "Ġbiçim": 137455, - "Ġbiên": 135547, - "Ġbiến": 128871, - "Ġbiết": 128345, - "Ġbiá»ĥn": 130027, - "Ġbiá»ĥu": 129626, - "Ġbiá»ĩn": 137261, - "Ġbiá»ĩt": 128589, - "Ġbj": 91188, - "Ġbk": 66101, - "Ġbl": 1501, - "Ġbla": 84541, - "Ġblack": 3691, - "ĠblackColor": 75554, - "Ġblackjack": 57262, - "Ġblacklist": 66049, - "Ġblackmail": 87163, - "Ġblackout": 96404, - "Ġblacks": 38977, - "Ġbladder": 61464, - "Ġblade": 24838, - "Ġblades": 41642, - "Ġblah": 52561, - "Ġblame": 18555, - "Ġblamed": 35097, - "Ġblames": 85790, - "Ġblaming": 58671, - "Ġblanc": 63247, - "Ġblanco": 89547, - "Ġbland": 49431, - "Ġblank": 10113, - "Ġblanket": 38039, - "Ġblankets": 64612, - "Ġblanks": 78540, - "Ġblas": 48577, - "Ġblasph": 98059, - "Ġblast": 20671, - "Ġblasted": 62321, - "Ġblasting": 76152, - "Ġblasts": 74041, - "Ġblat": 50949, - "Ġblatant": 71447, - "Ġblatantly": 97154, - "Ġblaze": 62473, - "Ġblazing": 85250, - "Ġble": 12422, - "Ġbleach": 82351, - "Ġbleak": 75267, - "Ġbleed": 66006, - "Ġbleeding": 34663, - "Ġbleiben": 90556, - "Ġbleibt": 93985, - "Ġblend": 20334, - "Ġblended": 54545, - "Ġblender": 61795, - "Ġblending": 55841, - "Ġblends": 57843, - "Ġbless": 16072, - "Ġblessed": 32844, - "Ġblessing": 39049, - "Ġblessings": 55550, - "Ġblev": 71999, - "Ġblew": 41323, - "Ġbli": 59289, - "Ġblij": 73280, - "Ġblind": 18020, - "Ġblinded": 89116, - "Ġblindly": 88347, - "Ġblindness": 84415, - "Ġblinds": 66061, - "Ġblink": 33131, - "Ġblinked": 99032, - "Ġblinking": 84022, - "Ġblir": 57437, - "Ġbliss": 57945, - "Ġblister": 80692, - "Ġblitz": 71434, - "Ġblk": 40643, - "Ġblo": 14211, - "Ġblob": 23404, - "Ġblobs": 76899, - "Ġbloc": 40740, - "Ġblock": 2504, - "ĠblockDim": 80993, - "ĠblockIdx": 84279, - "ĠblockSize": 64178, - "Ġblockade": 76137, - "Ġblockbuster": 70997, - "Ġblockchain": 17944, - "Ġblocked": 19299, - "Ġblocker": 50910, - "Ġblockers": 83135, - "Ġblocking": 22188, - "Ġblocks": 10010, - "Ġblog": 5010, - "Ġblogger": 39181, - "Ġbloggers": 49243, - "Ġblogging": 41992, - "Ġbloginfo": 59681, - "Ġblogs": 25659, - "Ġblond": 44369, - "Ġblonde": 26026, - "Ġblood": 6543, - "Ġbloodstream": 99116, - "Ġbloody": 35177, - "Ġbloom": 51454, - "Ġblooms": 91789, - "Ġbloque": 70726, - "Ġbloss": 49723, - "Ġblossom": 88758, - "Ġblot": 80882, - "Ġblouse": 95945, - "Ġblow": 12244, - "Ġblowing": 40342, - "Ġblowjob": 37781, - "Ġblown": 35474, - "Ġblows": 45203, - "Ġblue": 6303, - "Ġblueprint": 52929, - "Ġblues": 43595, - "Ġbluetooth": 55601, - "Ġbluff": 96288, - "Ġblunt": 48670, - "Ġblur": 28513, - "Ġblurred": 72400, - "Ġblurry": 99055, - "Ġblush": 69226, - "Ġbm": 34868, - "Ġbmi": 91897, - "Ġbmp": 43301, - "Ġbn": 40597, - "Ġbo": 708, - "Ġboa": 81932, - "Ġboard": 4479, - "Ġboarded": 83469, - "Ġboarding": 48969, - "Ġboards": 20490, - "Ġboast": 58127, - "Ġboasted": 83212, - "Ġboasting": 83644, - "Ġboasts": 37019, - "Ġboat": 15328, - "Ġboats": 31631, - "Ġbob": 35192, - "Ġboca": 96206, - "Ġbod": 29011, - "Ġbodies": 12866, - "Ġbodily": 47031, - "Ġbody": 2487, - "ĠbodyParser": 49936, - "Ġbog": 34419, - "Ġbogus": 59920, - "Ġboil": 43690, - "Ġboiled": 65085, - "Ġboiler": 27625, - "Ġboilers": 68949, - "Ġboiling": 49837, - "Ġboils": 88955, - "Ġbois": 65204, - "Ġbol": 20771, - "Ġbola": 97187, - "Ġbold": 13939, - "Ġboldly": 94929, - "Ġbols": 88216, - "Ġbolster": 47127, - "Ġbolt": 31842, - "Ġbolts": 48839, - "Ġbom": 18167, - "Ġbomb": 12764, - "Ġbombard": 85462, - "Ġbombed": 88838, - "Ġbomber": 57526, - "Ġbombers": 68820, - "Ġbombing": 36331, - "Ġbombings": 73379, - "Ġbombs": 32506, - "Ġbon": 7814, - "Ġbona": 93069, - "Ġbond": 10815, - "Ġbondage": 42494, - "Ġbonded": 69141, - "Ġbonding": 63086, - "Ġbonds": 26363, - "Ġbone": 17240, - "Ġbones": 24854, - "Ġbonne": 50551, - "Ġbons": 81034, - "Ġbonus": 12037, - "Ġbonuses": 32221, - "Ġboo": 46270, - "Ġboob": 78142, - "Ġboobs": 39792, - "Ġbook": 2311, - "Ġbooked": 32970, - "Ġbooking": 21857, - "Ġbookings": 58520, - "Ġbooklet": 73243, - "Ġbookmark": 35149, - "Ġbookmarks": 60919, - "Ġbooks": 6467, - "Ġbookstore": 78661, - "Ġbool": 1807, - "Ġboolean": 2710, - "Ġboom": 29745, - "Ġbooming": 67690, - "Ġboon": 86001, - "Ġboost": 7760, - "Ġboosted": 64108, - "Ġbooster": 56432, - "Ġboosting": 54928, - "Ġboosts": 66132, - "Ġboot": 10459, - "Ġbooth": 35406, - "Ġbooths": 91159, - "Ġbootloader": 88164, - "Ġboots": 25236, - "Ġbootstrap": 26925, - "Ġbooty": 61602, - "Ġbooze": 88936, - "Ġbor": 31632, - "Ġbord": 37902, - "Ġbordel": 93697, - "Ġborder": 3886, - "ĠborderBottom": 55206, - "ĠborderColor": 35826, - "ĠborderRadius": 19208, - "ĠborderSide": 97655, - "ĠborderTop": 85983, - "ĠborderWidth": 44105, - "Ġbordered": 76217, - "Ġborderline": 88514, - "Ġborders": 23806, - "Ġbore": 38686, - "Ġbored": 33286, - "Ġboredom": 89826, - "Ġboring": 27759, - "Ġborn": 9223, - "Ġborne": 64062, - "Ġborough": 65741, - "Ġborr": 96552, - "Ġborrow": 17193, - "Ġborrowed": 45564, - "Ġborrower": 69619, - "Ġborrowers": 63388, - "Ġborrowing": 52575, - "Ġborç": 143222, - "Ġbos": 42646, - "Ġboss": 13392, - "Ġbosses": 41747, - "Ġbot": 10924, - "Ġbotanical": 97202, - "Ġboth": 2176, - "Ġbother": 20147, - "Ġbothered": 45276, - "Ġbothering": 90159, - "Ġbothers": 81354, - "Ġboto": 60779, - "Ġboton": 79467, - "Ġbots": 49529, - "Ġbott": 10936, - "Ġbottle": 16486, - "Ġbottled": 71078, - "Ġbottleneck": 87838, - "Ġbottles": 26376, - "Ġbottom": 5622, - "Ġbottoms": 92550, - "Ġbou": 29770, - "Ġbought": 10788, - "Ġbounce": 33682, - "Ġbounced": 69804, - "Ġbouncing": 64028, - "Ġbound": 6822, - "Ġboundaries": 22711, - "Ġboundary": 18732, - "Ġbounded": 61115, - "Ġbounding": 30618, - "Ġbounds": 14262, - "Ġbounty": 52423, - "Ġbouquet": 91613, - "Ġbour": 35579, - "Ġbourbon": 92748, - "Ġbourgeois": 52316, - "Ġbourgeoisie": 93786, - "Ġbout": 24623, - "Ġboutique": 52085, - "Ġbouts": 95171, - "Ġbow": 15273, - "Ġbowed": 84373, - "Ġbowel": 65258, - "Ġbowl": 19212, - "Ġbowling": 58196, - "Ġbowls": 59980, - "Ġbows": 81465, - "Ġbox": 3745, - "ĠboxShadow": 68788, - "Ġboxed": 73664, - "Ġboxer": 78457, - "Ġboxes": 14697, - "Ġboxing": 45229, - "Ġboy": 8171, - "Ġboyc": 46234, - "Ġboycott": 52545, - "Ġboyfriend": 25838, - "Ġboys": 13007, - "ĠboÅŁ": 134195, - "Ġbp": 26685, - "Ġbpm": 97724, - "Ġbpp": 90533, - "Ġbpy": 51061, - "Ġbq": 94765, - "Ġbr": 1411, - "Ġbra": 20112, - "Ġbrace": 32864, - "Ġbracelet": 58419, - "Ġbracelets": 88865, - "Ġbraces": 59191, - "Ġbracket": 31642, - "Ġbrackets": 38929, - "Ġbrag": 56694, - "Ġbrain": 8109, - "Ġbrains": 34102, - "Ġbrainstorm": 86781, - "Ġbrake": 34618, - "Ġbrakes": 44564, - "Ġbraking": 72488, - "Ġbran": 52258, - "Ġbranch": 8870, - "Ġbranches": 23091, - "Ġbranching": 85467, - "Ġbrand": 6741, - "Ġbranded": 45835, - "Ġbranding": 43717, - "Ġbrands": 15721, - "Ġbras": 45396, - "Ġbrasile": 67973, - "Ġbrass": 36038, - "Ġbrav": 75713, - "Ġbrave": 33200, - "Ġbravery": 85066, - "Ġbrawl": 99067, - "Ġbraz": 97986, - "Ġbrazil": 96646, - "Ġbre": 5282, - "Ġbreach": 30371, - "Ġbreached": 81066, - "Ġbreaches": 68040, - "Ġbread": 16002, - "Ġbreadcrumb": 76815, - "Ġbreadcrumbs": 85566, - "Ġbreadth": 57221, - "Ġbreak": 1438, - "Ġbreakdown": 29985, - "Ġbreaker": 66767, - "Ġbreakfast": 17496, - "Ġbreaking": 14719, - "Ġbreakout": 62688, - "Ġbreakpoint": 52745, - "Ġbreakpoints": 91530, - "Ġbreaks": 18303, - "Ġbreakthrough": 41345, - "Ġbreakup": 84498, - "Ġbreast": 17216, - "Ġbreastfeeding": 64764, - "Ġbreasts": 36349, - "Ġbreat": 27755, - "Ġbreath": 11486, - "Ġbreathable": 89519, - "Ġbreathe": 36297, - "Ġbreathed": 91166, - "Ġbreathing": 25938, - "Ġbreathtaking": 56092, - "Ġbred": 54087, - "Ġbree": 67299, - "Ġbreed": 27775, - "Ġbreeding": 39208, - "Ġbreeds": 57145, - "Ġbreeze": 45285, - "Ġbrethren": 72803, - "Ġbreve": 97419, - "Ġbrew": 16695, - "Ġbrewed": 88095, - "Ġbreweries": 72702, - "Ġbrewers": 92870, - "Ġbrewery": 49195, - "Ġbrewing": 49159, - "Ġbri": 39468, - "Ġbrib": 75612, - "Ġbribery": 92037, - "Ġbrick": 24837, - "Ġbricks": 49037, - "Ġbrid": 76747, - "Ġbridal": 80412, - "Ġbride": 41347, - "Ġbrides": 60265, - "Ġbridge": 14164, - "Ġbridges": 38973, - "Ġbrief": 9814, - "Ġbriefed": 85765, - "Ġbriefing": 42536, - "Ġbriefly": 26753, - "Ġbrig": 54812, - "Ġbrigade": 83872, - "Ġbright": 9906, - "Ġbrighter": 52557, - "Ġbrightest": 70921, - "Ġbrightly": 75289, - "Ġbrightness": 32206, - "Ġbrill": 17581, - "Ġbrilliance": 82480, - "Ġbrilliant": 19752, - "Ġbrilliantly": 78249, - "Ġbring": 4446, - "Ġbringen": 90845, - "Ġbringing": 12678, - "Ġbrings": 12434, - "Ġbrink": 67115, - "Ġbrisk": 74391, - "Ġbrit": 37330, - "Ġbritish": 93927, - "Ġbrittle": 94649, - "Ġbro": 2896, - "Ġbroad": 7205, - "Ġbroadband": 40825, - "Ġbroadcast": 12899, - "Ġbroadcaster": 59883, - "Ġbroadcasters": 92914, - "Ġbroadcasting": 48827, - "Ġbroadcasts": 65098, - "Ġbroaden": 83613, - "Ġbroader": 26829, - "Ġbroadly": 42929, - "Ġbroccoli": 78176, - "Ġbrochure": 78803, - "Ġbroke": 14422, - "Ġbroken": 10865, - "Ġbroker": 22316, - "Ġbrokerage": 74855, - "Ġbrokers": 45336, - "Ġbrom": 93471, - "Ġbron": 29971, - "Ġbronze": 39807, - "Ġbroth": 44893, - "Ġbrother": 10641, - "Ġbrothers": 20208, - "Ġbrought": 7117, - "Ġbrow": 59275, - "Ġbrown": 13876, - "Ġbrows": 18833, - "Ġbrowse": 26009, - "Ġbrowser": 6929, - "Ġbrowsers": 32857, - "Ġbrowsing": 31321, - "Ġbru": 42000, - "Ġbruises": 97575, - "Ġbruk": 80771, - "Ġbrun": 41607, - "Ġbrunch": 69817, - "Ġbrunette": 48117, - "Ġbrush": 15625, - "Ġbrushed": 61539, - "Ġbrushes": 61626, - "Ġbrushing": 76726, - "Ġbrut": 19404, - "Ġbrutal": 27760, - "Ġbrutality": 62032, - "Ġbrutally": 69187, - "Ġbrute": 64098, - "Ġbryster": 46074, - "Ġbs": 17065, - "Ġbson": 50980, - "Ġbst": 70231, - "Ġbt": 19592, - "Ġbtc": 86037, - "Ġbtn": 3206, - "ĠbtnCancel": 87756, - "ĠbtnSave": 87364, - "Ġbtw": 89857, - "Ġbu": 1031, - "Ġbub": 77769, - "Ġbubb": 89612, - "Ġbubble": 23611, - "Ġbubbles": 43683, - "Ġbuc": 98044, - "Ġbuck": 22012, - "Ġbucket": 15621, - "Ġbuckets": 42112, - "Ġbuckle": 79995, - "Ġbucks": 47334, - "Ġbud": 36708, - "Ġbudd": 23485, - "Ġbuddies": 60350, - "Ġbudding": 85633, - "Ġbuddy": 36672, - "Ġbudget": 8039, - "Ġbudgets": 41384, - "Ġbuds": 67443, - "Ġbuen": 53713, - "Ġbuena": 64796, - "Ġbueno": 92541, - "Ġbuf": 6607, - "Ġbuff": 11522, - "Ġbuffalo": 81355, - "Ġbuffer": 4147, - "ĠbufferSize": 65158, - "Ġbuffered": 53057, - "Ġbuffering": 87139, - "Ġbuffers": 27389, - "Ġbuffet": 60786, - "Ġbuffs": 71897, - "Ġbufio": 96917, - "Ġbuflen": 88364, - "Ġbufsize": 97658, - "Ġbug": 9876, - "Ġbuggy": 79311, - "Ġbugs": 22551, - "Ġbugün": 131819, - "Ġbuild": 1936, - "Ġbuilder": 7363, - "Ġbuilders": 48086, - "Ġbuilding": 4752, - "Ġbuildings": 13702, - "Ġbuilds": 22111, - "Ġbuildup": 85665, - "Ġbuilt": 5798, - "Ġbuiltin": 59626, - "Ġbuiten": 98322, - "Ġbul": 7028, - "Ġbulb": 45812, - "Ġbulbs": 53220, - "Ġbulk": 19583, - "Ġbulky": 77821, - "Ġbull": 16811, - "Ġbulld": 78842, - "Ġbullet": 17432, - "Ġbulletin": 74729, - "Ġbullets": 33064, - "Ġbullied": 77813, - "Ġbullish": 89121, - "Ġbullpen": 81655, - "Ġbulls": 79681, - "Ġbullshit": 51301, - "Ġbully": 63076, - "Ġbullying": 44547, - "Ġbulun": 140373, - "Ġbulund": 135100, - "ĠbulunduÄŁu": 135101, - "Ġbulunmaktadır": 140374, - "ĠbuluÅŁ": 138895, - "Ġbum": 72874, - "Ġbump": 27575, - "Ġbumped": 78832, - "Ġbumper": 58885, - "Ġbumps": 64722, - "Ġbun": 44821, - "Ġbunch": 15493, - "Ġbund": 10365, - "Ġbundle": 12894, - "Ġbundled": 51450, - "Ġbundles": 48607, - "Ġbunk": 45469, - "Ġbunker": 83672, - "Ġbunny": 75514, - "Ġbuoy": 74620, - "Ġbur": 7795, - "Ġburden": 22305, - "Ġburdens": 62974, - "Ġbure": 30761, - "Ġbureau": 43302, - "Ġbureauc": 33746, - "Ġbureaucr": 36970, - "Ġbureaucracy": 63831, - "Ġbureaucratic": 79395, - "Ġbureaucrats": 88640, - "Ġburg": 29775, - "Ġburge": 86969, - "Ġburgeoning": 89569, - "Ġburger": 44623, - "Ġburgers": 62352, - "Ġburgl": 59171, - "Ġburglary": 76943, - "Ġburial": 54663, - "Ġburied": 26918, - "Ġburn": 8231, - "Ġburned": 26626, - "Ġburner": 64719, - "Ġburning": 19675, - "Ġburns": 43054, - "Ġburnt": 49340, - "Ġburst": 20524, - "Ġbursting": 76750, - "Ġbursts": 65701, - "Ġbury": 55344, - "Ġbus": 5828, - "Ġbusc": 63182, - "Ġbusca": 49814, - "Ġbuscar": 47374, - "Ġbuses": 33380, - "Ġbush": 29673, - "Ġbushes": 77206, - "Ġbusiest": 83508, - "Ġbusiness": 2562, - "Ġbusinesses": 9675, - "Ġbusinessman": 46278, - "Ġbusinessmen": 82550, - "Ġbust": 20781, - "Ġbusted": 76390, - "Ġbustling": 89156, - "Ġbusty": 65352, - "Ġbusy": 13028, - "Ġbut": 714, - "Ġbutcher": 75094, - "Ġbutt": 29956, - "Ġbutter": 14100, - "Ġbutterflies": 80676, - "Ġbutterfly": 55169, - "Ġbutterknife": 49939, - "Ġbutto": 96935, - "Ġbutton": 3137, - "ĠbuttonText": 86995, - "ĠbuttonWithType": 83824, - "Ġbuttons": 12424, - "Ġbuurt": 59017, - "Ġbuy": 3695, - "Ġbuyer": 25114, - "Ġbuyers": 22630, - "Ġbuying": 11833, - "Ġbuys": 49531, - "Ġbuz": 92154, - "Ġbuzz": 30427, - "Ġbuzzing": 85324, - "Ġbuá»ĵn": 136100, - "Ġbuá»ķi": 132214, - "Ġbuá»Ļc": 135571, - "Ġbv": 56937, - "Ġbw": 34375, - "Ġbx": 44241, - "Ġby": 553, - "Ġbye": 53041, - "Ġbypass": 30718, - "Ġbystand": 82383, - "Ġbyte": 4922, - "ĠbyteArray": 75003, - "Ġbytearray": 95603, - "Ġbytecode": 75129, - "Ġbytes": 5820, - "ĠbytesRead": 87173, - "ĠbyÄĩ": 59505, - "ĠbyÅĤ": 81635, - "ĠbyÅĤa": 130100, - "ĠbyÅĤo": 86517, - "ĠbyÅĤy": 131387, - "Ġbz": 80167, - "Ġbzw": 66809, - "Ġbác": 130103, - "Ġbán": 128627, - "Ġbánh": 132710, - "Ġbáo": 128603, - "Ġbás": 80351, - "Ġbásica": 140629, - "Ġbásico": 140807, - "Ġbât": 142620, - "Ġbâtiment": 142621, - "Ġbây": 136814, - "Ġbãi": 141109, - "Ġbä": 86553, - "ĠbÃ¥de": 79742, - "Ġbè": 136078, - "Ġbé": 89451, - "Ġbéné": 83133, - "Ġbénéfic": 141360, - "Ġbénéficie": 141361, - "Ġbên": 128608, - "Ġbình": 128823, - "Ġbó": 132195, - "Ġbóng": 129590, - "Ġbö": 98171, - "Ġböl": 125235, - "Ġbölge": 130209, - "Ġbölges": 142581, - "Ġbölgesinde": 142582, - "Ġbölüm": 127725, - "Ġbölümü": 138394, - "Ġbör": 91293, - "Ġböyle": 130378, - "Ġbú": 137495, - "Ġbúsqueda": 98499, - "Ġbü": 78475, - "Ġbüt": 130624, - "Ġbütün": 130625, - "Ġbüyü": 132288, - "Ġbüyük": 128565, - "ĠbÃł": 129302, - "ĠbÃłi": 128601, - "ĠbÃłn": 129030, - "ĠbÃło": 135774, - "ĠbÃły": 135247, - "ĠbÃŃ": 132642, - "Ġbır": 130147, - "Ġbırak": 130148, - "ĠbÄĥng": 139829, - "ĠbÄħd": 140861, - "ĠbÄħdź": 140862, - "ĠbÄĻd": 40808, - "ĠbÄĻdzie": 58231, - "ĠbÄĻdÄħ": 92494, - "ĠbÄĻdÄĻ": 142272, - "ĠbÅĤ": 142503, - "ĠbÅĤÄĻd": 142504, - "ĠbÆ°á»Ľc": 130203, - "Ġbạc": 134424, - "Ġbại": 139141, - "Ġbạn": 89437, - "Ġbản": 128450, - "Ġbảng": 134597, - "Ġbảo": 128417, - "Ġbất": 128633, - "Ġbầu": 134311, - "Ġbắt": 128802, - "Ġbằng": 128411, - "Ġbếp": 133651, - "ĠbáºŃ": 138269, - "ĠbáºŃc": 138270, - "ĠbáºŃt": 132345, - "Ġbụ": 127910, - "Ġbụi": 142522, - "Ġbụng": 137268, - "Ġbức": 133954, - "Ġbữa": 137790, - "Ġbá»ģ": 140836, - "Ġbá»ģn": 135268, - "Ġbá»ĩnh": 128453, - "Ġbá»ĭ": 128279, - "Ġbá»įn": 136497, - "Ġbá»ı": 129017, - "Ġbá»ij": 128888, - "Ġbá»ķ": 130623, - "Ġbá»Ļ": 128366, - "Ġbợi": 128944, - "Ġc": 272, - "ĠcJSON": 70580, - "Ġca": 2162, - "Ġcab": 21516, - "Ġcabbage": 73773, - "Ġcabe": 57779, - "Ġcabel": 95599, - "Ġcabeza": 94870, - "Ġcabeça": 140654, - "Ġcabin": 13386, - "Ġcabinet": 21921, - "Ġcabinets": 36228, - "Ġcabins": 88301, - "Ġcable": 14652, - "Ġcables": 36072, - "Ġcabo": 88384, - "Ġcac": 82881, - "Ġcach": 60287, - "Ġcache": 6500, - "Ġcached": 20579, - "Ġcaches": 53588, - "Ġcaching": 47430, - "Ġcad": 19409, - "Ġcada": 18862, - "Ġcadastr": 86177, - "Ġcade": 77318, - "Ġcadena": 54992, - "Ġcadre": 59597, - "Ġcaf": 29103, - "Ġcafe": 40930, - "Ġcafes": 73571, - "Ġcafeteria": 93848, - "Ġcaffe": 38570, - "Ġcaffeine": 48650, - "Ġcafé": 51950, - "Ġcage": 35360, - "Ġcages": 80847, - "Ġcairo": 53648, - "Ġcake": 19145, - "Ġcakes": 47569, - "Ġcal": 1620, - "Ġcalam": 79833, - "Ġcalc": 10035, - "Ġcalcium": 34619, - "Ġcalcul": 5812, - "Ġcalcular": 96527, - "Ġcalculate": 11047, - "Ġcalculated": 16588, - "Ġcalculates": 47417, - "Ġcalculating": 37614, - "Ġcalculation": 21937, - "Ġcalculations": 28117, - "Ġcalculator": 29952, - "Ġcalculus": 82668, - "Ġcalend": 49970, - "Ġcalendar": 13168, - "Ġcalendars": 70995, - "Ġcalf": 64543, - "Ġcaliber": 60768, - "Ġcalibrated": 84985, - "Ġcalibration": 37611, - "Ġcalidad": 55820, - "Ġcaliente": 97315, - "Ġcalifornia": 78857, - "Ġcall": 1618, - "ĠcallBack": 70897, - "Ġcallable": 40922, - "Ġcallback": 4822, - "Ġcallbacks": 26679, - "Ġcalle": 67835, - "Ġcalled": 2598, - "Ġcallee": 94800, - "Ġcaller": 19865, - "Ġcallers": 81903, - "Ġcalling": 8098, - "Ġcalloc": 46013, - "Ġcalls": 6738, - "Ġcalm": 19300, - "Ġcalming": 77629, - "Ġcalmly": 72070, - "Ġcalor": 85212, - "Ġcalorie": 51603, - "Ġcalories": 24262, - "Ġcalves": 96210, - "Ġcam": 6592, - "Ġcamar": 96586, - "Ġcamb": 24141, - "Ġcambi": 76603, - "Ġcambiar": 69720, - "Ġcambio": 57311, - "Ġcambios": 82262, - "Ġcame": 3697, - "Ġcamel": 49152, - "Ġcameo": 94056, - "Ġcamer": 92925, - "Ġcamera": 6249, - "Ġcameras": 18139, - "Ġcamino": 83444, - "Ġcamouflage": 86968, - "Ġcamp": 3113, - "Ġcampaign": 4796, - "Ġcampaigned": 86196, - "Ġcampaigners": 93293, - "Ġcampaigning": 54827, - "Ġcampaigns": 20686, - "Ġcampaña": 139024, - "Ġcamper": 91053, - "Ġcampground": 89135, - "Ġcamping": 32773, - "Ġcampo": 26575, - "Ġcampos": 50269, - "Ġcamps": 28035, - "Ġcampus": 15319, - "Ġcampuses": 51908, - "Ġcams": 58284, - "Ġcan": 646, - "ĠcanActivate": 58468, - "Ġcanada": 31763, - "Ġcanadian": 87598, - "Ġcanal": 38921, - "Ġcanc": 62309, - "Ġcancel": 9121, - "ĠcancelButton": 44026, - "ĠcancelButtonTitle": 76902, - "Ġcanceled": 33446, - "Ġcancell": 18467, - "Ġcancellation": 35835, - "ĠcancellationToken": 33133, - "Ġcancelled": 25681, - "Ġcancelling": 96915, - "Ġcancer": 9387, - "Ġcancers": 50323, - "Ġcand": 38638, - "Ġcandid": 5685, - "Ġcandidacy": 66160, - "Ġcandidate": 9144, - "Ġcandidates": 11178, - "Ġcandies": 97397, - "Ġcandle": 37799, - "Ġcandles": 51205, - "Ġcandy": 31556, - "Ġcane": 62235, - "Ġcanine": 74982, - "Ġcanlı": 134865, - "Ġcann": 13750, - "Ġcannabin": 64128, - "Ġcannabinoids": 92886, - "Ġcannabis": 18903, - "Ġcanned": 63014, - "Ġcannon": 48399, - "Ġcannons": 96914, - "Ġcannot": 4157, - "Ġcanoe": 83489, - "Ġcanon": 43816, - "Ġcanonical": 42453, - "Ġcanopy": 62971, - "Ġcans": 42632, - "Ġcant": 16464, - "Ġcantidad": 37276, - "Ġcanv": 72378, - "Ġcanvas": 10041, - "Ġcanyon": 83200, - "Ġcap": 2062, - "Ġcapabilities": 16928, - "Ġcapability": 22302, - "Ġcapable": 12875, - "Ġcapac": 23015, - "Ġcapacidad": 82292, - "Ġcapacit": 98658, - "Ġcapacities": 58439, - "Ġcapacitor": 84425, - "Ġcapacity": 8654, - "Ġcapacité": 139536, - "ĠcapacitÃł": 139336, - "Ġcape": 64292, - "Ġcapit": 60410, - "Ġcapita": 52055, - "Ġcapital": 6722, - "Ġcapitalism": 31582, - "Ġcapitalist": 39967, - "Ġcapitalists": 86308, - "Ġcapitalize": 52725, - "Ġcapitalized": 97321, - "Ġcapitals": 92999, - "Ġcapped": 60146, - "Ġcaps": 18568, - "Ġcapsule": 47639, - "Ġcapsules": 64779, - "Ġcapt": 6427, - "Ġcaptain": 23915, - "Ġcaptains": 89884, - "Ġcaptcha": 65089, - "Ġcaption": 17256, - "Ġcaptions": 77788, - "Ġcaptivating": 85182, - "Ġcaptive": 59851, - "Ġcaptivity": 82919, - "Ġcapture": 12322, - "Ġcaptured": 17006, - "Ġcaptures": 40155, - "Ġcapturing": 39780, - "ĠcapÃŃtulo": 143093, - "Ġcar": 1803, - "Ġcara": 46934, - "Ġcaract": 56605, - "Ġcaracter": 32229, - "Ġcaracteres": 59255, - "ĠcaracterÃŃsticas": 92454, - "Ġcaractère": 143704, - "Ġcaramel": 58711, - "Ġcaratter": 90650, - "Ġcaravan": 73660, - "Ġcarb": 34772, - "Ġcarbohydr": 40850, - "Ġcarbohydrate": 66632, - "Ġcarbohydrates": 61245, - "Ġcarbon": 12499, - "Ġcarbonate": 83343, - "Ġcarbs": 52509, - "Ġcarc": 74466, - "Ġcarcin": 51688, - "Ġcarcinoma": 88368, - "Ġcard": 3701, - "Ġcardboard": 53943, - "Ġcardi": 72051, - "Ġcardiac": 46245, - "Ġcardinal": 55880, - "Ġcardio": 31744, - "Ġcardiovascular": 40613, - "Ġcards": 7411, - "Ġcare": 2453, - "Ġcared": 41677, - "Ġcareer": 6931, - "Ġcareers": 30033, - "Ġcareful": 16585, - "Ġcarefully": 15516, - "Ġcareg": 49271, - "Ġcaregiver": 92461, - "Ġcaregivers": 73640, - "Ġcareless": 83734, - "Ġcares": 33572, - "Ġcaret": 52301, - "Ġcarg": 61662, - "Ġcarga": 75036, - "Ġcargar": 81911, - "Ġcargo": 25652, - "Ġcaric": 75971, - "Ġcaring": 29498, - "Ġcarn": 38338, - "Ġcarne": 94854, - "Ġcarniv": 96633, - "Ġcarnival": 93396, - "Ġcarousel": 52281, - "Ġcarp": 38639, - "Ġcarpet": 27854, - "Ġcarpets": 88241, - "Ġcarr": 47495, - "Ġcarrera": 89876, - "Ġcarriage": 51447, - "Ġcarried": 11691, - "Ġcarrier": 18602, - "Ġcarriers": 34891, - "Ġcarries": 23377, - "Ġcarro": 43900, - "Ġcarrot": 74194, - "Ġcarrots": 61417, - "Ġcarry": 6777, - "Ġcarrying": 15331, - "Ġcars": 9331, - "Ġcart": 7406, - "Ġcarta": 75547, - "Ġcarte": 47354, - "Ġcartel": 79640, - "Ġcartesian": 94381, - "Ġcartoon": 30349, - "Ġcartoons": 62023, - "Ġcartridge": 50862, - "Ġcartridges": 71733, - "Ġcarts": 65404, - "Ġcarve": 79637, - "Ġcarved": 48167, - "Ġcarving": 76691, - "Ġcará": 143158, - "Ġcarácter": 143159, - "Ġcas": 4760, - "Ġcasa": 24249, - "Ġcasc": 74957, - "Ġcascade": 42018, - "Ġcase": 1142, - "Ġcases": 5048, - "Ġcash": 8350, - "Ġcashier": 90355, - "Ġcasi": 61253, - "Ġcasing": 73344, - "Ġcasino": 11846, - "Ġcasinos": 33371, - "Ġcaso": 23020, - "Ġcasos": 57533, - "Ġcass": 44224, - "Ġcassette": 81258, - "Ġcast": 6311, - "Ġcaste": 68424, - "Ġcaster": 47982, - "Ġcasting": 24172, - "Ġcastle": 32584, - "Ġcasts": 56033, - "Ġcasual": 16334, - "Ġcasually": 64614, - "Ġcasualties": 47888, - "Ġcasualty": 91497, - "Ġcat": 8251, - "Ġcata": 30079, - "Ġcatal": 33354, - "Ġcatalog": 16403, - "Ġcatalogs": 90285, - "Ġcatalogue": 48539, - "Ġcatalyst": 50383, - "Ġcatapult": 95091, - "Ġcatast": 34105, - "Ġcatastrophe": 64296, - "Ġcatastrophic": 53577, - "Ġcatch": 2287, - "ĠcatchError": 63934, - "Ġcatcher": 67798, - "Ġcatches": 37834, - "Ġcatching": 33068, - "Ġcatchy": 85505, - "Ġcate": 58139, - "Ġcategor": 22049, - "Ġcategoria": 47018, - "Ġcategorical": 69536, - "Ġcategorie": 95819, - "Ġcategories": 11059, - "Ġcategorized": 70874, - "Ġcategory": 5582, - "ĠcategoryId": 58993, - "ĠcategoryName": 89610, - "ĠcategorÃŃa": 140647, - "Ġcater": 27968, - "Ġcatering": 53829, - "Ġcath": 30647, - "Ġcathedral": 79150, - "Ġcatholic": 82091, - "Ġcats": 19423, - "Ġcattle": 35852, - "Ġcatégorie": 142130, - "Ġcaucus": 65443, - "Ġcaught": 10568, - "Ġcaul": 85164, - "Ġcauliflower": 95870, - "Ġcaus": 24524, - "Ġcausa": 61999, - "Ġcausal": 58457, - "Ġcause": 5240, - "Ġcaused": 8881, - "Ġcauses": 11137, - "Ġcausing": 14381, - "Ġcaut": 35104, - "Ġcaution": 27830, - "Ġcautioned": 84332, - "Ġcautious": 45778, - "Ġcautiously": 91385, - "Ġcav": 56609, - "Ġcaval": 59290, - "Ġcavalry": 78557, - "Ġcave": 25385, - "Ġcaveat": 86051, - "Ġcavern": 75204, - "Ġcaves": 65564, - "Ġcavity": 55329, - "Ġcaz": 95085, - "Ġcazzo": 89533, - "ĠcaÅĤ": 90061, - "ĠcaÅĤego": 142602, - "ĠcaÅĤej": 140559, - "ĠcaÅĤy": 132186, - "Ġcb": 9858, - "Ġcbd": 58527, - "Ġcbo": 93677, - "Ġcc": 12527, - "Ġccp": 98897, - "Ġcd": 15307, - "Ġcdecl": 87174, - "Ġcdr": 88304, - "Ġcds": 93501, - "Ġce": 3761, - "Ġcease": 31516, - "Ġceased": 58377, - "Ġceasefire": 81773, - "Ġcedar": 75296, - "Ġceil": 28481, - "Ġceiling": 22170, - "Ġceilings": 55714, - "Ġcel": 19093, - "Ġcela": 44502, - "Ġcele": 6494, - "Ġcelebr": 7345, - "Ġcelebrate": 18383, - "Ġcelebrated": 27185, - "Ġcelebrates": 48093, - "Ġcelebrating": 31589, - "Ġcelebration": 24916, - "Ġcelebrations": 46574, - "Ġcelebrities": 39401, - "Ġcelebrity": 30444, - "Ġcelery": 69021, - "Ġcelestial": 76380, - "Ġcelib": 77533, - "Ġcell": 2779, - "ĠcellFor": 40604, - "ĠcellForRowAt": 82655, - "ĠcellForRowAtIndexPath": 65889, - "Ġcellar": 75775, - "Ġcelle": 72003, - "Ġcellpadding": 29104, - "Ġcellphone": 57309, - "Ġcells": 7761, - "Ġcellspacing": 27081, - "Ġcellul": 68902, - "Ġcellular": 34593, - "Ġcelui": 64990, - "Ġcelular": 87126, - "Ġcement": 23613, - "Ġcemetery": 58304, - "Ġcen": 64931, - "Ġcena": 77906, - "Ġcensor": 38965, - "Ġcensorship": 51888, - "Ġcensus": 43602, - "Ġcent": 2889, - "Ġcenter": 4126, - "ĠcenterX": 89801, - "ĠcenterY": 80230, - "Ġcentered": 30188, - "Ġcenterpiece": 90753, - "Ġcenters": 18652, - "Ġcentr": 38139, - "Ġcentral": 8622, - "Ġcentralized": 57883, - "Ġcentrally": 84313, - "Ġcentre": 12261, - "Ġcentres": 35182, - "Ġcentrif": 73082, - "Ġcentro": 40887, - "Ġcentroid": 58119, - "Ġcentroids": 80043, - "Ġcents": 30191, - "Ġcenturies": 23631, - "Ġcentury": 9294, - "Ġcep": 62090, - "Ġcer": 10152, - "Ġceramic": 42024, - "Ġceramics": 95706, - "Ġcerc": 46462, - "Ġcerca": 27449, - "Ġcerco": 70917, - "Ġcere": 26993, - "Ġcereal": 61133, - "Ġcerebral": 59645, - "Ġceremon": 42512, - "Ġceremonial": 92542, - "Ġceremonies": 59183, - "Ġceremony": 21536, - "Ġcerr": 26878, - "Ġcert": 2777, - "Ġcertain": 3654, - "Ġcertainly": 7838, - "Ġcertains": 74976, - "Ġcertainty": 43643, - "Ġcertificate": 15748, - "Ġcertificates": 34437, - "Ġcertification": 27606, - "Ġcertifications": 81471, - "Ġcertified": 22909, - "Ġcertify": 92230, - "Ġcerto": 87915, - "Ġcerts": 74406, - "Ġcerv": 51564, - "Ġcervical": 66727, - "Ġces": 26652, - "Ġcess": 64047, - "Ġcessation": 82360, - "Ġcet": 40967, - "Ġcette": 20061, - "Ġceux": 64956, - "Ġcf": 24111, - "Ġcfg": 13286, - "Ġcg": 35740, - "Ġcgi": 98832, - "Ġch": 521, - "Ġcha": 13517, - "Ġchac": 94817, - "Ġchai": 44081, - "Ġchain": 8781, - "Ġchained": 66969, - "Ġchaining": 73662, - "Ġchains": 26179, - "Ġchair": 10496, - "Ġchaired": 98106, - "Ġchairman": 21201, - "Ġchairs": 25904, - "Ġchalk": 42359, - "Ġchall": 4799, - "Ġchalleng": 7301, - "Ġchallenge": 8645, - "Ġchallenged": 28891, - "Ġchallenger": 69150, - "Ġchallenges": 11513, - "Ġchallenging": 17003, - "Ġcham": 33709, - "Ġchamber": 24220, - "Ġchambers": 52179, - "Ġchambre": 86838, - "Ġchamp": 34541, - "Ġchampagne": 64293, - "Ġchampion": 18319, - "Ġchampions": 33738, - "Ġchampionship": 21553, - "Ġchampionships": 58184, - "Ġchamps": 70481, - "Ġchan": 26023, - "Ġchance": 6012, - "Ġchancellor": 76175, - "Ġchances": 16963, - "Ġchang": 2547, - "Ġchange": 2297, - "Ġchanged": 5497, - "Ġchanger": 61339, - "Ġchanges": 4344, - "Ġchanging": 10018, - "Ġchannel": 5496, - "ĠchannelId": 81725, - "Ġchannels": 11744, - "Ġchant": 43353, - "Ġchanting": 76574, - "Ġchants": 87487, - "Ġchaos": 26915, - "Ġchaotic": 51987, - "Ġchap": 37738, - "Ġchapel": 82149, - "Ġchapter": 12453, - "Ġchapters": 29632, - "Ġchaque": 45677, - "Ġchar": 1161, - "Ġcharacter": 3668, - "Ġcharacteristic": 28583, - "Ġcharacteristics": 17452, - "Ġcharacterization": 59893, - "Ġcharacterize": 69655, - "Ġcharacterized": 31871, - "Ġcharacters": 5766, - "Ġcharcoal": 60103, - "Ġcharg": 5597, - "Ġcharge": 6757, - "Ġcharged": 11430, - "Ġcharger": 44569, - "Ġcharges": 10195, - "Ġcharging": 22641, - "Ġcharisma": 98649, - "Ġcharismatic": 78223, - "Ġcharitable": 47701, - "Ġcharities": 50271, - "Ġcharity": 22846, - "Ġcharm": 31253, - "Ġcharming": 34409, - "Ġcharms": 80650, - "Ġchars": 23000, - "Ġcharset": 11617, - "Ġchart": 9487, - "Ġcharter": 37024, - "Ġcharts": 26131, - "Ġchase": 32486, - "Ġchased": 61820, - "Ġchasing": 42831, - "Ġchassis": 44909, - "Ġchast": 74107, - "Ġchat": 6236, - "Ġchats": 48526, - "Ġchatt": 80242, - "Ġchatte": 53851, - "Ġchatter": 69357, - "Ġchatting": 50967, - "Ġchaud": 69312, - "Ġchauff": 73717, - "Ġchave": 97635, - "Ġchc": 141636, - "Ġchcia": 134685, - "ĠchciaÅĤ": 134686, - "ĠchcÄħ": 141637, - "Ġche": 3016, - "Ġcheap": 11872, - "Ġcheaper": 23048, - "Ġcheapest": 42049, - "Ġcheat": 40768, - "Ġcheated": 77678, - "Ġcheating": 41723, - "Ġcheats": 75388, - "Ġcheck": 1779, - "ĠcheckBox": 52558, - "Ġcheckbox": 31300, - "Ġcheckboxes": 90392, - "Ġchecked": 10067, - "Ġchecker": 40915, - "Ġchecking": 13295, - "Ġchecklist": 52573, - "Ġcheckout": 27264, - "Ġcheckpoint": 29295, - "Ġcheckpoints": 67209, - "Ġchecks": 12341, - "Ġchecksum": 32529, - "Ġcheek": 40703, - "Ġcheeks": 53788, - "Ġcheer": 25032, - "Ġcheered": 84523, - "Ġcheerful": 70314, - "Ġcheering": 67902, - "Ġcheers": 73883, - "Ġchees": 42832, - "Ġcheese": 17163, - "Ġcheeses": 97464, - "Ġcheesy": 86747, - "Ġchef": 29706, - "Ġchefs": 59127, - "Ġcheg": 96940, - "Ġchem": 8424, - "Ġchemical": 11483, - "Ġchemicals": 25266, - "Ġchemin": 87668, - "Ġchemistry": 29803, - "Ġchemotherapy": 61630, - "Ġcheque": 77010, - "Ġcher": 22216, - "Ġcherche": 51471, - "Ġcherish": 86685, - "Ġcherished": 80071, - "Ġcherry": 40880, - "Ġchess": 32719, - "Ġchest": 15138, - "Ġchests": 83318, - "Ġchevy": 96910, - "Ġchew": 36333, - "Ġchewing": 74377, - "Ġchez": 45106, - "Ġchi": 25798, - "Ġchiar": 98099, - "Ġchic": 46894, - "Ġchica": 79588, - "Ġchicago": 92208, - "Ġchicas": 56567, - "Ġchick": 30763, - "Ġchicken": 16158, - "Ġchickens": 53523, - "Ġchicks": 67989, - "Ġchief": 10178, - "Ġchiefly": 88282, - "Ġchiefs": 67702, - "Ġchiff": 82964, - "Ġchild": 1682, - "Ġchildbirth": 96194, - "Ġchildcare": 79171, - "Ġchildhood": 19990, - "Ġchildish": 93171, - "Ġchildren": 2841, - "Ġchilds": 88000, - "Ġchili": 58617, - "Ġchill": 36301, - "Ġchilled": 83942, - "Ġchilling": 61624, - "Ġchilly": 80875, - "Ġchim": 36994, - "Ġchimney": 89051, - "Ġchimpan": 98325, - "Ġchin": 45075, - "Ġchina": 32525, - "Ġchinese": 56387, - "Ġchip": 16392, - "Ġchips": 23595, - "Ġchipset": 91714, - "Ġchir": 70446, - "Ġchiropr": 76201, - "Ġchiếc": 129141, - "Ġchiếm": 136514, - "Ġchiến": 129009, - "Ġchiếu": 135714, - "Ġchiá»ģu": 131149, - "Ġchk": 39242, - "Ġchlor": 36733, - "Ġchloride": 81782, - "Ġchlorine": 84106, - "Ġchmod": 59615, - "Ġcho": 2600, - "Ġchoc": 141608, - "Ġchocia": 141609, - "Ġchociaż": 141610, - "Ġchocol": 71376, - "Ġchocolate": 17931, - "Ġchocolates": 98949, - "Ġchoice": 5754, - "Ġchoices": 11454, - "Ġchoir": 70608, - "Ġchois": 72561, - "Ġchoisir": 89094, - "Ġchoix": 58920, - "Ġchoke": 64036, - "Ġchoked": 93643, - "Ġchoking": 90520, - "Ġchol": 98640, - "Ġcholesterol": 37986, - "Ġchoose": 5157, - "Ġchooser": 94253, - "Ġchooses": 39911, - "Ġchoosing": 18774, - "Ġchop": 46994, - "Ġchopped": 37425, - "Ġchopping": 96287, - "Ġchops": 90078, - "Ġchor": 69256, - "Ġchord": 43221, - "Ġchords": 55659, - "Ġchore": 49571, - "Ġchores": 81469, - "Ġchorus": 55810, - "Ġchose": 14554, - "Ġchosen": 11882, - "Ġchoses": 78065, - "ĠchoÄĩ": 134811, - "Ġchr": 28131, - "Ġchrist": 25769, - "Ġchristian": 51047, - "Ġchristmas": 53202, - "Ġchrom": 21372, - "Ġchromat": 97184, - "Ġchrome": 26429, - "Ġchromium": 96862, - "Ġchromosome": 50715, - "Ġchromosomes": 82081, - "Ġchron": 25986, - "Ġchronic": 20601, - "Ġchrono": 80372, - "Ġchronological": 86534, - "Ġchu": 95799, - "Ġchubby": 93778, - "Ġchuck": 42460, - "Ġchuckled": 96611, - "Ġchunk": 11879, - "Ġchunks": 26757, - "Ġchurch": 8817, - "Ġchurches": 29912, - "Ġchurn": 80869, - "Ġchute": 94380, - "Ġchuyên": 128744, - "Ġchuyến": 135418, - "Ġchuyá»ĥn": 128830, - "Ġchuyá»ĩn": 128963, - "Ġchuẩn": 129311, - "Ġchá": 127832, - "Ġcháu": 136291, - "Ġcháy": 137297, - "Ġchân": 129213, - "Ġchâu": 133539, - "Ġchó": 137665, - "Ġchóng": 131827, - "Ġchù": 142937, - "Ġchùa": 142938, - "Ġchú": 129407, - "Ġchúng": 128347, - "Ġchút": 130575, - "ĠchÃłng": 136862, - "ĠchÃło": 139548, - "ĠchÃŃ": 128997, - "ĠchÃŃnh": 128311, - "ĠchÄĥm": 131619, - "ĠchÆ¡i": 128971, - "Ġchưa": 128651, - "Ġchương": 129784, - "Ġchạm": 141619, - "Ġchạy": 130702, - "Ġchảy": 138886, - "Ġchấp": 132677, - "Ġchất": 128380, - "Ġchắc": 130052, - "Ġchắn": 132457, - "Ġchẳng": 130685, - "Ġchặ": 139809, - "Ġchặn": 139810, - "Ġchặt": 137277, - "Ġchế": 128751, - "Ġchết": 130276, - "ĠcháºŃm": 138117, - "Ġchợ": 136625, - "Ġchụ": 135901, - "Ġchụp": 135902, - "Ġchá»§": 128427, - "Ġchứ": 127306, - "Ġchứa": 133456, - "Ġchức": 128502, - "Ġchứng": 128977, - "Ġchữ": 132870, - "Ġchữa": 130489, - "Ġchá»ī": 98127, - "Ġchá»īnh": 132314, - "Ġchá»ĭ": 126555, - "Ġchá»ĭu": 129949, - "Ġchá»įn": 128509, - "Ġchá»ijng": 129455, - "Ġchá»ĵng": 130627, - "Ġchá»Ĺ": 131501, - "Ġchá»Ŀ": 133459, - "Ġci": 11825, - "Ġcialis": 27793, - "ĠciaÅĤa": 139949, - "Ġcic": 53777, - "Ġciclo": 89570, - "Ġcid": 32141, - "Ġcidade": 55084, - "Ġcider": 65055, - "Ġcient": 87997, - "ĠcientÃŃf": 143249, - "ĠcientÃŃfico": 143250, - "Ġcif": 65472, - "Ġcig": 16934, - "Ġcigar": 53674, - "Ġcigaret": 21592, - "Ġcigarette": 35113, - "Ġcigarettes": 33476, - "Ġcigars": 81115, - "Ġcil": 61344, - "Ġcin": 8461, - "Ġcinco": 70327, - "Ġcine": 79752, - "Ġcinema": 33192, - "Ġcinemas": 97607, - "Ġcinemat": 87022, - "Ġcinematic": 64665, - "Ġcinnamon": 50892, - "Ġciné": 143376, - "Ġcinéma": 143377, - "Ġcio": 142972, - "Ġcioè": 142973, - "Ġcipher": 31088, - "Ġciphertext": 69789, - "Ġcir": 29470, - "Ġcirc": 4225, - "Ġcirca": 53507, - "Ġcircle": 12671, - "Ġcircles": 25362, - "Ġcircuit": 16224, - "Ġcircuits": 45021, - "Ġcircular": 26931, - "Ġcirculated": 62873, - "Ġcirculating": 53728, - "Ġcirculation": 34755, - "Ġcircum": 10198, - "Ġcircumcision": 73509, - "Ġcircumference": 74926, - "Ġcircumstance": 52137, - "Ġcircumstances": 13161, - "Ġcircus": 67024, - "Ġcis": 66404, - "Ġcit": 6544, - "Ġcita": 87057, - "Ġcitas": 54535, - "Ġcitation": 44377, - "Ġcitations": 51846, - "Ġcite": 38296, - "Ġcited": 21870, - "Ġcites": 57173, - "Ġcities": 9720, - "Ġciting": 32164, - "Ġcitiz": 8435, - "Ġcitizen": 21860, - "Ġcitizens": 10283, - "Ġcitizenship": 32679, - "Ġcitrus": 59190, - "Ġcitt": 71176, - "ĠcittÃł": 96939, - "Ġcity": 3283, - "ĠcityName": 96701, - "Ġciudad": 39357, - "Ġciv": 18462, - "Ġcivic": 43873, - "Ġcivil": 8267, - "Ġcivilian": 28928, - "Ġcivilians": 28436, - "Ġcivilization": 34917, - "Ġcivilizations": 85469, - "Ġcivilized": 84979, - "Ġciò": 133010, - "ĠciÄħ": 137922, - "ĠciÄħgu": 137923, - "Ġcj": 90997, - "Ġck": 38613, - "Ġcl": 1185, - "Ġcla": 86704, - "Ġclad": 82758, - "Ġclaim": 3717, - "Ġclaimed": 11660, - "Ġclaiming": 20409, - "Ġclaims": 8186, - "Ġclam": 59510, - "Ġclamp": 41904, - "Ġclan": 38462, - "Ġclandest": 92557, - "Ġclang": 18260, - "Ġclans": 85981, - "Ġclap": 89577, - "Ġclar": 19497, - "Ġclarification": 63684, - "Ġclarified": 64776, - "Ġclarify": 37163, - "Ġclarity": 31273, - "Ġclaro": 75221, - "Ġclas": 56120, - "Ġclase": 46380, - "Ġclases": 95573, - "Ġclash": 39903, - "Ġclashed": 97406, - "Ġclashes": 51510, - "Ġclass": 536, - "ĠclassName": 1980, - "ĠclassNames": 55465, - "Ġclasse": 36317, - "Ġclasses": 6846, - "Ġclassic": 11416, - "Ġclassical": 28824, - "Ġclassics": 52705, - "Ġclassification": 23850, - "Ġclassifications": 95671, - "Ġclassified": 21091, - "Ġclassifier": 33365, - "Ġclassifiers": 71291, - "Ġclassify": 48129, - "Ġclassmates": 60090, - "Ġclassname": 70650, - "Ġclassroom": 24017, - "Ġclassrooms": 57116, - "Ġclassy": 70258, - "Ġclause": 21647, - "Ġclauses": 49098, - "Ġclave": 60842, - "Ġclaw": 56490, - "Ġclaws": 67450, - "Ġclay": 36048, - "Ġclazz": 32472, - "Ġcle": 11299, - "Ġclean": 4240, - "Ġcleaned": 27722, - "Ġcleaner": 31881, - "Ġcleaners": 74865, - "Ġcleaning": 15826, - "Ġcleanliness": 95291, - "Ġcleanly": 96875, - "Ġcleans": 34194, - "Ġcleanse": 80055, - "Ġcleansing": 58952, - "Ġcleanup": 21290, - "Ġclear": 2797, - "ĠclearColor": 57978, - "ĠclearInterval": 45585, - "ĠclearTimeout": 53225, - "Ġclearance": 35554, - "Ġcleared": 22949, - "Ġclearer": 48379, - "Ġclearfix": 36627, - "Ġclearing": 32750, - "Ġclearly": 9355, - "Ġclears": 56598, - "Ġclen": 84934, - "Ġcler": 56360, - "Ġclergy": 62484, - "Ġcleric": 91558, - "Ġclerk": 44257, - "Ġclever": 27699, - "Ġclf": 46079, - "Ġcli": 21348, - "Ġclic": 47276, - "Ġclich": 62592, - "Ġclick": 4205, - "Ġclickable": 85563, - "Ġclicked": 19910, - "Ġclicking": 18458, - "Ġclicks": 27749, - "Ġclient": 2943, - "ĠclientId": 47983, - "Ġcliente": 26629, - "Ġclientele": 96172, - "Ġclientes": 44645, - "Ġclients": 8239, - "Ġcliff": 43006, - "Ġcliffs": 85849, - "Ġclim": 11076, - "Ġclimate": 9977, - "Ġclimates": 91299, - "Ġclimax": 70195, - "Ġclimb": 25367, - "Ġclimbed": 44419, - "Ġclimbers": 93651, - "Ġclimbing": 29508, - "Ġclimbs": 76411, - "Ġclin": 9218, - "Ġcling": 77164, - "Ġclinging": 96358, - "Ġclinic": 27813, - "Ġclinical": 14490, - "Ġclinically": 69332, - "Ġclinicians": 77445, - "Ġclinics": 43235, - "Ġclip": 12327, - "Ġclipboard": 46034, - "Ġclipped": 73059, - "Ġclipping": 61856, - "Ġclips": 26111, - "Ġclique": 80379, - "Ġclit": 91762, - "Ġcljs": 26284, - "Ġclk": 45798, - "Ġclo": 5292, - "Ġcloak": 61394, - "Ġclock": 8866, - "Ġclocks": 50337, - "Ġclockwise": 65670, - "Ġclone": 14715, - "Ġcloned": 54119, - "Ġclones": 65907, - "Ġcloning": 77866, - "Ġclos": 4496, - "Ġclose": 3265, - "ĠcloseButton": 88314, - "ĠcloseModal": 94248, - "Ġclosed": 7877, - "Ġclosely": 15148, - "Ġcloser": 12128, - "Ġcloses": 33250, - "Ġclosest": 18093, - "Ġcloset": 31944, - "Ġclosets": 94740, - "Ġclosing": 15316, - "Ġclosure": 21955, - "Ġclosures": 59900, - "Ġclot": 93163, - "Ġcloth": 27292, - "Ġclothes": 15097, - "Ġclothing": 17438, - "Ġcloud": 9437, - "Ġclouds": 29514, - "Ġcloudy": 73549, - "Ġcloves": 84288, - "Ġclown": 68468, - "Ġclr": 62127, - "Ġcls": 12790, - "Ġclub": 6335, - "Ġclubhouse": 93433, - "Ġclubs": 18890, - "Ġclue": 29989, - "Ġclues": 42675, - "Ġclums": 76957, - "Ġclumsy": 93218, - "Ġcluster": 10652, - "Ġclustered": 92758, - "Ġclustering": 58354, - "Ġclusters": 26968, - "Ġclutch": 42689, - "Ġclutter": 53816, - "Ġcm": 9961, - "Ġcmake": 92996, - "Ġcmap": 40778, - "Ġcmb": 60893, - "Ġcmd": 5439, - "Ġcmdline": 94106, - "Ġcmds": 47657, - "Ġcmp": 26089, - "Ġcms": 26270, - "Ġcn": 13665, - "Ġcname": 78514, - "Ġcnn": 60458, - "Ġcnt": 13195, - "Ġco": 1062, - "Ġcoach": 7247, - "Ġcoached": 69922, - "Ġcoaches": 23956, - "Ġcoaching": 23883, - "Ġcoal": 11497, - "Ġcoalition": 25217, - "Ġcoarse": 49247, - "Ġcoast": 13648, - "Ġcoastal": 34235, - "Ġcoaster": 81068, - "Ġcoastline": 79844, - "Ġcoat": 22875, - "Ġcoated": 48382, - "Ġcoating": 40294, - "Ġcoatings": 90925, - "Ġcoats": 55637, - "Ġcoax": 90866, - "Ġcob": 33828, - "Ġcoc": 21690, - "Ġcocaine": 38023, - "Ġcocci": 94909, - "Ġcoch": 79081, - "Ġcocina": 89606, - "Ġcock": 11272, - "Ġcockpit": 59624, - "Ġcocks": 68440, - "Ġcocktail": 39910, - "Ġcocktails": 56976, - "Ġcoco": 82350, - "Ġcocoa": 61788, - "Ġcoconut": 33457, - "Ġcocos": 78092, - "Ġcod": 20329, - "Ġcode": 2038, - "Ġcodec": 34647, - "Ġcodecs": 56152, - "Ġcoded": 46673, - "Ġcoder": 83542, - "Ġcodes": 13912, - "Ġcodigo": 34778, - "Ġcoding": 10822, - "Ġcoef": 55533, - "Ġcoeff": 17593, - "Ġcoefficient": 35606, - "Ġcoefficients": 36829, - "Ġcoeffs": 79172, - "Ġcoer": 93185, - "Ġcoerc": 54263, - "Ġcoerce": 83025, - "Ġcoercion": 77142, - "Ġcof": 68803, - "Ġcoff": 9894, - "Ġcoffee": 10799, - "Ġcoffin": 77666, - "Ġcog": 61566, - "Ġcogn": 18799, - "Ġcognition": 74210, - "Ġcognitive": 24675, - "Ġcoh": 70085, - "Ġcoherence": 77825, - "Ġcoherent": 55787, - "Ġcohesion": 95293, - "Ġcohesive": 86416, - "Ġcohort": 40844, - "Ġcohorts": 89288, - "Ġcoil": 39660, - "Ġcoils": 70760, - "Ġcoin": 16254, - "Ġcoinc": 22970, - "Ġcoincide": 71259, - "Ġcoincidence": 49178, - "Ġcoined": 77618, - "Ġcoins": 18762, - "Ġcoisa": 96700, - "Ġcoke": 83323, - "Ġcol": 1375, - "Ġcola": 83667, - "Ġcolabor": 69872, - "Ġcold": 9255, - "Ġcolder": 75114, - "Ġcole": 72941, - "Ġcoleg": 89055, - "Ġcoli": 73010, - "Ġcoll": 4530, - "Ġcollabor": 11182, - "Ġcollaborate": 50596, - "Ġcollaborated": 77074, - "Ġcollaborating": 72201, - "Ġcollaboration": 20031, - "Ġcollaborations": 82563, - "Ġcollaborative": 39706, - "Ġcollaborators": 78019, - "Ġcollage": 96902, - "Ġcollagen": 70213, - "Ġcollaps": 42023, - "Ġcollapse": 18179, - "Ġcollapsed": 28268, - "Ġcollapses": 86358, - "Ġcollapsing": 71518, - "Ġcollar": 36104, - "Ġcollateral": 51408, - "Ġcolle": 14148, - "Ġcolleague": 36344, - "Ġcolleagues": 17639, - "Ġcollect": 6530, - "Ġcollected": 14548, - "Ġcollecting": 25895, - "Ġcollection": 4426, - "ĠcollectionView": 26535, - "Ġcollections": 15302, - "Ġcollective": 21750, - "Ġcollectively": 44825, - "Ġcollector": 31953, - "Ġcollectors": 51448, - "Ġcollects": 51207, - "Ġcolleg": 24499, - "Ġcollege": 7770, - "Ġcolleges": 30152, - "Ġcollegiate": 94697, - "Ġcollide": 66090, - "Ġcollided": 78890, - "Ġcollider": 65544, - "Ġcollision": 18752, - "Ġcollisions": 47353, - "Ġcollo": 80948, - "Ġcollusion": 68337, - "Ġcoloc": 58740, - "Ġcolomb": 74224, - "Ġcolon": 14889, - "Ġcolonial": 36583, - "Ġcolonies": 47928, - "Ġcolonization": 95453, - "Ġcolony": 40936, - "Ġcolor": 1894, - "ĠcolorWith": 41511, - "ĠcolorWithRed": 61180, - "Ġcolore": 78787, - "Ġcolored": 27197, - "Ġcolorful": 33866, - "Ġcoloring": 34887, - "Ġcolormap": 76010, - "Ġcolors": 7987, - "Ġcolossal": 96837, - "Ġcolour": 12463, - "Ġcoloured": 57819, - "Ġcolourful": 69367, - "Ġcolours": 26138, - "Ġcols": 17000, - "Ġcolspan": 16848, - "Ġcolum": 93225, - "Ġcolumn": 3250, - "ĠcolumnHeader": 95624, - "ĠcolumnIndex": 66664, - "ĠcolumnName": 65746, - "Ġcolumna": 75299, - "Ġcolumnist": 53087, - "Ġcolumns": 8147, - "Ġcom": 469, - "Ġcoma": 69298, - "Ġcomando": 49868, - "Ġcomb": 3614, - "Ġcombat": 12610, - "Ġcombating": 95078, - "Ġcombin": 67125, - "Ġcombination": 10601, - "Ġcombinations": 27459, - "Ġcombine": 15963, - "ĠcombineReducers": 57943, - "Ġcombined": 10856, - "Ġcombines": 32411, - "Ġcombining": 34171, - "Ġcombo": 22734, - "ĠcomboBox": 42711, - "Ġcombos": 70133, - "Ġcombust": 43445, - "Ġcombustion": 58233, - "Ġcome": 2525, - "Ġcomeback": 46537, - "Ġcomed": 62013, - "Ġcomedian": 50812, - "Ġcomedic": 94371, - "Ġcomedy": 22358, - "Ġcoment": 32357, - "Ġcomentario": 82717, - "Ġcomentarios": 79412, - "Ġcomentário": 132365, - "Ġcomenz": 74109, - "Ġcomer": 90327, - "Ġcomerc": 70909, - "Ġcomercial": 73861, - "Ġcomes": 4041, - "Ġcomet": 69986, - "Ġcomeç": 81147, - "Ġcomeça": 136997, - "Ġcomeçar": 139143, - "Ġcomeçou": 142891, - "Ġcomfort": 6838, - "Ġcomfortable": 10655, - "Ġcomfortably": 44669, - "Ġcomforting": 68030, - "Ġcomforts": 96081, - "Ġcomfy": 59321, - "Ġcomic": 19724, - "Ġcomics": 28059, - "Ġcomida": 97778, - "Ġcoming": 5001, - "Ġcomm": 1063, - "Ġcomma": 31683, - "Ġcommand": 3210, - "Ġcommande": 67751, - "Ġcommanded": 53657, - "Ġcommander": 27994, - "Ġcommanders": 60327, - "Ġcommanding": 64340, - "Ġcommands": 11293, - "Ġcommas": 76602, - "Ġcomme": 21572, - "Ġcommem": 41217, - "Ġcommemor": 80054, - "Ġcommemorate": 82523, - "Ġcommenc": 57962, - "Ġcommence": 55345, - "Ġcommenced": 64262, - "Ġcommencement": 68444, - "Ġcommend": 73112, - "Ġcomment": 3980, - "Ġcommentaire": 86989, - "Ġcommentary": 30610, - "Ġcommentator": 68736, - "Ġcommentators": 62494, - "Ġcommented": 28686, - "Ġcommenter": 96066, - "Ġcommenting": 40265, - "Ġcomments": 6042, - "Ġcommerc": 94094, - "Ġcommerce": 35654, - "Ġcommercial": 8353, - "Ġcommercially": 53353, - "Ġcommercials": 62495, - "Ġcommission": 12123, - "Ġcommissioned": 43124, - "Ġcommissioner": 40343, - "Ġcommissioners": 73555, - "Ġcommissions": 53664, - "Ġcommit": 5266, - "Ġcommitment": 15155, - "Ġcommitments": 41256, - "Ġcommits": 41535, - "Ġcommitted": 11163, - "Ġcommittee": 12801, - "Ġcommittees": 41447, - "Ġcommitting": 39483, - "Ġcommod": 25550, - "Ġcommodities": 50867, - "Ġcommodity": 37883, - "Ġcommodo": 78324, - "Ġcommon": 4185, - "Ġcommonly": 16626, - "Ġcommonplace": 76914, - "Ġcommons": 64962, - "Ġcommun": 33461, - "Ġcommunal": 56837, - "Ġcommunauté": 141032, - "Ġcommune": 78145, - "Ġcommunic": 5932, - "Ġcommunicate": 19032, - "Ġcommunicated": 57935, - "Ġcommunicates": 91506, - "Ġcommunicating": 41147, - "Ġcommunication": 10535, - "Ġcommunications": 16893, - "Ġcommunicator": 86671, - "Ġcommunion": 93032, - "Ġcommunism": 70089, - "Ġcommunist": 49215, - "Ġcommunities": 10744, - "Ġcommunity": 3942, - "Ġcommute": 58163, - "Ġcommuter": 88003, - "Ġcommuters": 81721, - "Ġcommuting": 93850, - "Ġcomo": 7953, - "Ġcomp": 1367, - "Ġcompact": 16830, - "Ġcompagn": 82391, - "Ġcompan": 4536, - "Ġcompanies": 5110, - "Ġcompanion": 21741, - "Ġcompanions": 40857, - "Ġcompany": 2813, - "ĠcompanyId": 67175, - "ĠcompanyName": 92915, - "Ġcompar": 7654, - "Ġcomparable": 29039, - "Ġcomparative": 54294, - "Ġcomparatively": 70461, - "Ġcomparator": 52040, - "Ġcompare": 9429, - "ĠcompareTo": 79298, - "Ġcompared": 7707, - "Ġcomparer": 92355, - "Ġcompares": 42465, - "Ġcomparing": 26297, - "Ġcomparison": 12313, - "Ġcomparisons": 35495, - "Ġcompart": 38567, - "Ġcompartir": 81746, - "Ġcompartment": 43498, - "Ġcompartments": 86252, - "Ġcompass": 23721, - "Ġcompassion": 29381, - "Ġcompassionate": 59861, - "Ġcompat": 12139, - "Ġcompatibility": 24748, - "Ġcompatible": 18146, - "Ġcompañ": 63303, - "Ġcompañero": 142548, - "ĠcompañÃŃa": 136453, - "Ġcompel": 82073, - "Ġcompelled": 47884, - "Ġcompelling": 28622, - "Ġcompens": 14239, - "Ġcompensate": 45694, - "Ġcompensated": 65882, - "Ġcompensation": 19857, - "Ġcompet": 4533, - "Ġcompete": 20259, - "Ġcompeted": 66135, - "Ġcompetence": 57166, - "Ġcompetency": 92804, - "Ġcompetent": 39783, - "Ġcompeting": 26168, - "Ġcompetit": 51204, - "Ġcompetition": 10707, - "Ġcompetitions": 42582, - "Ġcompetitive": 14680, - "Ġcompetitiveness": 76551, - "Ġcompetitor": 42840, - "Ġcompetitors": 27550, - "Ġcompil": 96931, - "Ġcompilation": 28672, - "Ġcompile": 19192, - "Ġcompiled": 19697, - "Ġcompiler": 19415, - "Ġcompilers": 87075, - "Ġcompiling": 54220, - "Ġcompl": 4581, - "Ġcomplain": 27911, - "Ġcomplained": 33970, - "Ġcomplaining": 41026, - "Ġcomplains": 88958, - "Ġcomplaint": 12181, - "Ġcomplaints": 21171, - "Ġcomple": 1907, - "Ġcomplement": 22766, - "Ġcomplementary": 57435, - "Ġcomplet": 3459, - "Ġcompleta": 70201, - "Ġcompletamente": 84624, - "Ġcomplete": 4583, - "Ġcompleted": 8145, - "Ġcompletely": 6587, - "Ġcompleteness": 79314, - "Ġcompletes": 44595, - "Ġcompleting": 26568, - "Ġcompletion": 9755, - "ĠcompletionHandler": 45780, - "Ġcompleto": 55411, - "Ġcomplex": 6351, - "Ġcomplexes": 68025, - "Ġcomplexion": 90579, - "Ġcomplexities": 83040, - "Ġcomplexity": 23094, - "Ġcompliance": 8733, - "Ġcompliant": 48698, - "Ġcomplic": 68126, - "Ġcomplicated": 16965, - "Ġcomplication": 85819, - "Ġcomplications": 35405, - "Ġcomplied": 83764, - "Ġcompliment": 31141, - "Ġcomplimentary": 53328, - "Ġcompliments": 71639, - "Ġcomply": 25017, - "Ġcomplying": 88406, - "Ġcomplète": 138180, - "Ġcomponent": 3692, - "ĠcomponentDid": 23807, - "ĠcomponentDidMount": 26740, - "ĠcomponentDidUpdate": 85220, - "ĠcomponentName": 94142, - "ĠcomponentWill": 38845, - "ĠcomponentWillMount": 78138, - "ĠcomponentWillUnmount": 71576, - "Ġcomponente": 95689, - "Ġcomponents": 6813, - "Ġcomport": 51862, - "Ġcompos": 39221, - "Ġcompose": 30335, - "Ġcomposed": 23415, - "Ġcomposer": 39450, - "Ġcomposers": 94735, - "Ġcomposing": 75878, - "Ġcomposite": 27714, - "Ġcomposition": 18037, - "Ġcompositions": 61544, - "Ġcompost": 56723, - "Ġcompound": 23628, - "Ġcompounded": 87324, - "Ġcompounds": 31146, - "Ġcompr": 13247, - "Ġcompra": 57629, - "Ġcomprar": 53409, - "Ġcompreh": 12674, - "Ġcomprehend": 57289, - "Ġcomprehension": 61094, - "Ġcomprehensive": 15817, - "Ġcomprend": 59846, - "Ġcompress": 24611, - "Ġcompressed": 30649, - "Ġcompression": 25111, - "Ġcompressor": 58877, - "Ġcomprise": 53250, - "Ġcomprised": 38956, - "Ġcomprises": 39995, - "Ġcomprising": 45238, - "Ġcomprom": 25519, - "Ġcompromise": 29385, - "Ġcompromised": 43400, - "Ġcompromises": 91446, - "Ġcompromising": 75000, - "Ġcomps": 88273, - "Ġcompt": 53956, - "Ġcompte": 41363, - "Ġcompuls": 47106, - "Ġcompulsory": 64768, - "Ġcomput": 3716, - "Ġcomputation": 34447, - "Ġcomputational": 54480, - "Ġcomputations": 82599, - "Ġcompute": 12564, - "Ġcomputed": 24182, - "Ġcomputer": 6366, - "Ġcomputers": 18495, - "Ġcomputes": 57203, - "Ġcomputing": 24231, - "Ġcompét": 74232, - "Ġcomrades": 66028, - "Ġcomun": 42935, - "Ġcomunic": 45815, - "Ġcomunicación": 138332, - "Ġcomunidad": 93890, - "ĠcomunitÃł": 142560, - "Ġcomún": 140934, - "Ġcon": 390, - "Ġconc": 3529, - "Ġconcat": 33720, - "Ġconcaten": 39972, - "Ġconcatenate": 77784, - "Ġconcatenated": 97534, - "Ġconce": 19669, - "Ġconceal": 53162, - "Ġconcealed": 43033, - "Ġconced": 37730, - "Ġconcede": 80560, - "Ġconceded": 61587, - "Ġconceivable": 94783, - "Ġconceive": 76051, - "Ġconceived": 49078, - "Ġconcent": 10014, - "Ġconcentr": 17137, - "Ġconcentrate": 36355, - "Ġconcentrated": 37526, - "Ġconcentrates": 97905, - "Ġconcentrating": 75287, - "Ġconcentration": 19950, - "Ġconcentrations": 31366, - "Ġconcept": 7286, - "Ġconception": 42556, - "Ġconcepts": 18940, - "Ġconceptual": 43801, - "Ġconcern": 4643, - "Ġconcerned": 11658, - "Ġconcerning": 18310, - "Ġconcerns": 10520, - "Ġconcert": 20830, - "Ġconcerted": 96566, - "Ġconcerts": 46579, - "Ġconcess": 56826, - "Ġconcession": 68473, - "Ġconcessions": 61508, - "Ġconcise": 63594, - "Ġconcl": 92124, - "Ġconclude": 31094, - "Ġconcluded": 19941, - "Ġconcludes": 44437, - "Ġconcluding": 71026, - "Ġconclus": 82982, - "Ġconclusion": 16688, - "Ġconclusions": 30242, - "Ġconclusive": 97486, - "Ġconco": 75539, - "Ġconcrete": 14175, - "Ġconcurrency": 78010, - "Ġconcurrent": 34035, - "Ġconcurrently": 78026, - "Ġconcussion": 67906, - "Ġcond": 9756, - "Ġcondem": 21069, - "Ġcondemn": 38974, - "Ġcondemnation": 71006, - "Ġcondemned": 37925, - "Ġcondemning": 81134, - "Ġcondensed": 74726, - "Ġcondi": 86456, - "Ġcondiciones": 77658, - "Ġcondition": 2971, - "Ġconditional": 34687, - "Ġconditioned": 65631, - "Ġconditioner": 64324, - "Ġconditioning": 34021, - "Ġconditions": 4682, - "Ġcondições": 137578, - "Ġcondo": 43100, - "Ġcondol": 69460, - "Ġcondolences": 79193, - "Ġcondom": 36716, - "Ġcondominium": 84976, - "Ġcondoms": 78875, - "Ġcondos": 87375, - "Ġcondu": 74969, - "Ġconduc": 74296, - "Ġconducive": 94461, - "Ġconduct": 6786, - "Ġconducted": 13075, - "Ġconducting": 30374, - "Ġconductivity": 97871, - "Ġconductor": 60756, - "Ġconducts": 73098, - "Ġconduit": 76535, - "Ġcone": 22161, - "Ġconect": 69344, - "Ġconectar": 94754, - "Ġcones": 86892, - "Ġconex": 54204, - "Ġconexao": 97877, - "Ġconexion": 55426, - "Ġconexión": 89858, - "Ġconf": 2335, - "Ġconfer": 48743, - "Ġconference": 9816, - "Ġconferences": 37514, - "Ġconferred": 90570, - "Ġconfess": 47366, - "Ġconfessed": 62317, - "Ġconfession": 57373, - "Ġconfidence": 12136, - "Ġconfident": 16506, - "Ġconfidential": 26193, - "Ġconfidentiality": 64195, - "Ġconfidently": 76976, - "Ġconfig": 2193, - "ĠconfigFile": 92770, - "Ġconfigparser": 97437, - "Ġconfigs": 42309, - "Ġconfigur": 46971, - "Ġconfigurable": 43394, - "Ġconfiguration": 6546, - "Ġconfigurations": 32383, - "Ġconfigure": 14411, - "Ġconfigured": 19755, - "Ġconfiguring": 71783, - "Ġconfined": 44308, - "Ġconfinement": 65578, - "Ġconfines": 90020, - "Ġconfirm": 7683, - "ĠconfirmPassword": 88118, - "Ġconfirmation": 19539, - "Ġconfirmed": 10774, - "Ġconfirming": 48996, - "Ġconfirms": 42396, - "Ġconfisc": 56356, - "Ġconfiscated": 86270, - "Ġconfl": 82877, - "Ġconflic": 9159, - "Ġconflict": 12055, - "Ġconflicting": 51033, - "Ġconflicts": 25800, - "Ġconform": 25879, - "Ġconforme": 97542, - "Ġconformity": 89201, - "Ġconforms": 95164, - "Ġconfort": 65909, - "Ġconfront": 16877, - "Ġconfrontation": 47753, - "Ġconfronted": 40682, - "Ġconfronting": 74767, - "Ġconfuse": 58117, - "Ġconfused": 21815, - "Ġconfusing": 30615, - "Ġconfusion": 21340, - "Ġcong": 98798, - "Ġcongen": 81966, - "Ġcongest": 43285, - "Ġcongestion": 54046, - "Ġconglomer": 87651, - "Ġcongr": 30169, - "Ġcongrat": 39488, - "Ġcongratulate": 88146, - "Ġcongratulations": 81544, - "Ġcongreg": 76315, - "Ġcongregation": 58535, - "Ġcongress": 21040, - "Ġcongressional": 30619, - "Ġcongressman": 73488, - "Ġconhe": 91410, - "Ġconhec": 70483, - "Ġconj": 16491, - "Ġconject": 85915, - "Ġconjug": 63280, - "Ġconjunction": 31446, - "Ġconjunto": 67493, - "Ġconn": 4534, - "Ġconna": 73182, - "Ġconnaît": 139807, - "Ġconnect": 4564, - "Ġconnected": 8433, - "Ġconnecting": 20913, - "Ġconnection": 3633, - "ĠconnectionString": 62084, - "Ġconnections": 13234, - "Ġconnectivity": 30257, - "Ġconnector": 26989, - "Ġconnectors": 57070, - "Ġconnects": 33061, - "Ġconnexion": 72776, - "Ġconoc": 32846, - "Ġconocer": 59240, - "Ġconosc": 83069, - "Ġconqu": 38779, - "Ġconquer": 50530, - "Ġconquered": 68812, - "Ġconquest": 61266, - "Ġcons": 1585, - "Ġconsc": 13588, - "Ġconscience": 41463, - "Ġconscient": 73265, - "Ġconscious": 16941, - "Ġconsciously": 69803, - "Ġconsciousness": 24875, - "Ġconse": 29925, - "Ġconsec": 19908, - "Ġconsect": 33835, - "Ġconsectetur": 35140, - "Ġconsecutive": 23921, - "Ġconseg": 98051, - "Ġconsegu": 55788, - "Ġconseguir": 76859, - "Ġconseils": 91880, - "Ġconsensus": 23869, - "Ġconsent": 14433, - "Ġconsenting": 92401, - "Ġconsequ": 12494, - "Ġconsequat": 84887, - "Ġconsequence": 28674, - "Ġconsequences": 15917, - "Ġconsequential": 90083, - "Ġconsequently": 51294, - "Ġconserv": 11110, - "Ġconservation": 28611, - "Ġconservatism": 89574, - "Ġconservative": 15332, - "Ġconservatives": 33275, - "Ġconserve": 77448, - "Ġconsid": 76454, - "Ġconsider": 2908, - "Ġconsiderable": 23839, - "Ġconsiderably": 32352, - "Ġconsideration": 17879, - "Ġconsiderations": 37764, - "Ġconsidered": 6509, - "Ġconsidering": 12831, - "Ġconsiders": 31138, - "Ġconsist": 6685, - "Ġconsisted": 43560, - "Ġconsistency": 28137, - "Ġconsistent": 12966, - "Ġconsistently": 20699, - "Ġconsisting": 30606, - "Ġconsists": 17167, - "Ġconsolation": 98858, - "Ġconsole": 2339, - "Ġconsoles": 50093, - "Ġconsolid": 27131, - "Ġconsolidate": 73321, - "Ġconsolidated": 59291, - "Ġconsolidation": 59632, - "Ġconson": 77505, - "Ġconsort": 62829, - "Ġconsortium": 73994, - "Ġconspic": 74215, - "Ġconspicuous": 96885, - "Ġconspir": 21513, - "Ġconspiracy": 25292, - "Ġconst": 733, - "Ġconstant": 6783, - "Ġconstantly": 14971, - "Ġconstants": 18021, - "Ġconstellation": 82386, - "Ġconstexpr": 19512, - "Ġconstit": 8952, - "Ġconstitu": 30505, - "Ġconstituency": 64639, - "Ġconstituent": 74064, - "Ġconstituents": 50620, - "Ġconstitute": 34156, - "Ġconstituted": 64491, - "Ġconstitutes": 41575, - "Ġconstitution": 16407, - "Ġconstitutional": 24526, - "Ġconstr": 18941, - "Ġconstrain": 79699, - "Ġconstrained": 53752, - "Ġconstraint": 21568, - "Ġconstraints": 16982, - "Ġconstrucción": 140155, - "Ġconstruct": 9245, - "Ġconstructed": 20346, - "Ġconstructing": 49353, - "Ġconstruction": 8086, - "Ġconstructions": 95839, - "Ġconstructive": 53484, - "Ġconstructor": 4692, - "Ġconstructors": 54717, - "Ġconstructs": 56227, - "Ġconstrued": 70159, - "Ġconstrução": 138978, - "Ġconsts": 95432, - "Ġconsul": 74189, - "Ġconsulate": 98417, - "Ġconsult": 8498, - "Ġconsulta": 47562, - "Ġconsultancy": 73279, - "Ġconsultant": 30660, - "Ġconsultants": 49084, - "Ġconsultar": 98337, - "Ġconsultation": 28073, - "Ġconsultations": 74437, - "Ġconsulted": 60202, - "Ġconsulting": 30731, - "Ġconsum": 4662, - "Ġconsume": 24057, - "Ġconsumed": 25983, - "Ġconsumer": 11502, - "Ġconsumers": 13417, - "Ġconsumes": 59506, - "Ġconsuming": 34108, - "Ġconsumo": 79890, - "Ġconsumption": 15293, - "Ġcont": 683, - "Ġconta": 44766, - "Ġcontact": 3645, - "Ġcontacted": 24542, - "Ġcontacting": 46108, - "Ġcontacto": 67152, - "Ġcontacts": 18508, - "Ġcontador": 58568, - "Ġcontag": 63815, - "Ġcontagious": 88434, - "Ġcontain": 6644, - "Ġcontained": 12985, - "Ġcontainer": 5476, - "ĠcontainerView": 96961, - "Ġcontainers": 23853, - "Ġcontaining": 8482, - "Ġcontainment": 45211, - "Ġcontains": 5610, - "Ġcontamin": 34422, - "Ġcontaminants": 87859, - "Ġcontaminated": 51573, - "Ġcontamination": 46710, - "Ġcontar": 88705, - "Ġcontato": 74613, - "Ġconte": 59616, - "Ġcontempl": 38371, - "Ġcontemplate": 79807, - "Ġcontemplated": 92339, - "Ġcontemplating": 78242, - "Ġcontempor": 58404, - "Ġcontemporary": 18706, - "Ġcontempt": 45354, - "Ġconten": 54011, - "Ġcontend": 55095, - "Ġcontender": 56159, - "Ġcontenders": 67639, - "Ġcontends": 80933, - "Ġcontenido": 54254, - "Ġcontent": 2213, - "ĠcontentType": 32103, - "ĠcontentValues": 81418, - "ĠcontentView": 63253, - "Ġcontention": 51140, - "Ġcontentious": 66500, - "Ġcontents": 8794, - "Ġcontenu": 75254, - "Ġcontest": 13810, - "Ġcontestant": 87222, - "Ġcontestants": 74424, - "Ġcontested": 56210, - "Ġcontests": 46503, - "Ġcontext": 2266, - "Ġcontexto": 76743, - "Ġcontexts": 37597, - "Ġcontextual": 65151, - "Ġconteúdo": 136836, - "Ġcontiene": 80433, - "Ġcontiguous": 66503, - "Ġcontin": 1976, - "Ġcontinent": 31743, - "Ġcontinental": 57536, - "Ġcontinents": 65859, - "Ġconting": 38539, - "Ġcontingency": 82449, - "Ġcontingent": 58475, - "Ġcontinu": 16122, - "Ġcontinua": 90984, - "Ġcontinual": 76875, - "Ġcontinually": 34511, - "Ġcontinuar": 71007, - "Ġcontinuation": 41171, - "Ġcontinue": 3060, - "Ġcontinued": 8570, - "Ġcontinues": 9539, - "Ġcontinuing": 14354, - "Ġcontinuity": 49006, - "Ġcontinuous": 19259, - "Ġcontinuously": 30878, - "Ġcontinuum": 85801, - "Ġcontour": 41433, - "Ġcontours": 49031, - "Ġcontr": 6027, - "Ġcontra": 31050, - "Ġcontrace": 44836, - "Ġcontraception": 71254, - "Ġcontraceptive": 98290, - "Ġcontract": 5116, - "Ġcontracted": 49968, - "Ġcontracting": 59406, - "Ġcontraction": 70795, - "Ġcontractor": 29972, - "Ġcontractors": 32740, - "Ġcontracts": 17080, - "Ġcontractual": 75443, - "Ġcontrad": 22296, - "Ġcontradict": 42461, - "Ġcontradiction": 49759, - "Ġcontradictions": 80423, - "Ġcontradictory": 70140, - "Ġcontrario": 82813, - "Ġcontrary": 25047, - "Ġcontraseña": 65437, - "Ġcontrast": 12872, - "Ġcontrasting": 73955, - "Ġcontrasts": 82279, - "Ġcontrat": 87003, - "Ġcontrato": 81651, - "Ġcontre": 44873, - "Ġcontrib": 5919, - "Ġcontribute": 16792, - "Ġcontributed": 19590, - "Ġcontributes": 42972, - "Ġcontributing": 28720, - "Ġcontribution": 18527, - "Ġcontributions": 19026, - "Ġcontributor": 25305, - "Ġcontributors": 20343, - "Ġcontro": 82164, - "Ġcontrol": 2524, - "ĠcontrolId": 88532, - "Ġcontrole": 80113, - "Ġcontrolled": 14071, - "Ġcontroller": 6461, - "Ġcontrollers": 26225, - "Ġcontrolling": 25902, - "Ġcontrols": 11574, - "Ġcontrovers": 13365, - "Ġcontroversial": 20129, - "Ġcontroversies": 85793, - "Ġcontroversy": 25573, - "Ġcontrôle": 136577, - "Ġconv": 5686, - "Ġconven": 10138, - "Ġconvened": 94798, - "Ġconvenience": 19132, - "Ġconvenient": 16710, - "Ġconveniently": 48070, - "Ġconvent": 16705, - "Ġconvention": 21277, - "Ġconventional": 20692, - "Ġconventions": 44493, - "Ġconver": 19313, - "Ġconverge": 79767, - "Ġconverged": 96775, - "Ġconvergence": 55441, - "Ġconvers": 7517, - "Ġconversation": 10435, - "Ġconversations": 20959, - "Ġconverse": 94240, - "Ġconversion": 14409, - "Ġconversions": 48722, - "Ġconvert": 5508, - "ĠconvertView": 34544, - "Ġconverted": 16099, - "Ġconverter": 27058, - "Ġconverters": 88888, - "Ġconvertible": 67613, - "Ġconverting": 33437, - "Ġconverts": 32722, - "Ġconvex": 65930, - "Ġconvey": 20001, - "Ġconveyed": 72797, - "Ġconveying": 93065, - "Ġconveyor": 49141, - "Ġconvict": 90034, - "Ġconvicted": 23088, - "Ġconviction": 28091, - "Ġconvictions": 46915, - "Ġconvin": 21090, - "Ġconvinc": 35861, - "Ġconvince": 26910, - "Ġconvinced": 22166, - "Ġconvincing": 39561, - "Ġconvo": 97088, - "Ġconvolution": 55712, - "Ġconvoy": 79461, - "Ġcook": 4296, - "Ġcookbook": 76104, - "Ġcooked": 29105, - "Ġcooker": 62083, - "Ġcookie": 12544, - "Ġcookies": 8279, - "Ġcooking": 17233, - "Ġcooks": 72427, - "Ġcool": 7010, - "Ġcoolant": 96770, - "Ġcooldown": 43250, - "Ġcooled": 64310, - "Ġcooler": 35821, - "Ġcoolest": 73434, - "Ġcooling": 26917, - "Ġcoop": 82070, - "Ġcooper": 21676, - "Ġcooperate": 46803, - "Ġcooperating": 81489, - "Ġcooperation": 23046, - "Ġcooperative": 47466, - "Ġcoord": 16489, - "Ġcoorden": 96384, - "Ġcoordin": 29378, - "Ġcoordinate": 16184, - "Ġcoordinated": 46572, - "Ġcoordinates": 13934, - "Ġcoordinating": 65415, - "Ġcoordination": 37693, - "Ġcoordinator": 30284, - "Ġcoords": 23897, - "Ġcop": 6162, - "Ġcope": 36486, - "Ġcopied": 21774, - "Ġcopies": 10993, - "Ġcoping": 61982, - "Ġcopp": 56000, - "Ġcopper": 23285, - "Ġcoppia": 82246, - "Ġcops": 34217, - "Ġcopy": 2975, - "Ġcopying": 31039, - "Ġcopyright": 6920, - "Ġcopyrighted": 58613, - "Ġcopyrights": 85818, - "Ġcoquine": 64158, - "Ġcor": 1829, - "Ġcoral": 52003, - "Ġcoraz": 82002, - "Ġcorazón": 140766, - "Ġcoração": 140158, - "Ġcord": 22324, - "Ġcords": 79617, - "Ġcore": 6200, - "Ġcores": 35704, - "Ġcork": 89324, - "Ġcorn": 13776, - "Ġcorner": 9131, - "Ġcornerback": 67000, - "Ġcorners": 23462, - "Ġcornerstone": 81475, - "Ġcoron": 21989, - "Ġcoronary": 65198, - "Ġcoronavirus": 32233, - "Ġcoroutine": 77799, - "Ġcorp": 36466, - "Ġcorpo": 65634, - "Ġcorpor": 8368, - "Ġcorporate": 12870, - "Ġcorporation": 26669, - "Ġcorporations": 24346, - "Ġcorps": 33822, - "Ġcorpse": 51544, - "Ġcorpses": 72117, - "Ġcorpus": 42094, - "Ġcorr": 44353, - "Ġcorre": 12323, - "Ġcorrect": 4396, - "Ġcorrectamente": 58507, - "Ġcorrected": 35965, - "Ġcorrecting": 81375, - "Ġcorrection": 26262, - "Ġcorrections": 50379, - "Ġcorrective": 90752, - "Ġcorrectly": 12440, - "Ġcorrectness": 57323, - "Ġcorrel": 34883, - "Ġcorrelate": 80484, - "Ġcorrelated": 48293, - "Ġcorrelates": 96203, - "Ġcorrelation": 25588, - "Ġcorrelations": 68816, - "Ġcorreo": 45921, - "Ġcorres": 84064, - "Ġcorrespond": 7866, - "Ġcorrespondence": 43718, - "Ġcorrespondent": 48564, - "Ġcorresponding": 12159, - "Ġcorresponds": 33210, - "Ġcorrid": 33158, - "Ġcorridor": 45879, - "Ġcorridors": 74652, - "Ġcorro": 63356, - "Ġcorrobor": 78719, - "Ġcorros": 45557, - "Ġcorrosion": 55388, - "Ġcorrupt": 21917, - "Ġcorrupted": 49400, - "Ġcorruption": 21252, - "Ġcors": 43911, - "Ġcort": 22303, - "Ġcortex": 48270, - "Ġcortical": 82519, - "Ġcortisol": 88842, - "Ġcos": 7960, - "Ġcosa": 47513, - "Ġcosas": 55523, - "Ġcose": 85013, - "Ġcosine": 75259, - "Ġcosm": 55654, - "Ġcosmetic": 45452, - "Ġcosmetics": 64965, - "Ġcosmic": 54701, - "Ġcosmos": 82545, - "Ġcosplay": 88684, - "Ġcost": 2783, - "Ġcosta": 98702, - "Ġcosting": 53724, - "Ġcostly": 33248, - "Ġcosto": 77849, - "Ġcosts": 7049, - "Ġcostume": 31419, - "Ġcostumes": 44088, - "Ġcosy": 84879, - "Ġcosì": 68662, - "Ġcot": 47581, - "Ġcott": 96529, - "Ġcottage": 45622, - "Ġcotton": 23522, - "Ġcou": 3933, - "Ġcouch": 26148, - "Ġcougar": 47091, - "Ġcough": 39600, - "Ġcould": 1410, - "Ġcouldn": 7691, - "Ġcouleur": 75551, - "Ġcoun": 2294, - "Ġcouncil": 14833, - "Ġcouncill": 60045, - "Ġcouncillor": 90361, - "Ġcouncillors": 97405, - "Ġcouncils": 60683, - "Ġcounsel": 16080, - "Ġcounseling": 41216, - "Ġcounselling": 82681, - "Ġcounselor": 61375, - "Ġcounselors": 85247, - "Ġcount": 1760, - "Ġcountdown": 48028, - "Ġcounted": 29994, - "Ġcounter": 5546, - "Ġcountered": 85067, - "Ġcounterfeit": 82634, - "Ġcounterpart": 44016, - "Ġcounterparts": 37395, - "Ġcounters": 31532, - "Ġcountert": 60110, - "Ġcountertops": 84213, - "Ġcounties": 30176, - "Ġcounting": 25009, - "Ġcountless": 27601, - "Ġcountries": 5837, - "Ġcountry": 3146, - "ĠcountryCode": 90202, - "Ġcountryside": 46867, - "Ġcounts": 14579, - "Ġcounty": 13867, - "Ġcoup": 15706, - "Ġcoupe": 87509, - "Ġcouple": 5625, - "Ġcoupled": 33256, - "Ġcouples": 21264, - "Ġcoupling": 57986, - "Ġcoupon": 23821, - "Ġcoupons": 35298, - "Ġcour": 2081, - "Ġcourage": 24744, - "Ġcourageous": 74648, - "Ġcourier": 74517, - "Ġcours": 44269, - "Ġcourse": 3308, - "ĠcourseId": 87224, - "Ġcourses": 13980, - "Ġcoursework": 74433, - "Ġcourt": 5473, - "Ġcourte": 73899, - "Ġcourteous": 88188, - "Ġcourtesy": 26013, - "Ġcourthouse": 81032, - "Ġcourtroom": 58120, - "Ġcourts": 18828, - "Ġcourtyard": 65285, - "Ġcous": 26714, - "Ġcousin": 35171, - "Ġcousins": 59907, - "Ġcout": 5034, - "Ġcov": 21836, - "Ġcovariance": 59308, - "Ġcovenant": 63904, - "Ġcover": 3421, - "Ġcoverage": 10191, - "Ġcovered": 9761, - "Ġcovering": 18202, - "Ġcovers": 14521, - "Ġcovert": 56493, - "Ġcoveted": 69565, - "Ġcovid": 83017, - "Ġcow": 19362, - "Ġcoward": 65175, - "Ġcowboy": 80172, - "Ġcowork": 59968, - "Ġcoworkers": 82955, - "Ġcows": 45166, - "Ġcoy": 74609, - "Ġcoz": 84820, - "Ġcozy": 42435, - "Ġcoût": 136491, - "ĠcoÅĽ": 130743, - "Ġcp": 12490, - "Ġcpf": 63976, - "Ġcpp": 46824, - "Ġcps": 33265, - "Ġcpt": 94467, - "Ġcpu": 17319, - "Ġcq": 85822, - "Ġcr": 1560, - "Ġcra": 45041, - "Ġcrab": 59412, - "Ġcrack": 17486, - "Ġcrackdown": 58133, - "Ġcracked": 42839, - "Ġcrackers": 93811, - "Ġcracking": 51729, - "Ġcracks": 44863, - "Ġcraft": 10770, - "Ġcrafted": 33458, - "Ġcrafting": 44067, - "Ġcrafts": 43848, - "Ġcraftsm": 64781, - "Ġcraftsmanship": 83960, - "Ġcram": 99081, - "Ġcramped": 98732, - "Ġcran": 69537, - "Ġcrane": 72947, - "Ġcrank": 50258, - "Ġcrap": 35550, - "Ġcrappy": 82897, - "Ġcrash": 9920, - "Ġcrashed": 33753, - "Ġcrashes": 36137, - "Ġcrashing": 45474, - "Ġcrate": 17717, - "Ġcrater": 74707, - "Ġcrates": 81720, - "Ġcrave": 80313, - "Ġcraving": 63704, - "Ġcravings": 88828, - "Ġcraw": 23926, - "Ġcrawl": 45664, - "Ġcrawled": 92170, - "Ġcrawler": 73094, - "Ġcrawling": 71079, - "Ġcray": 88916, - "Ġcraz": 68591, - "Ġcrazy": 14264, - "Ġcrc": 37180, - "Ġcre": 1884, - "Ġcrea": 80770, - "Ġcread": 61486, - "Ġcreado": 93401, - "Ġcream": 12644, - "Ġcreampie": 61077, - "Ġcreams": 80216, - "Ġcreamy": 46885, - "Ġcrear": 47737, - "Ġcreat": 6056, - "Ġcreate": 1855, - "ĠcreateAction": 76636, - "ĠcreateContext": 83674, - "ĠcreateDate": 86485, - "ĠcreateElement": 86105, - "ĠcreateSelector": 82372, - "ĠcreateStackNavigator": 98820, - "ĠcreateState": 36717, - "ĠcreateStore": 53439, - "ĠcreateTime": 53149, - "ĠcreateUser": 60754, - "Ġcreated": 3465, - "ĠcreatedAt": 33051, - "ĠcreatedBy": 83773, - "Ġcreates": 11450, - "Ġcreating": 6825, - "Ġcreation": 9688, - "Ġcreations": 52762, - "Ġcreative": 11521, - "Ġcreatively": 92296, - "Ġcreativity": 27597, - "Ġcreator": 19919, - "Ġcreators": 33799, - "Ġcreature": 17218, - "Ġcreatures": 19970, - "Ġcred": 4187, - "Ġcredential": 40207, - "Ġcredentials": 16387, - "Ġcredibility": 37669, - "Ġcredible": 41910, - "Ġcredit": 6668, - "Ġcredited": 40757, - "Ġcreditor": 97389, - "Ġcreditors": 65499, - "Ġcredits": 20141, - "Ġcreds": 73177, - "Ġcree": 86439, - "Ġcreed": 91007, - "Ġcreek": 64405, - "Ġcreep": 27083, - "Ġcreeping": 87592, - "Ġcreepy": 50840, - "Ġcref": 11145, - "Ġcrem": 70196, - "Ġcreo": 88224, - "Ġcres": 45758, - "Ġcresc": 77988, - "Ġcrest": 71924, - "Ġcrew": 13627, - "Ġcrews": 42060, - "Ġcri": 27558, - "Ġcria": 83908, - "Ġcrian": 87138, - "Ġcriança": 141500, - "Ġcrianças": 134171, - "Ġcriar": 76410, - "Ġcrib": 79011, - "Ġcricket": 35999, - "Ġcried": 38069, - "Ġcries": 57745, - "Ġcrim": 84932, - "Ġcrime": 9778, - "Ġcrimes": 16660, - "Ġcriminal": 9158, - "Ġcriminals": 31538, - "Ġcrimson": 96019, - "Ġcripp": 70008, - "Ġcrippled": 97952, - "Ġcrippling": 96006, - "Ġcris": 58953, - "Ġcrises": 57087, - "Ġcrisis": 11251, - "Ġcrisp": 41854, - "Ġcrispy": 72524, - "Ġcrist": 67984, - "Ġcrit": 4638, - "Ġcriter": 80339, - "Ġcriteria": 12890, - "Ġcriterion": 35957, - "Ġcritic": 9741, - "Ġcritical": 9023, - "Ġcritically": 40340, - "Ġcriticised": 59379, - "Ġcriticism": 18817, - "Ġcriticisms": 62736, - "Ġcriticize": 60630, - "Ġcriticized": 31514, - "Ġcriticizing": 67988, - "Ġcritics": 22698, - "Ġcritique": 42565, - "Ġcritiques": 86213, - "Ġcro": 14093, - "Ġcrochet": 74019, - "Ġcron": 46582, - "Ġcrop": 19097, - "Ġcropped": 60143, - "Ġcropping": 98937, - "Ġcrops": 30565, - "Ġcrore": 44743, - "Ġcross": 5312, - "ĠcrossAxisAlignment": 43695, - "Ġcrossed": 27031, - "Ġcrosses": 49435, - "Ġcrossing": 26638, - "Ġcrossings": 86099, - "Ġcrossorigin": 30901, - "Ġcrossover": 48380, - "Ġcrossword": 91396, - "Ġcrow": 9276, - "Ġcrowd": 13428, - "Ġcrowded": 38213, - "Ġcrowdfunding": 76644, - "Ġcrowds": 34751, - "Ġcrown": 26533, - "Ġcrowned": 78643, - "Ġcrt": 97967, - "Ġcru": 22218, - "Ġcruc": 14788, - "Ġcrucial": 16587, - "Ġcrud": 75404, - "Ġcrude": 34650, - "Ġcruel": 27030, - "Ġcruelty": 53580, - "Ġcruis": 59097, - "Ġcruise": 30451, - "Ġcruiser": 75524, - "Ġcruising": 72227, - "Ġcrumbling": 88317, - "Ġcrumbs": 96577, - "Ġcrunch": 41734, - "Ġcrunchy": 94233, - "Ġcrus": 61718, - "Ġcrush": 5030, - "Ġcrushed": 32645, - "Ġcrusher": 7809, - "Ġcrushers": 25231, - "Ġcrushing": 14432, - "Ġcrust": 39612, - "Ġcruz": 86151, - "Ġcry": 15729, - "Ġcrying": 30199, - "Ġcrypt": 14436, - "Ġcrypto": 19028, - "Ġcryptoc": 20220, - "Ġcryptocurrencies": 43974, - "Ġcryptocurrency": 26037, - "Ġcryptographic": 89129, - "Ġcryptography": 86837, - "Ġcryst": 34342, - "Ġcrystal": 25055, - "Ġcrystall": 63468, - "Ġcrystals": 47373, - "Ġcré": 33180, - "Ġcréation": 80839, - "Ġcréd": 67192, - "Ġcrédit": 142263, - "Ġcrédito": 134517, - "Ġcréer": 74731, - "Ġcréé": 140613, - "ĠcrÃŃtica": 138841, - "Ġcs": 10532, - "Ġcsak": 80277, - "Ġcsr": 68932, - "Ġcsrf": 35522, - "Ġcss": 15877, - "Ġcst": 93804, - "Ġcsv": 13147, - "Ġcsvfile": 97895, - "Ġct": 20251, - "Ġctl": 64935, - "Ġctor": 56453, - "Ġctr": 50638, - "Ġctrl": 23743, - "Ġctx": 5635, - "Ġctxt": 59162, - "Ġctype": 85507, - "Ġctypes": 48219, - "Ġcu": 6871, - "Ġcual": 27090, - "Ġcuales": 94749, - "Ġcualquier": 45909, - "Ġcuando": 26346, - "Ġcuanto": 86487, - "Ġcuatro": 76008, - "Ġcub": 18728, - "Ġcube": 23739, - "Ġcubes": 54104, - "Ġcubic": 40899, - "Ġcuc": 74291, - "Ġcuck": 62179, - "Ġcuckold": 81252, - "Ġcucumber": 64932, - "Ġcud": 78587, - "Ġcuda": 24408, - "ĠcudaMemcpy": 61284, - "Ġcudd": 64145, - "Ġcue": 49398, - "Ġcuent": 87238, - "Ġcuenta": 31095, - "Ġcuer": 56295, - "Ġcuerpo": 62513, - "Ġcues": 55916, - "Ġcuff": 74423, - "Ġcuffs": 89469, - "Ġcui": 37944, - "Ġcuid": 56676, - "Ġcuis": 30447, - "Ġcuisine": 35005, - "Ġcuk": 92743, - "Ġcul": 11695, - "Ġculinary": 57341, - "Ġculmination": 92201, - "Ġculo": 64398, - "Ġculp": 96925, - "Ġculpa": 83285, - "Ġculprit": 74183, - "Ġcult": 4511, - "Ġcultiv": 26883, - "Ġcultivate": 66532, - "Ġcultivated": 66066, - "Ġcultivating": 98039, - "Ġcultivation": 51029, - "Ġcultura": 73635, - "Ġcultural": 12752, - "Ġculturally": 65863, - "Ġculture": 7674, - "Ġcultured": 88848, - "Ġcultures": 26735, - "Ġcum": 12177, - "Ġcumbersome": 95090, - "Ġcumpl": 73355, - "Ġcumshot": 94627, - "Ġcumulative": 39844, - "Ġcunning": 80679, - "Ġcunt": 68701, - "Ġcup": 10525, - "Ġcupboard": 85941, - "Ġcupcakes": 87893, - "Ġcupid": 92443, - "Ġcups": 25374, - "Ġcur": 2847, - "Ġcurated": 57632, - "Ġcurator": 86705, - "Ġcurb": 43862, - "Ġcure": 26116, - "Ġcured": 63588, - "Ġcuring": 96230, - "Ġcuriosity": 40228, - "Ġcurious": 22208, - "Ġcurl": 13957, - "Ġcurled": 91526, - "Ġcurls": 88949, - "Ġcurly": 68103, - "Ġcurr": 9804, - "Ġcurrencies": 35602, - "Ġcurrency": 11413, - "Ġcurrent": 1482, - "ĠcurrentDate": 59813, - "ĠcurrentIndex": 50040, - "ĠcurrentItem": 91627, - "ĠcurrentNode": 46299, - "ĠcurrentPage": 39314, - "ĠcurrentPlayer": 90068, - "ĠcurrentPosition": 84418, - "ĠcurrentState": 57878, - "ĠcurrentTime": 39199, - "ĠcurrentUser": 31443, - "ĠcurrentValue": 66248, - "Ġcurrently": 5023, - "Ġcurrents": 59601, - "Ġcurriculum": 29576, - "Ġcurry": 54078, - "Ġcurs": 23143, - "Ġcurse": 40000, - "Ġcursed": 62871, - "Ġcurses": 67147, - "Ġcurso": 47092, - "Ġcursor": 8128, - "Ġcursos": 86491, - "Ġcurt": 43178, - "Ġcurtain": 45766, - "Ġcurtains": 53399, - "Ġcurvature": 82133, - "Ġcurve": 15655, - "Ġcurved": 49164, - "Ġcurves": 35933, - "Ġcus": 79970, - "Ġcush": 32768, - "Ġcushion": 44638, - "Ġcushions": 67141, - "Ġcust": 16564, - "Ġcustody": 24492, - "Ġcustom": 2526, - "Ġcustomary": 72248, - "Ġcustomer": 6002, - "ĠcustomerId": 67505, - "Ġcustomers": 6310, - "Ġcustomizable": 62074, - "Ġcustomization": 48041, - "Ġcustomize": 31087, - "Ġcustomized": 31689, - "Ġcustoms": 34769, - "Ġcut": 3931, - "Ġcute": 18838, - "Ġcutoff": 44279, - "Ġcuts": 15104, - "Ġcutter": 61605, - "Ġcutting": 14376, - "Ġcuz": 90815, - "ĠcuÌ": 143455, - "ĠcuÌī": 143456, - "ĠcuÌīa": 143457, - "Ġcuá»iji": 129742, - "Ġcuá»ijn": 135570, - "Ġcuá»Ļc": 128564, - "Ġcv": 5544, - "Ġcvs": 93142, - "Ġcw": 53091, - "Ġcwd": 46938, - "Ġcx": 20716, - "Ġcy": 9503, - "Ġcyan": 57888, - "Ġcyber": 20847, - "Ġcybersecurity": 61442, - "Ġcyc": 43348, - "Ġcycl": 31243, - "Ġcycle": 10775, - "Ġcycles": 24484, - "Ġcyclic": 76002, - "Ġcycling": 32062, - "Ġcyclist": 80031, - "Ġcyclists": 55083, - "Ġcyl": 41921, - "Ġcylinder": 34564, - "Ġcylinders": 74321, - "Ġcylindrical": 78510, - "Ġcyn": 47264, - "Ġcynical": 69679, - "Ġcyst": 62481, - "Ġcyt": 78809, - "Ġcytok": 82085, - "Ġcz": 17988, - "Ġczas": 47419, - "Ġczy": 35950, - "ĠczÄĻ": 69294, - "ĠczÄĻsto": 131830, - "ĠczÄĻÅĽci": 130399, - "ĠczÄĻÅĽÄĩ": 135994, - "ĠczÅĤ": 133089, - "ĠczÅĤowie": 133090, - "ĠczÅĤowiek": 133091, - "Ġcá": 58701, - "Ġcác": 78228, - "Ġcách": 128328, - "Ġcái": 128530, - "Ġcámara": 142552, - "Ġcán": 132356, - "Ġcánh": 134374, - "Ġcáo": 129410, - "Ġcâ": 47824, - "Ġcân": 130660, - "Ġcâu": 129260, - "Ġcây": 129368, - "Ġcé": 63834, - "Ġcél": 83750, - "Ġcélib": 94336, - "Ġcòn": 128320, - "Ġcó": 28776, - "Ġcódigo": 44059, - "Ġcómo": 54896, - "Ġcô": 128434, - "Ġcông": 62029, - "Ġcôt": 70970, - "Ġcôté": 80237, - "Ġcùng": 128340, - "Ġcú": 132880, - "Ġcüm": 143989, - "Ġcümle": 143990, - "ĠcÃł": 130849, - "ĠcÃłng": 129357, - "ĠcÄĥ": 39257, - "ĠcÄĥn": 129209, - "ĠcÄĥng": 139529, - "ĠcÅ©": 133138, - "ĠcÅ©ng": 128268, - "ĠcÅĵur": 138295, - "ĠcÆ¡": 128322, - "Ġcư": 129447, - "ĠcÆ°á»Ľi": 136273, - "Ġcưá»Ŀi": 130692, - "Ġcưá»Ŀng": 132300, - "Ġcạnh": 129623, - "Ġcả": 125440, - "Ġcải": 131867, - "Ġcảm": 128467, - "Ġcảnh": 129111, - "Ġcấp": 128376, - "Ġcấu": 133795, - "Ġcầm": 134650, - "Ġcần": 128360, - "Ġcầu": 128451, - "Ġcắt": 134362, - "Ġcặp": 139519, - "ĠcáºŃn": 136855, - "ĠcáºŃp": 130569, - "ĠcáºŃu": 131873, - "Ġcụ": 129705, - "Ġcục": 138831, - "Ġcá»§": 140845, - "Ġcá»§a": 59735, - "Ġcứ": 126500, - "Ġcứng": 137142, - "Ġcứu": 129156, - "Ġcá»±c": 129541, - "Ġcá»ij": 129234, - "Ġcá»ķ": 129057, - "Ġcá»Ļng": 130700, - "Ġcá»Ń": 134603, - "Ġcá»Ńa": 129137, - "Ġd": 294, - "ĠdB": 43768, - "Ġda": 2994, - "Ġdaar": 59347, - "Ġdab": 82768, - "Ġdabei": 49536, - "Ġdac": 76892, - "Ġdad": 17760, - "Ġdaddy": 56542, - "Ġdado": 57792, - "Ġdados": 27945, - "Ġdads": 88761, - "Ġdaemon": 39293, - "Ġdafür": 67952, - "Ġdag": 28069, - "Ġdagen": 89951, - "Ġdagger": 39231, - "Ġdah": 52488, - "Ġdaha": 61494, - "Ġdaher": 93328, - "Ġdai": 62392, - "Ġdaily": 7298, - "Ġdairy": 33379, - "Ġdak": 97053, - "Ġdal": 24738, - "Ġdalam": 29792, - "Ġdall": 62993, - "Ġdalla": 48208, - "Ġdalle": 85244, - "Ġdam": 3739, - "Ġdamage": 5557, - "Ġdamaged": 20123, - "Ġdamages": 25129, - "Ġdamaging": 33346, - "Ġdame": 64767, - "Ġdamer": 41951, - "Ġdames": 84221, - "Ġdamit": 40870, - "Ġdamn": 26762, - "Ġdamned": 67365, - "Ġdamning": 95303, - "Ġdamp": 40269, - "Ġdamping": 83514, - "Ġdams": 82525, - "Ġdan": 9101, - "Ġdance": 15254, - "Ġdanced": 83752, - "Ġdancer": 63582, - "Ġdancers": 60483, - "Ġdances": 72706, - "Ġdancing": 27966, - "Ġdando": 92645, - "Ġdane": 88595, - "Ġdang": 57512, - "Ġdanger": 7978, - "Ġdangerous": 11406, - "Ġdangerously": 58494, - "Ġdangers": 35964, - "Ġdangling": 91623, - "Ġdanh": 98896, - "Ġdank": 80122, - "Ġdanmark": 89192, - "Ġdann": 24929, - "Ġdans": 6866, - "Ġdansk": 49320, - "Ġdanske": 55753, - "Ġdanych": 82217, - "Ġdao": 24775, - "Ġdap": 81521, - "Ġdapat": 44117, - "Ġdar": 15269, - "Ġdara": 64069, - "Ġdarauf": 74054, - "Ġdare": 32204, - "Ġdared": 74935, - "Ġdarf": 87231, - "Ġdari": 24200, - "Ġdaring": 58672, - "Ġdark": 6319, - "Ġdarken": 94688, - "Ġdarker": 39030, - "Ġdarkest": 75969, - "Ġdarkness": 26298, - "Ġdarling": 75645, - "Ġdarm": 83302, - "Ġdarn": 73677, - "Ġdart": 55967, - "Ġdarüber": 95038, - "Ġdas": 6616, - "Ġdash": 23911, - "Ġdashboard": 26967, - "Ġdashed": 66722, - "Ġdashes": 87546, - "Ġdass": 14948, - "Ġdat": 3258, - "Ġdata": 821, - "ĠdataArray": 83712, - "ĠdataGridView": 18038, - "ĠdataGridViewCellStyle": 26441, - "ĠdataGridViewTextBoxColumn": 94425, - "ĠdataIndex": 41994, - "ĠdataList": 58595, - "ĠdataSet": 56053, - "ĠdataSize": 89961, - "ĠdataSnapshot": 64193, - "ĠdataSource": 29554, - "ĠdataTable": 62766, - "ĠdataType": 22285, - "Ġdatab": 71240, - "Ġdatabase": 4625, - "Ġdatabases": 31806, - "Ġdataframe": 38228, - "Ġdatap": 61723, - "Ġdatas": 16879, - "Ġdataset": 10337, - "Ġdatasets": 29425, - "Ġdatasource": 69156, - "Ġdatastore": 64986, - "Ġdatatable": 93006, - "Ġdatatype": 46634, - "Ġdate": 2400, - "ĠdateFormat": 49267, - "ĠdateFormatter": 69776, - "ĠdatePicker": 92151, - "ĠdateString": 85498, - "ĠdateTime": 34608, - "Ġdated": 29005, - "Ġdates": 12713, - "Ġdatetime": 8874, - "Ġdati": 71427, - "Ġdating": 4924, - "Ġdatings": 42270, - "Ġdatingside": 76035, - "Ġdatingsider": 84865, - "Ġdato": 46292, - "Ġdatos": 17751, - "Ġdatum": 41556, - "Ġdau": 88280, - "Ġdaughter": 9803, - "Ġdaughters": 29868, - "Ġdaunting": 56597, - "Ġdav": 40769, - "Ġdavid": 53946, - "Ġdavidjl": 98844, - "Ġdavon": 74565, - "Ġdavran": 142801, - "ĠdavranÄ±ÅŁ": 142802, - "Ġdawn": 38393, - "Ġday": 1899, - "Ġdaycare": 99154, - "Ġdaylight": 52021, - "Ġdays": 2849, - "Ġdaytime": 61082, - "Ġdazu": 53797, - "Ġdazz": 59918, - "Ġdazzling": 76988, - "ĠdaÃŁ": 94567, - "Ġdaģı": 141670, - "Ġdaģıt": 141671, - "Ġdb": 2927, - "ĠdbContext": 55495, - "ĠdbHelper": 95980, - "ĠdbName": 75564, - "Ġdbc": 79645, - "Ġdbg": 47904, - "Ġdbl": 88995, - "Ġdbname": 83492, - "Ġdbo": 55859, - "Ġdbs": 84581, - "Ġdbus": 73696, - "Ġdc": 19402, - "Ġdcc": 91279, - "Ġdct": 90164, - "Ġdd": 19647, - "Ġddl": 55780, - "Ġde": 409, - "Ġdeactivate": 66245, - "Ġdeactivated": 83616, - "Ġdead": 5593, - "Ġdeadliest": 98369, - "Ġdeadline": 21428, - "Ġdeadlines": 57882, - "Ġdeadlock": 93345, - "Ġdeadly": 24142, - "Ġdeaf": 46742, - "Ġdeal": 3484, - "Ġdealer": 23321, - "Ġdealers": 26199, - "Ġdealership": 61196, - "Ġdealing": 14550, - "Ġdealings": 65929, - "Ġdealloc": 77670, - "Ġdeals": 12506, - "Ġdealt": 25934, - "Ġdean": 72862, - "Ġdear": 24253, - "Ġdearly": 97563, - "Ġdeath": 4545, - "Ġdeaths": 16375, - "Ġdeb": 4222, - "Ġdebacle": 98912, - "Ġdebate": 11004, - "Ġdebated": 58574, - "Ġdebates": 36535, - "Ġdebating": 70413, - "Ġdebe": 34374, - "Ġdeben": 73613, - "Ġdeber": 58205, - "Ġdeberá": 140551, - "ĠdeberÃŃa": 139605, - "Ġdebian": 96078, - "Ġdebido": 90892, - "Ġdebilitating": 91790, - "Ġdebit": 45353, - "Ġdebounce": 76839, - "Ġdebris": 33998, - "Ġdebt": 11636, - "Ġdebtor": 93762, - "Ġdebts": 44205, - "Ġdebug": 7390, - "Ġdebugger": 44473, - "Ġdebugging": 27703, - "Ġdebunk": 77193, - "Ġdebut": 17306, - "Ġdebuted": 57085, - "Ġdec": 1622, - "Ġdecad": 87033, - "Ġdecade": 13212, - "Ġdecades": 10793, - "Ġdecals": 97685, - "Ġdecay": 30715, - "Ġdece": 30852, - "Ġdeceased": 42620, - "Ġdeceit": 85485, - "Ġdeceive": 92828, - "Ġdeceived": 97784, - "Ġdecember": 89011, - "Ġdecency": 98270, - "Ġdecent": 14977, - "Ġdecentral": 38105, - "Ġdecentralized": 47963, - "Ġdeception": 63475, - "Ġdeceptive": 80274, - "Ġdecid": 69393, - "Ġdecide": 10279, - "Ġdecided": 6635, - "Ġdecidedly": 76020, - "Ġdecides": 27627, - "Ġdeciding": 29130, - "Ġdecimal": 12122, - "Ġdecimals": 58328, - "Ġdecipher": 74177, - "Ġdecir": 48918, - "Ġdecis": 33022, - "Ġdecision": 5480, - "Ġdecisions": 11181, - "Ġdecisive": 50291, - "Ġdecisión": 141760, - "Ġdecisão": 139374, - "Ġdeck": 9530, - "Ġdecking": 89994, - "Ġdecks": 29781, - "Ġdecl": 3963, - "Ġdeclar": 9445, - "Ġdeclaración": 90654, - "Ġdeclaration": 18004, - "Ġdeclarations": 15693, - "Ġdeclare": 15913, - "Ġdeclared": 14275, - "Ġdeclares": 49788, - "Ġdeclaring": 36531, - "Ġdecline": 17704, - "Ġdeclined": 18758, - "Ġdeclines": 56954, - "Ġdeclining": 42748, - "Ġdecltype": 75853, - "Ġdeco": 67552, - "Ġdecode": 16895, - "Ġdecoded": 29213, - "Ġdecoder": 24551, - "Ġdecoding": 47116, - "Ġdecom": 28502, - "Ġdecomposition": 65166, - "Ġdecor": 10576, - "Ġdecorate": 56581, - "Ġdecorated": 36009, - "Ġdecorating": 48582, - "Ġdecoration": 20228, - "Ġdecorations": 47579, - "Ġdecorative": 45436, - "Ġdecorator": 50678, - "Ġdecorators": 62678, - "Ġdecre": 9728, - "Ġdecrease": 18472, - "Ġdecreased": 24938, - "Ġdecreases": 42054, - "Ġdecreasing": 43549, - "Ġdecree": 60534, - "Ġdecrement": 60832, - "Ġdecrypt": 38126, - "Ġdecrypted": 62961, - "Ġdecryption": 89374, - "Ġded": 7681, - "Ġdedic": 56666, - "Ġdedicate": 73604, - "Ġdedicated": 12235, - "Ġdedication": 38855, - "Ġdeduct": 36810, - "Ġdeducted": 95504, - "Ġdeductible": 77812, - "Ġdeduction": 38843, - "Ġdeductions": 70637, - "Ġdee": 44733, - "Ġdeed": 55308, - "Ġdeeds": 53711, - "Ġdeem": 81477, - "Ġdeemed": 24636, - "Ġdeep": 5538, - "Ġdeepcopy": 55558, - "Ġdeepen": 91692, - "Ġdeeper": 19117, - "Ġdeepest": 50521, - "Ġdeeply": 17247, - "Ġdeer": 38049, - "Ġdef": 707, - "ĠdefStyle": 64875, - "ĠdefStyleAttr": 86090, - "Ġdefamation": 88101, - "Ġdefault": 1638, - "ĠdefaultCenter": 55646, - "ĠdefaultManager": 98920, - "ĠdefaultMessage": 78193, - "ĠdefaultProps": 79297, - "ĠdefaultValue": 20163, - "Ġdefaultdict": 42908, - "Ġdefaulted": 92989, - "Ġdefaults": 16674, - "Ġdefaultstate": 54458, - "Ġdefe": 10969, - "Ġdefeat": 18019, - "Ġdefeated": 23283, - "Ġdefeating": 53116, - "Ġdefeats": 68769, - "Ġdefect": 22219, - "Ġdefective": 63803, - "Ġdefects": 41555, - "Ġdefence": 22835, - "Ġdefend": 10505, - "Ġdefendant": 25799, - "Ġdefendants": 39146, - "Ġdefended": 34744, - "Ġdefender": 28215, - "Ġdefenders": 40031, - "Ġdefending": 28169, - "Ġdefends": 80960, - "Ġdefense": 9055, - "Ġdefenseman": 82056, - "Ġdefenses": 45516, - "Ġdefensive": 16016, - "Ġdefensively": 81980, - "Ġdefer": 17956, - "Ġdeferred": 26239, - "Ġdefiance": 89783, - "Ġdefiant": 86271, - "Ġdeficiencies": 71846, - "Ġdeficiency": 47194, - "Ġdeficient": 86444, - "Ġdeficit": 28187, - "Ġdeficits": 55996, - "Ġdefin": 35122, - "Ġdefine": 6979, - "Ġdefined": 4512, - "Ġdefines": 18653, - "Ġdefining": 26312, - "Ġdefinit": 30288, - "Ġdefinite": 43770, - "Ġdefinitely": 8491, - "Ġdefinition": 7271, - "Ġdefinitions": 17473, - "Ġdefinitive": 44713, - "Ġdeflate": 92689, - "Ġdeflect": 82940, - "Ġdeform": 78112, - "Ġdeformation": 90521, - "Ġdefs": 75127, - "Ġdefy": 89572, - "Ġdeg": 5254, - "Ġdegli": 46569, - "Ġdegradation": 52468, - "Ġdegrade": 95530, - "Ġdegraded": 90878, - "Ġdegree": 8381, - "Ġdegrees": 12348, - "Ġdehydration": 98757, - "Ġdei": 21805, - "Ġdein": 94919, - "Ġdeine": 72701, - "Ġdeity": 73390, - "Ġdeix": 64756, - "Ġdej": 32963, - "Ġdeja": 75633, - "Ġdejar": 80399, - "Ġdejting": 94981, - "Ġdejtings": 71004, - "Ġdejtingsaj": 80605, - "Ġdel": 1594, - "Ġdela": 89539, - "Ġdelay": 7626, - "Ġdelayed": 22706, - "Ġdelaying": 79330, - "Ġdelays": 31074, - "Ġdele": 59293, - "Ġdeleg": 19854, - "Ġdelegate": 13380, - "Ġdelegated": 90657, - "Ġdelegates": 35059, - "Ġdelegation": 45261, - "Ġdelet": 19269, - "Ġdelete": 3698, - "ĠdeleteUser": 81056, - "Ġdeleted": 11062, - "Ġdeletes": 54170, - "Ġdeleting": 33011, - "Ġdeletion": 36066, - "Ġdeliber": 21150, - "Ġdeliberate": 44972, - "Ġdeliberately": 35092, - "Ġdelic": 60253, - "Ġdelicate": 35201, - "Ġdelicious": 17923, - "Ġdelight": 17970, - "Ġdelighted": 33972, - "Ġdelightful": 49089, - "Ġdelights": 95675, - "Ġdelim": 63209, - "Ġdelimited": 85328, - "Ġdelimiter": 29020, - "Ġdeline": 90684, - "Ġdeliver": 6359, - "Ġdelivered": 12600, - "Ġdeliveries": 54559, - "Ġdelivering": 23988, - "Ġdelivers": 27321, - "Ġdelivery": 9691, - "Ġdell": 24237, - "Ġdella": 15230, - "Ġdelle": 26973, - "Ġdello": 81601, - "Ġdelt": 96250, - "Ġdelta": 9477, - "ĠdeltaTime": 58479, - "ĠdeltaX": 93591, - "ĠdeltaY": 89404, - "Ġdeltas": 90587, - "Ġdeluxe": 78424, - "Ġdelve": 81745, - "Ġdem": 2429, - "Ġdemand": 7479, - "Ġdemande": 61063, - "Ġdemanded": 29426, - "Ġdemanding": 25135, - "Ġdemands": 18154, - "Ġdemasi": 95452, - "Ġdemean": 60452, - "Ġdemeanor": 93015, - "Ġdementia": 51757, - "Ġdemi": 92028, - "Ġdemise": 57864, - "Ġdemo": 16661, - "Ġdemocr": 12074, - "Ġdemocracy": 19525, - "Ġdemocrat": 96067, - "Ġdemocratic": 25542, - "Ġdemographic": 37362, - "Ġdemographics": 62234, - "Ġdemol": 35161, - "Ġdemolished": 75893, - "Ġdemolition": 60598, - "Ġdemon": 6952, - "Ġdemonic": 85124, - "Ġdemons": 43975, - "Ġdemonstr": 7756, - "Ġdemonstrate": 19869, - "Ġdemonstrated": 20459, - "Ġdemonstrates": 31116, - "Ġdemonstrating": 44196, - "Ġdemonstration": 29716, - "Ġdemonstrations": 43795, - "Ġdemonstrators": 66408, - "Ġdemos": 67253, - "Ġdemás": 137492, - "Ġden": 3371, - "Ġdend": 88952, - "Ġdenen": 69507, - "Ġdengan": 20414, - "Ġdenial": 33913, - "Ġdenied": 14820, - "Ġdenies": 46491, - "Ġdenim": 63805, - "Ġdenn": 51939, - "Ġdenne": 64336, - "Ġdenom": 49744, - "Ġdenomin": 61165, - "Ġdenomination": 94936, - "Ġdenominator": 46912, - "Ġdenote": 78064, - "Ġdenotes": 71114, - "Ġdenounced": 70517, - "Ġdens": 38850, - "Ġdense": 27950, - "Ġdensely": 96517, - "Ġdensities": 89716, - "Ġdensity": 17457, - "Ġdent": 18156, - "Ġdental": 28006, - "Ġdentist": 49251, - "Ġdentro": 35128, - "Ġdeny": 23101, - "Ġdenying": 40466, - "Ġdep": 2170, - "Ġdepart": 11515, - "Ġdepartamento": 95889, - "Ġdeparted": 55596, - "Ġdeparting": 80473, - "Ġdepartment": 9292, - "Ġdepartments": 25215, - "Ġdeparture": 24915, - "Ġdepend": 6761, - "Ġdependable": 73336, - "Ġdepended": 78001, - "Ġdependence": 43293, - "Ġdependencies": 19543, - "Ġdependency": 24036, - "Ġdependent": 17749, - "Ġdepending": 11649, - "Ġdepends": 13798, - "Ġdepict": 42404, - "Ġdepicted": 43794, - "Ġdepicting": 59694, - "Ġdepiction": 72664, - "Ġdepicts": 61891, - "Ġdepleted": 78166, - "Ġdepletion": 91848, - "Ġdeploy": 10517, - "Ġdeployed": 26075, - "Ġdeploying": 60317, - "Ġdeployment": 23172, - "Ġdeployments": 71542, - "Ġdepois": 65388, - "Ġdeport": 27239, - "Ġdeportation": 58271, - "Ġdeported": 67110, - "Ġdepos": 25297, - "Ġdeposit": 16539, - "Ġdeposited": 53468, - "Ġdeposition": 64274, - "Ġdeposits": 33651, - "Ġdepot": 44619, - "Ġdepr": 35880, - "Ġdeprecated": 31590, - "Ġdepreci": 71958, - "Ġdepreciation": 93089, - "Ġdepress": 38200, - "Ġdepressed": 41542, - "Ġdepressing": 70710, - "Ġdepression": 18210, - "Ġdepressive": 83464, - "Ġdeprivation": 68664, - "Ġdeprived": 61583, - "Ġdeps": 48178, - "Ġdept": 44593, - "Ġdepth": 7990, - "Ġdepths": 42857, - "Ġdepuis": 40099, - "Ġdeputies": 52828, - "Ġdeputy": 26066, - "Ġdeque": 41950, - "Ġdequeue": 83873, - "ĠdequeueReusableCell": 65382, - "ĠdequeueReusableCellWithIdentifier": 72805, - "Ġder": 2694, - "Ġderail": 82702, - "Ġderby": 90670, - "Ġdere": 25277, - "Ġderecho": 75689, - "Ġderechos": 85535, - "Ġdereg": 71815, - "Ġderen": 87862, - "Ġderiv": 18763, - "Ġderivation": 95254, - "Ġderivative": 31805, - "Ġderivatives": 42545, - "Ġderive": 42430, - "Ġderived": 14257, - "Ġderives": 74449, - "Ġderiving": 48089, - "Ġdermat": 60385, - "Ġdern": 35752, - "Ġdernier": 61791, - "Ġdernière": 87718, - "Ġderog": 91533, - "Ġderp": 66391, - "Ġdes": 939, - "Ġdesar": 39759, - "Ġdesarroll": 63696, - "Ġdesarrollo": 62616, - "Ġdesc": 6560, - "Ġdescargar": 89658, - "Ġdescend": 54568, - "Ġdescendant": 75851, - "Ġdescendants": 48346, - "Ġdescended": 57742, - "Ġdescending": 43084, - "Ġdescent": 36952, - "Ġdescon": 86630, - "Ġdescr": 56217, - "Ġdescri": 5018, - "Ġdescribe": 7512, - "Ġdescribed": 7481, - "Ġdescribes": 16555, - "Ġdescribing": 22692, - "Ġdescricao": 66720, - "Ġdescripcion": 55690, - "Ġdescription": 4008, - "Ġdescriptions": 27787, - "Ġdescriptive": 52844, - "Ġdescriptor": 16414, - "Ġdescriptors": 47517, - "Ġdesde": 22718, - "Ġdese": 50288, - "Ġdesea": 83561, - "Ġdeselect": 97956, - "Ġdesenv": 60244, - "Ġdeser": 96955, - "Ġdeserialize": 35240, - "Ġdesert": 23603, - "Ġdeserted": 82310, - "Ġdeserve": 22695, - "Ġdeserved": 44447, - "Ġdeserves": 29575, - "Ġdeserving": 75454, - "Ġdesi": 85488, - "Ġdesign": 2884, - "Ġdesignate": 74124, - "Ġdesignated": 23195, - "Ġdesignation": 42751, - "Ġdesigned": 6188, - "Ġdesigner": 14692, - "Ġdesigners": 25812, - "Ġdesigning": 29729, - "Ġdesigns": 14431, - "Ġdesirable": 34846, - "Ġdesire": 12591, - "Ġdesired": 12685, - "Ġdesires": 30997, - "Ġdesk": 18010, - "Ġdesks": 75815, - "Ġdesktop": 17505, - "Ġdesn": 65280, - "Ġdesp": 38960, - "Ġdespair": 45896, - "Ġdesper": 17955, - "Ġdesperate": 27395, - "Ġdesperately": 37543, - "Ġdesperation": 73324, - "Ġdespite": 8818, - "Ġdespre": 86625, - "Ġdespués": 49549, - "Ġdess": 20624, - "Ġdessa": 85479, - "Ġdessert": 42749, - "Ġdesserts": 71413, - "Ġdest": 3201, - "Ġdesta": 84778, - "Ġdestabil": 71157, - "Ġdestac": 72367, - "Ġdeste": 76136, - "ĠdesteÄŁi": 140384, - "Ġdestin": 50987, - "Ġdestination": 9106, - "ĠdestinationViewController": 91471, - "Ġdestinations": 33105, - "Ġdestined": 50587, - "Ġdestino": 68097, - "Ġdestiny": 46076, - "Ġdestroy": 6921, - "Ġdestroyed": 14425, - "Ġdestroyer": 95189, - "Ġdestroying": 32712, - "Ġdestroys": 59732, - "Ġdestruct": 20780, - "Ġdestruction": 19258, - "Ġdestructive": 39552, - "Ġdestructor": 45999, - "Ġdet": 3392, - "Ġdetach": 46781, - "Ġdetached": 43917, - "Ġdetachment": 99077, - "Ġdetail": 7716, - "Ġdetailed": 11682, - "Ġdetailing": 44193, - "Ġdetails": 3565, - "Ġdetain": 45582, - "Ġdetained": 36893, - "Ġdetainees": 66934, - "Ġdetal": 52152, - "Ġdetalle": 79720, - "Ġdetalles": 91329, - "Ġdetect": 11140, - "Ġdetected": 16507, - "Ġdetecting": 53526, - "Ġdetection": 17984, - "Ġdetections": 88627, - "Ġdetective": 44159, - "Ġdetectives": 58759, - "Ġdetector": 31214, - "Ġdetectors": 67987, - "Ġdetects": 66478, - "Ġdetention": 32173, - "Ġdeter": 4040, - "Ġdetergent": 90134, - "Ġdeterior": 38336, - "Ġdeterioration": 81089, - "Ġdetermin": 6315, - "Ġdeterminant": 86960, - "Ġdetermination": 25248, - "Ġdetermine": 8253, - "Ġdetermined": 10838, - "Ġdetermines": 26569, - "Ġdetermining": 25597, - "Ġdeterministic": 72349, - "Ġdeterrent": 82620, - "Ġdeton": 54674, - "Ġdetox": 60887, - "Ġdetr": 34353, - "Ġdetriment": 48908, - "Ġdetrimental": 63969, - "Ġdetta": 97197, - "Ġdette": 58928, - "Ġdeut": 83630, - "Ġdeutsch": 57184, - "Ġdeutsche": 68517, - "Ġdeutschen": 92191, - "Ġdeutschland": 92516, - "Ġdeux": 25552, - "Ġdeuxième": 139346, - "Ġdev": 3483, - "Ġdevant": 76458, - "Ġdevast": 22440, - "Ġdevastated": 57997, - "Ġdevastating": 32218, - "Ġdevastation": 81915, - "Ġdeve": 36144, - "Ġdevel": 89770, - "Ġdevelop": 2225, - "Ġdeveloped": 7881, - "Ġdeveloper": 15754, - "Ġdevelopers": 13402, - "Ġdeveloping": 11220, - "Ġdevelopment": 4401, - "Ġdevelopmental": 46906, - "Ġdevelopments": 24961, - "Ġdevelops": 38571, - "Ġdever": 87381, - "Ġdevez": 85940, - "Ġdeviation": 37564, - "Ġdeviations": 85265, - "Ġdevice": 3671, - "ĠdeviceId": 64757, - "Ġdevices": 7611, - "Ġdevil": 37636, - "Ġdevis": 97133, - "Ġdevise": 52065, - "Ġdevised": 68020, - "Ġdevoid": 75839, - "Ġdevote": 47672, - "Ġdevoted": 28229, - "Ġdevotion": 55257, - "Ġdevour": 87189, - "Ġdevout": 94562, - "Ġdevs": 80069, - "Ġdevuelve": 95567, - "Ġdew": 66432, - "Ġdex": 79901, - "Ġdez": 70768, - "Ġdeze": 34223, - "ĠdeÄŁ": 60987, - "ĠdeÄŁer": 125724, - "ĠdeÄŁerl": 127866, - "ĠdeÄŁerlendir": 127867, - "ĠdeÄŁerlendirme": 139057, - "ĠdeÄŁi": 126571, - "ĠdeÄŁil": 128721, - "ĠdeÄŁild": 133594, - "ĠdeÄŁildir": 133595, - "ĠdeÄŁiÅŁ": 129399, - "ĠdeÄŁiÅŁtir": 133382, - "Ġdf": 6764, - "Ġdfs": 25792, - "Ġdg": 40286, - "Ġdgv": 50971, - "Ġdh": 34096, - "Ġdhcp": 85787, - "Ġdhe": 76905, - "Ġdi": 1853, - "Ġdia": 17733, - "Ġdiabetes": 19754, - "Ġdiabetic": 70875, - "Ġdiag": 39717, - "Ġdiagn": 13191, - "Ġdiagnose": 57581, - "Ġdiagnosed": 28604, - "Ġdiagnoses": 84388, - "Ġdiagnosis": 22982, - "Ġdiagnostic": 15089, - "Ġdiagnostics": 49418, - "Ġdiagon": 84018, - "Ġdiagonal": 37236, - "Ġdiagram": 13549, - "Ġdiagrams": 46187, - "Ġdial": 27860, - "Ġdialect": 42279, - "Ġdialog": 7254, - "ĠdialogRef": 79777, - "Ġdialogs": 86236, - "Ġdialogue": 21276, - "Ġdiam": 12757, - "Ġdiameter": 23033, - "Ġdiamond": 22205, - "Ġdiamonds": 48051, - "Ġdiaper": 75753, - "Ġdiapers": 82862, - "Ġdiarr": 57605, - "Ġdiarrhea": 68293, - "Ġdiary": 46142, - "Ġdias": 40370, - "Ġdib": 41068, - "Ġdic": 21249, - "Ġdice": 22120, - "Ġdiced": 88864, - "Ġdich": 28853, - "Ġdicho": 92860, - "Ġdici": 79819, - "Ġdick": 25985, - "Ġdicks": 95498, - "Ġdict": 6451, - "Ġdictate": 61874, - "Ġdictated": 80398, - "Ġdictates": 79230, - "Ġdictator": 41184, - "Ġdictatorship": 68848, - "Ġdictionaries": 57514, - "Ġdictionary": 10997, - "ĠdictionaryWith": 84748, - "Ġdicts": 97599, - "Ġdid": 1521, - "ĠdidFinish": 76150, - "ĠdidReceiveMemoryWarning": 38141, - "ĠdidSelect": 52379, - "ĠdidSelectRowAtIndexPath": 95607, - "ĠdidSet": 62109, - "Ġdidn": 3207, - "Ġdidnt": 47607, - "Ġdie": 2746, - "Ġdied": 8469, - "Ġdies": 8725, - "Ġdiese": 26769, - "Ġdiesel": 32780, - "Ġdiesem": 36744, - "Ġdiesen": 50435, - "Ġdieser": 31008, - "Ġdieses": 46668, - "Ġdiet": 9968, - "Ġdieta": 66856, - "Ġdietary": 33525, - "Ġdiets": 40843, - "Ġdif": 1396, - "Ġdifer": 26929, - "Ġdiferen": 139741, - "Ġdiferencia": 94427, - "Ġdiferente": 77173, - "Ġdiferentes": 45318, - "Ġdiferença": 139742, - "Ġdiff": 3638, - "Ġdiffer": 1745, - "Ġdiffered": 87975, - "Ġdifference": 6672, - "Ġdifferences": 11799, - "Ġdifferent": 2155, - "Ġdifferential": 40164, - "Ġdifferentiate": 53163, - "Ġdifferentiated": 88042, - "Ġdifferentiation": 58938, - "Ġdifferently": 21303, - "Ġdiffering": 60369, - "Ġdiffers": 43542, - "Ġdiffic": 60807, - "Ġdifficile": 76311, - "Ġdifficolt": 141990, - "ĠdifficoltÃł": 141991, - "Ġdifficult": 5000, - "Ġdifficulties": 26038, - "Ġdifficulty": 16829, - "Ġdifficulté": 142370, - "Ġdiffs": 86947, - "Ġdiffuse": 54417, - "Ġdiffusion": 57330, - "Ġdiffé": 43078, - "Ġdifférence": 143108, - "Ġdifférent": 50099, - "Ġdifférentes": 95542, - "Ġdifférents": 84014, - "Ġdific": 77880, - "ĠdifÃŃc": 78865, - "ĠdifÃŃcil": 85480, - "Ġdig": 4078, - "Ġdigest": 20882, - "Ġdigestion": 73402, - "Ġdigestive": 58971, - "Ġdigging": 41100, - "Ġdigit": 15723, - "Ġdigital": 7377, - "ĠdigitalWrite": 64797, - "Ġdigitally": 67778, - "Ġdigits": 18509, - "Ġdign": 27577, - "Ġdignity": 37829, - "Ġdigs": 88957, - "Ġdijo": 64910, - "Ġdik": 46199, - "Ġdikke": 75038, - "Ġdil": 18840, - "Ġdilation": 74278, - "Ġdildo": 36503, - "Ġdile": 43161, - "Ġdilemma": 54767, - "Ġdilig": 38287, - "Ġdiligence": 62482, - "Ġdiligent": 96553, - "Ġdiligently": 90605, - "Ġdiluted": 79603, - "Ġdim": 5103, - "Ġdime": 73853, - "Ġdimension": 12871, - "Ġdimensional": 55887, - "Ġdimensions": 15336, - "Ġdimin": 47316, - "Ġdiminish": 56060, - "Ġdiminished": 53082, - "Ġdiminishing": 83053, - "Ġdims": 40888, - "Ġdin": 11623, - "Ġdine": 65107, - "Ġdiner": 88106, - "Ġdinero": 65808, - "Ġding": 66442, - "Ġdinheiro": 96487, - "Ġdining": 17914, - "Ġdinner": 13856, - "Ġdinners": 73313, - "Ġdinosaur": 62889, - "Ġdinosaurs": 64275, - "Ġdint": 84489, - "Ġdio": 64470, - "Ġdioxide": 39489, - "Ġdip": 23604, - "Ġdipl": 16918, - "Ġdiplom": 29521, - "Ġdiploma": 60712, - "Ġdiplomacy": 61240, - "Ġdiplomat": 67950, - "Ġdiplomatic": 33516, - "Ġdiplomats": 64079, - "Ġdipped": 72207, - "Ġdipping": 85821, - "Ġdips": 96504, - "Ġdir": 5419, - "Ġdire": 13207, - "Ġdireccion": 68807, - "Ġdirección": 78113, - "Ġdirect": 2118, - "Ġdirected": 15540, - "Ġdirecting": 44990, - "Ġdirection": 5106, - "Ġdirectional": 72845, - "Ġdirections": 17961, - "Ġdirective": 33859, - "Ġdirectives": 49253, - "Ġdirectly": 5961, - "Ġdirector": 7538, - "Ġdirectories": 28625, - "Ġdirectors": 27354, - "Ġdirectory": 6220, - "Ġdirects": 66046, - "Ġdirekt": 54831, - "Ġdirent": 95957, - "Ġdiret": 80485, - "Ġdirig": 63856, - "Ġdirname": 29908, - "Ġdirs": 42248, - "Ġdirt": 25284, - "Ġdirty": 18595, - "Ġdis": 827, - "Ġdisabilities": 35701, - "Ġdisability": 27254, - "Ġdisable": 11156, - "Ġdisabled": 8386, - "Ġdisables": 72996, - "Ġdisabling": 60484, - "Ġdisadv": 29847, - "Ġdisadvantage": 48736, - "Ġdisadvantaged": 79847, - "Ġdisadvantages": 63625, - "Ġdisag": 18288, - "Ġdisagree": 28295, - "Ġdisagreed": 70703, - "Ġdisagreement": 61546, - "Ġdisagreements": 90872, - "Ġdisagrees": 94983, - "Ġdisap": 13950, - "Ġdisappe": 20837, - "Ġdisappear": 31053, - "Ġdisappearance": 51879, - "Ġdisappeared": 28396, - "Ġdisappearing": 66403, - "Ġdisappears": 60270, - "Ġdisappoint": 14097, - "Ġdisappointed": 24402, - "Ġdisappointing": 38123, - "Ġdisappointment": 40598, - "Ġdisarm": 86776, - "Ġdisaster": 20763, - "Ġdisasters": 50651, - "Ġdisastr": 50153, - "Ġdisastrous": 51957, - "Ġdisb": 93444, - "Ġdisbelief": 73254, - "Ġdisc": 2560, - "Ġdiscard": 37867, - "Ġdiscarded": 43210, - "Ġdiscern": 41545, - "Ġdischarge": 31543, - "Ġdischarged": 56091, - "Ġdiscipl": 15501, - "Ġdisciple": 83695, - "Ġdisciples": 48160, - "Ġdisciplinary": 56215, - "Ġdiscipline": 25364, - "Ġdisciplined": 69066, - "Ġdisciplines": 48155, - "Ġdisclaimer": 17673, - "Ġdisclose": 35233, - "Ġdisclosed": 35389, - "Ġdisclosing": 94835, - "Ġdisclosure": 27857, - "Ġdisclosures": 74892, - "Ġdisco": 53869, - "Ġdiscomfort": 43676, - "Ġdisconnect": 28969, - "Ġdisconnected": 39086, - "Ġdiscontent": 90122, - "Ġdiscontin": 44880, - "Ġdiscontinued": 64159, - "Ġdiscord": 31041, - "Ġdiscount": 11089, - "Ġdiscounted": 47674, - "Ġdiscounts": 31062, - "Ġdiscour": 33193, - "Ġdiscourage": 64987, - "Ġdiscouraged": 63670, - "Ġdiscourse": 40502, - "Ġdiscover": 6997, - "Ġdiscovered": 11105, - "Ġdiscoveries": 52998, - "Ġdiscovering": 41587, - "Ġdiscovers": 51014, - "Ġdiscovery": 18335, - "Ġdiscre": 33938, - "Ġdiscredit": 87019, - "Ġdiscreet": 61404, - "Ġdiscrepan": 53026, - "Ġdiscrepancies": 90267, - "Ġdiscrepancy": 78005, - "Ġdiscret": 27458, - "Ġdiscrete": 43179, - "Ġdiscretion": 30922, - "Ġdiscretionary": 95794, - "Ġdiscrim": 14238, - "Ġdiscrimin": 49319, - "Ġdiscriminate": 59441, - "Ġdiscrimination": 21240, - "Ġdiscriminator": 81738, - "Ġdiscriminatory": 67663, - "Ġdiscs": 56695, - "Ġdiscuss": 4263, - "Ġdiscussed": 14078, - "Ġdiscusses": 34334, - "Ġdiscussing": 24392, - "Ġdiscussion": 10219, - "Ġdiscussions": 20333, - "Ġdisdain": 78398, - "Ġdise": 6621, - "Ġdisease": 8457, - "Ġdiseases": 18808, - "Ġdisemb": 97544, - "Ġdisen": 90810, - "Ġdiseñ": 66481, - "Ġdiseñador": 93556, - "Ġdiseño": 83808, - "Ġdisfr": 66057, - "Ġdisg": 32183, - "Ġdisgr": 44186, - "Ġdisgrace": 63835, - "Ġdisgu": 40777, - "Ġdisguise": 63981, - "Ġdisguised": 78087, - "Ġdisgust": 67062, - "Ġdisgusted": 90074, - "Ġdisgusting": 53666, - "Ġdish": 12000, - "Ġdishes": 25779, - "Ġdishonest": 58916, - "Ġdishwasher": 60333, - "Ġdisillusion": 96909, - "Ġdisin": 63742, - "Ġdisjoint": 84784, - "Ġdisk": 13364, - "Ġdisks": 53758, - "Ġdislike": 47869, - "Ġdisliked": 98633, - "Ġdislikes": 98885, - "Ġdismal": 93453, - "Ġdismant": 48112, - "Ġdismantle": 94058, - "Ġdismay": 71982, - "Ġdismiss": 13432, - "Ġdismissal": 58223, - "Ġdismissed": 26200, - "Ġdismissing": 91495, - "Ġdisob": 67635, - "Ġdisobed": 91583, - "Ġdisorder": 19267, - "Ġdisorders": 23741, - "Ġdisp": 12965, - "Ġdispar": 28804, - "Ġdisparate": 84029, - "Ġdisparities": 81957, - "Ġdisparity": 65849, - "Ġdispatch": 6845, - "Ġdispatched": 49151, - "Ġdispatcher": 38799, - "Ġdispens": 35593, - "Ġdispensaries": 99139, - "Ġdispenser": 99127, - "Ġdispers": 78735, - "Ġdispersed": 76710, - "Ġdispersion": 85612, - "Ġdispl": 13462, - "Ġdisplaced": 48146, - "Ġdisplacement": 43053, - "Ġdisplay": 3037, - "ĠdisplayName": 34770, - "Ġdisplayed": 12596, - "Ġdisplaying": 27940, - "Ġdisplays": 18689, - "Ġdisple": 84234, - "Ġdispon": 25604, - "Ġdisponible": 54752, - "Ġdisponibles": 69620, - "ĠdisponÃŃveis": 142462, - "ĠdisponÃŃvel": 142672, - "Ġdispos": 53140, - "Ġdisposable": 43790, - "Ġdisposal": 33445, - "Ġdispose": 27390, - "Ġdisposed": 25574, - "Ġdisposing": 23212, - "Ġdisposit": 57451, - "Ġdisposition": 44996, - "Ġdispositivo": 94999, - "Ġdispro": 41503, - "Ġdisproportion": 46535, - "Ġdisproportionate": 79053, - "Ġdisproportionately": 72052, - "Ġdisput": 34060, - "Ġdispute": 25033, - "Ġdisputed": 53926, - "Ġdisputes": 41154, - "Ġdisqualified": 93576, - "Ġdisreg": 42803, - "Ġdisregard": 57717, - "Ġdisrespect": 56209, - "Ġdisrespectful": 98522, - "Ġdisrupt": 23973, - "Ġdisrupted": 68527, - "Ġdisrupting": 86743, - "Ġdisruption": 43119, - "Ġdisruptions": 96957, - "Ġdisruptive": 61542, - "Ġdiss": 13772, - "Ġdissatisfaction": 96794, - "Ġdisse": 32900, - "Ġdissect": 73950, - "Ġdissemination": 86664, - "Ġdissent": 46862, - "Ġdissert": 33649, - "Ġdissertation": 36345, - "Ġdissip": 92422, - "Ġdissoci": 90242, - "Ġdissolution": 80259, - "Ġdissolve": 72639, - "Ġdissolved": 55667, - "Ġdist": 1582, - "Ġdistance": 6010, - "Ġdistances": 26552, - "Ġdistancia": 82309, - "Ġdistancing": 72569, - "Ġdistant": 28727, - "Ġdistilled": 88767, - "Ġdistinct": 12460, - "Ġdistinction": 29196, - "Ġdistinctions": 86159, - "Ġdistinctive": 34847, - "Ġdistinctly": 70149, - "Ġdistingu": 18975, - "Ġdistinguish": 32037, - "Ġdistinguished": 38475, - "Ġdistinguishing": 84955, - "Ġdistint": 73378, - "Ġdistort": 69484, - "Ġdistorted": 61136, - "Ġdistortion": 49871, - "Ġdistr": 7905, - "Ġdistra": 57471, - "Ġdistract": 63817, - "Ġdistracted": 48704, - "Ġdistracting": 81298, - "Ġdistraction": 53616, - "Ġdistractions": 76449, - "Ġdistress": 34004, - "Ġdistressed": 70390, - "Ġdistrib": 2846, - "Ġdistribute": 16417, - "Ġdistributed": 4237, - "Ġdistributes": 95735, - "Ġdistributing": 49712, - "Ġdistribution": 7982, - "Ġdistributions": 42685, - "Ġdistributor": 43068, - "Ġdistributors": 55594, - "Ġdistrict": 9290, - "Ġdistricts": 26438, - "Ġdistrust": 75986, - "Ġdistur": 25343, - "Ġdisturb": 37223, - "Ġdisturbance": 64758, - "Ġdisturbances": 84060, - "Ġdisturbed": 55407, - "Ġdisturbing": 33873, - "Ġdistância": 143384, - "Ġdit": 21305, - "Ġditch": 49004, - "Ġdiv": 3429, - "Ġdive": 29863, - "Ġdiver": 36341, - "Ġdivergence": 81158, - "Ġdivers": 21113, - "Ġdiversas": 98283, - "Ġdiverse": 16807, - "Ġdiversified": 84857, - "Ġdiversion": 76264, - "Ġdiversity": 19492, - "Ġdiversos": 94551, - "Ġdivert": 35998, - "Ġdiverted": 85394, - "Ġdives": 93421, - "Ġdivid": 28832, - "Ġdivide": 21749, - "Ġdivided": 17779, - "Ġdividend": 45880, - "Ġdividends": 55264, - "Ġdivider": 48695, - "Ġdivides": 64828, - "Ġdividing": 49702, - "Ġdivine": 29367, - "Ġdiving": 42415, - "Ġdivis": 49368, - "Ġdivisible": 74916, - "Ġdivision": 12804, - "Ġdivisions": 36501, - "Ġdivisive": 74135, - "Ġdivisor": 49109, - "Ġdivor": 39979, - "Ġdivorce": 24532, - "Ġdivorced": 49492, - "Ġdivul": 81691, - "Ġdiy": 51338, - "Ġdiz": 42286, - "Ġdizzy": 84084, - "Ġdiá": 143565, - "Ġdiálogo": 143566, - "ĠdiÄŁer": 129189, - "Ġdiá»ħn": 128960, - "Ġdiá»ĩn": 129054, - "Ġdj": 47756, - "Ġdjango": 8262, - "Ġdk": 40204, - "Ġdl": 27513, - "Ġdla": 28976, - "Ġdlg": 40871, - "Ġdll": 58155, - "Ġdm": 28676, - "Ġdma": 50250, - "Ġdmg": 62153, - "Ġdn": 47488, - "Ġdna": 75334, - "Ġdni": 60759, - "Ġdns": 44077, - "Ġdo": 653, - "ĠdoGet": 56704, - "ĠdoInBackground": 71840, - "ĠdoPost": 65156, - "Ġdob": 45877, - "Ġdobr": 96568, - "Ġdoc": 4629, - "Ġdoch": 40157, - "Ġdock": 27549, - "Ġdocker": 26588, - "Ġdocking": 88210, - "Ġdocks": 96886, - "Ġdocs": 26340, - "Ġdoctor": 10668, - "Ġdoctoral": 73557, - "Ġdoctors": 16026, - "Ġdoctr": 60890, - "Ġdoctrine": 32135, - "Ġdoctrines": 82158, - "Ġdocument": 2197, - "Ġdocumentaries": 87366, - "Ġdocumentary": 24954, - "Ġdocumentation": 9705, - "Ġdocumented": 26372, - "Ġdocumenting": 66971, - "Ġdocumento": 53426, - "Ġdocumentos": 99027, - "Ġdocuments": 9293, - "Ġdod": 31089, - "Ġdodge": 47873, - "Ġdoe": 98453, - "Ġdoen": 53902, - "Ġdoença": 138716, - "Ġdoes": 1558, - "Ġdoesn": 3171, - "Ġdoesnt": 43104, - "Ġdof": 91760, - "Ġdog": 5562, - "Ġdogs": 12590, - "Ġdoi": 35895, - "Ġdoing": 3730, - "Ġdois": 50341, - "Ġdoit": 41082, - "Ġdoivent": 96469, - "Ġdojo": 84859, - "Ġdok": 41061, - "Ġdokument": 85961, - "ĠdokÅĤad": 140343, - "ĠdokÅĤadnie": 140344, - "Ġdol": 21270, - "Ġdolayı": 132595, - "Ġdoll": 7649, - "Ġdollar": 17692, - "Ġdollars": 11192, - "Ġdolls": 63781, - "Ġdolor": 23655, - "Ġdolore": 57296, - "Ġdolphin": 98169, - "Ġdolphins": 82406, - "Ġdom": 4719, - "Ġdomain": 7947, - "Ġdomaine": 95739, - "Ġdomains": 30476, - "Ġdome": 57338, - "Ġdomest": 73422, - "Ġdomestic": 12728, - "Ġdomestically": 97790, - "Ġdomic": 53885, - "Ġdomicile": 96739, - "Ġdomin": 11111, - "Ġdomina": 89037, - "Ġdominance": 43492, - "Ġdominant": 24456, - "Ġdominate": 40736, - "Ġdominated": 29701, - "Ġdominates": 82878, - "Ġdominating": 67266, - "Ġdomination": 54849, - "Ġdomingo": 89440, - "Ġdon": 1513, - "Ġdonate": 31909, - "Ġdonated": 33368, - "Ġdonating": 60859, - "Ġdonation": 24923, - "Ġdonations": 23957, - "Ġdonc": 38487, - "Ġdonde": 29040, - "Ġdone": 2814, - "Ġdong": 72736, - "Ġdonn": 32437, - "Ġdonna": 37756, - "Ġdonne": 20889, - "Ġdonner": 70651, - "Ġdonné": 136383, - "Ġdonnées": 45581, - "Ġdonor": 34458, - "Ġdonors": 32049, - "Ġdont": 15522, - "Ġdood": 87708, - "Ġdoom": 58614, - "Ġdoomed": 57637, - "Ġdoor": 6006, - "Ġdoors": 14038, - "Ġdoorstep": 75877, - "Ġdoorway": 69358, - "Ġdop": 26323, - "Ġdopamine": 65028, - "Ġdope": 91312, - "Ġdoping": 96828, - "Ġdopo": 59194, - "Ġdor": 52303, - "Ġdorm": 29109, - "Ġdormant": 88360, - "Ġdors": 76289, - "Ġdorsal": 95046, - "Ġdort": 52434, - "Ġdos": 8750, - "Ġdosage": 45940, - "Ġdose": 19115, - "Ġdoses": 34030, - "Ġdossier": 52476, - "Ġdost": 48315, - "ĠdostÄĻp": 127028, - "ĠdostÄĻpny": 142326, - "Ġdot": 12756, - "Ġdotenv": 91286, - "Ġdots": 30994, - "Ġdotted": 58101, - "Ġdotyc": 138089, - "ĠdotyczÄħ": 138090, - "ĠdotyczÄħce": 138091, - "Ġdou": 24576, - "Ġdoub": 7655, - "Ġdouble": 1990, - "Ġdoubled": 34617, - "Ġdoubles": 39296, - "Ġdoubling": 59015, - "Ġdoubly": 93889, - "Ġdoubt": 10492, - "Ġdoubted": 92662, - "Ġdoubtful": 74599, - "Ġdoubts": 38917, - "Ġdouche": 84353, - "Ġdough": 30352, - "Ġdout": 92520, - "Ġdov": 61270, - "Ġdove": 47222, - "Ġdow": 56487, - "Ġdown": 1495, - "Ġdownfall": 87767, - "Ġdowngrade": 90357, - "Ġdownhill": 72381, - "Ġdownload": 4139, - "Ġdownloadable": 69652, - "Ġdownloaded": 23293, - "Ġdownloader": 86774, - "Ġdownloading": 32477, - "Ġdownloads": 30472, - "Ġdownright": 69952, - "Ġdowns": 39191, - "Ġdownside": 51397, - "Ġdownstairs": 62791, - "Ġdownstream": 51352, - "Ġdownt": 40557, - "Ġdowntime": 74854, - "Ġdowntown": 18907, - "Ġdownturn": 75406, - "Ġdownward": 44478, - "Ġdownwards": 91270, - "Ġdozen": 20403, - "Ġdozens": 21935, - "ĠdoÄŁ": 93282, - "ĠdoÄŁal": 136317, - "ĠdoÄŁru": 129204, - "ĠdoÄŁum": 141663, - "Ġdp": 11329, - "Ġdpi": 50742, - "Ġdps": 94029, - "Ġdq": 71613, - "Ġdr": 1353, - "Ġdra": 44096, - "Ġdracon": 92703, - "Ġdraft": 9960, - "Ġdrafted": 37956, - "Ġdrafting": 57900, - "Ġdrafts": 63592, - "Ġdrag": 10921, - "Ġdraggable": 74556, - "Ġdragged": 37147, - "Ġdragging": 42376, - "Ġdragon": 25105, - "Ġdragons": 50436, - "Ġdrain": 23727, - "Ġdrainage": 57492, - "Ġdrained": 60408, - "Ġdraining": 73009, - "Ġdrains": 78650, - "Ġdram": 13548, - "Ġdrama": 19584, - "Ġdramas": 87726, - "Ġdramatic": 21771, - "Ġdramatically": 27957, - "Ġdrank": 53144, - "Ġdraped": 89880, - "Ġdrastic": 59783, - "Ġdrastically": 47763, - "Ġdraw": 4038, - "Ġdrawable": 52071, - "Ġdrawback": 87520, - "Ġdrawbacks": 88073, - "Ġdrawer": 26482, - "Ġdrawers": 61607, - "Ġdrawing": 13330, - "Ġdrawings": 37840, - "Ġdrawn": 14764, - "Ġdraws": 26643, - "Ġdre": 32101, - "Ġdread": 34975, - "Ġdreaded": 82490, - "Ġdreadful": 80852, - "Ġdream": 7904, - "Ġdreamed": 56536, - "Ġdreaming": 55674, - "Ġdreams": 18707, - "Ġdred": 90362, - "Ġdrei": 57519, - "Ġdress": 8511, - "Ġdressed": 25365, - "Ġdresser": 95537, - "Ġdresses": 36762, - "Ġdressing": 31523, - "Ġdrew": 23554, - "Ġdri": 49411, - "Ġdrib": 78546, - "Ġdried": 31620, - "Ġdrift": 33638, - "Ġdrifted": 91562, - "Ġdrifting": 84253, - "Ġdrill": 30546, - "Ġdrilled": 67765, - "Ġdrilling": 38562, - "Ġdrills": 56548, - "Ġdrink": 7027, - "Ġdrinkers": 97876, - "Ġdrinking": 16163, - "Ġdrinks": 20987, - "Ġdrip": 72499, - "Ġdripping": 76215, - "Ġdriv": 39255, - "Ġdrive": 6541, - "Ġdriven": 16227, - "Ġdriver": 5579, - "Ġdrivers": 11788, - "Ġdrives": 20118, - "Ġdriveway": 52142, - "Ġdriving": 9842, - "Ġdrm": 53086, - "Ġdro": 6973, - "Ġdroit": 62979, - "Ġdroits": 96122, - "Ġdrone": 26713, - "Ġdrones": 37232, - "Ġdrop": 5943, - "Ġdropdown": 20389, - "Ġdropout": 43281, - "Ġdropped": 12226, - "Ġdropping": 25100, - "Ġdrops": 21025, - "Ġdrought": 36746, - "Ġdrove": 23108, - "Ġdrown": 86868, - "Ġdrowned": 73895, - "Ġdrowning": 73437, - "Ġdru": 142231, - "Ġdrug": 5506, - "Ġdrugs": 10975, - "Ġdrum": 23196, - "Ġdrummer": 67946, - "Ġdrums": 46289, - "Ġdrunk": 28750, - "Ġdrunken": 62363, - "Ġdruż": 142232, - "Ġdrużyn": 142233, - "Ġdrv": 68770, - "Ġdry": 9058, - "Ġdryer": 46622, - "Ġdrying": 45379, - "Ġds": 11472, - "Ġdsp": 78615, - "Ġdst": 10648, - "Ġdt": 7594, - "Ġdto": 28335, - "Ġdtype": 13231, - "Ġdu": 3845, - "Ġdua": 96821, - "Ġdual": 18579, - "Ġduas": 71243, - "Ġdub": 22113, - "Ġdubbed": 41060, - "Ġdubious": 62089, - "Ġduck": 35985, - "Ġducks": 77778, - "Ġduct": 44239, - "Ġdude": 35057, - "Ġdudes": 72122, - "Ġdue": 4152, - "Ġduel": 65307, - "Ġdues": 79673, - "Ġdug": 43020, - "Ġduk": 87477, - "Ġduke": 95823, - "Ġdul": 81527, - "Ġdull": 40530, - "Ġduly": 76803, - "Ġdum": 62711, - "Ġdumb": 29255, - "Ġdummy": 17292, - "Ġdump": 10276, - "Ġdumped": 48273, - "Ġdumping": 60582, - "Ġdumps": 60381, - "Ġdumpster": 27450, - "Ġdumpsters": 98476, - "Ġdun": 49016, - "Ġdung": 85536, - "Ġdungeon": 42439, - "Ġdungeons": 82385, - "Ġdunk": 63472, - "Ġduo": 33721, - "Ġdup": 22737, - "Ġduplex": 80168, - "Ġduplic": 26347, - "Ġduplicate": 22513, - "Ġduplicated": 54903, - "Ġduplicates": 42328, - "Ġduplication": 66533, - "Ġdur": 10651, - "Ġdurability": 38565, - "Ġdurable": 26128, - "Ġdurante": 29231, - "Ġduration": 8090, - "Ġdurations": 89104, - "Ġdurch": 19767, - "Ġduring": 2337, - "Ġduro": 91096, - "Ġdurée": 141007, - "Ġdus": 52432, - "Ġdusk": 92885, - "Ġdust": 15797, - "Ġdusty": 76873, - "Ġdut": 10043, - "Ġduties": 21300, - "Ġduty": 14189, - "Ġduy": 141839, - "Ġduyá»ĩt": 141840, - "Ġduż": 88738, - "Ġduże": 135340, - "Ġdużo": 133768, - "Ġdv": 32776, - "Ġdvd": 49908, - "Ġdw": 13835, - "Ġdwar": 70043, - "Ġdwarf": 49461, - "Ġdwell": 43835, - "Ġdwelling": 50588, - "Ġdwind": 82122, - "Ġdword": 74750, - "Ġdwó": 134451, - "Ġdwóch": 134452, - "Ġdx": 13822, - "Ġdy": 13955, - "Ġdye": 53531, - "Ġdying": 22273, - "Ġdyn": 31070, - "Ġdynam": 17544, - "Ġdynamic": 8741, - "Ġdynamically": 42011, - "Ġdynamics": 29195, - "Ġdynasty": 66846, - "Ġdys": 21943, - "Ġdysfunction": 31303, - "Ġdysfunctional": 87704, - "Ġdyst": 68010, - "Ġdz": 25718, - "Ġdzi": 51026, - "ĠdziaÅĤ": 74281, - "ĠdziaÅĤa": 129558, - "ĠdziaÅĤal": 137683, - "ĠdziaÅĤalnoÅĽci": 137684, - "ĠdziaÅĤania": 135516, - "Ġdzie": 49673, - "Ġdzieci": 84883, - "Ġdziew": 83504, - "Ġdziewcz": 89841, - "ĠdzieÅĦ": 133223, - "ĠdziÄĻki": 131141, - "ĠdziÅĽ": 135481, - "Ġdá": 130691, - "Ġdáng": 133806, - "Ġdân": 128394, - "Ġdây": 132625, - "Ġdär": 77028, - "ĠdÃ¥": 74345, - "Ġdès": 86351, - "Ġdé": 7439, - "Ġdébut": 64285, - "Ġdéc": 34781, - "Ġdécada": 137411, - "Ġdécembre": 134829, - "Ġdécid": 142440, - "Ġdécidé": 142441, - "Ġdécision": 138828, - "Ġdéco": 134189, - "Ġdécor": 74111, - "Ġdécou": 58048, - "Ġdécouvert": 139318, - "Ġdécouvrir": 90627, - "Ġdéf": 46271, - "Ġdéfin": 135315, - "Ġdéfini": 135316, - "ĠdéjÃł": 45839, - "Ġdél": 143359, - "Ġdélai": 143360, - "Ġdém": 78541, - "Ġdémarch": 143764, - "Ġdémarche": 143765, - "Ġdép": 86785, - "Ġdépart": 75135, - "Ġdépartement": 141055, - "Ġdés": 45738, - "Ġdésir": 142429, - "Ġdésorm": 141803, - "Ġdésormais": 141804, - "Ġdét": 84777, - "Ġdétail": 135976, - "Ġdévelop": 51795, - "Ġdévelopp": 67766, - "Ġdéveloppe": 138681, - "Ġdéveloppement": 81520, - "Ġdòng": 130423, - "Ġdó": 76414, - "Ġdóla": 139042, - "Ġdólares": 139043, - "Ġdõ": 136752, - "Ġdõi": 136753, - "Ġdön": 124932, - "Ġdönem": 127061, - "Ġdönemde": 139016, - "Ġdönemin": 142391, - "Ġdöneminde": 142392, - "ĠdönÃ¼ÅŁ": 132768, - "Ġdù": 129655, - "Ġdùng": 128469, - "Ġdú": 137939, - "Ġdúvida": 137940, - "Ġdü": 51019, - "Ġdüny": 139704, - "Ġdünya": 129463, - "Ġdünyan": 139705, - "Ġdünyanın": 139706, - "Ġdür": 84952, - "Ġdürfen": 141489, - "Ġdüz": 138183, - "Ġdüzen": 125376, - "Ġdüzenle": 127545, - "Ġdüzenleme": 140392, - "Ġdüzenlen": 140323, - "Ġdüzenlenen": 140324, - "Ġdüzey": 138184, - "ĠdÃ¼ÅŁ": 125151, - "ĠdÃ¼ÅŁÃ¼k": 138145, - "ĠdÃ¼ÅŁÃ¼n": 126535, - "ĠdÃ¼ÅŁÃ¼nce": 136743, - "ĠdÃłi": 129121, - "ĠdÃłng": 131151, - "ĠdÃłnh": 130176, - "ĠdÃły": 136861, - "ĠdÃŃa": 34863, - "ĠdÃŃas": 45080, - "ĠdÄ±ÅŁ": 133220, - "ĠdÄ±ÅŁÄ±": 138792, - "ĠdÄ±ÅŁÄ±nda": 133221, - "ĠdÅĤ": 127507, - "ĠdÅĤugi": 139908, - "ĠdÅĤugo": 133671, - "Ġdư": 136525, - "Ġdương": 135676, - "Ġdưỡng": 129852, - "ĠdÆ°á»Ľi": 129227, - "Ġdạ": 135648, - "Ġdạng": 130249, - "Ġdạy": 132856, - "Ġdấu": 131575, - "Ġdần": 134724, - "Ġdầu": 131318, - "Ġdẫn": 128653, - "ĠdáºŃy": 139861, - "Ġdụ": 126200, - "Ġdục": 129677, - "Ġdụng": 128284, - "Ġdừng": 138251, - "Ġdữ": 134897, - "Ġdá»±": 126258, - "Ġdá»±ng": 128855, - "Ġdá»ħ": 128926, - "Ġdá»ĭ": 127657, - "Ġdá»ĭch": 128507, - "Ġdá»ĭp": 137789, - "Ġe": 384, - "ĠeBay": 29906, - "ĠeBook": 57510, - "ĠeBooks": 94621, - "ĠeCommerce": 93559, - "ĠePub": 88617, - "ĠeSports": 88696, - "Ġea": 36546, - "Ġeach": 1817, - "Ġeag": 78240, - "Ġeager": 23541, - "Ġeagerly": 62373, - "Ġeagle": 59889, - "Ġeapply": 53959, - "Ġear": 2430, - "Ġearlier": 6788, - "Ġearliest": 29658, - "Ġearly": 4124, - "Ġearm": 95108, - "Ġearn": 7232, - "Ġearned": 15303, - "Ġearners": 95963, - "Ġearnest": 54249, - "Ġearning": 27644, - "Ġearnings": 23681, - "Ġearns": 63759, - "Ġearrings": 66201, - "Ġears": 24230, - "Ġearth": 9393, - "Ġearthly": 89395, - "Ġearthqu": 29750, - "Ġearthquake": 37313, - "Ġearthquakes": 65479, - "Ġeas": 2531, - "Ġease": 14219, - "Ġeased": 94882, - "Ġeasier": 8661, - "Ġeasiest": 29589, - "Ġeasily": 6707, - "Ġeasing": 44304, - "Ġeast": 10984, - "Ġeastern": 23149, - "Ġeasy": 4135, - "Ġeat": 8180, - "Ġeaten": 34561, - "Ġeater": 86035, - "Ġeating": 12182, - "Ġeats": 49677, - "Ġeauto": 50273, - "Ġeax": 36252, - "Ġeb": 24463, - "Ġebay": 59850, - "Ġeben": 50697, - "Ġebenfalls": 95524, - "Ġebony": 53096, - "Ġebook": 33997, - "Ġebooks": 87902, - "Ġebp": 87307, - "Ġebx": 79296, - "Ġec": 11942, - "Ġecc": 32914, - "Ġeccentric": 54820, - "Ġech": 30872, - "Ġechang": 88509, - "Ġecho": 1687, - "Ġechoed": 54112, - "Ġechoes": 69957, - "Ġechoing": 93724, - "Ġecht": 66793, - "Ġecl": 59958, - "Ġeclectic": 77713, - "Ġeclips": 92434, - "Ġeclipse": 55428, - "Ġeco": 41588, - "Ġecological": 49853, - "Ġecology": 71446, - "Ġecommerce": 84143, - "Ġecon": 3813, - "Ġeconom": 11467, - "Ġeconomic": 6955, - "Ġeconomical": 59518, - "Ġeconomically": 46279, - "Ġeconomics": 27889, - "Ġeconomies": 36571, - "Ġeconomist": 45115, - "Ġeconomists": 44315, - "Ġeconomy": 8584, - "ĠeconomÃŃa": 142036, - "Ġeconóm": 72541, - "Ġeconómica": 137628, - "Ġeconómico": 138045, - "Ġecosystem": 24982, - "Ġecosystems": 60851, - "Ġecs": 78422, - "Ġecstasy": 92563, - "Ġecstatic": 97292, - "Ġect": 76494, - "Ġecx": 65229, - "Ġed": 1578, - "Ġedad": 52682, - "ĠedeceÄŁi": 141598, - "Ġedge": 6821, - "Ġedged": 89563, - "Ġedges": 12822, - "Ġedi": 75092, - "Ġedible": 66640, - "Ġedición": 140449, - "Ġedit": 4499, - "ĠeditText": 64045, - "Ġeditable": 37409, - "Ġeditar": 79217, - "Ġedited": 19138, - "Ġediting": 15664, - "Ġedition": 13688, - "Ġeditions": 46534, - "Ġeditor": 6440, - "Ġeditorial": 27046, - "Ġeditors": 28746, - "Ġedits": 50844, - "Ġedição": 138226, - "Ġedm": 65340, - "Ġeds": 97099, - "Ġedt": 80714, - "Ġedu": 21443, - "Ġeduc": 4729, - "Ġeducación": 138963, - "Ġeducate": 38070, - "Ġeducated": 32042, - "Ġeducating": 66705, - "Ġeducation": 6731, - "Ġeducational": 16229, - "Ġeducator": 71046, - "Ġeducators": 49694, - "Ġeducação": 138894, - "Ġedx": 63645, - "Ġee": 36343, - "Ġeen": 8352, - "Ġeens": 98666, - "Ġeer": 43272, - "Ġeerie": 96283, - "Ġeerste": 67570, - "Ġef": 30369, - "Ġefect": 42946, - "Ġeff": 3289, - "Ġeffect": 2456, - "Ġeffected": 88489, - "Ġeffective": 7373, - "Ġeffectively": 13444, - "Ġeffectiveness": 26279, - "Ġeffects": 6239, - "Ġeffet": 66681, - "Ġeffic": 30814, - "Ġefficacy": 40165, - "Ġefficiencies": 91026, - "Ġefficiency": 15024, - "Ġefficient": 11050, - "Ġefficiently": 29720, - "Ġeffort": 5041, - "Ġeffortless": 79092, - "Ġeffortlessly": 68604, - "Ġefforts": 8869, - "Ġefter": 46480, - "Ġeg": 8695, - "Ġegal": 76171, - "Ġeget": 69663, - "Ġegg": 18636, - "Ġeggs": 18805, - "Ġego": 36274, - "Ġegreg": 82064, - "Ġegregious": 89068, - "Ġegret": 91192, - "Ġegt": 71067, - "Ġegy": 30708, - "Ġeh": 35246, - "Ġeher": 93395, - "Ġei": 29429, - "Ġeid": 68331, - "Ġeig": 34734, - "Ġeigen": 28724, - "Ġeigenen": 72705, - "Ġeigentlich": 83880, - "Ġeight": 8063, - "Ġeighteen": 62034, - "Ġeighth": 36377, - "Ġeighty": 79579, - "Ġein": 4368, - "Ġeine": 9820, - "Ġeinem": 17443, - "Ġeinen": 15462, - "Ġeiner": 17058, - "Ġeines": 36108, - "Ġeinf": 31287, - "Ġeinfach": 35323, - "Ġeing": 48376, - "Ġeinige": 63620, - "Ġeinmal": 54459, - "Ġeins": 88748, - "Ġeinz": 74227, - "Ġeinzel": 94788, - "Ġeither": 2987, - "Ġeius": 68421, - "Ġeiusmod": 79122, - "Ġej": 19279, - "Ġejac": 63614, - "Ġejaculation": 98202, - "Ġejec": 49171, - "Ġeject": 89474, - "Ġejected": 94403, - "Ġejemplo": 57200, - "Ġejercicio": 95921, - "Ġek": 26857, - "Ġeks": 89662, - "Ġel": 655, - "Ġela": 50307, - "Ġelabor": 24940, - "Ġelaborate": 35967, - "Ġelapsed": 25333, - "ĠelapsedTime": 80855, - "Ġelast": 91085, - "Ġelastic": 35473, - "Ġelasticity": 94816, - "Ġelbow": 45711, - "Ġelbows": 80912, - "Ġelder": 22130, - "Ġelderly": 28820, - "Ġelders": 60676, - "Ġeldest": 73565, - "Ġeldre": 93360, - "Ġele": 10510, - "Ġelect": 4045, - "Ġelected": 16290, - "Ġelection": 6223, - "Ġelections": 15991, - "Ġelective": 97490, - "Ġelectoral": 33841, - "Ġelectorate": 61468, - "Ġelectr": 42806, - "Ġelectric": 9072, - "Ġelectrical": 19734, - "Ġelectricity": 17728, - "Ġelectro": 24394, - "Ġelectrode": 70948, - "Ġelectrodes": 79290, - "Ġelectroly": 72296, - "Ġelectrom": 53607, - "Ġelectromagnetic": 65569, - "Ġelectron": 16715, - "Ġelectronic": 14346, - "Ġelectronically": 70770, - "Ġelectronics": 30491, - "Ġelectrons": 56578, - "Ġelectrónico": 71466, - "Ġeleg": 17720, - "Ġelegance": 63443, - "Ġelegant": 25777, - "Ġelek": 62788, - "Ġelem": 11750, - "Ġelement": 2392, - "ĠelementType": 89573, - "Ġelemental": 61135, - "Ġelementary": 35156, - "Ġelemento": 40618, - "Ġelementos": 48147, - "Ġelements": 5424, - "Ġelems": 55968, - "Ġelephant": 45740, - "Ġelephants": 60766, - "Ġeles": 66441, - "Ġelev": 11964, - "Ġelevate": 68630, - "Ġelevated": 31289, - "Ġelevation": 26163, - "Ġelevator": 38636, - "Ġeleven": 44214, - "Ġelf": 40745, - "Ġelgg": 95653, - "Ġelic": 94260, - "Ġelif": 4409, - "Ġelig": 14176, - "Ġeligibility": 40634, - "Ġeligible": 17013, - "Ġelim": 9762, - "Ġelimin": 37316, - "Ġeliminar": 48404, - "Ġeliminate": 21725, - "Ġeliminated": 33273, - "Ġeliminates": 59844, - "Ġeliminating": 39499, - "Ġelimination": 42932, - "Ġelit": 30060, - "Ġelite": 20685, - "Ġelites": 55703, - "Ġelk": 76842, - "Ġelkaar": 94598, - "Ġell": 25607, - "Ġella": 53501, - "Ġellas": 97660, - "Ġelle": 26451, - "Ġeller": 25939, - "Ġelles": 83468, - "Ġellipse": 57397, - "Ġellipt": 77783, - "Ġello": 66315, - "Ġellos": 53330, - "Ġelm": 42205, - "Ġelo": 63135, - "Ġelong": 73495, - "Ġels": 20712, - "Ġelse": 770, - "Ġelseif": 11755, - "Ġelsewhere": 17920, - "Ġelsif": 24482, - "Ġelt": 54139, - "Ġelucid": 96198, - "Ġelusive": 65584, - "Ġelves": 76792, - "Ġelé": 85606, - "ĠelÅij": 88811, - "Ġem": 976, - "Ġemacs": 86683, - "Ġemail": 2551, - "ĠemailAddress": 89713, - "Ġemailed": 48514, - "Ġemailing": 91701, - "Ġemails": 14298, - "Ġeman": 68139, - "Ġemanc": 90125, - "Ġemb": 7967, - "Ġembar": 79601, - "Ġembargo": 47602, - "Ġembark": 69431, - "Ġembarked": 78020, - "Ġembarrass": 22281, - "Ġembarrassed": 48130, - "Ġembarrassing": 44005, - "Ġembarrassment": 58930, - "Ġembassy": 45467, - "Ġembed": 11579, - "Ġembedded": 22864, - "Ġembedding": 39088, - "Ġembeddings": 70547, - "Ġembell": 71414, - "Ġember": 98284, - "Ġemblem": 66274, - "Ġembod": 31023, - "Ġembodied": 77543, - "Ġembodies": 94022, - "Ġembodiment": 48397, - "Ġembodiments": 74553, - "Ġembody": 80558, - "Ġembr": 16618, - "Ġembrace": 26732, - "Ġembraced": 42503, - "Ġembraces": 82387, - "Ġembracing": 55401, - "Ġembroid": 53578, - "Ġembroidered": 92659, - "Ġembroidery": 84827, - "Ġembry": 43381, - "Ġembryo": 86601, - "Ġembryos": 88773, - "Ġemerg": 7277, - "Ġemerge": 32944, - "Ġemerged": 21992, - "Ġemergence": 48079, - "Ġemergencies": 67974, - "Ġemergency": 12851, - "Ġemerges": 58596, - "Ġemerging": 23206, - "Ġeminent": 83529, - "Ġemiss": 98663, - "Ġemission": 40253, - "Ġemissions": 20143, - "Ġemit": 16691, - "Ġemits": 72780, - "Ġemitted": 46942, - "Ġemitter": 47263, - "Ġemitting": 89456, - "Ġemlrt": 96212, - "Ġemo": 93097, - "Ġemoc": 84907, - "Ġemoji": 42365, - "Ġemojis": 99066, - "Ġemot": 10172, - "Ġemotion": 19772, - "Ġemotional": 14269, - "Ġemotionally": 37583, - "Ġemotions": 21261, - "Ġemp": 8486, - "Ġempath": 35581, - "Ġempathy": 47351, - "Ġemperor": 56783, - "Ġempez": 81849, - "Ġemph": 13155, - "Ġemphas": 20053, - "Ġemphasis": 24654, - "Ġemphasize": 45932, - "Ġemphasized": 45628, - "Ġemphasizes": 65059, - "Ġemphasizing": 80903, - "Ġempir": 37869, - "Ġempire": 31347, - "Ġempirical": 45663, - "Ġemple": 61026, - "Ġempleado": 86940, - "Ġemploi": 91700, - "Ġemploy": 3455, - "Ġemployed": 19446, - "Ġemployee": 9364, - "Ġemployees": 8256, - "Ġemployer": 19136, - "Ġemployers": 22426, - "Ġemploying": 50197, - "Ġemployment": 14402, - "Ġemploys": 50142, - "Ġempower": 25219, - "Ġempowered": 61835, - "Ġempowering": 65288, - "Ġempowerment": 73377, - "Ġempres": 89853, - "Ġempresa": 32764, - "Ġempresas": 50304, - "Ġempt": 53069, - "Ġemptied": 93872, - "Ġempty": 4287, - "Ġemulate": 65485, - "Ġemulation": 78841, - "Ġemulator": 58516, - "Ġen": 662, - "Ġenable": 7283, - "Ġenabled": 8970, - "Ġenables": 20081, - "Ġenabling": 27362, - "Ġenact": 46947, - "Ġenacted": 43877, - "Ġenactment": 77552, - "Ġenam": 81852, - "Ġenamel": 91748, - "Ġenc": 3209, - "Ġencaps": 42569, - "Ġench": 65712, - "Ġenchant": 46925, - "Ġenchanted": 97311, - "Ġenclave": 97712, - "Ġenclosed": 43810, - "Ġenclosing": 84928, - "Ġenclosure": 57812, - "Ġencode": 16164, - "ĠencodeURIComponent": 56737, - "Ġencoded": 20498, - "Ġencoder": 23668, - "Ġencoding": 11170, - "Ġencompass": 37532, - "Ġencompasses": 69910, - "Ġencontr": 22547, - "Ġencontrado": 55227, - "Ġencontrar": 45623, - "Ġencore": 34497, - "Ġencount": 29797, - "Ġencounter": 12828, - "Ġencountered": 23057, - "Ġencountering": 91272, - "Ġencounters": 33906, - "Ġencour": 7878, - "Ġencourage": 14907, - "Ġencouraged": 20548, - "Ġencouragement": 50375, - "Ġencourages": 36067, - "Ġencouraging": 25836, - "Ġencrypt": 29625, - "Ġencrypted": 24455, - "Ġencryption": 25463, - "Ġenctype": 37415, - "Ġencuent": 35737, - "Ġencuentra": 56168, - "Ġencyclopedia": 82608, - "Ġend": 835, - "ĠendDate": 30445, - "ĠendIndex": 61103, - "ĠendPoint": 69474, - "ĠendTime": 32061, - "Ġendanger": 36937, - "Ġendangered": 51256, - "Ġende": 28605, - "Ġendeavor": 53814, - "Ġendeavors": 78545, - "Ġendeavour": 88931, - "Ġended": 9482, - "Ġendemic": 94913, - "Ġendereco": 89153, - "Ġendforeach": 31154, - "Ġendian": 64688, - "Ġendif": 12330, - "Ġending": 13391, - "Ġendings": 76597, - "Ġendl": 5229, - "Ġendless": 25678, - "Ġendlessly": 78737, - "Ġendors": 33965, - "Ġendorse": 18970, - "Ġendorsed": 39628, - "Ġendorsement": 41043, - "Ġendorsements": 93894, - "Ġendorsing": 97759, - "Ġendoth": 92229, - "Ġendowed": 97628, - "Ġendpoint": 14887, - "Ġendpoints": 36342, - "Ġendregion": 85017, - "Ġends": 10335, - "Ġendurance": 48186, - "Ġendure": 45653, - "Ġendured": 55124, - "Ġenduring": 51776, - "Ġendwhile": 65914, - "Ġenemies": 13883, - "Ġenemy": 9175, - "Ġener": 37456, - "Ġenerg": 4501, - "Ġenergetic": 44855, - "Ġenergia": 95058, - "Ġenergies": 48869, - "Ġenergy": 4802, - "ĠenergÃŃa": 137064, - "Ġenf": 32532, - "Ġenfants": 59304, - "Ġenfer": 60997, - "Ġenfermed": 87017, - "Ġenforce": 28162, - "Ġenforced": 44321, - "Ġenforcement": 13324, - "Ġenforcing": 61808, - "Ġenfrent": 88499, - "Ġeng": 2922, - "Ġengage": 16579, - "Ġengaged": 16634, - "Ġengagement": 19805, - "Ġengagements": 78871, - "Ġengages": 68489, - "Ġengaging": 22570, - "Ġengine": 4712, - "Ġengineer": 23576, - "Ġengineered": 44936, - "Ġengineering": 14667, - "Ġengineers": 24198, - "Ġengines": 21106, - "Ġenglish": 28963, - "Ġengr": 50055, - "Ġengraved": 79710, - "Ġengulf": 76736, - "Ġenh": 8663, - "Ġenhance": 18379, - "Ġenhanced": 23922, - "Ġenhancement": 26788, - "Ġenhancements": 58529, - "Ġenhances": 56824, - "Ġenhancing": 46494, - "Ġenim": 59502, - "Ġenjo": 30579, - "Ġenjoy": 4669, - "Ġenjoyable": 31080, - "Ġenjoyed": 14006, - "Ġenjoying": 21413, - "Ġenjoyment": 44178, - "Ġenjoys": 31738, - "Ġenlarg": 39939, - "Ġenlarge": 52644, - "Ġenlarged": 73017, - "Ġenlargement": 65407, - "Ġenlight": 40216, - "Ġenlightened": 81215, - "Ġenlightenment": 80769, - "Ġenlist": 87624, - "Ġenlisted": 68476, - "Ġenn": 60524, - "Ġenorm": 17299, - "Ġenorme": 67806, - "Ġenormous": 22399, - "Ġenormously": 83463, - "Ġenough": 3322, - "Ġenqu": 76707, - "Ġenquanto": 94641, - "Ġenqueue": 53757, - "Ġenquiries": 83322, - "Ġenquiry": 76512, - "Ġenr": 80552, - "Ġenraged": 97195, - "Ġenrich": 30418, - "Ġenriched": 68571, - "Ġenrichment": 69172, - "Ġenrol": 65366, - "Ġenroll": 51780, - "Ġenrolled": 36091, - "Ġenrollment": 38048, - "Ġens": 4572, - "Ġense": 66961, - "Ġensemble": 39026, - "Ġensl": 66448, - "Ġenslaved": 94289, - "Ġensued": 95663, - "Ġensuing": 71658, - "Ġensuite": 75726, - "Ġensure": 5978, - "Ġensured": 58654, - "Ġensures": 25351, - "Ġensuring": 22573, - "Ġent": 1197, - "Ġentail": 85992, - "Ġentails": 70104, - "Ġentend": 68279, - "Ġentender": 95437, - "Ġenter": 3725, - "Ġentered": 10636, - "Ġentering": 16262, - "Ġenterprise": 20179, - "Ġenterprises": 39819, - "Ġenters": 28833, - "Ġentert": 22887, - "Ġentertain": 45176, - "Ġentertained": 64450, - "Ġentertaining": 29211, - "Ġentertainment": 16517, - "Ġentfer": 82195, - "Ġenth": 64208, - "Ġenthus": 16277, - "Ġenthusi": 21142, - "Ġenthusiasm": 35132, - "Ġenthusiast": 60812, - "Ġenthusiastic": 41602, - "Ġenthusiastically": 98225, - "Ġenthusiasts": 42348, - "Ġenticing": 87507, - "Ġentidad": 85808, - "Ġentire": 4453, - "Ġentirely": 11368, - "Ġentirety": 47917, - "Ġentities": 14744, - "Ġentitled": 19867, - "Ġentitlement": 53901, - "Ġentity": 5387, - "ĠentityId": 93042, - "ĠentityManager": 59775, - "ĠentityType": 96801, - "Ġentonces": 71399, - "Ġentr": 11492, - "Ġentra": 82686, - "Ġentrada": 42563, - "Ġentrance": 19809, - "Ġentrances": 94579, - "Ġentrar": 82313, - "Ġentre": 9281, - "Ġentreg": 93281, - "Ġentrega": 78418, - "Ġentren": 93821, - "Ġentrenched": 81044, - "Ġentreprene": 19414, - "Ġentrepreneur": 28249, - "Ġentrepreneurial": 69306, - "Ġentrepreneurs": 34390, - "Ġentrepreneurship": 74405, - "Ġentreprise": 92386, - "Ġentreprises": 96163, - "Ġentrev": 89032, - "Ġentries": 10695, - "Ġentropy": 47502, - "Ġentrusted": 85282, - "Ġentry": 4343, - "Ġents": 36852, - "Ġentsprech": 87488, - "Ġentwick": 80129, - "Ġentão": 84813, - "Ġenum": 7618, - "Ġenumer": 10153, - "Ġenumerable": 43942, - "Ġenumerate": 13252, - "Ġenumerated": 84869, - "Ġenumeration": 51578, - "Ġenumerator": 74631, - "Ġenums": 70717, - "Ġenv": 6105, - "Ġenvelop": 53185, - "Ġenvelope": 34398, - "Ġenvelopes": 86606, - "Ġenvi": 49264, - "Ġenviado": 98572, - "Ġenviar": 62778, - "Ġenviron": 48926, - "Ġenvironment": 4573, - "Ġenvironmental": 12158, - "Ġenvironmentally": 56240, - "Ġenvironments": 21737, - "Ġenvis": 84675, - "Ġenvision": 47046, - "Ġenvisioned": 73289, - "Ġenvoy": 59530, - "Ġenvy": 65433, - "Ġenzym": 30911, - "Ġenzyme": 48142, - "Ġenzymes": 54967, - "Ġeo": 94603, - "Ġeof": 76760, - "Ġeos": 61794, - "Ġep": 4155, - "Ġephem": 82134, - "Ġepic": 24679, - "Ġepid": 27717, - "Ġepidemi": 60957, - "Ġepidemic": 41520, - "Ġepile": 57552, - "Ġepilepsy": 69555, - "Ġepis": 66494, - "Ġepisode": 9234, - "Ġepisodes": 17770, - "Ġepit": 66322, - "Ġepith": 63679, - "Ġepoch": 16342, - "Ġepochs": 39346, - "Ġepoll": 95861, - "Ġepoxy": 96644, - "Ġeps": 17986, - "Ġepsilon": 31204, - "Ġepub": 63949, - "Ġeq": 8939, - "Ġeql": 67376, - "Ġequ": 3232, - "Ġequal": 6144, - "ĠequalTo": 60545, - "Ġequality": 21777, - "Ġequally": 18308, - "Ġequals": 16819, - "Ġequation": 23606, - "Ġequations": 37906, - "Ġequilibrium": 55311, - "Ġequip": 25386, - "Ġequipe": 96205, - "Ġequipment": 7096, - "Ġequipments": 71130, - "Ġequipo": 47912, - "Ġequipos": 91852, - "Ġequipped": 18650, - "Ġequitable": 76009, - "Ġequity": 24448, - "Ġequiv": 68458, - "Ġequival": 43454, - "Ġequivalence": 84162, - "Ġequivalent": 13578, - "Ġequivalents": 85006, - "Ġer": 2714, - "Ġera": 11385, - "Ġerad": 55437, - "Ġeradicate": 88414, - "Ġerase": 35988, - "Ġerased": 63700, - "Ġerb": 67648, - "Ġere": 38257, - "Ġerect": 37632, - "Ġerected": 65806, - "Ġerectile": 56117, - "Ġerection": 64046, - "Ġerf": 36408, - "Ġerfahren": 95402, - "Ġerfol": 53211, - "Ġerfolgre": 73796, - "Ġerfolgreich": 93094, - "Ġerg": 35276, - "Ġergonomic": 96691, - "Ġerh": 59801, - "Ġerhalten": 57984, - "Ġerk": 88766, - "Ġerklä": 86107, - "Ġerklärt": 138936, - "Ġerle": 76120, - "Ġerm": 76134, - "Ġermög": 97035, - "Ġern": 91929, - "Ġero": 71232, - "Ġeros": 42119, - "Ġerosion": 56997, - "Ġerot": 8054, - "Ġerotic": 33316, - "Ġerotica": 88389, - "Ġerotici": 39472, - "Ġerotico": 73138, - "Ġerotik": 27562, - "Ġerotique": 52827, - "Ġerotisch": 96563, - "Ġerotische": 22210, - "Ġerotisk": 38988, - "Ġerotiske": 65653, - "Ġerr": 1848, - "ĠerrMsg": 60078, - "Ġerratic": 94575, - "Ġerre": 55449, - "Ġerreur": 90920, - "Ġerrmsg": 67045, - "Ġerrno": 26955, - "Ġerro": 36310, - "Ġerrone": 57789, - "Ġerroneous": 76672, - "Ġerror": 1465, - "ĠerrorCallback": 89080, - "ĠerrorCode": 40442, - "ĠerrorHandler": 71073, - "ĠerrorMessage": 24943, - "ĠerrorMsg": 52247, - "ĠerrorThrown": 81699, - "Ġerrores": 90700, - "Ġerrors": 5975, - "Ġerrs": 70817, - "Ġers": 54395, - "Ġerst": 34368, - "Ġerste": 61217, - "Ġersten": 48158, - "Ġeru": 60254, - "Ġerupt": 43679, - "Ġerupted": 60174, - "Ġeruption": 79402, - "Ġerv": 71075, - "Ġerw": 66386, - "Ġery": 88257, - "Ġerót": 79443, - "Ġes": 1531, - "Ġesa": 49880, - "Ġesac": 81844, - "Ġesc": 3835, - "Ġescal": 26435, - "Ġescalate": 88590, - "Ġescalated": 80600, - "Ġescalating": 76057, - "Ġescalation": 70289, - "Ġescap": 88784, - "Ġescape": 12449, - "Ġescaped": 27783, - "Ġescapes": 65109, - "Ġescaping": 52654, - "Ġescol": 39654, - "Ġescort": 6155, - "Ġescorte": 50070, - "Ġescorted": 76556, - "Ġescorts": 26932, - "Ġescre": 96945, - "Ġescri": 65771, - "Ġescrit": 57444, - "Ġese": 41818, - "Ġesi": 77308, - "Ġesk": 23978, - "Ġeskort": 40541, - "Ġeskorte": 38167, - "Ġesl": 97846, - "Ġeslint": 21155, - "Ġeso": 43741, - "Ġesos": 93074, - "Ġesp": 16541, - "Ġespa": 35611, - "Ġespacio": 65484, - "Ġespan": 79555, - "Ġespaço": 98872, - "Ġespañ": 49375, - "Ġespañol": 69888, - "Ġespec": 42838, - "Ġespecial": 32297, - "Ġespecially": 5310, - "Ġespecialmente": 94002, - "Ġespecific": 68594, - "Ġespect": 94270, - "ĠespecÃŃf": 77920, - "ĠespecÃŃfica": 141033, - "ĠespecÃŃfico": 140947, - "Ġesper": 30057, - "Ġespera": 81744, - "Ġespionage": 77639, - "Ġesports": 80450, - "Ġespos": 70227, - "Ġesposa": 84890, - "Ġespresso": 65421, - "Ġess": 3956, - "Ġessa": 54629, - "Ġessay": 8895, - "Ġessays": 22844, - "Ġesse": 41379, - "Ġessen": 94655, - "Ġessence": 27491, - "Ġessential": 7565, - "Ġessentially": 15791, - "Ġessentials": 58786, - "Ġessere": 34266, - "Ġest": 1788, - "Ġesta": 15140, - "Ġestaba": 63224, - "Ġestable": 51664, - "Ġestablish": 5695, - "Ġestablished": 9555, - "Ġestablishes": 63564, - "Ġestablishing": 30592, - "Ġestablishment": 21269, - "Ġestablishments": 62237, - "Ġestad": 77681, - "Ġestado": 24062, - "Ġestados": 93524, - "Ġestamos": 67060, - "Ġestar": 34257, - "Ġestará": 136185, - "Ġestas": 47491, - "Ġestate": 12394, - "Ġestates": 82975, - "Ġestava": 77800, - "Ġeste": 10351, - "Ġesteem": 84497, - "Ġesteemed": 96464, - "Ġestilo": 69283, - "Ġestim": 14932, - "Ġestimate": 16045, - "Ġestimated": 12943, - "Ġestimates": 17530, - "Ġestimating": 76372, - "Ġestimation": 41204, - "Ġestimator": 67298, - "Ġesto": 37793, - "Ġestos": 44786, - "Ġestoy": 81284, - "Ġestr": 29507, - "Ġestratég": 140791, - "Ġestratégia": 140792, - "Ġestrogen": 69080, - "Ġestruct": 75409, - "Ġestud": 57463, - "Ġestudiantes": 97722, - "Ġestudio": 78936, - "Ġestá": 15466, - "Ġestán": 41839, - "Ġestão": 56454, - "Ġet": 1842, - "Ġeta": 38997, - "Ġetc": 4992, - "Ġeternal": 34725, - "Ġeternity": 63382, - "Ġeth": 8372, - "Ġethanol": 61672, - "Ġether": 50050, - "Ġethereum": 84522, - "Ġethernet": 80534, - "Ġethers": 95120, - "Ġethic": 64847, - "Ġethical": 30208, - "Ġethics": 30908, - "Ġethn": 78080, - "Ġethnic": 21551, - "Ġethnicity": 56878, - "Ġethos": 84239, - "Ġetiqu": 60944, - "Ġetiquette": 93205, - "Ġetree": 66655, - "Ġett": 26724, - "Ġetter": 55816, - "ĠettiÄŁi": 131192, - "Ġettä": 72351, - "Ġetwa": 77556, - "Ġetwas": 39771, - "Ġeu": 15555, - "Ġeuch": 65295, - "Ġeuler": 90970, - "Ġeup": 63943, - "Ġeuro": 17672, - "Ġeurop": 61921, - "Ġeurope": 37534, - "Ġeuropean": 85919, - "Ġeuropé": 94099, - "Ġeuropéen": 143446, - "Ġeuropéenne": 140927, - "Ġeuros": 32488, - "Ġeuth": 80580, - "Ġeux": 83340, - "Ġev": 3637, - "Ġevac": 29420, - "Ġevacuate": 88989, - "Ġevacuated": 62258, - "Ġevacuation": 59673, - "Ġevade": 76653, - "Ġeval": 5603, - "Ġevalu": 19326, - "Ġevaluate": 15442, - "Ġevaluated": 25070, - "Ġevaluates": 66249, - "Ġevaluating": 37563, - "Ġevaluation": 16460, - "Ġevaluations": 55081, - "Ġevaluator": 69810, - "Ġevangel": 38053, - "Ġevangelical": 66585, - "Ġevapor": 59050, - "Ġevasion": 76732, - "Ġeve": 48896, - "Ġeven": 1496, - "Ġevening": 11458, - "Ġevenings": 58838, - "Ġevenly": 41047, - "Ġevent": 1538, - "ĠeventData": 67867, - "ĠeventId": 70000, - "ĠeventName": 60177, - "ĠeventType": 58551, - "Ġeventdata": 44008, - "Ġevento": 44442, - "Ġeventos": 72394, - "Ġevents": 4357, - "Ġeventual": 41735, - "Ġeventually": 9583, - "Ġever": 3512, - "Ġeverlasting": 94949, - "Ġevery": 1449, - "Ġeverybody": 16083, - "Ġeveryday": 17778, - "Ġeveryone": 5019, - "Ġeverything": 4297, - "Ġeverytime": 89356, - "Ġeverywhere": 16852, - "Ġeviction": 78236, - "Ġevid": 5226, - "Ġevidence": 5904, - "Ġevidenced": 68357, - "Ġevident": 29476, - "Ġevidently": 66070, - "Ġevil": 13962, - "Ġevils": 85807, - "Ġevitar": 70808, - "Ġevoke": 94163, - "Ġevolution": 15379, - "Ġevolutionary": 40893, - "Ġevolve": 37580, - "Ġevolved": 27895, - "Ġevolves": 91954, - "Ġevolving": 40928, - "Ġevt": 12358, - "Ġew": 36890, - "Ġex": 505, - "Ġexacerb": 51775, - "Ġexacerbated": 91441, - "Ġexact": 4734, - "Ġexactly": 6896, - "Ġexagger": 37930, - "Ġexaggerated": 61158, - "Ġexam": 7006, - "Ġexamination": 23568, - "Ġexaminations": 68470, - "Ġexamine": 20961, - "Ġexamined": 24109, - "Ġexaminer": 83632, - "Ġexamines": 47995, - "Ġexamining": 37836, - "Ġexample": 3110, - "Ġexamples": 10295, - "Ġexams": 39686, - "Ġexc": 3438, - "Ġexcav": 44115, - "Ġexcavation": 96439, - "Ġexce": 90284, - "Ġexceed": 12488, - "Ġexceeded": 33808, - "Ġexceeding": 47905, - "Ġexceedingly": 75721, - "Ġexceeds": 35275, - "Ġexcel": 24538, - "Ġexcelente": 95407, - "Ġexcell": 8250, - "Ġexcellence": 37556, - "Ġexcellent": 9073, - "Ġexcept": 3650, - "Ġexception": 4683, - "Ġexceptional": 24364, - "Ġexceptionally": 47198, - "Ġexceptions": 19585, - "Ġexcer": 39077, - "Ġexcerpt": 49465, - "Ġexcerpts": 83390, - "Ġexcess": 13623, - "Ġexcessive": 26541, - "Ġexcessively": 86046, - "Ġexchange": 9289, - "Ġexchanged": 47401, - "Ġexchanges": 28998, - "Ġexchanging": 78431, - "Ġexcit": 24431, - "Ġexcited": 12035, - "Ġexcitement": 27262, - "Ġexciting": 13245, - "Ġexcl": 80284, - "Ġexclaimed": 79508, - "Ġexclude": 21687, - "Ġexcluded": 27444, - "Ġexcludes": 63368, - "Ġexcluding": 43778, - "Ġexclus": 18034, - "Ġexclusion": 41208, - "Ġexclusive": 13761, - "Ġexclusively": 23242, - "Ġexcursion": 94340, - "Ġexcuse": 27291, - "Ġexcuses": 54486, - "Ġexe": 47193, - "Ġexec": 3883, - "Ġexecut": 23494, - "Ġexecutable": 32156, - "Ġexecute": 9026, - "Ġexecuted": 15695, - "Ġexecutes": 51435, - "Ġexecuting": 30220, - "Ġexecution": 11320, - "Ġexecutions": 68146, - "Ġexecutive": 10905, - "Ġexecutives": 28409, - "Ġexecutor": 31558, - "Ġexem": 15377, - "Ġexemp": 93220, - "Ġexempl": 37939, - "Ġexemplary": 76281, - "Ġexemple": 50073, - "Ġexemplo": 79594, - "Ġexempt": 37928, - "Ġexemption": 44698, - "Ġexemptions": 70888, - "Ġexerc": 7432, - "Ġexercise": 10158, - "Ġexercised": 61013, - "Ġexercises": 22932, - "Ġexercising": 50482, - "Ġexercitation": 98449, - "ĠexercÃŃcio": 141448, - "Ġexert": 42744, - "Ġexh": 56659, - "Ġexhaust": 17502, - "Ġexhausted": 37919, - "Ġexhausting": 78853, - "Ġexhaustion": 69563, - "Ġexhaustive": 72503, - "Ġexhib": 12253, - "Ġexhibit": 30224, - "Ġexhibited": 50613, - "Ġexhibiting": 86619, - "Ġexhibition": 27001, - "Ġexhibitions": 69764, - "Ġexhibits": 49729, - "Ġexhilar": 90726, - "Ġexig": 73672, - "Ġexile": 59987, - "Ġexist": 3000, - "Ġexiste": 28153, - "Ġexisted": 24295, - "Ġexistence": 13885, - "Ġexistential": 66639, - "Ġexisting": 6350, - "Ġexists": 6724, - "Ġexit": 4869, - "Ġexited": 51283, - "Ġexiting": 44748, - "Ġexits": 42086, - "Ġexon": 98744, - "Ġexotic": 38318, - "Ġexp": 1343, - "Ġexpand": 9225, - "Ġexpanded": 17183, - "Ġexpanding": 23175, - "Ġexpands": 51856, - "Ġexpans": 38914, - "Ġexpansion": 14461, - "Ġexpansions": 77488, - "Ġexpansive": 60738, - "Ġexpect": 1720, - "Ġexpectancy": 65895, - "Ġexpectation": 30193, - "Ġexpectations": 16665, - "Ġexpected": 3601, - "ĠexpectedResult": 81441, - "Ġexpecting": 22331, - "Ġexpects": 24297, - "Ġexped": 30627, - "Ġexpedition": 50164, - "Ġexpelled": 66231, - "Ġexpend": 27310, - "Ġexpended": 98031, - "Ġexpenditure": 44326, - "Ġexpenditures": 52769, - "Ġexpense": 20284, - "Ġexpenses": 18024, - "Ġexpensive": 11392, - "Ġexper": 2134, - "Ġexperi": 5747, - "Ġexperience": 3139, - "Ġexperienced": 10321, - "Ġexperiences": 11449, - "Ġexperiencia": 53313, - "Ġexperiencing": 24084, - "Ġexperiment": 9342, - "Ġexperimental": 22000, - "Ġexperimentation": 65096, - "Ġexperimented": 97404, - "Ġexperimenting": 59157, - "Ġexperiments": 21204, - "Ġexperiência": 133780, - "Ġexpert": 6203, - "Ġexpertise": 18726, - "Ġexperts": 11647, - "Ġexpiration": 31692, - "Ġexpire": 32563, - "Ġexpired": 26391, - "Ġexpires": 27902, - "ĠexpiresIn": 98400, - "Ġexpiry": 49921, - "Ġexpl": 3247, - "Ġexplain": 10339, - "Ġexplained": 11247, - "Ġexplaining": 25021, - "Ġexplains": 14758, - "Ġexplan": 13357, - "Ġexplanation": 16148, - "Ġexplanations": 40841, - "Ġexplanatory": 92466, - "Ġexplic": 55269, - "Ġexplicit": 11464, - "Ġexplicitly": 20975, - "Ġexplo": 7532, - "Ġexplode": 15758, - "Ġexploded": 43813, - "Ġexplodes": 93913, - "Ġexploding": 72645, - "Ġexploit": 32194, - "Ġexploitation": 39661, - "Ġexploited": 50663, - "Ġexploiting": 70601, - "Ġexploits": 62388, - "Ġexplor": 47439, - "Ġexploration": 26403, - "Ġexplore": 13186, - "Ġexplored": 35031, - "Ġexplorer": 52967, - "Ġexplores": 40324, - "Ġexploring": 23966, - "Ġexplos": 13894, - "Ġexplosion": 24199, - "Ġexplosions": 55406, - "Ġexplosive": 33050, - "Ġexplosives": 56309, - "Ġexpo": 92316, - "Ġexponent": 27690, - "Ġexponential": 58755, - "Ġexponentially": 74151, - "Ġexport": 7485, - "Ġexported": 34890, - "Ġexporter": 57378, - "Ġexporters": 74848, - "Ġexporting": 60221, - "Ġexports": 12794, - "Ġexpos": 45856, - "Ġexpose": 28141, - "Ġexposed": 14900, - "Ġexposes": 58281, - "Ġexposing": 45966, - "Ġexposition": 90418, - "Ġexposure": 14338, - "Ġexposures": 69430, - "Ġexpr": 15169, - "Ġexpres": 66505, - "Ġexpress": 3158, - "Ġexpressed": 13302, - "Ġexpresses": 60020, - "Ġexpressing": 36710, - "Ġexpression": 7493, - "Ġexpressions": 23393, - "Ġexpressive": 77123, - "Ġexpressly": 52511, - "Ġexpulsion": 94889, - "Ġexpérience": 87311, - "Ġexquisite": 58608, - "Ġext": 1303, - "Ġextend": 13036, - "Ġextended": 11577, - "Ġextending": 32359, - "Ġextends": 2239, - "Ġextension": 8894, - "Ġextensions": 19721, - "Ġextensive": 16376, - "Ġextensively": 41717, - "Ġextent": 12818, - "Ġextents": 91489, - "Ġexter": 54267, - "Ġexterior": 27263, - "Ġextern": 15637, - "Ġexternal": 9250, - "Ġexternally": 68342, - "Ġextinct": 68818, - "Ġextinction": 51509, - "Ġextingu": 55707, - "Ġextortion": 95380, - "Ġextr": 11482, - "Ġextra": 4960, - "Ġextract": 8649, - "Ġextracted": 27432, - "Ġextracting": 59408, - "Ġextraction": 32189, - "Ġextractor": 67472, - "Ġextracts": 47962, - "Ġextrad": 66802, - "Ġextradition": 93976, - "Ġextraordin": 63455, - "Ġextraordinarily": 74924, - "Ġextraordinary": 23742, - "Ġextrapol": 70362, - "Ġextras": 36275, - "Ġextrav": 57339, - "Ġextravag": 73064, - "Ġextravagant": 94850, - "Ġextrem": 5876, - "Ġextreme": 14226, - "Ġextremely": 9016, - "Ġextremes": 68871, - "Ġextremism": 69668, - "Ġextremist": 55782, - "Ġextremists": 57907, - "Ġey": 3912, - "Ġeye": 7912, - "Ġeyeb": 35961, - "Ġeyebrow": 83316, - "Ġeyebrows": 60125, - "Ġeyed": 90672, - "Ġeyel": 53857, - "Ġeyes": 6414, - "Ġeyewitness": 88910, - "Ġez": 43320, - "ĠeÄŁ": 126689, - "ĠeÄŁer": 141166, - "ĠeÄŁitim": 129765, - "ĠeÄŁlen": 140298, - "ĠeÅŁ": 129944, - "Ġf": 282, - "ĠfChain": 95183, - "ĠfName": 92409, - "Ġfa": 2218, - "Ġfab": 9570, - "Ġfabric": 13055, - "Ġfabricated": 69454, - "Ġfabrication": 58151, - "Ġfabrics": 51954, - "Ġfabs": 40728, - "Ġfabulous": 34531, - "Ġfac": 3463, - "Ġfacade": 61616, - "Ġface": 3579, - "Ġfacebook": 22943, - "Ġfaced": 16601, - "Ġfaces": 12300, - "Ġfacet": 44507, - "Ġfacets": 61714, - "Ġfacial": 27800, - "Ġfacil": 57324, - "Ġfacile": 50694, - "Ġfacilit": 16617, - "Ġfacilitate": 27596, - "Ġfacilitated": 71749, - "Ġfacilitates": 72533, - "Ġfacilitating": 67265, - "Ġfacilities": 12786, - "Ġfacility": 12481, - "Ġfacing": 12880, - "Ġfact": 2097, - "Ġfaction": 36380, - "Ġfactions": 47652, - "Ġfacto": 60496, - "Ġfactor": 8168, - "Ġfactorial": 52962, - "Ġfactories": 34059, - "Ġfactors": 9363, - "Ġfactory": 8633, - "Ġfacts": 13064, - "Ġfactual": 59901, - "Ġfactura": 99045, - "Ġfacult": 72433, - "Ġfaculties": 96983, - "Ġfaculty": 21564, - "Ġfade": 15016, - "ĠfadeIn": 46510, - "Ġfaded": 53334, - "Ġfades": 86409, - "Ġfading": 58517, - "Ġfail": 3690, - "Ġfailed": 4641, - "Ġfailing": 21394, - "Ġfails": 14525, - "Ġfailure": 7901, - "Ġfailures": 27850, - "Ġfaint": 37578, - "Ġfair": 6624, - "Ġfaire": 19463, - "Ġfairly": 14138, - "Ġfairness": 50741, - "Ġfairy": 44486, - "Ġfais": 65417, - "Ġfait": 19694, - "Ġfaith": 9881, - "Ġfaithful": 36413, - "Ġfaithfully": 93076, - "Ġfake": 12418, - "Ġfaker": 64086, - "Ġfakt": 66792, - "Ġfal": 25484, - "Ġfall": 4399, - "Ġfallback": 32772, - "Ġfallen": 20866, - "Ġfalling": 15679, - "Ġfallout": 64152, - "Ġfalls": 17066, - "Ġfals": 31932, - "Ġfalse": 895, - "Ġfalsehood": 95018, - "Ġfalsely": 60356, - "Ġfalta": 62999, - "Ġfam": 2091, - "Ġfame": 32551, - "Ġfamed": 60303, - "Ġfamil": 43426, - "Ġfamilia": 50947, - "Ġfamilial": 97204, - "Ġfamiliar": 11285, - "Ġfamiliarity": 70440, - "Ġfamilies": 8521, - "Ġfamille": 66528, - "Ġfamily": 2997, - "Ġfamine": 77954, - "Ġfamous": 11245, - "Ġfamously": 50187, - "ĠfamÃŃlia": 132492, - "Ġfan": 8405, - "Ġfanatic": 96799, - "Ġfanc": 80597, - "Ġfancy": 26457, - "Ġfandom": 74325, - "Ġfans": 7211, - "Ġfant": 8587, - "Ġfantas": 39338, - "Ġfantasies": 59177, - "Ġfantast": 63879, - "Ġfantastic": 14622, - "Ġfantasy": 18378, - "Ġfar": 3041, - "Ġfare": 20425, - "Ġfares": 69218, - "Ġfarewell": 71543, - "Ġfark": 129369, - "Ġfarklı": 129370, - "Ġfarm": 8785, - "Ġfarmer": 36400, - "Ġfarmers": 20336, - "Ġfarmhouse": 82308, - "Ġfarming": 32389, - "Ġfarms": 33224, - "Ġfart": 97495, - "Ġfarther": 42626, - "Ġfas": 66518, - "Ġfasc": 15195, - "Ġfascinated": 60814, - "Ġfascinating": 26291, - "Ġfascination": 74344, - "Ġfascism": 80422, - "Ġfascist": 72879, - "Ġfase": 69712, - "Ġfashion": 11153, - "Ġfashionable": 59323, - "Ġfashioned": 67456, - "Ġfast": 4937, - "Ġfasta": 85249, - "Ġfastball": 93962, - "Ġfaster": 10596, - "Ġfastest": 25648, - "Ġfasting": 53460, - "Ġfat": 8664, - "Ġfatal": 18582, - "ĠfatalError": 57863, - "Ġfatalities": 70205, - "Ġfatally": 71361, - "Ġfate": 24382, - "Ġfather": 6981, - "Ġfathers": 39217, - "Ġfatigue": 35609, - "Ġfats": 49027, - "Ġfatt": 86209, - "Ġfatto": 63878, - "Ġfatty": 38985, - "Ġfauc": 49786, - "Ġfaucet": 71453, - "Ġfault": 14527, - "Ġfaults": 56690, - "Ġfaulty": 57571, - "Ġfauna": 98914, - "Ġfaut": 45990, - "Ġfaux": 50427, - "Ġfav": 9244, - "Ġfavicon": 82804, - "Ġfavor": 4694, - "Ġfavorable": 36749, - "Ġfavored": 45503, - "Ġfavorite": 6930, - "Ġfavorites": 26574, - "Ġfavors": 53847, - "Ġfavour": 12337, - "Ġfavourable": 81185, - "Ġfavoured": 91767, - "Ġfavourite": 18696, - "Ġfavourites": 56934, - "Ġfax": 48619, - "Ġfaz": 37069, - "Ġfazer": 39845, - "Ġfaç": 94872, - "Ġfaçon": 75307, - "Ġfb": 25469, - "Ġfc": 25563, - "Ġfclose": 27204, - "Ġfd": 12414, - "Ġfds": 93734, - "Ġfe": 1152, - "Ġfear": 8679, - "Ġfeared": 37469, - "Ġfearful": 62657, - "Ġfearing": 80525, - "Ġfearless": 92011, - "Ġfears": 23209, - "Ġfeas": 31892, - "Ġfeasibility": 68443, - "Ġfeasible": 42203, - "Ġfeast": 52168, - "Ġfeat": 12347, - "Ġfeather": 49776, - "Ġfeathers": 55894, - "Ġfeats": 63301, - "Ġfeature": 4565, - "Ġfeatured": 14766, - "Ġfeatures": 4419, - "Ġfeaturing": 16445, - "Ġfec": 53961, - "Ġfecha": 23028, - "Ġfed": 22313, - "Ġfeder": 41107, - "Ġfederal": 6775, - "Ġfederally": 79537, - "Ġfederation": 79275, - "Ġfee": 11060, - "Ġfeed": 5395, - "Ġfeedback": 11055, - "Ġfeeder": 57007, - "Ġfeeding": 24991, - "Ġfeeds": 34396, - "Ġfeel": 2666, - "Ġfeeling": 8266, - "Ġfeelings": 15650, - "Ġfeels": 11074, - "Ġfees": 12436, - "Ġfeet": 7541, - "Ġfel": 18027, - "Ġfeliz": 94495, - "Ġfell": 11052, - "Ġfellow": 12357, - "Ġfellows": 86719, - "Ġfellowship": 62249, - "Ġfelon": 79914, - "Ġfelony": 36623, - "Ġfelt": 6476, - "Ġfem": 4996, - "Ġfemale": 8778, - "Ġfemales": 27485, - "Ġfemin": 17002, - "Ġfeminine": 45184, - "Ġfeminism": 52010, - "Ġfeminist": 36912, - "Ġfeminists": 64765, - "Ġfemme": 18195, - "Ġfemmes": 30556, - "Ġfen": 43485, - "Ġfence": 24650, - "Ġfenced": 83393, - "Ġfences": 69155, - "Ġfencing": 67427, - "Ġfend": 94027, - "Ġfer": 18227, - "Ġferm": 80582, - "Ġferment": 67636, - "Ġfermentation": 73354, - "Ġfermented": 94980, - "Ġfern": 87024, - "Ġferr": 57039, - "Ġferry": 51550, - "Ġfert": 21207, - "Ġfertil": 35114, - "Ġfertile": 69125, - "Ġfertility": 47011, - "Ġfertilizer": 64291, - "Ġferv": 66375, - "Ġfest": 18859, - "Ġfestival": 18780, - "Ġfestivals": 44417, - "Ġfestive": 58837, - "Ġfestivities": 79359, - "Ġfet": 16467, - "Ġfetal": 62646, - "Ġfetch": 7807, - "ĠfetchData": 77798, - "Ġfetched": 41442, - "Ġfetching": 44234, - "Ġfetisch": 97730, - "Ġfetish": 39152, - "Ġfetus": 75588, - "Ġfeu": 81611, - "Ġfeud": 56710, - "Ġfeudal": 94350, - "Ġfever": 33553, - "Ġfew": 2421, - "Ġfewer": 16745, - "Ġff": 25539, - "Ġffi": 76956, - "Ġfflush": 52686, - "Ġffm": 75892, - "Ġffmpeg": 84912, - "Ġfft": 43700, - "Ġfg": 29799, - "Ġfgets": 65556, - "Ġfh": 36075, - "Ġfi": 9136, - "Ġfian": 75572, - "Ġfiance": 94188, - "Ġfiat": 53830, - "Ġfib": 15801, - "Ġfiber": 23788, - "Ġfiberglass": 93211, - "Ġfibers": 48674, - "Ġfibonacci": 75698, - "Ġfibr": 94135, - "Ġfibre": 56425, - "Ġfic": 41255, - "Ġfica": 95127, - "Ġfich": 28975, - "Ġfichier": 44320, - "Ġfick": 49203, - "Ġficken": 35879, - "Ġfict": 88107, - "Ġfiction": 16989, - "Ġfictional": 43582, - "Ġfid": 32104, - "Ġfidelity": 82504, - "Ġfie": 62305, - "Ġfield": 2070, - "ĠfieldName": 38538, - "ĠfieldType": 98151, - "ĠfieldValue": 95084, - "Ġfields": 5043, - "Ġfier": 30518, - "Ġfierc": 74627, - "Ġfierce": 41342, - "Ġfiercely": 77945, - "Ġfiery": 63842, - "Ġfif": 11128, - "Ġfifo": 63497, - "Ġfifteen": 36655, - "Ġfifth": 17702, - "Ġfifty": 32417, - "Ġfig": 4144, - "Ġfight": 4367, - "Ġfighter": 24860, - "Ġfighters": 23202, - "Ġfighting": 10805, - "Ġfights": 27433, - "Ġfigsize": 78101, - "Ġfigur": 55655, - "Ġfigura": 93715, - "Ġfigure": 7071, - "Ġfigured": 24692, - "Ġfigures": 12396, - "Ġfiguring": 47209, - "Ġfil": 1461, - "Ġfila": 48769, - "Ġfilament": 90780, - "Ġfile": 1034, - "ĠfileId": 91261, - "ĠfileInfo": 73651, - "ĠfileList": 69076, - "ĠfileName": 12665, - "ĠfilePath": 22598, - "ĠfileSize": 71976, - "ĠfileType": 82646, - "Ġfiled": 12729, - "Ġfilename": 3899, - "Ġfilenames": 40540, - "Ġfilepath": 26054, - "Ġfileprivate": 55595, - "Ġfiles": 3542, - "Ġfilesize": 70436, - "Ġfilesystem": 38389, - "Ġfiletype": 90271, - "Ġfilho": 91521, - "Ġfilib": 95686, - "Ġfiling": 25480, - "Ġfilings": 67148, - "Ġfill": 5155, - "ĠfillColor": 73235, - "Ġfille": 36154, - "Ġfilled": 10199, - "Ġfiller": 54710, - "Ġfilles": 55027, - "Ġfilling": 21274, - "Ġfills": 40587, - "Ġfilm": 4531, - "Ġfilme": 41080, - "Ġfilmed": 41408, - "Ġfilmer": 74580, - "Ġfilmes": 97796, - "Ġfilming": 38870, - "Ġfilmm": 33526, - "Ġfilmmaker": 56237, - "Ġfilmmakers": 62103, - "Ġfilmpjes": 94330, - "Ġfilms": 12351, - "Ġfilmy": 89394, - "Ġfils": 88572, - "Ġfilt": 71854, - "Ġfilter": 4051, - "Ġfiltered": 18293, - "Ġfiltering": 29670, - "Ġfilters": 13406, - "Ġfilthy": 77342, - "Ġfiltr": 50691, - "Ġfiltration": 74938, - "Ġfiltro": 74485, - "Ġfim": 52087, - "Ġfin": 1875, - "Ġfinal": 1590, - "Ġfinale": 36298, - "Ġfinalist": 97391, - "Ġfinalists": 82546, - "Ġfinalize": 54090, - "Ġfinalized": 60387, - "Ġfinally": 5499, - "Ġfinals": 40302, - "Ġfinanc": 40545, - "Ġfinance": 17017, - "Ġfinanced": 69664, - "Ġfinances": 39282, - "Ġfinancial": 5896, - "Ġfinancially": 37975, - "Ġfinancier": 96298, - "Ġfinancing": 28542, - "Ġfinanzi": 87878, - "Ġfind": 1477, - "ĠfindAll": 42785, - "ĠfindBy": 44459, - "ĠfindById": 59525, - "ĠfindOne": 78530, - "ĠfindViewById": 10241, - "Ġfinde": 82207, - "Ġfinden": 35103, - "Ġfinder": 43730, - "Ġfindet": 75315, - "Ġfinding": 9271, - "Ġfindings": 14613, - "Ġfinds": 13719, - "Ġfine": 6915, - "Ġfined": 53881, - "Ġfinely": 60702, - "Ġfiner": 72786, - "Ġfines": 33918, - "Ġfinest": 27707, - "Ġfing": 38727, - "Ġfinger": 14317, - "Ġfingerprint": 42597, - "Ġfingerprints": 76677, - "Ġfingers": 19225, - "Ġfingert": 63603, - "Ġfingertips": 71048, - "Ġfinish": 6248, - "Ġfinished": 8060, - "Ġfinishes": 33036, - "Ġfinishing": 24284, - "Ġfinite": 34226, - "Ġfinns": 73065, - "Ġfino": 76130, - "Ġfins": 64979, - "Ġfint": 84285, - "Ġfir": 33992, - "Ġfire": 3940, - "ĠfireEvent": 76755, - "Ġfirearm": 35605, - "Ġfirearms": 31553, - "Ġfirebase": 20424, - "Ġfired": 13895, - "Ġfirefight": 37603, - "Ġfirefighter": 94165, - "Ġfirefighters": 52106, - "Ġfirefox": 81683, - "Ġfireplace": 39411, - "Ġfirepower": 93726, - "Ġfires": 26084, - "Ġfirestore": 73993, - "Ġfirewall": 49877, - "Ġfireworks": 51833, - "Ġfiring": 22830, - "Ġfirm": 7474, - "Ġfirma": 80353, - "Ġfirmly": 31520, - "Ġfirms": 18809, - "Ġfirmware": 29678, - "Ġfirst": 1156, - "ĠfirstName": 21046, - "Ġfirsthand": 82568, - "Ġfirstly": 93952, - "Ġfirstname": 48193, - "Ġfis": 41623, - "Ġfiscal": 19743, - "Ġfish": 7640, - "Ġfisheries": 81496, - "Ġfishermen": 73193, - "Ġfishes": 94361, - "Ġfishing": 19948, - "Ġfiss": 94059, - "Ġfisse": 67662, - "Ġfist": 39802, - "Ġfists": 80684, - "Ġfit": 4946, - "Ġfitness": 17042, - "Ġfits": 18304, - "Ġfitte": 66455, - "Ġfitted": 28341, - "Ġfitting": 26345, - "Ġfittings": 68926, - "Ġfive": 4236, - "Ġfix": 5046, - "Ġfixation": 83762, - "Ġfixed": 8356, - "Ġfixes": 26537, - "Ġfixing": 35251, - "Ġfixture": 12507, - "Ġfixtures": 37664, - "Ġfiyat": 128102, - "Ġfiyatları": 140001, - "Ġfiyatı": 141974, - "Ġfiz": 78211, - "Ġfizz": 86979, - "Ġfj": 75371, - "Ġfk": 62683, - "Ġfkk": 60798, - "Ġfl": 1320, - "Ġfla": 96128, - "Ġflag": 5181, - "Ġflagged": 61209, - "Ġflags": 8042, - "Ġflagship": 42672, - "Ġflair": 68565, - "Ġflakes": 81623, - "Ġflam": 73499, - "Ġflame": 34578, - "Ġflames": 38785, - "Ġflaming": 84623, - "Ġflank": 69492, - "Ġflap": 66433, - "Ġflare": 60263, - "Ġflash": 8217, - "Ġflashback": 97423, - "Ġflashed": 69839, - "Ġflashes": 61285, - "Ġflashing": 49757, - "Ġflashlight": 78415, - "Ġflashy": 95467, - "Ġflask": 19534, - "Ġflat": 10063, - "Ġflats": 60357, - "Ġflatt": 51039, - "Ġflatten": 45343, - "Ġflattened": 67361, - "Ġflattering": 83108, - "Ġflav": 18276, - "Ġflavor": 17172, - "Ġflavored": 87240, - "Ġflavorful": 93531, - "Ġflavors": 31423, - "Ġflavour": 46597, - "Ġflavours": 70082, - "Ġflaw": 25700, - "Ġflawed": 46908, - "Ġflawless": 68516, - "Ġflaws": 40759, - "Ġfld": 59166, - "Ġfle": 12962, - "Ġflea": 95855, - "Ġfled": 28910, - "Ġflee": 27400, - "Ġfleece": 91990, - "Ġfleeing": 49287, - "Ġfleet": 25099, - "Ġfleeting": 95335, - "Ġfleets": 90649, - "Ġflere": 85591, - "Ġflesh": 24955, - "Ġflew": 31022, - "Ġflex": 5763, - "ĠflexDirection": 29397, - "ĠflexGrow": 91770, - "Ġflexibility": 24177, - "Ġflexible": 18776, - "Ġflick": 28347, - "Ġflies": 37104, - "Ġflight": 10971, - "Ġflights": 24908, - "Ġflip": 18287, - "Ġflipped": 46080, - "Ġflipping": 64661, - "Ġflips": 85186, - "Ġflirt": 52630, - "Ġflirting": 87242, - "Ġflo": 9744, - "Ġfloat": 2224, - "ĠfloatValue": 81513, - "Ġfloated": 66035, - "Ġfloating": 19057, - "Ġfloats": 47902, - "Ġflock": 48716, - "Ġflood": 17726, - "Ġflooded": 48786, - "Ġflooding": 38162, - "Ġfloods": 60172, - "Ġfloor": 6422, - "Ġflooring": 36148, - "Ġfloors": 25945, - "Ġflop": 90342, - "Ġfloppy": 91358, - "Ġflor": 69140, - "Ġflora": 80988, - "Ġfloral": 45019, - "Ġflorida": 75654, - "Ġflotation": 67197, - "Ġflour": 19828, - "Ġflourish": 66684, - "Ġflourishing": 98259, - "Ġflow": 6396, - "Ġflowed": 84650, - "Ġflower": 22351, - "Ġflowering": 81239, - "Ġflowers": 19281, - "Ġflowing": 35512, - "Ġflown": 52750, - "Ġflows": 27455, - "Ġflu": 19660, - "Ġfluct": 38288, - "Ġfluctuations": 64549, - "Ġfluent": 57768, - "Ġfluffy": 67561, - "Ġfluid": 15590, - "Ġfluids": 55306, - "Ġfluor": 53636, - "Ġfluores": 50781, - "Ġfluorescence": 96232, - "Ġfluorescent": 73764, - "Ġfluoride": 88130, - "Ġflurry": 87463, - "Ġflush": 18198, - "Ġflushed": 73720, - "Ġflushing": 90532, - "Ġflute": 95712, - "Ġflutter": 73783, - "Ġflux": 30305, - "Ġfly": 11466, - "Ġflyer": 74906, - "Ġflyers": 85008, - "Ġflying": 16307, - "Ġfm": 31121, - "Ġfmap": 69579, - "Ġfmt": 8879, - "Ġfn": 5168, - "Ġfname": 22548, - "Ġfo": 11756, - "Ġfoam": 31083, - "Ġfoc": 8249, - "Ġfocal": 41099, - "Ġfocus": 5244, - "Ġfocused": 10735, - "Ġfocuses": 23497, - "Ġfocusing": 21080, - "Ġfod": 61429, - "Ġfodder": 97795, - "Ġfoe": 51977, - "Ġfoes": 53744, - "Ġfog": 30249, - "Ġfoi": 21679, - "Ġfoil": 46399, - "Ġfois": 36191, - "Ġfol": 9443, - "Ġfold": 11555, - "Ġfolded": 47035, - "Ġfolder": 8527, - "Ġfolders": 29242, - "Ġfolding": 44742, - "Ġfolds": 60507, - "Ġfoliage": 79005, - "Ġfolk": 27936, - "Ġfolklore": 97869, - "Ġfolks": 15327, - "Ġfoll": 51406, - "Ġfollando": 71579, - "Ġfollic": 81614, - "Ġfollow": 1795, - "Ġfollowed": 8110, - "Ġfollower": 48207, - "Ġfollowers": 20119, - "Ġfollowing": 2701, - "Ġfollows": 11017, - "Ġfolly": 80689, - "Ġfon": 27305, - "Ġfonction": 33401, - "Ġfond": 21208, - "Ġfondo": 80529, - "Ġfont": 3301, - "ĠfontFamily": 29135, - "ĠfontSize": 10893, - "ĠfontStyle": 88237, - "ĠfontWeight": 18551, - "ĠfontWithName": 97118, - "Ġfonts": 32980, - "Ġfontsize": 35222, - "Ġfoo": 15229, - "Ġfood": 3607, - "Ġfoods": 15298, - "Ġfool": 23977, - "Ġfooled": 79547, - "Ġfoolish": 45237, - "Ġfools": 83642, - "Ġfoot": 4478, - "Ġfootage": 21852, - "Ġfootball": 8964, - "Ġfooter": 23173, - "Ġfooth": 78363, - "Ġfooting": 73403, - "Ġfootnote": 86810, - "Ġfootprint": 42872, - "Ġfootsteps": 59702, - "Ġfootwear": 67072, - "Ġfopen": 20377, - "Ġfor": 369, - "ĠforCell": 72522, - "ĠforCellReuseIdentifier": 93856, - "ĠforControlEvents": 48801, - "ĠforEach": 82532, - "ĠforIndexPath": 98656, - "ĠforKey": 18091, - "ĠforState": 28228, - "Ġfora": 84984, - "Ġforall": 31647, - "Ġforam": 54534, - "Ġforb": 54744, - "Ġforbid": 73631, - "Ġforbidden": 36813, - "Ġforc": 51742, - "Ġforce": 5344, - "Ġforced": 9575, - "Ġforcefully": 85978, - "Ġforces": 8437, - "Ġforcibly": 73823, - "Ġforcing": 24913, - "Ġford": 44628, - "Ġfore": 2241, - "Ġforeach": 4043, - "Ġforearm": 90565, - "Ġforecast": 17595, - "Ġforecasting": 78382, - "Ġforecasts": 50065, - "Ġforeclosure": 80282, - "Ġforefront": 51201, - "Ġforegoing": 87831, - "Ġforeground": 39305, - "Ġforehead": 51254, - "Ġforeign": 7214, - "Ġforeigners": 47412, - "Ġforemost": 42680, - "Ġforensic": 54221, - "Ġfores": 69756, - "Ġforesee": 56691, - "Ġforeseeable": 77903, - "Ġforest": 13638, - "Ġforestry": 87034, - "Ġforests": 35558, - "Ġforever": 15683, - "Ġforex": 29806, - "Ġforfe": 48932, - "Ġforfeiture": 89621, - "Ġforg": 11548, - "Ġforge": 56628, - "Ġforged": 53199, - "Ġforget": 10667, - "Ġforgetting": 65027, - "Ġforging": 94831, - "Ġforgive": 43391, - "Ġforgiven": 72595, - "Ġforgiveness": 52050, - "Ġforgiving": 92341, - "Ġforgot": 28595, - "Ġforgotten": 24547, - "Ġfork": 22435, - "Ġforks": 73574, - "Ġform": 1352, - "ĠformData": 27977, - "Ġforma": 21791, - "Ġformal": 15908, - "Ġformally": 36302, - "Ġformas": 83089, - "Ġformat": 3561, - "ĠformatDate": 86772, - "Ġformation": 18003, - "Ġformations": 61164, - "Ġformato": 54856, - "Ġformats": 19856, - "Ġformatted": 23126, - "Ġformatter": 24814, - "Ġformatting": 36566, - "Ġforme": 56028, - "Ġformed": 14122, - "Ġformer": 4741, - "Ġformerly": 33733, - "Ġformidable": 53729, - "Ġforming": 29064, - "Ġforms": 7586, - "Ġformul": 80940, - "Ġformula": 14806, - "Ġformulaire": 94895, - "Ġformulario": 62428, - "Ġformulas": 54079, - "Ġformulate": 88859, - "Ġformulated": 59294, - "Ġformulation": 54886, - "Ġformulations": 96977, - "Ġforn": 56009, - "Ġfors": 74651, - "Ġforsk": 83352, - "Ġfort": 11845, - "Ġforte": 63958, - "Ġforth": 13241, - "Ġforthcoming": 44664, - "Ġfortified": 94436, - "Ġfortn": 83211, - "Ġfortress": 69838, - "Ġforts": 74552, - "Ġfortunate": 39410, - "Ġfortunately": 86832, - "Ġfortune": 32315, - "Ġfortunes": 67503, - "Ġforty": 35398, - "Ġforum": 11848, - "Ġforums": 24865, - "Ġforward": 4637, - "Ġforwarded": 52246, - "Ġforwarding": 62104, - "Ġforwards": 41054, - "Ġforça": 135192, - "Ġfos": 48390, - "Ġfoss": 25421, - "Ġfossil": 30276, - "Ġfossils": 80373, - "Ġfost": 36313, - "Ġfoster": 29987, - "Ġfostering": 85544, - "Ġfot": 31840, - "Ġfoto": 25575, - "Ġfotograf": 63246, - "Ġfotos": 32959, - "ĠfotoÄŁ": 134222, - "ĠfotoÄŁraf": 134223, - "Ġfou": 56525, - "Ġfought": 20463, - "Ġfoul": 39784, - "Ġfound": 1730, - "Ġfoundation": 16266, - "Ġfoundational": 88228, - "Ġfoundations": 40482, - "Ġfounded": 18047, - "Ġfounder": 18996, - "Ġfounders": 47627, - "Ġfounding": 35230, - "Ġfountain": 56613, - "Ġfour": 3040, - "Ġfourn": 80894, - "Ġfours": 89620, - "Ġfourteen": 62260, - "Ġfourth": 11737, - "Ġfout": 38273, - "Ġfov": 93473, - "Ġfox": 38835, - "Ġfoyer": 98916, - "Ġfp": 12007, - "Ġfprintf": 9377, - "Ġfps": 33881, - "Ġfputs": 77036, - "Ġfq": 82467, - "Ġfr": 1422, - "Ġfra": 6677, - "Ġfrac": 53676, - "Ġfracking": 70054, - "Ġfract": 26602, - "Ġfraction": 19419, - "Ġfractional": 68209, - "Ġfractions": 64895, - "Ġfracture": 58804, - "Ġfractured": 79108, - "Ġfractures": 77232, - "Ġfrag": 8343, - "Ġfragile": 44250, - "Ġfragment": 12289, - "ĠfragmentManager": 94532, - "Ġfragmentation": 87352, - "Ġfragmented": 86095, - "Ġfragments": 34503, - "Ġfragrance": 55127, - "Ġfrags": 97203, - "Ġfrail": 90123, - "Ġfrais": 90553, - "Ġfram": 59643, - "Ġframe": 4034, - "Ġframeborder": 71462, - "Ġframebuffer": 73019, - "Ġframed": 45993, - "Ġframerate": 97251, - "Ġframes": 14087, - "Ġframework": 12626, - "Ġframeworks": 48025, - "Ġframing": 57949, - "Ġfran": 22156, - "Ġfranc": 43479, - "Ġfranca": 34747, - "Ġfrancais": 50332, - "Ġfrancaise": 66468, - "Ġfrance": 47587, - "Ġfranch": 16545, - "Ġfranchise": 19024, - "Ġfranchises": 63903, - "Ġfrank": 25790, - "Ġfrankfurt": 82175, - "Ġfrankly": 41662, - "Ġfrantic": 88606, - "Ġfranç": 41337, - "Ġfrançais": 54367, - "Ġfrançaise": 92324, - "Ġfrase": 90329, - "Ġfrat": 80972, - "Ġfraternity": 78296, - "Ġfrau": 37031, - "Ġfraud": 16124, - "Ġfraudulent": 53883, - "Ġfrauen": 19835, - "Ġfraught": 95959, - "Ġfray": 97253, - "Ġfre": 3457, - "Ġfread": 46134, - "Ġfreak": 29205, - "Ġfreaking": 73240, - "Ġfrec": 81105, - "Ġfred": 97126, - "Ġfreder": 84076, - "Ġfree": 1910, - "Ġfreed": 27534, - "Ġfreedom": 11290, - "Ġfreedoms": 59977, - "Ġfreeing": 66717, - "Ġfreel": 31131, - "Ġfreelance": 45109, - "Ġfreelancer": 92668, - "Ġfreely": 25580, - "Ġfrees": 71455, - "Ġfreeway": 83574, - "Ġfreeze": 29930, - "Ġfreezer": 49585, - "Ġfreezes": 93377, - "Ġfreezing": 42218, - "Ġfrei": 83423, - "Ġfreight": 45117, - "Ġfrem": 61122, - "Ġfren": 46834, - "Ġfrench": 41193, - "Ġfrente": 56722, - "Ġfrenzy": 73841, - "Ġfreopen": 56443, - "Ġfreq": 20895, - "Ġfrequ": 6166, - "Ġfrequencies": 33773, - "Ġfrequency": 11639, - "Ġfrequent": 20757, - "Ġfrequently": 13814, - "Ġfres": 48873, - "Ġfresh": 7722, - "Ġfreshly": 49899, - "Ġfreshman": 40217, - "Ġfreshmen": 97749, - "Ġfreshness": 98216, - "Ġfreshwater": 79644, - "Ġfret": 53064, - "Ġfreund": 77634, - "Ġfri": 2633, - "Ġfriction": 38576, - "Ġfriday": 79313, - "Ġfridge": 37581, - "Ġfried": 40851, - "Ġfriend": 4238, - "Ġfriendly": 11657, - "Ġfriends": 4780, - "Ġfriendship": 26509, - "Ġfriendships": 61981, - "Ġfries": 51931, - "Ġfright": 29547, - "Ġfrightened": 59078, - "Ġfrightening": 53639, - "Ġfringe": 54807, - "Ġfrivol": 95424, - "Ġfrm": 28354, - "Ġfro": 12799, - "Ġfrog": 59881, - "Ġfrogs": 89446, - "Ġfrom": 504, - "ĠfromDate": 79616, - "Ġfron": 77952, - "Ġfront": 4065, - "Ġfrontal": 65646, - "Ġfrontend": 45645, - "Ġfrontier": 48000, - "Ġfrontline": 96001, - "Ġfronts": 63390, - "Ġfrost": 44734, - "Ġfrosting": 98181, - "Ġfrowned": 76359, - "Ġfroze": 89009, - "Ġfrozen": 19690, - "Ġfruit": 13779, - "Ġfruitful": 88584, - "Ġfruition": 93606, - "Ġfruits": 25322, - "Ġfruity": 91932, - "Ġfrustr": 14457, - "Ġfrustrated": 32530, - "Ġfrustrating": 34611, - "Ġfrustration": 31986, - "Ġfrustrations": 88934, - "Ġfry": 52546, - "Ġfrying": 86096, - "ĠfrÃ¥n": 48106, - "Ġfrække": 98403, - "Ġfrü": 98877, - "Ġfrüh": 134303, - "Ġfs": 8619, - "Ġfscanf": 68486, - "Ġfseek": 79262, - "Ġfsm": 83138, - "Ġfst": 48434, - "Ġft": 10482, - "Ġftp": 45427, - "Ġfu": 18415, - "Ġfuck": 7820, - "Ġfucked": 27153, - "Ġfucking": 17224, - "Ġfucks": 54363, - "Ġfue": 22026, - "Ġfuel": 10416, - "Ġfueled": 58361, - "Ġfuels": 39273, - "Ġfuer": 38651, - "Ġfuera": 69675, - "Ġfueron": 67146, - "Ġfug": 48084, - "Ġful": 5599, - "Ġfulfil": 63101, - "Ġfulfill": 20423, - "Ġfulfilled": 40734, - "Ġfulfilling": 49598, - "Ġfulfillment": 56283, - "Ġfull": 2480, - "ĠfullName": 48008, - "ĠfullPath": 85844, - "ĠfullWidth": 51320, - "Ġfuller": 86918, - "Ġfullest": 76696, - "Ġfullfile": 84616, - "Ġfullname": 61036, - "Ġfullscreen": 56927, - "Ġfully": 7225, - "Ġfun": 2464, - "Ġfunc": 2915, - "Ġfuncion": 27863, - "Ġfunciona": 86896, - "Ġfunciones": 83412, - "Ġfuncionários": 143768, - "Ġfunción": 63077, - "Ġfuncs": 76871, - "Ġfunct": 41051, - "Ġfunction": 729, - "ĠfunctionName": 90519, - "Ġfunctional": 15629, - "Ġfunctionalities": 92080, - "Ġfunctionality": 14944, - "Ġfunctioning": 30201, - "Ġfunctions": 5746, - "Ġfunctools": 56466, - "Ġfunctor": 74712, - "Ġfund": 3802, - "Ġfundament": 12479, - "Ġfundamental": 15811, - "Ġfundamentally": 42493, - "Ġfundamentals": 56840, - "Ġfunded": 23906, - "Ġfunding": 10773, - "Ġfundra": 26318, - "Ġfundraiser": 58659, - "Ġfundraising": 36319, - "Ġfunds": 10514, - "Ġfuneral": 30979, - "Ġfung": 33598, - "Ġfungal": 94347, - "Ġfungi": 80440, - "Ġfungus": 78802, - "Ġfunk": 68292, - "Ġfunkc": 71778, - "Ġfunktion": 68312, - "Ġfunky": 73888, - "Ġfunnel": 60219, - "Ġfunny": 15173, - "Ġfunção": 62753, - "Ġfur": 18241, - "Ġfurious": 52070, - "Ġfurn": 9439, - "Ġfurnace": 54464, - "Ġfurnish": 51159, - "Ġfurnished": 23437, - "Ġfurnishings": 72171, - "Ġfurniture": 14549, - "Ġfurry": 74419, - "Ġfurther": 4623, - "Ġfurthermore": 77537, - "Ġfury": 63059, - "Ġfus": 68478, - "Ġfuse": 31702, - "Ġfused": 74654, - "Ġfusion": 36508, - "Ġfuss": 63764, - "Ġfut": 17645, - "Ġfutile": 84527, - "Ġfuture": 3853, - "Ġfutures": 36823, - "Ġfuturistic": 79220, - "Ġfuturo": 64644, - "Ġfuzz": 76142, - "Ġfuzzy": 52733, - "Ġfv": 61654, - "Ġfw": 33886, - "Ġfwd": 91004, - "Ġfwrite": 45235, - "Ġfx": 33219, - "Ġfy": 51941, - "Ġfz": 92649, - "Ġfácil": 59140, - "ĠfÃ¥": 38605, - "ĠfÃ¥r": 48516, - "Ġfé": 57382, - "Ġfévrier": 135431, - "Ġfête": 140738, - "Ġfö": 40500, - "Ġför": 16641, - "Ġfø": 57370, - "Ġfør": 46483, - "Ġførste": 78436, - "Ġfüh": 50232, - "Ġfün": 96120, - "Ġfünf": 136740, - "Ġfür": 7180, - "ĠfÃŃs": 64846, - "ĠfÃŃsica": 134921, - "ĠfÃŃsico": 139074, - "Ġfı": 136901, - "Ġfırs": 136902, - "Ġfırsat": 136903, - "Ġg": 342, - "Ġga": 13510, - "Ġgaan": 61613, - "Ġgaat": 68045, - "Ġgab": 55879, - "Ġgad": 33216, - "Ġgadget": 58851, - "Ġgadgets": 53375, - "Ġgag": 45592, - "Ġgain": 8722, - "Ġgained": 18163, - "Ġgaining": 29140, - "Ġgains": 19619, - "Ġgal": 15369, - "Ġgala": 96480, - "Ġgalaxies": 64917, - "Ġgalaxy": 33161, - "Ġgaler": 77607, - "Ġgall": 19203, - "Ġgalleries": 42554, - "Ġgallery": 18046, - "Ġgallon": 49580, - "Ġgallons": 50122, - "Ġgam": 9015, - "Ġgamb": 74934, - "Ġgamble": 63801, - "Ġgambling": 24696, - "Ġgame": 1809, - "ĠgameId": 92178, - "ĠgameObject": 36236, - "ĠgameOver": 71837, - "ĠgameState": 54993, - "ĠgameTime": 93254, - "Ġgameplay": 26029, - "Ġgamer": 57918, - "Ġgamers": 34743, - "Ġgames": 3868, - "Ġgaming": 15833, - "Ġgamle": 76552, - "Ġgamm": 85842, - "Ġgamma": 21619, - "Ġgan": 24851, - "Ġgang": 13179, - "Ġgangbang": 40754, - "Ġgangs": 54123, - "Ġganz": 38805, - "Ġganze": 93898, - "Ġgap": 12929, - "Ġgaping": 98936, - "Ġgaps": 32151, - "Ġgar": 7364, - "Ġgarage": 19277, - "Ġgarant": 39092, - "Ġgarbage": 25878, - "Ġgard": 21881, - "Ġgarden": 13551, - "Ġgardening": 59199, - "Ġgardens": 35436, - "Ġgarg": 96083, - "Ġgarlic": 30635, - "Ġgarment": 59618, - "Ġgarments": 66456, - "Ġgarn": 59916, - "Ġgarner": 46101, - "Ġgarnered": 67290, - "Ġgas": 6819, - "Ġgases": 44512, - "Ġgasoline": 45495, - "Ġgast": 87659, - "Ġgastr": 55680, - "Ġgastric": 88285, - "Ġgastro": 58249, - "Ġgastrointestinal": 79211, - "Ġgate": 18126, - "Ġgated": 84711, - "Ġgates": 34534, - "Ġgateway": 28795, - "Ġgather": 9567, - "Ġgathered": 20190, - "Ġgathering": 22888, - "Ġgatherings": 65137, - "Ġgathers": 85681, - "Ġgating": 73399, - "Ġgauche": 95621, - "Ġgauge": 30890, - "Ġgauss": 86869, - "Ġgaussian": 63447, - "Ġgave": 6551, - "Ġgay": 8321, - "Ġgays": 56477, - "Ġgaz": 54986, - "Ġgaze": 35396, - "Ġgb": 47015, - "Ġgbc": 65461, - "Ġgboolean": 48667, - "Ġgc": 22122, - "Ġgcc": 50917, - "Ġgcd": 44858, - "Ġgchar": 38761, - "Ġgd": 32630, - "Ġgdb": 75953, - "Ġgdk": 89939, - "Ġgdy": 75934, - "Ġgdyż": 139578, - "Ġgdzie": 95491, - "Ġge": 3893, - "Ġgear": 14448, - "Ġgearbox": 97873, - "Ġgeared": 58447, - "Ġgearing": 80722, - "Ġgears": 53160, - "Ġgeb": 29167, - "Ġgeben": 56500, - "Ġgebru": 43638, - "Ġgebruik": 83654, - "Ġged": 52193, - "Ġgee": 56505, - "Ġgeek": 55639, - "Ġgeen": 47820, - "Ġgef": 27684, - "Ġgefunden": 81671, - "Ġgeg": 97341, - "Ġgegen": 34699, - "Ġgegenüber": 139115, - "Ġgeh": 29695, - "Ġgehen": 62459, - "Ġgeht": 39264, - "Ġgehören": 142037, - "Ġgehört": 93096, - "Ġgeil": 62022, - "Ġgeile": 24162, - "Ġgek": 48323, - "Ġgel": 17837, - "Ġgeld": 41919, - "ĠgeldiÄŁi": 138315, - "Ġgele": 97502, - "ĠgeleceÄŁi": 143806, - "Ġgeli": 125963, - "ĠgeliÅŁ": 127436, - "ĠgeliÅŁme": 136126, - "ĠgeliÅŁtir": 132187, - "Ġgem": 18747, - "Ġgemacht": 69876, - "Ġgeme": 51637, - "Ġgemeins": 74354, - "Ġgems": 42158, - "Ġgen": 4081, - "Ġgenau": 68876, - "Ġgender": 9825, - "Ġgenders": 81328, - "Ġgene": 14862, - "Ġgener": 1766, - "Ġgenera": 83435, - "Ġgenerado": 79634, - "Ġgeneral": 4586, - "Ġgeneralize": 92540, - "Ġgeneralized": 66117, - "Ġgenerally": 8789, - "Ġgenerals": 70067, - "Ġgenerar": 94979, - "Ġgenerate": 6923, - "Ġgenerated": 7907, - "Ġgenerates": 26885, - "Ġgenerating": 23163, - "Ġgeneration": 9471, - "Ġgenerations": 21787, - "Ġgenerator": 13823, - "Ġgenerators": 43063, - "Ġgeneric": 13954, - "Ġgenerics": 95545, - "Ġgenerosity": 64252, - "Ġgenerous": 27671, - "Ġgenerously": 79120, - "Ġgenes": 20727, - "Ġgenesis": 59366, - "Ġgenetic": 18929, - "Ġgenetically": 50933, - "Ġgenetics": 55004, - "Ġgenie": 82757, - "Ġgenital": 56355, - "Ġgenitals": 90642, - "Ġgenius": 34101, - "ĠgeniÅŁ": 134325, - "Ġgenocide": 52524, - "Ġgenom": 98198, - "Ġgenome": 32769, - "Ġgenomes": 84281, - "Ġgenomic": 79964, - "Ġgenotype": 79185, - "Ġgenre": 17328, - "Ġgenres": 35644, - "Ġgens": 46004, - "Ġgent": 15886, - "Ġgente": 43042, - "Ġgentle": 21700, - "Ġgentleman": 45129, - "Ġgentlemen": 57809, - "Ġgently": 29273, - "Ġgenu": 16497, - "Ġgenuine": 22011, - "Ġgenuinely": 35197, - "Ġgenus": 63577, - "Ġgenç": 132425, - "Ġgeo": 27581, - "Ġgeographic": 45039, - "Ġgeographical": 52901, - "Ġgeography": 53142, - "Ġgeological": 85178, - "Ġgeom": 27256, - "Ġgeomet": 67986, - "Ġgeometric": 52484, - "Ġgeometry": 17047, - "Ġgeopol": 73456, - "Ġgeopolitical": 86898, - "Ġgep": 82942, - "Ġger": 17239, - "Ġgerade": 67058, - "Ġgeral": 97892, - "Ġgere": 66287, - "Ġgerekt": 140248, - "Ġgerekti": 140249, - "ĠgerektiÄŁini": 140250, - "Ġgerm": 81886, - "Ġgerman": 42527, - "Ġgermany": 82824, - "Ġgerne": 54064, - "Ġgerçek": 124962, - "ĠgerçekleÅŁ": 135442, - "ĠgerçekleÅŁtir": 127516, - "ĠgerçekleÅŁtiril": 137483, - "Ġgerçekten": 138837, - "Ġges": 14410, - "Ġgesch": 25620, - "Ġgeschichten": 50737, - "Ġgest": 12743, - "Ġgestion": 58371, - "Ġgestión": 138747, - "Ġgesture": 30157, - "Ġgestures": 52392, - "Ġgestão": 137632, - "Ġget": 633, - "ĠgetActivity": 47934, - "ĠgetAddress": 80623, - "ĠgetAll": 23955, - "ĠgetApp": 76382, - "ĠgetArguments": 97879, - "ĠgetBy": 57169, - "ĠgetById": 81502, - "ĠgetC": 43099, - "ĠgetCategory": 93575, - "ĠgetChild": 76518, - "ĠgetClass": 47237, - "ĠgetClient": 86287, - "ĠgetCode": 82873, - "ĠgetColor": 73468, - "ĠgetColumn": 97240, - "ĠgetConfig": 66763, - "ĠgetConnection": 65313, - "ĠgetContent": 63187, - "ĠgetContentPane": 53576, - "ĠgetContext": 66175, - "ĠgetCount": 54938, - "ĠgetCurrent": 40517, - "ĠgetData": 27616, - "ĠgetDate": 60166, - "ĠgetDefault": 69106, - "ĠgetDescription": 54733, - "ĠgetElement": 71547, - "ĠgetEmail": 67408, - "ĠgetField": 70964, - "ĠgetFile": 62442, - "ĠgetHeight": 62444, - "ĠgetId": 20452, - "ĠgetImage": 54561, - "ĠgetIndex": 89771, - "ĠgetInfo": 91824, - "ĠgetInput": 88977, - "ĠgetInstance": 37886, - "ĠgetInt": 85133, - "ĠgetIntent": 48811, - "ĠgetItem": 26978, - "ĠgetItemCount": 59772, - "ĠgetKey": 74103, - "ĠgetLast": 81479, - "ĠgetList": 59891, - "ĠgetLocation": 83392, - "ĠgetLogger": 96663, - "ĠgetMax": 81785, - "ĠgetMenu": 72827, - "ĠgetMenuInflater": 91000, - "ĠgetMessage": 57753, - "ĠgetModel": 73326, - "ĠgetName": 20299, - "ĠgetNext": 70379, - "ĠgetNode": 81798, - "ĠgetObject": 89173, - "ĠgetOrder": 82627, - "ĠgetP": 57720, - "ĠgetPage": 70853, - "ĠgetParent": 75578, - "ĠgetPassword": 68439, - "ĠgetPath": 82740, - "ĠgetPlayer": 98037, - "ĠgetPosition": 84357, - "ĠgetPrice": 89332, - "ĠgetProduct": 78203, - "ĠgetProperty": 75496, - "ĠgetRandom": 52436, - "ĠgetRequest": 78731, - "ĠgetResource": 87794, - "ĠgetResources": 58145, - "ĠgetResult": 83415, - "ĠgetS": 73683, - "ĠgetService": 85869, - "ĠgetSession": 74694, - "ĠgetSize": 66735, - "ĠgetSource": 71003, - "ĠgetState": 39070, - "ĠgetStatus": 56424, - "ĠgetString": 30907, - "ĠgetSupportActionBar": 72828, - "ĠgetSupportFragmentManager": 87435, - "ĠgetSystemService": 91376, - "ĠgetText": 63038, - "ĠgetTime": 60213, - "ĠgetTitle": 58832, - "ĠgetToken": 54111, - "ĠgetTotal": 74456, - "ĠgetType": 36581, - "ĠgetUrl": 68019, - "ĠgetUser": 23197, - "ĠgetUserId": 87498, - "ĠgetUsername": 85414, - "ĠgetUsers": 77569, - "ĠgetValue": 31720, - "ĠgetVersion": 97245, - "ĠgetView": 49885, - "ĠgetWidth": 69262, - "ĠgetWindow": 82461, - "ĠgetX": 75656, - "ĠgetY": 75280, - "Ġgetattr": 29997, - "Ġgetaway": 69893, - "Ġgetch": 96551, - "Ġgetchar": 60644, - "Ġgetenv": 55474, - "Ġgetline": 55198, - "Ġgetopt": 66902, - "Ġgetpid": 95378, - "Ġgets": 5221, - "Ġgetter": 33429, - "Ġgetters": 52894, - "Ġgettext": 63706, - "Ġgettimeofday": 88579, - "Ġgetting": 3709, - "Ġgev": 94406, - "Ġgew": 22539, - "Ġgez": 41150, - "Ġgezocht": 90274, - "Ġgeç": 76111, - "Ġgeçen": 132762, - "Ġgeçir": 130516, - "ĠgeçmiÅŁ": 137031, - "Ġgf": 41888, - "Ġgfx": 39478, - "Ġgg": 52034, - "Ġgh": 36124, - "Ġghetto": 98321, - "Ġghost": 19866, - "Ġghosts": 53840, - "Ġghé": 136639, - "Ġghế": 136221, - "Ġgi": 13535, - "Ġgia": 94995, - "Ġgiant": 14538, - "Ġgiants": 45209, - "Ġgib": 77327, - "Ġgibi": 67845, - "Ġgibt": 27298, - "Ġgid": 45863, - "Ġgif": 38466, - "Ġgifs": 95913, - "Ġgift": 8189, - "Ġgifted": 46780, - "Ġgifts": 20609, - "Ġgig": 22583, - "Ġgigantic": 57873, - "Ġgigg": 69618, - "Ġgigs": 77820, - "Ġgilt": 69499, - "Ġgim": 83258, - "Ġgimm": 74773, - "Ġgin": 46183, - "Ġging": 66093, - "Ġginger": 43668, - "Ġgint": 48474, - "Ġgio": 53043, - "Ġgioc": 91056, - "Ġgiochi": 72413, - "Ġgiorn": 59010, - "Ġgiorni": 85730, - "Ġgiorno": 80068, - "Ġgiov": 71523, - "Ġgir": 40289, - "ĠgiriÅŁ": 131066, - "Ġgirl": 3743, - "Ġgirlfriend": 22761, - "Ġgirlfriends": 84512, - "Ġgirls": 7571, - "Ġgist": 90500, - "Ġgit": 16345, - "Ġgithub": 31004, - "Ġgive": 2968, - "Ġgiveaway": 59964, - "Ġgiveaways": 86226, - "Ġgiven": 2661, - "Ġgiver": 94515, - "Ġgives": 6696, - "Ġgiving": 7086, - "Ġgiá": 128309, - "Ġgiác": 130780, - "Ġgiám": 133804, - "Ġgiáo": 129023, - "Ġgiãn": 143164, - "Ġgió": 135963, - "Ġgiú": 128429, - "Ġgiúp": 128430, - "ĠgiÃł": 71452, - "ĠgiÃłnh": 139833, - "ĠgiÃłu": 136949, - "Ġgiưá»Ŀng": 140744, - "Ġgiả": 126359, - "Ġgiải": 128486, - "Ġgiảm": 128757, - "Ġgiản": 130631, - "Ġgiảng": 137384, - "Ġgiấ": 141373, - "Ġgiấc": 141374, - "Ġgiấy": 131826, - "Ġgiết": 139950, - "ĠgiáºŃn": 142481, - "Ġgiữ": 129566, - "Ġgiữa": 129181, - "Ġgiá»įng": 140139, - "Ġgiá»ıi": 141734, - "Ġgiá»ijng": 130469, - "ĠgiỼi": 128449, - "Ġgiá»Ŀ": 128626, - "Ġgj": 35001, - "Ġgl": 2770, - "ĠglBegin": 93121, - "ĠglBind": 49609, - "ĠglColor": 69836, - "ĠglEnable": 64271, - "ĠglEnd": 91055, - "ĠglGen": 92849, - "ĠglGet": 50951, - "ĠglGetUniformLocation": 92720, - "ĠglUniform": 76110, - "ĠglVertex": 31128, - "Ġglac": 79516, - "Ġglacier": 93767, - "Ġglaciers": 94690, - "Ġglad": 15713, - "Ġgladly": 70850, - "Ġglam": 41012, - "Ġglamorous": 75914, - "Ġglamour": 78949, - "Ġglance": 33422, - "Ġglanced": 64557, - "Ġgland": 66069, - "Ġglands": 81275, - "Ġglare": 80134, - "Ġglaring": 71121, - "Ġglass": 8991, - "Ġglasses": 28147, - "Ġglazed": 92186, - "Ġgle": 29003, - "Ġglean": 94016, - "Ġgleich": 55248, - "Ġglfw": 50829, - "Ġgli": 27932, - "Ġglide": 85041, - "Ġglimps": 93062, - "Ġglimpse": 39842, - "Ġglitch": 61084, - "Ġglitches": 96380, - "Ġglitter": 54151, - "Ġglm": 17336, - "Ġglo": 13701, - "Ġglob": 13206, - "Ġglobal": 3644, - "Ġglobalization": 79969, - "Ġglobally": 30450, - "Ġglobals": 37785, - "Ġglobe": 23918, - "Ġglor": 57035, - "Ġglorious": 43208, - "Ġglory": 25936, - "Ġgloss": 35351, - "Ġglossy": 73056, - "Ġglove": 55420, - "Ġgloves": 35416, - "Ġglow": 35966, - "Ġglowing": 48492, - "Ġglu": 77276, - "Ġgluc": 29117, - "Ġglucose": 33223, - "Ġglue": 37461, - "Ġglued": 78115, - "Ġglut": 34069, - "Ġgluten": 37355, - "Ġgly": 36707, - "Ġglyc": 71057, - "Ġglyph": 32150, - "Ġglyphicon": 21997, - "Ġglyphs": 84277, - "Ġgm": 37879, - "Ġgmail": 58805, - "Ġgn": 38619, - "Ġgnome": 91061, - "Ġgo": 728, - "ĠgoTo": 77597, - "Ġgoal": 5795, - "Ġgoalie": 73333, - "Ġgoalkeeper": 62200, - "Ġgoals": 8845, - "Ġgoalt": 79622, - "Ġgoat": 53292, - "Ġgoats": 70832, - "Ġgob": 74417, - "Ġgobierno": 80793, - "Ġgod": 9886, - "Ġgoddess": 51090, - "Ġgode": 81257, - "Ġgods": 28813, - "Ġgodt": 80223, - "Ġgoed": 46401, - "Ġgoede": 98560, - "Ġgoes": 5780, - "Ġgoggles": 93990, - "Ġgoing": 2087, - "Ġgol": 44449, - "Ġgold": 6623, - "Ġgolden": 20748, - "Ġgolf": 19120, - "Ġgon": 63492, - "Ġgone": 8048, - "Ġgonna": 16519, - "Ġgoo": 79466, - "Ġgood": 1661, - "Ġgoodbye": 46455, - "Ġgoodies": 69755, - "Ġgoodness": 38426, - "Ġgoods": 11561, - "Ġgoodwill": 81646, - "Ġgoof": 70666, - "Ġgoofy": 99094, - "Ġgoog": 47469, - "Ġgoogle": 11558, - "Ġgoose": 62137, - "Ġgor": 45198, - "Ġgord": 93813, - "Ġgore": 90432, - "Ġgorge": 97377, - "Ġgorgeous": 23511, - "Ġgospel": 41482, - "Ġgossip": 57487, - "Ġgost": 67934, - "Ġgot": 2684, - "Ġgoto": 7986, - "Ġgotta": 36923, - "Ġgotten": 17019, - "Ġgou": 92036, - "Ġgourmet": 72485, - "Ġgouver": 84082, - "Ġgov": 47625, - "Ġgover": 2318, - "Ġgovern": 2569, - "Ġgovernance": 34086, - "Ġgoverned": 26702, - "Ġgoverning": 10012, - "Ġgovernment": 3033, - "Ġgovernmental": 51711, - "Ġgovernments": 16636, - "Ġgoverno": 93845, - "Ġgovernor": 19044, - "Ġgovernors": 67040, - "Ġgown": 64410, - "Ġgoût": 141423, - "ĠgoÅĽci": 137148, - "Ġgp": 28705, - "Ġgpio": 31622, - "Ġgpointer": 58398, - "Ġgps": 45567, - "Ġgpu": 38434, - "Ġgql": 53045, - "Ġgr": 1081, - "Ġgra": 27599, - "Ġgrab": 11633, - "Ġgrabbed": 29318, - "Ġgrabbing": 48930, - "Ġgrabs": 48055, - "Ġgrac": 91466, - "Ġgrace": 20839, - "Ġgraceful": 77362, - "Ġgracefully": 78499, - "Ġgracias": 66548, - "Ġgracious": 81326, - "Ġgrad": 5989, - "Ġgrade": 11972, - "Ġgraded": 79173, - "Ġgrades": 27611, - "Ġgradient": 20169, - "Ġgradients": 52149, - "Ġgrading": 65188, - "Ġgrado": 77645, - "Ġgrads": 69481, - "Ġgradu": 26934, - "Ġgradual": 52622, - "Ġgradually": 26024, - "Ġgraduate": 19023, - "Ġgraduated": 32009, - "Ġgraduates": 37481, - "Ġgraduating": 55917, - "Ġgraduation": 38454, - "Ġgraf": 58300, - "Ġgraffiti": 64843, - "Ġgraft": 68313, - "Ġgrain": 23925, - "Ġgrains": 40836, - "Ġgram": 23018, - "Ġgramm": 68125, - "Ġgrammar": 31428, - "Ġgrams": 33319, - "Ġgran": 15732, - "Ġgrand": 6662, - "Ġgrandchildren": 49751, - "Ġgranddaughter": 91390, - "Ġgrande": 24604, - "Ġgrandes": 37446, - "Ġgrandfather": 37850, - "Ġgrandi": 89774, - "Ġgrandma": 82677, - "Ġgrandmother": 38184, - "Ġgrandparents": 55335, - "Ġgrands": 93427, - "Ġgrandson": 65855, - "Ġgranite": 37290, - "Ġgranny": 62395, - "Ġgrant": 13198, - "ĠgrantResults": 79693, - "Ġgranted": 11676, - "Ġgranting": 48680, - "Ġgrants": 24108, - "Ġgranularity": 95997, - "Ġgrap": 67983, - "Ġgrape": 51152, - "Ġgrapes": 64908, - "Ġgraph": 4771, - "Ġgraphene": 65092, - "Ġgraphic": 20514, - "Ġgraphical": 53143, - "Ġgraphics": 14181, - "Ġgraphite": 94173, - "Ġgraphql": 48865, - "Ġgraphs": 38999, - "Ġgrappling": 89734, - "Ġgras": 48987, - "Ġgrasp": 33377, - "Ġgrass": 16359, - "Ġgrassroots": 56093, - "Ġgrat": 8728, - "Ġgrate": 85354, - "Ġgrated": 96176, - "Ġgrateful": 25195, - "Ġgratis": 7126, - "Ġgratitude": 45035, - "Ġgratuit": 11382, - "Ġgratuita": 95775, - "Ġgratuite": 47309, - "Ġgratuitement": 91934, - "Ġgratuites": 86746, - "Ġgratuiti": 95007, - "Ġgratuito": 77063, - "Ġgratuits": 75523, - "Ġgrav": 27959, - "Ġgrave": 24190, - "Ġgravel": 41523, - "Ġgraves": 61181, - "Ġgraveyard": 71833, - "Ġgravid": 89554, - "Ġgravitational": 69919, - "Ġgravity": 23249, - "Ġgravy": 87764, - "Ġgray": 17545, - "Ġgrayscale": 77357, - "Ġgraz": 50833, - "Ġgrazing": 83450, - "Ġgrd": 87560, - "Ġgre": 2816, - "Ġgrease": 62371, - "Ġgreat": 2244, - "Ġgreater": 7046, - "Ġgreatest": 12196, - "Ġgreatly": 18875, - "Ġgreatness": 62456, - "Ġgreed": 55826, - "Ġgreedy": 55980, - "Ġgreen": 6176, - "Ġgreenhouse": 36547, - "Ġgreens": 50911, - "Ġgreet": 40786, - "Ġgreeted": 43765, - "Ġgreeting": 42113, - "Ġgreetings": 94085, - "Ġgren": 37463, - "Ġgrenade": 66581, - "Ġgrenades": 78959, - "Ġgrep": 20675, - "Ġgrew": 13938, - "Ġgrey": 19780, - "Ġgri": 22993, - "Ġgrid": 5827, - "ĠgridBagConstraints": 54259, - "ĠgridColumn": 93699, - "ĠgridSize": 97511, - "ĠgridView": 69044, - "Ġgrids": 56349, - "Ġgrief": 37284, - "Ġgriev": 49913, - "Ġgrievances": 86936, - "Ġgrieving": 90744, - "Ġgrill": 39058, - "Ġgrille": 86825, - "Ġgrilled": 60633, - "Ġgrim": 43417, - "Ġgrin": 58280, - "Ġgrind": 39236, - "Ġgrinder": 45541, - "Ġgrinding": 16857, - "Ġgrinned": 87279, - "Ġgrip": 24676, - "Ġgripping": 80191, - "Ġgrips": 66239, - "Ġgris": 85830, - "Ġgrit": 40918, - "Ġgritty": 85678, - "Ġgro": 10487, - "Ġgroceries": 65408, - "Ġgrocery": 29587, - "Ġgroin": 97775, - "Ġgroom": 39841, - "Ġgrooming": 74061, - "Ġgroot": 81467, - "Ġgroove": 56406, - "Ġgrop": 91341, - "Ġgros": 24490, - "Ġgross": 19952, - "Ġgrosse": 44271, - "Ġgrote": 43446, - "Ġgrotes": 95179, - "Ġgrou": 93768, - "Ġground": 4910, - "Ġgroundbreaking": 63855, - "Ġgrounded": 44345, - "Ġgrounding": 94741, - "Ġgrounds": 20664, - "Ġgroundwater": 71229, - "Ġgroundwork": 94744, - "Ġgroup": 1874, - "ĠgroupBox": 42734, - "ĠgroupId": 41797, - "ĠgroupName": 65535, - "Ġgroupe": 56851, - "Ġgrouped": 40041, - "Ġgrouping": 49184, - "Ġgroups": 5203, - "Ġgrow": 3063, - "Ġgrowers": 68977, - "Ġgrowing": 7826, - "Ġgrown": 14700, - "Ġgrows": 27715, - "Ġgrowth": 6513, - "ĠgroÃŁ": 66723, - "ĠgroÃŁe": 56381, - "ĠgroÃŁen": 67703, - "Ġgrp": 51859, - "Ġgrpc": 47900, - "Ġgrub": 73706, - "Ġgrues": 75057, - "Ġgruesome": 85928, - "Ġgrund": 93434, - "Ġgrunt": 43043, - "Ġgrup": 33570, - "Ġgrupo": 37510, - "Ġgrupos": 72924, - "Ġgrátis": 74809, - "Ġgrâce": 76333, - "Ġgrö": 59409, - "ĠgrÃ¶ÃŁ": 74539, - "ĠgrÃ¶ÃŁer": 140370, - "Ġgs": 28081, - "Ġgsi": 96970, - "Ġgsl": 44221, - "Ġgson": 43066, - "Ġgst": 43769, - "Ġgt": 25161, - "Ġgtk": 18692, - "Ġgu": 1675, - "Ġguar": 9352, - "Ġguarante": 15389, - "Ġguarantee": 15440, - "Ġguaranteed": 19323, - "Ġguarantees": 35655, - "Ġguard": 7616, - "Ġguarda": 97385, - "Ġguardar": 63100, - "Ġguarded": 63163, - "Ġguardian": 46032, - "Ġguardians": 71781, - "Ġguarding": 79500, - "Ġguards": 26178, - "Ġgubern": 90422, - "Ġguerr": 75170, - "Ġguerra": 84927, - "Ġguess": 7942, - "Ġguessed": 42310, - "Ġguesses": 60537, - "Ġguessing": 46476, - "Ġguest": 8640, - "Ġguests": 14709, - "Ġgui": 19229, - "ĠguiActive": 70827, - "Ġguid": 9643, - "Ġguidance": 18821, - "Ġguide": 8474, - "Ġguided": 32587, - "Ġguideline": 72445, - "Ġguidelines": 17501, - "Ġguides": 27193, - "Ġguiding": 50246, - "Ġguild": 26411, - "Ġguilt": 33851, - "Ġguilty": 16007, - "Ġguint": 51726, - "Ġguise": 83063, - "Ġguit": 54399, - "Ġguitar": 16986, - "Ġguitarist": 61640, - "Ġguitars": 59494, - "Ġgul": 90270, - "Ġgulp": 29779, - "Ġgum": 41265, - "Ġgums": 97654, - "Ġgun": 6038, - "Ġgunfire": 76795, - "Ġgunman": 62097, - "Ġgunmen": 97668, - "Ġguns": 16362, - "Ġgunshot": 73781, - "Ġguru": 59426, - "Ġgust": 29814, - "Ġgusta": 69658, - "Ġgusto": 92239, - "Ġgut": 17859, - "Ġgute": 62702, - "Ġguten": 93615, - "Ġguts": 64873, - "Ġgutter": 48979, - "Ġguy": 7412, - "Ġguys": 7598, - "Ġgv": 54979, - "Ġgw": 56572, - "Ġgx": 61033, - "Ġgy": 28620, - "Ġgym": 18813, - "Ġgymn": 69121, - "Ġgypsum": 87580, - "Ġgyr": 79505, - "Ġgyro": 66868, - "Ġgz": 76963, - "Ġgzip": 57795, - "Ġgái": 129826, - "Ġgây": 128882, - "ĠgÃ¥": 53974, - "ĠgÃ¥r": 70757, - "Ġgé": 73572, - "Ġgén": 77322, - "Ġgénero": 142356, - "Ġgéné": 45580, - "Ġgénér": 135862, - "Ġgénéral": 88075, - "Ġgì": 128382, - "Ġgó": 131071, - "Ġgóc": 138456, - "Ġgói": 135974, - "Ġgóp": 131072, - "Ġgór": 132575, - "Ġgö": 30185, - "Ġgönder": 127520, - "Ġgönderil": 140693, - "Ġgör": 57704, - "Ġgörd": 128056, - "Ġgördü": 139449, - "ĠgördÃ¼ÄŁÃ¼": 142023, - "Ġgöre": 128569, - "Ġgörev": 129864, - "Ġgörm": 139767, - "Ġgörme": 136734, - "Ġgörmek": 139768, - "Ġgörü": 133037, - "Ġgörül": 131217, - "Ġgörün": 131389, - "Ġgörünt": 133038, - "Ġgörüntü": 133039, - "Ġgörüyor": 142301, - "ĠgörÃ¼ÅŁ": 127435, - "ĠgörÃ¼ÅŁme": 137857, - "Ġgöster": 128689, - "Ġgötür": 140438, - "Ġgöz": 126465, - "Ġgözü": 141667, - "Ġgü": 53908, - "Ġgüc": 137171, - "Ġgücü": 137172, - "Ġgün": 87687, - "Ġgünc": 137724, - "Ġgüncel": 137725, - "Ġgünd": 140070, - "Ġgündem": 140071, - "Ġgüne": 142397, - "ĠgüneÅŁ": 142398, - "Ġgünl": 139530, - "Ġgünlük": 139531, - "Ġgünü": 131214, - "Ġgünümüz": 143113, - "Ġgüven": 126802, - "Ġgüvenlik": 138655, - "Ġgüzel": 129032, - "Ġgüç": 127305, - "Ġgüçlü": 136735, - "ĠgÃł": 134530, - "Ġgı": 143677, - "Ġgıda": 143678, - "ĠgÅĤ": 65689, - "ĠgÅĤów": 143811, - "ĠgÅĤówn": 128127, - "ĠgÅĤówna": 140541, - "ĠgÅĤówne": 143812, - "ĠgÅĤównie": 141329, - "Ġgương": 139227, - "Ġgạo": 143692, - "Ġgấp": 139831, - "Ġgần": 128914, - "Ġgắn": 136822, - "Ġgắng": 137827, - "Ġgặp": 129233, - "Ġgợi": 143252, - "Ġgá»įi": 129349, - "Ġgá»įn": 138345, - "Ġgá»ijc": 134766, - "Ġgá»ĵ": 130067, - "Ġgá»ĵm": 130068, - "Ġgá»Ĺ": 133105, - "Ġgá»Ń": 130505, - "Ġgá»Ńi": 130506, - "Ġh": 305, - "ĠhObject": 69770, - "ĠhWnd": 58579, - "Ġha": 6386, - "Ġhaar": 41125, - "Ġhab": 6055, - "Ġhabe": 27726, - "Ġhaben": 17630, - "Ġhaber": 58282, - "Ġhabil": 94215, - "Ġhabit": 14132, - "Ġhabitat": 38546, - "Ġhabitats": 70599, - "Ġhabits": 25785, - "Ġhabitual": 83720, - "Ġhablar": 95743, - "ĠhabÃŃa": 54038, - "Ġhac": 53695, - "Ġhace": 34805, - "Ġhacen": 90965, - "Ġhacer": 25309, - "Ġhaci": 76903, - "Ġhacia": 56909, - "Ġhaciendo": 88053, - "Ġhack": 17086, - "Ġhacked": 46839, - "Ġhacker": 54122, - "Ġhackers": 40367, - "Ġhacking": 38138, - "Ġhacks": 59784, - "Ġhad": 1030, - "Ġhadde": 66334, - "Ġhade": 96884, - "Ġhadn": 18604, - "Ġhaha": 62350, - "Ġhai": 46051, - "Ġhail": 64250, - "Ġhailed": 63795, - "Ġhair": 6869, - "Ġhaircut": 85724, - "Ġhaired": 86102, - "Ġhairs": 64960, - "Ġhairst": 55284, - "Ġhairstyle": 95135, - "Ġhairstyles": 88772, - "Ġhairy": 50033, - "Ġhak": 97659, - "Ġhakk": 126779, - "Ġhakkı": 135932, - "Ġhakkında": 130023, - "Ġhal": 14761, - "Ġhalf": 4279, - "Ġhalftime": 78459, - "Ġhalfway": 41336, - "Ġhalk": 142183, - "Ġhalkın": 142184, - "Ġhall": 13994, - "Ġhallmark": 97699, - "Ġhalls": 51373, - "Ġhalluc": 58023, - "Ġhallway": 50802, - "Ġhalo": 70712, - "Ġhalt": 26269, - "Ġhalted": 60095, - "Ġhalten": 95723, - "Ġhalves": 74112, - "Ġham": 13515, - "Ġhamburg": 56847, - "Ġhamburger": 88747, - "Ġhamm": 82565, - "Ġhammer": 23457, - "Ġhammered": 92024, - "Ġhamstring": 89705, - "Ġhan": 19001, - "Ġhand": 1424, - "Ġhandbook": 75249, - "Ġhandc": 65045, - "Ġhanded": 22593, - "Ġhandful": 22955, - "Ġhandgun": 56805, - "Ġhandguns": 98536, - "Ġhandheld": 64949, - "Ġhandic": 47170, - "Ġhandicap": 74279, - "Ġhanding": 51488, - "Ġhandjob": 90641, - "Ġhandle": 3705, - "ĠhandleChange": 38655, - "ĠhandleClick": 52440, - "ĠhandleClose": 81567, - "ĠhandleError": 68200, - "ĠhandleMessage": 96840, - "ĠhandleSubmit": 42265, - "Ġhandled": 17608, - "Ġhandler": 7013, - "Ġhandlers": 24083, - "Ġhandles": 13469, - "Ġhandling": 11589, - "Ġhandmade": 51686, - "Ġhands": 6078, - "Ġhandset": 82163, - "Ġhandshake": 57020, - "Ġhandsome": 43777, - "Ġhandwriting": 91709, - "Ġhandwritten": 98389, - "Ġhandy": 25163, - "Ġhang": 14678, - "Ġhanging": 20704, - "Ġhangs": 58341, - "Ġhann": 92790, - "Ġhanno": 47784, - "Ġhans": 87544, - "Ġhanya": 69837, - "Ġhap": 45800, - "Ġhapp": 2255, - "Ġhappen": 3537, - "Ġhappened": 6932, - "Ġhappening": 12482, - "Ġhappens": 8573, - "Ġhappier": 43367, - "Ġhappiest": 98852, - "Ġhappily": 36775, - "Ġhappiness": 23009, - "Ġhappy": 6247, - "Ġhar": 4855, - "Ġharass": 18737, - "Ġharassed": 67510, - "Ġharassing": 86170, - "Ġharassment": 25355, - "Ġharb": 68466, - "Ġharbor": 56411, - "Ġharbour": 74642, - "Ġhard": 2588, - "Ġhardcoded": 92959, - "Ġhardcore": 26604, - "Ġhardened": 70736, - "Ġharder": 15750, - "Ġhardest": 36454, - "Ġhardly": 20171, - "Ġhardness": 70903, - "Ġhardship": 66550, - "Ġhardships": 95222, - "Ġhardware": 11773, - "Ġhardwood": 50545, - "Ġhare": 94918, - "Ġharga": 71348, - "Ġhari": 69696, - "Ġharm": 11428, - "Ġharmed": 68425, - "Ġharmful": 27756, - "Ġharming": 89155, - "Ġharmless": 52897, - "Ġharmon": 17774, - "Ġharmonic": 81241, - "Ġharmony": 25281, - "Ġharms": 83396, - "Ġharness": 32408, - "Ġharsh": 24939, - "Ġhart": 73928, - "Ġharus": 58497, - "Ġharvest": 23429, - "Ġharvested": 66472, - "Ġharvesting": 65647, - "Ġhas": 702, - "ĠhasNext": 82624, - "Ġhasattr": 31056, - "Ġhash": 5175, - "ĠhashCode": 29444, - "ĠhashMap": 67959, - "Ġhashed": 50676, - "Ġhasher": 90819, - "Ġhashes": 50257, - "Ġhashing": 72355, - "Ġhashlib": 54495, - "Ġhashmap": 92148, - "Ġhashtable": 82110, - "Ġhashtag": 47077, - "Ġhashtags": 81861, - "Ġhasil": 75043, - "Ġhasn": 12492, - "Ġhass": 36404, - "Ġhassle": 46847, - "Ġhast": 33043, - "Ġhasta": 28526, - "Ġhastalık": 137803, - "Ġhaste": 89439, - "Ġhastily": 93432, - "Ġhat": 8896, - "Ġhatch": 43255, - "Ġhate": 12213, - "Ġhated": 37574, - "Ġhateful": 75715, - "Ġhates": 54306, - "Ġhath": 51577, - "Ġhatred": 34142, - "Ġhats": 44426, - "Ġhatte": 42668, - "Ġhatten": 83572, - "Ġhatırl": 138834, - "Ġhatırla": 138835, - "Ġhaul": 37868, - "Ġhauling": 98446, - "Ġhaunt": 83658, - "Ġhaunted": 56675, - "Ġhaunting": 76654, - "Ġhaus": 70272, - "Ġhaut": 61221, - "Ġhaute": 79998, - "Ġhav": 29981, - "Ġhave": 614, - "Ġhaven": 8990, - "Ġhaving": 3432, - "Ġhavoc": 65492, - "Ġhawk": 75820, - "Ġhay": 17669, - "Ġhaya": 79521, - "Ġhayat": 127672, - "Ġhayatı": 134797, - "Ġhayatını": 140860, - "Ġhaystack": 88447, - "Ġhaz": 20144, - "Ġhazard": 30297, - "Ġhazardous": 49924, - "Ġhazards": 51542, - "Ġhaze": 89309, - "Ġhazır": 130348, - "Ġhazırl": 135754, - "Ġhazırlan": 135755, - "Ġhb": 45135, - "Ġhbox": 96782, - "Ġhc": 50394, - "Ġhd": 17907, - "Ġhdc": 85032, - "Ġhdf": 97045, - "Ġhdr": 36615, - "Ġhe": 566, - "Ġhead": 1968, - "Ġheadache": 46746, - "Ġheadaches": 54303, - "Ġheaded": 19383, - "Ġheader": 4247, - "Ġheaders": 7102, - "Ġheading": 14496, - "Ġheadings": 69452, - "Ġheadlights": 87620, - "Ġheadline": 31163, - "Ġheadlines": 30086, - "Ġheadphone": 76401, - "Ġheadphones": 43001, - "Ġheadquartered": 80196, - "Ġheadquarters": 25042, - "Ġheads": 14629, - "Ġheadset": 49579, - "Ġheal": 26563, - "Ġhealed": 61220, - "Ġhealer": 97111, - "Ġhealing": 21052, - "Ġheals": 86984, - "Ġhealth": 2820, - "Ġhealthcare": 18478, - "Ġhealthier": 38245, - "Ġhealthy": 9314, - "Ġheap": 17364, - "Ġheapq": 88522, - "Ġheaps": 92640, - "Ġhear": 6723, - "Ġheard": 6617, - "Ġhearing": 10778, - "Ġhearings": 44248, - "Ġhears": 52059, - "Ġheart": 4746, - "Ġheartbeat": 52105, - "Ġheartbreaking": 80106, - "Ġheartfelt": 83111, - "Ġhearts": 22662, - "Ġhearty": 81551, - "Ġheat": 8628, - "Ġheated": 31713, - "Ġheater": 42238, - "Ġheaters": 81367, - "Ġheating": 23579, - "Ġheatmap": 96623, - "Ġheats": 76562, - "Ġheav": 13405, - "Ġheaven": 22274, - "Ġheavenly": 66598, - "Ġheavens": 62780, - "Ġheavier": 43822, - "Ġheavily": 16916, - "Ġheavy": 8811, - "Ġheavyweight": 70629, - "Ġheb": 58141, - "Ġhebben": 39758, - "Ġhebt": 88083, - "Ġhecho": 49302, - "Ġheck": 46681, - "Ġhect": 47001, - "Ġhectares": 80643, - "Ġhectic": 90325, - "Ġhed": 60216, - "Ġhedge": 41666, - "Ġheed": 74399, - "Ġheeft": 37398, - "Ġheel": 34328, - "Ġheels": 33360, - "Ġhefty": 64142, - "Ġheg": 89403, - "Ġhei": 64489, - "Ġheight": 2608, - "ĠheightFor": 68349, - "Ġheightened": 59387, - "Ġheights": 35294, - "Ġheir": 50443, - "Ġheirs": 90301, - "ĠheiÃŁ": 79536, - "ĠheiÃŁt": 140385, - "Ġhel": 11338, - "Ġheld": 5644, - "Ġhele": 54095, - "Ġhelf": 74403, - "Ġhelfen": 82197, - "Ġhelicopt": 27367, - "Ġhelicopter": 35025, - "Ġhelicopters": 58332, - "Ġhelium": 96507, - "Ġhell": 14780, - "Ġhello": 23811, - "Ġhelm": 33765, - "Ġhelmet": 31535, - "Ġhelmets": 64620, - "Ġhelp": 1492, - "Ġhelped": 8910, - "Ġhelper": 13137, - "Ġhelpers": 30187, - "Ġhelpful": 10950, - "Ġhelping": 10476, - "Ġhelpless": 62528, - "Ġhelps": 8609, - "Ġhelt": 56442, - "Ġhely": 90115, - "Ġhem": 17280, - "Ġhemat": 95749, - "Ġhemisphere": 68666, - "Ġhemorrh": 70317, - "Ġhemos": 72257, - "Ġhemp": 40963, - "Ġhen": 47816, - "Ġhence": 16085, - "Ġhend": 84379, - "Ġhenne": 91617, - "Ġhentai": 45301, - "Ġhenüz": 141457, - "Ġhep": 79345, - "Ġhepat": 57159, - "Ġhepatitis": 72875, - "Ġher": 1059, - "Ġherald": 64106, - "Ġheraus": 83380, - "Ġherb": 38899, - "Ġherbal": 50387, - "Ġherbs": 41293, - "Ġherd": 58113, - "Ġhere": 1588, - "Ġhereby": 21799, - "Ġherein": 35781, - "Ġheritage": 27848, - "Ġhern": 71809, - "Ġhero": 11821, - "Ġheroes": 22907, - "Ġheroic": 55275, - "Ġheroin": 41634, - "Ġheroine": 80087, - "Ġherpes": 68985, - "Ġherr": 54739, - "Ġherramient": 81990, - "Ġhers": 10837, - "Ġherself": 11675, - "Ġhes": 19779, - "Ġhesabı": 139326, - "Ġhesitant": 70460, - "Ġhesitate": 38566, - "Ġhesitation": 64337, - "Ġhet": 9017, - "Ġhete": 82118, - "Ġheter": 29448, - "Ġheterogeneous": 97782, - "Ġheterosexual": 65308, - "Ġheure": 76718, - "Ġheures": 75045, - "Ġheuristic": 66609, - "Ġheute": 48614, - "Ġhex": 12371, - "Ġhexadecimal": 69722, - "Ġhexatrigesimal": 57966, - "Ġhey": 34209, - "Ġhf": 43242, - "Ġhg": 73294, - "Ġhh": 37914, - "Ġhi": 15588, - "Ġhiatus": 80186, - "Ġhic": 77907, - "Ġhid": 30794, - "Ġhidden": 8177, - "Ġhide": 10265, - "Ġhides": 57604, - "Ġhiding": 25037, - "Ġhier": 12412, - "Ġhierarchical": 69894, - "Ġhierarchy": 28922, - "Ġhieronta": 80203, - "Ġhigh": 1550, - "Ġhigher": 5080, - "Ġhighest": 8426, - "Ġhighlight": 11167, - "Ġhighlighted": 26366, - "Ġhighlighting": 38586, - "Ġhighlights": 21314, - "Ġhighly": 7548, - "Ġhighs": 53779, - "Ġhighway": 26736, - "Ġhighways": 59295, - "Ġhij": 21415, - "Ġhijo": 80045, - "Ġhijos": 88527, - "Ġhike": 34231, - "Ġhikes": 67485, - "Ġhiking": 37364, - "Ġhil": 51327, - "Ġhilar": 35659, - "Ġhilarious": 40267, - "Ġhill": 23946, - "Ġhills": 34131, - "Ġhim": 1435, - "Ġhimself": 5561, - "Ġhin": 51721, - "Ġhind": 47319, - "Ġhinder": 56680, - "Ġhindi": 52017, - "Ġhindsight": 86294, - "Ġhinge": 75593, - "Ġhinges": 79834, - "Ġhint": 13012, - "ĠhintText": 66228, - "Ġhinted": 66369, - "Ġhinter": 71968, - "Ġhints": 30643, - "Ġhip": 18143, - "Ġhipp": 43556, - "Ġhippoc": 70106, - "Ġhips": 42423, - "Ġhire": 17983, - "Ġhired": 21446, - "Ġhires": 71941, - "Ġhiring": 23134, - "Ġhis": 806, - "Ġhist": 12744, - "Ġhisto": 76517, - "Ġhistogram": 30281, - "Ġhistograms": 85645, - "Ġhistoire": 86710, - "Ġhistor": 6990, - "Ġhistoria": 50322, - "Ġhistorian": 42968, - "Ġhistorians": 50701, - "Ġhistoric": 18035, - "Ġhistorical": 13656, - "Ġhistorically": 34801, - "Ġhistories": 52110, - "Ġhistory": 3840, - "Ġhistó": 78486, - "Ġhistória": 93209, - "Ġhistórico": 139363, - "Ġhit": 4201, - "Ġhitch": 58107, - "Ġhits": 12983, - "Ġhitter": 71307, - "Ġhitters": 80033, - "Ġhitting": 19558, - "Ġhive": 65507, - "Ġhizo": 85183, - "Ġhiç": 126922, - "Ġhiçbir": 132303, - "Ġhiếm": 143799, - "Ġhiá»ĥm": 131491, - "Ġhiá»ĥn": 141280, - "Ġhiá»ĥu": 129061, - "Ġhiá»ĩn": 128283, - "Ġhiá»ĩp": 141741, - "Ġhiá»ĩu": 128423, - "Ġhj": 35588, - "Ġhjem": 66985, - "Ġhk": 83381, - "Ġhl": 49586, - "Ġhm": 49362, - "Ġhmac": 83356, - "Ġhmm": 87501, - "Ġhn": 95238, - "Ġho": 11386, - "Ġhoax": 72844, - "Ġhob": 68076, - "Ġhobbies": 63305, - "Ġhobby": 31528, - "Ġhoc": 66390, - "Ġhoch": 60021, - "Ġhockey": 26953, - "Ġhod": 86803, - "Ġhoe": 45876, - "Ġhog": 45925, - "Ġhogy": 32406, - "Ġhoje": 73158, - "Ġhol": 23523, - "Ġhold": 3331, - "Ġholder": 11839, - "Ġholders": 28709, - "Ġholding": 9963, - "Ġholdings": 57248, - "Ġholds": 9982, - "Ġhole": 14178, - "Ġholes": 19766, - "Ġholiday": 13257, - "Ġholidays": 24421, - "Ġholistic": 60776, - "Ġholland": 64664, - "Ġhollow": 41802, - "Ġholog": 71827, - "Ġholster": 97951, - "Ġholy": 26725, - "Ġhom": 4998, - "Ġhomage": 66989, - "Ġhombre": 55704, - "Ġhombres": 61844, - "Ġhome": 2114, - "Ġhomeland": 55236, - "Ġhomeless": 22994, - "Ġhomelessness": 61922, - "Ġhomem": 73415, - "Ġhomemade": 35333, - "Ġhomeowner": 66698, - "Ġhomeowners": 39862, - "Ġhomepage": 34589, - "Ġhomer": 91305, - "Ġhomers": 97598, - "Ġhomes": 10415, - "Ġhomeschool": 89819, - "Ġhometown": 43016, - "Ġhomework": 28459, - "Ġhomic": 36963, - "Ġhomicide": 48977, - "Ġhomicides": 88395, - "Ġhomme": 39251, - "Ġhommes": 52442, - "Ġhomo": 54413, - "Ġhomogeneous": 86182, - "Ġhomophobic": 92418, - "Ġhomosex": 27308, - "Ġhomosexual": 41764, - "Ġhomosexuality": 52351, - "Ġhomosexuals": 96123, - "Ġhon": 5831, - "Ġhonda": 84376, - "Ġhone": 51022, - "Ġhonest": 10745, - "Ġhonestly": 26044, - "Ġhonesty": 47848, - "Ġhoney": 25744, - "Ġhoneymoon": 83793, - "Ġhonor": 15669, - "Ġhonorable": 73490, - "Ġhonorary": 98019, - "Ġhonored": 38277, - "Ġhonoring": 77925, - "Ġhonors": 48493, - "Ġhonour": 33562, - "Ġhonoured": 89733, - "Ġhood": 27215, - "Ġhoodie": 96301, - "Ġhoof": 84730, - "Ġhoog": 98126, - "Ġhook": 9704, - "Ġhooked": 42670, - "Ġhookers": 92627, - "Ġhooks": 29677, - "Ġhookup": 61314, - "Ġhoop": 78671, - "Ġhoops": 96015, - "Ġhop": 7446, - "Ġhope": 3900, - "Ġhoped": 25189, - "Ġhopeful": 37550, - "Ġhopefully": 22326, - "Ġhopeless": 74223, - "Ġhopes": 16005, - "Ġhoping": 15652, - "Ġhopping": 92238, - "Ġhops": 58118, - "Ġhor": 4812, - "Ġhora": 34120, - "Ġhoras": 38892, - "Ġhorizon": 34074, - "Ġhorizontal": 16202, - "Ġhorizontally": 58888, - "Ġhorm": 20878, - "Ġhormonal": 73118, - "Ġhormone": 35808, - "Ġhormones": 43215, - "Ġhorn": 20631, - "Ġhorns": 59984, - "Ġhorny": 37207, - "Ġhorr": 25887, - "Ġhorrend": 92740, - "Ġhorrible": 27102, - "Ġhorribly": 76004, - "Ġhorrific": 46222, - "Ġhorrified": 81223, - "Ġhorrifying": 77550, - "Ġhorror": 21452, - "Ġhorrors": 69518, - "Ġhors": 59375, - "Ġhorse": 15223, - "Ġhorsepower": 69786, - "Ġhorses": 26830, - "Ġhos": 67827, - "Ġhose": 37500, - "Ġhoses": 95836, - "Ġhosp": 20407, - "Ġhospital": 8777, - "Ġhospitality": 46509, - "Ġhospitalized": 69240, - "Ġhospitals": 23551, - "Ġhost": 3468, - "Ġhostage": 58368, - "Ġhostages": 87603, - "Ġhosted": 21009, - "Ġhostel": 80811, - "Ġhostile": 32515, - "Ġhostility": 59929, - "Ġhosting": 19678, - "Ġhostname": 28115, - "Ġhosts": 18432, - "Ġhot": 4017, - "Ġhotel": 9500, - "Ġhotels": 24332, - "Ġhotline": 91875, - "Ġhotspot": 79210, - "Ġhott": 31522, - "Ġhotter": 78905, - "Ġhottest": 37291, - "Ġhotéis": 143286, - "Ġhour": 6460, - "Ġhourly": 46629, - "Ġhours": 4115, - "Ġhous": 7696, - "Ġhouse": 3753, - "Ġhoused": 51158, - "Ġhousehold": 13732, - "Ġhouseholds": 28839, - "Ġhouses": 14967, - "Ġhousing": 11721, - "Ġhover": 19548, - "Ġhovered": 90451, - "Ġhovering": 68607, - "Ġhow": 1246, - "Ġhowever": 4764, - "Ġhoy": 48741, - "Ġhoá": 137692, - "ĠhoÃłn": 128643, - "ĠhoÃłng": 135704, - "ĠhoÅŁ": 138013, - "Ġhoạch": 130361, - "Ġhoạt": 128623, - "Ġhoặc": 128475, - "Ġhp": 20630, - "Ġhr": 18026, - "Ġhref": 1801, - "Ġhrs": 40040, - "Ġhs": 32220, - "Ġhsv": 82333, - "Ġht": 34323, - "Ġhtml": 5272, - "ĠhtmlFor": 32193, - "Ġhtmlentities": 62998, - "Ġhtmlspecialchars": 31437, - "Ġhton": 81743, - "Ġhtonl": 86982, - "Ġhtons": 56367, - "Ġhtt": 54320, - "Ġhttp": 1758, - "ĠhttpClient": 45775, - "ĠhttpRequest": 77547, - "ĠhttpResponse": 74806, - "Ġhttps": 3703, - "Ġhu": 32965, - "Ġhub": 18719, - "Ġhubby": 97324, - "Ġhubs": 68676, - "Ġhud": 64033, - "Ġhue": 39040, - "Ġhues": 81657, - "Ġhug": 29784, - "Ġhuge": 6765, - "Ġhugely": 48637, - "Ġhugged": 93468, - "Ġhugs": 79242, - "Ġhuh": 56743, - "Ġhuis": 67609, - "Ġhull": 40198, - "Ġhum": 2784, - "Ġhuman": 3738, - "Ġhumane": 81026, - "Ġhumanitarian": 37648, - "Ġhumanities": 93035, - "Ġhumanity": 21941, - "Ġhumano": 96457, - "Ġhumanoid": 92109, - "Ġhumans": 12677, - "Ġhumble": 38512, - "Ġhumid": 65938, - "Ġhumidity": 37093, - "Ġhumili": 82169, - "Ġhumiliating": 91738, - "Ġhumiliation": 71718, - "Ġhumility": 74272, - "Ġhumming": 86327, - "Ġhumor": 27385, - "Ġhumorous": 69846, - "Ġhumour": 57369, - "Ġhun": 11533, - "Ġhundred": 7739, - "Ġhundreds": 11499, - "Ġhung": 18295, - "Ġhunger": 33806, - "Ġhungry": 28956, - "Ġhunt": 19073, - "Ġhunted": 79169, - "Ġhunter": 39727, - "Ġhunters": 47973, - "Ġhunting": 22514, - "Ġhunts": 92829, - "Ġhur": 12819, - "Ġhurd": 47481, - "Ġhurdle": 80683, - "Ġhurdles": 72535, - "Ġhurl": 93731, - "Ġhurricane": 48684, - "Ġhurricanes": 89027, - "Ġhurried": 72873, - "Ġhurry": 47235, - "Ġhurt": 12898, - "Ġhurting": 47289, - "Ġhurts": 43064, - "Ġhus": 9045, - "Ġhusband": 9972, - "Ġhusbands": 60854, - "Ġhust": 58650, - "Ġhustle": 87212, - "Ġhut": 75879, - "Ġhuyết": 135596, - "Ġhuyá»ĩn": 131210, - "Ġhv": 22747, - "Ġhva": 82766, - "Ġhvad": 91491, - "Ġhver": 89666, - "Ġhvis": 77575, - "Ġhvor": 50719, - "Ġhvordan": 62159, - "Ġhw": 31256, - "Ġhwnd": 52832, - "Ġhx": 53214, - "Ġhy": 6275, - "Ġhybrid": 24989, - "Ġhybrids": 96105, - "Ġhydr": 44605, - "Ġhydrated": 94731, - "Ġhydration": 86900, - "Ġhydraulic": 43075, - "Ġhydro": 16643, - "Ġhydrogen": 34684, - "Ġhygiene": 51956, - "Ġhym": 66643, - "Ġhyp": 9751, - "Ġhype": 44890, - "Ġhyper": 17071, - "Ġhyperlink": 93580, - "Ġhypers": 86652, - "Ġhypert": 47755, - "Ġhypertension": 62208, - "Ġhypnot": 75451, - "Ġhypo": 21845, - "Ġhypoc": 66486, - "Ġhypocrisy": 71706, - "Ġhypoth": 44355, - "Ġhypotheses": 73413, - "Ġhypothesis": 30078, - "Ġhypothetical": 58059, - "Ġhyster": 53019, - "Ġhysteria": 97666, - "Ġhá": 42122, - "Ġhát": 133951, - "Ġhã": 126704, - "Ġhãng": 132159, - "Ġhãy": 129805, - "Ġhä": 52656, - "Ġhär": 63686, - "Ġhät": 74492, - "Ġhätte": 95035, - "Ġhäufig": 137943, - "ĠhÃ¥": 53613, - "Ġhè": 136252, - "Ġhé": 87923, - "Ġhình": 128338, - "Ġhòa": 130669, - "Ġhóa": 128585, - "Ġhô": 132658, - "Ġhôm": 130535, - "Ġhôn": 133647, - "Ġhö": 42759, - "Ġhöch": 141963, - "Ġhöchst": 141964, - "Ġhöher": 139554, - "Ġhút": 130862, - "Ġhü": 133862, - "Ġhük": 128114, - "Ġhükü": 140149, - "Ġhüküm": 142799, - "Ġhükümet": 140150, - "ĠhÃł": 130734, - "ĠhÃłi": 133844, - "ĠhÃłng": 61758, - "ĠhÃłnh": 128373, - "Ġhız": 127597, - "Ġhızlı": 134255, - "ĠhÆ¡i": 131671, - "ĠhÆ¡n": 128304, - "Ġhư": 136375, - "Ġhương": 133899, - "ĠhÆ°á»Ľng": 128846, - "ĠhÆ°á»Łng": 129589, - "Ġhạ": 131140, - "Ġhại": 131579, - "Ġhạn": 129572, - "Ġhạng": 135303, - "Ġhạnh": 134127, - "Ġhạt": 134761, - "Ġhải": 138650, - "Ġhảo": 137658, - "Ġhấp": 131768, - "Ġhầu": 136402, - "Ġhắn": 129810, - "Ġhẳ": 138122, - "Ġhẳn": 138123, - "Ġhẹ": 140242, - "Ġhẹn": 140243, - "Ġhết": 128906, - "ĠháºŃu": 130990, - "Ġhợ": 128318, - "Ġhợp": 128319, - "Ġhá»§y": 143010, - "Ġhứng": 141163, - "Ġhữu": 129347, - "Ġhá»ģ": 137738, - "Ġhá»ĩ": 128457, - "Ġhá»į": 126247, - "Ġhá»įc": 128292, - "Ġhá»įp": 136856, - "Ġhá»ı": 143225, - "Ġhá»ıi": 129087, - "Ġhá»ıng": 143226, - "Ġhá»ĵ": 129122, - "Ġhá»ĵi": 130344, - "Ġhá»ĵng": 135342, - "Ġhá»Ĺ": 129481, - "Ġhá»Ļ": 126469, - "Ġhá»Ļi": 128410, - "Ġhá»Ļp": 139127, - "Ġi": 600, - "ĠiCloud": 86911, - "ĠiNdEx": 90443, - "ĠiOS": 16048, - "ĠiP": 76486, - "ĠiPad": 22271, - "ĠiParam": 42048, - "ĠiPhone": 12167, - "ĠiPhones": 72065, - "ĠiPod": 44071, - "ĠiT": 12387, - "ĠiTunes": 13025, - "ĠiVar": 56192, - "Ġia": 34824, - "Ġiam": 97148, - "Ġiar": 87721, - "Ġib": 18668, - "Ġic": 17902, - "Ġice": 9853, - "Ġiceberg": 88035, - "Ġich": 10638, - "Ġici": 48633, - "Ġicing": 75006, - "Ġicmp": 91826, - "Ġicon": 4603, - "ĠiconName": 89877, - "Ġiconic": 26277, - "Ġicons": 23765, - "Ġicy": 65904, - "Ġid": 877, - "Ġidade": 65965, - "Ġide": 2614, - "Ġidea": 4522, - "Ġideal": 10507, - "Ġideally": 49563, - "Ġideals": 51705, - "Ġideas": 6708, - "Ġident": 3524, - "Ġidentical": 19516, - "Ġidentifiable": 71350, - "Ġidentification": 21892, - "Ġidentified": 10820, - "Ġidentifier": 12816, - "Ġidentifiers": 47216, - "Ġidentifies": 35511, - "Ġidentify": 10542, - "Ġidentifying": 24588, - "Ġidentities": 39421, - "Ġidentity": 9569, - "Ġideological": 41833, - "Ġideologies": 88871, - "Ġideology": 33549, - "Ġidi": 40660, - "Ġidiot": 42258, - "Ġidiots": 79033, - "Ġidle": 27647, - "Ġidol": 47914, - "Ġidols": 89761, - "Ġids": 14151, - "Ġidx": 7187, - "Ġie": 29858, - "Ġieee": 60055, - "Ġierr": 53398, - "Ġiets": 88333, - "Ġif": 421, - "Ġiface": 49313, - "Ġifdef": 68971, - "Ġiff": 51108, - "Ġifndef": 82290, - "Ġiframe": 48413, - "Ġifs": 84073, - "Ġifstream": 71151, - "Ġig": 19373, - "Ġigen": 91229, - "Ġign": 5222, - "Ġignite": 89436, - "Ġignited": 97888, - "Ġignition": 59592, - "Ġignor": 25357, - "Ġignorance": 40560, - "Ġignorant": 46980, - "Ġignore": 10034, - "Ġignored": 12036, - "Ġignores": 48278, - "Ġignoring": 30903, - "Ġigual": 43475, - "Ġih": 13305, - "Ġihm": 58442, - "Ġihn": 40662, - "Ġihnen": 74021, - "Ġihr": 24440, - "Ġihre": 34749, - "Ġihrem": 71017, - "Ġihren": 52716, - "Ġihrer": 54649, - "Ġiht": 127648, - "Ġihtiy": 136922, - "Ġihtiya": 134616, - "Ġihtiyacı": 136923, - "Ġihtiyaç": 134617, - "Ġii": 14460, - "Ġiid": 91343, - "Ġiii": 62093, - "Ġij": 71861, - "Ġik": 13361, - "Ġikea": 74735, - "Ġikke": 22688, - "Ġil": 3815, - "Ġila": 138987, - "Ġilaç": 138988, - "Ġile": 30805, - "Ġileti": 137081, - "ĠiletiÅŁim": 137082, - "Ġili": 59309, - "ĠiliÅŁ": 127253, - "ĠiliÅŁki": 132156, - "ĠiliÅŁkin": 135047, - "Ġilk": 80338, - "Ġill": 5862, - "Ġilleg": 28967, - "Ġillegal": 11816, - "Ġillegally": 37384, - "Ġillicit": 58129, - "Ġillness": 17125, - "Ġillnesses": 48809, - "Ġillum": 46406, - "Ġillumin": 42987, - "Ġilluminate": 87582, - "Ġilluminated": 74548, - "Ġillumination": 75952, - "Ġillusion": 40819, - "Ġillusions": 87028, - "Ġillust": 96483, - "Ġillustr": 12293, - "Ġillustrate": 40368, - "Ġillustrated": 35662, - "Ġillustrates": 45380, - "Ġillustrating": 92912, - "Ġillustration": 39034, - "Ġillustrations": 44443, - "Ġillustrator": 93365, - "Ġilma": 91221, - "Ġils": 45052, - "Ġilçe": 132807, - "Ġim": 732, - "Ġima": 92693, - "Ġimag": 6532, - "Ġimage": 2168, - "ĠimageData": 65958, - "ĠimageName": 66073, - "ĠimageNamed": 30293, - "ĠimagePath": 69933, - "ĠimageSize": 87559, - "ĠimageURL": 89861, - "ĠimageUrl": 39649, - "ĠimageView": 29965, - "Ġimagem": 62897, - "Ġimagen": 40569, - "Ġimagery": 40445, - "Ġimages": 5335, - "Ġimagin": 42206, - "Ġimaginable": 89167, - "Ġimaginary": 49952, - "Ġimagination": 27799, - "Ġimaginative": 76261, - "Ġimagine": 12793, - "Ġimagined": 34606, - "Ġimaging": 31658, - "Ġimagining": 76624, - "Ġimap": 94717, - "Ġimb": 72254, - "Ġimbalance": 67231, - "Ġimdb": 83245, - "Ġime": 74434, - "Ġimg": 4964, - "ĠimgUrl": 76083, - "Ġimgs": 56165, - "Ġimitation": 86840, - "Ġimm": 4893, - "Ġimmac": 98138, - "Ġimmature": 85425, - "Ġimmedi": 5551, - "Ġimmediate": 13922, - "Ġimmediately": 7069, - "Ġimmense": 37783, - "Ġimmensely": 62589, - "Ġimmer": 25531, - "Ġimmersed": 77208, - "Ġimmersion": 74557, - "Ġimmersive": 64180, - "Ġimmigr": 15285, - "Ġimmigrant": 36550, - "Ġimmigrants": 19955, - "Ġimmigration": 15093, - "Ġimminent": 50451, - "Ġimmobil": 76341, - "Ġimmoral": 78154, - "Ġimmortal": 59114, - "Ġimmun": 32019, - "Ġimmune": 22077, - "Ġimmunity": 39268, - "Ġimmutable": 51572, - "Ġimp": 3163, - "Ġimpact": 5421, - "Ġimpacted": 38928, - "Ġimpactful": 97890, - "Ġimpacting": 72955, - "Ġimpacts": 24905, - "Ġimpair": 37874, - "Ġimpaired": 49060, - "Ġimpairment": 52217, - "Ġimpart": 69672, - "Ġimpartial": 67724, - "Ġimpass": 95589, - "Ġimpatient": 73697, - "Ġimpe": 35026, - "Ġimpeachment": 63654, - "Ġimpecc": 74619, - "Ġimpeccable": 88546, - "Ġimped": 49402, - "Ġimpedance": 89948, - "Ġimpending": 62461, - "Ġimper": 16772, - "Ġimperative": 47596, - "Ġimperfect": 67963, - "Ġimperial": 34279, - "Ġimperialism": 78951, - "Ġimperson": 59749, - "Ġimpl": 11605, - "Ġimplant": 45360, - "Ġimplanted": 94856, - "Ġimplants": 62184, - "Ġimplement": 4211, - "Ġimplementation": 8129, - "Ġimplementations": 38337, - "Ġimplemented": 11537, - "Ġimplementing": 24931, - "Ġimplements": 5169, - "Ġimplic": 91095, - "Ġimplicated": 68602, - "Ġimplication": 60536, - "Ġimplications": 24154, - "Ġimplicit": 17995, - "Ġimplicitly": 51773, - "Ġimplied": 6131, - "Ġimplies": 23945, - "Ġimplode": 26661, - "Ġimply": 33508, - "Ġimplying": 72867, - "Ġimport": 1159, - "Ġimportance": 12650, - "Ġimportant": 2989, - "Ġimportante": 35797, - "Ġimportantes": 74319, - "Ġimportantly": 22813, - "Ġimported": 24928, - "Ġimporter": 62561, - "Ġimporting": 49895, - "Ġimports": 15202, - "Ġimportância": 139669, - "Ġimpose": 32230, - "Ġimposed": 25980, - "Ġimposes": 87281, - "Ġimposing": 48841, - "Ġimposition": 93779, - "Ġimposs": 90082, - "Ġimpossible": 11997, - "Ġimpost": 81409, - "Ġimpover": 76642, - "Ġimpoverished": 87298, - "Ġimpr": 22540, - "Ġimpres": 76898, - "Ġimpress": 9897, - "Ġimpressed": 24404, - "Ġimpression": 20792, - "Ġimpressions": 49991, - "Ġimpressive": 15978, - "Ġimprimir": 92506, - "Ġimprint": 78867, - "Ġimprison": 28219, - "Ġimprisoned": 51842, - "Ġimprisonment": 42274, - "Ġimpro": 3657, - "Ġimprobable": 96256, - "Ġimproper": 39986, - "Ġimproperly": 74198, - "Ġimprov": 86670, - "Ġimprove": 7269, - "Ġimproved": 12944, - "Ġimprovement": 15673, - "Ġimprovements": 18142, - "Ġimproves": 34950, - "Ġimproving": 18392, - "Ġimprovis": 79063, - "Ġimprovised": 92539, - "Ġimpuls": 96779, - "Ġimpulse": 48867, - "Ġimpulses": 86533, - "Ġimpunity": 97670, - "Ġimread": 82419, - "Ġims": 71203, - "Ġimshow": 78599, - "Ġimu": 92861, - "Ġimágenes": 96275, - "Ġin": 304, - "ĠinFile": 94001, - "Ġinability": 37450, - "Ġinaccessible": 81728, - "Ġinaccur": 40925, - "Ġinaccurate": 49404, - "Ġinactive": 31799, - "Ġinade": 39106, - "Ġinadequate": 45479, - "Ġinadvert": 58828, - "Ġinadvertently": 69085, - "Ġinappropriate": 32681, - "Ġinaug": 29520, - "Ġinaugur": 81000, - "Ġinaugural": 53459, - "Ġinauguration": 59710, - "Ġinbound": 64943, - "Ġinbox": 22883, - "Ġinc": 3625, - "Ġincap": 39868, - "Ġincapable": 57171, - "Ġincapac": 93030, - "Ġincarcer": 45528, - "Ġincarcerated": 80124, - "Ġincarceration": 69052, - "Ġincarn": 95972, - "Ġincarnation": 78948, - "Ġincent": 20046, - "Ġincentiv": 82984, - "Ġincentive": 35110, - "Ġincentives": 35480, - "Ġinception": 53429, - "Ġincess": 91847, - "Ġincest": 42880, - "Ġinch": 17122, - "Ġinches": 14924, - "Ġincid": 61860, - "Ġincidence": 38675, - "Ġincident": 10455, - "Ġincidental": 83216, - "Ġincidents": 23546, - "Ġincididunt": 86404, - "Ġincl": 18409, - "Ġinclination": 75904, - "Ġinclined": 42031, - "Ġinclud": 1798, - "Ġinclude": 2924, - "Ġincluded": 5230, - "Ġincludes": 5646, - "Ġincluding": 2670, - "Ġinclus": 44309, - "Ġinclusion": 27187, - "Ġinclusive": 28308, - "Ġincluso": 72211, - "Ġincom": 52890, - "Ġincome": 7911, - "Ġincomes": 45691, - "Ġincoming": 19393, - "Ġincompatible": 52824, - "Ġincompet": 53920, - "Ġincompetence": 98648, - "Ġincompetent": 80812, - "Ġincomplete": 32143, - "Ġincon": 26995, - "Ġincons": 28664, - "Ġinconsist": 79861, - "Ġinconsistencies": 91822, - "Ġinconsistency": 96149, - "Ġinconsistent": 39140, - "Ġincontr": 78619, - "Ġincontri": 15372, - "Ġincontro": 71525, - "Ġinconvenience": 60009, - "Ġinconvenient": 83683, - "Ġincor": 8920, - "Ġincorpor": 14232, - "Ġincorporate": 32335, - "Ġincorporated": 31662, - "Ġincorporates": 51824, - "Ġincorporating": 51813, - "Ġincorporation": 87365, - "Ġincorrect": 15114, - "Ġincorrectly": 43347, - "Ġincr": 66826, - "Ġincre": 2281, - "Ġincrease": 5263, - "Ġincreased": 7172, - "Ġincreases": 12703, - "Ġincreasing": 7703, - "Ġincreasingly": 14756, - "Ġincred": 9653, - "Ġincredible": 15050, - "Ġincredibly": 16815, - "Ġincrement": 16252, - "Ġincremental": 52299, - "Ġincremented": 87819, - "Ġincrements": 61600, - "Ġincub": 48627, - "Ġincumb": 42750, - "Ġincumbent": 50282, - "Ġincur": 61522, - "Ġincurred": 51772, - "Ġind": 1257, - "Ġinde": 5167, - "Ġindeb": 89797, - "Ġindebted": 92898, - "Ġindeed": 12824, - "Ġindef": 36427, - "Ġindefinite": 80856, - "Ġindefinitely": 55234, - "Ġindem": 64289, - "Ġindemn": 89008, - "Ġindent": 17504, - "Ġindentation": 69592, - "Ġindepend": 7011, - "Ġindependence": 23665, - "Ġindependent": 9489, - "Ġindependently": 28135, - "Ġindependents": 95922, - "Ġindex": 1922, - "ĠindexOf": 60623, - "ĠindexPath": 18109, - "Ġindexed": 30581, - "Ġindexer": 87216, - "Ġindexes": 24953, - "Ġindexing": 51980, - "Ġindia": 27711, - "Ġindian": 42225, - "Ġindic": 4447, - "Ġindica": 74680, - "Ġindicate": 13216, - "Ġindicated": 16317, - "Ġindicates": 14807, - "Ġindicating": 18860, - "Ġindication": 27039, - "Ġindications": 55090, - "Ġindicative": 62905, - "Ġindicator": 20438, - "Ġindicators": 33724, - "Ġindice": 56082, - "Ġindices": 14937, - "Ġindict": 37767, - "Ġindicted": 67234, - "Ġindictment": 46860, - "Ġindie": 43478, - "Ġindifference": 84173, - "Ġindifferent": 78908, - "Ġindigenous": 38578, - "Ġindign": 81901, - "Ġindirect": 24614, - "Ġindirectly": 45245, - "Ġindis": 82875, - "Ġindiscrim": 93446, - "Ġindispens": 56460, - "Ġindispensable": 63184, - "Ġindiv": 3603, - "Ġindivid": 22665, - "Ġindividual": 3842, - "Ġindividually": 31299, - "Ġindividuals": 7775, - "Ġindo": 41000, - "Ġindonesia": 84378, - "Ġindoor": 29519, - "Ġindoors": 54054, - "Ġinds": 98513, - "Ġindu": 4408, - "Ġinduce": 48753, - "Ġinduced": 35472, - "Ġinduces": 89874, - "Ġinducing": 95711, - "Ġinduction": 37056, - "Ġindul": 36860, - "Ġindulge": 67090, - "Ġindust": 8871, - "Ġindustri": 66865, - "Ġindustrial": 12785, - "Ġindustries": 19102, - "Ġindustry": 4958, - "Ġindx": 71095, - "Ġine": 19116, - "Ġineff": 89225, - "Ġineffective": 54188, - "Ġinefficient": 63381, - "Ġineligible": 95816, - "Ġinequalities": 92234, - "Ġinequality": 31205, - "Ġinert": 79973, - "Ġinertia": 77452, - "Ġinet": 49476, - "Ġinev": 20659, - "Ġinevitable": 30252, - "Ġinevitably": 39505, - "Ġinex": 54881, - "Ġinexp": 33578, - "Ġinexpensive": 43152, - "Ġinexperienced": 78866, - "Ġinf": 4132, - "Ġinfamous": 38533, - "Ġinfancy": 85517, - "Ġinfant": 30283, - "Ġinfantry": 54427, - "Ġinfants": 41434, - "Ġinfect": 33427, - "Ġinfected": 28274, - "Ġinfection": 18873, - "Ġinfections": 28920, - "Ġinfectious": 49500, - "Ġinfer": 23583, - "Ġinference": 44378, - "Ġinferior": 37179, - "Ġinferred": 67595, - "Ġinfertility": 94543, - "Ġinfield": 99006, - "Ġinfile": 48989, - "Ġinfiltr": 42264, - "Ġinfiltration": 97735, - "Ġinfinit": 81126, - "Ġinfinite": 23809, - "Ġinfinitely": 71500, - "Ġinfinity": 54910, - "Ġinfix": 88157, - "Ġinfl": 4601, - "Ġinflamm": 25222, - "Ġinflammation": 36040, - "Ġinflammatory": 46188, - "Ġinflatable": 96207, - "Ġinflate": 70698, - "Ġinflated": 69854, - "Ġinflater": 21993, - "Ġinflation": 24527, - "Ġinflict": 67468, - "Ġinflicted": 68077, - "Ġinflu": 6653, - "Ġinfluence": 10173, - "Ġinfluenced": 27061, - "Ġinfluencers": 86233, - "Ġinfluences": 33353, - "Ġinfluencing": 65600, - "Ġinfluential": 31449, - "Ġinfluenza": 61837, - "Ġinflux": 52852, - "Ġinfo": 3546, - "Ġinfographic": 97382, - "Ġinform": 6051, - "Ġinformación": 34515, - "Ġinformal": 41787, - "Ġinformant": 92021, - "Ġinformat": 50207, - "Ġinformatie": 97255, - "Ġinformation": 1995, - "Ġinformational": 46635, - "Ġinformations": 43727, - "Ġinformative": 38219, - "Ġinformação": 138188, - "Ġinformações": 64066, - "Ġinformed": 15987, - "Ġinforming": 61925, - "Ġinforms": 63152, - "Ġinfos": 44144, - "Ġinfr": 24631, - "Ġinfra": 48176, - "Ġinfrared": 58041, - "Ġinfrastructure": 13737, - "Ġinfring": 44019, - "Ġinfringement": 53343, - "Ġinfuri": 84125, - "Ġinfused": 71803, - "Ġinfusion": 70208, - "Ġing": 6749, - "Ġingen": 45392, - "Ġingenious": 96699, - "Ġingest": 88272, - "Ġingestion": 87347, - "Ġingin": 87911, - "Ġingl": 97825, - "Ġinglés": 143184, - "Ġingr": 80236, - "Ġingredient": 24763, - "Ġingredients": 13966, - "Ġingres": 42664, - "Ġingresar": 89953, - "Ġingress": 78559, - "Ġinh": 59437, - "Ġinhab": 25252, - "Ġinhabit": 32327, - "Ġinhabitants": 39671, - "Ġinhabited": 69498, - "Ġinhal": 76673, - "Ġinher": 15164, - "Ġinherent": 36988, - "Ġinherently": 48088, - "Ġinherit": 23749, - "Ġinheritance": 41822, - "Ġinherited": 26990, - "Ġinherits": 75482, - "Ġinhib": 20142, - "Ġinhibit": 67933, - "Ġinhibited": 98569, - "Ġinhibition": 60378, - "Ġinhibitor": 69685, - "Ġinhibitors": 67542, - "Ġini": 16806, - "Ġinici": 44023, - "Ġinicial": 48556, - "Ġiniciar": 86027, - "Ġinicio": 50334, - "Ġinit": 2930, - "ĠinitComponents": 52056, - "ĠinitData": 68733, - "ĠinitState": 51138, - "ĠinitView": 59451, - "ĠinitWith": 13864, - "ĠinitWithFrame": 30067, - "ĠinitWithNibName": 96708, - "ĠinitWithStyle": 90188, - "ĠinitWithTitle": 72730, - "Ġiniti": 12672, - "Ġinitial": 2856, - "ĠinitialState": 29427, - "ĠinitialValue": 60062, - "ĠinitialValues": 93483, - "Ġinitialise": 66166, - "Ġinitialised": 87667, - "Ġinitialization": 17465, - "Ġinitialize": 9468, - "Ġinitialized": 17271, - "Ġinitializer": 42312, - "Ġinitializes": 57857, - "Ġinitializing": 57060, - "Ġinitially": 15102, - "Ġinitials": 78437, - "Ġinitiate": 38101, - "Ġinitiated": 32130, - "Ġinitiating": 78416, - "Ġinitiation": 60468, - "Ġinitiative": 20162, - "Ġinitiatives": 27172, - "Ġinitiator": 98040, - "Ġinj": 5811, - "Ġinject": 15551, - "Ġinjected": 40672, - "Ġinjecting": 87285, - "Ġinjection": 25071, - "Ġinjections": 64146, - "Ġinjector": 62643, - "Ġinjunction": 60429, - "Ġinjured": 15532, - "Ġinjuries": 14970, - "Ġinjuring": 85585, - "Ġinjury": 10895, - "Ġinjust": 97653, - "Ġinjustice": 50115, - "Ġink": 26415, - "Ġinkl": 81625, - "Ġinland": 76189, - "Ġinlet": 79107, - "Ġinline": 7381, - "Ġinmate": 66435, - "Ġinmates": 41612, - "Ġinn": 6170, - "Ġinnate": 63970, - "Ġinne": 77225, - "Ġinner": 9179, - "Ġinning": 45286, - "Ġinnings": 35000, - "Ġinnoc": 18619, - "Ġinnocence": 56211, - "Ġinnocent": 24243, - "Ġinnov": 9529, - "Ġinnovate": 90964, - "Ġinnovation": 18770, - "Ġinnovations": 44945, - "Ġinnovative": 18199, - "Ġinoc": 85918, - "Ġinode": 34803, - "Ġinorder": 66041, - "Ġinout": 96277, - "Ġinp": 32344, - "Ġinplace": 41894, - "Ġinput": 1946, - "ĠinputData": 90162, - "ĠinputFile": 76208, - "ĠinputStream": 46456, - "ĠinputValue": 79908, - "Ġinputs": 11127, - "Ġinquire": 67170, - "Ġinquiries": 43883, - "Ġinquiry": 25893, - "Ġins": 1640, - "Ġinsan": 61538, - "Ġinsane": 34018, - "Ġinsanely": 89366, - "Ġinsanity": 72053, - "Ġinsanların": 138680, - "Ġinscription": 50570, - "Ġinse": 53582, - "Ġinsect": 25989, - "Ġinsects": 40811, - "Ġinsecure": 61845, - "Ġinsecurity": 73835, - "Ġinsensitive": 70480, - "Ġinser": 47325, - "Ġinsert": 5656, - "Ġinserted": 21578, - "Ġinserting": 38298, - "Ġinsertion": 35927, - "Ġinserts": 49298, - "Ġinset": 54859, - "Ġinsets": 98069, - "Ġinside": 4766, - "Ġinsider": 54365, - "Ġinsiders": 76714, - "Ġinsight": 20017, - "Ġinsightful": 69062, - "Ġinsights": 25709, - "Ġinsign": 53027, - "Ġinsignificant": 72421, - "Ġinsist": 31162, - "Ġinsisted": 28576, - "Ġinsistence": 78297, - "Ġinsisting": 59627, - "Ġinsists": 42346, - "Ġinsn": 76102, - "Ġinsol": 84843, - "Ġinsomnia": 82411, - "Ġinspect": 24085, - "Ġinspected": 61784, - "Ġinspection": 25683, - "Ġinspections": 56974, - "Ġinspector": 44725, - "Ġinspectors": 68830, - "Ġinspir": 12690, - "Ġinspiration": 19760, - "Ġinspirational": 56214, - "Ġinspire": 30640, - "Ġinspired": 14606, - "Ġinspires": 69290, - "Ġinspiring": 33047, - "Ġinst": 1761, - "Ġinstability": 55299, - "Ġinstagram": 51004, - "Ġinstal": 45598, - "Ġinstall": 4582, - "Ġinstallation": 13713, - "Ġinstallations": 44118, - "Ġinstalled": 10275, - "Ġinstaller": 43052, - "Ġinstalling": 26632, - "Ġinstallment": 46544, - "Ġinstalls": 70320, - "Ġinstance": 2867, - "Ġinstanceof": 8083, - "Ġinstances": 13121, - "Ġinstancia": 97979, - "Ġinstant": 9690, - "Ġinstantaneous": 95119, - "Ġinstantiate": 40902, - "Ġinstantiated": 54586, - "Ġinstantiation": 81128, - "Ġinstantly": 21818, - "Ġinstead": 4518, - "Ġinstinct": 30555, - "Ġinstincts": 61821, - "Ġinstit": 7759, - "Ġinstitute": 43698, - "Ġinstituted": 79999, - "Ġinstitutes": 93712, - "Ġinstitution": 14898, - "Ġinstitutional": 32132, - "Ġinstitutions": 14336, - "Ġinstr": 9491, - "Ġinstruct": 21066, - "Ġinstructed": 40975, - "Ġinstruction": 7600, - "Ġinstructional": 71245, - "Ġinstructions": 11221, - "Ġinstructor": 32215, - "Ġinstructors": 53818, - "Ġinstrument": 14141, - "Ġinstrumental": 40945, - "Ġinstrumentation": 77033, - "Ġinstruments": 23316, - "Ġinsufficient": 38313, - "Ġinsulated": 78279, - "Ġinsulation": 48017, - "Ġinsulin": 31052, - "Ġinsult": 26132, - "Ġinsulting": 67092, - "Ġinsults": 67889, - "Ġinsurance": 8113, - "Ġinsure": 69532, - "Ġinsured": 52042, - "Ġinsurer": 72531, - "Ġinsurers": 55274, - "Ġinsurg": 48114, - "Ġinsurgency": 96508, - "Ġinsurgents": 87338, - "Ġint": 526, - "ĠintValue": 53077, - "Ġintact": 34439, - "Ġintake": 22881, - "Ġinte": 28287, - "Ġinteg": 5388, - "Ġinteger": 7546, - "ĠintegerValue": 70613, - "Ġintegers": 25780, - "Ġintegr": 8761, - "Ġintegral": 25098, - "Ġintegrate": 31072, - "Ġintegrated": 18250, - "Ġintegrates": 74662, - "Ġintegrating": 53852, - "Ġintegration": 17590, - "Ġintegrity": 16614, - "Ġintel": 14157, - "Ġintelig": 89645, - "Ġintellect": 16694, - "Ġintellectual": 19634, - "Ġintellectually": 93291, - "Ġintellectuals": 82836, - "Ġintellig": 59438, - "Ġintelligence": 11229, - "Ġintelligent": 24514, - "Ġintend": 29630, - "Ġintended": 10602, - "Ġintending": 84339, - "Ġintends": 43230, - "Ġintens": 24245, - "Ġintense": 18894, - "Ġintensely": 69633, - "Ġintensified": 78749, - "Ġintensity": 20612, - "Ġintensive": 36195, - "Ġintent": 7385, - "Ġintention": 14602, - "Ġintentional": 46864, - "Ġintentionally": 36204, - "Ġintentions": 33234, - "Ġintents": 93515, - "Ġinter": 946, - "Ġinteract": 16282, - "Ġinteracting": 44730, - "Ġinteraction": 16230, - "Ġinteractions": 21880, - "Ġinteractive": 20753, - "Ġinteracts": 83161, - "Ġintercept": 28639, - "Ġintercepted": 69374, - "Ġinterception": 69468, - "Ġinterceptions": 72457, - "Ġinterceptor": 76945, - "Ġinterchange": 51263, - "Ġinterchangeable": 90129, - "Ġinterconnected": 82316, - "Ġintercourse": 49440, - "Ġinterdisciplinary": 87319, - "Ġinteres": 49416, - "Ġinteress": 39353, - "Ġinteresse": 95421, - "Ġinterest": 2734, - "Ġinterested": 8014, - "Ġinteresting": 7040, - "Ġinterests": 11772, - "Ġinterf": 33184, - "Ġinterface": 3749, - "Ġinterfaces": 24099, - "Ġinterfer": 40205, - "Ġinterfere": 39878, - "Ġinterference": 31217, - "Ġinterfering": 74287, - "Ġinterim": 40553, - "Ġinterior": 14791, - "Ġinteriors": 73464, - "Ġinterle": 94968, - "Ġintermedi": 54175, - "Ġintermediary": 94070, - "Ġintermediate": 28439, - "Ġintermitt": 59669, - "Ġintermittent": 74468, - "Ġintern": 2590, - "Ġinternacional": 85159, - "Ġinternal": 5306, - "Ġinternally": 33067, - "Ġinternals": 91025, - "Ġinternational": 6489, - "Ġinternationally": 36445, - "Ġinternet": 7602, - "Ġinterns": 98834, - "Ġinternship": 59759, - "Ġinteroper": 94130, - "Ġinterp": 47271, - "Ġinterpersonal": 73858, - "Ġinterpol": 22876, - "Ġinterpolate": 59457, - "Ġinterpolated": 85664, - "Ġinterpolation": 36487, - "Ġinterpre": 17929, - "Ġinterpret": 14198, - "Ġinterpretation": 22845, - "Ġinterpretations": 57589, - "Ġinterpreted": 32298, - "Ġinterpreter": 39299, - "Ġinterpreting": 65644, - "Ġinterracial": 52461, - "Ġinterrog": 36439, - "Ġinterrogation": 65265, - "Ġinterrupt": 12667, - "Ġinterrupted": 36783, - "Ġinterruption": 74003, - "Ġinterruptions": 88408, - "Ġinterrupts": 43437, - "Ġinters": 80919, - "Ġintersect": 31796, - "Ġintersection": 19246, - "Ġintersections": 64257, - "Ġintersects": 88184, - "Ġinterstate": 73083, - "Ġintertw": 79950, - "Ġintertwined": 98792, - "Ġinterv": 85853, - "Ġinterval": 9873, - "Ġintervals": 26992, - "Ġinterven": 30857, - "Ġintervene": 54479, - "Ġintervened": 89448, - "Ġintervening": 88401, - "Ġintervention": 20949, - "Ġinterventions": 38355, - "Ġinterview": 7128, - "Ġinterviewed": 29047, - "Ġinterviewer": 86835, - "Ġinterviewing": 64716, - "Ġinterviews": 19344, - "Ġinterés": 138048, - "Ġintest": 38308, - "Ġintestinal": 62800, - "Ġintestine": 91134, - "Ġintf": 93706, - "Ġintim": 21947, - "Ġintimacy": 65164, - "Ġintimate": 31387, - "Ġintimately": 95652, - "Ġintimid": 29834, - "Ġintimidate": 89688, - "Ġintimidated": 84061, - "Ġintimidating": 63030, - "Ġintimidation": 69059, - "Ġintl": 95015, - "Ġinto": 1119, - "Ġintoler": 71629, - "Ġintolerance": 74331, - "Ġintox": 84017, - "Ġintoxic": 71715, - "Ġintoxicated": 86423, - "Ġintptr": 43966, - "Ġintr": 10582, - "Ġintra": 49838, - "Ġintric": 93503, - "Ġintricate": 56116, - "Ġintrig": 30396, - "Ġintrigue": 80513, - "Ġintrigued": 68018, - "Ġintriguing": 40665, - "Ġintrinsic": 46601, - "Ġintro": 19706, - "Ġintrodu": 5983, - "Ġintroduce": 19131, - "Ġintroduced": 11523, - "Ġintroduces": 38919, - "Ġintroducing": 31918, - "Ġintroduction": 16800, - "Ġintroductory": 61369, - "Ġintros": 25528, - "Ġintrusion": 81046, - "Ġintrusive": 84910, - "Ġints": 54724, - "Ġintuit": 96201, - "Ġintuition": 56251, - "Ġintuitive": 41679, - "Ġintval": 26217, - "Ġinté": 56010, - "Ġintéress": 91659, - "Ġintéressant": 141164, - "Ġinund": 91529, - "Ġinv": 1529, - "Ġinvade": 74172, - "Ġinvaded": 63665, - "Ġinvaders": 90221, - "Ġinvading": 82531, - "Ġinval": 48044, - "Ġinvalid": 8318, - "Ġinvalidate": 39943, - "Ġinvalidated": 98306, - "Ġinvaluable": 55093, - "Ġinvariably": 73514, - "Ġinvariant": 57620, - "Ġinvasion": 29115, - "Ġinvasive": 52254, - "Ġinve": 92184, - "Ġinvent": 17023, - "Ġinvented": 35492, - "Ġinvention": 27130, - "Ġinventions": 84049, - "Ġinventive": 90932, - "Ġinventor": 70901, - "Ġinventory": 15444, - "Ġinvers": 64583, - "Ġinverse": 27949, - "Ġinversion": 46488, - "Ġinversión": 143142, - "Ġinvert": 42199, - "Ġinverted": 46701, - "Ġinvest": 2725, - "Ġinvested": 27991, - "Ġinvestig": 4665, - "Ġinvestigación": 97524, - "Ġinvestigate": 19314, - "Ġinvestigated": 26219, - "Ġinvestigates": 83263, - "Ġinvestigating": 23890, - "Ġinvestigation": 8814, - "Ġinvestigations": 25883, - "Ġinvestigative": 46636, - "Ġinvestigator": 48481, - "Ġinvestigators": 25381, - "Ġinvesting": 24965, - "Ġinvestment": 9162, - "Ġinvestments": 21786, - "Ġinvestor": 29593, - "Ġinvestors": 14823, - "Ġinvis": 99037, - "Ġinvisible": 29447, - "Ġinvit": 82067, - "Ġinvitation": 28688, - "Ġinvitations": 58669, - "Ġinvite": 21399, - "Ġinvited": 18218, - "Ġinvites": 44410, - "Ġinviting": 41192, - "Ġinvo": 50644, - "Ġinvocation": 28696, - "Ġinvoice": 24615, - "Ġinvoices": 64052, - "Ġinvoke": 19873, - "Ġinvoked": 26881, - "Ġinvokes": 66051, - "Ġinvokevirtual": 69825, - "Ġinvoking": 46028, - "ĠinvokingState": 87841, - "Ġinvol": 4359, - "Ġinvoluntary": 90505, - "Ġinvolve": 21058, - "Ġinvolved": 6398, - "Ġinvolvement": 21587, - "Ġinvolves": 17601, - "Ġinvolving": 15860, - "Ġinward": 61918, - "ĠinÃŃcio": 135567, - "Ġio": 6399, - "Ġioctl": 64460, - "Ġiod": 78987, - "Ġion": 27672, - "Ġions": 64025, - "Ġios": 27531, - "Ġiota": 81910, - "Ġioutil": 43144, - "Ġiov": 98962, - "Ġip": 5997, - "ĠipAddress": 91715, - "Ġipad": 80713, - "Ġipairs": 56244, - "Ġipc": 60104, - "Ġiphone": 42448, - "Ġips": 59022, - "Ġipsum": 26342, - "Ġipt": 66068, - "Ġipv": 45475, - "Ġiq": 91459, - "Ġir": 6216, - "Ġirc": 79923, - "Ġire": 43750, - "Ġirgend": 87262, - "Ġiris": 63942, - "Ġirm": 97282, - "Ġiron": 11001, - "Ġironic": 58460, - "Ġironically": 79765, - "Ġirony": 50605, - "Ġirq": 38269, - "Ġirr": 36719, - "Ġirradi": 75227, - "Ġirrational": 60654, - "Ġirre": 24870, - "Ġirregular": 41308, - "Ġirrelevant": 39715, - "Ġirres": 33948, - "Ġirresist": 76197, - "Ġirresistible": 85829, - "Ġirrespective": 75553, - "Ġirresponsible": 70279, - "Ġirreversible": 92194, - "Ġirrig": 52005, - "Ġirrigation": 62466, - "Ġirrit": 29018, - "Ġirritated": 83871, - "Ġirritating": 83977, - "Ġirritation": 65410, - "Ġis": 374, - "ĠisActive": 43247, - "ĠisAdmin": 70600, - "ĠisArray": 76969, - "ĠisAuthenticated": 70926, - "ĠisChecked": 69960, - "ĠisConnected": 98796, - "ĠisEmpty": 38948, - "ĠisEnabled": 61302, - "ĠisEqual": 21337, - "ĠisEqualToString": 25522, - "ĠisError": 87612, - "ĠisFirst": 88521, - "ĠisIn": 81247, - "ĠisKindOfClass": 48511, - "ĠisLoading": 33662, - "ĠisLoggedIn": 72018, - "ĠisNaN": 77867, - "ĠisNew": 87478, - "ĠisOpen": 44681, - "ĠisSelected": 61441, - "ĠisSuccess": 76688, - "ĠisValid": 26171, - "ĠisVisible": 71744, - "Ġisa": 51335, - "Ġisbn": 69469, - "Ġisc": 95172, - "Ġischem": 97008, - "Ġise": 76093, - "Ġisempty": 50309, - "Ġisi": 95395, - "Ġisinstance": 11402, - "Ġisize": 91373, - "Ġisl": 81931, - "Ġisland": 12922, - "Ġislands": 29000, - "Ġisn": 4436, - "Ġisnt": 68958, - "Ġiso": 33456, - "Ġisol": 13098, - "Ġisolate": 42123, - "Ġisolated": 24203, - "Ġisolation": 30298, - "Ġisot": 68451, - "Ġisp": 95297, - "Ġisr": 93562, - "Ġiss": 2369, - "Ġisset": 10248, - "Ġisso": 40805, - "Ġissu": 51966, - "Ġissuance": 66499, - "Ġissue": 4265, - "Ġissued": 10897, - "Ġissuer": 54835, - "Ġissues": 4714, - "Ġissuing": 42121, - "Ġist": 5999, - "Ġistedi": 127979, - "ĠistediÄŁ": 143322, - "ĠistediÄŁi": 138396, - "ĠistediÄŁiniz": 143323, - "Ġit": 432, - "Ġitalia": 85776, - "Ġitalian": 27948, - "Ġitaliana": 88359, - "Ġitaliane": 98943, - "Ġitaliani": 79449, - "Ġitaliano": 59804, - "Ġitalic": 60763, - "Ġitch": 94756, - "Ġitching": 84975, - "Ġitem": 1509, - "ĠitemBuilder": 75835, - "ĠitemCount": 55893, - "ĠitemId": 46371, - "ĠitemList": 72274, - "ĠitemName": 66009, - "ĠitemType": 88791, - "ĠitemView": 27888, - "Ġitemprop": 69173, - "Ġitems": 3589, - "Ġitens": 94935, - "Ġiter": 5367, - "Ġiterable": 50834, - "Ġiterate": 29629, - "Ġiterating": 87235, - "Ġiteration": 19569, - "Ġiterations": 25687, - "Ġiterative": 86875, - "Ġiterator": 15091, - "Ġiterators": 90865, - "Ġitertools": 41331, - "Ġith": 77842, - "Ġitinerary": 72904, - "Ġitk": 78635, - "Ġitm": 84237, - "Ġitr": 32833, - "Ġits": 1181, - "Ġitself": 5086, - "Ġitu": 35691, - "Ġiv": 17509, - "Ġive": 98577, - "Ġivory": 69816, - "Ġiw": 72268, - "Ġix": 26864, - "Ġiy": 50414, - "Ġiz": 22137, - "Ġiç": 26517, - "Ġiçer": 127051, - "Ġiçerik": 142240, - "Ġiçeris": 131116, - "Ġiçerisinde": 131117, - "Ġiçin": 33171, - "Ġiçinde": 128972, - "ĠiÅŁ": 54709, - "ĠiÅŁaret": 138296, - "ĠiÅŁle": 140170, - "ĠiÅŁlem": 129850, - "ĠiÅŁleml": 140171, - "ĠiÅŁlemleri": 140172, - "ĠiÅŁlet": 139976, - "ĠiÅŁletme": 139977, - "ĠiÅŁÃ§i": 137660, - "Ġj": 502, - "ĠjButton": 24639, - "ĠjLabel": 13858, - "ĠjMenuItem": 87168, - "ĠjPanel": 19068, - "ĠjQuery": 13215, - "ĠjScrollPane": 55365, - "ĠjTable": 92549, - "ĠjTextField": 51340, - "Ġja": 11937, - "Ġjaar": 50343, - "Ġjab": 60064, - "Ġjac": 59843, - "Ġjack": 25072, - "Ġjacket": 26208, - "Ġjackets": 60142, - "Ġjackpot": 68328, - "Ġjade": 85015, - "Ġjadx": 57543, - "Ġjag": 26742, - "Ġjail": 17540, - "Ġjailed": 54506, - "Ġjails": 98565, - "Ġjak": 19394, - "Ġjaki": 139537, - "Ġjakie": 141227, - "ĠjakieÅĽ": 141228, - "ĠjakiÅĽ": 139538, - "Ġjako": 49726, - "ĠjakoÅĽci": 134241, - "Ġjal": 75974, - "Ġjam": 20072, - "Ġjamais": 55216, - "Ġjames": 84946, - "Ġjams": 89298, - "Ġjan": 32862, - "Ġjane": 98606, - "Ġjanvier": 93711, - "Ġjap": 85185, - "Ġjapan": 54129, - "Ġjapanese": 52948, - "Ġjapon": 79397, - "Ġjar": 29595, - "Ġjardin": 90299, - "Ġjars": 60011, - "Ġjasmine": 65809, - "Ġjav": 1258, - "Ġjava": 1642, - "Ġjavafx": 16718, - "Ġjavascript": 35710, - "Ġjavax": 2871, - "Ġjaw": 16535, - "Ġjaws": 81256, - "Ġjazz": 33897, - "Ġjb": 87118, - "Ġjc": 72818, - "Ġjclass": 76296, - "Ġjd": 73376, - "Ġjdbc": 85902, - "ĠjdbcTemplate": 87317, - "Ġje": 4759, - "Ġjealous": 40590, - "Ġjealousy": 79722, - "Ġjean": 96621, - "Ġjeans": 33289, - "Ġjed": 18302, - "Ġjede": 94572, - "Ġjedem": 94885, - "Ġjeden": 53165, - "Ġjeder": 55928, - "Ġjedis": 70427, - "Ġjednak": 75225, - "Ġjednoc": 140872, - "Ġjednocze": 140873, - "ĠjednoczeÅĽnie": 140874, - "ĠjednÄħ": 140263, - "Ġjedoch": 60637, - "Ġjeep": 85176, - "Ġjeg": 23991, - "Ġjego": 70929, - "Ġjej": 62964, - "Ġjel": 84988, - "Ġjelly": 51341, - "Ġjemand": 77016, - "Ġjenis": 93251, - "Ġjente": 72404, - "Ġjenter": 37159, - "Ġjeopard": 52032, - "Ġjeopardy": 89604, - "Ġjer": 21030, - "Ġjerk": 53424, - "Ġjersey": 36112, - "Ġjerseys": 53051, - "Ġjes": 64746, - "Ġjest": 13296, - "Ġjeste": 128155, - "ĠjesteÅĽ": 141246, - "ĠjesteÅĽmy": 141546, - "Ġjeszcze": 80253, - "Ġjet": 16594, - "Ġjets": 43205, - "Ġjetzt": 37699, - "Ġjeu": 50555, - "Ġjeune": 35863, - "Ġjeunes": 59020, - "Ġjeux": 69075, - "Ġjew": 16868, - "Ġjewel": 65841, - "Ġjewellery": 62391, - "Ġjewelry": 30717, - "Ġjewels": 85031, - "Ġjewish": 88138, - "Ġjeżeli": 138441, - "ĠjeÅĽli": 130541, - "Ġji": 73885, - "Ġjig": 94064, - "Ġjihad": 41834, - "Ġjihadist": 96044, - "Ġjihadists": 93280, - "Ġjika": 70879, - "Ġjim": 95444, - "Ġjint": 52467, - "Ġjit": 84573, - "Ġjitter": 84392, - "Ġjj": 36729, - "Ġjl": 84710, - "Ġjlong": 74254, - "Ġjm": 95667, - "Ġjmp": 90369, - "Ġjo": 7647, - "Ġjob": 2618, - "ĠjobId": 89703, - "Ġjobject": 49045, - "Ġjobs": 6887, - "Ġjoe": 93341, - "Ġjog": 30125, - "Ġjogador": 95458, - "Ġjogging": 98638, - "Ġjogo": 66134, - "Ġjohn": 39642, - "Ġjoin": 5138, - "Ġjoined": 10859, - "Ġjoining": 18169, - "Ġjoins": 28682, - "Ġjoint": 10284, - "Ġjointly": 52158, - "Ġjoints": 34258, - "Ġjoke": 21646, - "Ġjoked": 67229, - "Ġjokes": 31420, - "Ġjoking": 57034, - "Ġjon": 88504, - "Ġjong": 63413, - "Ġjorn": 71349, - "Ġjos": 87886, - "Ġjose": 89644, - "Ġjot": 92380, - "Ġjou": 26970, - "Ġjouer": 99096, - "Ġjoueur": 75949, - "Ġjour": 9682, - "Ġjournal": 8322, - "Ġjournalism": 29004, - "Ġjournalist": 22825, - "Ġjournalistic": 93700, - "Ġjournalists": 22532, - "Ġjournals": 41680, - "Ġjourney": 11618, - "Ġjourneys": 63776, - "Ġjournée": 85223, - "Ġjours": 48201, - "Ġjov": 67261, - "Ġjoven": 76583, - "Ġjoy": 15888, - "Ġjoyful": 82112, - "Ġjoys": 93798, - "Ġjoystick": 61589, - "Ġjp": 43571, - "Ġjpeg": 54566, - "Ġjpg": 71185, - "Ġjq": 44648, - "Ġjquery": 61701, - "Ġjr": 79598, - "Ġjs": 6994, - "Ġjson": 2951, - "ĠjsonArray": 66273, - "ĠjsonData": 53875, - "ĠjsonObj": 79175, - "ĠjsonObject": 30227, - "ĠjsonResponse": 90465, - "ĠjsonString": 79689, - "Ġjsonify": 32058, - "Ġjspb": 63770, - "Ġjsx": 80095, - "Ġjt": 91076, - "Ġju": 10267, - "Ġjub": 96343, - "Ġjud": 5741, - "Ġjudge": 11651, - "Ġjudged": 44387, - "Ġjudgement": 47819, - "Ġjudges": 24001, - "Ġjudging": 49690, - "Ġjudgment": 19407, - "Ġjudgments": 58258, - "Ġjudicial": 30652, - "Ġjudiciary": 71875, - "Ġjue": 46950, - "Ġjuego": 51895, - "Ġjuegos": 66523, - "Ġjug": 22394, - "Ġjuga": 42369, - "Ġjugador": 71676, - "Ġjugar": 93260, - "Ġjugg": 89149, - "Ġjuice": 22815, - "Ġjuices": 64859, - "Ġjuicy": 55053, - "Ġjuin": 84759, - "Ġjul": 40538, - "Ġjumlah": 85140, - "Ġjump": 7784, - "Ġjumped": 26005, - "Ġjumper": 68984, - "Ġjumping": 29002, - "Ġjumps": 34208, - "Ġjun": 17699, - "Ġjunction": 48241, - "Ġjung": 68910, - "Ġjunge": 63657, - "Ġjungle": 44420, - "Ġjuni": 82744, - "Ġjunior": 26052, - "Ġjunit": 70727, - "Ġjunk": 29674, - "Ġjunto": 61988, - "Ġjur": 16037, - "Ġjuris": 45895, - "Ġjurisdiction": 28001, - "Ġjurisdictions": 54943, - "Ġjurors": 72039, - "Ġjury": 21234, - "Ġjus": 44807, - "Ġjusqu": 54298, - "Ġjust": 1101, - "Ġjuste": 69274, - "Ġjustice": 12161, - "Ġjustices": 70612, - "Ġjustification": 41435, - "Ġjustified": 34416, - "Ġjustify": 9357, - "ĠjustifyContent": 22039, - "Ġjusto": 81843, - "Ġjuven": 98445, - "Ġjuvenile": 47670, - "Ġjuxtap": 97853, - "Ġjuż": 53921, - "Ġjwt": 24589, - "Ġjylland": 90978, - "Ġjá": 32092, - "Ġjä": 87528, - "Ġjó": 71648, - "Ġjóvenes": 139011, - "ĠjÄĻ": 132936, - "ĠjÄĻzy": 132937, - "ĠjÄĻzyk": 132938, - "Ġk": 595, - "ĠkB": 84435, - "ĠkHz": 69626, - "ĠkInstruction": 92500, - "ĠkW": 77477, - "ĠkWh": 95887, - "Ġka": 16502, - "Ġkab": 73995, - "Ġkad": 68044, - "Ġkadar": 73909, - "Ġkadın": 129546, - "Ġkafka": 67852, - "Ġkak": 95401, - "Ġkako": 90517, - "Ġkal": 35354, - "Ġkald": 127900, - "Ġkaldı": 140199, - "Ġkaldır": 137071, - "Ġkale": 62477, - "Ġkali": 96368, - "Ġkam": 33661, - "Ġkami": 62669, - "Ġkamu": 85190, - "Ġkan": 13422, - "Ġkang": 98286, - "Ġkann": 15719, - "Ġkannst": 65836, - "Ġkans": 68285, - "Ġkao": 78381, - "Ġkap": 44849, - "Ġkappa": 83995, - "Ġkaps": 135699, - "Ġkapsam": 135700, - "Ġkapsamında": 135701, - "Ġkapı": 136110, - "Ġkar": 23425, - "Ġkarakter": 90755, - "Ġkararı": 137549, - "Ġkarde": 136159, - "ĠkardeÅŁ": 136160, - "Ġkarena": 59469, - "Ġkarma": 70442, - "Ġkart": 57302, - "ĠkarÄ±ÅŁ": 134913, - "ĠkarÅŁ": 141771, - "ĠkarÅŁÄ±": 126285, - "ĠkarÅŁÄ±laÅŁ": 136000, - "ĠkarÅŁÄ±s": 141772, - "ĠkarÅŁÄ±sında": 141773, - "Ġkas": 47656, - "Ġkat": 44256, - "Ġkata": 61688, - "Ġkatkı": 136932, - "Ġkatıl": 131475, - "Ġkatılı": 139787, - "Ġkatılım": 139788, - "Ġkaufen": 51134, - "Ġkaum": 99025, - "Ġkay": 36847, - "Ġkayak": 86978, - "Ġkayna": 143584, - "Ġkaynaģı": 143585, - "Ġkayıt": 136051, - "Ġkaz": 90725, - "Ġkaç": 130268, - "Ġkaż": 63293, - "Ġkażd": 136438, - "Ġkażde": 127792, - "Ġkażdego": 135785, - "Ġkażdej": 139638, - "Ġkażdy": 133246, - "Ġkażdym": 136439, - "Ġkb": 38653, - "Ġkc": 87518, - "Ġkcal": 95003, - "Ġkd": 68150, - "Ġke": 1962, - "Ġked": 79042, - "Ġkeen": 26891, - "Ġkeep": 2506, - "Ġkeeper": 53416, - "Ġkeeping": 10282, - "Ġkeeps": 13598, - "Ġkeer": 91924, - "Ġkein": 48803, - "Ġkeine": 31357, - "Ġkeinen": 79913, - "Ġkel": 48228, - "Ġkell": 78072, - "Ġkem": 67431, - "Ġken": 49232, - "Ġkend": 71748, - "Ġkenn": 74261, - "Ġkennen": 59570, - "Ġkennenlernen": 88862, - "Ġkep": 64184, - "Ġkepada": 76797, - "Ġkept": 8604, - "Ġker": 33701, - "Ġkeras": 25689, - "Ġkern": 82585, - "Ġkernel": 10001, - "Ġkernels": 63515, - "Ġkes": 50977, - "Ġket": 31281, - "Ġketo": 65534, - "Ġketogenic": 93750, - "Ġkettle": 72318, - "Ġkey": 1376, - "ĠkeyCode": 64432, - "ĠkeyPressed": 96104, - "ĠkeyValue": 63937, - "Ġkeyboard": 13625, - "ĠkeyboardType": 75099, - "Ġkeyboards": 70302, - "Ġkeycode": 86991, - "Ġkeyed": 90529, - "Ġkeynote": 70905, - "Ġkeyof": 79863, - "Ġkeypad": 60205, - "Ġkeypoints": 87892, - "Ġkeys": 6894, - "Ġkeyst": 99132, - "Ġkeyword": 16174, - "Ġkeywords": 20844, - "Ġkf": 85580, - "Ġkg": 20972, - "Ġkh": 23165, - "Ġkhi": 94994, - "Ġkhiến": 128893, - "Ġkhiá»ĥn": 139533, - "Ġkho": 72067, - "Ġkhoá": 131821, - "Ġkhoản": 130042, - "Ġkhoảng": 129168, - "Ġkhu": 127980, - "Ġkhuyên": 142076, - "Ġkhuyến": 135984, - "Ġkhuôn": 138411, - "Ġkhuẩn": 139901, - "Ġkhá": 128949, - "Ġkhác": 128354, - "Ġkhách": 128351, - "Ġkhám": 131797, - "Ġkháng": 138075, - "Ġkhó": 128639, - "Ġkhóa": 131774, - "Ġkhô": 132190, - "Ġkhông": 53037, - "Ġkhúc": 138228, - "ĠkhÃŃ": 129019, - "ĠkhÄĥn": 130909, - "Ġkhả": 129363, - "Ġkhảo": 132123, - "Ġkhấu": 143449, - "Ġkhẩu": 97610, - "Ġkhắc": 132611, - "Ġkhắp": 138028, - "Ġkhẳng": 136732, - "Ġkhá»§ng": 139235, - "Ġkhá»ı": 129699, - "Ġkhá»ıe": 129700, - "Ġkhá»ıi": 130553, - "Ġkhá»iji": 135836, - "Ġkhá»ķ": 133787, - "ĠkhỼ": 141709, - "ĠkhỼp": 141710, - "Ġkhợi": 132600, - "Ġki": 19953, - "Ġkick": 10323, - "Ġkicked": 27120, - "Ġkicker": 86176, - "Ġkicking": 39194, - "Ġkickoff": 82148, - "Ġkicks": 36250, - "Ġkid": 10369, - "Ġkidd": 91415, - "Ġkidding": 55725, - "Ġkidn": 32698, - "Ġkidnapped": 54845, - "Ġkidnapping": 61682, - "Ġkidney": 37942, - "Ġkidneys": 80860, - "Ġkids": 6837, - "Ġkijken": 77957, - "Ġkil": 15045, - "Ġkill": 5505, - "Ġkilled": 7425, - "Ġkiller": 24518, - "Ġkillers": 60035, - "Ġkilling": 13118, - "Ġkillings": 47033, - "Ġkills": 28810, - "Ġkilograms": 84302, - "Ġkilomet": 43887, - "Ġkilometers": 40568, - "Ġkilometres": 51857, - "Ġkim": 55784, - "Ġkin": 23938, - "Ġkinase": 81060, - "Ġkind": 3093, - "Ġkinda": 33390, - "Ġkindergarten": 67123, - "Ġkindly": 46526, - "Ġkindness": 44872, - "Ġkinds": 12829, - "Ġkinetic": 70323, - "Ġkinetics": 90368, - "Ġking": 11477, - "Ġkingdom": 25079, - "Ġkingdoms": 95406, - "Ġkings": 44519, - "Ġkinky": 66776, - "Ġkino": 89255, - "Ġkir": 72630, - "Ġkiss": 21057, - "Ġkissed": 58234, - "Ġkisses": 71991, - "Ġkissing": 51046, - "Ġkit": 16138, - "Ġkita": 54211, - "Ġkitabı": 138893, - "Ġkitchen": 9780, - "Ġkitchens": 65338, - "Ġkite": 98119, - "Ġkits": 31496, - "Ġkitt": 66612, - "Ġkitten": 76657, - "Ġkittens": 82090, - "Ġkitty": 79821, - "Ġkiên": 139824, - "ĠkiÅŁ": 127464, - "ĠkiÅŁi": 129043, - "ĠkiÅŁiler": 133354, - "ĠkiÅŁinin": 137522, - "Ġkiếm": 130158, - "Ġkiến": 128935, - "Ġkiá»ĥm": 129522, - "Ġkiá»ĥu": 132310, - "Ġkiá»ĩm": 135159, - "Ġkiá»ĩn": 129065, - "Ġkj": 42041, - "Ġkk": 49865, - "Ġkl": 20226, - "Ġkla": 75886, - "Ġklar": 72734, - "Ġklass": 37955, - "Ġkle": 24285, - "Ġklein": 79409, - "Ġkleine": 53555, - "Ġkleinen": 80378, - "Ġklient": 90108, - "Ġklientów": 138341, - "Ġklik": 89909, - "Ġklub": 82690, - "Ġkm": 13136, - "Ġkms": 96677, - "Ġkn": 1148, - "Ġknack": 93250, - "Ġkne": 13853, - "Ġknee": 21381, - "Ġkneeling": 99015, - "Ġknees": 30524, - "Ġknew": 6876, - "Ġknex": 63355, - "Ġknife": 21430, - "Ġknight": 46609, - "Ġknights": 70530, - "Ġknit": 52103, - "Ġknitting": 71799, - "Ġknives": 48895, - "Ġknob": 58572, - "Ġknobs": 89085, - "Ġknock": 14127, - "Ġknocked": 31985, - "Ġknocking": 49144, - "Ġknockout": 76073, - "Ġknocks": 84669, - "Ġknot": 50800, - "Ġknots": 60217, - "Ġknow": 1414, - "Ġknowing": 14063, - "Ġknowingly": 67013, - "Ġknowledge": 6540, - "Ġknowledgeable": 40966, - "Ġknown": 3881, - "Ġknows": 8788, - "Ġknull": 85949, - "Ġko": 15236, - "Ġkob": 72251, - "Ġkod": 65532, - "Ġkode": 83477, - "Ġkoje": 96499, - "Ġkoji": 59371, - "Ġkok": 89537, - "Ġkol": 47119, - "Ġkole": 58019, - "Ġkolej": 82322, - "Ġkom": 10890, - "Ġkomb": 84464, - "Ġkomen": 81737, - "Ġkomm": 93688, - "Ġkommen": 58065, - "Ġkomment": 83034, - "Ġkommer": 47331, - "Ġkommt": 51528, - "Ġkommun": 87943, - "Ġkomple": 83769, - "Ġkomt": 72633, - "Ġkon": 16540, - "Ġkond": 79164, - "Ġkone": 81690, - "Ġkonk": 96815, - "Ġkonnte": 64015, - "Ġkont": 20153, - "Ġkontakt": 40746, - "Ġkontakte": 70312, - "Ġkontrol": 96034, - "ĠkonuÅŁ": 126065, - "ĠkonuÅŁma": 134180, - "ĠkonuÅŁtu": 134271, - "Ġkop": 81804, - "Ġkor": 31954, - "Ġkort": 66821, - "Ġkos": 40397, - "Ġkosher": 97640, - "Ġkost": 62411, - "Ġkosten": 18926, - "Ġkostenlos": 26073, - "Ġkostenlose": 48522, - "Ġkot": 74925, - "Ġkotlin": 21527, - "Ġkotlinx": 27452, - "ĠkoÅĦ": 127982, - "ĠkoÅĦca": 139368, - "ĠkoÅĦcu": 138434, - "ĠkoÅĽci": 137592, - "ĠkoÅŁ": 136969, - "Ġkp": 60319, - "Ġkr": 23103, - "Ġkra": 96411, - "Ġkrat": 91014, - "Ġkrb": 79132, - "Ġkre": 81070, - "Ġkrij": 69437, - "Ġkrist": 85848, - "Ġkron": 87932, - "Ġkró": 137234, - "Ġkról": 141796, - "Ġkrótk": 137235, - "Ġks": 41282, - "Ġksi": 87527, - "ĠksiÄħż": 127703, - "ĠksiÄħżki": 139679, - "ĠksiÄĻ": 143722, - "ĠksiÄĻg": 143723, - "Ġksz": 141368, - "ĠksztaÅĤ": 141369, - "ĠksztaÅĤt": 141370, - "Ġkt": 18541, - "Ġkter": 99128, - "Ġkto": 135727, - "ĠktoÅĽ": 135728, - "Ġktó": 21342, - "Ġktór": 135685, - "Ġktóra": 82121, - "Ġktóre": 42890, - "Ġktórego": 133031, - "Ġktórej": 131252, - "Ġktóry": 41842, - "Ġktórych": 129925, - "Ġktórym": 130235, - "Ġktórzy": 130404, - "ĠktórÄħ": 135686, - "Ġku": 36600, - "Ġkube": 80958, - "Ġkuk": 93277, - "Ġkul": 74416, - "Ġkull": 142134, - "Ġkullan": 57016, - "Ġkulland": 142135, - "Ġkullandı": 142136, - "Ġkullanıcı": 133558, - "Ġkullanıl": 130002, - "Ġkullanılan": 138287, - "Ġkullanım": 138876, - "Ġkullanımı": 140958, - "Ġkun": 23330, - "Ġkunne": 79190, - "Ġkunnen": 48436, - "Ġkunt": 61777, - "Ġkup": 80708, - "Ġkur": 27265, - "Ġkurs": 92579, - "Ġkurulu": 136634, - "ĠkuruluÅŁ": 136635, - "Ġkurz": 70984, - "Ġkut": 30599, - "Ġkutje": 88343, - "Ġkv": 16178, - "Ġkvin": 40061, - "Ġkvinde": 78492, - "Ġkvinder": 41425, - "Ġkvinn": 49973, - "Ġkvinna": 96331, - "Ġkvinne": 75503, - "Ġkvinner": 47084, - "Ġkvinnor": 66830, - "Ġkvm": 94748, - "Ġkvp": 85555, - "Ġkw": 29525, - "Ġkwargs": 16494, - "Ġky": 54953, - "Ġkz": 80955, - "Ġkä": 59095, - "ĠkÃ¥": 78724, - "Ġkè": 136943, - "Ġkèm": 136944, - "Ġké": 76438, - "Ġkém": 135153, - "Ġkéo": 131778, - "Ġkê": 127444, - "Ġkênh": 142770, - "Ġkì": 136542, - "Ġkö": 13040, - "Ġköln": 92571, - "Ġkön": 41762, - "Ġkönnen": 20048, - "Ġkönnt": 142580, - "Ġkönnte": 67594, - "Ġkötü": 134043, - "Ġköz": 67824, - "Ġkø": 34400, - "Ġkøbenhavn": 44080, - "Ġkü": 65948, - "Ġkültür": 134753, - "Ġküç": 132619, - "Ġküçük": 132620, - "Ġký": 129212, - "ĠkÃŃch": 130767, - "ĠkÃŃnh": 131921, - "Ġkı": 127100, - "Ġkısa": 131370, - "Ġkısm": 135942, - "Ġkısmı": 135943, - "Ġkısı": 139364, - "Ġkız": 130773, - "Ġkẻ": 134248, - "Ġkế": 128495, - "Ġkết": 128403, - "Ġkỳ": 128880, - "Ġká»·": 132551, - "Ġkỹ": 129531, - "Ġká»ĥ": 130291, - "Ġká»ĭ": 137287, - "Ġká»ĭch": 142665, - "Ġká»ĭp": 137288, - "Ġl": 326, - "ĠlParam": 51834, - "Ġla": 1187, - "Ġlaat": 72399, - "Ġlab": 10072, - "Ġlabel": 2383, - "ĠlabelText": 64710, - "Ġlabeled": 29829, - "Ġlabeling": 54302, - "Ġlabelled": 60236, - "Ġlabels": 9201, - "Ġlabor": 9327, - "Ġlaboratories": 69660, - "Ġlaboratory": 26594, - "Ġlabore": 72204, - "Ġlabour": 22939, - "Ġlabs": 49948, - "Ġlabyrinth": 98710, - "Ġlac": 43879, - "Ġlace": 45693, - "Ġlack": 6853, - "Ġlacked": 48001, - "Ġlacking": 31061, - "Ġlacks": 36756, - "Ġlact": 50544, - "Ġlad": 57625, - "Ġladder": 35765, - "Ġladen": 81687, - "Ġladies": 22786, - "Ġlado": 43424, - "Ġlady": 16820, - "Ġlag": 21454, - "Ġlagi": 73944, - "Ġlah": 89045, - "Ġlaid": 17113, - "Ġlain": 50376, - "Ġlaisse": 92469, - "Ġlak": 93686, - "Ġlake": 21800, - "Ġlakes": 43136, - "Ġlakh": 62173, - "Ġlam": 31603, - "Ġlamb": 38306, - "Ġlambda": 12459, - "Ġlame": 60883, - "Ġlament": 50372, - "Ġlamin": 78433, - "Ġlaminate": 84834, - "Ġlamp": 27962, - "Ġlamps": 49452, - "Ġlan": 30691, - "Ġlanc": 75285, - "Ġlance": 85245, - "Ġland": 4268, - "Ġlanded": 26120, - "Ġlandfill": 84534, - "Ġlanding": 20327, - "Ġlandlord": 40147, - "Ġlandlords": 63629, - "Ġlandmark": 37250, - "Ġlandmarks": 59924, - "Ġlands": 11835, - "Ġlandsc": 33515, - "Ġlandscape": 18414, - "Ġlandscapes": 54790, - "Ġlandscaping": 64018, - "Ġlandslide": 95702, - "Ġlane": 21272, - "Ġlanes": 33025, - "Ġlang": 8688, - "Ġlange": 52287, - "Ġlangs": 63952, - "Ġlangu": 82300, - "Ġlanguage": 4128, - "Ġlanguages": 15459, - "Ġlangue": 95182, - "Ġlantern": 73165, - "Ġlanz": 83146, - "Ġlanç": 95969, - "Ġlança": 132763, - "Ġlap": 23410, - "Ġlaps": 49955, - "Ġlapse": 89317, - "Ġlaptop": 20638, - "Ġlaptops": 47885, - "Ġlar": 44455, - "Ġlarg": 4053, - "Ġlarge": 3460, - "Ġlargely": 13771, - "Ġlarger": 8131, - "Ġlargest": 7772, - "Ġlargo": 63913, - "Ġlarvae": 82761, - "Ġlas": 5141, - "Ġlasc": 80880, - "Ġlaser": 20486, - "Ġlasers": 71375, - "Ġlash": 97281, - "Ġlashes": 86611, - "Ġlassen": 47008, - "Ġlast": 1537, - "ĠlastIndex": 86972, - "ĠlastName": 20460, - "Ġlasted": 35413, - "Ġlasting": 28769, - "Ġlastname": 45341, - "Ġlasts": 39658, - "Ġlat": 6844, - "Ġlatch": 56926, - "Ġlate": 3309, - "Ġlateinit": 26130, - "Ġlately": 30345, - "Ġlaten": 92532, - "Ġlatency": 39270, - "Ġlatent": 41667, - "Ġlater": 2937, - "Ġlateral": 44469, - "Ġlatest": 5535, - "Ġlatex": 44536, - "Ġlatin": 62919, - "Ġlatina": 57315, - "Ġlatino": 91882, - "Ġlatitude": 20849, - "Ġlatter": 15271, - "Ġlattice": 54272, - "Ġlaugh": 12550, - "Ġlaughed": 31527, - "Ġlaughing": 31581, - "Ġlaughs": 48236, - "Ġlaughter": 42114, - "Ġlaunch": 7050, - "Ġlaunched": 11626, - "Ġlauncher": 46449, - "Ġlaunches": 37075, - "Ġlaunching": 27718, - "Ġlaunder": 53038, - "Ġlaundering": 63302, - "Ġlaundry": 34089, - "Ġlaure": 66085, - "Ġlaut": 93539, - "Ġlav": 29483, - "Ġlava": 57568, - "Ġlavender": 80360, - "Ġlavish": 79134, - "Ġlavor": 45055, - "Ġlavoro": 65385, - "Ġlaw": 2329, - "Ġlawful": 51221, - "Ġlawmaker": 70376, - "Ġlawmakers": 25081, - "Ġlawn": 36025, - "Ġlaws": 6872, - "Ġlawsuit": 19275, - "Ġlawsuits": 42886, - "Ġlawy": 11010, - "Ġlawyer": 15417, - "Ġlawyers": 21177, - "Ġlax": 73730, - "Ġlay": 10962, - "Ġlayer": 6193, - "Ġlayered": 63141, - "Ġlayers": 13617, - "Ġlaying": 34644, - "Ġlayoffs": 98822, - "Ġlayout": 6789, - "ĠlayoutManager": 84637, - "ĠlayoutParams": 94644, - "Ġlayouts": 49054, - "Ġlays": 56522, - "Ġlayui": 67885, - "Ġlaz": 64436, - "Ġlazy": 15678, - "Ġlazım": 140507, - "Ġlb": 18866, - "Ġlbl": 16421, - "Ġlbs": 28060, - "Ġlc": 36213, - "Ġlcd": 38644, - "Ġlcm": 86079, - "Ġld": 26129, - "Ġlda": 68131, - "Ġldap": 67759, - "Ġldb": 97789, - "Ġldc": 32006, - "Ġle": 512, - "Ġlead": 2990, - "Ġleader": 7653, - "Ġleaderboard": 86453, - "Ġleaders": 6036, - "Ġleadership": 11438, - "Ġleading": 6388, - "Ġleads": 11508, - "Ġleaf": 15933, - "Ġleague": 10734, - "Ġleagues": 38359, - "Ġleak": 23352, - "Ġleakage": 80273, - "Ġleaked": 33847, - "Ġleaking": 51829, - "Ġleaks": 36696, - "Ġlean": 15651, - "Ġleaned": 54839, - "Ġleaning": 48348, - "Ġleans": 92836, - "Ġleap": 31471, - "Ġleaps": 83458, - "Ġlear": 34399, - "Ġlearn": 3960, - "Ġlearned": 9498, - "Ġlearner": 62960, - "Ġlearners": 52143, - "Ġlearning": 6832, - "Ġlearns": 46210, - "Ġlearnt": 49250, - "Ġlease": 25064, - "Ġleased": 81180, - "Ġleases": 72557, - "Ġleash": 78901, - "Ġleasing": 70319, - "Ġleast": 3245, - "Ġleather": 17553, - "Ġleave": 5274, - "Ġleaves": 10901, - "Ġleaving": 9380, - "Ġleben": 97872, - "Ġlebih": 49935, - "Ġlecken": 92561, - "Ġlect": 16513, - "Ġlecture": 30578, - "Ġlecturer": 71135, - "Ġlectures": 45132, - "Ġled": 6069, - "Ġledge": 85833, - "Ġledger": 46933, - "Ġleds": 90972, - "Ġlee": 81944, - "Ġleer": 53138, - "Ġleft": 2115, - "Ġleftist": 71127, - "Ġleftover": 64443, - "Ġleftovers": 92167, - "Ġleg": 2472, - "Ġlegacy": 19588, - "Ġlegal": 5777, - "Ġlegality": 88746, - "Ġlegalization": 56488, - "Ġlegalize": 87913, - "Ġlegalized": 76992, - "Ġlegally": 25202, - "Ġlegend": 13016, - "Ġlegendary": 27712, - "Ġlegends": 48328, - "Ġleggings": 90341, - "Ġlegion": 94168, - "Ġlegis": 8529, - "Ġlegisl": 14963, - "Ġlegislation": 13240, - "Ġlegislative": 26645, - "Ġlegislators": 47862, - "Ġlegislature": 38756, - "Ġlegit": 15563, - "Ġlegitim": 48197, - "Ġlegitimacy": 55908, - "Ġlegitimate": 22745, - "Ġlegitimately": 87251, - "Ġlegs": 14201, - "Ġlehet": 76132, - "Ġlei": 59962, - "Ġleicht": 71935, - "Ġleider": 88028, - "Ġleisure": 40208, - "Ġlekker": 76547, - "Ġlem": 83974, - "Ġlemma": 18810, - "Ġlemon": 29464, - "Ġlen": 2422, - "Ġlend": 38480, - "Ġlender": 47475, - "Ġlenders": 45015, - "Ġlending": 39551, - "Ġlends": 77918, - "Ġleng": 47794, - "Ġlenght": 83254, - "Ġlength": 3084, - "Ġlengths": 28316, - "Ġlengthy": 34206, - "Ġlens": 18342, - "Ġlenses": 34957, - "Ġlent": 47807, - "Ġleo": 88501, - "Ġleopard": 97993, - "Ġlept": 94440, - "Ġler": 75020, - "Ġles": 3541, - "Ġlesb": 22783, - "Ġlesbi": 81227, - "Ġlesbian": 24054, - "Ġlesbians": 58630, - "Ġlesbienne": 60519, - "Ġlesbische": 97854, - "Ġlesbisk": 91556, - "Ġlesen": 75182, - "Ġlesion": 92117, - "Ġlesions": 62224, - "Ġless": 2686, - "Ġlessen": 75870, - "Ġlesser": 31315, - "Ġlesson": 17755, - "Ġlessons": 18366, - "Ġlest": 63506, - "Ġlet": 1077, - "Ġleth": 97422, - "Ġlethal": 43989, - "Ġletra": 66417, - "Ġletras": 89358, - "Ġlets": 15354, - "Ġlett": 50581, - "Ġletter": 6524, - "ĠletterSpacing": 87999, - "Ġletters": 11931, - "Ġletting": 20194, - "Ġletto": 97899, - "Ġlettre": 69456, - "Ġlettuce": 70555, - "Ġletz": 49765, - "Ġletzten": 66968, - "Ġleuk": 56281, - "Ġleukemia": 95206, - "Ġleur": 27032, - "Ġleurs": 42053, - "Ġlev": 22638, - "Ġleve": 55489, - "Ġlevel": 2188, - "Ġleveled": 82249, - "Ġleveling": 72985, - "Ġlevels": 5866, - "Ġleven": 92203, - "Ġlever": 27505, - "Ġleverage": 32064, - "Ġleveraging": 76482, - "Ġlevitra": 67920, - "Ġlevy": 76062, - "Ġlex": 22429, - "Ġlexer": 53259, - "Ġlexical": 77586, - "Ġley": 60415, - "Ġlf": 58080, - "Ġlg": 26088, - "Ġlh": 72273, - "Ġlhs": 22505, - "Ġli": 898, - "Ġlia": 54816, - "Ġliabilities": 57065, - "Ġliability": 23414, - "Ġliable": 34373, - "Ġliaison": 82099, - "Ġliar": 72624, - "Ġlib": 3051, - "Ġlibc": 42142, - "Ġliber": 33829, - "Ġliberal": 17775, - "Ġliberalism": 83481, - "Ġliberals": 44650, - "Ġliberated": 84755, - "Ġliberation": 54533, - "Ġlibero": 79486, - "Ġlibert": 22073, - "Ġlibertarian": 56025, - "Ġliberties": 57355, - "Ġlibertin": 62632, - "Ġlibertine": 69149, - "Ġliberty": 30120, - "Ġliberté": 142341, - "Ġlibido": 93382, - "Ġlibr": 60359, - "Ġlibrarian": 94207, - "Ġlibraries": 20186, - "Ġlibrary": 6733, - "Ġlibre": 47547, - "Ġlibro": 51011, - "Ġlibros": 72346, - "Ġlibs": 63974, - "Ġlic": 12273, - "Ġlicence": 29973, - "Ġlicences": 91984, - "Ġlicens": 66236, - "Ġlicense": 5723, - "Ġlicensed": 16000, - "Ġlicensee": 85634, - "Ġlicenses": 21067, - "Ġlicensing": 27406, - "Ġlicensors": 88104, - "Ġlick": 62199, - "Ġlicked": 92935, - "Ġlicking": 66131, - "Ġlicz": 84521, - "Ġlid": 26334, - "Ġlider": 67319, - "Ġlids": 98978, - "Ġlie": 10246, - "Ġliebe": 91342, - "Ġlied": 46153, - "Ġlief": 82590, - "Ġliegt": 63940, - "Ġlien": 54420, - "Ġlies": 15448, - "Ġlieu": 38281, - "Ġlieutenant": 73536, - "Ġlif": 10136, - "Ġlife": 2272, - "Ġlifecycle": 47508, - "Ġlifelong": 50163, - "Ġlifes": 48685, - "Ġlifespan": 60861, - "Ġlifestyle": 18899, - "Ġlifestyles": 78631, - "Ġlifetime": 19031, - "Ġlift": 11893, - "Ġlifted": 29731, - "Ġlifting": 32410, - "Ġlifts": 53066, - "Ġlig": 28313, - "Ġlight": 3100, - "Ġlighten": 82508, - "Ġlighter": 29573, - "Ġlighting": 17716, - "Ġlightly": 33404, - "Ġlightning": 32438, - "Ġlights": 12711, - "Ġlightweight": 29144, - "Ġlign": 71600, - "Ġligne": 26814, - "Ġlij": 72684, - "Ġlik": 3130, - "Ġlike": 1075, - "Ġliked": 14915, - "Ġlikelihood": 28636, - "Ġlikely": 4363, - "Ġliken": 54285, - "Ġlikeness": 92774, - "Ġlikes": 13151, - "Ġlikewise": 37922, - "Ġliking": 48737, - "Ġlil": 61371, - "Ġlille": 88022, - "Ġlim": 4568, - "Ġlimb": 47594, - "Ġlimbs": 48595, - "Ġlimburg": 60231, - "Ġlime": 41719, - "Ġlimestone": 43916, - "Ġlimit": 3930, - "Ġlimitation": 20278, - "Ġlimitations": 9481, - "Ġlimite": 69980, - "Ġlimited": 7199, - "Ġlimiting": 32894, - "Ġlimitless": 91559, - "Ġlimits": 13388, - "Ġlimp": 82278, - "Ġlin": 9805, - "Ġline": 1555, - "ĠlineHeight": 57592, - "ĠlineNumber": 58941, - "ĠlineWidth": 72840, - "Ġlinea": 53856, - "Ġlineage": 63909, - "Ġlinear": 13482, - "Ġlineback": 40701, - "Ġlinebacker": 47700, - "Ġlined": 31293, - "Ġlineman": 81673, - "Ġlinen": 54015, - "Ġlineno": 85095, - "Ġliner": 52988, - "Ġliners": 95374, - "Ġlines": 5128, - "Ġlinestyle": 68541, - "Ġlineup": 27512, - "Ġlinewidth": 47847, - "Ġling": 37072, - "Ġlinger": 39509, - "Ġlingerie": 56174, - "Ġlingering": 63510, - "Ġlingu": 38503, - "Ġlinguistic": 64667, - "Ġlinha": 47673, - "Ġlining": 35371, - "Ġlink": 2656, - "Ġlinkage": 71441, - "Ġlinked": 10592, - "Ġlinker": 85745, - "Ġlinking": 30699, - "Ġlinks": 7746, - "Ġlinspace": 85796, - "Ġlint": 57920, - "Ġlinux": 36245, - "Ġlion": 39032, - "Ġlions": 68032, - "Ġlip": 19050, - "Ġlipid": 67600, - "Ġlips": 22877, - "Ġlipstick": 73583, - "Ġliqu": 11784, - "Ġlique": 92442, - "Ġliquid": 14473, - "Ġliquidity": 52013, - "Ġliquids": 66749, - "Ġliquor": 44204, - "Ġlire": 77451, - "Ġlis": 40280, - "Ġlist": 1140, - "ĠlistBox": 79328, - "ĠlistItem": 72132, - "ĠlistOf": 35891, - "ĠlistView": 40628, - "Ġlista": 14124, - "Ġlistar": 92868, - "Ġliste": 32924, - "Ġlisted": 10007, - "Ġlisten": 8844, - "Ġlistened": 33693, - "Ġlistener": 11446, - "Ġlisteners": 23562, - "Ġlistening": 14289, - "Ġlistens": 63648, - "Ġlisting": 14838, - "Ġlistings": 25465, - "Ġlists": 11469, - "Ġlit": 13020, - "Ġlite": 49672, - "Ġliter": 6935, - "Ġliteracy": 51982, - "Ġliteral": 23141, - "Ġliterally": 15901, - "Ġliterals": 75275, - "Ġliterary": 31365, - "Ġliterature": 17206, - "Ġliters": 92866, - "Ġlith": 45182, - "Ġlithium": 56807, - "Ġlitigation": 38625, - "Ġlitre": 91369, - "Ġlitres": 87916, - "Ġlitt": 59542, - "Ġlitter": 38582, - "Ġlittle": 2632, - "Ġliv": 15120, - "Ġlive": 3887, - "Ġlived": 12163, - "Ġlivelihood": 63651, - "Ġlively": 48177, - "Ġliver": 25506, - "Ġlives": 6305, - "Ġlivest": 41812, - "Ġlivestock": 50776, - "Ġliving": 5382, - "Ġlivre": 55884, - "Ġlivro": 81423, - "Ġlizard": 94811, - "Ġlié": 141035, - "Ġliên": 128542, - "Ġliá»ģn": 132726, - "Ġliá»ĩt": 137513, - "Ġliá»ĩu": 88057, - "Ġlj": 91502, - "Ġlk": 79016, - "Ġll": 9323, - "Ġllam": 50104, - "Ġllama": 93676, - "Ġlle": 56915, - "Ġlleg": 32502, - "Ġllegar": 74783, - "Ġllegó": 143047, - "Ġllen": 78831, - "Ġllev": 53195, - "Ġllevar": 69580, - "Ġllvm": 34664, - "Ġlm": 40238, - "Ġln": 29390, - "Ġlname": 76139, - "Ġlng": 24820, - "Ġlo": 775, - "Ġload": 2795, - "ĠloadChildren": 63035, - "ĠloadData": 62432, - "ĠloadImage": 69589, - "Ġloaded": 6661, - "Ġloader": 16047, - "Ġloaders": 68574, - "Ġloading": 8277, - "Ġloads": 20907, - "Ġloaf": 76148, - "Ġloan": 11679, - "Ġloans": 16606, - "Ġlob": 40153, - "Ġlobby": 19307, - "Ġlobbying": 46238, - "Ġlobbyist": 90469, - "Ġlobbyists": 72342, - "Ġlobster": 79715, - "Ġloc": 1329, - "Ġlocal": 2205, - "ĠlocalObject": 58272, - "ĠlocalStorage": 15566, - "ĠlocalVar": 42766, - "Ġlocale": 18565, - "Ġlocales": 52297, - "Ġlocalhost": 47422, - "Ġlocality": 68087, - "Ġlocalization": 52304, - "Ġlocalize": 94416, - "Ġlocalized": 43489, - "Ġlocally": 23490, - "Ġlocals": 24914, - "Ġlocaltime": 87494, - "Ġlocate": 24523, - "Ġlocated": 7407, - "Ġlocating": 71891, - "Ġlocation": 3728, - "ĠlocationManager": 68732, - "Ġlocations": 10468, - "Ġlocator": 47117, - "Ġlock": 5296, - "Ġlockdown": 50135, - "Ġlocked": 16061, - "Ġlocker": 34679, - "Ġlocking": 37855, - "Ġlocks": 31676, - "Ġlocksmith": 97960, - "Ġlocom": 62807, - "Ġlocus": 78157, - "Ġlod": 35032, - "Ġlodash": 89464, - "Ġlodge": 59791, - "Ġlodged": 73632, - "Ġlodging": 76647, - "Ġloft": 58427, - "Ġlofty": 86691, - "Ġlog": 1487, - "Ġlogarith": 89936, - "Ġlogfile": 68374, - "Ġlogged": 13726, - "ĠloggedIn": 69546, - "Ġlogger": 5925, - "Ġlogging": 8392, - "Ġlogic": 12218, - "Ġlogical": 19819, - "Ġlogically": 73045, - "Ġlogin": 5858, - "ĠloginUser": 87169, - "Ġlogistic": 71710, - "Ġlogistical": 95868, - "Ġlogistics": 42157, - "Ġlogits": 60788, - "Ġlogo": 12426, - "Ġlogos": 49019, - "Ġlogout": 22359, - "Ġlogs": 18422, - "Ġloi": 81191, - "Ġloin": 76960, - "Ġlok": 40283, - "Ġlokal": 84544, - "Ġlokale": 93887, - "Ġlol": 27409, - "Ġlombok": 16717, - "Ġlon": 17806, - "Ġlondon": 62046, - "Ġlone": 46666, - "Ġloneliness": 73940, - "Ġlonely": 39566, - "Ġlong": 1293, - "Ġlonger": 5021, - "Ġlongest": 22032, - "Ġlongevity": 57119, - "Ġlonging": 78322, - "Ġlongitud": 48604, - "Ġlongitude": 20515, - "Ġlongitudinal": 67002, - "Ġlongstanding": 73129, - "Ġlongtime": 35404, - "Ġlook": 1401, - "Ġlookahead": 86745, - "Ġlooked": 6966, - "Ġlooking": 3330, - "Ġlookout": 70915, - "Ġlooks": 5868, - "Ġlookup": 18615, - "Ġlooming": 64464, - "Ġloop": 6337, - "Ġlooph": 61476, - "Ġloophole": 92995, - "Ġlooping": 62587, - "Ġloops": 29753, - "Ġloos": 44950, - "Ġloose": 20174, - "Ġloosely": 62457, - "Ġloosen": 82742, - "Ġloot": 45303, - "Ġlor": 66211, - "Ġlord": 36931, - "Ġlords": 89113, - "Ġlore": 51222, - "Ġlorem": 92385, - "Ġloro": 47093, - "Ġlors": 36853, - "Ġlorsque": 86058, - "Ġlos": 2478, - "Ġlose": 9052, - "Ġloser": 58891, - "Ġlosers": 67356, - "Ġloses": 32191, - "Ġlosing": 13188, - "Ġloss": 4709, - "Ġlosses": 17683, - "Ġlost": 5558, - "Ġlot": 2696, - "Ġlotion": 86842, - "Ġlots": 10077, - "Ġlottery": 38239, - "Ġlou": 28640, - "Ġloud": 17361, - "Ġlouder": 61796, - "Ġloudly": 53845, - "Ġlouis": 96130, - "Ġloung": 83144, - "Ġlounge": 37932, - "Ġlov": 97792, - "Ġlove": 2948, - "Ġloved": 10245, - "Ġlovely": 16690, - "Ġlover": 30557, - "Ġlovers": 32118, - "Ġloves": 15803, - "Ġloving": 21258, - "Ġlow": 3347, - "Ġlower": 4722, - "Ġlowercase": 42047, - "Ġlowered": 38820, - "Ġlowering": 45201, - "Ġlowers": 72015, - "Ġlowes": 96827, - "Ġlowest": 15457, - "Ġlows": 65146, - "Ġloyal": 28847, - "Ġloyalty": 31783, - "Ġloại": 128433, - "Ġloạn": 138641, - "Ġloạt": 137634, - "Ġlp": 18576, - "Ġlr": 27060, - "Ġls": 19597, - "Ġlsp": 98679, - "Ġlst": 18845, - "Ġlstm": 97805, - "Ġlt": 25175, - "Ġltd": 70893, - "Ġlu": 24743, - "Ġlua": 20357, - "ĠluaL": 72731, - "Ġlub": 27345, - "Ġlubric": 53394, - "Ġluc": 25927, - "Ġluck": 15019, - "Ġluckily": 90045, - "Ġlucky": 17605, - "Ġlucr": 45190, - "Ġlucrative": 50206, - "Ġlud": 43964, - "Ġluder": 94998, - "Ġludicrous": 89171, - "Ġluego": 60394, - "Ġlug": 53410, - "Ġlugar": 33900, - "Ġlugares": 92824, - "Ġluggage": 50497, - "Ġlui": 24397, - "Ġluk": 81280, - "Ġlul": 68063, - "Ġlum": 40163, - "Ġlumber": 61453, - "Ġlumin": 44958, - "Ġlumière": 141096, - "Ġlump": 48529, - "Ġlun": 31973, - "Ġlunar": 56711, - "Ġlunch": 15786, - "Ġlunches": 93630, - "Ġlung": 20622, - "Ġlungs": 44174, - "Ġlup": 98789, - "Ġlur": 46647, - "Ġlure": 56583, - "Ġlurking": 81975, - "Ġlush": 57267, - "Ġlust": 40102, - "Ġlut": 62822, - "Ġlux": 14050, - "Ġluxe": 96100, - "Ġluxurious": 42728, - "Ġluxury": 19352, - "Ġluyá»ĩn": 133247, - "Ġluz": 64466, - "Ġluôn": 128787, - "ĠluáºŃn": 129748, - "ĠluáºŃt": 129963, - "Ġlv": 28378, - "Ġlvl": 46129, - "Ġlw": 41073, - "Ġlx": 63244, - "Ġlxml": 98723, - "Ġly": 14528, - "Ġlying": 20446, - "Ġlymph": 42645, - "Ġlyn": 89203, - "Ġlyon": 88430, - "Ġlyr": 85237, - "Ġlyric": 68335, - "Ġlyrics": 23261, - "Ġlys": 83395, - "Ġlz": 95982, - "Ġlá": 53638, - "Ġlâu": 129986, - "Ġlã": 131399, - "Ġlãi": 140694, - "Ġlãnh": 131400, - "Ġlä": 30005, - "Ġläng": 96976, - "Ġlänger": 139975, - "Ġlässt": 73741, - "ĠlÃ¥": 69369, - "Ġlæ": 77214, - "Ġlé": 62728, - "Ġlég": 71983, - "Ġlégère": 143979, - "Ġlên": 128350, - "Ġlòng": 98170, - "Ġlö": 76133, - "Ġlø": 80020, - "Ġlúc": 128730, - "Ġlý": 128356, - "ĠlÃł": 37915, - "ĠlÃłm": 128266, - "ĠlÃłnh": 136382, - "ĠlÃŃ": 31750, - "ĠlÃŃder": 94696, - "ĠlÃŃnea": 55162, - "ĠlÄ©nh": 132122, - "Ġlưng": 137643, - "Ġlưu": 129480, - "Ġlương": 135803, - "Ġlược": 136312, - "Ġlượng": 128375, - "Ġlượt": 134628, - "ĠlÆ°á»Ľi": 141593, - "Ġlạ": 132143, - "Ġlạc": 133043, - "Ġlại": 85852, - "Ġlạnh": 130823, - "Ġlấy": 129483, - "Ġlần": 128568, - "Ġlẫn": 138618, - "Ġlắm": 133883, - "Ġlắng": 135378, - "Ġlắp": 135765, - "Ġlặng": 141431, - "Ġlẽ": 132358, - "ĠláºŃp": 128980, - "Ġlợi": 128994, - "Ġlá»±a": 129506, - "Ġlá»±c": 128599, - "Ġlá»ħ": 131309, - "Ġlá»ĩ": 130554, - "Ġlá»ĩnh": 139081, - "Ġlá»ĭch": 128717, - "Ġlá»įc": 137154, - "Ġlá»Ĺi": 133015, - "Ġlá»Ļ": 130540, - "ĠlỼ": 126255, - "ĠlỼn": 128465, - "ĠlỼp": 130192, - "Ġlá»Ŀi": 128814, - "Ġlá»Ńa": 136337, - "Ġm": 296, - "ĠmA": 98777, - "ĠmActivity": 98925, - "ĠmAdapter": 62876, - "ĠmAuth": 87912, - "ĠmContext": 38674, - "ĠmCurrent": 87436, - "ĠmData": 63587, - "ĠmHandler": 82863, - "ĠmL": 64070, - "ĠmList": 87680, - "ĠmListener": 82396, - "ĠmM": 83217, - "ĠmMap": 74470, - "ĠmName": 96550, - "ĠmRNA": 77772, - "ĠmRecyclerView": 91523, - "ĠmView": 53585, - "Ġma": 7491, - "Ġmaar": 31591, - "Ġmac": 8978, - "ĠmacOS": 67178, - "Ġmach": 7845, - "Ġmachen": 37896, - "Ġmachine": 5662, - "Ġmachinery": 25868, - "Ġmachines": 12645, - "Ġmachining": 97323, - "Ġmacht": 52549, - "Ġmacro": 18072, - "Ġmacros": 37714, - "Ġmad": 12796, - "Ġmade": 1865, - "Ġmadness": 51719, - "Ġmadre": 70774, - "Ġmadrid": 64787, - "Ġmaduras": 70163, - "Ġmafia": 89885, - "Ġmag": 4878, - "Ġmagazine": 14418, - "Ġmagazines": 31847, - "Ġmage": 51803, - "Ġmagg": 87899, - "Ġmagic": 10963, - "Ġmagical": 23702, - "Ġmagically": 77725, - "Ġmagician": 89341, - "Ġmagistrate": 94091, - "Ġmagma": 63505, - "Ġmagn": 8455, - "Ġmagna": 58917, - "Ġmagnesium": 60833, - "Ġmagnet": 32197, - "Ġmagnetic": 23970, - "Ġmagnets": 72680, - "Ġmagnificent": 40692, - "Ġmagnitude": 25621, - "Ġmah": 43216, - "Ġmai": 16737, - "Ġmaid": 42065, - "Ġmaiden": 73222, - "Ġmail": 8072, - "Ġmailbox": 45742, - "Ġmailed": 75210, - "Ġmailing": 32759, - "Ġmails": 85558, - "Ġmain": 1887, - "ĠmainAxisAlignment": 33692, - "ĠmainBundle": 77258, - "ĠmainScreen": 66406, - "ĠmainWindow": 68137, - "Ġmainland": 50015, - "Ġmainly": 14576, - "Ġmains": 68136, - "Ġmainstream": 20729, - "Ġmaint": 4981, - "Ġmaintain": 10306, - "Ġmaintained": 18401, - "Ġmaintaining": 20337, - "Ġmaintains": 31995, - "Ġmaintenance": 13404, - "Ġmaintenant": 73599, - "Ġmaior": 45491, - "Ġmais": 9870, - "Ġmaison": 46176, - "Ġmaize": 92207, - "Ġmaj": 23953, - "Ġmajestic": 80289, - "Ġmajor": 3598, - "Ġmajority": 8686, - "Ġmajors": 55233, - "ĠmajÄħ": 91823, - "Ġmak": 50916, - "Ġmaka": 82277, - "Ġmake": 1281, - "ĠmakeStyles": 35805, - "Ġmaken": 54056, - "Ġmakeover": 84052, - "Ġmaker": 24232, - "Ġmakers": 28314, - "Ġmakes": 3643, - "Ġmakeshift": 86080, - "Ġmakeup": 26551, - "Ġmaking": 3259, - "Ġmaks": 89144, - "Ġmal": 8641, - "Ġmalaria": 68163, - "Ġmalaysia": 79539, - "Ġmale": 8593, - "Ġmales": 24037, - "Ġmalformed": 79250, - "Ġmalfunction": 71187, - "Ġmalicious": 38170, - "Ġmalign": 59227, - "Ġmalignant": 93229, - "Ġmall": 33253, - "Ġmalloc": 15731, - "Ġmalls": 83368, - "Ġmalt": 54656, - "Ġmalware": 39731, - "Ġmam": 32720, - "Ġmama": 56164, - "Ġmaman": 93431, - "Ġmamm": 34941, - "Ġmamma": 89311, - "Ġmammals": 55569, - "Ġman": 883, - "Ġmana": 30131, - "Ġmanage": 10091, - "Ġmanageable": 70028, - "Ġmanaged": 8975, - "Ġmanagement": 6240, - "Ġmanager": 6645, - "Ġmanagerial": 90150, - "Ġmanagers": 19680, - "Ġmanages": 28872, - "Ġmanaging": 18150, - "Ġmand": 11576, - "Ġmandate": 34281, - "Ġmandated": 64409, - "Ġmandates": 74953, - "Ġmandatory": 23042, - "Ġmane": 52360, - "Ġmanera": 43892, - "Ġmaneu": 37252, - "Ġmaneuver": 44114, - "Ġmaneuvers": 95791, - "Ġmang": 50196, - "Ġmanga": 34250, - "Ġmanganese": 86834, - "Ġmange": 59434, - "Ġmango": 69268, - "Ġmanh": 139272, - "Ġmanhã": 139273, - "Ġmanic": 69122, - "Ġmanifest": 14455, - "Ġmanifestation": 62950, - "Ġmanifestations": 77067, - "Ġmanifested": 78654, - "Ġmanifesto": 74603, - "Ġmanifests": 83232, - "Ġmanifold": 72829, - "Ġmanip": 14609, - "Ġmanipulate": 36635, - "Ġmanipulated": 54215, - "Ġmanipulating": 62514, - "Ġmanipulation": 33686, - "Ġmanière": 84622, - "Ġmankind": 42284, - "Ġmann": 37808, - "Ġmanned": 88325, - "Ġmannen": 76942, - "Ġmanner": 11566, - "Ġmanners": 69470, - "Ġmano": 55945, - "Ġmanoe": 98681, - "Ġmanos": 96249, - "Ġmanpower": 95769, - "Ġmans": 49234, - "Ġmansion": 51428, - "Ġmanslaughter": 88239, - "Ġmant": 25889, - "Ġmanten": 89890, - "Ġmantener": 91870, - "Ġmantle": 70432, - "Ġmantra": 66909, - "Ġmanual": 11376, - "Ġmanually": 20083, - "Ġmanuals": 55194, - "Ġmanufact": 5844, - "Ġmanufacture": 29747, - "Ġmanufactured": 27548, - "Ġmanufacturer": 13963, - "Ġmanufacturers": 16621, - "Ġmanufactures": 69801, - "Ġmanufacturing": 14919, - "Ġmanus": 34337, - "Ġmanuscript": 46813, - "Ġmanuscripts": 78588, - "Ġmany": 1657, - "Ġmap": 2415, - "ĠmapDispatchToProps": 31641, - "ĠmapStateToProps": 30190, - "ĠmapView": 62434, - "Ġmapa": 68110, - "Ġmaple": 54380, - "Ġmapped": 23844, - "ĠmappedBy": 95074, - "Ġmapper": 24501, - "Ġmapping": 12731, - "Ġmappings": 44817, - "Ġmaps": 14043, - "Ġmar": 3594, - "Ġmarathon": 44696, - "Ġmarble": 41290, - "Ġmarc": 59798, - "Ġmarca": 45997, - "Ġmarch": 15217, - "Ġmarched": 58661, - "Ġmarches": 87777, - "Ġmarching": 61098, - "Ġmarché": 83651, - "Ġmare": 54218, - "Ġmarg": 18687, - "Ġmargin": 4745, - "ĠmarginBottom": 32036, - "ĠmarginLeft": 32255, - "ĠmarginRight": 41464, - "ĠmarginTop": 22828, - "Ġmarginal": 31773, - "Ġmarginalized": 75720, - "Ġmargins": 36582, - "Ġmari": 12696, - "Ġmariage": 88260, - "Ġmarijuana": 14593, - "Ġmarin": 89115, - "Ġmarine": 28591, - "Ġmarital": 59339, - "Ġmaritime": 57312, - "Ġmark": 1868, - "Ġmarkdown": 50494, - "Ġmarked": 12864, - "Ġmarkedly": 87001, - "Ġmarker": 11134, - "Ġmarkers": 23962, - "Ġmarket": 3081, - "Ġmarketed": 60049, - "Ġmarketer": 97263, - "Ġmarketers": 54472, - "Ġmarketing": 8493, - "Ġmarketplace": 29533, - "Ġmarkets": 11725, - "Ġmarking": 34924, - "Ġmarkings": 64072, - "Ġmarks": 15423, - "Ġmarkup": 40751, - "Ġmarque": 74367, - "Ġmarriage": 10866, - "Ġmarriages": 46351, - "Ġmarried": 12224, - "Ġmarrow": 82648, - "Ġmarry": 31818, - "Ġmarrying": 77749, - "Ġmars": 47349, - "Ġmarsh": 31996, - "Ġmarshal": 60771, - "Ġmarshaller": 98909, - "Ġmart": 48195, - "Ġmartial": 36859, - "Ġmartin": 94916, - "Ġmarty": 59349, - "Ġmartyr": 89308, - "Ġmarvel": 44782, - "Ġmarvelous": 80192, - "Ġmary": 84630, - "Ġmarzo": 85528, - "Ġmarço": 138323, - "Ġmas": 9243, - "Ġmasa": 70689, - "Ġmasc": 42936, - "Ġmascara": 98378, - "Ġmascot": 84665, - "Ġmascul": 36098, - "Ġmasculine": 60065, - "Ġmasculinity": 79711, - "Ġmash": 62458, - "Ġmashed": 95134, - "Ġmasih": 83471, - "Ġmask": 6911, - "Ġmasked": 42148, - "Ġmasking": 78076, - "Ġmasks": 26135, - "Ġmass": 3072, - "Ġmassa": 70842, - "Ġmassac": 90058, - "Ġmassacre": 48252, - "Ġmassage": 6245, - "Ġmassages": 63179, - "Ġmassaggi": 45709, - "Ġmassasje": 30170, - "Ġmasse": 57517, - "Ġmasses": 31638, - "Ġmassive": 10951, - "Ġmassively": 63707, - "Ġmast": 18700, - "Ġmaster": 7341, - "Ġmastered": 70225, - "Ġmastering": 87761, - "Ġmasterpiece": 58731, - "Ġmasters": 35367, - "Ġmastery": 65663, - "Ġmastur": 78102, - "Ġmasturb": 29343, - "Ġmasturbating": 92007, - "Ġmasturbation": 56662, - "Ġmat": 5517, - "Ġmata": 96193, - "Ġmatch": 2432, - "Ġmatched": 18054, - "Ġmatcher": 36052, - "Ġmatches": 9071, - "Ġmatching": 12579, - "Ġmatchmaking": 61987, - "Ġmatchup": 44837, - "Ġmatchups": 78358, - "Ġmate": 29176, - "Ġmater": 52151, - "Ġmateria": 44458, - "Ġmaterial": 3684, - "Ġmaterially": 89594, - "Ġmaterials": 7236, - "ĠmateriaÅĤ": 132331, - "Ġmaternal": 49050, - "Ġmaternity": 70171, - "Ġmates": 54516, - "Ġmath": 6888, - "Ġmathematic": 20976, - "Ġmathematical": 35972, - "Ġmathematics": 37596, - "Ġmaths": 70708, - "Ġmating": 72119, - "Ġmatière": 135725, - "Ġmatlab": 76001, - "Ġmatplotlib": 16801, - "Ġmatrices": 35195, - "Ġmatrimon": 73749, - "Ġmatrix": 6172, - "Ġmatriz": 52640, - "Ġmats": 61056, - "Ġmatt": 26439, - "Ġmatte": 64157, - "Ġmatter": 4925, - "Ġmattered": 80620, - "Ġmatters": 12850, - "Ġmattress": 32226, - "Ġmattresses": 90953, - "Ġmature": 14851, - "Ġmatures": 88626, - "Ġmaturity": 47161, - "Ġmaté": 85274, - "Ġmatéria": 136169, - "Ġmatériel": 140513, - "Ġmau": 58914, - "Ġmaur": 97978, - "Ġmav": 58370, - "Ġmax": 1932, - "ĠmaxHeight": 58109, - "ĠmaxLength": 35507, - "ĠmaxSize": 61935, - "ĠmaxValue": 52172, - "ĠmaxWidth": 39617, - "ĠmaxX": 67482, - "ĠmaxY": 64618, - "Ġmaxi": 76968, - "Ġmaxim": 30027, - "Ġmaximal": 53129, - "Ġmaximize": 34508, - "Ġmaximizing": 87178, - "Ġmaximum": 7192, - "Ġmaxlen": 75448, - "Ġmaxlength": 29460, - "Ġmaxx": 97211, - "Ġmay": 1231, - "Ġmaybe": 7196, - "Ġmayo": 73331, - "Ġmayor": 16923, - "Ġmayores": 96267, - "ĠmayorÃŃa": 85316, - "Ġmaze": 35096, - "Ġmaç": 133297, - "Ġmaçı": 141262, - "Ġmañana": 95516, - "ĠmaÅĤe": 139680, - "Ġmb": 10016, - "Ġmbedtls": 97289, - "Ġmbox": 91407, - "Ġmc": 19223, - "Ġmcc": 73847, - "Ġmd": 10688, - "Ġmdb": 97776, - "Ġmdi": 68944, - "Ġmdl": 51700, - "Ġme": 752, - "Ġmeal": 15145, - "Ġmeals": 20969, - "Ġmean": 3076, - "Ġmeaning": 7290, - "Ġmeaningful": 22414, - "Ġmeaningless": 55926, - "Ġmeanings": 49700, - "Ġmeans": 3363, - "Ġmeant": 8791, - "Ġmeantime": 32853, - "Ġmeanwhile": 36218, - "Ġmeas": 6893, - "Ġmeasles": 79237, - "Ġmeasurable": 65203, - "Ġmeasure": 6629, - "Ġmeasured": 16878, - "Ġmeasurement": 18662, - "Ġmeasurements": 21595, - "Ġmeasures": 10953, - "Ġmeasuring": 28990, - "Ġmeat": 13041, - "Ġmeats": 62775, - "Ġmec": 74778, - "Ġmech": 83496, - "Ġmechan": 7697, - "Ġmechanic": 44139, - "Ġmechanical": 22148, - "Ġmechanically": 97997, - "Ġmechanics": 29026, - "Ġmechanism": 16953, - "Ġmechanisms": 23783, - "Ġmed": 1774, - "Ġmedal": 36612, - "Ġmedals": 58982, - "Ġmeddling": 80213, - "Ġmedi": 24127, - "Ġmedia": 3687, - "ĠmediaPlayer": 90141, - "Ġmedial": 96248, - "Ġmedian": 22553, - "Ġmediante": 65573, - "Ġmediated": 77826, - "Ġmediation": 76573, - "Ġmediator": 67930, - "Ġmedic": 8089, - "Ġmedical": 6457, - "Ġmedically": 77169, - "Ġmedication": 23221, - "Ġmedications": 29910, - "Ġmedicinal": 56941, - "Ġmedicine": 15712, - "Ġmedicines": 38553, - "Ġmedida": 71528, - "Ġmedidas": 82020, - "Ġmedieval": 41008, - "Ġmedio": 48679, - "Ġmediocre": 67380, - "Ġmedios": 95646, - "Ġmeditation": 32762, - "Ġmedium": 11051, - "Ġmediums": 97812, - "Ġmeds": 83807, - "Ġmee": 73343, - "Ġmeer": 37967, - "Ġmeet": 3367, - "Ġmeeting": 6438, - "Ġmeetings": 16261, - "Ġmeets": 20027, - "Ġmeetup": 95157, - "Ġmeg": 18740, - "Ġmega": 39387, - "Ġmeget": 88625, - "Ġmehr": 18520, - "Ġmeiden": 83577, - "Ġmeille": 30226, - "Ġmeilleur": 48248, - "Ġmeilleure": 93621, - "Ġmeilleurs": 78613, - "Ġmein": 41235, - "Ġmeine": 44390, - "Ġmeinem": 88787, - "Ġmeinen": 81212, - "Ġmeiner": 71126, - "Ġmeio": 65899, - "Ġmeis": 53355, - "Ġmeisje": 92552, - "Ġmeisjes": 77234, - "Ġmeisten": 84701, - "Ġmej": 20326, - "Ġmejor": 25937, - "Ġmejorar": 84116, - "Ġmejores": 51095, - "Ġmel": 10581, - "Ġmelakukan": 81237, - "Ġmelan": 66912, - "Ġmelanch": 86063, - "Ġmeld": 70430, - "Ġmelee": 42815, - "Ġmelhor": 45682, - "Ġmelhores": 94363, - "Ġmell": 53348, - "Ġmelod": 96274, - "Ġmelodies": 89013, - "Ġmelody": 61584, - "Ġmelt": 28999, - "Ġmeltdown": 90040, - "Ġmelted": 49359, - "Ġmelting": 49584, - "Ġmelts": 98091, - "Ġmem": 1833, - "Ġmemb": 38234, - "Ġmember": 4462, - "ĠmemberId": 96339, - "Ġmembers": 3613, - "Ġmembership": 15871, - "Ġmemberships": 87981, - "Ġmembr": 30719, - "Ġmembrane": 38554, - "Ġmembranes": 78248, - "Ġmembres": 77857, - "Ġmembuat": 76234, - "Ġmemcmp": 98718, - "Ġmemcpy": 19797, - "Ġmeme": 41185, - "Ġmemes": 61177, - "Ġmemiliki": 71136, - "Ġmemo": 21438, - "Ġmemoir": 50242, - "Ġmemor": 16035, - "Ġmemorable": 32496, - "Ġmemorandum": 81658, - "Ġmemoria": 71327, - "Ġmemorial": 37917, - "Ġmemories": 18923, - "Ġmemory": 4938, - "Ġmemset": 17800, - "Ġmen": 2953, - "Ġmenace": 80595, - "Ġmenacing": 93972, - "Ġmenc": 51518, - "Ġmend": 44776, - "Ġmeng": 19729, - "Ġmenggunakan": 80327, - "Ġmening": 66879, - "Ġmenj": 41374, - "Ġmenjadi": 54353, - "Ġmenn": 58727, - "Ġmennes": 95118, - "Ġmeno": 88911, - "Ġmenor": 47270, - "Ġmenos": 31795, - "Ġmens": 16049, - "Ġmensagem": 58817, - "Ġmensaje": 35577, - "Ġmensajes": 97305, - "Ġmensen": 64699, - "Ġmenstr": 53530, - "Ġmenstrual": 77627, - "Ġment": 11288, - "Ġmental": 10502, - "Ġmentality": 48295, - "Ġmentally": 33225, - "Ġmente": 87062, - "Ġmention": 6286, - "Ġmentioned": 9733, - "Ġmentioning": 44291, - "Ġmentions": 33845, - "Ġmentor": 35428, - "Ġmentoring": 75479, - "Ġmentors": 75607, - "Ġmentre": 92019, - "Ġmenu": 5022, - "ĠmenuItem": 56754, - "Ġmenus": 34154, - "Ġmeny": 54425, - "Ġmer": 4704, - "Ġmerc": 16481, - "Ġmercado": 48850, - "Ġmercenaries": 98587, - "Ġmerch": 21733, - "Ġmerchandise": 34945, - "Ġmerchant": 29238, - "Ġmerchants": 41770, - "Ġmerciless": 99152, - "Ġmercury": 50752, - "Ġmercy": 38224, - "Ġmere": 17524, - "Ġmereka": 63493, - "Ġmerely": 16234, - "Ġmerg": 18463, - "Ġmerge": 10880, - "Ġmerged": 26001, - "Ġmerger": 46012, - "Ġmerges": 80953, - "Ġmerging": 53377, - "Ġmerit": 37459, - "Ġmerits": 49832, - "Ġmerry": 92452, - "Ġmerupakan": 76983, - "Ġmes": 10846, - "Ġmesa": 70444, - "Ġmeses": 48984, - "Ġmesh": 11294, - "Ġmeshes": 64514, - "Ġmesma": 94310, - "Ġmesmer": 83361, - "Ġmesmo": 40249, - "Ġmess": 9435, - "Ġmessage": 1943, - "ĠmessageId": 74693, - "ĠmessageType": 97650, - "Ġmessagebox": 92420, - "Ġmessages": 6605, - "Ġmessaging": 29522, - "Ġmessed": 64202, - "Ġmessenger": 49496, - "Ġmessing": 75751, - "Ġmessy": 45846, - "Ġmest": 60013, - "Ġmesure": 83821, - "Ġmet": 2270, - "Ġmeta": 8823, - "ĠmetaData": 81928, - "Ġmetab": 19635, - "Ġmetabol": 27069, - "Ġmetabolic": 40761, - "Ġmetabolism": 37997, - "Ġmetadata": 11160, - "Ġmetal": 9317, - "Ġmetall": 69659, - "Ġmetallic": 45158, - "Ġmetals": 36082, - "Ġmetam": 87748, - "Ġmetaph": 30668, - "Ġmetaphor": 45350, - "Ġmetast": 67270, - "Ġmetav": 77520, - "Ġmetavar": 51218, - "Ġmeteor": 41042, - "Ġmeter": 22962, - "Ġmeters": 20044, - "Ġmeth": 21068, - "Ġmethane": 59983, - "Ġmethod": 1714, - "ĠmethodName": 47745, - "Ġmethodologies": 80798, - "Ġmethodology": 37052, - "Ġmethods": 5413, - "Ġmethyl": 78474, - "Ġmetic": 58664, - "Ġmeticulous": 95178, - "Ġmeticulously": 90326, - "Ġmetod": 94384, - "Ġmetodo": 58179, - "Ġmetre": 81573, - "Ġmetres": 36256, - "Ġmetric": 18266, - "Ġmetrics": 16734, - "Ġmetro": 33482, - "Ġmetropolitan": 57406, - "Ġmetros": 75478, - "Ġmettre": 46921, - "Ġmeu": 55209, - "Ġmex": 36949, - "Ġmexico": 76376, - "Ġmez": 76785, - "Ġmf": 43969, - "Ġmg": 13742, - "Ġmga": 76068, - "Ġmgr": 57897, - "Ġmh": 72317, - "Ġmi": 9497, - "Ġmia": 56253, - "ĠmiaÅĤ": 130139, - "ĠmiaÅĤa": 135775, - "Ġmic": 19197, - "Ġmice": 23627, - "Ġmich": 23273, - "Ġmichael": 87906, - "Ġmicro": 8003, - "Ġmicrobes": 79627, - "Ġmicrobi": 52399, - "Ġmicrobial": 74318, - "Ġmicron": 94209, - "Ġmicrophone": 42395, - "Ġmicroscope": 72657, - "Ġmicroscopic": 88990, - "Ġmicroscopy": 91814, - "Ġmicroseconds": 84762, - "Ġmicrosoft": 79896, - "Ġmicrotime": 98471, - "Ġmicrowave": 41274, - "Ġmid": 5099, - "Ġmidd": 64603, - "Ġmiddle": 6149, - "Ġmiddleware": 29679, - "Ġmidfield": 29689, - "Ġmidfielder": 43967, - "Ġmidi": 54040, - "Ġmidnight": 32333, - "Ġmidpoint": 81963, - "Ġmidst": 34346, - "Ġmidterm": 77490, - "Ġmidway": 82151, - "Ġmie": 29065, - "Ġmiejs": 76870, - "Ġmiejsc": 91894, - "ĠmiejscowoÅĽci": 143489, - "Ġmientras": 58594, - "Ġmies": 78581, - "ĠmiesiÄħ": 133703, - "ĠmiesiÄħc": 133704, - "ĠmiesiÄĻ": 141347, - "ĠmiesiÄĻcy": 141348, - "Ġmiesz": 93073, - "Ġmieszka": 128196, - "ĠmieszkaÅĦ": 128197, - "ĠmieszkaÅĦców": 142564, - "Ġmieux": 63872, - "ĠmieÄĩ": 133131, - "Ġmig": 28344, - "Ġmight": 2578, - "Ġmighty": 41627, - "Ġmigli": 44479, - "Ġmiglior": 91744, - "Ġmigliori": 74741, - "Ġmigr": 9772, - "Ġmigraine": 91881, - "Ġmigrant": 51116, - "Ġmigrants": 30987, - "Ġmigrate": 44566, - "Ġmigrated": 72591, - "Ġmigrating": 84526, - "Ġmigration": 11906, - "ĠmigrationBuilder": 16955, - "Ġmigrations": 17063, - "Ġmij": 68397, - "Ġmijn": 52992, - "Ġmik": 78805, - "Ġmike": 97669, - "Ġmil": 7473, - "Ġmilan": 93113, - "Ġmilano": 41774, - "Ġmild": 23034, - "Ġmildly": 75849, - "Ġmile": 14587, - "Ġmileage": 49852, - "Ġmiles": 8756, - "Ġmilestone": 42191, - "Ġmilestones": 68276, - "Ġmilf": 25399, - "Ġmilfs": 91974, - "Ġmilhões": 133893, - "Ġmilieu": 82159, - "Ġmilit": 5327, - "Ġmilitant": 51282, - "Ġmilitants": 38349, - "Ġmilitar": 61433, - "Ġmilitary": 6277, - "Ġmilitia": 57598, - "Ġmilitias": 79492, - "Ġmilk": 14074, - "Ġmill": 2544, - "Ġmillenn": 40599, - "Ġmillennia": 95631, - "Ġmillennials": 69333, - "Ġmillennium": 88685, - "Ġmilling": 45372, - "Ġmillion": 3526, - "Ġmillionaire": 88944, - "Ġmillions": 11728, - "Ġmillis": 57092, - "Ġmilliseconds": 30504, - "Ġmillones": 63024, - "Ġmills": 31908, - "Ġmim": 26905, - "Ġmime": 45270, - "ĠmimeType": 71826, - "Ġmimetype": 80008, - "Ġmimic": 55359, - "Ġmin": 1308, - "ĠminHeight": 64385, - "ĠminLength": 83785, - "ĠminOccurs": 79241, - "ĠminValue": 63292, - "ĠminWidth": 56098, - "ĠminX": 76174, - "ĠminY": 70347, - "Ġminced": 93827, - "Ġmind": 3971, - "Ġminded": 60167, - "Ġminden": 90544, - "Ġmindful": 62342, - "Ġmindfulness": 70605, - "Ġminds": 20062, - "Ġmindset": 39443, - "Ġmine": 10485, - "Ġminecraft": 73873, - "Ġmined": 67668, - "Ġminer": 47163, - "Ġmineral": 24136, - "Ġminerals": 32972, - "Ġminers": 42143, - "Ġmines": 33657, - "Ġming": 72159, - "Ġmingle": 90025, - "Ġminha": 62114, - "Ġmini": 13420, - "Ġminiature": 56763, - "Ġminib": 75917, - "Ġminim": 21187, - "Ġminimal": 17377, - "Ġminimalist": 71670, - "Ġminimise": 95987, - "Ġminimize": 29337, - "Ġminimized": 81078, - "Ġminimizing": 76291, - "Ġminimum": 8028, - "Ġmining": 11673, - "Ġminion": 62535, - "Ġminions": 59805, - "Ġminist": 48804, - "Ġminister": 12725, - "Ġministers": 33950, - "Ġministries": 89024, - "Ġministry": 24846, - "Ġminlength": 77929, - "Ġminor": 8922, - "Ġminorities": 39704, - "Ġminority": 22591, - "Ġminors": 48540, - "Ġmins": 24835, - "Ġmint": 28337, - "Ġminus": 27283, - "Ġminut": 81370, - "Ġminute": 9383, - "Ġminutes": 4420, - "Ġminutos": 51662, - "Ġmio": 69012, - "Ġmip": 72751, - "Ġmir": 8652, - "Ġmirac": 64966, - "Ġmiracle": 44025, - "Ġmiracles": 70812, - "Ġmiraculous": 90713, - "Ġmirror": 17846, - "Ġmirrored": 69037, - "Ġmirrors": 40485, - "Ġmis": 5786, - "Ġmisc": 31125, - "Ġmiscar": 79562, - "Ġmiscellaneous": 92404, - "Ġmischief": 93946, - "Ġmiscon": 29671, - "Ġmisconception": 97331, - "Ġmisconduct": 39994, - "Ġmisd": 50068, - "Ġmisdemean": 50626, - "Ġmisdemeanor": 57992, - "Ġmise": 56359, - "Ġmiser": 97210, - "Ġmiserable": 49639, - "Ġmisery": 57601, - "Ġmisguided": 75506, - "Ġmish": 63396, - "Ġmisinformation": 74059, - "Ġmisleading": 37209, - "Ġmisled": 98425, - "Ġmism": 66414, - "Ġmisma": 60709, - "Ġmismatch": 35301, - "Ġmismo": 35894, - "Ġmisog": 62885, - "Ġmisogyn": 94684, - "Ġmisplaced": 89560, - "Ġmisrepresented": 82421, - "Ġmiss": 3116, - "Ġmissed": 13628, - "Ġmisses": 42294, - "Ġmissile": 25224, - "Ġmissiles": 33341, - "Ġmissing": 7402, - "Ġmission": 8954, - "Ġmissionaries": 85216, - "Ġmissionary": 72898, - "Ġmissions": 24640, - "Ġmist": 8600, - "Ġmistake": 16523, - "Ġmistaken": 36004, - "Ġmistakenly": 76534, - "Ġmistakes": 20643, - "Ġmistr": 91911, - "Ġmistress": 65094, - "Ġmisunder": 37626, - "Ġmisunderstand": 89600, - "Ġmisunderstanding": 69747, - "Ġmisunderstood": 72856, - "Ġmisuse": 61751, - "Ġmit": 5451, - "Ġmitig": 34990, - "Ġmitigate": 49360, - "Ġmitigation": 65760, - "Ġmitochond": 53942, - "Ġmitochondrial": 70961, - "Ġmitt": 47332, - "Ġmix": 6514, - "Ġmixed": 9519, - "Ġmixer": 37778, - "Ġmixes": 62426, - "Ġmixin": 89603, - "Ġmixing": 26792, - "Ġmixins": 93980, - "Ġmixture": 20980, - "ĠmiÄĻd": 127252, - "ĠmiÄĻdz": 143665, - "ĠmiÄĻdzy": 132152, - "ĠmiÄĻdzyn": 143666, - "ĠmiÄĻdzynar": 143667, - "ĠmiÄĻdzynarod": 143668, - "ĠmiÄĻdzynarodow": 143669, - "ĠmiÅĤo": 143970, - "ĠmiÅĤoÅĽci": 143971, - "Ġmiá»ģn": 133318, - "Ġmiá»ħn": 132382, - "Ġmiá»ĩ": 134213, - "Ġmiá»ĩng": 134214, - "Ġmj": 83408, - "Ġmk": 23789, - "Ġmkdir": 30073, - "Ġmktime": 93049, - "Ġml": 15739, - "Ġmlx": 75411, - "Ġmm": 9465, - "Ġmmap": 70866, - "Ġmmc": 84208, - "Ġmn": 27938, - "Ġmnemonic": 86801, - "Ġmnie": 73073, - "Ġmnist": 91264, - "Ġmo": 4544, - "Ġmob": 12595, - "Ġmobil": 28805, - "Ġmobile": 6371, - "Ġmobility": 30039, - "Ġmobs": 72392, - "Ġmoc": 87672, - "Ġmock": 7860, - "ĠmockMvc": 96342, - "Ġmocked": 46149, - "Ġmocker": 93124, - "Ġmockery": 98154, - "Ġmocking": 66483, - "Ġmocks": 68909, - "Ġmod": 1463, - "Ġmoda": 90668, - "Ġmodal": 13228, - "ĠmodalitÃł": 140393, - "Ġmode": 3856, - "Ġmodel": 1614, - "ĠmodelAndView": 80675, - "ĠmodelBuilder": 37504, - "ĠmodelName": 87031, - "Ġmodele": 96725, - "Ġmodeled": 61553, - "Ġmodeling": 33479, - "Ġmodelling": 60866, - "Ġmodelo": 35942, - "Ġmodelos": 82642, - "Ġmodels": 4119, - "Ġmodem": 51504, - "Ġmoden": 99147, - "Ġmoder": 13303, - "Ġmoderate": 23193, - "Ġmoderated": 86216, - "Ġmoderately": 69251, - "Ġmoderation": 63282, - "Ġmoderator": 59427, - "Ġmoderators": 82747, - "Ġmodern": 6481, - "Ġmoderne": 76480, - "Ġmodes": 19777, - "Ġmodest": 26848, - "Ġmodific": 69133, - "Ġmodificar": 56206, - "Ġmodification": 17030, - "Ġmodifications": 28782, - "Ġmodified": 10807, - "Ġmodifier": 22739, - "Ġmodifiers": 35670, - "Ġmodifies": 82949, - "Ġmodify": 5602, - "Ġmodifying": 46041, - "Ġmodne": 80271, - "Ġmodo": 33337, - "Ġmods": 28254, - "Ġmodular": 43893, - "Ġmodulation": 66447, - "Ġmodule": 4688, - "ĠmoduleId": 92609, - "ĠmoduleName": 73788, - "Ġmodules": 13454, - "Ġmodulo": 59864, - "Ġmodulus": 74024, - "Ġmodèle": 82497, - "Ġmoet": 54794, - "Ġmoeten": 92565, - "Ġmog": 26170, - "Ġmogelijk": 74411, - "Ġmogul": 96908, - "ĠmogÄħ": 129928, - "ĠmogÄĻ": 139359, - "ĠmogÅĤa": 142995, - "Ġmoi": 39991, - "Ġmoins": 39870, - "Ġmois": 45315, - "Ġmoist": 20507, - "Ġmoistur": 53802, - "Ġmoisture": 31157, - "Ġmojo": 75416, - "Ġmol": 21609, - "Ġmold": 28461, - "Ġmolded": 84660, - "Ġmolding": 65057, - "Ġmolds": 97734, - "Ġmole": 34651, - "Ġmolec": 16671, - "Ġmolecular": 30106, - "Ġmolecule": 41930, - "Ġmolecules": 34615, - "Ġmolest": 69000, - "Ġmoll": 54409, - "Ġmolt": 90339, - "Ġmolto": 47548, - "Ġmom": 3368, - "Ġmoment": 4445, - "Ġmomentarily": 98397, - "Ġmomento": 30121, - "Ġmomentos": 96153, - "Ġmoments": 13943, - "Ġmomentum": 23270, - "Ġmommy": 81140, - "Ġmoms": 46734, - "Ġmon": 1615, - "Ġmonarch": 62754, - "Ġmonarchy": 86049, - "Ġmonastery": 84761, - "Ġmond": 61840, - "Ġmonday": 93199, - "Ġmonde": 37800, - "Ġmondo": 69709, - "Ġmonet": 57091, - "Ġmonetary": 32284, - "Ġmoney": 3220, - "Ġmong": 74542, - "Ġmongo": 33814, - "Ġmongodb": 77464, - "Ġmongoose": 15607, - "Ġmonitor": 8718, - "Ġmonitored": 40123, - "Ġmonitoring": 16558, - "Ġmonitors": 36477, - "Ġmonk": 62672, - "Ġmonkey": 38703, - "Ġmonkeys": 60720, - "Ġmonks": 65377, - "Ġmono": 39674, - "Ġmonoc": 95057, - "Ġmonopol": 74153, - "Ġmonopoly": 53201, - "Ġmonot": 77216, - "Ġmonster": 17651, - "Ġmonsters": 25787, - "Ġmonstr": 65504, - "Ġmonstrous": 75581, - "Ġmont": 20007, - "Ġmontage": 95944, - "Ġmonth": 2254, - "Ġmonthly": 15088, - "Ġmonths": 3951, - "Ġmonument": 36897, - "Ġmonumental": 77756, - "Ġmonuments": 61903, - "Ġmoo": 45871, - "Ġmood": 19671, - "Ġmooie": 75653, - "Ġmoon": 17788, - "Ġmoons": 80160, - "Ġmoot": 97783, - "Ġmop": 88064, - "Ġmor": 4313, - "Ġmoral": 15659, - "Ġmorale": 62583, - "Ġmorality": 44551, - "Ġmorally": 56223, - "Ġmorals": 80336, - "Ġmorb": 92044, - "Ġmore": 803, - "Ġmoreover": 43543, - "Ġmorning": 6556, - "Ġmornings": 57202, - "Ġmorph": 26351, - "Ġmorphology": 78512, - "Ġmort": 10032, - "Ġmortal": 48872, - "Ġmortality": 28428, - "Ġmortar": 57460, - "Ġmortgage": 20846, - "Ġmortgages": 60898, - "Ġmos": 22686, - "Ġmosaic": 70524, - "Ġmosque": 50012, - "Ġmosques": 86559, - "Ġmosquito": 49546, - "Ġmosquitoes": 82101, - "Ġmoss": 77243, - "Ġmost": 1429, - "Ġmostly": 10008, - "Ġmostr": 55490, - "Ġmostra": 92097, - "Ġmostrar": 43008, - "Ġmot": 3852, - "Ġmote": 87386, - "Ġmotel": 80381, - "Ġmoth": 97078, - "Ġmother": 6554, - "Ġmotherboard": 64243, - "Ġmothers": 26600, - "Ġmotif": 59512, - "Ġmotifs": 83889, - "Ġmotion": 11379, - "Ġmotions": 53145, - "Ġmotiv": 12242, - "Ġmotivate": 61325, - "Ġmotivated": 26664, - "Ġmotivating": 88589, - "Ġmotivation": 24798, - "Ġmotivational": 87359, - "Ġmotivations": 64831, - "Ġmotive": 45994, - "Ġmotives": 51040, - "Ġmotivo": 78464, - "Ġmoto": 72956, - "Ġmotor": 8872, - "Ġmotorcycle": 34304, - "Ġmotorcycles": 70653, - "Ġmotorists": 71898, - "Ġmotors": 37324, - "Ġmots": 77099, - "Ġmotto": 62326, - "Ġmou": 53309, - "Ġmould": 50270, - "Ġmound": 72166, - "Ġmount": 6470, - "Ġmountain": 16301, - "Ġmountains": 23501, - "Ġmounted": 21810, - "Ġmounting": 33639, - "Ġmounts": 56222, - "Ġmour": 66583, - "Ġmourn": 59134, - "Ġmourning": 75250, - "Ġmouse": 8644, - "ĠmouseClicked": 85739, - "ĠmouseX": 80890, - "ĠmouseY": 68047, - "Ġmouth": 10780, - "Ġmouths": 64509, - "Ġmov": 1974, - "Ġmovable": 82579, - "Ġmove": 3271, - "ĠmoveTo": 94781, - "Ġmoved": 7726, - "Ġmovement": 7203, - "Ġmovements": 19029, - "Ġmover": 67999, - "Ġmovers": 95354, - "Ġmoves": 10797, - "Ġmovie": 5700, - "Ġmovies": 9508, - "Ġmovimiento": 88026, - "Ġmoving": 7218, - "Ġmower": 98678, - "Ġmoy": 51038, - "Ġmoyen": 90016, - "Ġmoz": 95339, - "Ġmozilla": 84914, - "Ġmoż": 37947, - "Ġmoże": 53521, - "Ġmożemy": 134403, - "Ġmożesz": 135951, - "Ġmożli": 86057, - "Ġmożliwe": 141708, - "Ġmożliwo": 127600, - "ĠmożliwoÅĽci": 134275, - "ĠmożliwoÅĽÄĩ": 134359, - "Ġmożna": 62573, - "Ġmp": 10490, - "Ġmpfr": 82214, - "Ġmpg": 82454, - "Ġmph": 33961, - "Ġmpi": 58122, - "Ġmpl": 63784, - "Ġmpz": 71228, - "Ġmq": 72298, - "Ġmqtt": 59431, - "Ġmr": 17317, - "Ġmrb": 84261, - "Ġms": 9829, - "Ġmse": 82053, - "Ġmsec": 80359, - "Ġmsg": 3750, - "Ġmsgs": 41270, - "Ġmsm": 58588, - "Ġmt": 11965, - "Ġmtx": 81522, - "Ġmu": 11834, - "Ġmuc": 64004, - "Ġmuch": 1753, - "Ġmuchas": 63459, - "Ġmucho": 41816, - "Ġmuchos": 57206, - "Ġmud": 26183, - "Ġmudança": 136349, - "Ġmuddy": 79473, - "Ġmue": 40439, - "Ġmuestra": 70587, - "Ġmuff": 54304, - "Ġmug": 51489, - "Ġmuit": 53760, - "Ġmuito": 33750, - "Ġmuj": 26839, - "Ġmujer": 52093, - "Ġmujeres": 38808, - "Ġmul": 15602, - "Ġmulher": 38950, - "Ġmulheres": 57666, - "Ġmult": 2745, - "Ġmulter": 80245, - "Ġmulti": 7299, - "Ġmultic": 91420, - "Ġmulticast": 79534, - "Ġmulticultural": 74316, - "Ġmultid": 63386, - "Ġmultif": 61287, - "Ġmultiline": 85218, - "Ġmultim": 79049, - "Ġmultimedia": 56513, - "Ġmultin": 60130, - "Ġmultinational": 67926, - "Ġmultip": 12557, - "Ġmultipart": 68058, - "Ġmultiplayer": 38728, - "Ġmultiple": 5248, - "Ġmultiples": 65060, - "Ġmultiplic": 91707, - "Ġmultiplication": 46444, - "Ġmultiplied": 54916, - "Ġmultiplier": 30559, - "Ġmultiply": 30270, - "Ġmultiplying": 84192, - "Ġmultiprocessing": 57124, - "Ġmultis": 74737, - "Ġmultit": 84260, - "Ġmultitude": 47968, - "Ġmum": 38859, - "Ġmun": 49979, - "Ġmunch": 98245, - "Ġmund": 40566, - "Ġmundane": 68682, - "Ġmundial": 97087, - "Ġmundo": 28352, - "Ġmunic": 136332, - "Ġmunicip": 19615, - "Ġmunicipal": 26414, - "Ġmunicipalities": 58489, - "Ġmunicipality": 56818, - "ĠmunicÃŃpio": 136333, - "Ġmur": 8146, - "Ġmural": 73373, - "Ġmurder": 9901, - "Ġmurdered": 31385, - "Ġmurderer": 67966, - "Ġmurderers": 98165, - "Ġmurdering": 79927, - "Ġmurderous": 84129, - "Ġmurders": 41986, - "Ġmurky": 96792, - "Ġmurm": 86551, - "Ġmus": 3091, - "Ġmuschi": 72020, - "Ġmuscle": 15747, - "Ġmuscles": 23648, - "Ġmuscular": 51092, - "Ġmuse": 38848, - "Ġmuseum": 23971, - "Ġmuseums": 50577, - "Ġmush": 29723, - "Ġmushroom": 57366, - "Ġmushrooms": 47151, - "ĠmusiaÅĤ": 140610, - "Ġmusic": 4627, - "Ġmusica": 76587, - "Ġmusical": 17795, - "Ġmusician": 38744, - "Ġmusicians": 31529, - "Ġmusique": 88569, - "Ġmuslim": 60956, - "Ġmuss": 35141, - "Ġmust": 1969, - "Ġmustard": 64307, - "Ġmuster": 83650, - "Ġmut": 5206, - "Ġmutable": 25804, - "ĠmutableListOf": 76253, - "Ġmutant": 60518, - "Ġmutants": 87654, - "Ġmutate": 67182, - "Ġmutated": 84822, - "Ġmutating": 96518, - "Ġmutation": 26374, - "Ġmutations": 33584, - "Ġmute": 53221, - "Ġmuted": 59021, - "Ġmutex": 30863, - "Ġmutil": 75995, - "Ġmuttered": 86594, - "Ġmutual": 26750, - "Ġmutually": 52479, - "Ġmux": 59807, - "Ġmuy": 22506, - "Ġmuzzle": 74229, - "Ġmuá»ijn": 128491, - "Ġmv": 23164, - "Ġmw": 52810, - "Ġmx": 14619, - "ĠmxArray": 65838, - "Ġmy": 847, - "ĠmyList": 91727, - "Ġmycket": 79761, - "Ġmyfile": 77886, - "Ġmyocard": 94636, - "Ġmyriad": 51809, - "Ġmys": 9717, - "Ġmyself": 7037, - "Ġmysql": 10564, - "Ġmysqli": 9938, - "Ġmyst": 11425, - "Ġmyster": 23329, - "Ġmysteries": 56600, - "Ġmysterious": 25382, - "Ġmystery": 22531, - "Ġmystical": 68432, - "Ġmyth": 21163, - "Ġmythical": 83119, - "Ġmythology": 58392, - "Ġmyths": 50186, - "ĠmyÅĽli": 140603, - "Ġmz": 95392, - "Ġmá": 28730, - "Ġmái": 132273, - "Ġmáquina": 135702, - "Ġmár": 79979, - "Ġmás": 10918, - "Ġmát": 135614, - "Ġmáu": 131641, - "Ġmáxima": 141883, - "Ġmáximo": 75617, - "Ġmáy": 128392, - "Ġmâ": 142162, - "Ġmã": 58865, - "Ġmãe": 93147, - "Ġmãi": 134752, - "Ġmão": 135069, - "Ġmädchen": 58295, - "Ġmänn": 88765, - "Ġmänner": 64669, - "ĠmÃ¥": 30233, - "Ġmænd": 70560, - "Ġmé": 31018, - "Ġméd": 33930, - "Ġmédec": 139593, - "Ġmédecin": 139594, - "Ġmédica": 133272, - "Ġmédico": 132744, - "Ġmég": 82691, - "Ġmét": 35152, - "Ġméth": 74501, - "Ġméthode": 97552, - "Ġmétier": 141715, - "Ġmétodo": 57509, - "Ġmê": 130435, - "Ġmême": 26486, - "Ġmình": 128312, - "Ġmó": 65742, - "Ġmóc": 140703, - "Ġmóg": 138968, - "ĠmógÅĤ": 138969, - "Ġmón": 129994, - "Ġmóvil": 139672, - "Ġmówi": 129912, - "Ġmô": 130179, - "Ġmôi": 129991, - "Ġmôn": 130929, - "Ġmö": 22163, - "Ġmöchte": 66316, - "Ġmöchten": 85970, - "Ġmöglich": 50837, - "Ġmø": 55845, - "Ġmù": 126918, - "Ġmùa": 130567, - "Ġmùi": 138106, - "Ġmú": 91724, - "Ġmús": 59857, - "Ġmúsica": 70345, - "Ġmü": 58285, - "Ġmücade": 133118, - "Ġmücadele": 133119, - "Ġmüd": 143554, - "Ġmüdah": 143555, - "Ġmüdahale": 143556, - "Ġmük": 143547, - "Ġmükem": 143548, - "Ġmükemmel": 143549, - "Ġmümk": 132815, - "Ġmümkün": 132816, - "Ġmünchen": 78534, - "Ġmüssen": 47827, - "Ġmüzik": 141009, - "ĠmÃ¼ÅŁ": 133573, - "ĠmÃ¼ÅŁter": 133574, - "ĠmÃ¼ÅŁteri": 133575, - "ĠmÃł": 126199, - "ĠmÃłn": 131718, - "ĠmÃłu": 128865, - "ĠmÃŃ": 76326, - "ĠmÃŃn": 70224, - "ĠmÃŃnimo": 97299, - "Ġmı": 130446, - "ĠmÄĻ": 143930, - "ĠmÄĻsk": 143931, - "ĠmÄĻż": 138603, - "ĠmÄĻżczy": 138604, - "ĠmÄĻżczyzn": 138605, - "ĠmÅ©": 134968, - "ĠmÅ©i": 134969, - "ĠmÅĤ": 127433, - "ĠmÅĤod": 127434, - "ĠmÅĤodzie": 141319, - "ĠmÅĤodzież": 141320, - "ĠmÆ¡": 134796, - "Ġmưa": 136733, - "Ġmưá»Ŀi": 142837, - "Ġmạch": 135498, - "Ġmại": 131537, - "Ġmạng": 129461, - "Ġmạnh": 128818, - "Ġmất": 129276, - "Ġmấy": 132222, - "Ġmẫu": 129643, - "Ġmắc": 131880, - "Ġmắn": 138643, - "Ġmắt": 128668, - "Ġmặc": 131945, - "Ġmặt": 128387, - "Ġmẹ": 128850, - "Ġmẽ": 137125, - "ĠmáºŃt": 130821, - "Ġmỡ": 140268, - "Ġmụ": 136350, - "Ġmục": 129203, - "Ġmụn": 136351, - "Ġmức": 129240, - "Ġmừng": 137098, - "Ġmỹ": 131594, - "Ġmá»ģm": 131328, - "Ġmá»ĩnh": 140432, - "Ġmá»įi": 128728, - "Ġmá»ıi": 142306, - "Ġmá»iji": 134666, - "Ġmá»Ĺi": 129058, - "Ġmá»Ļ": 135682, - "Ġmá»Ļt": 128249, - "ĠmỼi": 92105, - "Ġmá»Ŀi": 137558, - "Ġmợ": 129367, - "Ġn": 308, - "ĠnIndex": 91024, - "Ġna": 4317, - "Ġnaam": 99105, - "Ġnaar": 29848, - "Ġnab": 72691, - "Ġnach": 14047, - "Ġnacional": 57967, - "Ġnack": 34343, - "Ġnackt": 56668, - "Ġnackte": 62002, - "Ġnad": 33534, - "Ġnada": 38211, - "Ġnadzie": 142241, - "ĠnadziejÄĻ": 142242, - "Ġnag": 36528, - "Ġnah": 68917, - "Ġnail": 30995, - "Ġnailed": 74874, - "Ġnails": 39843, - "Ġnaive": 49665, - "Ġnaj": 29174, - "Ġnajb": 143244, - "Ġnajbli": 143245, - "Ġnajbliż": 143246, - "Ġnajbliższ": 143247, - "ĠnajczÄĻ": 143594, - "ĠnajczÄĻÅĽcie": 143595, - "ĠnajczÄĻÅĽciej": 143596, - "Ġnajle": 93007, - "ĠnajwiÄĻks": 142848, - "ĠnajwiÄĻkszy": 142849, - "Ġnajwyż": 140760, - "Ġnajwyższ": 140761, - "Ġnak": 40886, - "Ġnaked": 19020, - "Ġnaken": 43845, - "Ġnakne": 67853, - "Ġnal": 84533, - "Ġnale": 87390, - "Ġnależy": 130220, - "Ġnam": 16449, - "Ġnama": 45067, - "Ġname": 829, - "ĠnameLabel": 96108, - "Ġnamed": 6941, - "Ġnamedtuple": 80536, - "Ġnamely": 31025, - "Ġnameof": 38894, - "Ġnames": 5036, - "Ġnamespace": 4473, - "Ġnamespaces": 58091, - "Ġnaming": 34948, - "Ġnamoro": 73489, - "Ġnan": 20021, - "Ġnanny": 98257, - "Ġnano": 50493, - "Ġnanop": 75207, - "Ġnanoparticles": 93653, - "Ġnao": 64273, - "Ġnap": 25859, - "Ġnapisa": 141276, - "ĠnapisaÅĤ": 141277, - "Ġnapraw": 133731, - "ĠnaprawdÄĻ": 133732, - "Ġnar": 43569, - "Ġnarc": 38688, - "Ġnarciss": 57198, - "Ġnarcotics": 91052, - "Ġnargin": 58985, - "Ġnargs": 51616, - "Ġnarr": 13408, - "Ġnarration": 85080, - "Ġnarrative": 19221, - "Ġnarratives": 57278, - "Ġnarrator": 64171, - "Ġnarrow": 15026, - "Ġnarrowed": 72935, - "Ġnarrower": 90429, - "Ġnarrowing": 97767, - "Ġnarrowly": 63947, - "Ġnarz": 140251, - "ĠnarzÄĻdzi": 140252, - "Ġnas": 17141, - "Ġnasal": 71088, - "Ġnast": 52715, - "Ġnasty": 34407, - "ĠnastÄĻ": 143287, - "ĠnastÄĻp": 141208, - "ĠnastÄĻpn": 143288, - "ĠnastÄĻpnie": 141209, - "Ġnasıl": 129384, - "Ġnat": 17588, - "Ġnation": 6995, - "Ġnational": 5313, - "Ġnationalism": 59433, - "Ġnationalist": 51894, - "Ġnationalists": 87380, - "Ġnationality": 58243, - "Ġnationally": 39243, - "Ġnationals": 55911, - "Ġnations": 16675, - "Ġnationwide": 27954, - "Ġnative": 9867, - "Ġnatives": 67373, - "Ġnatur": 14478, - "Ġnatural": 5810, - "Ġnaturally": 17712, - "Ġnature": 6993, - "Ġnatuur": 88610, - "Ġnatürlich": 67658, - "Ġnau": 92462, - "Ġnaughty": 52943, - "Ġnause": 48294, - "Ġnausea": 60780, - "Ġnav": 8075, - "ĠnavCtrl": 95168, - "Ġnaval": 45298, - "Ġnavbar": 15548, - "Ġnave": 43491, - "Ġnaveg": 55443, - "Ġnavegador": 95410, - "Ġnavig": 33412, - "Ġnavigate": 20876, - "Ġnavigating": 59399, - "Ġnavigation": 10646, - "ĠnavigationController": 65462, - "ĠnavigationOptions": 99121, - "Ġnavigator": 35409, - "Ġnavy": 44774, - "Ġnaw": 75916, - "Ġnawet": 90400, - "Ġnaz": 45802, - "Ġnaï": 94880, - "Ġnb": 16649, - "Ġnbr": 68090, - "Ġnbytes": 74647, - "Ġnc": 25126, - "Ġncols": 80235, - "Ġnd": 15581, - "Ġndarray": 66883, - "Ġne": 834, - "Ġnear": 3143, - "Ġnearby": 14046, - "Ġnearer": 86820, - "Ġnearest": 23480, - "Ġnearing": 82299, - "Ġnearly": 7009, - "Ġneat": 28485, - "Ġneatly": 62166, - "Ġneb": 80867, - "Ġneben": 84732, - "Ġnec": 19053, - "Ġneces": 24223, - "Ġnecesario": 68274, - "Ġnecesita": 93966, - "Ġnecess": 4441, - "Ġnecessarily": 14312, - "Ġnecessary": 5871, - "Ġnecessities": 75400, - "Ġnecessity": 31861, - "ĠnecessitÃł": 142091, - "Ġnecessário": 95544, - "Ġneck": 12975, - "Ġnecklace": 54447, - "Ġneckline": 91561, - "Ġned": 53705, - "Ġnederland": 62269, - "Ġneed": 1184, - "Ġneeded": 4362, - "Ġneeding": 32821, - "Ġneedle": 30309, - "Ġneedles": 56167, - "Ġneedless": 96830, - "Ġneeds": 3880, - "Ġneedy": 82463, - "Ġnef": 86124, - "Ġneg": 4184, - "Ġnegate": 71219, - "Ġnegative": 8225, - "Ġnegatively": 47191, - "Ġnegatives": 74085, - "Ġnegativity": 92695, - "Ġneger": 73733, - "Ġneglect": 38232, - "Ġneglected": 50433, - "Ġneglig": 35056, - "Ġnegligence": 58257, - "Ġnegligent": 94761, - "Ġnegligible": 81702, - "Ġnegoci": 81159, - "Ġnegocio": 95474, - "Ġnegot": 11642, - "Ġnegotiate": 36567, - "Ġnegotiated": 50478, - "Ġnegotiating": 43625, - "Ġnegotiation": 48048, - "Ġnegotiations": 23449, - "Ġnegro": 61733, - "Ġnegó": 135144, - "Ġnegócio": 135145, - "Ġneh": 68453, - "Ġnehmen": 80617, - "Ġnei": 55997, - "Ġneigh": 96166, - "Ġneighb": 6024, - "Ġneighbor": 9565, - "Ġneighborhood": 12534, - "Ġneighborhoods": 32000, - "Ġneighboring": 41517, - "Ġneighbors": 18709, - "Ġneighbour": 21922, - "Ġneighbourhood": 39342, - "Ġneighbouring": 60927, - "Ġneighbours": 35856, - "Ġneither": 13866, - "Ġnel": 24340, - "Ġnell": 65802, - "Ġnella": 35922, - "Ġnelle": 71764, - "Ġnem": 23645, - "Ġnen": 70298, - "Ġneo": 35082, - "Ġneoliberal": 80468, - "Ġneon": 46652, - "Ġnep": 91534, - "Ġneph": 43864, - "Ġnephew": 62804, - "Ġner": 40183, - "Ġnerd": 72187, - "Ġnerv": 19658, - "Ġnerve": 30915, - "Ġnerves": 49481, - "Ġnervous": 22596, - "Ġness": 85396, - "Ġnest": 22791, - "Ġnesta": 92958, - "Ġneste": 77459, - "Ġnested": 24034, - "Ġnesting": 66710, - "Ġnestled": 88677, - "Ġnests": 95121, - "Ġnet": 4179, - "Ġnets": 52457, - "Ġnett": 27770, - "Ġnettsteder": 43732, - "Ġnetwork": 3922, - "Ġnetworking": 28030, - "Ġnetworks": 14155, - "Ġneu": 20504, - "Ġneue": 38383, - "Ġneuen": 47669, - "Ġneuken": 31283, - "Ġneur": 21164, - "Ġneural": 29728, - "Ġneuro": 17773, - "Ġneurological": 63808, - "Ġneuron": 48284, - "Ġneuronal": 78302, - "Ġneurons": 33213, - "Ġneurop": 97566, - "Ġneuroscience": 91948, - "Ġneurotrans": 89251, - "Ġneut": 25793, - "Ġneutr": 41599, - "Ġneutral": 20628, - "Ġneutrality": 51764, - "Ġneutron": 72304, - "Ġnever": 2581, - "Ġnevertheless": 37230, - "Ġnew": 501, - "ĠnewArr": 91983, - "ĠnewArray": 62917, - "ĠnewData": 51523, - "ĠnewIndex": 94530, - "ĠnewInstance": 66662, - "ĠnewItem": 47988, - "ĠnewList": 67418, - "ĠnewName": 48919, - "ĠnewNode": 33560, - "ĠnewObj": 74259, - "ĠnewPassword": 75838, - "ĠnewPath": 96037, - "ĠnewPos": 82375, - "ĠnewPosition": 90899, - "ĠnewRow": 83838, - "ĠnewSize": 80843, - "ĠnewState": 36848, - "ĠnewText": 94653, - "ĠnewUser": 46246, - "ĠnewVal": 72328, - "ĠnewValue": 24174, - "ĠnewX": 88803, - "ĠnewY": 80384, - "Ġnewbie": 94578, - "Ġnewborn": 45297, - "Ġnewcom": 48476, - "Ġnewcomer": 87305, - "Ġnewcomers": 67458, - "Ġnewer": 25546, - "Ġnewest": 23601, - "Ġnewfound": 93521, - "Ġnewline": 39027, - "Ġnewly": 13631, - "Ġnews": 3669, - "Ġnewsletter": 20233, - "Ġnewsletters": 34388, - "Ġnewsp": 13377, - "Ġnewspaper": 16803, - "Ġnewspapers": 31494, - "Ġnex": 91808, - "Ġnext": 1790, - "ĠnextPage": 83595, - "ĠnextProps": 67322, - "ĠnextState": 69815, - "Ġnexus": 81401, - "Ġnf": 42128, - "Ġnfl": 85804, - "Ġnfs": 77472, - "Ġng": 7777, - "ĠngOn": 16305, - "ĠngOnDestroy": 76738, - "ĠngOnInit": 17807, - "Ġnga": 93146, - "Ġngh": 124414, - "Ġnghi": 125021, - "Ġnghiêm": 134168, - "Ġnghiên": 130693, - "Ġnghiá»ĩm": 128990, - "Ġnghiá»ĩp": 128386, - "Ġnghè": 138815, - "Ġnghèo": 138816, - "Ġnghìn": 142876, - "ĠnghÄ©": 126568, - "ĠnghÄ©a": 129598, - "Ġnghá»ģ": 132197, - "Ġnghá»ĩ": 128781, - "Ġnghá»ī": 131840, - "Ġnghá»ĭ": 130097, - "Ġnginx": 70482, - "Ġngo": 126339, - "ĠngoÃłi": 128703, - "Ġngoại": 130906, - "Ġngu": 129737, - "Ġnguyên": 129031, - "Ġnguyá»ĩn": 138030, - "Ġnguá»ĵn": 129738, - "Ġngx": 43392, - "Ġngân": 131538, - "Ġngôi": 132406, - "Ġngôn": 137425, - "ĠngÃłn": 139063, - "ĠngÃłnh": 129857, - "ĠngÃły": 128300, - "ĠngÄĥn": 133776, - "ĠngÅ©": 135518, - "Ġngươi": 133185, - "Ġngược": 138239, - "Ġngưá»Ŀi": 128251, - "Ġngạc": 143152, - "Ġngại": 138039, - "Ġngắn": 134780, - "Ġngá»§": 130370, - "Ġngừa": 142154, - "Ġngừng": 139474, - "Ġngữ": 133687, - "Ġngá»±c": 139997, - "Ġngá»į": 139137, - "Ġngá»įt": 139138, - "Ġngá»ĵi": 132055, - "Ġngá»Ļ": 142587, - "Ġngá»Ŀ": 132132, - "Ġnh": 20303, - "Ġnhi": 124599, - "Ġnhiên": 128452, - "Ġnhiêu": 135594, - "Ġnhiá»ģu": 128271, - "Ġnhiá»ħ": 133636, - "Ġnhiá»ħm": 133637, - "Ġnhiá»ĩm": 129414, - "Ġnhiá»ĩt": 130884, - "Ġnhu": 141580, - "ĠnhuáºŃn": 141581, - "Ġnhân": 128310, - "Ġnhãn": 143702, - "Ġnhé": 130236, - "Ġnhìn": 128780, - "Ġnhóm": 131270, - "ĠnhÃł": 128275, - "Ġnhư": 128260, - "Ġnhưng": 128344, - "Ġnhạc": 131245, - "Ġnhấn": 137429, - "Ġnhất": 128281, - "Ġnhắc": 136674, - "Ġnhắn": 142045, - "Ġnhằm": 131763, - "Ġnhẹ": 131314, - "ĠnháºŃn": 128370, - "ĠnháºŃp": 62572, - "ĠnháºŃt": 131330, - "Ġnhững": 128253, - "Ġnhá»±a": 140531, - "Ġnhá»ĭ": 137627, - "Ġnhá»ı": 128821, - "ĠnhỼ": 130537, - "Ġnhá»Ŀ": 132666, - "Ġni": 12788, - "Ġnib": 30285, - "Ġnic": 17327, - "Ġnice": 6419, - "Ġnicely": 28821, - "Ġnicer": 65184, - "Ġnich": 57871, - "Ġniche": 34049, - "Ġnicht": 8793, - "Ġnichts": 59765, - "Ġnick": 15988, - "Ġnickel": 51249, - "Ġnickname": 29399, - "Ġnicknamed": 89134, - "Ġnicotine": 48911, - "Ġnid": 70939, - "Ġnie": 11316, - "Ġniece": 79015, - "Ġnied": 75260, - "Ġniekt": 143841, - "Ġniektóry": 143842, - "Ġniektórych": 143843, - "Ġnier": 140327, - "Ġnieruch": 140328, - "Ġnieruchomo": 140329, - "ĠnieruchomoÅĽci": 140330, - "Ġniet": 20791, - "Ġnieu": 53801, - "Ġnieuwe": 60836, - "Ġniezb": 140433, - "ĠniezbÄĻ": 140434, - "ĠniezbÄĻdn": 140435, - "Ġnig": 82770, - "Ġnigeria": 90977, - "Ġnight": 3729, - "Ġnightclub": 69732, - "Ġnightlife": 92911, - "Ġnightly": 74760, - "Ġnightmare": 37811, - "Ġnightmares": 74262, - "Ġnights": 21461, - "Ġnighttime": 92644, - "Ġnihil": 98072, - "Ġnije": 86493, - "Ġnik": 75102, - "Ġnike": 90614, - "Ġnil": 2092, - "Ġnilai": 83367, - "Ġnim": 45692, - "Ġnin": 19550, - "Ġnine": 11627, - "Ġninete": 48742, - "Ġnineteen": 93835, - "Ġnineteenth": 64989, - "Ġninety": 77876, - "Ġning": 45507, - "Ġningu": 143259, - "Ġninguna": 98083, - "Ġninguém": 143260, - "Ġningún": 89599, - "Ġninja": 63851, - "Ġninth": 42541, - "Ġnip": 98470, - "Ġnipple": 87880, - "Ġnipples": 67112, - "Ġnir": 96824, - "Ġnisi": 68152, - "Ġnit": 24691, - "Ġnitrogen": 46403, - "Ġnive": 81332, - "Ġniveau": 51952, - "Ġnivel": 42345, - "Ġniên": 132883, - "Ġniño": 141339, - "Ġniños": 67256, - "Ġniż": 93759, - "Ġniá»ģm": 136141, - "Ġniá»ĩm": 132686, - "Ġnj": 36085, - "Ġnk": 79491, - "Ġnl": 20216, - "Ġnltk": 51064, - "Ġnm": 25723, - "Ġnn": 10883, - "Ġno": 902, - "Ġnob": 13049, - "Ġnoble": 34382, - "Ġnobody": 18581, - "Ġnoc": 75497, - "Ġnoch": 17790, - "Ġnoche": 74422, - "Ġnoct": 92001, - "Ġnod": 16004, - "Ġnodded": 34965, - "Ġnode": 2436, - "ĠnodeId": 66023, - "ĠnodeList": 89461, - "ĠnodeName": 76103, - "Ġnodes": 7798, - "Ġnodo": 52900, - "Ġnods": 82659, - "Ġnoe": 66439, - "Ġnoen": 71762, - "Ġnoexcept": 20583, - "Ġnog": 33310, - "Ġnoi": 57110, - "Ġnoir": 55562, - "Ġnoise": 11980, - "Ġnoises": 57348, - "Ġnoisy": 49280, - "Ġnok": 79733, - "Ġnoktas": 143934, - "Ġnoktası": 143935, - "Ġnom": 9662, - "Ġnombre": 12736, - "Ġnombres": 80598, - "Ġnombreux": 80686, - "Ġnome": 17129, - "Ġnomin": 24215, - "Ġnominal": 46755, - "Ġnominate": 87300, - "Ġnominated": 37948, - "Ġnomination": 28704, - "Ġnominations": 59598, - "Ġnomine": 23295, - "Ġnominee": 28211, - "Ġnominees": 59042, - "Ġnon": 2477, - "Ġnonatomic": 17861, - "Ġnonce": 39676, - "Ġnond": 73898, - "Ġnone": 6857, - "Ġnonetheless": 37813, - "Ġnonexistent": 86934, - "Ġnonlinear": 73998, - "Ġnonprofit": 32084, - "Ġnonprofits": 92260, - "Ġnons": 31695, - "Ġnonsense": 40802, - "Ġnonzero": 72232, - "Ġnood": 45795, - "Ġnoodles": 60160, - "Ġnoon": 37145, - "Ġnoop": 60829, - "Ġnop": 65026, - "Ġnoqa": 45621, - "Ġnor": 6329, - "Ġnord": 47634, - "Ġnoreferrer": 71604, - "Ġnorge": 65922, - "Ġnorm": 7465, - "Ġnormal": 4622, - "Ġnormalization": 48723, - "Ġnormalize": 21694, - "Ġnormalized": 29410, - "Ġnormally": 14279, - "Ġnormals": 53452, - "Ġnorms": 39751, - "Ġnors": 39202, - "Ġnorsk": 64267, - "Ġnorske": 60046, - "Ġnorth": 10200, - "Ġnortheast": 40829, - "Ġnortheastern": 86144, - "Ġnorthern": 18172, - "Ġnorthwest": 52242, - "Ġnos": 11891, - "Ġnose": 19142, - "Ġnoses": 96714, - "Ġnosotros": 67581, - "Ġnoss": 78630, - "Ġnossa": 76739, - "Ġnosso": 69692, - "Ġnost": 30612, - "Ġnostalg": 45089, - "Ġnostalgia": 64775, - "Ġnostalgic": 82274, - "Ġnostr": 56326, - "Ġnostra": 90027, - "Ġnostro": 83569, - "Ġnot": 537, - "Ġnota": 44038, - "Ġnotable": 27190, - "Ġnotably": 34046, - "Ġnotamment": 80086, - "Ġnotas": 85418, - "Ġnotation": 44197, - "Ġnotch": 50454, - "Ġnote": 5185, - "Ġnotebook": 37166, - "Ġnotebooks": 78531, - "Ġnoted": 10342, - "Ġnotes": 8388, - "Ġnoteworthy": 66379, - "Ġnothing": 4302, - "Ġnotice": 5293, - "Ġnoticeable": 42326, - "Ġnoticeably": 77888, - "Ġnoticed": 13686, - "Ġnotices": 34771, - "Ġnoticias": 95601, - "Ġnoticing": 61364, - "Ġnotification": 11540, - "Ġnotifications": 21969, - "Ġnotified": 29216, - "Ġnotifier": 73169, - "Ġnotifies": 96589, - "Ġnotify": 15456, - "ĠnotifyDataSetChanged": 91202, - "Ġnotifying": 97501, - "Ġnoting": 26305, - "Ġnotion": 22240, - "Ġnotions": 58582, - "Ġnotorious": 42981, - "Ġnotoriously": 72735, - "Ġnotre": 28349, - "Ġnotwithstanding": 71565, - "ĠnotÃŃcia": 141862, - "Ġnou": 19547, - "Ġnoun": 36921, - "Ġnouns": 89838, - "Ġnour": 45698, - "Ġnous": 16890, - "Ġnouve": 76601, - "Ġnouveau": 42353, - "Ġnouveaux": 86225, - "Ġnouvel": 34362, - "Ġnouvelle": 47559, - "Ġnouvelles": 78980, - "Ġnov": 6609, - "Ġnova": 40534, - "Ġnovamente": 86919, - "Ġnovel": 11514, - "Ġnovelist": 80647, - "Ġnoveller": 85614, - "Ġnovels": 31863, - "Ġnovelty": 66309, - "Ġnovember": 84223, - "Ġnovembre": 82515, - "Ġnovice": 71545, - "ĠnovitÃł": 143145, - "Ġnovo": 38323, - "Ġnow": 1431, - "Ġnowadays": 45777, - "Ġnowhere": 27112, - "Ġnowrap": 48744, - "Ġnozzle": 81881, - "Ġnp": 2595, - "Ġnpc": 36383, - "Ġnpm": 46422, - "Ġnr": 20262, - "Ġnrows": 85189, - "Ġnrw": 76506, - "Ġns": 12268, - "Ġnt": 31412, - "Ġnth": 55129, - "Ġnto": 61818, - "Ġntohs": 93464, - "Ġnu": 10908, - "Ġnuanced": 81791, - "Ġnuances": 83789, - "Ġnucle": 30384, - "Ġnuclear": 11249, - "Ġnuclei": 96092, - "Ġnucleus": 61507, - "Ġnud": 41441, - "Ġnude": 20036, - "Ġnudity": 91372, - "Ġnue": 11854, - "Ġnues": 84760, - "Ġnuest": 30887, - "Ġnuestra": 41691, - "Ġnuestras": 88510, - "Ġnuestro": 42462, - "Ġnuestros": 56913, - "Ġnueva": 37009, - "Ġnuevas": 79196, - "Ġnuevo": 28296, - "Ġnuevos": 70563, - "Ġnug": 81780, - "Ġnuis": 69438, - "Ġnuisance": 76641, - "Ġnuit": 84334, - "Ġnull": 845, - "Ġnulla": 60450, - "Ġnullable": 13258, - "Ġnullptr": 6827, - "Ġnum": 1629, - "ĠnumOf": 61575, - "ĠnumRows": 79050, - "Ġnuma": 92094, - "Ġnumb": 56271, - "Ġnumber": 1372, - "ĠnumberOf": 17512, - "ĠnumberOfRows": 44910, - "ĠnumberOfRowsInSection": 50150, - "ĠnumberWith": 49798, - "ĠnumberWithInt": 98277, - "Ġnumbered": 48826, - "Ġnumbering": 78262, - "Ġnumbers": 5109, - "Ġnumel": 76211, - "Ġnumer": 7857, - "Ġnumeral": 83292, - "Ġnumerator": 63533, - "Ġnumeric": 24064, - "Ġnumerical": 34776, - "Ġnumero": 20050, - "Ġnumeros": 55626, - "Ġnumerous": 12114, - "Ġnumpy": 8591, - "Ġnums": 10307, - "Ġnumérique": 141418, - "Ġnuméro": 97977, - "Ġnun": 28095, - "Ġnunca": 52743, - "Ġnuova": 85547, - "Ġnuovo": 72729, - "Ġnur": 12222, - "Ġnurs": 16996, - "Ġnurse": 28098, - "Ġnursery": 55126, - "Ġnurses": 36365, - "Ġnursing": 27356, - "Ġnurt": 59096, - "Ġnurture": 78430, - "Ġnurturing": 83811, - "Ġnuru": 75111, - "Ġnut": 9979, - "Ġnutrient": 49023, - "Ġnutrients": 36393, - "Ġnutrit": 68614, - "Ġnutrition": 25595, - "Ġnutritional": 42126, - "Ġnutritious": 77116, - "Ġnuts": 29949, - "Ġnutshell": 92913, - "Ġnutzen": 77919, - "Ġnuôi": 132645, - "Ġnv": 31440, - "Ġnw": 62532, - "Ġnx": 24496, - "Ġnxt": 70452, - "Ġny": 19004, - "Ġnya": 75189, - "Ġnye": 78667, - "Ġnylon": 51055, - "Ġnymph": 98301, - "Ġnz": 42942, - "Ġnº": 136352, - "Ġnâ": 130313, - "Ġnâng": 130314, - "Ġnão": 12393, - "Ġnä": 43117, - "Ġnäch": 62668, - "Ġnächste": 141257, - "Ġnächsten": 90935, - "Ġnäm": 143524, - "Ġnämlich": 143525, - "Ġnär": 64375, - "ĠnÃ¥": 42135, - "ĠnÃ¥r": 58690, - "Ġnæ": 81498, - "Ġnær": 56697, - "Ġné": 37505, - "Ġnécess": 62746, - "Ġnécessaire": 99143, - "Ġnét": 135437, - "Ġnên": 128317, - "Ġnë": 66143, - "Ġnó": 128525, - "Ġnói": 128339, - "Ġnóng": 131484, - "Ġnós": 91775, - "Ġnông": 132234, - "Ġnø": 54905, - "Ġnú": 136191, - "Ġnúi": 136192, - "Ġnúmero": 30211, - "Ġnúmeros": 69426, - "ĠnÃłng": 130453, - "ĠnÃło": 128352, - "ĠnÃły": 96535, - "ĠnÃŃvel": 136234, - "ĠnÄĥm": 128290, - "ĠnÄĥng": 128365, - "ĠnÆ¡i": 128837, - "ĠnÆ°á»Ľc": 128301, - "Ġnạ": 138420, - "Ġnạn": 132864, - "Ġnấu": 138102, - "Ġnắm": 135905, - "Ġnắng": 136583, - "Ġnằm": 130668, - "Ġnặng": 132932, - "Ġnếu": 128725, - "Ġnợ": 138178, - "Ġnữ": 128872, - "Ġnữa": 128870, - "Ġná»ģn": 131167, - "Ġná»iji": 132364, - "Ġná»ķi": 129144, - "Ġná»Ļ": 143280, - "Ġná»Ļi": 128811, - "Ġná»Ļp": 143281, - "Ġná»Ńa": 138405, - "Ġo": 297, - "Ġoa": 90812, - "Ġoak": 37871, - "Ġoasis": 85710, - "Ġoat": 71654, - "Ġoath": 47942, - "Ġoats": 84170, - "Ġoauth": 46415, - "Ġob": 1508, - "Ġobe": 97402, - "Ġobed": 48190, - "Ġobedience": 66094, - "Ġobedient": 95656, - "Ġoben": 89005, - "Ġober": 91245, - "Ġobese": 49220, - "Ġobesity": 31948, - "Ġobey": 40601, - "Ġobj": 2839, - "Ġobjc": 63326, - "Ġobject": 1633, - "ĠobjectAtIndex": 29320, - "ĠobjectForKey": 22684, - "ĠobjectId": 82887, - "ĠobjectMapper": 83912, - "ĠobjectType": 92802, - "Ġobjected": 75779, - "Ġobjection": 45555, - "Ġobjections": 53011, - "Ġobjective": 16538, - "Ġobjectively": 84021, - "Ġobjectives": 25398, - "Ġobjects": 6171, - "Ġobjet": 30160, - "Ġobjetivo": 54226, - "Ġobjeto": 35543, - "Ġobjetos": 74048, - "Ġobjs": 52937, - "Ġobl": 93344, - "Ġoblig": 12331, - "Ġobligated": 66876, - "Ġobligation": 28572, - "Ġobligations": 29155, - "Ġobligatory": 96924, - "Ġobliged": 53017, - "Ġobliv": 66005, - "Ġoblivious": 93270, - "Ġobr": 38194, - "Ġobra": 61734, - "Ġobras": 84749, - "Ġobrig": 69337, - "Ġobs": 7448, - "Ġobsc": 25647, - "Ġobscene": 83009, - "Ġobscure": 39534, - "Ġobscured": 95701, - "Ġobserv": 9282, - "Ġobservable": 39535, - "Ġobservation": 21930, - "Ġobservational": 89280, - "Ġobservations": 23722, - "Ġobserve": 22986, - "Ġobserved": 13166, - "Ġobserver": 22067, - "Ġobservers": 36543, - "Ġobserves": 80199, - "Ġobserving": 44971, - "Ġobsess": 55259, - "Ġobsessed": 43798, - "Ġobsession": 48535, - "Ġobsessive": 83032, - "Ġobsolete": 46066, - "Ġobst": 17864, - "Ġobstacle": 32187, - "Ġobstacles": 31016, - "Ġobstruct": 53192, - "Ġobstruction": 59951, - "ĠobsÅĤ": 142870, - "ĠobsÅĤugi": 142871, - "Ġobt": 4514, - "Ġobtain": 6851, - "Ġobtained": 12180, - "Ġobtaining": 19009, - "Ġobtains": 93563, - "Ġobten": 63190, - "Ġobtener": 49504, - "Ġobvious": 8036, - "Ġobviously": 13900, - "Ġoc": 17796, - "Ġocas": 93252, - "Ġocc": 2983, - "Ġoccas": 8986, - "Ġoccasion": 13101, - "Ġoccasional": 27861, - "Ġoccasionally": 22930, - "Ġoccasions": 24930, - "Ġoccult": 73826, - "Ġoccup": 10156, - "Ġoccupancy": 65319, - "Ġoccupants": 74672, - "Ġoccupation": 29647, - "Ġoccupational": 64095, - "Ġoccupations": 59866, - "Ġoccupied": 24367, - "Ġoccupies": 75754, - "Ġoccupy": 47578, - "Ġoccupying": 71180, - "Ġoccur": 12170, - "Ġoccured": 34942, - "Ġoccurred": 10017, - "Ġoccurrence": 31559, - "Ġoccurrences": 56015, - "Ġoccurring": 30865, - "Ġoccurs": 13666, - "Ġocean": 17951, - "Ġoceans": 53180, - "Ġoch": 11952, - "Ġoci": 93975, - "ĠocksÃ¥": 87316, - "Ġocor": 83972, - "Ġoct": 18491, - "Ġoctave": 73932, - "Ġocup": 74666, - "Ġocur": 91220, - "Ġoczy": 138959, - "ĠoczywiÅĽcie": 138960, - "Ġod": 10785, - "Ġodby": 140993, - "ĠodbyÅĤ": 140994, - "Ġodd": 10322, - "Ġoddly": 73444, - "Ġodds": 20785, - "Ġode": 72894, - "Ġodense": 74887, - "Ġoder": 12385, - "Ġodio": 86734, - "Ġodom": 87106, - "Ġodor": 52997, - "Ġodp": 50906, - "Ġodpowied": 70986, - "Ġoe": 68383, - "Ġof": 315, - "ĠofApp": 97742, - "ĠofType": 71754, - "Ġofere": 80952, - "Ġoferta": 84220, - "Ġoff": 1007, - "Ġoffen": 87533, - "Ġoffence": 34255, - "Ġoffences": 50212, - "Ġoffend": 83986, - "Ġoffended": 53121, - "Ġoffender": 46653, - "Ġoffenders": 40602, - "Ġoffending": 69569, - "Ġoffense": 16775, - "Ġoffenses": 46143, - "Ġoffensive": 15183, - "Ġoffer": 3010, - "Ġoffered": 8900, - "Ġoffering": 10004, - "Ġofferings": 32835, - "Ġoffers": 6081, - "Ġoffic": 2786, - "Ġoffice": 5163, - "Ġofficer": 9452, - "Ġofficers": 9611, - "Ġoffices": 19126, - "Ġofficial": 3946, - "Ġofficially": 18562, - "Ġofficials": 7359, - "Ġoffline": 26166, - "Ġoffre": 67805, - "Ġoffs": 73217, - "Ġoffseason": 39872, - "Ġoffset": 4347, - "ĠoffsetX": 73272, - "ĠoffsetY": 68038, - "Ġoffsetof": 61647, - "Ġoffsets": 35046, - "Ġoffshore": 38400, - "Ġoffspring": 45371, - "Ġoficial": 74440, - "Ġofrec": 63095, - "Ġofrece": 88439, - "Ġofs": 58061, - "Ġofstream": 75393, - "Ġoft": 42046, - "Ġoften": 3545, - "Ġog": 7350, - "Ġoggi": 88644, - "Ġogl": 93956, - "ĠoglÄħda": 141409, - "Ġogni": 54374, - "Ġogr": 95261, - "Ġogs": 43734, - "ĠogsÃ¥": 48387, - "Ġogó": 143809, - "Ġogóle": 143810, - "Ġogóln": 137415, - "ĠogÅĤ": 143303, - "ĠogÅĤos": 143304, - "ĠogÅĤoszen": 143305, - "ĠogÅĤoszeni": 143306, - "Ġoh": 14019, - "Ġohio": 95885, - "Ġohne": 28883, - "Ġoi": 74633, - "Ġoid": 48766, - "Ġoil": 5590, - "Ġoils": 31362, - "Ġoily": 77471, - "Ġok": 5394, - "Ġokay": 16910, - "Ġokhttp": 48032, - "Ġoko": 135249, - "ĠokoÅĤo": 135250, - "Ġokre": 138166, - "ĠokreÅĽ": 138167, - "ĠokreÅĽlon": 138168, - "Ġol": 8328, - "Ġolacaktır": 135651, - "Ġolacaģı": 139005, - "Ġolan": 56298, - "Ġolarak": 49894, - "Ġold": 2310, - "ĠoldValue": 49102, - "Ġolder": 9014, - "Ġoldest": 23513, - "Ġolds": 78473, - "Ġoldu": 57000, - "Ġolduk": 127365, - "Ġoldukları": 139796, - "Ġoldukça": 132821, - "ĠolduÄŁ": 66465, - "ĠolduÄŁu": 128508, - "ĠolduÄŁunu": 128776, - "Ġole": 31778, - "Ġoleh": 51316, - "Ġoli": 59136, - "Ġolig": 54884, - "Ġolive": 32113, - "Ġolmad": 127956, - "Ġolmadıģ": 139952, - "Ġolmadıģı": 137890, - "Ġolmadıģını": 139953, - "Ġolması": 129280, - "Ġolmasını": 142721, - "ĠolmuÅŁ": 136506, - "ĠolmuÅŁtur": 142843, - "Ġoltre": 91102, - "Ġolu": 127079, - "ĠoluÅŁ": 128065, - "ĠoluÅŁan": 139527, - "ĠoluÅŁtur": 127080, - "ĠoluÅŁturul": 142288, - "ĠoluÅŁu": 139656, - "Ġom": 7861, - "Ġoma": 47153, - "Ġomap": 88236, - "Ġomas": 94676, - "Ġomdat": 94020, - "Ġomega": 33898, - "Ġomin": 71175, - "Ġominous": 85496, - "Ġomission": 83118, - "Ġomit": 51044, - "Ġomitted": 39442, - "Ġomn": 49097, - "Ġomnip": 94429, - "Ġomp": 42925, - "Ġon": 389, - "ĠonActivityResult": 78840, - "ĠonAnimation": 88456, - "ĠonBackPressed": 70609, - "ĠonBind": 51234, - "ĠonBindViewHolder": 57494, - "ĠonBlur": 63973, - "ĠonCancel": 65125, - "ĠonCancelled": 88500, - "ĠonChange": 9095, - "ĠonChangeText": 60868, - "ĠonChanged": 55360, - "ĠonClick": 5697, - "ĠonClose": 39876, - "ĠonComplete": 55246, - "ĠonCreate": 12057, - "ĠonCreateOptionsMenu": 67094, - "ĠonCreateView": 41438, - "ĠonCreateViewHolder": 58164, - "ĠonData": 77662, - "ĠonDataChange": 98908, - "ĠonDelete": 39553, - "ĠonDestroy": 54189, - "ĠonError": 32430, - "ĠonFailure": 48334, - "ĠonFinish": 96905, - "ĠonFocus": 85974, - "ĠonHide": 95604, - "ĠonItemClick": 66774, - "ĠonKeyDown": 92608, - "ĠonLoad": 53431, - "ĠonMouse": 42280, - "ĠonNext": 94612, - "ĠonOptionsItemSelected": 63967, - "ĠonPage": 74871, - "ĠonPause": 81149, - "ĠonPostExecute": 83163, - "ĠonPress": 22976, - "ĠonPressed": 27002, - "ĠonRequest": 79008, - "ĠonResponse": 56236, - "ĠonResume": 61170, - "ĠonSave": 77444, - "ĠonSelect": 63518, - "ĠonStart": 57113, - "ĠonStop": 85230, - "ĠonSubmit": 22487, - "ĠonSuccess": 38702, - "ĠonTap": 35384, - "ĠonTouch": 70779, - "ĠonUpdate": 80402, - "ĠonView": 50734, - "ĠonViewCreated": 86634, - "Ġonboard": 55058, - "Ġonc": 77870, - "Ġonce": 3055, - "Ġonchange": 49252, - "Ġonclick": 12172, - "Ġonde": 49003, - "Ġonder": 37761, - "Ġone": 825, - "Ġones": 6174, - "Ġoneself": 56569, - "Ġongoing": 14195, - "Ġonion": 37327, - "Ġonions": 44597, - "Ġonline": 2860, - "Ġonload": 96964, - "Ġonly": 1172, - "Ġons": 48449, - "Ġonset": 40980, - "Ġonsite": 83869, - "Ġonslaught": 87692, - "Ġonstage": 92535, - "Ġont": 14508, - "Ġonto": 8630, - "Ġontology": 83269, - "Ġontvang": 95052, - "Ġontvangst": 50290, - "Ġonward": 78187, - "Ġonwards": 59425, - "Ġonze": 55805, - "Ġoo": 55909, - "Ġook": 27479, - "Ġop": 1179, - "Ġopacity": 18655, - "Ġopaque": 46484, - "Ġopc": 37027, - "Ġopcion": 72808, - "Ġopciones": 75436, - "Ġopción": 83689, - "Ġopcode": 30028, - "Ġopen": 1787, - "ĠopenFileDialog": 97371, - "Ġopendir": 95142, - "Ġopened": 8930, - "Ġopener": 35153, - "Ġopenid": 98726, - "Ġopening": 8568, - "Ġopenings": 48549, - "Ġopenly": 29347, - "Ġopenness": 70060, - "Ġopens": 15885, - "Ġopenssl": 80733, - "Ġoper": 1997, - "Ġopera": 42416, - "Ġoperand": 27213, - "Ġoperands": 54510, - "Ġoperate": 14476, - "Ġoperated": 23151, - "Ġoperates": 26057, - "Ġoperating": 10350, - "Ġoperation": 5666, - "Ġoperational": 24586, - "Ġoperations": 7525, - "Ġoperative": 63785, - "Ġoperatives": 72190, - "Ġoperator": 5675, - "Ġoperators": 19624, - "Ġopi": 35458, - "Ġopin": 7334, - "Ġopinion": 9459, - "Ġopinions": 17979, - "Ġopinión": 139421, - "Ġopioid": 47725, - "Ġopioids": 83360, - "Ġoportun": 61998, - "Ġopp": 3995, - "Ġoppon": 10359, - "Ġopponent": 14704, - "Ġopponents": 19386, - "Ġopport": 4800, - "Ġopportun": 85854, - "Ġopportunities": 10488, - "Ġopportunity": 6638, - "Ġoppos": 7922, - "Ġoppose": 33034, - "Ġopposed": 16087, - "Ġopposes": 75212, - "Ġopposing": 30222, - "Ġopposite": 14002, - "Ġopposition": 13758, - "Ġoppress": 89738, - "Ġoppressed": 66416, - "Ġoppression": 46648, - "Ġoppressive": 77512, - "Ġopr": 71063, - "Ġops": 27132, - "Ġopt": 3387, - "Ġoptarg": 82191, - "Ġopted": 40767, - "Ġoptic": 80109, - "Ġoptical": 28293, - "Ġoptics": 69885, - "Ġoptim": 7553, - "Ġoptimal": 22823, - "Ġoptimism": 53408, - "Ġoptimistic": 35936, - "Ġoptimization": 25262, - "Ġoptimizations": 81178, - "Ġoptimize": 29436, - "Ġoptimized": 33340, - "Ġoptimizer": 25632, - "Ġoptimizing": 73042, - "Ġoptimum": 53667, - "Ġopting": 74601, - "Ġoption": 2999, - "Ġoptional": 10101, - "Ġoptionally": 45524, - "Ġoptions": 2606, - "Ġopts": 12185, - "Ġor": 476, - "Ġora": 59325, - "Ġoracle": 52741, - "Ġoral": 20655, - "Ġorally": 97022, - "Ġoran": 135683, - "Ġorang": 49607, - "Ġorange": 18575, - "Ġoranges": 84038, - "Ġoranı": 135684, - "Ġoraz": 35470, - "Ġorb": 36366, - "Ġorbit": 26507, - "Ġorbital": 64591, - "Ġorbits": 85128, - "Ġorbs": 98405, - "Ġorc": 75691, - "Ġorch": 40145, - "Ġorchest": 69884, - "Ġorchestr": 65128, - "Ġorchestra": 68055, - "Ġorchestrated": 92067, - "Ġord": 6013, - "Ġordained": 85624, - "Ġordeal": 73681, - "Ġorden": 38388, - "Ġorder": 1973, - "ĠorderBy": 39694, - "ĠorderId": 48973, - "Ġorderby": 85836, - "Ġordered": 11457, - "Ġordering": 21391, - "Ġorderly": 84769, - "Ġorders": 10163, - "Ġordin": 48642, - "Ġordinal": 67948, - "Ġordinance": 47621, - "Ġordinances": 88764, - "Ġordinarily": 96981, - "Ġordinary": 19119, - "Ġore": 16144, - "Ġores": 75058, - "Ġorg": 1240, - "Ġorgan": 2872, - "Ġorganic": 17356, - "Ġorganis": 21185, - "Ġorganisation": 21424, - "Ġorganisations": 28433, - "Ġorganise": 69940, - "Ġorganised": 38333, - "Ġorganisers": 90460, - "Ġorganising": 87071, - "Ġorganism": 46020, - "Ġorganisms": 43204, - "Ġorganisé": 142892, - "Ġorganiz": 24299, - "Ġorganización": 140051, - "Ġorganization": 7321, - "Ġorganizational": 40195, - "Ġorganizations": 11104, - "Ġorganize": 30235, - "Ġorganized": 16645, - "Ġorganizer": 46202, - "Ġorganizers": 43218, - "Ġorganizing": 34721, - "Ġorgans": 35753, - "Ġorgas": 51473, - "Ġorgasm": 37665, - "Ġorgy": 84431, - "Ġori": 58635, - "Ġorient": 11485, - "Ġorientation": 16725, - "Ġorientations": 88835, - "Ġoriented": 41108, - "Ġorig": 2713, - "Ġorigen": 87389, - "Ġorigin": 6238, - "Ġoriginal": 4024, - "Ġoriginally": 13214, - "Ġoriginals": 85590, - "Ġoriginate": 81216, - "Ġoriginated": 43753, - "Ġoriginates": 98870, - "Ġoriginating": 70273, - "Ġorigins": 32372, - "Ġorm": 67602, - "Ġorn": 39445, - "Ġornament": 78660, - "Ġornaments": 84268, - "Ġoro": 94893, - "Ġorphan": 12746, - "Ġort": 63509, - "Ġorth": 29199, - "Ġorthodox": 91242, - "Ġorthogonal": 94580, - "Ġos": 2643, - "Ġosc": 30947, - "Ġoscill": 42424, - "Ġoscillator": 83641, - "Ġosg": 50848, - "Ġoslo": 36262, - "Ġosob": 71657, - "Ġosp": 63490, - "Ġoss": 30059, - "Ġost": 36896, - "Ġostat": 95369, - "Ġoste": 51268, - "Ġostensibly": 80494, - "Ġostr": 65994, - "Ġostream": 63511, - "Ġosób": 93443, - "Ġot": 14147, - "Ġother": 1008, - "ĠotherButtonTitles": 81187, - "Ġothers": 3800, - "Ġotherwise": 5937, - "Ġotp": 83431, - "Ġotra": 45395, - "Ġotras": 50866, - "Ġotro": 38092, - "Ġotros": 38405, - "Ġott": 52922, - "Ġou": 5908, - "Ġoud": 76973, - "Ġought": 21776, - "Ġoui": 96407, - "Ġounce": 53708, - "Ġounces": 48038, - "Ġour": 1039, - "Ġours": 11350, - "Ġourselves": 13217, - "Ġousted": 97455, - "Ġout": 700, - "ĠoutFile": 72809, - "Ġoutage": 88129, - "Ġoutbound": 73795, - "Ġoutbreak": 30088, - "Ġoutbreaks": 76771, - "Ġoutcome": 15274, - "Ġoutcomes": 19554, - "Ġoutcry": 87863, - "Ġoutdated": 40526, - "Ġoutdoor": 15789, - "Ġoutdoors": 33532, - "Ġouter": 15955, - "Ġoutf": 75881, - "Ġoutfield": 66337, - "Ġoutfile": 33178, - "Ġoutfit": 27303, - "Ġoutfits": 47274, - "Ġoutgoing": 36698, - "Ġouting": 64181, - "Ġoutings": 95627, - "Ġoutlaw": 64006, - "Ġoutlet": 26389, - "Ġoutlets": 27084, - "Ġoutlier": 88160, - "Ġoutliers": 86663, - "Ġoutline": 21101, - "Ġoutlined": 32640, - "Ġoutlines": 49629, - "Ġoutlining": 78674, - "Ġoutlook": 35621, - "Ġoutnumber": 84592, - "Ġoutpatient": 86130, - "Ġoutpost": 95578, - "Ġoutput": 2550, - "ĠoutputFile": 62843, - "ĠoutputPath": 95017, - "ĠoutputStream": 57961, - "Ġoutputs": 16275, - "Ġoutr": 17852, - "Ġoutra": 80707, - "Ġoutrage": 29129, - "Ġoutraged": 71264, - "Ġoutrageous": 54488, - "Ġoutras": 73702, - "Ġoutreach": 46110, - "Ġoutright": 39128, - "Ġoutro": 60658, - "Ġoutros": 56873, - "Ġouts": 22806, - "Ġoutset": 67764, - "Ġoutside": 4889, - "Ġoutsider": 74583, - "Ġoutsiders": 72189, - "Ġoutskirts": 70233, - "Ġoutsourcing": 74692, - "Ġoutspoken": 69279, - "Ġoutstanding": 18781, - "Ġoutward": 50946, - "Ġoutweigh": 61974, - "Ġov": 24550, - "Ġoval": 60037, - "Ġovar": 65068, - "Ġovarian": 84442, - "Ġoven": 23387, - "Ġover": 916, - "Ġoverall": 8084, - "Ġoverarching": 97436, - "Ġoverclock": 80194, - "Ġovercome": 22279, - "Ġovercoming": 72917, - "Ġovercrow": 87104, - "Ġoverd": 39452, - "Ġoverdose": 59453, - "Ġoverdue": 72526, - "Ġoverflow": 16484, - "Ġoverflowing": 93215, - "Ġoverhaul": 51674, - "Ġoverhe": 71289, - "Ġoverhead": 31015, - "Ġoverl": 28104, - "Ġoverlap": 27248, - "Ġoverlapping": 49817, - "Ġoverlaps": 76007, - "Ġoverlay": 24629, - "Ġoverlays": 96872, - "Ġoverload": 42184, - "Ġoverloaded": 74591, - "Ġoverlook": 30705, - "Ġoverlooked": 44436, - "Ġoverlooking": 52224, - "Ġoverly": 38432, - "Ġovernight": 24398, - "Ġoverposting": 94053, - "Ġoverpower": 97787, - "Ġoverridden": 51456, - "Ġoverride": 2812, - "Ġoverrides": 35455, - "Ġoverriding": 67871, - "Ġoverrun": 84278, - "Ġovers": 17460, - "Ġoverse": 19692, - "Ġoverseas": 24357, - "Ġoversee": 40903, - "Ġoverseeing": 67604, - "Ġoversees": 70845, - "Ġoversh": 65471, - "Ġovershadow": 84205, - "Ġoversight": 37089, - "Ġoversized": 61205, - "Ġoverst": 82409, - "Ġovert": 42561, - "Ġoverthrow": 62231, - "Ġovertime": 38499, - "Ġoverturn": 66587, - "Ġoverturned": 67998, - "Ġoverview": 23251, - "Ġoverweight": 49154, - "Ġoverwhel": 16783, - "Ġoverwhelm": 95748, - "Ġoverwhelmed": 42106, - "Ġoverwhelming": 22024, - "Ġoverwhelmingly": 54634, - "Ġoverwrite": 32216, - "Ġoverwritten": 59173, - "Ġow": 15570, - "Ġowe": 41110, - "Ġowed": 47909, - "Ġowes": 68844, - "Ġowing": 55512, - "Ġowl": 52269, - "Ġown": 1828, - "Ġowned": 12938, - "Ġowner": 6372, - "ĠownerId": 96923, - "Ġowners": 7824, - "Ġownership": 15278, - "Ġowning": 40277, - "Ġowns": 24256, - "Ġox": 18952, - "Ġoxid": 35072, - "Ġoxidation": 70062, - "Ġoxidative": 78301, - "Ġoxide": 50080, - "Ġoxy": 98590, - "Ġoxygen": 23552, - "Ġoy": 69348, - "Ġoz": 24596, - "Ġozone": 76437, - "Ġoù": 38623, - "Ġp": 281, - "ĠpBuffer": 92400, - "ĠpData": 48639, - "ĠpH": 36043, - "ĠpInfo": 93583, - "ĠpItem": 93640, - "ĠpNode": 64566, - "ĠpObj": 59952, - "ĠpParent": 94220, - "Ġpa": 7106, - "Ġpaar": 48100, - "Ġpac": 22894, - "Ġpace": 17857, - "Ġpaced": 77680, - "Ġpaciente": 72412, - "Ġpacientes": 83924, - "Ġpacing": 82140, - "Ġpack": 3769, - "Ġpackage": 6328, - "ĠpackageName": 66604, - "Ġpackaged": 46137, - "Ġpackages": 14185, - "Ġpackaging": 23189, - "Ġpacked": 19375, - "Ġpacket": 10151, - "Ġpackets": 27035, - "Ġpacking": 35713, - "Ġpacks": 30306, - "Ġpacman": 96864, - "Ġpact": 59721, - "Ġpad": 11016, - "Ġpada": 31811, - "Ġpadd": 53169, - "Ġpadded": 43868, - "Ġpadding": 5300, - "ĠpaddingBottom": 60665, - "ĠpaddingHorizontal": 84098, - "ĠpaddingLeft": 54191, - "ĠpaddingRight": 70015, - "ĠpaddingTop": 48534, - "Ġpaddle": 39303, - "Ġpadr": 93060, - "Ġpadre": 61020, - "Ġpads": 35995, - "Ġpadx": 54822, - "Ġpady": 52632, - "Ġpaed": 94147, - "Ġpag": 14774, - "Ġpagamento": 78807, - "Ġpagan": 83802, - "Ġpagar": 83799, - "Ġpage": 2150, - "ĠpageCount": 85751, - "ĠpageIndex": 59246, - "ĠpageInfo": 97267, - "ĠpageNo": 84882, - "ĠpageNum": 67571, - "ĠpageNumber": 60141, - "ĠpageSize": 22635, - "ĠpageTitle": 87221, - "Ġpageable": 70147, - "Ġpager": 52588, - "Ġpages": 6816, - "Ġpagina": 45965, - "Ġpaginate": 81974, - "Ġpagination": 28495, - "Ġpaginator": 69395, - "Ġpaging": 56287, - "Ġpago": 64377, - "Ġpai": 60600, - "Ġpaid": 7171, - "Ġpain": 6646, - "Ġpainful": 25118, - "Ġpainfully": 75599, - "Ġpains": 50166, - "Ġpainstaking": 97613, - "Ġpaint": 6177, - "Ġpainted": 23983, - "Ġpainter": 29481, - "Ġpainters": 96853, - "Ġpainting": 18824, - "Ġpaintings": 35592, - "Ġpaints": 56848, - "Ġpair": 6716, - "Ġpaired": 34426, - "Ġpairing": 47713, - "Ġpairs": 13530, - "Ġpairwise": 92759, - "Ġpais": 61283, - "Ġpaj": 90610, - "Ġpak": 38014, - "Ġpakistan": 85998, - "Ġpal": 10854, - "Ġpalabra": 72937, - "Ġpalabras": 73204, - "Ġpalace": 43339, - "Ġpalate": 76238, - "Ġpalavra": 94647, - "Ġpale": 27539, - "Ġpalette": 26308, - "Ġpalindrome": 73097, - "Ġpall": 66497, - "Ġpallet": 58803, - "Ġpalm": 32452, - "Ġpalms": 74718, - "Ġpalp": 74549, - "Ġpals": 83087, - "Ġpam": 41190, - "Ġpami": 137695, - "ĠpamiÄĻ": 137696, - "ĠpamiÄĻta": 137697, - "Ġpamph": 74831, - "Ġpan": 7215, - "Ġpanc": 53474, - "Ġpancakes": 79860, - "Ġpancre": 61168, - "Ġpancreatic": 97044, - "Ġpand": 12217, - "Ġpanda": 88222, - "Ġpandas": 18617, - "Ġpandemic": 27422, - "Ġpane": 37322, - "Ġpanel": 6945, - "Ġpanels": 21285, - "Ġpang": 96874, - "Ġpanic": 21975, - "Ġpanicked": 93010, - "Ġpanor": 67804, - "Ġpanorama": 91678, - "Ġpanoramic": 83257, - "Ġpans": 63783, - "Ġpant": 25279, - "Ġpantalla": 70024, - "Ġpanties": 55357, - "Ġpantry": 68257, - "Ġpants": 24549, - "Ġpap": 25298, - "Ġpapel": 69157, - "Ġpaper": 5567, - "Ġpaperback": 85731, - "Ġpapers": 15689, - "Ġpaperwork": 44631, - "Ġpar": 1346, - "Ġpara": 3348, - "Ġparach": 73945, - "Ġparachute": 98120, - "Ġparad": 27317, - "Ġparade": 36504, - "Ġparadigm": 48240, - "Ġparadise": 49752, - "Ġparadox": 51213, - "Ġparagraph": 14311, - "Ġparagraphs": 42643, - "Ġparalle": 57030, - "Ġparallel": 15279, - "Ġparallels": 71374, - "Ġparalysis": 85039, - "Ġparalyzed": 87868, - "Ġparam": 1685, - "ĠparamInt": 40750, - "ĠparamMap": 87056, - "ĠparamName": 90696, - "ĠparamString": 49641, - "Ġparameter": 5733, - "Ġparameters": 5029, - "Ġparametro": 75137, - "Ġparametros": 60405, - "Ġparamount": 73410, - "Ġparams": 3628, - "Ġparan": 47582, - "Ġparanoia": 82444, - "Ġparanoid": 68663, - "Ġparanormal": 91597, - "Ġparaph": 62230, - "Ġparas": 32303, - "Ġparasite": 84473, - "Ġparasites": 78283, - "Ġparc": 44640, - "Ġparce": 64921, - "Ġparcel": 29309, - "Ġparcels": 83927, - "Ġparch": 65202, - "Ġparchment": 86104, - "Ġpard": 89947, - "Ġpardon": 64168, - "Ġpare": 23191, - "Ġparece": 64017, - "Ġpared": 97011, - "Ġpareja": 74786, - "Ġparen": 37940, - "Ġparent": 2681, - "ĠparentId": 55885, - "ĠparentNode": 74955, - "Ġparental": 45579, - "Ġparentheses": 73975, - "Ġparenthesis": 95356, - "Ġparenting": 47958, - "Ġparents": 6562, - "Ġparfait": 85866, - "Ġpari": 66982, - "Ġparis": 40858, - "Ġparish": 51197, - "Ġparity": 49615, - "Ġpark": 6118, - "Ġparked": 42235, - "Ġparking": 12921, - "Ġparks": 26845, - "Ġparl": 43214, - "Ġparler": 88404, - "Ġparliament": 21130, - "Ġparliamentary": 43150, - "Ġparm": 59818, - "Ġparms": 58477, - "Ġparody": 66165, - "Ġparole": 48261, - "Ġpars": 10154, - "Ġparse": 4715, - "ĠparseFloat": 25763, - "ĠparseInt": 12891, - "Ġparsed": 15676, - "Ġparser": 6729, - "Ġparsers": 87073, - "Ġparses": 70835, - "Ġparsing": 22314, - "Ġparsley": 87521, - "Ġpart": 949, - "Ġpartager": 96348, - "Ġparte": 19538, - "Ġparted": 84056, - "Ġparten": 97294, - "Ġpartes": 80182, - "Ġparti": 78888, - "Ġpartial": 7130, - "Ġpartially": 25244, - "Ġpartic": 2536, - "Ġparticip": 5182, - "Ġparticipación": 140594, - "Ġparticipant": 24880, - "Ġparticipants": 13026, - "Ġparticipate": 15759, - "Ġparticipated": 30308, - "Ġparticipates": 90187, - "Ġparticipating": 23528, - "Ġparticipation": 20239, - "Ġparticipação": 140294, - "Ġparticle": 18790, - "Ġparticles": 18730, - "Ġparticul": 52908, - "Ġparticular": 3953, - "Ġparticularly": 7945, - "Ġparticulars": 85874, - "Ġparticulière": 136547, - "Ġpartida": 96547, - "Ġpartido": 73041, - "Ġpartie": 47801, - "Ġparties": 9677, - "Ġpartir": 30532, - "Ġpartisan": 48538, - "Ġpartition": 16658, - "Ġpartitions": 46688, - "Ġpartly": 27037, - "Ġpartner": 8263, - "Ġpartnered": 52219, - "Ġpartnering": 69120, - "Ġpartners": 8549, - "Ġpartnership": 15305, - "Ġpartnerships": 39605, - "Ġparts": 5479, - "Ġparty": 4614, - "Ġparça": 132831, - "Ġpas": 6368, - "Ġpasa": 86676, - "Ġpasado": 57416, - "Ġpasar": 66614, - "Ġpaso": 61677, - "Ġpass": 1494, - "Ġpassage": 21085, - "Ġpassages": 46769, - "Ġpasse": 38804, - "Ġpassed": 5823, - "Ġpassenger": 23148, - "Ġpassengers": 22172, - "Ġpasser": 44247, - "Ġpasses": 16211, - "Ġpassing": 12299, - "Ġpassion": 11677, - "Ġpassionate": 24425, - "Ġpassionately": 91825, - "Ġpassions": 57624, - "Ġpassive": 27879, - "Ġpassphrase": 75493, - "Ġpassport": 25458, - "Ġpassports": 74426, - "Ġpasswd": 52037, - "Ġpassword": 3552, - "Ġpasswords": 33716, - "Ġpassé": 80521, - "Ġpast": 3267, - "Ġpasta": 36447, - "Ġpaste": 24937, - "Ġpastor": 42944, - "Ġpastoral": 89271, - "Ġpastors": 91320, - "Ġpastry": 73055, - "Ġpasture": 88255, - "Ġpat": 3272, - "Ġpatch": 10900, - "Ġpatched": 71732, - "Ġpatches": 28660, - "Ġpatent": 24571, - "Ġpatented": 62612, - "Ġpatents": 45897, - "Ġpaternal": 92267, - "Ġpath": 1815, - "ĠpathMatch": 86018, - "Ġpathetic": 66063, - "Ġpathlib": 53159, - "Ġpathname": 39683, - "Ġpathogens": 77184, - "Ġpathological": 88861, - "Ġpathology": 75941, - "Ġpaths": 12716, - "Ġpathway": 37870, - "Ġpathways": 42914, - "Ġpatience": 29301, - "Ġpatient": 8720, - "Ġpatiently": 78161, - "Ġpatients": 6835, - "Ġpatio": 31178, - "Ġpatië": 142207, - "Ġpatiënt": 142208, - "Ġpatri": 28225, - "Ġpatriarch": 70221, - "Ġpatriot": 66517, - "Ġpatriotic": 76684, - "Ġpatriotism": 89342, - "Ġpatrol": 32522, - "Ġpatrols": 87042, - "Ġpatron": 35280, - "Ġpatrons": 51760, - "Ġpatt": 83067, - "Ġpatter": 91993, - "Ġpattern": 5383, - "Ġpatterns": 12624, - "Ġpau": 83195, - "Ġpaul": 67011, - "Ġpause": 18087, - "Ġpaused": 34495, - "Ġpauses": 85832, - "Ġpav": 39116, - "Ġpave": 93023, - "Ġpaved": 62575, - "Ġpavement": 64342, - "Ġpaving": 81468, - "Ġpaw": 76838, - "Ġpawn": 53455, - "Ġpay": 2291, - "Ġpayable": 44591, - "Ġpaycheck": 76979, - "Ġpayday": 52606, - "Ġpayer": 69275, - "Ġpaying": 12515, - "ĠpaylaÅŁ": 131056, - "Ġpayload": 7729, - "Ġpayloads": 89523, - "Ġpayment": 8160, - "Ġpayments": 14173, - "Ġpayoff": 84265, - "Ġpayout": 45888, - "Ġpayouts": 89529, - "Ġpaypal": 67793, - "Ġpayroll": 45108, - "Ġpays": 21241, - "Ġpaz": 79485, - "ĠpaÃŃs": 41665, - "ĠpaÃŃses": 70877, - "Ġpaź": 138111, - "Ġpaździ": 138112, - "Ġpaździern": 138113, - "Ġpaździernika": 138114, - "ĠpaÅĦst": 134434, - "ĠpaÅĦstw": 134435, - "Ġpb": 17310, - "Ġpc": 13312, - "Ġpca": 80896, - "Ġpcap": 94554, - "Ġpcb": 86240, - "Ġpci": 45471, - "Ġpcl": 51881, - "Ġpcm": 68647, - "Ġpcs": 70299, - "Ġpct": 81847, - "Ġpd": 7744, - "Ġpdata": 70311, - "Ġpdb": 47984, - "Ġpdf": 12782, - "Ġpdo": 90133, - "Ġpdu": 96969, - "Ġpe": 1051, - "Ġpea": 97663, - "Ġpeace": 8919, - "Ġpeaceful": 25650, - "Ġpeacefully": 66779, - "Ġpeach": 72088, - "Ġpeak": 16162, - "Ġpeaked": 77192, - "Ġpeaks": 38935, - "Ġpeanut": 49833, - "Ġpeanuts": 89077, - "Ġpear": 37690, - "Ġpearl": 69623, - "Ġpearls": 91632, - "Ġpeas": 46036, - "Ġpeasant": 88938, - "Ġpeasants": 75747, - "Ġpec": 30000, - "Ġpeculiar": 43697, - "Ġped": 10477, - "Ġpedal": 48601, - "Ġpedals": 86406, - "Ġpedest": 29226, - "Ġpedestal": 91655, - "Ġpedestrian": 46754, - "Ġpedestrians": 61458, - "Ġpediatric": 52066, - "Ġpedido": 51794, - "Ġpedig": 65682, - "Ġpedigree": 92954, - "Ġpee": 64138, - "Ġpeek": 32592, - "Ġpeel": 57112, - "Ġpeeled": 82512, - "Ġpeer": 14397, - "Ġpeers": 25029, - "Ġpeg": 30687, - "Ġpel": 11814, - "Ġpela": 32723, - "Ġpelic": 75333, - "Ġpellet": 67410, - "Ġpellets": 77320, - "Ġpelo": 27525, - "Ġpelos": 82839, - "Ġpelvic": 83068, - "ĠpelÃŃcul": 65740, - "ĠpelÃŃcula": 96216, - "Ġpem": 54184, - "Ġpemb": 63567, - "Ġpen": 5750, - "Ġpena": 94457, - "Ġpenal": 46326, - "Ġpenalties": 29986, - "Ġpenalty": 16346, - "Ġpenc": 65274, - "Ġpenchant": 98680, - "Ġpencil": 46118, - "Ġpencils": 96338, - "Ġpend": 41530, - "Ġpendant": 41744, - "Ġpending": 15280, - "Ġpenet": 31656, - "Ġpenetr": 43705, - "Ġpenetrate": 63755, - "Ġpenetrated": 96822, - "Ġpenetrating": 89200, - "Ġpenetration": 43496, - "Ġpeng": 36686, - "Ġpeninsula": 65395, - "Ġpenis": 22951, - "Ġpenn": 42949, - "Ġpenned": 77697, - "Ġpenny": 49069, - "Ġpens": 22601, - "Ġpensar": 93051, - "Ġpense": 72853, - "Ġpension": 27681, - "Ġpensions": 63763, - "Ġpensé": 140016, - "Ġpent": 20189, - "Ġpentru": 26220, - "Ġpeny": 92933, - "Ġpeople": 1251, - "Ġpeoples": 31438, - "Ġpep": 86595, - "Ġpepp": 82704, - "Ġpepper": 24353, - "Ġpeppers": 57473, - "Ġpeptide": 71149, - "Ġpeptides": 95334, - "Ġpequ": 80672, - "Ġpeque": 47367, - "Ġpequeña": 137005, - "Ġpequeño": 133894, - "Ġper": 817, - "Ġperc": 43463, - "Ġperce": 61722, - "Ġperceive": 44393, - "Ġperceived": 25536, - "Ġpercent": 3266, - "Ġpercentage": 11414, - "Ġpercentages": 53108, - "Ġpercentile": 65157, - "Ġpercept": 77532, - "Ġperception": 20431, - "Ġperceptions": 50766, - "Ġperch": 41883, - "Ġperchè": 138275, - "Ġperché": 60955, - "Ġpercussion": 83749, - "Ġperd": 40418, - "Ġperder": 77896, - "Ġperennial": 73618, - "Ġperf": 21784, - "Ġperfect": 4727, - "Ġperfected": 94146, - "Ġperfection": 38043, - "Ġperfectly": 13942, - "Ġperfil": 63112, - "Ġperfor": 83768, - "Ġperform": 2736, - "Ġperformance": 5068, - "Ġperformances": 23675, - "Ġperformed": 10660, - "Ġperformer": 48154, - "Ġperformers": 44418, - "Ġperforming": 16380, - "Ġperforms": 26674, - "Ġperfume": 66343, - "Ġperg": 89785, - "Ġperhaps": 8365, - "Ġperi": 61157, - "Ġperil": 59292, - "Ġperimeter": 46342, - "Ġperiod": 4168, - "Ġperiodic": 38345, - "Ġperiodically": 47482, - "Ġperiodo": 70455, - "Ġperiods": 18346, - "Ġperipheral": 34588, - "Ġperipherals": 90884, - "Ġperish": 82117, - "Ġperk": 65093, - "Ġperks": 57186, - "Ġperl": 56056, - "Ġperm": 13854, - "Ġpermalink": 79228, - "Ġperman": 11624, - "Ġpermanent": 15330, - "Ġpermanently": 30759, - "Ġperme": 54324, - "Ġpermet": 28457, - "Ġpermissible": 75245, - "Ġpermission": 7882, - "Ġpermissions": 8541, - "Ġpermit": 11549, - "Ġpermite": 51503, - "Ġpermits": 28690, - "Ġpermitted": 15129, - "Ġpermitting": 61074, - "Ġperms": 82282, - "Ġpermutation": 58441, - "Ġpermutations": 71949, - "Ġpero": 19438, - "Ġperpendicular": 76833, - "Ġperpet": 21585, - "Ġperpetr": 38354, - "Ġperpetrated": 92330, - "Ġperpetrator": 84536, - "Ġperpetrators": 65346, - "Ġperpetual": 65593, - "Ġperplex": 73152, - "Ġperror": 40731, - "Ġpers": 7413, - "Ġperse": 54150, - "Ġpersec": 37468, - "Ġpersecuted": 92598, - "Ġpersecution": 55429, - "Ġpersever": 72978, - "Ġperseverance": 98741, - "Ġpersist": 22334, - "Ġpersisted": 52995, - "Ġpersistence": 40956, - "Ġpersistent": 24999, - "Ġpersists": 66045, - "Ġperso": 76972, - "Ġperson": 1697, - "Ġpersona": 27955, - "Ġpersonal": 4345, - "Ġpersonalised": 84248, - "Ġpersonalities": 43808, - "Ġpersonality": 17294, - "Ġpersonalize": 80838, - "Ġpersonalized": 34549, - "Ġpersonally": 15726, - "Ġpersonals": 47730, - "Ġpersonas": 31425, - "Ġpersone": 60688, - "Ġpersonn": 96152, - "Ġpersonne": 53513, - "Ġpersonnel": 16849, - "Ġpersonnes": 47477, - "Ġpersons": 11186, - "Ġperspective": 13057, - "Ġperspectives": 38455, - "Ġpersu": 23685, - "Ġpersuade": 49941, - "Ġpersuaded": 64001, - "Ġpersuasion": 97124, - "Ġpersuasive": 65243, - "Ġpersön": 77420, - "Ġpersönlich": 134776, - "Ġpert": 18212, - "Ġpertaining": 45931, - "Ġpertinent": 61523, - "Ġperu": 91859, - "Ġperv": 46174, - "Ġpervasive": 70767, - "Ġperverse": 94804, - "Ġperò": 132085, - "ĠperÃŃ": 76082, - "ĠperÃŃodo": 86624, - "Ġpes": 18050, - "Ġpeso": 36935, - "Ġpesos": 84147, - "Ġpesquisa": 94630, - "Ġpessim": 72523, - "Ġpesso": 39575, - "Ġpessoa": 56630, - "Ġpessoas": 45962, - "Ġpest": 43785, - "Ġpestic": 44095, - "Ġpesticide": 83573, - "Ġpesticides": 60157, - "Ġpests": 74956, - "Ġpet": 6753, - "Ġpetals": 95640, - "Ġpeter": 93987, - "Ġpetit": 45010, - "Ġpetite": 37820, - "Ġpetites": 97285, - "Ġpetition": 20361, - "Ġpetitioner": 83403, - "Ġpetitions": 74454, - "Ġpetits": 85596, - "Ġpetrol": 57083, - "Ġpetroleum": 58963, - "Ġpets": 25103, - "Ġpetty": 60485, - "Ġpeu": 27700, - "Ġpeut": 24666, - "Ġpeuvent": 55211, - "Ġpeux": 93197, - "Ġpew": 61416, - "ĠpewnoÅĽci": 142372, - "ĠpewnoÅĽciÄħ": 142373, - "Ġpeça": 137395, - "ĠpeÅĤ": 143904, - "ĠpeÅĤne": 143905, - "Ġpf": 27418, - "Ġpg": 17495, - "Ġph": 1319, - "Ġphantom": 69708, - "Ġpharm": 15080, - "Ġpharmac": 35349, - "Ġpharmaceutical": 34310, - "Ġpharmacies": 76505, - "Ġpharmacist": 89294, - "Ġpharmacy": 32300, - "Ġphase": 10262, - "Ġphased": 85229, - "Ġphases": 34430, - "Ġphen": 14018, - "Ġphenomen": 16735, - "Ġphenomena": 43147, - "Ġphenomenal": 56392, - "Ġphenomenon": 24844, - "Ġphenotype": 81323, - "Ġphi": 22693, - "Ġphil": 10664, - "Ġphilanth": 57638, - "Ġphilippines": 79904, - "Ġphilosoph": 13556, - "Ġphilosopher": 54375, - "Ġphilosophers": 60687, - "Ġphilosophical": 40803, - "Ġphilosophy": 19128, - "Ġphishing": 98097, - "Ġphiên": 133234, - "Ġphiếu": 137535, - "Ġphoenix": 89715, - "Ġphon": 50823, - "Ġphone": 4540, - "ĠphoneNumber": 42088, - "Ġphones": 17619, - "Ġphosph": 31988, - "Ġphosphate": 78006, - "Ġphosphory": 93989, - "Ġphot": 4503, - "Ġphoto": 6548, - "Ġphotoc": 98236, - "Ġphotograph": 10300, - "Ġphotographed": 56203, - "Ġphotographer": 28767, - "Ġphotographers": 47177, - "Ġphotographic": 69064, - "Ġphotographs": 24248, - "Ġphotography": 23751, - "Ġphoton": 67910, - "Ġphotons": 88135, - "Ġphotos": 7249, - "Ġphotoshop": 98761, - "Ġphp": 24362, - "Ġphrase": 17133, - "Ġphrases": 31747, - "Ġphy": 36455, - "Ġphys": 4471, - "Ġphysic": 54024, - "Ġphysical": 6961, - "Ġphysically": 21893, - "Ġphysician": 27279, - "Ġphysicians": 34844, - "Ġphysicist": 82223, - "Ġphysicists": 97317, - "Ġphysics": 21321, - "Ġphysiological": 52094, - "Ġphysiology": 77052, - "Ġphysique": 63341, - "Ġphá": 129108, - "Ġpháp": 128513, - "Ġphát": 128362, - "Ġphân": 129036, - "Ġphé": 130223, - "Ġphép": 130224, - "Ġphê": 134634, - "Ġphòng": 128441, - "Ġphó": 142267, - "Ġphóng": 136607, - "Ġphù": 129831, - "Ġphú": 140116, - "Ġphúc": 133765, - "Ġphút": 130747, - "ĠphÃŃ": 128812, - "ĠphÃŃa": 129854, - "Ġphương": 128675, - "Ġphưá»Ŀng": 140515, - "Ġphạm": 130375, - "Ġphạt": 138675, - "Ġphải": 128282, - "Ġphản": 131084, - "Ġphấn": 142094, - "Ġphần": 128463, - "Ġphẩm": 79479, - "Ġphẫu": 140552, - "ĠpháºŃn": 134851, - "Ġphụ": 128877, - "Ġphục": 128904, - "Ġphá»§": 130388, - "Ġphức": 142244, - "Ġphá»ij": 128974, - "Ġphá»iji": 131628, - "Ġphá»ķ": 132175, - "Ġpi": 8938, - "Ġpian": 59066, - "Ġpiano": 26278, - "Ġpic": 10319, - "Ġpick": 3735, - "Ġpicked": 12771, - "Ġpicker": 31456, - "ĠpickerView": 88412, - "Ġpicking": 21132, - "Ġpickle": 22186, - "Ġpicks": 21895, - "Ġpickup": 29586, - "Ġpickups": 92038, - "Ġpicnic": 54462, - "Ġpics": 21356, - "Ġpict": 71729, - "Ġpicture": 6802, - "ĠpictureBox": 38009, - "Ġpictured": 41566, - "Ġpictures": 9185, - "Ġpicturesque": 73901, - "Ġpid": 14814, - "Ġpie": 4349, - "Ġpiece": 6573, - "Ġpieces": 9666, - "Ġpied": 43530, - "Ġpiel": 80846, - "Ġpien": 76226, - "ĠpieniÄħ": 142637, - "ĠpieniÄħd": 142638, - "ĠpieniÄħdze": 142639, - "Ġpier": 21944, - "Ġpierced": 88413, - "Ġpiercing": 59120, - "Ġpierws": 67460, - "Ġpies": 60677, - "Ġpig": 23694, - "Ġpige": 49355, - "Ġpigeon": 92544, - "Ġpiger": 38771, - "Ġpigment": 76578, - "Ġpigs": 48810, - "Ġpii": 74030, - "Ġpij": 65234, - "Ġpik": 47150, - "Ġpil": 11459, - "Ġpile": 26306, - "Ġpiled": 76331, - "Ġpiles": 58772, - "Ġpilgr": 54598, - "Ġpilgrimage": 89313, - "Ġpill": 15177, - "Ġpillar": 61207, - "Ġpillars": 63882, - "Ġpillow": 42325, - "Ġpillows": 65926, - "Ġpills": 25097, - "Ġpilot": 17708, - "Ġpilots": 35277, - "Ġpimp": 84348, - "Ġpin": 8983, - "ĠpinMode": 90552, - "Ġpinch": 49246, - "Ġpine": 33597, - "Ġpineapple": 77082, - "Ġping": 29998, - "Ġpink": 18217, - "Ġpinnacle": 98489, - "Ġpinned": 47709, - "Ġpinpoint": 66538, - "Ġpins": 26944, - "Ġpint": 45646, - "Ġpinterest": 61016, - "Ġpione": 28843, - "Ġpioneer": 52947, - "Ġpioneered": 95634, - "Ġpioneering": 70574, - "Ġpioneers": 82307, - "Ġpip": 23626, - "Ġpipe": 13647, - "Ġpipeline": 15301, - "Ġpipelines": 57673, - "Ġpipes": 31175, - "Ġpiping": 76479, - "Ġpir": 29611, - "Ġpiracy": 77212, - "Ġpirate": 53966, - "Ġpirates": 61475, - "Ġpis": 62314, - "Ġpisc": 67368, - "Ġpiss": 39940, - "Ġpissed": 63436, - "Ġpist": 23875, - "Ġpistol": 39436, - "Ġpistols": 83647, - "Ġpiston": 75325, - "Ġpit": 19838, - "Ġpitch": 9649, - "Ġpitched": 48998, - "Ġpitcher": 40970, - "Ġpitchers": 60550, - "Ġpitches": 48541, - "Ġpitching": 46441, - "Ġpitfalls": 80975, - "Ġpits": 61908, - "Ġpity": 56943, - "Ġpiv": 41330, - "Ġpivot": 26045, - "Ġpivotal": 59750, - "Ġpix": 31574, - "Ġpixel": 12955, - "Ġpixels": 15751, - "Ġpixmap": 84351, - "Ġpizza": 22502, - "Ġpizzas": 87770, - "Ġpiè": 69377, - "Ġpièce": 133472, - "Ġpiù": 22765, - "Ġpj": 72613, - "Ġpk": 22458, - "Ġpkg": 24793, - "Ġpkt": 34654, - "Ġpl": 625, - "Ġpla": 39752, - "Ġplaats": 73857, - "Ġplac": 28860, - "Ġplace": 1992, - "Ġplacebo": 42615, - "Ġplaced": 9099, - "Ġplaceholder": 5878, - "Ġplaceholders": 78428, - "Ġplacement": 21448, - "Ġplacements": 88393, - "Ġplacer": 71696, - "Ġplaces": 7482, - "Ġplacing": 24047, - "Ġplag": 38037, - "Ġplage": 85351, - "Ġplagiar": 67573, - "Ġplagiarism": 83898, - "Ġplague": 54437, - "Ġplagued": 65302, - "Ġplain": 14396, - "Ġplainly": 64295, - "Ġplains": 77366, - "Ġplaint": 23372, - "Ġplaintext": 60847, - "Ġplaintiff": 42002, - "Ġplaintiffs": 50564, - "Ġplais": 70268, - "Ġplaisir": 79310, - "Ġplan": 3119, - "Ġplane": 11031, - "Ġplanes": 24730, - "Ġplanet": 11580, - "Ġplanetary": 61838, - "Ġplanets": 32875, - "Ġplank": 72087, - "Ġplanned": 12909, - "Ġplanner": 49711, - "Ġplanners": 67452, - "Ġplanning": 9115, - "Ġplano": 84328, - "Ġplans": 6649, - "Ġplant": 6008, - "Ġplanta": 81665, - "Ġplantation": 81952, - "Ġplanted": 38341, - "Ġplanting": 47014, - "Ġplants": 10779, - "Ġplaque": 60364, - "Ġplasma": 31326, - "Ġplast": 87147, - "Ġplaster": 61927, - "Ġplastic": 12188, - "Ġplastics": 67286, - "Ġplat": 44989, - "Ġplata": 62786, - "Ġplataforma": 91208, - "Ġplate": 11968, - "Ġplateau": 64288, - "Ġplated": 87133, - "Ġplates": 24477, - "Ġplatform": 5339, - "Ġplatforms": 15409, - "Ġplatinum": 62227, - "Ġplausible": 49334, - "Ġplay": 1486, - "Ġplaya": 97440, - "Ġplayable": 51035, - "Ġplayback": 31959, - "Ġplaybook": 86053, - "Ġplayed": 6342, - "Ġplayer": 2781, - "ĠplayerId": 75961, - "ĠplayerName": 83547, - "Ġplayers": 4217, - "Ġplayful": 56069, - "Ġplayground": 41615, - "Ġplaying": 5619, - "Ġplaylist": 26791, - "Ġplaylists": 68808, - "Ġplayoff": 19380, - "Ġplayoffs": 30755, - "Ġplays": 11088, - "Ġplaywright": 98368, - "Ġplaza": 71998, - "Ġplc": 96462, - "Ġple": 7100, - "Ġplea": 38967, - "Ġplead": 72193, - "Ġpleaded": 38901, - "Ġpleading": 72973, - "Ġpleas": 87700, - "Ġpleasant": 23795, - "Ġpleasantly": 81274, - "Ġplease": 4486, - "Ġpleased": 18442, - "Ġpleasing": 53699, - "Ġpleasure": 16656, - "Ġpleasures": 71874, - "Ġpled": 29786, - "Ġpledge": 35079, - "Ġpledged": 42247, - "Ġpledges": 78018, - "Ġplein": 83771, - "Ġplentiful": 80726, - "Ġplenty": 11260, - "Ġplethora": 67606, - "Ġplight": 69975, - "Ġplist": 68635, - "Ġpll": 83080, - "Ġplot": 7089, - "Ġplots": 30694, - "Ġplotted": 67583, - "Ġplotting": 43902, - "Ġpls": 86605, - "Ġplt": 6516, - "Ġplug": 19633, - "Ġplugged": 58229, - "Ġplugin": 9006, - "Ġplugins": 17215, - "Ġplugs": 62534, - "Ġplum": 41172, - "Ġplumber": 88586, - "Ġplumbing": 43188, - "Ġplummet": 70178, - "Ġplunder": 87702, - "Ġplung": 52772, - "Ġplunge": 66578, - "Ġplunged": 74703, - "Ġplur": 59117, - "Ġplural": 38498, - "Ġplurality": 72305, - "Ġplus": 5519, - "Ġplush": 71679, - "Ġplusieurs": 50754, - "Ġplut": 59487, - "Ġplutôt": 95208, - "Ġply": 38573, - "Ġplywood": 87898, - "Ġpm": 8836, - "Ġpn": 43050, - "Ġpname": 64946, - "Ġpne": 43526, - "Ġpneum": 56123, - "Ġpneumonia": 68229, - "Ġpng": 36151, - "Ġpnl": 72693, - "Ġpo": 3193, - "Ġpoate": 78555, - "Ġpob": 76722, - "Ġpobl": 73575, - "Ġpoblación": 139202, - "Ġpobli": 142092, - "Ġpobliżu": 142093, - "Ġpoc": 56303, - "Ġpocket": 17822, - "Ġpockets": 29178, - "Ġpoco": 38794, - "ĠpoczÄħ": 135407, - "ĠpoczÄħtk": 135408, - "ĠpoczÄħtku": 135409, - "Ġpod": 7509, - "Ġpodcast": 17711, - "Ġpodcasts": 54246, - "Ġpode": 28194, - "Ġpodem": 62676, - "Ġpodemos": 62504, - "Ġpoder": 28538, - "Ġpoderá": 136866, - "Ġpodium": 58036, - "Ġpodr": 41915, - "Ġpodrá": 132608, - "Ġpodróż": 135038, - "ĠpodrÃŃa": 82442, - "Ġpods": 54587, - "ĠpodÃŃa": 140319, - "Ġpoem": 32794, - "Ġpoems": 44219, - "Ġpoet": 39260, - "Ġpoetic": 75434, - "Ġpoetry": 31249, - "Ġpoets": 72972, - "Ġpog": 80269, - "Ġpoi": 46927, - "Ġpoids": 96318, - "Ġpoignant": 92347, - "Ġpoil": 73511, - "Ġpoint": 1459, - "Ġpointed": 14283, - "Ġpointer": 7445, - "Ġpointers": 27454, - "Ġpointing": 21633, - "Ġpointless": 59691, - "Ġpoints": 3501, - "Ġpois": 57783, - "Ġpoised": 53846, - "Ġpoison": 20476, - "Ġpoisoned": 70498, - "Ġpoisoning": 51136, - "Ġpoisonous": 73408, - "Ġpoj": 87030, - "Ġpok": 44195, - "Ġpoke": 51551, - "Ġpokemon": 37651, - "Ġpoker": 20814, - "Ġpoking": 91363, - "Ġpol": 1471, - "Ġpolar": 24660, - "Ġpolarity": 75690, - "Ġpolarization": 82145, - "Ġpole": 25026, - "Ġpoles": 50779, - "Ġpolic": 8540, - "Ġpolice": 4282, - "Ġpoliceman": 78580, - "Ġpolicemen": 85119, - "Ġpolicies": 10186, - "Ġpolicing": 54571, - "Ġpolicy": 4842, - "Ġpolicym": 61418, - "Ġpolicymakers": 69878, - "Ġpolish": 44029, - "Ġpolished": 43361, - "Ġpolishing": 84463, - "Ġpolit": 3354, - "Ġpolite": 47787, - "Ġpolitely": 80767, - "Ġpolitic": 75937, - "Ġpolitical": 4948, - "Ġpolitically": 30105, - "Ġpolitician": 35938, - "Ġpoliticians": 18761, - "Ġpolitics": 11500, - "Ġpolitique": 77936, - "Ġpoll": 7085, - "Ġpolled": 83621, - "Ġpollen": 78684, - "Ġpolling": 30644, - "Ġpolls": 23056, - "Ġpollut": 70034, - "Ġpollutants": 82561, - "Ġpolluted": 94769, - "Ġpollution": 24761, - "Ġpolo": 77785, - "Ġpoly": 9861, - "Ġpolyester": 55070, - "Ġpolygon": 29372, - "Ġpolygons": 68159, - "Ġpolyline": 92241, - "Ġpolym": 44933, - "Ġpolymer": 46293, - "Ġpolynomial": 47311, - "Ġpolys": 98819, - "ĠpolÃŃt": 38844, - "ĠpolÃŃtica": 61489, - "ĠpolÃŃtico": 132168, - "Ġpom": 29484, - "Ġpomi": 141263, - "ĠpomiÄĻd": 141264, - "ĠpomiÄĻdzy": 141265, - "Ġpomoc": 94711, - "ĠpomocÄħ": 137292, - "Ġpomp": 72770, - "Ġpomys": 135669, - "ĠpomysÅĤ": 135670, - "Ġpon": 33923, - "Ġpond": 35570, - "Ġponder": 47783, - "Ġponds": 88355, - "Ġponer": 72723, - "Ġpong": 77622, - "Ġponiew": 134308, - "Ġponieważ": 134309, - "Ġpont": 36094, - "Ġponto": 74188, - "Ġpontos": 76115, - "Ġpony": 52636, - "Ġpoo": 82710, - "Ġpool": 7314, - "Ġpooled": 75376, - "Ġpooling": 74410, - "Ġpools": 33139, - "Ġpoop": 75816, - "Ġpoor": 7852, - "Ġpoorer": 65181, - "Ġpoorest": 67651, - "Ġpoorly": 30455, - "Ġpop": 2420, - "Ġpopcorn": 69705, - "Ġpope": 63272, - "Ġpopover": 89379, - "Ġpopped": 42233, - "Ġpopping": 49849, - "Ġpops": 47600, - "Ġpopul": 31749, - "Ġpopulace": 93820, - "Ġpopular": 5411, - "Ġpopularity": 22538, - "Ġpopulate": 30446, - "Ġpopulated": 34359, - "Ġpopulation": 7042, - "Ġpopulations": 21910, - "Ġpopulação": 138489, - "Ġpopulist": 68968, - "Ġpopulous": 94451, - "Ġpopup": 21960, - "Ġpor": 4154, - "Ġporcelain": 77642, - "Ġporch": 44647, - "Ġpore": 96451, - "Ġpores": 70928, - "Ġpork": 35067, - "Ġporn": 3480, - "Ġporno": 5850, - "Ġpornofil": 70270, - "Ġpornofilm": 89234, - "Ġpornografia": 95784, - "Ġpornography": 43787, - "Ġpornos": 39383, - "Ġpornost": 62423, - "Ġpornstar": 72183, - "Ġpornô": 47357, - "Ġpornôs": 90745, - "Ġporous": 93661, - "Ġporque": 27795, - "Ġporr": 48352, - "Ġporrf": 88817, - "Ġport": 2635, - "Ġporta": 60990, - "Ġportable": 22819, - "Ġportal": 23132, - "Ġportals": 75463, - "Ġporte": 59072, - "Ġporter": 87186, - "Ġportfolio": 19565, - "Ġportfolios": 75708, - "Ġportion": 13348, - "Ġportions": 19325, - "Ġportrait": 33033, - "Ġportraits": 58134, - "Ġportray": 24878, - "Ġportrayal": 73933, - "Ġportrayed": 44777, - "Ġportraying": 98497, - "Ġportrays": 96506, - "Ġports": 20325, - "Ġporém": 139567, - "Ġporówn": 142467, - "Ġporówna": 142468, - "Ġpos": 1133, - "ĠposX": 66690, - "ĠposY": 57797, - "Ġpose": 17040, - "Ġposed": 36160, - "Ġposes": 33003, - "Ġposi": 80893, - "Ġposible": 55032, - "Ġposicion": 63653, - "Ġposición": 90231, - "Ġposing": 51904, - "Ġposit": 20321, - "Ġposition": 2309, - "Ġpositional": 67547, - "Ġpositioned": 34228, - "Ġpositioning": 38725, - "Ġpositions": 9892, - "Ġpositive": 6785, - "Ġpositively": 39546, - "Ġpositives": 63656, - "Ġpositivity": 96942, - "Ġposix": 98343, - "Ġposição": 98194, - "Ġposs": 2229, - "Ġpossess": 15218, - "Ġpossessed": 42790, - "Ġpossesses": 49226, - "Ġpossessing": 59562, - "Ġpossession": 18721, - "Ġpossessions": 52535, - "Ġpossibile": 79946, - "Ġpossibilit": 66139, - "Ġpossibilities": 23607, - "Ġpossibility": 13038, - "Ġpossibilité": 137759, - "ĠpossibilitÃł": 133231, - "Ġpossible": 3204, - "Ġpossibly": 10767, - "Ġpossono": 81018, - "Ġpossui": 87274, - "ĠpossÃŃvel": 63181, - "Ġpost": 1736, - "ĠpostData": 54183, - "ĠpostId": 66030, - "Ġpostage": 77041, - "Ġpostal": 39754, - "Ġpostcode": 72836, - "Ġposte": 91046, - "Ġposted": 8454, - "Ġposter": 22361, - "Ġposterior": 44900, - "Ġposters": 38468, - "Ġpostfix": 68122, - "Ġpostgres": 59826, - "Ġposting": 17004, - "Ġpostings": 74481, - "Ġposto": 87599, - "Ġpostpon": 50001, - "Ġpostpone": 94658, - "Ġpostponed": 61620, - "Ġposts": 7999, - "Ġpostseason": 55371, - "Ġposture": 47278, - "Ġpot": 3338, - "Ġpotassium": 61175, - "Ġpotato": 38734, - "Ġpotatoes": 34167, - "Ġpotency": 76129, - "Ġpotent": 35775, - "Ġpotential": 4650, - "Ġpotentially": 13581, - "Ġpotentials": 94258, - "Ġpotion": 60108, - "Ġpotions": 78583, - "Ġpotrze": 88350, - "ĠpotrÃł": 142008, - "Ġpots": 50031, - "Ġpottery": 82663, - "Ġpou": 16836, - "Ġpouch": 55852, - "Ġpouco": 82837, - "Ġpoultry": 65528, - "Ġpound": 30023, - "Ġpounded": 94479, - "Ġpounding": 69527, - "Ġpounds": 16302, - "Ġpour": 4914, - "Ġpoured": 42933, - "Ġpouring": 50413, - "Ġpourquoi": 86220, - "Ġpourrait": 91115, - "Ġpours": 66707, - "Ġpouvez": 44266, - "Ġpouvoir": 67126, - "Ġpov": 55214, - "Ġpoverty": 19005, - "Ġpow": 6875, - "Ġpowder": 16723, - "Ġpowdered": 82483, - "Ġpower": 2355, - "Ġpowered": 22333, - "Ġpowerful": 7988, - "Ġpowerhouse": 74114, - "Ġpowering": 89900, - "Ġpowerless": 84352, - "Ġpowers": 13430, - "Ġpowsta": 140098, - "ĠpowstaÅĤ": 140099, - "Ġpoz": 40721, - "Ġpozosta": 139666, - "ĠpozostaÅĤ": 139667, - "Ġpożycz": 137108, - "Ġpożyczk": 137109, - "Ġpp": 11823, - "Ġppl": 88428, - "Ġppm": 63597, - "Ġpprint": 46446, - "Ġppt": 77484, - "Ġpq": 39639, - "Ġpr": 548, - "Ġpra": 44003, - "Ġprac": 60886, - "Ġpracownik": 139872, - "Ġpracowników": 139873, - "Ġpract": 3771, - "Ġpractical": 14976, - "Ġpractically": 31267, - "Ġpractice": 6588, - "Ġpracticed": 43564, - "Ġpractices": 12378, - "Ġpracticing": 35566, - "Ġpractise": 87588, - "Ġpractition": 30171, - "Ġpractitioner": 54372, - "Ġpractitioners": 42095, - "Ġpracy": 81209, - "ĠpracÄĻ": 138263, - "Ġprag": 51351, - "Ġpragma": 62120, - "Ġpragmatic": 74236, - "Ġpraise": 28388, - "Ġpraised": 36375, - "Ġpraises": 86078, - "Ġpraising": 80578, - "Ġprakt": 73455, - "Ġprank": 75273, - "Ġprat": 54644, - "Ġpratic": 97039, - "Ġpratique": 94134, - "Ġpraw": 53472, - "Ġpray": 23803, - "Ġprayed": 66697, - "Ġprayer": 22936, - "Ġprayers": 33196, - "Ġpraying": 51132, - "Ġpre": 855, - "Ġpreach": 70621, - "Ġpreached": 88094, - "Ġpreacher": 88753, - "Ġpreaching": 68323, - "Ġpreamble": 89454, - "Ġprec": 5833, - "Ġpreca": 40507, - "Ġprecarious": 92122, - "Ġprecaution": 71047, - "Ġprecautions": 59903, - "Ġpreced": 16201, - "Ġpreceded": 52480, - "Ġprecedence": 53056, - "Ġprecedent": 46791, - "Ġpreceding": 37746, - "Ġprecinct": 67899, - "Ġprecio": 36520, - "Ġprecios": 83781, - "Ġprecious": 26400, - "Ġprecip": 35741, - "Ġprecipitation": 59950, - "Ġprecis": 20234, - "Ġprecisa": 72766, - "Ġprecise": 23560, - "Ġprecisely": 23638, - "Ġprecision": 16052, - "Ġpreco": 83742, - "Ġprecondition": 79438, - "Ġprecursor": 70161, - "Ġpred": 4162, - "Ġpredator": 66906, - "Ġpredators": 55117, - "Ġpredatory": 87070, - "Ġpredecess": 30082, - "Ġpredecessor": 39174, - "Ġpredecessors": 61440, - "Ġpredefined": 63062, - "Ġpredetermined": 85910, - "Ġpredic": 78334, - "Ġpredicate": 24283, - "Ġpredicates": 80027, - "Ġpredict": 7023, - "Ġpredictable": 44107, - "Ġpredicted": 19149, - "Ġpredicting": 51897, - "Ġprediction": 19639, - "Ġpredictions": 19898, - "Ġpredictive": 59236, - "Ġpredictor": 61154, - "Ġpredictors": 94122, - "Ġpredicts": 55878, - "Ġpredis": 79532, - "Ġpredomin": 33964, - "Ġpredominant": 95431, - "Ġpredominantly": 46804, - "Ġpreds": 60721, - "Ġpreempt": 81747, - "Ġpref": 18735, - "Ġprefab": 75314, - "Ġprefect": 89445, - "Ġprefer": 10702, - "Ġpreferable": 69568, - "Ġpreferably": 51654, - "Ġpreference": 21933, - "Ġpreferences": 19322, - "Ġpreferred": 14890, - "ĠpreferredStyle": 63437, - "Ġpreferring": 97617, - "Ġprefers": 53964, - "Ġprefetch": 90477, - "Ġprefix": 9252, - "Ġprefixed": 81495, - "Ġprefixes": 62576, - "Ġprefs": 36013, - "Ġpreg": 19978, - "Ġpregn": 11925, - "Ġpregnancies": 81208, - "Ġpregnancy": 19636, - "Ġpregnant": 20280, - "Ġpregunta": 79340, - "Ġprejud": 33820, - "Ġprejudice": 47686, - "Ġprejudices": 98776, - "Ġprelim": 29613, - "Ġpreliminary": 32169, - "Ġpreload": 60457, - "Ġprem": 6811, - "Ġpremature": 41127, - "Ġprematurely": 87919, - "Ġpremier": 20496, - "Ġpremiere": 34852, - "Ġpremiered": 84070, - "Ġpremise": 40202, - "Ġpremises": 33922, - "Ġpremium": 14848, - "Ġpremiums": 47507, - "Ġpremière": 54033, - "Ġprenatal": 96028, - "Ġprend": 34356, - "Ġprendre": 58294, - "Ġpreocup": 87085, - "Ġpreorder": 71850, - "Ġprep": 21327, - "Ġprepaid": 82676, - "Ġprepar": 9872, - "Ġpreparation": 17975, - "Ġpreparations": 46879, - "Ġprepare": 10549, - "Ġprepared": 10030, - "ĠpreparedStatement": 55510, - "Ġprepares": 47442, - "Ġpreparing": 20045, - "Ġprepend": 73647, - "Ġpreprocess": 53465, - "Ġpreprocessing": 63631, - "Ġprer": 98861, - "Ġprere": 43901, - "Ġprerequisite": 79784, - "Ġprerequisites": 85258, - "Ġpres": 1652, - "Ġpreschool": 60805, - "Ġprescribe": 71233, - "Ġprescribed": 30931, - "Ġprescribing": 88344, - "Ġprescription": 22091, - "Ġprescriptions": 64735, - "Ġpreseason": 47574, - "Ġpresence": 9362, - "Ġpresent": 3042, - "ĠpresentViewController": 82448, - "Ġpresenta": 96080, - "Ġpresentation": 15496, - "Ġpresentations": 37380, - "Ġpresente": 53172, - "Ġpresented": 10449, - "Ġpresenter": 33656, - "Ġpresenting": 31544, - "Ġpresently": 49701, - "Ġpresents": 18404, - "Ġpresença": 140571, - "Ġpreservation": 45543, - "Ġpreserve": 21129, - "Ġpreserved": 33583, - "Ġpreserves": 74898, - "Ġpreserving": 46895, - "Ġpreset": 42921, - "Ġpresets": 62196, - "Ġpresidency": 31758, - "Ġpresident": 4767, - "Ġpresidente": 51385, - "Ġpresidential": 13318, - "Ġpresidents": 46508, - "Ġpress": 3493, - "Ġpressed": 17320, - "Ġpresses": 52963, - "Ġpressing": 25352, - "Ġpressure": 7262, - "Ġpressured": 74351, - "Ġpressures": 39750, - "Ġprest": 22298, - "Ġprestige": 65121, - "Ġprestigious": 40285, - "Ġpresum": 22277, - "Ġpresumably": 35448, - "Ġpresume": 77395, - "Ġpresumed": 61257, - "Ġpresumption": 86845, - "Ġpresup": 70292, - "Ġpret": 4410, - "Ġpretend": 34740, - "Ġpretended": 91740, - "Ġpretending": 54806, - "Ġpretext": 93814, - "Ġpretrained": 80669, - "Ġpretty": 5020, - "Ġprev": 7872, - "ĠprevState": 74946, - "Ġprevail": 65728, - "Ġprevailed": 84714, - "Ġprevailing": 60029, - "Ġpreval": 25344, - "Ġprevalence": 36909, - "Ġprevalent": 45841, - "Ġprevent": 5358, - "Ġpreventative": 96320, - "Ġprevented": 30998, - "Ġpreventing": 26160, - "Ġprevention": 26248, - "Ġpreventive": 70023, - "Ġprevents": 27934, - "Ġpreview": 17124, - "Ġpreviews": 56149, - "Ġprevious": 3681, - "Ġpreviously": 8597, - "Ġprey": 36593, - "Ġprez": 79942, - "Ġpreço": 97230, - "Ġpri": 12493, - "Ġprice": 3349, - "Ġpriced": 32605, - "Ġpriceless": 90944, - "Ġprices": 7576, - "Ġpricey": 78362, - "Ġpricing": 21219, - "Ġprick": 88700, - "Ġpride": 21770, - "Ġpriest": 27086, - "Ġpriesthood": 85616, - "Ġpriests": 41863, - "Ġprim": 8860, - "Ġprima": 35313, - "Ġprimal": 86181, - "Ġprimaries": 65412, - "Ġprimarily": 15503, - "Ġprimary": 6028, - "ĠprimaryKey": 65858, - "ĠprimaryStage": 89750, - "Ġprime": 10250, - "Ġprimeira": 67731, - "Ġprimeiro": 56081, - "Ġprimer": 26811, - "Ġprimera": 43669, - "Ġprimero": 70136, - "Ġprimes": 49433, - "Ġprimitive": 27594, - "Ġprimitives": 71194, - "Ġprimo": 61232, - "Ġprin": 63027, - "Ġprinc": 81560, - "Ġprince": 41726, - "Ġprinces": 83193, - "Ġprincess": 39588, - "Ġprincip": 7394, - "Ġprincipal": 12435, - "ĠprincipalColumn": 58801, - "ĠprincipalTable": 58651, - "Ġprincipales": 81412, - "Ġprincipally": 91281, - "Ġprincipalmente": 94337, - "Ġprincipals": 81039, - "Ġprincipio": 92053, - "Ġprinciple": 17508, - "Ġprinciples": 16170, - "ĠprincÃŃpio": 143160, - "Ġprint": 1173, - "Ġprintable": 41995, - "Ġprinted": 16709, - "Ġprinter": 22380, - "Ġprinters": 55953, - "Ġprintf": 4100, - "Ġprinting": 18484, - "Ġprintk": 58323, - "Ġprintln": 13751, - "Ġprints": 23473, - "Ġprio": 92908, - "Ġprior": 4867, - "Ġpriorit": 44677, - "Ġpriorities": 29501, - "Ġprioritize": 62552, - "Ġpriority": 10619, - "Ġpris": 51479, - "Ġprise": 84324, - "Ġprism": 93610, - "Ġprison": 9343, - "Ġprisoner": 41850, - "Ġprisoners": 27141, - "Ġprisons": 48329, - "Ġpristine": 64985, - "Ġpriv": 6095, - "Ġprivacy": 12345, - "Ġprivat": 37521, - "Ġprivate": 869, - "ĠprivateKey": 70565, - "Ġprivately": 37071, - "Ġprive": 33373, - "Ġprivile": 15531, - "Ġprivilege": 25551, - "Ġprivileged": 46261, - "Ġprivileges": 35732, - "Ġprivé": 134283, - "Ġprix": 37747, - "Ġprize": 21882, - "Ġprized": 86530, - "Ġprizes": 37408, - "Ġprm": 82719, - "Ġpro": 462, - "Ġproactive": 58214, - "Ġprob": 3566, - "Ġprobabil": 84093, - "Ġprobabilities": 48216, - "Ġprobability": 18927, - "Ġprobable": 34877, - "Ġprobably": 4658, - "Ġprobation": 45927, - "Ġprobe": 21730, - "Ġprobes": 62510, - "Ġprobing": 82972, - "Ġprobl": 50988, - "Ġproble": 2499, - "Ġproblem": 3491, - "Ġproblema": 41076, - "Ġproblemas": 53769, - "Ġproblematic": 34933, - "Ġproblems": 5322, - "Ġproblème": 79159, - "Ġprobs": 69370, - "Ġproc": 13674, - "Ġproced": 7103, - "Ġprocedural": 61681, - "Ġprocedure": 10324, - "Ġprocedures": 15966, - "Ġproceed": 10354, - "Ġproceeded": 44274, - "Ġproceeding": 38447, - "Ġproceedings": 28307, - "Ġproceeds": 33455, - "Ġproces": 28294, - "Ġproceso": 49009, - "Ġprocess": 1882, - "ĠprocessData": 94372, - "Ġprocessed": 15233, - "Ġprocesses": 11364, - "Ġprocessing": 8692, - "Ġprocession": 83714, - "Ġprocesso": 58896, - "Ġprocessor": 17654, - "Ġprocessors": 36586, - "Ġproclaim": 64984, - "Ġproclaimed": 61911, - "Ġproclamation": 95430, - "Ġprocrast": 96444, - "Ġprocur": 70502, - "Ġprocure": 79679, - "Ġprocurement": 52578, - "Ġprod": 14475, - "Ġprodu": 2497, - "Ġproducción": 91036, - "Ġproduce": 8193, - "Ġproduced": 8947, - "Ġproducer": 16851, - "Ġproducers": 23308, - "Ġproduces": 18644, - "Ġproducing": 17387, - "Ġproduct": 1985, - "ĠproductId": 42848, - "ĠproductList": 97592, - "ĠproductName": 65587, - "ĠproductService": 98995, - "Ġproduction": 5670, - "Ġproductions": 53148, - "Ġproductive": 26236, - "Ġproductivity": 25148, - "Ġproducto": 34774, - "Ġproductos": 41325, - "Ġproducts": 3871, - "Ġproduit": 53106, - "Ġproduits": 52921, - "Ġproduk": 60874, - "Ġprodukt": 72295, - "Ġproduktów": 137368, - "Ġproduto": 43670, - "Ġprodutos": 61862, - "Ġprodução": 134791, - "Ġprof": 2778, - "Ġprofes": 34708, - "Ġprofesional": 75248, - "Ġprofess": 34478, - "Ġprofession": 4808, - "Ġprofessional": 6584, - "Ġprofessionalism": 65329, - "Ġprofessionally": 44929, - "Ġprofessionals": 15387, - "Ġprofessionnel": 84405, - "Ġprofessions": 68692, - "Ġprofessor": 14227, - "Ġprofessors": 44624, - "Ġproficiency": 62139, - "Ġproficient": 68265, - "Ġprofil": 52354, - "Ġprofile": 5526, - "Ġprofiler": 87497, - "Ġprofiles": 20872, - "Ġprofiling": 55086, - "Ġprofit": 11372, - "Ġprofitability": 62236, - "Ġprofitable": 33135, - "Ġprofits": 21856, - "Ġprofound": 27155, - "Ġprofoundly": 65178, - "Ġprofund": 97570, - "Ġprog": 29271, - "Ġprogen": 83260, - "Ġprogn": 62803, - "Ġprognosis": 94250, - "Ġprogram": 2025, - "Ġprograma": 35760, - "Ġprogramas": 93839, - "Ġprogramm": 55486, - "Ġprogramma": 97139, - "Ġprogramme": 18136, - "Ġprogrammed": 55068, - "Ġprogrammer": 47788, - "Ġprogrammers": 54846, - "Ġprogrammes": 37637, - "Ġprogramming": 15473, - "Ġprograms": 7468, - "Ġprogress": 5098, - "ĠprogressBar": 47076, - "ĠprogressDialog": 57438, - "Ġprogressed": 61816, - "Ġprogresses": 67611, - "Ġprogressing": 75622, - "Ġprogression": 32724, - "Ġprogressive": 22257, - "Ġprogressively": 71759, - "Ġprogressives": 81759, - "Ġprohib": 14207, - "Ġprohibit": 47386, - "Ġprohibited": 25921, - "Ġprohibiting": 78366, - "Ġprohibition": 49867, - "Ġprohibits": 58438, - "Ġproj": 21333, - "Ġproject": 2390, - "ĠprojectId": 41696, - "ĠprojectName": 72516, - "Ġprojected": 27348, - "Ġprojectile": 37957, - "Ġprojectiles": 79037, - "Ġprojecting": 81282, - "Ġprojection": 21615, - "Ġprojections": 40479, - "Ġprojector": 67985, - "Ġprojects": 7079, - "Ġprojekt": 73894, - "Ġprojet": 45394, - "Ġprojeto": 68859, - "Ġprol": 28420, - "Ġprolet": 63117, - "Ġproletariat": 87247, - "Ġprolifer": 41936, - "Ġproliferation": 52740, - "Ġprolific": 62000, - "Ġprolong": 32382, - "Ġprolonged": 43287, - "Ġprom": 2706, - "Ġpromin": 44802, - "Ġprominence": 70099, - "Ġprominent": 20469, - "Ġprominently": 72988, - "Ġpromise": 11222, - "Ġpromised": 18951, - "Ġpromises": 20647, - "Ġpromising": 25383, - "Ġpromo": 26871, - "Ġpromot": 18408, - "Ġpromote": 11926, - "Ġpromoted": 28926, - "Ġpromoter": 65542, - "Ġpromoters": 94160, - "Ġpromotes": 38890, - "Ġpromoting": 22136, - "Ġpromotion": 20249, - "Ġpromotional": 34282, - "Ġpromotions": 35971, - "Ġprompt": 9934, - "Ġprompted": 28646, - "Ġprompting": 49645, - "Ġpromptly": 39422, - "Ġprompts": 50932, - "Ġpron": 18613, - "Ġprone": 36997, - "Ġpronounce": 87982, - "Ġpronounced": 37517, - "Ġpronto": 89698, - "Ġpronunciation": 70622, - "Ġproof": 11064, - "Ġproofs": 77159, - "Ġprop": 2004, - "ĠpropName": 90114, - "ĠpropTypes": 55516, - "Ġpropag": 16992, - "Ġpropaganda": 29517, - "Ġpropagate": 57414, - "Ġpropagated": 85050, - "Ġpropagation": 53643, - "Ġpropane": 90938, - "Ġpropel": 88383, - "Ġpropelled": 91685, - "Ġpropensity": 94223, - "Ġproper": 6169, - "Ġproperly": 10277, - "Ġproperties": 5888, - "Ġproperty": 3343, - "ĠpropertyName": 44276, - "Ġproph": 39234, - "Ġprophecy": 65784, - "Ġprophet": 52504, - "Ġprophets": 71668, - "Ġpropia": 97329, - "Ġpropiedad": 87623, - "Ġpropio": 91092, - "Ġproponents": 70696, - "Ġpropor": 70908, - "Ġproporcion": 79843, - "Ġproport": 32703, - "Ġproportion": 21117, - "Ġproportional": 54172, - "Ġproportions": 48792, - "Ġpropos": 9844, - "Ġproposal": 13734, - "Ġproposals": 24258, - "Ġpropose": 29614, - "Ġproposed": 10981, - "Ġproposes": 54625, - "Ġproposing": 56415, - "Ġproposition": 40080, - "Ġpropositions": 83273, - "Ġproposé": 139280, - "Ġpropre": 82087, - "Ġpropri": 21065, - "Ġpropriet": 53173, - "Ġproprietary": 33233, - "Ġproprietor": 91923, - "ĠproprietÃł": 141375, - "Ġproprio": 65910, - "Ġproprié": 143447, - "Ġpropriétaire": 143448, - "Ġpropriété": 142779, - "Ġprops": 6914, - "Ġpropulsion": 90128, - "Ġpropósito": 142043, - "Ġpros": 8709, - "Ġprose": 60701, - "Ġprosec": 12297, - "Ġprosecute": 65843, - "Ġprosecuted": 57459, - "Ġprosecuting": 97174, - "Ġprosecution": 31599, - "Ġprosecutions": 97411, - "Ġprosecutor": 35051, - "Ġprosecutors": 30820, - "Ġprospect": 21479, - "Ġprospective": 32447, - "Ġprospects": 26851, - "Ġprosper": 28661, - "Ġprosperity": 43102, - "Ġprosperous": 70307, - "Ġprost": 35221, - "Ġprostate": 46347, - "Ġprostit": 11197, - "Ġprostitu": 38622, - "Ġprostituer": 39924, - "Ġprostituerade": 42723, - "Ġprostituerte": 50617, - "Ġprostitut": 56180, - "Ġprostitutas": 20580, - "Ġprostitute": 65541, - "Ġprostitutes": 62582, - "Ġprostitution": 49750, - "Ġprot": 1724, - "Ġprotagon": 32986, - "Ġprotagonist": 45584, - "Ġprotagonists": 94635, - "Ġprote": 5425, - "Ġprotección": 142502, - "Ġprotect": 6016, - "Ġprotected": 2617, - "Ġprotecting": 22184, - "Ġprotection": 9135, - "Ġprotections": 36324, - "Ġprotective": 28119, - "Ġprotector": 62161, - "Ġprotects": 35136, - "Ġprotein": 12833, - "Ġproteins": 27796, - "Ġprotest": 8665, - "Ġprotested": 69405, - "Ġprotester": 93334, - "Ġprotesters": 25743, - "Ġprotesting": 58210, - "Ġprotestors": 88356, - "Ġprotests": 21907, - "Ġproto": 18433, - "Ġprotobuf": 69634, - "Ġprotocol": 11507, - "Ġprotocols": 31785, - "Ġproton": 81486, - "Ġprototype": 24052, - "Ġprototypes": 46628, - "Ġprotr": 80358, - "Ġproud": 12409, - "Ġproudly": 44809, - "Ġprov": 2543, - "Ġprova": 96893, - "Ġprove": 12118, - "Ġproved": 18651, - "Ġproven": 16622, - "Ġproverb": 78438, - "Ġproves": 35762, - "Ġprovid": 2059, - "Ġprovide": 3410, - "Ġprovided": 3897, - "ĠprovidedIn": 44010, - "Ġprovider": 9109, - "Ġproviders": 12565, - "Ġprovides": 5707, - "Ġproviding": 8241, - "Ġprovinc": 27807, - "Ġprovince": 16847, - "Ġprovinces": 39921, - "Ġprovincia": 78826, - "Ġprovincial": 34931, - "Ġproving": 38758, - "Ġprovision": 17136, - "Ġprovisional": 76990, - "Ġprovisioning": 97056, - "Ġprovisions": 19156, - "Ġprovoc": 41402, - "Ġprovocative": 65898, - "Ġprovoke": 71993, - "Ġprovoked": 75466, - "Ġprow": 47558, - "Ġprowess": 73060, - "Ġprox": 21542, - "Ġproxies": 59365, - "Ġproximity": 36743, - "Ġproximité": 141910, - "Ġproxy": 13291, - "Ġproyecto": 49851, - "Ġproyectos": 88743, - "Ġprt": 95684, - "Ġprudent": 73878, - "Ġprueba": 74990, - "Ġprune": 79526, - "Ġpruning": 85192, - "Ġprv": 84888, - "Ġpry": 81279, - "Ġprz": 21254, - "Ġprze": 30329, - "Ġprzec": 141118, - "Ġprzecież": 141119, - "Ġprzed": 49172, - "Ġprzegl": 141719, - "ĠprzeglÄħd": 141720, - "Ġprzez": 37624, - "Ġprzy": 30848, - "ĠprzykÅĤad": 133644, - "Ġprzypad": 97217, - "Ġprá": 63167, - "Ġpráctica": 134408, - "Ġprática": 134801, - "Ġprès": 83264, - "Ġpré": 26293, - "Ġpréc": 50525, - "Ġprécis": 132971, - "Ġprécéd": 140057, - "Ġprécédent": 140058, - "Ġprés": 29079, - "Ġprésence": 140201, - "Ġprésent": 56385, - "Ġprésente": 132047, - "Ġprésenté": 142133, - "Ġprésident": 88702, - "Ġprést": 143038, - "Ġpréstamo": 143039, - "Ġprévu": 140234, - "Ġprêt": 134827, - "Ġpró": 29291, - "Ġprób": 134276, - "Ġpróp": 71321, - "Ġprópria": 135321, - "Ġpróprio": 134453, - "Ġpróxima": 90207, - "Ġpróximo": 70798, - "Ġps": 4726, - "Ġpseud": 50643, - "Ġpseudo": 34750, - "Ġpsi": 38026, - "Ġpst": 43802, - "Ġpstmt": 49575, - "Ġpsy": 25142, - "Ġpsych": 8671, - "Ġpsyche": 87809, - "Ġpsyched": 60733, - "Ġpsychedelic": 80982, - "Ġpsychiat": 45776, - "Ġpsychiatric": 46557, - "Ġpsychiatrist": 72869, - "Ġpsychic": 49117, - "Ġpsycho": 41011, - "Ġpsychological": 23187, - "Ġpsychologically": 95555, - "Ġpsychologist": 53495, - "Ġpsychologists": 73091, - "Ġpsychology": 29918, - "Ġpsychosis": 97047, - "Ġpsychotic": 93141, - "Ġpsycopg": 86061, - "Ġpsz": 45083, - "Ġpt": 10817, - "Ġpthread": 19937, - "Ġptr": 10087, - "Ġpts": 29993, - "Ġpu": 18256, - "Ġpub": 6675, - "Ġpubb": 60149, - "Ġpuberty": 86298, - "Ġpubkey": 95116, - "Ġpubli": 77411, - "Ġpublic": 584, - "ĠpublicKey": 69347, - "Ġpublication": 16599, - "Ġpublications": 27985, - "Ġpublicity": 42663, - "Ġpublicly": 17424, - "Ġpublish": 3415, - "Ġpublished": 4652, - "Ġpublisher": 21262, - "Ġpublishers": 35617, - "Ġpublishes": 64485, - "Ġpublishing": 22913, - "Ġpublié": 139341, - "Ġpubs": 73762, - "Ġpuck": 48635, - "Ġpud": 84295, - "Ġpudd": 54582, - "Ġpudding": 81427, - "Ġpudo": 74725, - "Ġpueblo": 92441, - "Ġpued": 13419, - "Ġpueda": 89304, - "Ġpuede": 20673, - "Ġpueden": 40504, - "Ġpuedes": 58945, - "Ġpuedo": 80815, - "Ġpuerto": 89971, - "Ġpues": 68510, - "Ġpuesto": 84709, - "Ġpuff": 62072, - "Ġpuis": 43729, - "Ġpul": 7737, - "Ġpull": 6815, - "Ġpulled": 13238, - "Ġpulling": 22266, - "Ġpulls": 33045, - "Ġpulmonary": 69424, - "Ġpulp": 63088, - "Ġpuls": 54937, - "Ġpulse": 27235, - "Ġpulses": 65457, - "Ġpulumi": 88556, - "Ġpulver": 70155, - "Ġpump": 13834, - "Ġpumped": 61354, - "Ġpumping": 52126, - "Ġpumpkin": 49525, - "Ġpumps": 42775, - "Ġpun": 8310, - "Ġpunch": 20380, - "Ġpunched": 60918, - "Ġpunches": 60751, - "Ġpunching": 67881, - "Ġpunct": 31355, - "Ġpunctuation": 61503, - "Ġpund": 61112, - "Ġpundits": 78206, - "Ġpunish": 31051, - "Ġpunishable": 80570, - "Ġpunished": 40898, - "Ġpunishing": 74886, - "Ġpunishment": 24093, - "Ġpunishments": 89825, - "Ġpunitive": 81432, - "Ġpunk": 35758, - "Ġpunt": 31849, - "Ġpunto": 41514, - "Ġpuntos": 60889, - "Ġpup": 14895, - "Ġpupil": 59972, - "Ġpupils": 44072, - "Ġpupper": 72629, - "Ġpuppet": 49448, - "Ġpuppies": 56625, - "Ġpuppy": 41189, - "Ġpups": 89721, - "Ġpur": 3999, - "Ġpurch": 4902, - "Ġpurchase": 7627, - "Ġpurchased": 14733, - "Ġpurchaser": 76250, - "Ġpurchasers": 93655, - "Ġpurchases": 23491, - "Ġpurchasing": 22577, - "Ġpure": 10526, - "Ġpurely": 31127, - "Ġpurge": 54100, - "Ġpurification": 93436, - "Ġpurified": 91500, - "Ġpurity": 52400, - "Ġpurple": 24932, - "Ġpurported": 58760, - "Ġpurpos": 83796, - "Ġpurpose": 7428, - "Ġpurposely": 89087, - "Ġpurposes": 9895, - "Ġpurs": 9836, - "Ġpurse": 52001, - "Ġpursuant": 32449, - "Ġpursue": 22729, - "Ġpursued": 45431, - "Ġpursuing": 33018, - "Ġpursuit": 32336, - "Ġpursuits": 89787, - "Ġpus": 74576, - "Ġpush": 4484, - "ĠpushViewController": 62059, - "Ġpushed": 15391, - "Ġpushes": 40702, - "Ġpushing": 17461, - "Ġpuss": 83700, - "Ġpussy": 16189, - "Ġput": 2182, - "ĠputStrLn": 78598, - "Ġputa": 75390, - "Ġputas": 41824, - "Ġputchar": 89246, - "Ġpute": 24290, - "Ġputs": 9521, - "Ġputt": 90334, - "Ġputting": 10687, - "Ġpuzz": 31754, - "Ġpuzzle": 24626, - "Ġpuzzled": 86320, - "Ġpuzzles": 46523, - "Ġpuò": 50879, - "Ġpv": 33491, - "Ġpw": 26581, - "Ġpwd": 32706, - "Ġpwm": 64551, - "Ġpx": 17146, - "Ġpy": 4510, - "Ġpygame": 14699, - "Ġpyl": 34285, - "Ġpylab": 78414, - "Ġpylint": 50371, - "Ġpym": 45760, - "Ġpymongo": 84776, - "Ġpymysql": 95373, - "Ġpyplot": 70254, - "Ġpyramid": 46797, - "Ġpys": 66089, - "Ġpyt": 94671, - "Ġpytest": 27764, - "Ġpython": 10135, - "Ġpz": 97102, - "Ġpá": 64745, - "Ġpágina": 46301, - "Ġpä": 92364, - "ĠpÃ¥": 9114, - "Ġpé": 62932, - "Ġpérd": 143906, - "Ġpérdida": 143907, - "Ġpéri": 83311, - "Ġpériode": 136868, - "Ġpër": 93160, - "Ġpó": 127397, - "Ġpóź": 135696, - "Ġpóźniej": 135697, - "Ġpúb": 35905, - "Ġpública": 87949, - "Ġpúblico": 58950, - "ĠpÅĤ": 94232, - "ĠpÅĤyn": 140916, - "ĠpÅĤyt": 136434, - "ĠpÅĻ": 58306, - "Ġq": 2804, - "ĠqDebug": 34853, - "Ġqa": 88496, - "Ġqb": 75807, - "Ġqc": 77066, - "Ġqed": 49678, - "Ġqemu": 85108, - "Ġqi": 74105, - "Ġqint": 84717, - "Ġql": 66384, - "Ġqos": 92973, - "Ġqp": 62369, - "Ġqq": 55539, - "Ġqr": 49290, - "Ġqreal": 75574, - "Ġqry": 68960, - "Ġqs": 32421, - "Ġqt": 38949, - "Ġqty": 43185, - "Ġqu": 922, - "Ġqua": 73525, - "Ġquad": 27082, - "Ġquadr": 29136, - "Ġquadrant": 93286, - "Ġquadratic": 79151, - "Ġquaint": 87508, - "Ġquake": 87370, - "Ġqual": 5841, - "Ġqualche": 89016, - "Ġquale": 83484, - "Ġquali": 94525, - "Ġqualidade": 85883, - "Ġqualification": 45060, - "Ġqualifications": 42684, - "Ġqualified": 14988, - "Ġqualifier": 60647, - "Ġqualifiers": 82318, - "Ġqualifies": 79907, - "Ġqualify": 25384, - "Ġqualifying": 36114, - "Ġqualitative": 61029, - "Ġqualities": 28500, - "Ġquality": 4271, - "Ġqualité": 59028, - "ĠqualitÃł": 131848, - "Ġqualquer": 57799, - "Ġquam": 89839, - "Ġquand": 41576, - "Ġquando": 29705, - "Ġquant": 10272, - "Ġquantidade": 63015, - "Ġquantify": 75398, - "Ġquantitative": 46516, - "Ġquantities": 32676, - "Ġquantity": 12194, - "Ġquanto": 50112, - "Ġquantum": 30128, - "Ġquar": 36865, - "Ġquarantine": 70389, - "Ġquarry": 36070, - "Ġquart": 40276, - "Ġquarter": 8338, - "Ġquarterback": 19481, - "Ġquarterbacks": 60491, - "Ġquarterly": 50434, - "Ġquarters": 31473, - "Ġquartz": 51155, - "Ġquasi": 47744, - "Ġquat": 73221, - "Ġquaternion": 66775, - "Ġquatre": 98209, - "Ġque": 1709, - "Ġqued": 59186, - "Ġqueda": 90876, - "Ġqueen": 27906, - "Ġqueens": 68997, - "Ġqueer": 54541, - "Ġquel": 25025, - "Ġquella": 78282, - "Ġquelle": 73840, - "Ġquello": 63954, - "Ġquelque": 77971, - "Ġquelques": 44789, - "Ġquem": 57608, - "Ġquer": 29134, - "Ġqueried": 77902, - "Ġqueries": 19556, - "Ġquery": 3239, - "ĠqueryInterface": 94915, - "ĠqueryParams": 53469, - "ĠqueryString": 50679, - "Ġquerying": 81098, - "Ġqueryset": 39527, - "Ġques": 91384, - "Ġquest": 2222, - "Ġquesta": 51601, - "Ġquesti": 84681, - "Ġquestion": 3405, - "Ġquestionable": 43278, - "Ġquestioned": 28340, - "Ġquestioning": 33585, - "Ġquestionnaire": 47864, - "Ġquestions": 4755, - "Ġquesto": 33460, - "Ġquests": 49177, - "Ġquestão": 138521, - "Ġquestões": 143486, - "Ġqueue": 7177, - "Ġqueued": 57163, - "Ġqueues": 48094, - "Ġqui": 7774, - "Ġquick": 3974, - "Ġquicker": 38292, - "Ġquickest": 80510, - "Ġquickly": 6157, - "Ġquien": 43889, - "Ġquienes": 92390, - "Ġquiere": 73068, - "Ġquieres": 94295, - "Ġquiero": 91720, - "Ġquiet": 11340, - "Ġquieter": 89745, - "Ġquietly": 29566, - "Ġquil": 74864, - "Ġquilt": 60736, - "Ġquindi": 76608, - "Ġquint": 39657, - "Ġquir": 49626, - "Ġquirky": 67132, - "Ġquis": 48480, - "Ġquit": 16835, - "Ġquite": 5008, - "Ġquits": 69477, - "Ġquitting": 68084, - "Ġquiz": 27124, - "Ġquizzes": 88223, - "Ġquizá": 143876, - "Ġquo": 40508, - "Ġquoi": 74149, - "Ġquot": 26370, - "Ġquota": 42042, - "Ġquotas": 84818, - "Ġquotation": 54231, - "Ġquotations": 85987, - "Ġquote": 12641, - "Ġquoted": 23237, - "Ġquotes": 17194, - "Ġquotid": 98468, - "Ġquotient": 74762, - "Ġquoting": 56518, - "Ġquy": 126370, - "Ġquyết": 128784, - "Ġquyá»ģn": 128918, - "Ġquá": 128459, - "Ġquán": 133751, - "Ġquân": 129866, - "Ġqué": 42288, - "Ġquê": 135348, - "Ġquên": 135967, - "Ġquý": 129681, - "ĠquÃł": 135282, - "Ġquả": 128432, - "Ġquản": 129270, - "Ġquảng": 133503, - "Ġquần": 132543, - "ĠquáºŃn": 132859, - "Ġquá»ijc": 128664, - "Ġqw": 41178, - "Ġqx": 96030, - "Ġr": 435, - "Ġra": 15122, - "Ġrab": 30574, - "Ġrabbit": 38724, - "Ġrabbits": 69144, - "Ġrac": 8971, - "Ġrace": 6957, - "Ġraced": 71054, - "Ġracer": 84832, - "Ġraces": 20588, - "Ġracial": 19189, - "Ġracially": 74804, - "Ġracing": 21313, - "Ġracism": 25962, - "Ġracist": 24207, - "Ġrack": 29659, - "Ġracked": 99041, - "Ġracket": 81512, - "Ġracks": 65868, - "Ġrad": 8862, - "Ġradar": 27508, - "Ġradi": 11900, - "Ġradial": 56836, - "Ġradians": 50784, - "Ġradiant": 76343, - "Ġradiation": 24403, - "Ġradiator": 77090, - "Ġradical": 17855, - "Ġradically": 60027, - "Ġradicals": 73256, - "Ġradio": 8887, - "ĠradioButton": 75420, - "Ġradioactive": 58762, - "Ġradios": 70069, - "Ġradius": 10578, - "Ġradix": 75658, - "Ġraft": 52455, - "Ġrag": 20475, - "Ġragaz": 32433, - "Ġragazza": 76195, - "Ġragazze": 47599, - "Ġragazzi": 97136, - "Ġragazzo": 92998, - "Ġrage": 32949, - "Ġraging": 69417, - "Ġrah": 141846, - "Ġrahats": 141847, - "Ġrahatsız": 141848, - "Ġraid": 24797, - "Ġraided": 78396, - "Ġraids": 51481, - "Ġrail": 13569, - "Ġrailing": 91830, - "Ġrailroad": 50476, - "Ġrails": 42600, - "Ġrailway": 39006, - "Ġrailways": 95147, - "Ġrain": 11174, - "Ġrainbow": 47613, - "Ġrainfall": 52858, - "Ġraining": 83253, - "Ġrains": 61455, - "Ġrainy": 62757, - "Ġrais": 6369, - "Ġraise": 4828, - "Ġraised": 9226, - "Ġraises": 24886, - "Ġraising": 18545, - "Ġraison": 72073, - "Ġraj": 91428, - "Ġrak": 82944, - "Ġrake": 75418, - "Ġrall": 38819, - "Ġrallied": 75337, - "Ġrallies": 56331, - "Ġrally": 19217, - "Ġrallying": 90056, - "Ġram": 17823, - "Ġramifications": 84350, - "Ġramp": 22294, - "Ġrampage": 93063, - "Ġrampant": 62577, - "Ġramps": 86116, - "Ġran": 10613, - "Ġranch": 38061, - "Ġrand": 10382, - "Ġrandint": 53182, - "Ġrandom": 4194, - "ĠrandomNumber": 87720, - "Ġrandomized": 46241, - "Ġrandomly": 26618, - "Ġrandomness": 86690, - "Ġrang": 42100, - "Ġrange": 2088, - "Ġranged": 40729, - "Ġranger": 78059, - "Ġranges": 21283, - "Ġranging": 23994, - "Ġrank": 7077, - "Ġranked": 21006, - "Ġranking": 23001, - "Ġrankings": 32307, - "Ġranks": 20803, - "Ġransom": 57586, - "Ġrant": 56843, - "Ġrap": 7327, - "Ġrape": 16781, - "Ġraped": 39377, - "Ġrapes": 95230, - "Ġrapid": 11048, - "Ġrapide": 75508, - "Ġrapidement": 99098, - "Ġrapidly": 18512, - "Ġraping": 86446, - "Ġrapp": 60058, - "Ġrapper": 49337, - "Ġrapport": 38374, - "Ġrar": 95566, - "Ġrare": 8848, - "Ġrarely": 18521, - "Ġrarity": 58771, - "Ġras": 49910, - "Ġrash": 56242, - "Ġrasp": 84046, - "Ġraspberry": 93702, - "Ġraster": 47208, - "Ġrat": 11244, - "Ġrate": 4379, - "Ġrated": 21628, - "Ġrates": 7813, - "Ġrather": 4751, - "Ġratified": 96565, - "Ġrating": 10728, - "Ġratings": 18102, - "Ġratio": 11341, - "Ġration": 65801, - "Ġrational": 24438, - "Ġrationale": 56816, - "Ġratios": 41238, - "Ġrats": 31410, - "Ġratt": 56545, - "Ġrav": 42543, - "Ġrave": 90403, - "Ġraw": 7112, - "ĠrawData": 83160, - "Ġray": 18299, - "Ġrays": 44120, - "Ġraz": 23848, - "Ġrazor": 59130, - "Ġrazón": 140100, - "ĠraÄŁ": 134492, - "ĠraÄŁmen": 134493, - "Ġrb": 18717, - "Ġrc": 10192, - "Ġrd": 22694, - "Ġrdf": 66065, - "Ġrdr": 66984, - "Ġre": 312, - "Ġreach": 5545, - "Ġreachable": 68284, - "Ġreached": 8643, - "Ġreaches": 24491, - "Ġreaching": 18739, - "Ġreact": 13767, - "Ġreacted": 54741, - "Ġreacting": 73050, - "Ġreaction": 12720, - "Ġreactionary": 95138, - "Ġreactions": 24473, - "Ġreactive": 55463, - "Ġreactor": 37629, - "Ġreactors": 70473, - "Ġreacts": 68845, - "Ġread": 1349, - "ĠreadFile": 61732, - "ĠreadOnly": 61451, - "Ġreadability": 91494, - "Ġreadable": 33798, - "Ġreaddir": 80132, - "Ġreader": 6604, - "Ġreaders": 12726, - "Ġreadily": 30268, - "Ġreadiness": 61692, - "Ġreading": 5290, - "Ġreadings": 39074, - "Ġreadline": 74766, - "Ġreadme": 83684, - "Ġreadonly": 5762, - "Ġreads": 15804, - "Ġready": 5527, - "Ġreaff": 72000, - "Ġreal": 1931, - "Ġrealidad": 80504, - "Ġrealise": 38156, - "Ġrealised": 40093, - "Ġrealism": 68771, - "Ġrealistic": 25489, - "Ġrealistically": 88616, - "Ġrealities": 49346, - "Ġreality": 8729, - "Ġrealiz": 33760, - "Ġrealiza": 91735, - "Ġrealizado": 83045, - "Ġrealizar": 41558, - "Ġrealization": 48703, - "Ġrealize": 13083, - "Ġrealized": 15043, - "Ġrealizes": 51594, - "Ġrealizing": 43014, - "Ġrealloc": 66015, - "Ġreally": 2167, - "Ġrealm": 21889, - "Ġrealmente": 68847, - "Ġrealms": 76463, - "Ġrealpath": 91794, - "Ġrealtime": 84978, - "ĠrealtÃł": 134523, - "Ġreap": 56903, - "Ġrear": 14639, - "Ġrearr": 55327, - "Ġreason": 2874, - "Ġreasonable": 13276, - "Ġreasonably": 28446, - "Ġreasoned": 92369, - "Ġreasoning": 32711, - "Ġreasons": 7966, - "Ġreass": 31734, - "Ġreassure": 90047, - "Ġreassuring": 81864, - "Ġreb": 12366, - "Ġrebate": 89946, - "Ġrebel": 35317, - "Ġrebell": 41201, - "Ġrebellion": 52748, - "Ġrebels": 35623, - "Ġreboot": 34592, - "Ġrebound": 41532, - "Ġrebounds": 42662, - "Ġrebuild": 31493, - "Ġrebuilding": 55128, - "Ġrebuilt": 59585, - "Ġrebut": 83029, - "Ġrec": 1395, - "Ġrecal": 98683, - "Ġrecall": 19091, - "Ġrecalled": 31130, - "Ġrecalling": 88646, - "Ġrecalls": 40131, - "Ġrecap": 53999, - "Ġrece": 2166, - "Ġrecebe": 96730, - "Ġreceber": 90145, - "Ġreceipt": 22567, - "Ġreceipts": 56480, - "Ġreceive": 5258, - "Ġreceived": 3949, - "Ġreceiver": 13964, - "Ġreceivers": 39906, - "Ġreceives": 21189, - "Ġreceiving": 12308, - "Ġrecent": 3213, - "Ġrecently": 5926, - "Ġrecept": 28818, - "Ġreception": 23117, - "Ġreceptions": 80193, - "Ġreceptive": 87551, - "Ġreceptor": 34168, - "Ġreceptors": 43440, - "Ġrecess": 46762, - "Ġrecession": 38521, - "Ġrecharge": 46823, - "Ġrecher": 87717, - "Ġrecherche": 37217, - "Ġrecht": 67519, - "Ġrecib": 45269, - "Ġrecibir": 93180, - "Ġrecieved": 80892, - "Ġrecip": 24450, - "Ġrecipe": 11116, - "Ġrecipes": 18627, - "Ġrecipient": 21713, - "Ġrecipients": 33776, - "Ġrecipro": 66542, - "Ġreciprocal": 86198, - "Ġreck": 28199, - "Ġreckless": 53217, - "Ġreckon": 87465, - "Ġrecl": 47420, - "Ġreclaim": 57483, - "Ġreclaimed": 88659, - "Ġreco": 47655, - "Ġrecogn": 5829, - "Ġrecognise": 43817, - "Ġrecognised": 38664, - "Ġrecognition": 17843, - "Ġrecognizable": 65252, - "Ġrecognize": 15282, - "Ġrecognized": 14975, - "Ġrecognizer": 93159, - "Ġrecognizes": 44699, - "Ġrecognizing": 48083, - "Ġrecoil": 73322, - "Ġrecom": 37201, - "Ġrecomend": 70394, - "Ġrecomm": 4861, - "Ġrecommand": 83093, - "Ġrecommend": 6934, - "Ġrecommendation": 27682, - "Ġrecommendations": 18564, - "Ġrecommended": 11102, - "Ġrecommending": 64674, - "Ġrecommends": 39812, - "Ġrecon": 16070, - "Ġreconc": 31445, - "Ġreconcile": 63408, - "Ġreconciliation": 57655, - "Ġreconnaissance": 87505, - "Ġreconnect": 50036, - "Ġreconoc": 82911, - "Ġreconsider": 39075, - "Ġreconstruct": 43828, - "Ġreconstructed": 82004, - "Ġreconstruction": 42638, - "Ġrecord": 3255, - "Ġrecorded": 12433, - "Ġrecorder": 48835, - "Ġrecording": 14633, - "Ġrecordings": 37040, - "Ġrecords": 7424, - "Ġrecount": 40186, - "Ġrecounted": 88491, - "Ġrecounts": 94789, - "Ġrecourse": 92270, - "Ġrecover": 11731, - "Ġrecovered": 25335, - "Ġrecovering": 41286, - "Ġrecovery": 13351, - "Ġrecre": 22824, - "Ġrecreate": 52775, - "Ġrecreated": 36580, - "Ġrecreation": 45944, - "Ġrecreational": 36000, - "Ġrecru": 12117, - "Ġrecruit": 20309, - "Ġrecruited": 44325, - "Ġrecruiter": 96601, - "Ġrecruiters": 92840, - "Ġrecruiting": 31859, - "Ġrecruitment": 33002, - "Ġrecruits": 55097, - "Ġrect": 7608, - "Ġrectangle": 22756, - "Ġrectangles": 76192, - "Ġrectangular": 51424, - "Ġrects": 82656, - "Ġrecuper": 51521, - "Ġrecur": 63548, - "Ġrecurrence": 75193, - "Ġrecurrent": 64074, - "Ġrecurring": 45250, - "Ġrecurs": 24724, - "Ġrecurse": 73299, - "Ġrecursion": 50262, - "Ġrecursive": 30819, - "Ġrecursively": 52847, - "Ġrecursos": 59080, - "Ġrecv": 27006, - "Ġrecycl": 91365, - "Ġrecycle": 60743, - "Ġrecycled": 46558, - "ĠrecyclerView": 37149, - "Ġrecycling": 33878, - "Ġred": 2518, - "Ġredd": 62144, - "Ġreddit": 42174, - "Ġrede": 30165, - "Ġredeem": 48778, - "Ġredeemed": 83243, - "Ġredefine": 83275, - "Ġredemption": 55652, - "Ġredes": 46078, - "Ġredesign": 55619, - "Ġredesigned": 75472, - "Ġredevelopment": 87639, - "Ġredhead": 91705, - "Ġredirect": 6423, - "ĠredirectTo": 64698, - "Ġredirected": 48928, - "Ġredirection": 84059, - "Ġredirects": 71171, - "Ġredis": 20870, - "Ġredistrib": 8702, - "Ġredistribute": 9385, - "Ġredistributed": 73394, - "Ġredistribution": 71060, - "Ġredo": 57923, - "Ġredraw": 56259, - "Ġredu": 3595, - "Ġreduce": 7949, - "Ġreduced": 11046, - "Ġreducer": 37004, - "Ġreducers": 75209, - "Ġreduces": 25271, - "Ġreducing": 17719, - "Ġreduction": 13951, - "Ġreductions": 46211, - "Ġredund": 36573, - "Ġredundancy": 89373, - "Ġredundant": 47732, - "Ġredux": 67616, - "Ġreef": 70045, - "Ġreefs": 91722, - "Ġreel": 56282, - "Ġreelection": 92711, - "Ġreels": 78500, - "Ġref": 2053, - "Ġrefactor": 92295, - "Ġrefer": 8300, - "Ġrefere": 38908, - "Ġreferee": 54202, - "Ġreferees": 95826, - "Ġreference": 5785, - "Ġreferenced": 24784, - "ĠreferencedColumnName": 82347, - "Ġreferences": 15057, - "Ġreferencia": 81909, - "Ġreferencing": 56516, - "Ġreferendum": 29698, - "Ġreferral": 44780, - "Ġreferrals": 69301, - "Ġreferred": 13862, - "Ġreferring": 22023, - "Ġrefers": 19257, - "Ġrefill": 73715, - "Ġrefin": 59696, - "Ġrefine": 45364, - "Ġrefined": 37191, - "Ġrefinement": 72913, - "Ġrefinery": 93634, - "Ġrefining": 73185, - "Ġrefl": 82435, - "Ġreflect": 8708, - "Ġreflected": 25911, - "Ġreflecting": 41752, - "Ġreflection": 21844, - "Ġreflections": 62751, - "Ġreflective": 51728, - "Ġreflects": 25963, - "Ġreflex": 32666, - "Ġreflexivity": 68333, - "Ġreflux": 92162, - "Ġreform": 14836, - "Ġreforms": 30243, - "Ġrefr": 19353, - "Ġrefrain": 57508, - "Ġrefresh": 10408, - "ĠrefreshToken": 74541, - "Ġrefreshed": 65129, - "Ġrefreshing": 35918, - "Ġrefriger": 29377, - "Ġrefrigerator": 44944, - "Ġrefs": 43143, - "Ġrefuge": 14510, - "Ġrefugee": 33167, - "Ġrefugees": 21728, - "Ġrefund": 20965, - "Ġrefunded": 93452, - "Ġrefunds": 72518, - "Ġrefurb": 55656, - "Ġrefurbished": 82315, - "Ġrefusal": 43151, - "Ġrefuse": 25066, - "Ġrefused": 16051, - "Ġrefuses": 40616, - "Ġrefusing": 37989, - "Ġrefute": 83177, - "Ġreg": 1217, - "Ġregain": 48555, - "Ġregained": 84925, - "Ġregard": 5250, - "Ġregarded": 26361, - "Ġregarding": 8826, - "Ġregardless": 15484, - "Ġregards": 23935, - "Ġregelm": 142832, - "ĠregelmÃ¤ÃŁig": 142833, - "Ġregenerate": 79451, - "Ġregenerated": 70353, - "Ġregeneration": 59417, - "Ġregex": 20180, - "Ġregexp": 41877, - "Ġregime": 17484, - "Ġregimen": 67028, - "Ġregiment": 74441, - "Ġregimes": 60811, - "Ġregion": 5537, - "Ġregional": 15130, - "Ġregions": 13604, - "Ġregist": 31247, - "Ġregister": 4161, - "Ġregistered": 9681, - "Ġregistering": 38729, - "Ġregisters": 24740, - "Ġregistr": 22855, - "Ġregistrado": 96311, - "Ġregistrar": 61467, - "Ġregistration": 12227, - "Ġregistrations": 69490, - "Ġregistrazione": 95835, - "Ġregistro": 36785, - "Ġregistros": 63527, - "Ġregistry": 19424, - "Ġregião": 134306, - "Ġregión": 141661, - "Ġregress": 69780, - "Ġregression": 30549, - "Ġregret": 22231, - "Ġregrets": 67925, - "Ġregs": 44498, - "Ġregul": 14089, - "Ġregular": 5792, - "Ġregularization": 87294, - "Ġregularly": 15502, - "Ġregulate": 36277, - "Ġregulated": 34219, - "Ġregulates": 79312, - "Ġregulating": 57399, - "Ġregulation": 19256, - "Ġregulations": 14305, - "Ġregulator": 39604, - "Ġregulators": 39142, - "Ġregulatory": 22515, - "Ġrehab": 26778, - "Ġrehabilit": 88166, - "Ġrehabilitation": 43338, - "Ġrehe": 47206, - "Ġrehears": 68572, - "Ġrehearsal": 88855, - "Ġreife": 46161, - "Ġreign": 30302, - "Ġreigning": 89956, - "Ġreim": 43987, - "Ġreimb": 97578, - "Ġreimburse": 95160, - "Ġreimbursement": 70011, - "Ġrein": 15244, - "Ġreinc": 94707, - "Ġreinforce": 54314, - "Ġreinforced": 48580, - "Ġreinforcement": 71278, - "Ġreinforcements": 98500, - "Ġreinforces": 94493, - "Ġreinforcing": 90015, - "Ġreins": 89418, - "Ġreinst": 68667, - "Ġreinstall": 91861, - "Ġreint": 75167, - "Ġreinterpret": 25186, - "Ġreiterated": 65747, - "Ġrej": 77367, - "Ġreject": 7850, - "Ġrejected": 17551, - "Ġrejecting": 62586, - "Ġrejection": 36901, - "Ġrejects": 59415, - "Ġrejo": 46941, - "Ġrejoice": 91759, - "Ġrejuven": 72384, - "Ġrek": 77281, - "Ġrekl": 99080, - "Ġrel": 1351, - "Ġrelacion": 46005, - "Ġrelaciones": 96573, - "Ġrelación": 68197, - "Ġrelat": 90803, - "Ġrelate": 28143, - "Ġrelated": 5435, - "Ġrelates": 35616, - "Ġrelating": 22527, - "Ġrelation": 12687, - "Ġrelational": 71183, - "Ġrelations": 4300, - "Ġrelationship": 5025, - "Ġrelationships": 11871, - "Ġrelativ": 58325, - "Ġrelative": 8674, - "Ġrelatively": 12040, - "Ġrelatives": 28558, - "Ġrelax": 11967, - "Ġrelaxation": 42585, - "Ġrelaxed": 30367, - "Ġrelaxing": 33848, - "Ġrelay": 31851, - "Ġrelação": 96103, - "Ġrele": 13733, - "Ġrelease": 4879, - "Ġreleased": 5880, - "Ġreleases": 19232, - "Ġreleasing": 27865, - "Ġreleg": 58682, - "Ġrelegated": 86452, - "Ġrelent": 42846, - "Ġrelentless": 59035, - "Ġrelentlessly": 90170, - "Ġrelev": 78315, - "Ġrelevance": 40861, - "Ġrelevant": 9760, - "Ġreli": 9375, - "Ġreliability": 30538, - "Ġreliable": 14720, - "Ġreliably": 56382, - "Ġreliance": 53080, - "Ġreliant": 88127, - "Ġrelic": 60937, - "Ġrelics": 98416, - "Ġrelie": 58544, - "Ġrelied": 39913, - "Ġrelief": 15957, - "Ġrelies": 33644, - "Ġrelieve": 47739, - "Ġrelieved": 50412, - "Ġrelig": 6694, - "Ġreligion": 13587, - "Ġreligions": 43130, - "Ġreligious": 10381, - "Ġrelinqu": 84398, - "Ġreload": 18646, - "ĠreloadData": 57847, - "Ġreloading": 85630, - "Ġreloc": 74295, - "Ġrelocate": 69572, - "Ġrelocated": 69109, - "Ġrelocation": 59895, - "Ġrelu": 92874, - "Ġreluct": 30244, - "Ġreluctance": 82950, - "Ġreluctant": 42940, - "Ġreluctantly": 83085, - "Ġrely": 17188, - "Ġrelying": 38561, - "Ġrem": 1299, - "Ġremain": 7146, - "Ġremainder": 26313, - "Ġremained": 14616, - "Ġremaining": 9664, - "Ġremains": 8458, - "Ġremake": 58055, - "Ġremar": 83128, - "Ġremark": 13841, - "Ġremarkable": 22804, - "Ġremarkably": 48623, - "Ġremarked": 60314, - "Ġremarks": 23325, - "Ġrematch": 92226, - "Ġremed": 33530, - "Ġremedies": 50136, - "Ġremedy": 39139, - "Ġremember": 6099, - "Ġremembered": 26471, - "Ġremembering": 47284, - "Ġremembers": 42357, - "Ġremin": 42550, - "Ġremind": 23974, - "Ġreminded": 30156, - "Ġreminder": 26528, - "Ġreminders": 65597, - "Ġreminding": 62942, - "Ġreminds": 34610, - "Ġreminis": 48579, - "Ġreminiscent": 54985, - "Ġremix": 56366, - "Ġremnants": 72340, - "Ġremodel": 45986, - "Ġremodeling": 69330, - "Ġremorse": 78057, - "Ġremot": 35793, - "Ġremote": 8699, - "Ġremotely": 38429, - "Ġremovable": 53791, - "Ġremoval": 16652, - "Ġremove": 4057, - "ĠremoveAll": 65099, - "ĠremoveFrom": 57785, - "ĠremoveFromSuperview": 77180, - "ĠremoveObject": 81622, - "Ġremoved": 6963, - "Ġremover": 76248, - "Ġremoves": 28160, - "Ġremoving": 17592, - "Ġrempl": 68141, - "Ġren": 5672, - "Ġrenal": 62815, - "Ġrename": 29074, - "Ġrenamed": 27280, - "Ġrenaming": 92890, - "Ġrencont": 8875, - "Ġrencontr": 65183, - "Ġrencontre": 10391, - "Ġrencontrer": 89926, - "Ġrencontres": 26820, - "Ġrend": 17191, - "Ġrender": 3141, - "ĠrenderItem": 86667, - "Ġrendered": 22383, - "Ġrenderer": 19715, - "Ġrendering": 20898, - "Ġrenders": 44282, - "Ġrendez": 65551, - "Ġrendition": 82865, - "Ġrendre": 96954, - "Ġrenegot": 98677, - "Ġrenew": 13873, - "Ġrenewable": 32168, - "Ġrenewables": 87985, - "Ġrenewal": 42801, - "Ġrenewed": 35546, - "Ġrenov": 31552, - "Ġrenovated": 56834, - "Ġrenovation": 49455, - "Ġrenovations": 77564, - "Ġrenown": 33717, - "Ġrenowned": 35948, - "Ġrent": 8016, - "Ġrental": 18645, - "Ġrentals": 47004, - "Ġrented": 48859, - "Ġrenters": 91851, - "Ġrenting": 52227, - "Ġrents": 61990, - "Ġreopen": 36759, - "Ġreopened": 77781, - "Ġreopening": 93400, - "Ġreorder": 83184, - "Ġreordered": 49032, - "Ġrep": 2064, - "Ġrepaint": 85689, - "Ġrepair": 12733, - "Ġrepaired": 51734, - "Ġrepairing": 67237, - "Ġrepairs": 30186, - "Ġrepar": 75926, - "Ġrepay": 53338, - "Ġrepayment": 70018, - "Ġrepe": 6219, - "Ġrepeal": 39579, - "Ġrepealed": 85914, - "Ġrepeat": 13153, - "Ġrepeated": 11504, - "Ġrepeatedly": 18822, - "Ġrepeating": 39816, - "Ġrepeats": 43594, - "Ġrepell": 87774, - "Ġrepent": 62178, - "Ġreperc": 73388, - "Ġrepercussions": 80809, - "Ġrepertoire": 76668, - "Ġrepet": 26330, - "Ġrepetition": 53415, - "Ġrepetitions": 84966, - "Ġrepetitive": 58077, - "Ġrepl": 5791, - "Ġreplace": 8290, - "Ġreplaced": 12575, - "Ġreplacement": 13723, - "Ġreplacements": 53055, - "Ġreplaces": 40700, - "Ġreplacing": 24891, - "Ġreplay": 34485, - "Ġreplen": 69443, - "Ġreplic": 28541, - "Ġreplica": 36954, - "Ġreplicas": 80801, - "Ġreplicate": 45013, - "Ġreplicated": 71380, - "Ġreplication": 47791, - "Ġreplied": 19995, - "Ġreplies": 30637, - "Ġreply": 9851, - "Ġrepmat": 79339, - "Ġrepo": 15867, - "Ġreport": 1895, - "Ġreported": 4961, - "Ġreportedly": 17828, - "Ġreporter": 18960, - "Ġreporters": 19040, - "Ġreporting": 12827, - "Ġreports": 6682, - "Ġrepos": 45774, - "Ġrepositories": 49657, - "Ġrepository": 12542, - "Ġrepost": 94187, - "Ġrepr": 30636, - "Ġrepreh": 77837, - "Ġrepresent": 4009, - "Ġrepresenta": 95115, - "Ġrepresentation": 13042, - "Ġrepresentations": 43613, - "Ġrepresentative": 18239, - "Ġrepresentatives": 23130, - "Ġrepresented": 15251, - "Ġrepresenting": 14064, - "Ġrepresents": 10868, - "Ġrepression": 71398, - "Ġreprint": 80471, - "Ġrepro": 52723, - "Ġreprodu": 14503, - "Ġreproduce": 22800, - "Ġreproduced": 54617, - "Ġreproduction": 38556, - "Ġreproductive": 41789, - "Ġreprés": 70825, - "Ġreprésent": 90578, - "Ġreprésente": 140786, - "Ġreps": 40411, - "Ġrept": 63773, - "Ġrepublic": 34444, - "Ġrepublican": 90436, - "Ġreput": 42739, - "Ġreputable": 55840, - "Ġreputation": 17011, - "Ġreputed": 91972, - "Ġreq": 4232, - "Ġrequ": 5892, - "Ġrequer": 66687, - "Ġrequest": 1681, - "ĠrequestBody": 85626, - "ĠrequestCode": 55374, - "ĠrequestData": 97264, - "ĠrequestId": 69861, - "ĠrequestOptions": 91094, - "Ġrequested": 11223, - "Ġrequester": 83584, - "Ġrequesting": 34692, - "Ġrequests": 7388, - "Ġrequire": 1373, - "Ġrequired": 2567, - "Ġrequirement": 16287, - "Ġrequirements": 8502, - "Ġrequires": 7460, - "Ġrequiring": 22703, - "Ġrequis": 44582, - "Ġrequisite": 81680, - "Ġrer": 48547, - "Ġres": 592, - "Ġresale": 98224, - "Ġresc": 12912, - "Ġrescue": 17186, - "Ġrescued": 44333, - "Ġresearch": 3412, - "Ġresearched": 55998, - "Ġresearcher": 31085, - "Ġresearchers": 11811, - "Ġresearching": 44143, - "Ġresembl": 66320, - "Ġresemblance": 68900, - "Ġresemble": 51180, - "Ġresembled": 95758, - "Ġresembles": 52191, - "Ġresembling": 70607, - "Ġresend": 93888, - "Ġresent": 46440, - "Ġresentment": 70554, - "Ġreserv": 21196, - "Ġreserva": 98644, - "Ġreservation": 27667, - "Ġreservations": 40062, - "Ġreserve": 20499, - "Ġreserved": 4591, - "Ġreserves": 29500, - "Ġreservoir": 44412, - "Ġreset": 7585, - "Ġresets": 66197, - "Ġresett": 90388, - "Ġresetting": 78028, - "Ġresh": 63693, - "Ġreshape": 43809, - "Ġresid": 21151, - "Ġreside": 47283, - "Ġresidence": 21682, - "Ġresidences": 84771, - "Ġresidency": 52866, - "Ġresident": 18967, - "Ġresidential": 20057, - "Ġresidents": 10826, - "Ġresides": 52968, - "Ġresiding": 66412, - "Ġresidual": 32147, - "Ġresiduals": 97540, - "Ġresidue": 48132, - "Ġresidues": 70683, - "Ġresign": 23592, - "Ġresignation": 43634, - "Ġresigned": 39107, - "Ġresil": 36030, - "Ġresilience": 54962, - "Ġresilient": 58680, - "Ġresin": 53514, - "Ġresist": 22106, - "Ġresistance": 13643, - "Ġresistant": 30685, - "Ġresisted": 66314, - "Ġresisting": 69341, - "Ġresistor": 77636, - "Ġresizable": 97083, - "Ġresize": 20925, - "ĠresizeMode": 98579, - "Ġresized": 58549, - "Ġresizing": 86243, - "Ġresolution": 10935, - "Ġresolutions": 42495, - "Ġresolve": 8830, - "Ġresolved": 19673, - "Ġresolver": 36220, - "Ġresolves": 63297, - "Ġresolving": 52483, - "Ġreson": 28180, - "Ġresonance": 56981, - "Ġresonate": 88886, - "Ġresort": 21788, - "Ġresorts": 60445, - "Ġresource": 5101, - "ĠresourceId": 97246, - "ĠresourceName": 98485, - "Ġresources": 4963, - "Ġresp": 9039, - "Ġrespawn": 96032, - "Ġrespect": 5091, - "Ġrespectable": 61386, - "Ġrespected": 30287, - "Ġrespectful": 48050, - "Ġrespectfully": 92345, - "Ġrespecting": 68415, - "Ġrespective": 19511, - "Ġrespectively": 15576, - "Ġrespecto": 88060, - "Ġrespects": 42566, - "Ġrespir": 32415, - "Ġrespiratory": 41531, - "Ġrespond": 5889, - "Ġresponded": 16441, - "Ġrespondent": 66888, - "Ġrespondents": 33181, - "Ġresponder": 64034, - "Ġresponders": 69539, - "Ġresponding": 29338, - "Ġresponds": 30580, - "ĠrespondsToSelector": 62293, - "Ġrespons": 4200, - "Ġresponsable": 76832, - "Ġresponse": 2033, - "ĠresponseBody": 98065, - "ĠresponseData": 67445, - "ĠresponseObject": 69040, - "ĠresponseType": 90444, - "Ġresponses": 14507, - "Ġresponsibilities": 27323, - "Ġresponsibility": 11752, - "Ġresponsible": 8480, - "Ġresponsibly": 86288, - "Ġresponsive": 25988, - "Ġresponsiveness": 98939, - "Ġresponsável": 141402, - "Ġresposta": 74506, - "Ġrespuesta": 43360, - "Ġrest": 2732, - "ĠrestTemplate": 79829, - "Ġresta": 96952, - "Ġrestart": 17024, - "Ġrestarted": 80654, - "Ġrestarting": 92524, - "Ġrestaur": 7544, - "Ġrestaurant": 10729, - "Ġrestaurants": 15556, - "Ġreste": 65067, - "Ġrested": 65429, - "Ġresting": 40119, - "Ġrestitution": 89209, - "Ġrestless": 88258, - "Ġresto": 62716, - "Ġrestoration": 33993, - "Ġrestore": 14952, - "Ġrestored": 27003, - "Ġrestores": 87755, - "Ġrestoring": 49103, - "Ġrestr": 15583, - "Ġrestrain": 96776, - "Ġrestrained": 76200, - "Ġrestraining": 83293, - "Ġrestraint": 58356, - "Ġrestrict": 8891, - "Ġrestricted": 21739, - "Ġrestricting": 64851, - "Ġrestriction": 19455, - "Ġrestrictions": 16869, - "Ġrestrictive": 56996, - "Ġrestroom": 88809, - "Ġrestructuring": 67927, - "Ġrests": 53231, - "Ġresult": 1102, - "ĠresultCode": 42631, - "ĠresultList": 71596, - "ĠresultMap": 90461, - "ĠresultSet": 41973, - "Ġresultado": 26192, - "Ġresultados": 46722, - "Ġresultant": 83813, - "Ġresultat": 90272, - "Ġresulted": 19006, - "Ġresulting": 12942, - "Ġresults": 3059, - "Ġresume": 15688, - "Ġresumed": 57405, - "Ġresumes": 65213, - "Ġresurgence": 90490, - "Ġresurrect": 65719, - "Ġresurrection": 61432, - "Ġret": 2112, - "ĠretVal": 34730, - "Ġretail": 10806, - "Ġretailer": 36791, - "Ġretailers": 29182, - "Ġretain": 14060, - "Ġretained": 34263, - "Ġretaining": 50010, - "Ġretains": 51844, - "Ġretal": 50146, - "Ġretali": 90055, - "Ġretaliation": 60349, - "Ġretard": 75972, - "Ġretarded": 97359, - "Ġretention": 37131, - "Ġrethink": 75655, - "Ġretina": 83727, - "Ġretir": 81679, - "Ġretire": 15800, - "Ġretired": 21583, - "Ġretirees": 96723, - "Ġretirement": 20950, - "Ġretiring": 59773, - "Ġretorn": 87594, - "Ġretorna": 71675, - "Ġretorno": 50132, - "Ġretour": 53506, - "Ġretr": 37731, - "Ġretract": 72200, - "Ġretreat": 30014, - "Ġretreated": 90937, - "Ġretrie": 10759, - "Ġretries": 60601, - "Ġretrieval": 56370, - "Ġretrieve": 17179, - "Ġretrieved": 30403, - "Ġretrieves": 70671, - "Ġretrieving": 48224, - "Ġretro": 16771, - "Ġretrofit": 24653, - "Ġretros": 48358, - "Ġretrospect": 76553, - "Ġretrospective": 78829, - "Ġretry": 22683, - "Ġreturn": 470, - "ĠreturnType": 84509, - "ĠreturnUrl": 95012, - "ĠreturnValue": 41597, - "Ġreturned": 5927, - "Ġreturning": 13451, - "Ġreturns": 4675, - "Ġretval": 22625, - "Ġreun": 34640, - "Ġreunion": 57284, - "Ġreunited": 76879, - "Ġreusable": 61571, - "Ġreuse": 25978, - "ĠreuseIdentifier": 52660, - "Ġreused": 68743, - "Ġrev": 5772, - "Ġrevamped": 95496, - "Ġreve": 6195, - "Ġreveal": 16400, - "Ġrevealed": 10457, - "Ġrevealing": 30620, - "Ġreveals": 20992, - "Ġrevel": 22118, - "Ġrevelation": 38910, - "Ġrevelations": 49808, - "Ġreven": 18909, - "Ġrevenge": 36069, - "Ġrevenue": 12957, - "Ġrevenues": 29366, - "Ġrever": 35137, - "Ġrevered": 84661, - "Ġreverence": 97364, - "Ġrevers": 17431, - "Ġreversal": 58114, - "Ġreverse": 9931, - "Ġreversed": 27437, - "Ġreversible": 80093, - "Ġreversing": 75183, - "Ġrevert": 41128, - "Ġreverted": 93593, - "Ġreview": 3395, - "Ġreviewed": 21926, - "Ġreviewer": 55514, - "Ġreviewers": 59038, - "Ġreviewing": 33888, - "Ġreviews": 8379, - "Ġrevis": 17493, - "Ġrevise": 64736, - "Ġrevised": 31728, - "Ġrevision": 23578, - "Ġrevisions": 53762, - "Ġrevisit": 64778, - "Ġrevital": 78855, - "Ġrevival": 56005, - "Ġrevive": 58716, - "Ġrevived": 68275, - "Ġrevoke": 72038, - "Ġrevoked": 64346, - "Ġrevolt": 64835, - "Ġrevolution": 13791, - "Ġrevolutionary": 29091, - "Ġrevolutions": 92474, - "Ġrevolver": 97798, - "Ġrevolves": 78376, - "Ġrevolving": 86026, - "Ġrew": 78622, - "Ġreward": 11313, - "Ġrewarded": 43837, - "Ġrewarding": 40993, - "Ġrewards": 21160, - "Ġrewind": 77665, - "Ġrewrite": 18130, - "Ġrewriting": 94445, - "Ġrewritten": 58524, - "Ġrex": 86510, - "Ġrez": 48058, - "Ġrf": 36026, - "Ġrfl": 69335, - "Ġrg": 18361, - "Ġrgb": 17993, - "Ġrgba": 23524, - "Ġrh": 21669, - "Ġrhe": 67032, - "Ġrhet": 28386, - "Ġrhetoric": 33631, - "Ġrhetorical": 85968, - "Ġrho": 31381, - "Ġrhs": 12916, - "Ġrhyme": 96934, - "Ġrhyth": 28071, - "Ġrhythm": 36290, - "Ġrhythms": 80721, - "Ġri": 24185, - "Ġrib": 20131, - "Ġribbon": 44567, - "Ġribs": 55149, - "Ġric": 29950, - "Ġrice": 19653, - "Ġricerca": 82035, - "Ġrich": 9080, - "ĠrichTextBox": 97429, - "Ġricher": 58674, - "Ġriches": 69834, - "Ġrichest": 56371, - "Ġrichness": 88930, - "Ġricht": 61430, - "Ġrichtig": 65681, - "Ġrico": 93598, - "Ġrid": 9279, - "Ġridden": 92227, - "Ġride": 11877, - "Ġrider": 37126, - "Ġriders": 29703, - "Ġrides": 31227, - "Ġridge": 57833, - "Ġridic": 19965, - "Ġridicule": 93747, - "Ġridiculous": 26775, - "Ġridiculously": 71911, - "Ġriding": 19837, - "Ġrien": 54355, - "Ġries": 53598, - "Ġrif": 36924, - "Ġriff": 80250, - "Ġrifle": 28132, - "Ġrifles": 45370, - "Ġrift": 77157, - "Ġrig": 13249, - "Ġrigged": 80073, - "Ġright": 1290, - "Ġrighteous": 41705, - "Ġrighteousness": 70229, - "Ġrightful": 97944, - "Ġrightfully": 98024, - "Ġrightly": 53366, - "Ġrights": 3188, - "Ġrigid": 32856, - "Ġrigor": 77377, - "Ġrigorous": 46899, - "Ġrigs": 95051, - "Ġrij": 69345, - "Ġrim": 30130, - "Ġrims": 97162, - "Ġrin": 53721, - "Ġring": 10058, - "Ġringing": 67043, - "Ġrings": 24544, - "Ġrins": 96039, - "Ġrinse": 73241, - "Ġrio": 94704, - "Ġriot": 41497, - "Ġriots": 59996, - "Ġrip": 23288, - "Ġripe": 56696, - "Ġripped": 42992, - "Ġripping": 77114, - "Ġripple": 69625, - "Ġris": 9824, - "Ġrise": 10000, - "Ġrisen": 40382, - "Ġrises": 37168, - "Ġrising": 16062, - "Ġrisk": 5214, - "Ġrisking": 84922, - "Ġrisks": 15276, - "Ġrisky": 40173, - "Ġrisult": 88112, - "Ġrit": 21198, - "Ġrites": 98452, - "Ġritual": 27179, - "Ġrituals": 56579, - "Ġriv": 43129, - "Ġrival": 20762, - "Ġrivalry": 59922, - "Ġrivals": 34838, - "Ġriver": 14796, - "Ġrivers": 35517, - "Ġriê": 130007, - "Ġriêng": 130008, - "Ġrk": 58006, - "Ġrl": 38877, - "Ġrm": 18998, - "Ġrms": 79994, - "Ġrn": 55839, - "Ġrnd": 37193, - "Ġrng": 28422, - "Ġrnn": 86400, - "Ġro": 926, - "Ġroad": 5636, - "Ġroadmap": 68817, - "Ġroads": 19241, - "Ġroadside": 79643, - "Ġroadway": 81111, - "Ġroam": 74967, - "Ġroaming": 68253, - "Ġroar": 77624, - "Ġroaring": 92756, - "Ġroast": 57685, - "Ġroasted": 53562, - "Ġrob": 10550, - "Ġrobbed": 62254, - "Ġrobber": 70550, - "Ġrobbery": 43114, - "Ġrobe": 62619, - "Ġrobert": 88893, - "Ġrobes": 70168, - "Ġrobin": 98585, - "Ġrobot": 12305, - "Ġrobotic": 58001, - "Ġrobotics": 73606, - "Ġrobots": 28707, - "Ġrobust": 21765, - "Ġroc": 63330, - "Ġrock": 6946, - "Ġrocked": 77260, - "Ġrocker": 95126, - "Ġrocket": 24306, - "Ġrockets": 51998, - "Ġrocking": 66624, - "Ġrocks": 23035, - "Ġrocky": 55517, - "Ġrod": 20589, - "Ġrode": 40661, - "Ġrodents": 93109, - "Ġrods": 56900, - "Ġrodz": 79541, - "Ġrog": 94156, - "Ġrogue": 53891, - "Ġroi": 44413, - "Ġroku": 55302, - "Ġrol": 17679, - "Ġrole": 3476, - "ĠroleId": 69645, - "ĠroleName": 90947, - "Ġroles": 12783, - "Ġroll": 6502, - "Ġrollback": 60414, - "Ġrolled": 22447, - "Ġroller": 28451, - "Ġrollers": 88613, - "Ġrolling": 20097, - "Ġrollout": 71730, - "Ġrolls": 27373, - "Ġrom": 9882, - "Ġroma": 57467, - "Ġroman": 47776, - "Ġromance": 29263, - "Ġromant": 67467, - "Ġromantic": 23467, - "Ġrond": 88681, - "Ġroof": 15134, - "Ġroofing": 65425, - "Ġroofs": 76295, - "Ġrooft": 55605, - "Ġrooftop": 66192, - "Ġrookie": 30525, - "Ġrookies": 99009, - "Ġroom": 3054, - "ĠroomId": 77506, - "Ġroommate": 69314, - "Ġrooms": 12026, - "Ġroot": 3704, - "ĠrootNode": 77975, - "ĠrootReducer": 84608, - "ĠrootView": 51886, - "Ġrooted": 40876, - "Ġrooting": 86338, - "Ġroots": 19703, - "Ġrop": 48395, - "Ġrope": 33420, - "Ġropes": 63946, - "Ġros": 26190, - "Ġrosa": 95244, - "Ġrose": 16009, - "Ġroses": 60641, - "Ġrospy": 35578, - "Ġroster": 21445, - "Ġrot": 5749, - "Ġrotary": 61817, - "Ġrotate": 16919, - "Ġrotated": 45620, - "Ġrotates": 89059, - "Ġrotating": 41396, - "Ġrotation": 12695, - "Ġrotational": 91271, - "Ġrotations": 69201, - "Ġrotor": 62025, - "Ġrotten": 77692, - "Ġrotterdam": 70429, - "Ġrou": 28365, - "Ġrouge": 83959, - "Ġrough": 11165, - "Ġroughly": 17267, - "Ġroulette": 48111, - "Ġround": 4778, - "Ġrounded": 17976, - "Ġrounding": 51562, - "Ġrounds": 19531, - "Ġroundup": 86669, - "Ġrout": 8242, - "Ġroute": 6021, - "Ġrouted": 72217, - "Ġrouter": 9273, - "Ġrouters": 59175, - "Ġroutes": 11291, - "Ġroutine": 14021, - "Ġroutinely": 38976, - "Ġroutines": 29497, - "Ġrouting": 29058, - "Ġrover": 61252, - "Ġrow": 2802, - "ĠrowCount": 65145, - "ĠrowData": 73658, - "ĠrowIndex": 51438, - "ĠrowNum": 99035, - "Ġrows": 6978, - "Ġrowspan": 51288, - "Ġroy": 54242, - "Ġroyal": 29236, - "Ġroyalties": 84874, - "Ġroyalty": 52717, - "Ġroz": 38752, - "Ġrozp": 140775, - "Ġrozpoc": 140776, - "ĠrozpoczÄĻ": 140777, - "ĠrozwiÄħz": 128126, - "ĠrozwiÄħzania": 142027, - "ĠrozwiÄħzanie": 140491, - "ĠroÅĽ": 139443, - "ĠroÅĽlin": 139444, - "Ġrp": 33109, - "Ġrpc": 35596, - "Ġrpm": 49925, - "Ġrpt": 94952, - "Ġrq": 60602, - "Ġrr": 34393, - "Ġrs": 10036, - "Ġrsa": 68570, - "Ġrsp": 42160, - "Ġrss": 71082, - "Ġrst": 55515, - "Ġrt": 16677, - "Ġrtc": 71842, - "Ġrte": 77391, - "Ġrtl": 61060, - "Ġrtn": 56335, - "Ġrtrim": 84465, - "Ġru": 11122, - "Ġrua": 89910, - "Ġrub": 10273, - "Ġrubbed": 66754, - "Ġrubber": 22674, - "Ġrubbing": 55935, - "Ġrubbish": 60924, - "Ġrubble": 73435, - "Ġruby": 45207, - "Ġrud": 67230, - "Ġrude": 46001, - "Ġrue": 55849, - "Ġrug": 28642, - "Ġrugby": 46450, - "Ġrugged": 54783, - "Ġrugs": 72571, - "Ġruin": 37239, - "Ġruined": 46068, - "Ġruining": 91171, - "Ġruins": 45662, - "Ġrule": 5912, - "Ġruled": 21286, - "Ġruler": 47980, - "Ġrulers": 59896, - "Ġrules": 5601, - "Ġruling": 17408, - "Ġrulings": 77588, - "Ġrum": 13995, - "Ġrumor": 57901, - "Ġrumored": 69368, - "Ġrumors": 34392, - "Ġrumours": 64925, - "Ġrumpe": 98580, - "Ġrun": 1598, - "ĠrunApp": 84680, - "Ġrunaway": 90640, - "Ġrund": 40897, - "Ġrundown": 94648, - "Ġrune": 63499, - "Ġrunes": 79918, - "Ġrunnable": 78679, - "Ġrunner": 22259, - "Ġrunners": 38280, - "Ġrunning": 4303, - "Ġrunoff": 78052, - "Ġruns": 8473, - "Ġruntime": 15592, - "Ġrunway": 51761, - "Ġrupt": 59953, - "Ġrupture": 88769, - "Ġrural": 19082, - "Ġrus": 52454, - "Ġrush": 12973, - "Ġrushed": 32241, - "Ġrushes": 94222, - "Ġrushing": 37017, - "Ġruss": 63563, - "Ġrusse": 91539, - "Ġrussian": 63145, - "Ġrust": 23071, - "Ġrustic": 57272, - "Ġrusty": 97453, - "Ġrut": 54619, - "Ġruta": 67463, - "Ġruth": 53146, - "Ġruthless": 68410, - "Ġrv": 17570, - "Ġrval": 62846, - "Ġrw": 25991, - "Ġrx": 19111, - "Ġry": 33919, - "Ġrz": 53001, - "Ġrá": 48669, - "Ġráp": 69738, - "Ġrápida": 135290, - "Ġrápido": 97320, - "Ġrãi": 142423, - "Ġrè": 82129, - "Ġrègle": 136072, - "Ġré": 9333, - "Ġréal": 58057, - "Ġréalis": 85495, - "Ġréalisé": 137883, - "Ġréalité": 141307, - "Ġrécup": 78096, - "Ġréfé": 90458, - "Ġréférence": 140500, - "Ġrég": 37582, - "Ġrégime": 137269, - "Ġrégion": 87000, - "Ġrégl": 139240, - "Ġrépond": 74771, - "Ġréponse": 89409, - "Ġrés": 30707, - "Ġréseau": 97847, - "Ġréserve": 141595, - "Ġrésult": 64185, - "Ġrésultat": 133078, - "Ġrésultats": 99146, - "Ġréuss": 83688, - "Ġréussi": 135750, - "Ġrê": 141138, - "Ġrêve": 141139, - "Ġrówn": 60374, - "Ġrównież": 67741, - "Ġróż": 79944, - "Ġróżne": 136528, - "Ġróżnic": 143614, - "Ġróżnych": 134713, - "Ġrôle": 137614, - "Ġrõ": 129398, - "Ġrút": 137335, - "ĠrÃłng": 135111, - "ĠrÄĥng": 131771, - "ĠrÄĻk": 135182, - "ĠrÆ¡i": 136978, - "Ġrượ": 136287, - "Ġrượu": 136288, - "Ġrất": 128323, - "Ġrằng": 128640, - "Ġrẻ": 130908, - "Ġrừng": 137730, - "Ġrá»iji": 138615, - "Ġrá»ĵi": 128558, - "Ġrá»Ļng": 129922, - "Ġrá»Ŀi": 138559, - "Ġrá»Ńa": 135525, - "Ġs": 274, - "Ġsa": 822, - "Ġsaat": 51365, - "Ġsab": 19408, - "Ġsabe": 75294, - "Ġsaber": 41004, - "Ġsabot": 60958, - "Ġsabotage": 79653, - "Ġsac": 11100, - "Ġsach": 97576, - "Ġsack": 52333, - "Ġsacked": 76461, - "Ġsacks": 56771, - "Ġsacr": 17038, - "Ġsacram": 85802, - "Ġsacred": 31342, - "Ġsacrific": 30861, - "Ġsacrifice": 27136, - "Ġsacrificed": 66804, - "Ġsacrifices": 56923, - "Ġsacrificing": 72028, - "Ġsad": 12421, - "Ġsadd": 57172, - "Ġsaddened": 93917, - "Ġsaddle": 60758, - "Ġsadly": 43045, - "Ġsadness": 50878, - "Ġsaf": 5536, - "Ġsafari": 82306, - "Ġsafe": 6092, - "Ġsafeg": 37286, - "Ġsafeguard": 47971, - "Ġsafeguards": 76920, - "Ġsafely": 21000, - "Ġsafer": 29449, - "Ġsafest": 61744, - "Ġsafety": 7149, - "Ġsafezone": 86157, - "Ġsag": 29711, - "Ġsaga": 46303, - "Ġsage": 38261, - "Ġsagen": 73689, - "Ġsagt": 75018, - "Ġsagte": 85389, - "Ġsai": 71632, - "Ġsaid": 1053, - "Ġsail": 29403, - "Ġsailed": 75744, - "Ġsailing": 50029, - "Ġsailor": 92537, - "Ġsailors": 68838, - "Ġsails": 85005, - "Ġsaint": 35859, - "Ġsaints": 67120, - "Ġsais": 62662, - "Ġsaison": 78991, - "Ġsaja": 78786, - "Ġsak": 77310, - "Ġsake": 24483, - "Ġsal": 4274, - "Ġsala": 57933, - "Ġsalad": 32466, - "Ġsalads": 76752, - "Ġsalah": 77324, - "Ġsalari": 143576, - "Ġsalaries": 36432, - "Ġsalario": 93091, - "Ġsalarié": 143577, - "Ġsalary": 16107, - "Ġsaldo": 73851, - "Ġsaldır": 135915, - "Ġsaldırı": 135916, - "Ġsale": 6278, - "Ġsales": 6625, - "Ġsalesman": 78447, - "Ġsalida": 67104, - "Ġsaline": 98007, - "Ġsalir": 78122, - "Ġsaliva": 84557, - "Ġsalle": 70532, - "Ġsalmon": 40320, - "Ġsalon": 39728, - "Ġsalope": 18393, - "Ġsalopes": 81322, - "Ġsalsa": 73214, - "Ġsalt": 12021, - "Ġsalts": 77135, - "Ġsalty": 73875, - "Ġsalud": 58012, - "Ġsalute": 70111, - "Ġsalv": 27059, - "Ġsalvage": 71736, - "Ġsalvar": 92956, - "Ġsalvation": 44935, - "Ġsam": 9962, - "Ġsama": 66623, - "Ġsame": 1852, - "Ġsamen": 81457, - "Ġsammen": 86279, - "Ġsamo": 82378, - "Ġsamp": 61481, - "Ġsample": 6077, - "Ġsampled": 48876, - "Ġsampler": 41799, - "Ġsamples": 10469, - "Ġsampling": 24892, - "Ġsamsung": 72984, - "Ġsamt": 75243, - "Ġsan": 8363, - "Ġsanct": 34489, - "Ġsanction": 44261, - "Ġsanctioned": 73244, - "Ġsanctions": 23746, - "Ġsanctuary": 50539, - "Ġsand": 9278, - "Ġsandals": 80257, - "Ġsandbox": 42754, - "Ġsands": 69063, - "Ġsandwich": 27874, - "Ġsandwiches": 56658, - "Ġsandy": 67439, - "Ġsane": 61100, - "Ġsang": 28240, - "Ġsangat": 70464, - "Ġsanit": 19812, - "Ġsanitary": 94529, - "Ġsanitation": 76523, - "Ġsanitize": 45183, - "Ġsanitized": 39232, - "Ġsanitizer": 98096, - "Ġsanity": 46842, - "Ġsank": 64230, - "Ġsans": 15510, - "Ġsant": 51508, - "Ġsanta": 71751, - "Ġsanté": 76223, - "Ġsap": 34635, - "Ġsapi": 81195, - "Ġsar": 28047, - "Ġsarc": 78766, - "Ġsarcast": 82267, - "Ġsare": 77345, - "ĠsarÃł": 79044, - "Ġsass": 74853, - "Ġsat": 7578, - "Ġsatellite": 23210, - "Ġsatellites": 46610, - "Ġsatin": 77084, - "Ġsatire": 81395, - "Ġsatisf": 8625, - "Ġsatisfaction": 23689, - "Ġsatisfactory": 57731, - "Ġsatisfied": 19527, - "Ġsatisfies": 67901, - "Ġsatisfy": 26553, - "Ġsatisfying": 36054, - "Ġsatu": 58566, - "Ġsatur": 93477, - "Ġsaturated": 49485, - "Ġsaturation": 49743, - "Ġsaturn": 84689, - "Ġsatın": 137747, - "ĠsatÄ±ÅŁ": 133980, - "Ġsau": 32154, - "Ġsauce": 19187, - "Ġsauces": 89970, - "Ġsauna": 46858, - "Ġsausage": 58886, - "Ġsav": 11179, - "Ġsavage": 72035, - "ĠsavaÅŁ": 133629, - "Ġsave": 3581, - "Ġsaved": 6781, - "ĠsavedInstanceState": 14724, - "Ġsaver": 60162, - "Ġsaves": 25935, - "Ġsaving": 13997, - "Ġsavings": 18986, - "Ġsavoir": 46829, - "Ġsavory": 93660, - "Ġsavvy": 63728, - "Ġsaw": 5485, - "Ġsax": 63008, - "Ġsay": 1977, - "Ġsaya": 53937, - "Ġsaygı": 140758, - "Ġsaying": 5488, - "Ġsays": 2727, - "Ġsayı": 131404, - "Ġsayılı": 137714, - "Ġsayısı": 134052, - "Ġsaç": 135271, - "Ġsaúde": 96895, - "ĠsaÄŁ": 84839, - "ĠsaÄŁlam": 128048, - "ĠsaÄŁlamak": 140065, - "ĠsaÄŁlan": 136445, - "ĠsaÄŁlayan": 142669, - "ĠsaÄŁlık": 133874, - "ĠsaÄŁlıkl": 140695, - "ĠsaÄŁlıklı": 140696, - "Ġsb": 7898, - "Ġsc": 1136, - "Ġsca": 15350, - "Ġscaff": 56150, - "Ġscaffold": 84452, - "Ġscal": 24004, - "Ġscala": 15771, - "Ġscalability": 93740, - "Ġscalable": 68211, - "Ġscalar": 17274, - "Ġscale": 5452, - "ĠscaleFactor": 84819, - "ĠscaleX": 92618, - "ĠscaleY": 90333, - "Ġscaled": 30690, - "Ġscaler": 68724, - "Ġscales": 28405, - "Ġscaling": 26943, - "Ġscalp": 64326, - "Ġscam": 34626, - "Ġscams": 63055, - "Ġscan": 8569, - "Ġscand": 54292, - "Ġscandal": 25599, - "Ġscandals": 68029, - "Ġscanf": 16865, - "Ġscanned": 47448, - "Ġscanner": 20775, - "Ġscanners": 94046, - "Ġscanning": 35101, - "Ġscans": 42639, - "Ġscant": 83855, - "Ġscape": 98013, - "Ġscar": 22290, - "Ġscarc": 51315, - "Ġscarce": 58190, - "Ġscarcely": 79887, - "Ġscarcity": 81384, - "Ġscare": 42930, - "Ġscared": 26115, - "Ġscares": 96371, - "Ġscarf": 67271, - "Ġscars": 60599, - "Ġscary": 28465, - "Ġscatter": 44477, - "Ġscattered": 36967, - "Ġscattering": 71816, - "Ġscav": 82650, - "Ġsce": 93810, - "Ġscen": 7529, - "Ġscenario": 15048, - "Ġscenarios": 25283, - "Ġscene": 6109, - "Ġscenery": 50231, - "Ġscenes": 16065, - "Ġscenic": 60981, - "Ġscent": 40366, - "Ġscept": 66351, - "Ġsch": 5699, - "Ġsche": 70251, - "Ġsched": 5575, - "Ġschedule": 9700, - "Ġscheduled": 13537, - "Ġscheduler": 28809, - "Ġschedules": 36769, - "Ġscheduling": 37852, - "Ġschem": 19650, - "Ġschema": 10802, - "Ġschemas": 61800, - "Ġschematic": 67044, - "Ġscheme": 12859, - "Ġschemes": 30856, - "Ġschizophren": 50181, - "Ġschizophrenia": 57433, - "Ġschl": 71417, - "Ġschle": 84187, - "Ġschn": 41130, - "Ġschnell": 58052, - "Ġscho": 77040, - "Ġscholar": 18145, - "Ġscholarly": 62581, - "Ġscholars": 30739, - "Ġscholarship": 33125, - "Ġscholarships": 54755, - "Ġschon": 28086, - "Ġschool": 2906, - "Ġschooling": 67621, - "Ġschools": 8682, - "Ġschw": 35515, - "Ġschwar": 81828, - "Ġschwer": 83758, - "Ġschö": 58459, - "Ġschön": 74764, - "Ġschöne": 91896, - "Ġsci": 37974, - "Ġscience": 8038, - "Ġsciences": 35688, - "Ġscient": 7182, - "Ġscientific": 12344, - "Ġscientifically": 73547, - "Ġscientist": 27468, - "Ġscientists": 13923, - "Ġscipy": 28090, - "Ġscissors": 71624, - "Ġscl": 56119, - "Ġsclerosis": 90257, - "Ġscm": 85520, - "Ġscn": 98988, - "Ġsco": 24637, - "Ġscoff": 89556, - "Ġscoop": 56407, - "Ġscooter": 75040, - "Ġscop": 47521, - "Ġscope": 6891, - "Ġscoped": 46960, - "Ġscopes": 50598, - "Ġscor": 61095, - "Ġscore": 5456, - "Ġscoreboard": 82329, - "Ġscored": 16548, - "Ġscorer": 63669, - "Ġscores": 12205, - "Ġscoring": 19826, - "Ġscorn": 87006, - "Ġscour": 69255, - "Ġscout": 53494, - "Ġscouting": 66380, - "Ġscouts": 69871, - "Ġscp": 69657, - "Ġscr": 9224, - "Ġscram": 34961, - "Ġscramble": 76287, - "Ġscrambled": 70478, - "Ġscrambling": 84227, - "Ġscrap": 20843, - "Ġscrape": 57128, - "Ġscraped": 87837, - "Ġscraper": 88034, - "Ġscraping": 81438, - "Ġscrapped": 83247, - "Ġscraps": 91785, - "Ġscrapy": 47734, - "Ġscratch": 18778, - "Ġscratched": 82833, - "Ġscratches": 65739, - "Ġscratching": 71919, - "Ġscre": 7862, - "Ġscream": 45689, - "Ġscreamed": 60366, - "Ġscreaming": 34001, - "Ġscreams": 60008, - "Ġscreen": 4171, - "ĠscreenHeight": 77555, - "ĠscreenSize": 98695, - "ĠscreenWidth": 70370, - "Ġscreened": 57577, - "Ġscreening": 22265, - "Ġscreenings": 83506, - "Ġscreenplay": 84775, - "Ġscreens": 15310, - "Ġscreenshot": 36190, - "Ġscreenshots": 48720, - "Ġscrew": 21966, - "Ġscrewed": 56345, - "Ġscrews": 44922, - "Ġscri": 67222, - "Ġscrim": 80557, - "Ġscrimmage": 98176, - "Ġscript": 5316, - "Ġscripted": 85025, - "Ġscripting": 67422, - "Ġscripts": 19502, - "Ġscripture": 72788, - "Ġscriptures": 86633, - "Ġscroll": 9059, - "ĠscrollTo": 88295, - "ĠscrollTop": 64454, - "ĠscrollView": 44753, - "Ġscrollbar": 79655, - "Ġscrolled": 95619, - "Ġscrolling": 37976, - "Ġscrolls": 78564, - "Ġscrub": 44901, - "Ġscrut": 28917, - "Ġscrutin": 69242, - "Ġscrutiny": 35652, - "Ġsculpt": 26765, - "Ġsculpture": 49967, - "Ġsculptures": 74873, - "Ġscène": 138938, - "Ġsd": 20585, - "Ġsdf": 50157, - "Ġsdk": 45402, - "Ġsdl": 86330, - "Ġse": 511, - "Ġsea": 9396, - "Ġseab": 65491, - "Ġseaborn": 94760, - "Ġseafood": 52305, - "Ġseal": 25349, - "Ġsealed": 19046, - "Ġsealing": 65834, - "Ġseals": 56777, - "Ġseam": 26396, - "Ġseamless": 46870, - "Ġseamlessly": 60340, - "Ġseams": 73688, - "Ġsean": 84422, - "Ġsearch": 2711, - "ĠsearchBar": 71801, - "ĠsearchData": 59131, - "ĠsearchString": 94040, - "ĠsearchTerm": 89026, - "ĠsearchText": 72508, - "Ġsearchable": 73643, - "Ġsearched": 26502, - "Ġsearcher": 94674, - "Ġsearches": 26475, - "Ġsearching": 15039, - "Ġseas": 51740, - "Ġseaside": 92776, - "Ġseason": 3200, - "Ġseasonal": 35799, - "Ġseasoned": 51514, - "Ġseasoning": 86219, - "Ġseasons": 15584, - "Ġseat": 10723, - "Ġseated": 46313, - "Ġseating": 37299, - "Ġseats": 16312, - "Ġseaw": 66229, - "Ġsebagai": 58622, - "Ġsebuah": 95466, - "Ġsec": 5701, - "Ġsecara": 72327, - "Ġsecluded": 88015, - "Ġsecond": 2086, - "Ġsecondary": 14246, - "Ġsecondo": 85936, - "Ġseconds": 6486, - "Ġsecre": 19183, - "Ġsecrecy": 59959, - "Ġsecret": 6234, - "Ġsecretary": 19067, - "Ġsecretion": 85967, - "Ġsecretive": 82999, - "Ġsecretly": 41739, - "Ġsecrets": 23594, - "Ġsecs": 49749, - "Ġsect": 30137, - "Ġsectarian": 78780, - "Ġsection": 3772, - "Ġsectional": 92360, - "Ġsections": 14158, - "Ġsector": 10486, - "Ġsectors": 25512, - "Ġsecular": 35919, - "Ġsecure": 9767, - "Ġsecured": 26430, - "Ġsecurely": 51023, - "Ġsecuring": 40477, - "Ġsecurities": 33819, - "Ġsecurity": 4763, - "Ġsed": 10923, - "Ġsedan": 54740, - "Ġsede": 95587, - "Ġsediment": 58032, - "Ġsee": 1490, - "Ġseed": 10320, - "Ġseeded": 89816, - "Ġseeding": 94415, - "Ġseeds": 19056, - "Ġseedu": 95284, - "Ġseeing": 9120, - "Ġseek": 5931, - "Ġseeker": 89133, - "Ġseekers": 49333, - "Ġseeking": 10887, - "Ġseeks": 25654, - "Ġseem": 2803, - "Ġseemed": 9324, - "Ġseeming": 75695, - "Ġseemingly": 22660, - "Ġseems": 4977, - "Ġseen": 3884, - "Ġsees": 15634, - "Ġseg": 4810, - "Ġsegment": 10238, - "Ġsegmentation": 59752, - "Ġsegmented": 84945, - "Ġsegments": 20632, - "Ġsegreg": 43067, - "Ġsegregated": 91298, - "Ġsegregation": 63144, - "Ġsegu": 81302, - "Ġsegue": 36770, - "Ġseguint": 93072, - "Ġseguir": 57448, - "Ġsegunda": 54972, - "Ġsegundo": 44287, - "Ġsegundos": 89616, - "Ġsegurança": 133665, - "Ġseguridad": 63304, - "Ġseguro": 61027, - "Ġsegún": 62015, - "Ġseh": 91665, - "Ġsehen": 53835, - "Ġsehr": 25494, - "Ġsei": 42137, - "Ġsein": 19349, - "Ġseine": 38897, - "Ġseinem": 72440, - "Ġseinen": 59228, - "Ġseiner": 53936, - "Ġseins": 54328, - "Ġseis": 86412, - "Ġseismic": 71479, - "Ġseit": 41488, - "Ġseiz": 33113, - "Ġseize": 49985, - "Ġseized": 30489, - "Ġseizing": 97206, - "Ġseizure": 52150, - "Ġseizures": 54898, - "Ġseja": 52596, - "Ġsek": 43834, - "Ġseks": 17510, - "Ġseksi": 61782, - "Ġsektör": 132655, - "Ġsel": 11806, - "Ġselber": 84193, - "Ġselbst": 34542, - "Ġseldom": 55352, - "Ġsele": 27319, - "Ġseleccion": 47043, - "Ġselecion": 85286, - "Ġselect": 3293, - "Ġselectable": 81051, - "Ġselected": 4091, - "ĠselectedIndex": 83617, - "ĠselectedItem": 70992, - "Ġselecting": 26301, - "Ġselection": 6589, - "Ġselections": 37399, - "Ġselective": 42910, - "Ġselectively": 81675, - "Ġselector": 9367, - "Ġselectors": 56037, - "Ġselects": 49143, - "Ġselenium": 35945, - "Ġself": 656, - "Ġselfie": 64294, - "Ġselfies": 85297, - "Ġselfish": 44643, - "Ġsell": 4559, - "Ġseller": 22856, - "Ġsellers": 36149, - "Ġselling": 11236, - "Ġsells": 30778, - "Ġselon": 64635, - "Ġselv": 60251, - "Ġselves": 83037, - "Ġsem": 5234, - "Ġsemaine": 71609, - "Ġsemana": 44975, - "Ġsemanas": 96456, - "Ġsemantic": 41733, - "Ġsemantics": 52694, - "Ġsemaphore": 55918, - "Ġsembl": 79564, - "Ġsemble": 96387, - "Ġsemen": 74657, - "Ġsemester": 33153, - "Ġsemi": 18267, - "Ġsemiclass": 94277, - "Ġsemiclassical": 94278, - "Ġsemiconductor": 86736, - "Ġsemif": 65500, - "Ġseminal": 89673, - "Ġseminar": 53575, - "Ġseminars": 67469, - "Ġsemp": 74597, - "Ġsempre": 34562, - "Ġsemua": 77497, - "Ġsen": 6124, - "Ġsenate": 76370, - "Ġsenator": 31697, - "Ġsenators": 38920, - "Ġsend": 3624, - "ĠsendData": 92323, - "ĠsendMessage": 52358, - "Ġsender": 4646, - "Ġsending": 11628, - "Ġsendo": 61346, - "Ġsends": 21308, - "Ġsenha": 48802, - "Ġsenior": 9990, - "Ġseniors": 37249, - "Ġsens": 6097, - "Ġsensation": 36292, - "Ġsensational": 67403, - "Ġsensations": 71497, - "Ġsense": 5530, - "Ġsensed": 88442, - "Ġsenses": 37107, - "Ġsensible": 37661, - "Ġsensing": 59099, - "Ġsensit": 73533, - "Ġsensitive": 16216, - "Ġsensitivity": 26443, - "Ġsensor": 12002, - "Ġsensors": 25092, - "Ġsensory": 47969, - "Ġsensual": 59617, - "Ġsent": 3208, - "Ġsentence": 11652, - "Ġsentenced": 29131, - "Ġsentences": 22870, - "Ġsentencing": 50517, - "Ġsentido": 64384, - "Ġsentient": 97770, - "Ġsentiment": 25975, - "Ġsentimental": 91938, - "Ġsentiments": 57114, - "Ġsentinel": 80778, - "Ġsentir": 74702, - "Ġsenza": 41926, - "Ġseo": 90608, - "Ġsep": 21017, - "Ġsepar": 4836, - "Ġseparat": 61382, - "Ġseparate": 8651, - "Ġseparated": 18663, - "Ġseparately": 25156, - "Ġseparates": 61749, - "Ġseparating": 49445, - "Ġseparation": 24737, - "Ġseparator": 24792, - "Ġseparators": 82502, - "Ġseper": 48354, - "Ġseperate": 83883, - "Ġseperti": 67720, - "Ġsept": 34329, - "Ġseptember": 83649, - "Ġseptembre": 94643, - "Ġseq": 12981, - "Ġsequ": 11256, - "Ġsequel": 34761, - "Ġsequelize": 58785, - "Ġsequence": 8500, - "Ġsequences": 23700, - "Ġsequencing": 61019, - "Ġsequential": 51000, - "Ġsequentially": 94559, - "Ġser": 1420, - "Ġsera": 34637, - "Ġserait": 86164, - "Ġserde": 61570, - "Ġserene": 94763, - "Ġserge": 71201, - "Ġsergeant": 83121, - "Ġseri": 93346, - "Ġseria": 83365, - "Ġserial": 6146, - "ĠserialVersionUID": 23673, - "Ġserialization": 47443, - "Ġserialize": 24235, - "Ġserialized": 32916, - "Ġserializer": 21759, - "Ġserializers": 38221, - "Ġserie": 32878, - "Ġseries": 4013, - "Ġserif": 89748, - "Ġserious": 6001, - "Ġseriously": 13919, - "Ġseriousness": 74381, - "Ġsermon": 75382, - "Ġseront": 77771, - "Ġserotonin": 76030, - "Ġserpent": 91842, - "Ġserr": 61934, - "Ġserta": 92619, - "Ġserum": 40429, - "Ġserv": 4853, - "Ġservant": 40464, - "Ġservants": 41732, - "Ġserve": 8683, - "Ġserved": 10223, - "Ġserver": 3538, - "Ġservers": 16293, - "Ġserves": 17045, - "Ġservi": 54405, - "Ġservic": 81359, - "Ġservice": 2473, - "ĠserviceName": 69191, - "ĠserviceProvider": 98009, - "Ġserviced": 80123, - "Ġservices": 3516, - "Ġservicing": 64818, - "Ġservicio": 46157, - "Ġservicios": 52123, - "Ġservidor": 57226, - "Ġserving": 13480, - "Ġservings": 77949, - "Ġserviço": 90575, - "Ġserviços": 93743, - "Ġservlet": 36496, - "Ġservo": 58312, - "Ġserá": 32898, - "Ġserão": 98424, - "ĠserÃŃa": 136302, - "Ġses": 15537, - "Ġsesame": 91123, - "Ġsesión": 68745, - "Ġsess": 21875, - "Ġsession": 3797, - "ĠsessionFactory": 70476, - "ĠsessionId": 54154, - "ĠsessionStorage": 50143, - "Ġsessions": 15704, - "Ġsesso": 18249, - "Ġsessuali": 94869, - "Ġset": 738, - "ĠsetActive": 74859, - "ĠsetAddress": 98420, - "ĠsetBackground": 70655, - "ĠsetBackgroundColor": 79874, - "ĠsetBackgroundImage": 95266, - "ĠsetC": 84901, - "ĠsetColor": 75968, - "ĠsetContent": 68260, - "ĠsetContentView": 21109, - "ĠsetCurrent": 53914, - "ĠsetData": 42149, - "ĠsetDate": 74412, - "ĠsetDefaultCloseOperation": 89017, - "ĠsetDescription": 68325, - "ĠsetEmail": 53320, - "ĠsetError": 52215, - "ĠsetFrame": 85289, - "ĠsetHidden": 98415, - "ĠsetId": 26635, - "ĠsetImage": 39962, - "ĠsetInput": 92591, - "ĠsetInterval": 35479, - "ĠsetIs": 38398, - "ĠsetLoading": 48589, - "ĠsetLocation": 88332, - "ĠsetMessage": 66891, - "ĠsetName": 27780, - "ĠsetObject": 38983, - "ĠsetOpen": 66619, - "ĠsetPage": 82828, - "ĠsetPassword": 53115, - "ĠsetPosition": 91197, - "ĠsetResult": 82906, - "ĠsetSearch": 85682, - "ĠsetSelected": 45263, - "ĠsetShow": 66557, - "ĠsetSize": 83859, - "ĠsetState": 21450, - "ĠsetStatus": 56304, - "ĠsetSupportActionBar": 83048, - "ĠsetText": 44562, - "ĠsetTime": 89521, - "ĠsetTimeout": 14258, - "ĠsetTitle": 26226, - "ĠsetTitleColor": 77138, - "ĠsetType": 62709, - "ĠsetUp": 18620, - "ĠsetUser": 42413, - "ĠsetUsername": 86055, - "ĠsetValue": 28052, - "ĠsetVisible": 83252, - "Ġsetattr": 61114, - "Ġsetback": 78813, - "Ġsetbacks": 96637, - "Ġsets": 7289, - "Ġsett": 8227, - "Ġsetter": 40388, - "Ġsetters": 80842, - "Ġsetting": 6243, - "Ġsettings": 5003, - "Ġsettle": 24729, - "Ġsettled": 22378, - "Ġsettlement": 17079, - "Ġsettlements": 44604, - "Ġsettlers": 60007, - "Ġsettles": 91918, - "Ġsettling": 51845, - "Ġsetup": 6505, - "Ġsetups": 83723, - "Ġsetuptools": 63797, - "Ġsetw": 50063, - "Ġsetzen": 97696, - "Ġseu": 20009, - "Ġseul": 73106, - "Ġseule": 85706, - "Ġseulement": 70586, - "Ġseus": 41398, - "Ġseven": 8094, - "Ġsevent": 21373, - "Ġseventeen": 81397, - "Ġseventh": 30387, - "Ġseventy": 69949, - "Ġsever": 3205, - "Ġseveral": 3807, - "Ġsevere": 15386, - "Ġsevered": 83350, - "Ġseverely": 34806, - "Ġseverity": 29920, - "Ġsew": 22352, - "Ġsewage": 71117, - "Ġsewer": 61920, - "Ġsewing": 51219, - "Ġsex": 1839, - "Ġsexdate": 61902, - "Ġsexe": 15974, - "Ġsexes": 74932, - "Ġsexism": 67995, - "Ġsexist": 63782, - "Ġsexkontakte": 86278, - "Ġsexle": 71195, - "Ġsexo": 19616, - "Ġsext": 37003, - "Ġsextreffen": 96835, - "Ġsexual": 7244, - "Ġsexuales": 98113, - "Ġsexuality": 38175, - "Ġsexually": 26583, - "Ġsexy": 10886, - "Ġsez": 78472, - "Ġseznam": 94868, - "Ġseç": 125312, - "Ġseçen": 138155, - "Ġseçenek": 138156, - "Ġseçil": 141162, - "Ġseçim": 131544, - "Ġseñ": 54230, - "Ġseñal": 132456, - "Ġseñor": 140315, - "Ġsf": 13124, - "Ġsg": 30673, - "Ġsh": 557, - "Ġsha": 15870, - "Ġshack": 76290, - "Ġshade": 27501, - "Ġshaded": 91766, - "Ġshader": 21013, - "Ġshaders": 67550, - "Ġshades": 36099, - "Ġshading": 71734, - "Ġshadow": 12455, - "Ġshadows": 34512, - "Ġshady": 77081, - "Ġshaft": 30368, - "Ġshake": 26025, - "Ġshaken": 65800, - "Ġshakes": 62030, - "Ġshaking": 37739, - "Ġshaky": 83413, - "Ġshale": 74005, - "Ġshall": 4880, - "Ġshallow": 25600, - "Ġshalt": 88535, - "Ġsham": 71876, - "Ġshame": 20973, - "Ġshameful": 83194, - "Ġshampoo": 61932, - "Ġshape": 6083, - "Ġshaped": 26271, - "Ġshapes": 20816, - "Ġshaping": 45520, - "Ġshar": 25626, - "Ġshard": 52069, - "Ġshards": 74110, - "Ġshare": 4332, - "Ġshared": 6094, - "ĠsharedApplication": 60318, - "ĠsharedInstance": 51958, - "ĠsharedPreferences": 61057, - "Ġshareholder": 62242, - "Ġshareholders": 40677, - "Ġshares": 13248, - "Ġsharing": 11560, - "Ġshark": 43792, - "Ġsharks": 60435, - "Ġsharp": 17232, - "Ġsharpen": 56363, - "Ġsharper": 95469, - "Ġsharply": 45373, - "Ġshattered": 55367, - "Ġshave": 72607, - "Ġshaved": 65199, - "Ġshaving": 80009, - "Ġshe": 1340, - "Ġshear": 64244, - "Ġshed": 24354, - "Ġshedding": 79317, - "Ġsheds": 75939, - "Ġsheep": 31912, - "Ġsheer": 32538, - "Ġsheet": 10834, - "Ġsheets": 24140, - "Ġshel": 73035, - "Ġshelf": 27645, - "Ġshell": 12528, - "Ġshells": 42954, - "Ġshelter": 22906, - "Ġshelters": 51788, - "Ġshelves": 35210, - "Ġshemale": 33627, - "Ġshepherd": 90378, - "Ġsher": 34213, - "Ġsheriff": 39739, - "Ġshield": 20245, - "Ġshielding": 96676, - "Ġshields": 52665, - "Ġshift": 6407, - "Ġshifted": 28973, - "Ġshifting": 31831, - "Ġshifts": 28635, - "Ġshim": 62132, - "Ġshimmer": 75361, - "Ġshin": 76011, - "Ġshine": 32405, - "Ġshines": 64780, - "Ġshining": 47925, - "Ġshiny": 41199, - "Ġship": 8284, - "Ġshipment": 43754, - "Ġshipments": 58621, - "Ġshipped": 27259, - "Ġshipping": 11601, - "Ġships": 17727, - "Ġshirt": 15478, - "Ġshirts": 36724, - "Ġshit": 17176, - "Ġshitty": 77458, - "Ġshl": 95910, - "Ġshm": 76500, - "Ġsho": 71519, - "Ġshock": 10755, - "Ġshocked": 26620, - "Ġshocking": 33634, - "Ġshocks": 67160, - "Ġshoe": 28977, - "Ġshoes": 15294, - "Ġshook": 34914, - "Ġshoot": 6102, - "Ġshooter": 31571, - "Ġshooters": 62070, - "Ġshooting": 10441, - "Ġshootings": 43761, - "Ġshootout": 87181, - "Ġshoots": 43627, - "Ġshop": 8061, - "Ġshopper": 93203, - "Ġshoppers": 48735, - "Ġshopping": 11919, - "Ġshops": 19456, - "Ġshore": 30184, - "Ġshoreline": 98064, - "Ġshores": 62163, - "Ġshort": 2805, - "Ġshortage": 38159, - "Ġshortages": 66176, - "Ġshortcode": 75813, - "Ġshortcomings": 71921, - "Ġshortcut": 37115, - "Ġshortcuts": 54920, - "Ġshorten": 73381, - "Ġshortened": 65563, - "Ġshorter": 23327, - "Ġshortest": 39143, - "Ġshortfall": 99049, - "Ġshorthand": 78339, - "Ġshortly": 19620, - "Ġshorts": 35776, - "Ġshot": 6552, - "Ġshotgun": 51248, - "Ġshots": 14951, - "Ġshould": 1265, - "ĠshouldBe": 45483, - "Ġshoulder": 16882, - "Ġshoulders": 26906, - "Ġshouldn": 13133, - "Ġshout": 41123, - "Ġshouted": 43443, - "Ġshouting": 47555, - "Ġshouts": 83836, - "Ġshove": 84615, - "Ġshoved": 82098, - "Ġshovel": 91991, - "Ġshow": 1473, - "ĠshowAlert": 86189, - "ĠshowDialog": 75709, - "ĠshowError": 63003, - "ĠshowMessage": 81649, - "ĠshowModal": 94734, - "ĠshowToast": 81231, - "Ġshowc": 47210, - "Ġshowcase": 34783, - "Ġshowcased": 82760, - "Ġshowcases": 70749, - "Ġshowcasing": 66808, - "Ġshowdown": 71608, - "Ġshowed": 8542, - "Ġshower": 17196, - "Ġshowers": 51802, - "Ġshowing": 9027, - "Ġshown": 6839, - "Ġshowroom": 86135, - "Ġshows": 4933, - "Ġshr": 14035, - "Ġshred": 97762, - "Ġshredd": 52362, - "Ġshredded": 74120, - "Ġshri": 96846, - "Ġshrimp": 55526, - "Ġshrine": 73548, - "Ġshrink": 28900, - "Ġshrinking": 62085, - "Ġshrugged": 69656, - "Ġshuffle": 25947, - "Ġshuffled": 74271, - "Ġshut": 9311, - "Ġshutdown": 23766, - "Ġshutil": 33960, - "Ġshuts": 88578, - "Ġshutter": 47956, - "Ġshutting": 50026, - "Ġshuttle": 44541, - "Ġshy": 32294, - "Ġsi": 4403, - "Ġsia": 49889, - "Ġsibling": 44223, - "Ġsiblings": 36683, - "Ġsic": 52647, - "Ġsich": 9089, - "Ġsicher": 54548, - "Ġsick": 14036, - "Ġsickness": 53850, - "Ġsid": 14084, - "Ġside": 3108, - "Ġsidebar": 27226, - "Ġsided": 67936, - "Ġsidel": 85077, - "Ġsideline": 78953, - "Ġsidelined": 97948, - "Ġsidelines": 69413, - "Ġsiden": 86816, - "Ġsider": 86574, - "Ġsides": 11067, - "Ġsidew": 31517, - "Ġsidewalk": 41090, - "Ġsidewalks": 81735, - "Ġsideways": 73729, - "Ġsiding": 75685, - "Ġsidl": 85791, - "Ġsido": 33971, - "Ġsie": 9911, - "Ġsiege": 51691, - "Ġsieht": 86899, - "Ġsiempre": 41598, - "Ġsiendo": 81266, - "Ġsieve": 74336, - "Ġsift": 80744, - "Ġsig": 8366, - "Ġsigh": 30138, - "Ġsighed": 52814, - "Ġsight": 13929, - "Ġsighting": 92679, - "Ġsightings": 82654, - "Ġsights": 41166, - "Ġsigma": 20254, - "Ġsigmoid": 64890, - "Ġsign": 1841, - "ĠsignIn": 50995, - "ĠsignUp": 71030, - "Ġsignage": 79080, - "Ġsignal": 8286, - "Ġsignaled": 74748, - "Ġsignaling": 41980, - "Ġsignalling": 90877, - "Ġsignals": 17289, - "Ġsignature": 11957, - "Ġsignatures": 32628, - "Ġsigned": 8499, - "Ġsigner": 70039, - "Ġsignific": 4595, - "Ġsignifica": 67732, - "Ġsignificance": 25361, - "Ġsignificant": 5089, - "Ġsignificantly": 11941, - "Ġsignifies": 77764, - "Ġsignify": 88422, - "Ġsignin": 87992, - "Ġsigning": 15971, - "Ġsignings": 98556, - "Ġsigns": 11929, - "Ġsignup": 40048, - "Ġsigu": 41645, - "Ġsigue": 96229, - "Ġsiguiente": 54901, - "Ġsiguientes": 85861, - "Ġsik": 75461, - "Ġsil": 5437, - "Ġsildenafil": 91801, - "Ġsilence": 21162, - "Ġsilenced": 91681, - "Ġsilent": 21059, - "Ġsilently": 49394, - "Ġsilhouette": 56727, - "Ġsilica": 76789, - "Ġsilicon": 50592, - "Ġsilicone": 52925, - "Ġsilk": 39944, - "Ġsilky": 86318, - "Ġsill": 84267, - "Ġsilly": 29471, - "Ġsilver": 14961, - "Ġsim": 1643, - "Ġsimd": 92257, - "Ġsimil": 91792, - "Ġsimilar": 4428, - "Ġsimilarities": 42774, - "Ġsimilarity": 37623, - "Ġsimilarly": 29193, - "Ġsimmer": 61815, - "Ġsimp": 12432, - "Ġsimpl": 15491, - "Ġsimple": 4285, - "Ġsimplement": 70257, - "Ġsimpler": 34288, - "Ġsimples": 68306, - "Ġsimplest": 44548, - "Ġsimplex": 91651, - "Ġsimplicity": 38975, - "Ġsimplified": 43799, - "Ġsimplify": 39721, - "Ġsimplistic": 77530, - "Ġsimply": 4936, - "Ġsims": 90913, - "Ġsimul": 75673, - "Ġsimulate": 37453, - "Ġsimulated": 45736, - "Ġsimulation": 19038, - "Ġsimulations": 46490, - "Ġsimulator": 41891, - "Ġsimult": 20127, - "Ġsimultaneous": 57532, - "Ġsimultaneously": 24303, - "Ġsin": 7437, - "Ġsina": 96263, - "Ġsinc": 26241, - "Ġsince": 2474, - "Ġsincer": 43049, - "Ġsincere": 48324, - "Ġsincerely": 58283, - "Ġsincerity": 99126, - "Ġsind": 12583, - "Ġsine": 57668, - "Ġsinful": 96627, - "Ġsing": 7780, - "Ġsingapore": 95762, - "Ġsinger": 22757, - "Ġsingers": 67041, - "Ġsinging": 25083, - "Ġsingle": 3175, - "Ġsingled": 78873, - "Ġsingles": 17389, - "Ġsingleton": 36903, - "Ġsingly": 85499, - "Ġsings": 67241, - "Ġsingular": 33944, - "Ġsinh": 97832, - "Ġsinister": 62567, - "Ġsink": 19309, - "Ġsinking": 61093, - "Ġsinks": 56952, - "Ġsino": 51804, - "Ġsinon": 36472, - "Ġsins": 39344, - "Ġsint": 42229, - "Ġsinus": 75814, - "Ġsip": 46615, - "Ġsir": 27048, - "Ġsire": 85911, - "Ġsis": 52315, - "Ġsist": 20896, - "Ġsistem": 68886, - "Ġsistema": 28828, - "Ġsistemas": 88149, - "Ġsister": 12923, - "Ġsisters": 29293, - "Ġsit": 2444, - "Ġsitcom": 80366, - "Ġsite": 2747, - "Ġsites": 6594, - "Ġsiti": 42692, - "Ġsitio": 46956, - "Ġsitios": 70561, - "Ġsito": 50619, - "Ġsits": 23011, - "Ġsitting": 11699, - "Ġsitu": 9908, - "Ġsituación": 78295, - "Ġsituated": 30083, - "Ġsituation": 6534, - "Ġsituations": 14740, - "Ġsituação": 136578, - "Ġsitué": 136435, - "Ġsix": 4743, - "Ġsixteen": 58039, - "Ġsixth": 25031, - "Ġsixty": 52374, - "Ġsiz": 64896, - "Ġsizable": 78098, - "Ġsize": 1379, - "Ġsized": 29287, - "Ġsizeof": 3935, - "Ġsizes": 12282, - "Ġsizing": 63001, - "Ġsiè": 96639, - "Ġsiècle": 136971, - "Ġsiêu": 132539, - "ĠsiÄĻ": 12662, - "Ġsj": 37436, - "Ġsk": 1901, - "Ġska": 53727, - "Ġskal": 41813, - "Ġskate": 42778, - "Ġskateboard": 97982, - "Ġskating": 64404, - "Ġskb": 67823, - "Ġske": 15722, - "Ġskeletal": 68297, - "Ġskeleton": 29435, - "Ġskeletons": 74307, - "Ġskept": 36579, - "Ġskeptic": 54850, - "Ġskeptical": 43829, - "Ġskepticism": 66133, - "Ġsketch": 25529, - "Ġsketches": 67682, - "Ġskew": 40543, - "Ġskewed": 86472, - "Ġski": 28679, - "Ġskies": 49293, - "Ġskiing": 62017, - "Ġskill": 9947, - "Ġskilled": 25530, - "Ġskillet": 77985, - "Ġskills": 7361, - "Ġskim": 78569, - "Ġskimage": 92276, - "Ġskin": 6787, - "Ġskincare": 79605, - "Ġskinny": 47677, - "Ġskins": 49950, - "Ġskip": 10706, - "Ġskipped": 35157, - "Ġskipping": 42659, - "Ġskips": 91520, - "Ġskirm": 95280, - "Ġskirt": 37280, - "Ġskirts": 76205, - "Ġskl": 82542, - "Ġsklearn": 17987, - "Ġsku": 52322, - "Ġskull": 34013, - "Ġskulle": 69258, - "Ġskulls": 97612, - "Ġsky": 12884, - "Ġskyline": 87739, - "Ġskype": 86672, - "Ġskyrocket": 74622, - "Ġskys": 84321, - "Ġskóry": 137772, - "ĠskÅĤ": 137941, - "ĠskÅĤad": 131185, - "ĠskÅĤada": 137942, - "Ġsl": 1739, - "Ġsla": 31893, - "Ġslab": 54691, - "Ġslack": 45619, - "Ġslag": 66591, - "Ġslain": 69186, - "Ġslam": 44892, - "Ġslammed": 49265, - "Ġslamming": 91860, - "Ġslander": 98458, - "Ġslang": 79912, - "Ġslap": 50052, - "Ġslapped": 71788, - "Ġslash": 36626, - "Ġslashed": 83524, - "Ġslashes": 87396, - "Ġslashing": 91943, - "Ġslate": 50580, - "Ġslated": 52270, - "Ġslaughter": 39756, - "Ġslaughtered": 85747, - "Ġslave": 20362, - "Ġslavery": 32692, - "Ġslaves": 31660, - "Ġsle": 19747, - "Ġsled": 94412, - "Ġslee": 21661, - "Ġsleek": 47394, - "Ġsleep": 6084, - "Ġsleeper": 82547, - "Ġsleeping": 21127, - "Ġsleeps": 71390, - "Ġsleepy": 81793, - "Ġsleeve": 36153, - "Ġsleeves": 42375, - "Ġslender": 72242, - "Ġslept": 45398, - "Ġslew": 59032, - "Ġslic": 21652, - "Ġslice": 15983, - "Ġsliced": 47615, - "Ġslices": 34254, - "Ġslicing": 84915, - "Ġslick": 49638, - "Ġslid": 59914, - "Ġslide": 14983, - "Ġslider": 21412, - "Ġsliders": 81050, - "Ġslides": 21521, - "Ġslideshow": 64447, - "Ġsliding": 33832, - "Ġslight": 8112, - "Ġslightest": 59047, - "Ġslightly": 10078, - "Ġslik": 75224, - "Ġslim": 29353, - "Ġslime": 77844, - "Ġsling": 87633, - "Ġslip": 21134, - "Ġslipped": 42478, - "Ġslippery": 70572, - "Ġslipping": 63702, - "Ġslips": 67654, - "Ġslit": 78030, - "Ġslo": 17603, - "Ġslog": 34949, - "Ġslogan": 51537, - "Ġslogans": 77001, - "Ġslope": 30232, - "Ġslopes": 59008, - "Ġsloppy": 73982, - "Ġslot": 9446, - "Ġslots": 15711, - "Ġslow": 6301, - "Ġslowdown": 73917, - "Ġslowed": 47846, - "Ġslower": 28393, - "Ġslowing": 47308, - "Ġslowly": 13970, - "Ġslows": 69170, - "Ġslu": 98455, - "Ġslug": 24470, - "Ġslugg": 79022, - "Ġsluggish": 86946, - "Ġslump": 85728, - "Ġslur": 83571, - "Ġslut": 38397, - "Ġsluts": 57595, - "Ġsm": 1525, - "Ġsmack": 90494, - "Ġsmall": 2613, - "Ġsmaller": 9155, - "Ġsmallest": 24632, - "Ġsmart": 7785, - "Ġsmarter": 46478, - "Ġsmartphone": 21511, - "Ġsmartphones": 35022, - "Ġsmarty": 76048, - "Ġsmash": 51906, - "Ġsmashed": 56420, - "Ġsmashing": 82488, - "Ġsmb": 77792, - "Ġsme": 90467, - "Ġsmear": 80503, - "Ġsmell": 22068, - "Ġsmelled": 85698, - "Ġsmelling": 96003, - "Ġsmells": 49637, - "Ġsmile": 15289, - "Ġsmiled": 30545, - "Ġsmiles": 42532, - "Ġsmiling": 36063, - "Ġsmirk": 85024, - "Ġsmith": 76721, - "Ġsmo": 43573, - "Ġsmoke": 16205, - "Ġsmoked": 47537, - "Ġsmoker": 77220, - "Ġsmokers": 56657, - "Ġsmoking": 19578, - "Ġsmooth": 10876, - "Ġsmoothed": 92839, - "Ġsmoother": 60305, - "Ġsmoothing": 61961, - "Ġsmoothly": 38411, - "Ġsms": 37929, - "Ġsmtp": 54397, - "Ġsmugg": 40737, - "Ġsmuggling": 72934, - "ĠsmÃ¥": 82844, - "Ġsn": 4131, - "Ġsnack": 39359, - "Ġsnacks": 42302, - "Ġsnag": 71802, - "Ġsnake": 25265, - "Ġsnakes": 56096, - "Ġsnap": 10658, - "Ġsnapchat": 98050, - "Ġsnapped": 47010, - "Ġsnapping": 79789, - "Ġsnaps": 51304, - "Ġsnapshot": 16295, - "Ġsnapshots": 61823, - "Ġsnatch": 84560, - "Ġsnd": 28612, - "Ġsne": 20760, - "Ġsneak": 44164, - "Ġsneakers": 67191, - "Ġsnel": 89711, - "Ġsniff": 57287, - "Ġsniper": 62282, - "Ġsnippet": 43065, - "Ġsnippets": 68642, - "Ġsno": 65084, - "Ġsnork": 96706, - "Ġsnow": 11794, - "Ġsnowy": 89773, - "Ġsnprintf": 36446, - "Ġsns": 50101, - "Ġsnug": 85601, - "Ġso": 773, - "Ġsoak": 60692, - "Ġsoaked": 68875, - "Ġsoaking": 77346, - "Ġsoap": 26785, - "Ġsoar": 98465, - "Ġsoared": 85955, - "Ġsoaring": 68897, - "Ġsob": 11493, - "Ġsober": 49405, - "Ġsobie": 76258, - "Ġsobre": 15131, - "ĠsobÄħ": 138495, - "Ġsoc": 12019, - "Ġsoccer": 22174, - "Ġsoci": 15610, - "Ġsocial": 3590, - "Ġsociale": 74007, - "Ġsociales": 64107, - "Ġsocialism": 50518, - "Ġsocialist": 40189, - "Ġsocially": 39318, - "Ġsociedad": 89687, - "Ġsocietal": 58429, - "Ġsocieties": 33675, - "Ġsociety": 8232, - "ĠsocietÃł": 132926, - "Ġsocio": 40489, - "Ġsocioeconomic": 79331, - "Ġsociology": 77108, - "Ġsociété": 76724, - "Ġsock": 11087, - "Ġsockaddr": 24169, - "Ġsocket": 7575, - "Ġsockets": 47557, - "Ġsockfd": 80773, - "Ġsocks": 38986, - "Ġsod": 23952, - "Ġsoda": 38862, - "Ġsodium": 38595, - "Ġsodom": 82637, - "Ġsof": 85806, - "Ġsofa": 31069, - "Ġsofas": 96406, - "Ġsofort": 76720, - "Ġsoft": 8413, - "Ġsoftball": 95268, - "Ġsoften": 79945, - "Ġsoftened": 89058, - "Ġsofter": 63130, - "Ġsoftly": 56050, - "Ġsoftmax": 76369, - "Ġsoftware": 3162, - "Ġsog": 44842, - "Ġsogar": 71765, - "Ġsoil": 17171, - "Ġsoils": 68461, - "Ġsoir": 56892, - "Ġsoirée": 142434, - "Ġsoit": 44341, - "Ġsok": 83726, - "Ġsol": 2048, - "Ġsola": 95089, - "Ġsolar": 12941, - "Ġsold": 6088, - "Ġsolder": 59777, - "Ġsoldier": 26110, - "Ġsoldiers": 14856, - "Ġsole": 13309, - "Ġsolely": 21063, - "Ġsolemn": 63602, - "Ġsolic": 29744, - "Ġsolicit": 55146, - "Ġsolicitud": 95857, - "Ġsolid": 6437, - "Ġsolidarity": 43154, - "Ġsolidity": 72163, - "Ġsolids": 81386, - "Ġsolitary": 57129, - "Ġsolitude": 98444, - "Ġsoll": 22589, - "Ġsollen": 81146, - "Ġsollte": 50926, - "Ġsollten": 74453, - "Ġsolo": 13529, - "Ġsoluble": 86945, - "Ġsolución": 142706, - "Ġsolution": 6291, - "Ġsolutions": 9904, - "Ġsolução": 143396, - "Ġsolve": 11625, - "Ġsolved": 27956, - "Ġsolvent": 68896, - "Ġsolver": 28961, - "Ġsolves": 67477, - "Ġsolving": 21828, - "Ġsom": 1757, - "Ġsoma": 57759, - "Ġsome": 1045, - "Ġsomebody": 18079, - "Ġsomeday": 53008, - "Ġsomehow": 16925, - "Ġsomeone": 4325, - "Ġsomething": 2494, - "Ġsometime": 35013, - "Ġsometimes": 7025, - "Ġsomew": 9002, - "Ġsomewhat": 14400, - "Ġsomewhere": 14696, - "Ġsommes": 73433, - "Ġson": 4438, - "Ġsond": 46837, - "Ġsondern": 51290, - "Ġsong": 5492, - "Ġsongs": 11674, - "Ġsongwriter": 84657, - "Ġsonic": 71336, - "Ġsono": 20821, - "Ġsonra": 84126, - "Ġsonras": 138857, - "Ġsonrası": 138858, - "Ġsonrasında": 140820, - "Ġsons": 25350, - "Ġsonst": 95243, - "Ġsont": 14789, - "Ġsonuç": 131900, - "Ġsoo": 43176, - "Ġsoon": 5135, - "Ġsooner": 30273, - "Ġsoothing": 64364, - "Ġsop": 70204, - "Ġsoph": 18701, - "Ġsophistic": 23984, - "Ġsophisticated": 26779, - "Ġsophistication": 84436, - "Ġsophomore": 50398, - "Ġsopr": 79129, - "Ġsor": 24534, - "Ġsore": 35266, - "Ġsorrow": 57496, - "Ġsorry": 14589, - "Ġsort": 3378, - "ĠsortBy": 66913, - "ĠsortOrder": 78651, - "Ġsortable": 56775, - "Ġsorte": 79344, - "Ġsorted": 10615, - "Ġsorter": 90452, - "Ġsortie": 83043, - "Ġsorting": 28273, - "Ġsorts": 20853, - "Ġsos": 60877, - "Ġsost": 77948, - "Ġsotto": 95241, - "Ġsou": 5822, - "Ġsought": 16105, - "Ġsouha": 76338, - "Ġsoul": 13527, - "Ġsouls": 34726, - "Ġsound": 5112, - "Ġsounded": 34308, - "Ġsounding": 48127, - "Ġsounds": 10362, - "Ġsoundtrack": 44899, - "Ġsoup": 19174, - "Ġsour": 20282, - "Ġsource": 2530, - "ĠsourceMapping": 44584, - "ĠsourceMappingURL": 44695, - "Ġsourced": 41111, - "Ġsources": 8173, - "Ġsourcing": 73181, - "Ġsous": 31492, - "Ġsout": 64727, - "Ġsouth": 9806, - "Ġsoutheast": 41452, - "Ġsoutheastern": 82109, - "Ġsouthern": 18070, - "Ġsouthwest": 52985, - "Ġsouthwestern": 98811, - "Ġsouvenir": 97295, - "Ġsouvent": 70051, - "Ġsovere": 28997, - "Ġsovereign": 45284, - "Ġsovereignty": 45959, - "Ġsow": 57465, - "Ġsowie": 39307, - "Ġsoy": 28739, - "Ġsoát": 134814, - "Ġsp": 978, - "Ġspa": 30393, - "Ġspac": 99008, - "Ġspace": 3550, - "Ġspacecraft": 41540, - "Ġspaced": 63828, - "Ġspacer": 78849, - "Ġspaces": 12621, - "Ġspaceship": 84842, - "Ġspacing": 25943, - "Ġspacious": 32136, - "Ġspaghetti": 86910, - "Ġspam": 25328, - "Ġspan": 9390, - "Ġspanish": 77032, - "Ġspanking": 75735, - "Ġspanning": 55786, - "Ġspans": 44295, - "Ġspar": 79869, - "Ġspare": 23863, - "Ġspared": 73588, - "Ġsparing": 94955, - "Ġspark": 15186, - "Ġsparked": 40444, - "Ġsparking": 98982, - "Ġsparkle": 95070, - "Ġsparkling": 63512, - "Ġsparks": 75783, - "Ġsparse": 33444, - "Ġspas": 81960, - "Ġspat": 62883, - "Ġspatial": 27979, - "Ġspawn": 18042, - "Ġspawned": 52534, - "Ġspawning": 78429, - "Ġspawns": 92676, - "Ġspd": 81462, - "Ġspe": 2341, - "Ġspeak": 6468, - "Ġspeaker": 18601, - "Ġspeakers": 21326, - "Ġspeaking": 12094, - "Ġspeaks": 21191, - "Ġspear": 40863, - "Ġspec": 1398, - "Ġspecial": 3281, - "Ġspecialised": 87904, - "Ġspecialist": 23753, - "Ġspecialists": 34316, - "Ġspecialization": 65879, - "Ġspecialize": 47344, - "Ġspecialized": 27076, - "Ġspecializes": 45572, - "Ġspecializing": 57294, - "Ġspecially": 34326, - "Ġspecials": 59774, - "Ġspecialties": 93336, - "Ġspecialty": 35874, - "Ġspecies": 9419, - "Ġspecific": 3151, - "Ġspecifically": 11689, - "Ġspecification": 25128, - "Ġspecifications": 28703, - "Ġspecificity": 74941, - "Ġspecifics": 48349, - "Ġspecified": 5189, - "Ġspecifier": 97616, - "Ġspecifies": 29102, - "Ġspecify": 13837, - "Ġspecifying": 37838, - "Ġspecimen": 57084, - "Ġspecimens": 56649, - "Ġspecs": 32247, - "Ġspect": 9431, - "Ġspectacle": 56791, - "Ġspectacular": 27709, - "Ġspectator": 88623, - "Ġspectators": 69302, - "Ġspectra": 62597, - "Ġspectral": 55977, - "Ġspectro": 65325, - "Ġspectrum": 19745, - "Ġspecular": 85417, - "Ġspeculate": 63501, - "Ġspeculated": 73777, - "Ġspeculation": 32322, - "Ġspeculative": 65736, - "Ġsped": 85610, - "Ġspeech": 8806, - "Ġspeeches": 43340, - "Ġspeed": 4628, - "Ġspeeding": 57575, - "Ġspeeds": 24722, - "Ġspeedy": 65483, - "Ġspel": 70935, - "Ġspell": 12845, - "Ġspelled": 67818, - "Ġspelling": 42429, - "Ġspells": 25619, - "Ġspend": 8329, - "Ġspender": 83888, - "Ġspending": 10164, - "Ġspends": 37102, - "Ġspent": 7391, - "Ġspep": 69236, - "Ġsper": 46016, - "Ġsperm": 39599, - "Ġsperma": 73368, - "Ġsph": 41722, - "Ġsphere": 25366, - "Ġspheres": 65718, - "Ġspherical": 64151, - "Ġspi": 26949, - "Ġspice": 41686, - "Ġspices": 48559, - "Ġspicy": 47251, - "Ġspider": 34354, - "Ġspiders": 62136, - "Ġspiel": 78152, - "Ġspiele": 91855, - "Ġspielen": 58237, - "Ġspies": 68898, - "Ġspike": 36293, - "Ġspiked": 92242, - "Ġspikes": 50660, - "Ġspill": 38797, - "Ġspilled": 73025, - "Ġspills": 82951, - "Ġspin": 12616, - "Ġspinach": 67698, - "Ġspinal": 49012, - "Ġspindle": 98191, - "Ġspine": 34676, - "Ġspinner": 35491, - "Ġspinning": 37860, - "Ġspins": 44758, - "Ġspir": 18318, - "Ġspiral": 41097, - "Ġspirit": 8913, - "Ġspirited": 97043, - "Ġspirits": 30639, - "Ġspiritual": 17849, - "Ġspirituality": 74356, - "Ġspiritually": 87753, - "Ġspit": 55987, - "Ġspite": 33681, - "Ġspl": 12503, - "Ġsplash": 34632, - "Ġsple": 86350, - "Ġsplendid": 69860, - "Ġsplice": 88290, - "Ġspline": 70086, - "Ġsplit": 6718, - "Ġsplits": 40467, - "Ġsplitted": 84889, - "Ġsplitter": 72986, - "Ġsplitting": 44373, - "Ġspo": 19451, - "Ġspoil": 64793, - "Ġspoiled": 71424, - "Ġspoiler": 72206, - "Ġspoilers": 65327, - "Ġspoke": 12290, - "Ġspoken": 21355, - "Ġspokes": 11200, - "Ġspokesman": 17885, - "Ġspokesperson": 27903, - "Ġspokeswoman": 33141, - "Ġsponge": 68348, - "Ġspons": 13461, - "Ġsponsor": 24434, - "Ġsponsored": 29538, - "Ġsponsoring": 84341, - "Ġsponsors": 38601, - "Ġsponsorship": 54431, - "Ġspont": 36291, - "Ġspontaneous": 53457, - "Ġspontaneously": 87458, - "Ġspoof": 87890, - "Ġspooky": 97076, - "Ġspoon": 45505, - "Ġspor": 60916, - "Ġsport": 10552, - "Ġsporting": 34927, - "Ġsports": 9833, - "Ġspos": 53407, - "Ġsposób": 98621, - "Ġspot": 7702, - "Ġspotify": 87790, - "Ġspotlight": 36873, - "Ġspots": 18773, - "Ġspotted": 29552, - "Ġspotting": 89219, - "Ġspouse": 30980, - "Ġspouses": 65212, - "Ġspp": 90699, - "Ġspr": 8151, - "Ġspraw": 34808, - "Ġsprawling": 70892, - "Ġspray": 22899, - "Ġsprayed": 77621, - "Ġspraying": 82536, - "Ġspre": 65562, - "Ġspread": 8865, - "Ġspreading": 30035, - "Ġspreads": 42553, - "Ġspreadsheet": 45886, - "Ġspree": 78628, - "Ġspring": 10464, - "Ġspringfox": 96377, - "Ġsprings": 41142, - "Ġsprink": 50698, - "Ġsprinkle": 84847, - "Ġsprint": 37849, - "Ġsprintf": 11812, - "Ġsprite": 17051, - "ĠspriteBatch": 77188, - "Ġsprites": 46757, - "Ġsprung": 91210, - "Ġsprz": 127977, - "Ġsprzeda": 127978, - "Ġsprzedaż": 139648, - "Ġsprzedaży": 138326, - "ĠsprzÄĻ": 136640, - "ĠsprzÄĻt": 136641, - "Ġspun": 56485, - "Ġspur": 59031, - "Ġspurred": 84647, - "Ġspy": 21236, - "ĠspyOn": 66534, - "Ġspying": 62214, - "Ġspäter": 87791, - "Ġspéc": 70169, - "Ġspécial": 75205, - "Ġspécialisé": 143530, - "Ġspécifique": 142943, - "ĠspÄĻd": 140781, - "ĠspÄĻdz": 140782, - "Ġsq": 18031, - "Ġsql": 5704, - "ĠsqlCommand": 85304, - "ĠsqlSession": 90065, - "Ġsqlalchemy": 42175, - "Ġsqlite": 22003, - "Ġsqr": 85029, - "Ġsqrt": 17946, - "Ġsqu": 8167, - "Ġsquad": 18529, - "Ġsquadron": 97280, - "Ġsquads": 77196, - "Ġsquare": 9334, - "Ġsquared": 52263, - "Ġsquarely": 94463, - "Ġsquares": 31340, - "Ġsquash": 58476, - "Ġsquat": 57470, - "Ġsque": 31132, - "Ġsqueez": 43746, - "Ġsqueeze": 36563, - "Ġsqueezed": 64162, - "Ġsqueezing": 87707, - "Ġsquid": 89175, - "Ġsquir": 45950, - "Ġsquirrel": 90524, - "Ġsquirt": 72481, - "Ġsr": 18962, - "Ġsrand": 68268, - "Ġsrc": 2286, - "Ġsrv": 43578, - "Ġss": 10870, - "Ġsscanf": 61913, - "Ġssh": 29230, - "Ġssid": 96361, - "Ġssize": 42951, - "Ġssl": 33537, - "Ġst": 357, - "Ġsta": 28511, - "Ġstaat": 73824, - "Ġstab": 26964, - "Ġstabbed": 50180, - "Ġstabbing": 70922, - "Ġstabil": 26184, - "Ġstability": 19753, - "Ġstabilization": 82838, - "Ġstabilize": 69136, - "Ġstabilized": 92063, - "Ġstable": 15175, - "Ġstack": 5611, - "Ġstacked": 41315, - "Ġstacking": 74072, - "Ġstacks": 39950, - "Ġstad": 86123, - "Ġstadium": 23889, - "Ġstadiums": 89084, - "Ġstaff": 5570, - "Ġstaffer": 77134, - "Ġstaffers": 60250, - "Ġstaffing": 64051, - "Ġstag": 76436, - "Ġstage": 6430, - "Ġstaged": 50057, - "Ġstages": 17628, - "Ġstagger": 39156, - "Ġstaggering": 54844, - "Ġstaging": 47762, - "Ġstagn": 53263, - "Ġstagnant": 95943, - "Ġstain": 51964, - "Ġstained": 60052, - "Ġstaining": 87796, - "Ġstainless": 24461, - "Ġstains": 62463, - "Ġstair": 36549, - "Ġstaircase": 61762, - "Ġstairs": 31149, - "Ġstake": 18279, - "Ġstakeholders": 38110, - "Ġstakes": 44425, - "Ġstal": 79476, - "Ġstale": 50351, - "Ġstalk": 54872, - "Ġstalking": 81795, - "Ġstall": 42693, - "Ġstalled": 67841, - "Ġstalls": 73573, - "Ġstamina": 60684, - "Ġstamp": 21206, - "Ġstamped": 64039, - "Ġstamps": 49212, - "Ġstan": 45194, - "Ġstance": 28931, - "Ġstand": 2498, - "Ġstandalone": 43388, - "Ġstandard": 5297, - "ĠstandardUserDefaults": 55989, - "Ġstandardized": 50014, - "Ġstandards": 10659, - "Ġstandby": 71738, - "Ġstanding": 11259, - "Ġstandings": 67563, - "Ġstandoff": 84327, - "Ġstandout": 71460, - "Ġstandpoint": 50782, - "Ġstands": 13352, - "Ġstanza": 95436, - "Ġstap": 35014, - "Ġstaple": 48956, - "Ġstaples": 86829, - "Ġstar": 6774, - "Ġstarch": 69081, - "Ġstare": 45843, - "Ġstared": 44035, - "Ġstares": 94402, - "Ġstaring": 36774, - "Ġstark": 37146, - "Ġstarred": 58235, - "Ġstarring": 39400, - "Ġstars": 9759, - "Ġstart": 1191, - "ĠstartActivity": 18273, - "ĠstartActivityForResult": 73627, - "ĠstartDate": 29686, - "ĠstartIndex": 40693, - "ĠstartPoint": 82429, - "ĠstartPos": 68791, - "ĠstartPosition": 98342, - "ĠstartTime": 22858, - "ĠstartX": 68599, - "ĠstartY": 61702, - "Ġstarted": 3855, - "Ġstarter": 26697, - "Ġstarters": 42706, - "Ġstarting": 5916, - "Ġstartled": 88715, - "Ġstartling": 67734, - "Ġstarts": 8471, - "Ġstarttime": 92395, - "Ġstartup": 20567, - "Ġstartups": 43383, - "Ġstarvation": 77145, - "Ġstarving": 77401, - "Ġstash": 64037, - "Ġstat": 2793, - "Ġstata": 79221, - "Ġstate": 1584, - "Ġstated": 10982, - "Ġstatement": 5114, - "Ġstatements": 12239, - "Ġstates": 5302, - "Ġstatewide": 50941, - "Ġstati": 95877, - "Ġstatic": 1099, - "Ġstatically": 91174, - "Ġstating": 27798, - "Ġstation": 8056, - "Ġstationary": 52635, - "Ġstationed": 62520, - "Ġstations": 17337, - "Ġstatist": 20115, - "Ġstatistic": 42489, - "Ġstatistical": 28464, - "Ġstatistically": 46852, - "Ġstatistics": 13142, - "Ġstato": 48153, - "Ġstats": 10472, - "Ġstatt": 67317, - "Ġstatue": 34272, - "Ġstatues": 57902, - "Ġstature": 76623, - "Ġstatus": 2639, - "ĠstatusBar": 90120, - "ĠstatusCode": 35532, - "Ġstatuses": 59358, - "Ġstatute": 34686, - "Ġstatutes": 61182, - "Ġstatutory": 44430, - "Ġstaunch": 81621, - "Ġstav": 74235, - "Ġstay": 4717, - "Ġstayed": 19613, - "Ġstaying": 19429, - "Ġstays": 26558, - "ĠstaÅĤ": 134118, - "Ġstd": 1460, - "ĠstdClass": 55287, - "Ġstddev": 87867, - "Ġstderr": 26436, - "Ġstdin": 31369, - "Ġstdout": 20075, - "Ġste": 4087, - "Ġstead": 16845, - "Ġsteadfast": 84287, - "Ġsteadily": 41971, - "Ġsteady": 24020, - "Ġsteak": 48959, - "Ġsteal": 26571, - "Ġstealing": 37998, - "Ġsteals": 61466, - "Ġstealth": 46965, - "Ġsteam": 20312, - "Ġsteel": 9509, - "Ġsteep": 31266, - "Ġsteer": 48615, - "Ġsteering": 32177, - "Ġstehen": 64857, - "Ġsteht": 54383, - "Ġstellar": 47217, - "Ġstellen": 68102, - "Ġstellt": 97096, - "Ġstem": 19101, - "Ġstemmed": 98518, - "Ġstemming": 75944, - "Ġstems": 43714, - "Ġstencil": 72370, - "Ġstep": 3019, - "Ġstepped": 24326, - "Ġstepper": 95932, - "Ġstepping": 35467, - "Ġsteps": 7354, - "Ġster": 21809, - "Ġstere": 22646, - "Ġstereo": 37952, - "Ġstereotype": 73646, - "Ġstereotypes": 53068, - "Ġsteril": 65640, - "Ġsterile": 81643, - "Ġsterling": 71937, - "Ġstern": 57544, - "Ġsteroid": 76748, - "Ġsteroids": 57061, - "Ġstesso": 82588, - "Ġstew": 60343, - "Ġsteward": 68506, - "Ġstick": 9214, - "Ġsticker": 46177, - "Ġstickers": 49296, - "Ġsticking": 36972, - "Ġsticks": 33140, - "Ġsticky": 27402, - "Ġstif": 91226, - "Ġstiff": 30061, - "Ġstiffness": 69234, - "Ġstigma": 59281, - "Ġstil": 90766, - "Ġstill": 2058, - "Ġstim": 12647, - "Ġstimulate": 49977, - "Ġstimulated": 80371, - "Ġstimulates": 94355, - "Ġstimulating": 64692, - "Ġstimulation": 40859, - "Ġstimuli": 55588, - "Ġstimulus": 38435, - "Ġsting": 54313, - "Ġstint": 60708, - "Ġstip": 42673, - "Ġstir": 23065, - "Ġstirred": 74840, - "Ġstirring": 53954, - "Ġstitch": 32861, - "Ġstitched": 94608, - "Ġstitches": 61936, - "Ġstitching": 79131, - "Ġstk": 55003, - "Ġstm": 55258, - "Ġstmt": 20020, - "Ġsto": 42032, - "Ġstochastic": 95240, - "Ġstock": 5591, - "Ġstocked": 70016, - "Ġstockholm": 92090, - "Ġstocking": 79149, - "Ġstockings": 75605, - "Ġstocks": 22488, - "Ġstoi": 87344, - "Ġstole": 39506, - "Ġstolen": 22329, - "Ġstom": 20100, - "Ġstomach": 22350, - "Ġstone": 9798, - "Ġstones": 26210, - "Ġstood": 14638, - "Ġstool": 63072, - "Ġstools": 89772, - "Ġstop": 2936, - "Ġstopped": 10497, - "Ġstopping": 22535, - "Ġstops": 17933, - "Ġstopwatch": 85572, - "Ġstopwords": 91044, - "Ġstor": 33689, - "Ġstorage": 5819, - "Ġstore": 3553, - "Ġstored": 9768, - "Ġstorefront": 90728, - "Ġstores": 10533, - "Ġstoria": 98889, - "Ġstories": 7343, - "Ġstoring": 27572, - "Ġstorm": 13458, - "Ġstormed": 84987, - "Ġstorms": 43483, - "Ġstory": 3364, - "Ġstoryboard": 42033, - "Ġstoryline": 50628, - "Ġstoryt": 40006, - "Ġstorytelling": 47829, - "Ġstos": 95983, - "Ġstout": 89672, - "Ġstove": 44015, - "Ġstr": 607, - "ĠstrSQL": 80153, - "ĠstrSql": 52131, - "Ġstraight": 7678, - "Ġstraightforward": 30339, - "Ġstrain": 25716, - "Ġstrained": 72679, - "Ġstrains": 41300, - "Ġstrand": 41489, - "Ġstranded": 62105, - "Ġstrands": 68764, - "Ġstrang": 46205, - "Ġstrange": 14888, - "Ġstrangely": 69606, - "Ġstranger": 33958, - "Ġstrangers": 39621, - "Ġstrap": 33547, - "Ġstrapon": 92246, - "Ġstrapped": 90024, - "Ġstraps": 48249, - "Ġstrat": 43297, - "Ġstrateg": 5275, - "Ġstrategic": 18580, - "Ġstrategically": 67674, - "Ġstrategies": 14830, - "Ġstrategist": 64135, - "Ġstrategy": 8282, - "Ġstratég": 142681, - "Ġstratégie": 142682, - "Ġstraw": 30007, - "Ġstrawberries": 75103, - "Ġstrawberry": 72600, - "Ġstray": 61390, - "Ġstrcat": 33512, - "Ġstrchr": 64035, - "Ġstrcmp": 24272, - "Ġstrconv": 33317, - "Ġstrcpy": 23072, - "Ġstrdup": 48819, - "Ġstre": 5412, - "Ġstreak": 29214, - "Ġstream": 4269, - "Ġstreamed": 73245, - "Ġstreaming": 16842, - "Ġstreamline": 81603, - "Ġstreamlined": 74060, - "Ġstreams": 23045, - "Ġstreet": 8592, - "Ġstreets": 14371, - "Ġstren": 92219, - "Ġstrength": 8170, - "Ġstrengthen": 19681, - "Ġstrengthened": 59762, - "Ġstrengthening": 47413, - "Ġstrengthens": 95831, - "Ġstrengths": 35386, - "Ġstrerror": 43673, - "Ġstress": 8464, - "Ġstressed": 31547, - "Ġstresses": 58523, - "Ġstressful": 45783, - "Ġstressing": 93691, - "Ġstret": 26185, - "Ġstretch": 14501, - "Ġstretched": 40298, - "Ġstretches": 49599, - "Ġstretching": 41849, - "Ġstrftime": 81400, - "Ġstri": 5950, - "Ġstrict": 7304, - "Ġstricter": 83718, - "Ġstrictly": 25470, - "Ġstride": 19228, - "Ġstrides": 36287, - "Ġstrife": 96612, - "Ġstrike": 13169, - "Ġstrikeouts": 88926, - "Ġstriker": 43941, - "Ġstrikes": 22368, - "Ġstriking": 21239, - "Ġstring": 914, - "ĠstringBuffer": 60707, - "ĠstringBuilder": 39050, - "ĠstringBy": 42098, - "ĠstringByAppending": 59261, - "ĠstringByAppendingString": 96510, - "ĠstringValue": 78468, - "ĠstringWith": 19027, - "ĠstringWithFormat": 20067, - "Ġstringent": 68999, - "Ġstringify": 83166, - "Ġstrings": 9069, - "Ġstringstream": 80927, - "Ġstrip": 13316, - "Ġstripe": 45542, - "Ġstriped": 67590, - "Ġstripes": 54688, - "Ġstripped": 36679, - "Ġstripper": 96687, - "Ġstripping": 66670, - "Ġstrips": 29922, - "Ġstripslashes": 63223, - "Ġstrive": 36006, - "Ġstrives": 74551, - "Ġstriving": 67627, - "Ġstrlen": 12420, - "Ġstrm": 88776, - "Ġstrncmp": 93202, - "Ġstrncpy": 57329, - "Ġstro": 30411, - "Ġstroke": 12654, - "ĠstrokeLine": 77829, - "ĠstrokeWidth": 62825, - "Ġstrokes": 52472, - "Ġstroll": 68883, - "Ġstron": 77061, - "Ġstrong": 3746, - "Ġstronger": 16245, - "Ġstrongest": 29905, - "Ġstronghold": 85468, - "Ġstrongly": 16510, - "ĠstronÄĻ": 139926, - "Ġstrpos": 43468, - "Ġstrr": 79452, - "Ġstrs": 57584, - "Ġstrstr": 66295, - "Ġstrt": 13613, - "Ġstrtok": 48345, - "Ġstrtol": 33624, - "Ġstrtolower": 38814, - "Ġstrtotime": 24646, - "Ġstrtoupper": 60440, - "Ġstruck": 17490, - "Ġstruct": 2036, - "Ġstructs": 62845, - "Ġstructural": 23759, - "Ġstructure": 5944, - "Ġstructured": 32930, - "Ġstructures": 14389, - "Ġstrugg": 7930, - "Ġstruggle": 14651, - "Ġstruggled": 27115, - "Ġstruggles": 27870, - "Ġstruggling": 19962, - "Ġstrut": 82343, - "Ġsts": 51756, - "Ġstu": 54754, - "Ġstub": 13633, - "Ġstubborn": 51396, - "Ġstuck": 15700, - "Ġstud": 1673, - "Ġstudent": 5458, - "Ġstudents": 4143, - "Ġstudied": 19476, - "Ġstudies": 7822, - "Ġstudio": 14029, - "Ġstudios": 41695, - "Ġstuds": 85621, - "Ġstudy": 3920, - "Ġstudying": 20956, - "Ġstuff": 6259, - "Ġstuffed": 44313, - "Ġstuffing": 82516, - "Ġstumble": 74137, - "Ġstumbled": 49057, - "Ġstumbling": 87355, - "Ġstump": 88612, - "Ġstun": 65428, - "Ġstunned": 46926, - "Ġstunning": 19850, - "Ġstunt": 59025, - "Ġstup": 90032, - "Ġstupid": 18253, - "Ġstupidity": 87537, - "Ġsturdy": 44552, - "Ġstutter": 90537, - "Ġsty": 17613, - "Ġstyl": 48204, - "Ġstyle": 1707, - "ĠstyleUrls": 17650, - "Ġstyled": 11096, - "Ġstyles": 9222, - "Ġstylesheet": 73802, - "Ġstyling": 41328, - "Ġstylish": 31361, - "Ġstylist": 66373, - "Ġstør": 74350, - "Ġsu": 913, - "Ġsua": 19345, - "Ġsuas": 52097, - "Ġsub": 1186, - "ĠsubTitle": 91910, - "Ġsubclass": 37190, - "Ġsubclasses": 68183, - "Ġsubconscious": 83851, - "Ġsubcontract": 94379, - "Ġsubdir": 98021, - "Ġsubdiv": 66509, - "Ġsubdivision": 59822, - "Ġsubdivisions": 91445, - "Ġsubdued": 92419, - "Ġsubgroup": 80115, - "Ġsubj": 80317, - "Ġsubject": 3832, - "Ġsubjected": 37026, - "Ġsubjective": 43022, - "Ġsubjects": 14878, - "Ġsublic": 28491, - "Ġsublicense": 28787, - "Ġsublime": 70146, - "Ġsublist": 93893, - "Ġsubmar": 42171, - "Ġsubmarine": 57529, - "Ġsubmarines": 85542, - "Ġsubmenu": 77397, - "Ġsubmerged": 84077, - "Ġsubmission": 20503, - "Ġsubmissions": 36835, - "Ġsubmissive": 96240, - "Ġsubmit": 9318, - "Ġsubmits": 94035, - "Ġsubmitted": 14634, - "Ġsubmitting": 33094, - "Ġsubmodule": 95570, - "Ġsubnet": 51457, - "Ġsubordinate": 78163, - "Ġsubparagraph": 74815, - "Ġsubplot": 46626, - "Ġsubpo": 60509, - "Ġsubpoena": 72769, - "Ġsubprocess": 23514, - "Ġsubrange": 93791, - "Ġsubreddit": 62092, - "Ġsubroutine": 88334, - "Ġsubs": 5147, - "Ġsubscri": 12398, - "Ġsubscribe": 17963, - "Ġsubscribed": 52100, - "Ġsubscriber": 32115, - "Ġsubscribers": 30020, - "Ġsubscribing": 39785, - "Ġsubscript": 98250, - "Ġsubscription": 15142, - "Ġsubscriptions": 40355, - "Ġsubsection": 22848, - "Ġsubsequ": 13085, - "Ġsubsequent": 17420, - "Ġsubsequently": 27420, - "Ġsubset": 25993, - "Ġsubsets": 74505, - "Ġsubsid": 24863, - "Ġsubsidi": 31519, - "Ġsubsidiaries": 71102, - "Ġsubsidiary": 40064, - "Ġsubsidies": 42021, - "Ġsubsidized": 94014, - "Ġsubsidy": 67647, - "Ġsubst": 37315, - "Ġsubstance": 19699, - "Ġsubstances": 32055, - "Ġsubstant": 10913, - "Ġsubstantial": 11924, - "Ġsubstantially": 31202, - "Ġsubstantive": 66649, - "Ġsubstit": 31334, - "Ġsubstitute": 27679, - "Ġsubstituted": 62096, - "Ġsubstitutes": 90262, - "Ġsubstitution": 48968, - "Ġsubstitutions": 93650, - "Ġsubstr": 15769, - "Ġsubstrate": 52957, - "Ġsubstring": 38449, - "Ġsubsystem": 52785, - "Ġsubt": 41029, - "Ġsubtitle": 31735, - "Ġsubtitles": 66666, - "Ġsubtle": 26447, - "Ġsubtly": 86317, - "Ġsubtotal": 90381, - "Ġsubtract": 32256, - "Ġsubtraction": 75240, - "Ġsubtree": 53464, - "Ġsubtype": 52482, - "Ġsubur": 29322, - "Ġsuburb": 51165, - "Ġsuburban": 45218, - "Ġsuburbs": 46913, - "Ġsubway": 43246, - "Ġsuc": 11157, - "Ġsucc": 20038, - "Ġsucceed": 11996, - "Ġsucceeded": 25331, - "Ġsucceeding": 72720, - "Ġsucceeds": 50081, - "Ġsucces": 49451, - "Ġsuccesfully": 92636, - "Ġsuccess": 2393, - "Ġsuccesses": 47088, - "Ġsuccessful": 6849, - "Ġsuccessfully": 7790, - "Ġsuccession": 49687, - "Ġsuccessive": 48924, - "Ġsuccessor": 33565, - "Ġsuccessors": 74896, - "Ġsuccinct": 98632, - "Ġsuccès": 93399, - "Ġsuce": 74200, - "Ġsucess": 77247, - "Ġsucesso": 43462, - "Ġsuch": 1741, - "Ġsuche": 77654, - "Ġsuchen": 66124, - "Ġsucht": 40416, - "Ġsuck": 18886, - "Ġsucked": 52212, - "Ġsucker": 93788, - "Ġsucking": 43525, - "Ġsucks": 39099, - "Ġsuction": 83778, - "Ġsud": 30737, - "Ġsudah": 49796, - "Ġsudden": 10968, - "Ġsuddenly": 14843, - "Ġsudo": 25408, - "Ġsudoku": 90809, - "Ġsue": 33772, - "Ġsued": 41084, - "Ġsuede": 96635, - "Ġsuf": 55768, - "Ġsuff": 8489, - "Ġsuffer": 7676, - "Ġsuffered": 16256, - "Ġsufferers": 95360, - "Ġsuffering": 15691, - "Ġsuffers": 46421, - "Ġsuffice": 76156, - "Ġsufficient": 14016, - "Ġsufficiently": 38944, - "Ġsuffix": 20525, - "Ġsug": 30605, - "Ġsugar": 13163, - "Ġsugars": 69813, - "Ġsuger": 97584, - "Ġsuggest": 4190, - "Ġsuggested": 11827, - "Ġsuggesting": 22561, - "Ġsuggestion": 23776, - "Ġsuggestions": 18225, - "Ġsuggestive": 98478, - "Ġsuggests": 13230, - "Ġsui": 83653, - "Ġsuic": 42819, - "Ġsuicidal": 65053, - "Ġsuicide": 18144, - "Ġsuicides": 83949, - "Ġsuing": 69407, - "Ġsuis": 35631, - "Ġsuit": 7781, - "Ġsuitability": 80628, - "Ġsuitable": 14452, - "Ġsuitcase": 87849, - "Ġsuite": 16182, - "Ġsuited": 31499, - "Ġsuites": 55164, - "Ġsuits": 27976, - "Ġsuiv": 45832, - "Ġsujet": 69827, - "Ġsuk": 95790, - "Ġsul": 25774, - "Ġsulf": 39669, - "Ġsulfate": 88318, - "Ġsulfur": 71491, - "Ġsulla": 56970, - "Ġsulph": 82678, - "Ġsum": 2629, - "Ġsuma": 51313, - "Ġsumm": 34259, - "Ġsummar": 28285, - "Ġsummaries": 68922, - "Ġsummarize": 62079, - "Ġsummarized": 68629, - "Ġsummarizes": 93494, - "Ġsummary": 12126, - "Ġsummed": 65666, - "Ġsummer": 7324, - "Ġsummers": 79669, - "Ġsummit": 28948, - "Ġsummon": 27545, - "Ġsummoned": 51710, - "Ġsummons": 74300, - "Ġsums": 36398, - "Ġsun": 7015, - "Ġsund": 50582, - "Ġsunday": 92363, - "Ġsung": 39339, - "Ġsunglasses": 59369, - "Ġsunk": 67165, - "Ġsunlight": 39020, - "Ġsunny": 39698, - "Ġsunrise": 63819, - "Ġsunscreen": 82084, - "Ġsunset": 42984, - "Ġsunshine": 51395, - "Ġsunt": 39695, - "Ġsuo": 51512, - "Ġsuoi": 96020, - "Ġsup": 1026, - "Ġsuper": 2256, - "ĠsuperClass": 59657, - "Ġsuperb": 32589, - "Ġsuperclass": 77614, - "Ġsuperf": 42017, - "Ġsuperficial": 58815, - "Ġsuperhero": 45144, - "Ġsuperheroes": 90718, - "Ġsuperintendent": 73033, - "Ġsuperior": 16353, - "Ġsuperiority": 65632, - "Ġsupermarket": 48213, - "Ġsupermarkets": 76499, - "Ġsupern": 38787, - "Ġsupernatural": 48958, - "Ġsupers": 51690, - "Ġsuperst": 93605, - "Ġsuperstar": 57247, - "Ġsuperv": 15574, - "Ġsupervise": 99101, - "Ġsupervised": 58989, - "Ġsupervision": 37117, - "Ġsupervisor": 37319, - "Ġsupervisors": 72951, - "Ġsupp": 90035, - "Ġsupper": 86017, - "Ġsuppl": 81013, - "Ġsupplement": 22047, - "Ġsupplemental": 67951, - "Ġsupplementary": 79406, - "Ġsupplementation": 72696, - "Ġsupplemented": 88704, - "Ġsupplements": 32590, - "Ġsupplied": 17221, - "Ġsupplier": 18823, - "Ġsuppliers": 20350, - "Ġsupplies": 16720, - "Ġsupply": 8149, - "Ġsupplying": 43313, - "Ġsupport": 1824, - "Ġsupported": 7248, - "Ġsupporter": 36463, - "Ġsupporters": 15511, - "Ġsupporting": 12613, - "Ġsupportive": 32345, - "Ġsupports": 11554, - "Ġsuppose": 22477, - "Ġsupposed": 9966, - "Ġsupposedly": 32728, - "Ġsuppress": 27222, - "Ġsuppressed": 54989, - "Ġsuppressing": 97695, - "Ġsuppression": 45635, - "Ġsupra": 66555, - "Ġsuprem": 34125, - "Ġsupremacist": 82011, - "Ġsupremacy": 64403, - "Ġsupreme": 43122, - "Ġsupérieur": 140134, - "Ġsur": 1729, - "Ġsure": 2704, - "Ġsurely": 21502, - "Ġsurf": 20269, - "Ġsurface": 7329, - "Ġsurfaced": 57546, - "Ġsurfaces": 26431, - "Ġsurfing": 57740, - "Ġsurg": 12005, - "Ġsurge": 21781, - "Ġsurged": 83907, - "Ġsurgeon": 44998, - "Ġsurgeons": 73172, - "Ġsurgeries": 67723, - "Ġsurgery": 14829, - "Ġsurgical": 33833, - "Ġsurname": 39753, - "Ġsurpass": 52020, - "Ġsurpassed": 67228, - "Ġsurplus": 40448, - "Ġsurpr": 6218, - "Ġsurprise": 12761, - "Ġsurprised": 14453, - "Ġsurprises": 45440, - "Ġsurprising": 14861, - "Ġsurprisingly": 28292, - "Ġsurre": 24165, - "Ġsurreal": 64523, - "Ġsurrender": 31759, - "Ġsurrendered": 69944, - "Ġsurrogate": 72850, - "Ġsurround": 8995, - "Ġsurrounded": 22865, - "Ġsurrounding": 14590, - "Ġsurroundings": 39090, - "Ġsurrounds": 70274, - "Ġsurtout": 75676, - "Ġsurv": 7398, - "Ġsurve": 15403, - "Ġsurveillance": 21440, - "Ġsurvey": 10572, - "Ġsurveyed": 47998, - "Ġsurveys": 31213, - "Ġsurviv": 22750, - "Ġsurvival": 19661, - "Ġsurvive": 17697, - "Ġsurvived": 25882, - "Ġsurvives": 82317, - "Ġsurviving": 39646, - "Ġsurvivor": 48648, - "Ġsurvivors": 31596, - "Ġsus": 4481, - "Ġsuscept": 36229, - "Ġsusceptibility": 87536, - "Ġsusceptible": 46181, - "Ġsushi": 66222, - "Ġsusp": 9298, - "Ġsuspect": 15207, - "Ġsuspected": 23804, - "Ġsuspects": 29761, - "Ġsuspend": 26247, - "Ġsuspended": 21612, - "Ġsuspense": 71830, - "Ġsuspension": 24301, - "Ġsuspicion": 37041, - "Ġsuspicions": 78507, - "Ġsuspicious": 31327, - "Ġsust": 10235, - "Ġsustain": 13879, - "Ġsustainability": 40229, - "Ġsustainable": 21803, - "Ġsustained": 28659, - "Ġsustaining": 79084, - "Ġsut": 34212, - "Ġsuç": 135023, - "Ġsuất": 131531, - "Ġsuá»ijt": 134601, - "Ġsv": 13559, - "Ġsvc": 46154, - "Ġsve": 80029, - "Ġsvens": 48697, - "Ġsvensk": 79161, - "Ġsvenska": 86953, - "Ġsvg": 26852, - "Ġsvm": 66311, - "Ġsvn": 60446, - "Ġsvo": 66007, - "Ġsw": 2021, - "Ġswagger": 60823, - "Ġswal": 49354, - "Ġswallow": 41176, - "Ġswallowed": 63337, - "Ġswallowing": 90647, - "Ġswamp": 66072, - "Ġswap": 14291, - "Ġswapped": 56950, - "Ġswapping": 63719, - "Ġswaps": 73151, - "Ġswarm": 60841, - "Ġswath": 92412, - "Ġsway": 60129, - "Ġswe": 10546, - "Ġswear": 46077, - "Ġswearing": 90681, - "Ġsweat": 27466, - "Ġsweater": 60121, - "Ġsweating": 80266, - "Ġsweaty": 97421, - "Ġsweep": 23146, - "Ġsweeping": 40971, - "Ġsweeps": 96467, - "Ġsweet": 10226, - "Ġsweetheart": 91254, - "Ġsweetness": 63450, - "Ġsweets": 75557, - "Ġswell": 77253, - "Ġswelling": 54207, - "Ġswept": 40223, - "Ġswift": 29362, - "Ġswiftly": 55551, - "Ġswim": 16191, - "Ġswimming": 23380, - "Ġswims": 80636, - "Ġswing": 18806, - "Ġswinger": 23624, - "Ġswingerclub": 45854, - "Ġswingers": 54026, - "Ġswinging": 53960, - "Ġswings": 56790, - "Ġswipe": 38520, - "Ġswiper": 78319, - "Ġswirl": 86360, - "Ġswirling": 92278, - "Ġswitch": 3398, - "Ġswitched": 29875, - "Ġswitches": 31167, - "Ġswitching": 27765, - "Ġswo": 33127, - "ĠswojÄħ": 134106, - "Ġswollen": 75093, - "Ġsword": 20214, - "Ġswords": 52057, - "Ġswore": 91207, - "Ġsworn": 50648, - "Ġswung": 69855, - "Ġswój": 136865, - "Ġsx": 31808, - "Ġsy": 6568, - "Ġsyll": 47604, - "Ġsym": 7886, - "Ġsymb": 66654, - "Ġsymbol": 7735, - "Ġsymbolic": 35296, - "Ġsymbolism": 82376, - "Ġsymbols": 17738, - "Ġsymlink": 83221, - "Ġsymmetric": 54343, - "Ġsymmetry": 45120, - "Ġsymp": 21459, - "Ġsympath": 32718, - "Ġsympathetic": 52364, - "Ġsympathy": 45984, - "Ġsympt": 11841, - "Ġsymptom": 48548, - "Ġsymptoms": 13495, - "Ġsyn": 6782, - "Ġsynagogue": 94865, - "Ġsynaptic": 98727, - "Ġsync": 12811, - "Ġsynced": 85028, - "Ġsynchron": 14121, - "Ġsynchronization": 57912, - "Ġsynchronize": 63799, - "Ġsynchronized": 21466, - "Ġsynchronous": 65949, - "Ġsyncing": 96145, - "Ġsynd": 21307, - "Ġsyndrome": 27339, - "Ġsynerg": 79426, - "Ġsynergy": 92040, - "Ġsynonym": 73350, - "Ġsynonymous": 68493, - "Ġsynonyms": 85406, - "Ġsynopsis": 80663, - "Ġsynt": 83187, - "Ġsyntax": 19482, - "Ġsynth": 42898, - "Ġsynthes": 51289, - "Ġsynthesis": 38875, - "Ġsynthesized": 91006, - "Ġsynthetic": 27268, - "Ġsyrup": 44222, - "Ġsys": 5708, - "Ġsyscall": 49345, - "Ġsyslog": 74487, - "Ġsyst": 41245, - "Ġsystem": 1849, - "ĠsystemFontOfSize": 51816, - "Ġsystematic": 36438, - "Ġsystematically": 59726, - "Ġsystemctl": 89421, - "Ġsystemd": 74966, - "Ġsystemic": 45317, - "Ġsystems": 5942, - "Ġsystème": 71501, - "Ġsz": 10038, - "Ġszcz": 75573, - "Ġszczeg": 126161, - "Ġszczególn": 139071, - "Ġszczególnie": 139072, - "ĠszczegóÅĤ": 128067, - "ĠszczegóÅĤowo": 140930, - "Ġszer": 57117, - "Ġszko": 140013, - "ĠszkoÅĤy": 140014, - "Ġszy": 91765, - "Ġsábado": 97459, - "Ġsách": 95082, - "Ġsáng": 128688, - "Ġsát": 129261, - "Ġsân": 130514, - "Ġsâu": 131307, - "Ġsão": 29610, - "Ġsä": 64774, - "ĠsÃ¥": 21072, - "Ġsæ": 92325, - "Ġsé": 18744, - "Ġséculo": 143042, - "Ġsécur": 64361, - "Ġsécurité": 76363, - "Ġséjour": 137612, - "Ġsélection": 70032, - "Ġsérie": 46428, - "Ġsó": 31090, - "Ġsóc": 131998, - "Ġsólo": 52188, - "Ġsóng": 136847, - "Ġsông": 134782, - "Ġsö": 50287, - "Ġsöyle": 129284, - "Ġsöyled": 131982, - "Ġsöyledi": 131983, - "Ġsöz": 126519, - "ĠsözleÅŁme": 139406, - "Ġsø": 30330, - "Ġsøger": 61271, - "Ġsøker": 92744, - "Ġsû": 77605, - "Ġsûr": 96617, - "Ġsü": 59739, - "Ġsür": 127146, - "Ġsürdür": 135239, - "Ġsüre": 126369, - "Ġsürec": 139889, - "Ġsürecin": 139890, - "Ġsürek": 136454, - "Ġsürekli": 136455, - "Ġsüreç": 137302, - "Ġsürü": 134446, - "ĠsÃłn": 136071, - "ĠsÃłng": 137968, - "ĠsÃŃ": 44715, - "ĠsÄ©": 128916, - "Ġsı": 125715, - "Ġsıc": 135956, - "Ġsıcak": 135957, - "Ġsık": 126998, - "Ġsıkıntı": 138636, - "Ġsın": 133011, - "Ġsınav": 138575, - "Ġsını": 135964, - "Ġsınıf": 135965, - "Ġsınır": 133012, - "Ġsıra": 129723, - "Ġsırasında": 137424, - "ĠsÄĥ": 28994, - "ĠsÄħ": 37127, - "ĠsÅĤ": 74258, - "ĠsÅĤab": 142363, - "ĠsÅĤow": 133452, - "ĠsÅĤucha": 142039, - "ĠsÅĤuż": 143054, - "ĠsÅĤużb": 143055, - "ĠsÆ¡": 129582, - "Ġsư": 129773, - "Ġsạch": 131560, - "Ġsạn": 133724, - "Ġsản": 85636, - "Ġsắc": 129222, - "Ġsắp": 134406, - "Ġsắt": 139961, - "Ġsẵ": 133690, - "Ġsẵn": 133691, - "Ġsẻ": 129958, - "Ġsẽ": 128267, - "Ġsợ": 131146, - "Ġsứ": 138624, - "Ġsức": 128738, - "Ġsữa": 133044, - "Ġsá»±": 128277, - "Ġsá»ij": 65526, - "Ġsá»ijng": 128480, - "Ġsá»ķ": 138504, - "ĠsỼ": 131968, - "ĠsỼm": 131969, - "Ġsợ": 128760, - "Ġsá»Ń": 128353, - "Ġsá»Ńa": 132038, - "Ġt": 259, - "Ġta": 9450, - "Ġtab": 5651, - "ĠtabBar": 76781, - "ĠtabIndex": 84941, - "ĠtabPage": 87810, - "Ġtabel": 89782, - "Ġtabela": 67215, - "Ġtabindex": 30173, - "Ġtabla": 40546, - "Ġtable": 1965, - "ĠtableLayoutPanel": 97755, - "ĠtableName": 29544, - "ĠtableView": 13756, - "Ġtableau": 56134, - "Ġtablename": 86365, - "Ġtables": 12632, - "Ġtablesp": 37090, - "Ġtablespoon": 61511, - "Ġtablespoons": 55488, - "Ġtablet": 20697, - "Ġtabletop": 88471, - "Ġtablets": 28579, - "Ġtaboo": 75945, - "Ġtabs": 22398, - "Ġtac": 59288, - "Ġtack": 13870, - "Ġtackle": 21403, - "Ġtackled": 81357, - "Ġtackles": 42481, - "Ġtackling": 56811, - "Ġtaco": 90841, - "Ġtacos": 84401, - "Ġtact": 14083, - "Ġtactic": 37901, - "Ġtactical": 38647, - "Ġtactics": 25342, - "Ġtactile": 98583, - "Ġtad": 63806, - "Ġtag": 4772, - "ĠtagName": 62367, - "Ġtagged": 37113, - "Ġtagging": 78153, - "Ġtags": 9492, - "Ġtah": 90093, - "Ġtahun": 57523, - "Ġtai": 52537, - "Ġtail": 9787, - "Ġtaille": 61727, - "Ġtailor": 50956, - "Ġtailored": 40791, - "Ġtails": 63514, - "Ġtainted": 83973, - "Ġtak": 18116, - "Ġtake": 1896, - "Ġtakeaway": 88374, - "Ġtaken": 4429, - "Ġtakeover": 63210, - "Ġtakes": 4990, - "Ġtaking": 4633, - "Ġtako": 97033, - "Ġtakım": 131967, - "Ġtakże": 63854, - "Ġtal": 8210, - "Ġtale": 23281, - "Ġtalent": 10772, - "Ġtalented": 23074, - "Ġtalents": 33932, - "Ġtales": 36465, - "Ġtalk": 3061, - "Ġtalked": 14897, - "Ġtalking": 7404, - "Ġtalks": 13433, - "Ġtall": 16217, - "Ġtaller": 49909, - "Ġtallest": 81617, - "Ġtally": 52295, - "Ġtam": 25476, - "Ġtamanho": 69238, - "Ġtamaño": 80252, - "Ġtamb": 17379, - "Ġtambién": 28471, - "Ġtambém": 34601, - "Ġtame": 81823, - "Ġtamil": 84535, - "Ġtamp": 75029, - "Ġtan": 14197, - "Ġtand": 53567, - "Ġtandem": 65942, - "Ġtang": 21878, - "Ġtangent": 68660, - "Ġtanggal": 90902, - "Ġtangible": 49301, - "Ġtangled": 92841, - "Ġtank": 12896, - "Ġtanker": 92394, - "Ġtanks": 25866, - "Ġtant": 36522, - "Ġtantal": 94585, - "Ġtanto": 32086, - "Ġtantr": 63007, - "Ġtantra": 32102, - "Ġtanı": 129409, - "Ġtap": 15239, - "Ġtape": 16971, - "Ġtaped": 82514, - "Ġtaper": 53935, - "Ġtapered": 94055, - "Ġtapes": 51696, - "Ġtapi": 98076, - "Ġtapped": 48423, - "Ġtapping": 52628, - "Ġtaps": 61970, - "Ġtar": 12183, - "Ġtaraf": 95798, - "Ġtarafından": 128691, - "Ġtard": 61097, - "Ġtarde": 60645, - "Ġtarea": 89907, - "Ġtarg": 88980, - "Ġtarget": 2169, - "ĠtargetType": 71330, - "Ġtargeted": 17112, - "Ġtargeting": 24132, - "Ġtargets": 11550, - "Ġtariff": 60261, - "Ġtariffs": 43895, - "Ġtarn": 86480, - "Ġtart": 44815, - "ĠtartÄ±ÅŁ": 142124, - "ĠtartÄ±ÅŁma": 142125, - "Ġtas": 51214, - "Ġtasar": 135291, - "Ġtasarım": 135292, - "Ġtask": 3383, - "ĠtaskId": 60527, - "Ġtasked": 50820, - "Ġtasks": 9079, - "Ġtast": 57072, - "Ġtaste": 12656, - "Ġtasted": 60480, - "Ġtastes": 35163, - "Ġtasting": 46400, - "Ġtasty": 38853, - "Ġtat": 71713, - "Ġtats": 140525, - "Ġtatsäch": 140526, - "Ġtatsächlich": 140527, - "Ġtatto": 24781, - "Ġtattoo": 31794, - "Ġtattoos": 53642, - "Ġtau": 31823, - "Ġtaught": 15599, - "Ġtav": 92209, - "Ġtavern": 90135, - "Ġtax": 3742, - "Ġtaxa": 76214, - "Ġtaxable": 58353, - "Ġtaxation": 50627, - "Ġtaxed": 71415, - "Ġtaxes": 13125, - "Ġtaxi": 32505, - "Ġtaxing": 86904, - "Ġtaxis": 89503, - "Ġtaxonomy": 71806, - "Ġtaxp": 22979, - "Ġtaxpayer": 38173, - "Ġtaxpayers": 34648, - "ĠtaÅŁÄ±": 129818, - "Ġtb": 16363, - "Ġtbl": 21173, - "Ġtbody": 45420, - "Ġtbsp": 63875, - "Ġtc": 17130, - "Ġtcb": 93179, - "Ġtcp": 28051, - "Ġtd": 17941, - "Ġte": 1013, - "Ġtea": 15243, - "Ġteach": 4538, - "Ġteacher": 11079, - "Ġteachers": 13336, - "Ġteaches": 32892, - "Ġteaching": 12629, - "Ġteachings": 44472, - "Ġteal": 94607, - "Ġteam": 2083, - "Ġteamed": 60210, - "Ġteammate": 47566, - "Ġteammates": 31646, - "Ġteams": 7263, - "Ġteamwork": 83533, - "Ġtear": 17576, - "ĠtearDown": 32825, - "Ġteardown": 49304, - "Ġtearing": 55736, - "Ġtears": 23139, - "Ġteas": 29568, - "Ġtease": 66026, - "Ġteased": 78775, - "Ġteaser": 69553, - "Ġteasing": 70363, - "Ġteaspoon": 41284, - "Ġteaspoons": 92100, - "Ġtec": 85571, - "Ġtech": 13014, - "Ġtechn": 2799, - "Ġtechnical": 10916, - "Ġtechnically": 31554, - "Ġtechnician": 53511, - "Ġtechnicians": 52359, - "Ġtechnique": 14762, - "Ġtechniques": 12538, - "Ġtechno": 88899, - "Ġtechnological": 29016, - "Ġtechnologies": 14310, - "Ġtechnology": 5440, - "Ġtecn": 40834, - "ĠtecnologÃŃa": 136037, - "Ġtecrü": 143451, - "Ġtecrübe": 143452, - "Ġted": 41223, - "Ġtedious": 65738, - "Ġtee": 35076, - "Ġteen": 9378, - "Ġteenage": 33168, - "Ġteenager": 31539, - "Ġteenagers": 36619, - "Ġteens": 26202, - "Ġteeth": 17832, - "Ġteg": 55955, - "Ġtegen": 71862, - "Ġtego": 49547, - "Ġteh": 79906, - "Ġteil": 77414, - "Ġtej": 61980, - "Ġtek": 42085, - "Ġtekn": 80026, - "Ġtekst": 72578, - "Ġtel": 18708, - "Ġtela": 69766, - "Ġtelah": 57635, - "Ġtele": 7963, - "Ġtelecom": 59405, - "Ġtelecommunications": 61766, - "Ġtelefon": 42150, - "Ġtelefone": 73164, - "Ġtelefono": 62430, - "Ġtelegram": 67544, - "Ġtelemetry": 61037, - "Ġtelephone": 20544, - "Ġteleport": 49489, - "Ġtelesc": 77413, - "Ġtelescope": 55825, - "Ġtelevis": 89965, - "Ġtelevised": 75610, - "Ġtelevision": 12425, - "Ġtell": 3291, - "Ġtelling": 11629, - "Ġtells": 10742, - "Ġteléfono": 140948, - "Ġtem": 1562, - "Ġtema": 45915, - "Ġtemas": 83906, - "Ġtemp": 2730, - "ĠtempList": 94864, - "Ġtemper": 6797, - "Ġtemperament": 78864, - "Ġtemperatura": 82953, - "Ġtemperature": 9315, - "Ġtemperatures": 19879, - "Ġtempered": 89661, - "Ġtempfile": 54819, - "Ġtempl": 67530, - "Ġtemplate": 3811, - "ĠtemplateUrl": 13031, - "Ġtemplates": 19911, - "Ġtemple": 26752, - "Ġtemples": 56897, - "Ġtempo": 23230, - "Ġtempor": 18965, - "Ġtemporada": 81461, - "Ġtemporal": 35915, - "Ġtemporarily": 27092, - "Ġtemporary": 13340, - "Ġtemps": 26046, - "Ġtempt": 24983, - "Ġtemptation": 61361, - "Ġtempted": 53880, - "Ġtempting": 60199, - "Ġten": 5779, - "Ġtenant": 25239, - "Ġtenants": 39916, - "Ġtend": 8376, - "Ġtended": 48790, - "Ġtendencies": 60455, - "Ġtendency": 30854, - "Ġtender": 27582, - "Ġtendon": 87832, - "Ġtendr": 90246, - "Ġtendrá": 135246, - "Ġtends": 27236, - "Ġtendência": 143559, - "Ġtenemos": 70448, - "Ġtener": 33430, - "Ġteng": 41149, - "Ġtenga": 92332, - "Ġtengo": 66890, - "Ġtennis": 31415, - "Ġtens": 22008, - "Ġtense": 42687, - "Ġtension": 23504, - "Ġtensions": 38410, - "Ġtensor": 15626, - "Ġtensorflow": 28087, - "Ġtensors": 77087, - "Ġtent": 15632, - "Ġtentang": 92064, - "Ġtentative": 75120, - "Ġtenth": 55666, - "Ġtents": 63370, - "Ġtenure": 38961, - "ĠtenÃŃa": 91565, - "Ġtep": 55052, - "Ġter": 1982, - "Ġtercer": 88881, - "Ġterm": 4647, - "Ġterme": 96920, - "Ġtermed": 60837, - "Ġtermin": 10204, - "Ġterminal": 15022, - "Ġterminals": 52979, - "Ġterminate": 29654, - "Ġterminated": 31272, - "Ġterminates": 87611, - "Ġterminating": 70581, - "Ġtermination": 34408, - "Ġterminator": 80025, - "Ġterminology": 56626, - "Ġterms": 3793, - "Ġtern": 71617, - "Ġterr": 7170, - "Ġterra": 59561, - "Ġterrace": 51478, - "Ġterrain": 24869, - "Ġterre": 86926, - "Ġterrestrial": 79392, - "Ġterrible": 17478, - "Ġterribly": 49036, - "Ġterrific": 42560, - "Ġterrified": 52631, - "Ġterrifying": 41251, - "Ġterritor": 39356, - "Ġterritorial": 51382, - "Ġterritories": 38443, - "Ġterritory": 17971, - "Ġterror": 8648, - "Ġterrorism": 23145, - "Ġterrorist": 19740, - "Ġterrorists": 28231, - "Ġters": 87630, - "Ġterse": 50537, - "Ġtersebut": 55766, - "Ġtert": 97114, - "Ġtertiary": 79323, - "Ġterug": 89501, - "Ġterör": 137047, - "Ġtes": 50209, - "Ġtess": 79830, - "Ġtest": 1273, - "ĠtestCase": 54452, - "ĠtestData": 67348, - "ĠtestName": 94396, - "Ġtestament": 60200, - "Ġtestcase": 70080, - "Ġteste": 74665, - "Ġtested": 12510, - "Ġtester": 37111, - "Ġtesters": 89719, - "Ġtestified": 38773, - "Ġtestify": 48162, - "Ġtestim": 18992, - "Ġtestimon": 46662, - "Ġtestimonials": 83510, - "Ġtestimony": 23468, - "Ġtesting": 7497, - "Ġtestosterone": 38932, - "Ġtests": 7032, - "Ġtet": 27853, - "Ġtetas": 87515, - "Ġtether": 79565, - "Ġtex": 23112, - "Ġtexas": 59248, - "Ġtext": 1467, - "ĠtextAlign": 23784, - "ĠtextBox": 19418, - "ĠtextColor": 47059, - "ĠtextDecoration": 91945, - "ĠtextField": 31388, - "ĠtextSize": 77400, - "ĠtextStatus": 60783, - "ĠtextStyle": 73096, - "ĠtextView": 31189, - "Ġtextarea": 52624, - "Ġtextbook": 55085, - "Ġtextbooks": 64203, - "Ġtextbox": 73999, - "Ġtexte": 67967, - "Ġtextile": 65538, - "Ġtextiles": 92982, - "Ġtexting": 67994, - "Ġtexto": 32025, - "Ġtexts": 21984, - "Ġtextual": 62533, - "Ġtexture": 10434, - "Ġtextured": 73544, - "Ġtextures": 29853, - "Ġteż": 65820, - "ĠteÅŁek": 133939, - "ĠteÅŁekkür": 133940, - "Ġtf": 6409, - "Ġtg": 53188, - "Ġtgt": 50475, - "Ġth": 270, - "Ġtha": 48488, - "Ġthai": 17936, - "Ġthaimassage": 65878, - "Ġthan": 1091, - "Ġthank": 9702, - "Ġthanked": 56495, - "Ġthankful": 42688, - "Ġthankfully": 75985, - "Ġthanking": 93021, - "Ġthanks": 9339, - "Ġthat": 429, - "Ġthats": 40036, - "Ġthaw": 85378, - "Ġthe": 279, - "Ġtheano": 95899, - "Ġtheat": 46113, - "Ġtheater": 26705, - "Ġtheaters": 43766, - "Ġtheatre": 33496, - "Ġtheatrical": 65233, - "Ġthee": 39244, - "Ġtheft": 27383, - "Ġtheir": 862, - "Ġtheirs": 47201, - "Ġthem": 1105, - "Ġthematic": 94768, - "Ġtheme": 6912, - "Ġthemed": 48544, - "Ġthemes": 21386, - "Ġthems": 5568, - "Ġthemselves": 5577, - "Ġthen": 1221, - "Ġtheolog": 89502, - "Ġtheological": 69534, - "Ġtheology": 53541, - "Ġtheor": 45720, - "Ġtheorem": 57817, - "Ġtheoret": 25131, - "Ġtheoretical": 31787, - "Ġtheoretically": 62134, - "Ġtheories": 24970, - "Ġtheorists": 82962, - "Ġtheory": 10126, - "Ġther": 8962, - "Ġtherap": 24702, - "Ġtherapeutic": 36371, - "Ġtherapies": 51212, - "Ġtherapist": 41763, - "Ġtherapists": 67516, - "Ġtherapy": 15069, - "Ġthere": 1052, - "Ġthereafter": 44995, - "Ġthereby": 27492, - "Ġtherefore": 8916, - "Ġtherein": 57079, - "Ġthereof": 33266, - "Ġtheres": 91679, - "Ġtherm": 29845, - "Ġthermal": 28387, - "Ġthermo": 96147, - "Ġthermometer": 92197, - "Ġthermostat": 74070, - "Ġthese": 1493, - "Ġthesis": 17394, - "Ġtheta": 18526, - "Ġthey": 807, - "Ġthi": 61328, - "Ġthick": 12045, - "Ġthicker": 58784, - "Ġthickness": 25755, - "Ġthief": 57735, - "Ġthieves": 60567, - "Ġthigh": 38671, - "Ġthighs": 59511, - "Ġthin": 15430, - "Ġthing": 3166, - "Ġthings": 2513, - "Ġthink": 1744, - "Ġthinker": 97536, - "Ġthinkers": 68022, - "Ġthinking": 7274, - "Ġthinks": 15482, - "Ġthinly": 98431, - "Ġthinner": 64255, - "Ġthird": 4843, - "Ġthirds": 93137, - "Ġthirst": 49590, - "Ġthirsty": 97108, - "Ġthirteen": 60659, - "Ġthirty": 26127, - "Ġthis": 419, - "Ġthiên": 131265, - "Ġthiết": 128422, - "Ġthiếu": 130502, - "Ġthiá»ĥu": 141700, - "Ġthiá»ĩn": 130509, - "Ġthiá»ĩt": 141753, - "Ġthiá»ĩu": 132786, - "Ġtho": 39325, - "Ġthor": 72733, - "Ġthorough": 17423, - "Ġthoroughly": 26364, - "Ġthose": 1846, - "Ġthou": 33123, - "Ġthough": 3498, - "Ġthought": 3381, - "Ġthoughtful": 42666, - "Ġthoughts": 11303, - "Ġthous": 7048, - "Ġthousand": 16183, - "Ġthousands": 9037, - "Ġthoáng": 141192, - "Ġthoát": 136122, - "Ġthoại": 129752, - "Ġthoải": 136938, - "Ġthr": 8807, - "Ġthread": 4516, - "ĠthreadIdx": 72971, - "Ġthreaded": 66787, - "Ġthreading": 30159, - "Ġthreads": 14564, - "Ġthreat": 5899, - "Ġthreaten": 39150, - "Ġthreatened": 21023, - "Ġthreatening": 26805, - "Ġthreatens": 47826, - "Ġthreats": 17736, - "Ġthree": 2326, - "Ġthreesome": 68964, - "Ġthresh": 51744, - "Ġthreshold": 12171, - "Ġthresholds": 56140, - "Ġthrew": 22192, - "Ġthrift": 81542, - "Ġthrill": 53804, - "Ġthrilled": 37464, - "Ġthriller": 53361, - "Ġthrilling": 56299, - "Ġthrive": 40872, - "Ġthriving": 52314, - "Ġthro": 59087, - "Ġthroat": 27591, - "Ġthrom": 83564, - "Ġthrone": 43621, - "Ġthrott": 79972, - "Ġthrottle": 42166, - "Ġthrough": 1526, - "Ġthroughout": 6814, - "Ġthroughput": 63762, - "Ġthrow": 2510, - "ĠthrowError": 80780, - "Ġthrowable": 64531, - "Ġthrowing": 21244, - "Ġthrown": 14989, - "Ġthrows": 3787, - "Ġthru": 40078, - "Ġthrust": 29885, - "Ġthu": 77374, - "Ġthugs": 85319, - "Ġthuis": 54284, - "Ġthuisontvangst": 78323, - "Ġthumb": 24050, - "Ġthumbnail": 28574, - "Ġthumbnails": 80065, - "Ġthumbs": 56849, - "Ġthunder": 36843, - "Ġthunk": 78156, - "Ġthus": 8450, - "Ġthuyết": 136957, - "Ġthuyá»ģn": 143897, - "Ġthuê": 131500, - "Ġthuế": 134375, - "ĠthuáºŃn": 131678, - "ĠthuáºŃt": 128859, - "Ġthuá»ijc": 129374, - "Ġthuá»Ļc": 129281, - "Ġthwart": 63688, - "Ġthy": 25174, - "Ġthyroid": 52960, - "Ġthác": 133457, - "Ġthái": 131860, - "Ġtháng": 128526, - "Ġthánh": 143821, - "Ġthân": 128672, - "Ġthé": 75580, - "Ġthép": 142842, - "Ġthêm": 128622, - "Ġthì": 128291, - "Ġthói": 143720, - "Ġthôi": 131021, - "Ġthôn": 138757, - "Ġthông": 92430, - "Ġthù": 136211, - "Ġthú": 131999, - "Ġthúc": 133600, - "ĠthÃłnh": 64061, - "ĠthÃŃ": 135863, - "ĠthÃŃch": 128745, - "ĠthÄĥm": 133171, - "ĠthÆ¡": 130917, - "Ġthư": 129101, - "Ġthương": 128560, - "Ġthượng": 140156, - "ĠthÆ°á»Ľc": 136543, - "Ġthưá»Ŀng": 128454, - "ĠthÆ°á»Łng": 132720, - "Ġthả": 130978, - "Ġthảo": 132972, - "Ġthấp": 132058, - "Ġthất": 130034, - "Ġthấy": 128391, - "Ġthần": 129719, - "Ġthầy": 135560, - "Ġthẩm": 133024, - "Ġthắ": 136139, - "Ġthắng": 131457, - "Ġthẳng": 133863, - "Ġthẻ": 137118, - "Ġthế": 128314, - "ĠtháºŃm": 136023, - "ĠtháºŃn": 136408, - "ĠtháºŃp": 142122, - "ĠtháºŃt": 128869, - "Ġthụ": 135364, - "Ġthá»§": 128799, - "Ġthá»§y": 132601, - "Ġthứ": 128720, - "Ġthức": 128482, - "Ġthừa": 135991, - "Ġthá»±": 139514, - "Ġthá»±c": 128336, - "Ġthá»ĥ": 128254, - "Ġthá»ĭ": 126260, - "Ġthá»ĭt": 134101, - "Ġthá»ı": 139987, - "Ġthá»ıa": 139988, - "Ġthá»ijng": 128573, - "Ġthá»ķ": 140926, - "Ġthá»Ŀ": 139900, - "Ġthá»Ŀi": 128327, - "Ġthợ": 138762, - "Ġthá»Ń": 131885, - "Ġti": 8988, - "Ġtic": 61447, - "Ġtick": 9341, - "Ġticker": 46987, - "Ġticket": 11727, - "Ġtickets": 14403, - "Ġticking": 82337, - "Ġticks": 29957, - "Ġtid": 13112, - "Ġtidak": 27281, - "Ġtidal": 85459, - "Ġtide": 41938, - "Ġtidy": 57805, - "Ġtie": 18131, - "Ġtied": 17339, - "Ġtiempo": 28742, - "Ġtiene": 23332, - "Ġtienen": 46439, - "Ġtiener": 86646, - "Ġtienes": 71097, - "Ġtier": 25996, - "Ġtiers": 63171, - "Ġties": 19818, - "Ġtieten": 71005, - "Ġtiger": 51735, - "Ġtight": 10296, - "Ġtighten": 66745, - "Ġtightened": 84720, - "Ġtightening": 76780, - "Ġtighter": 62962, - "Ġtightly": 38969, - "Ġtijd": 52690, - "Ġtik": 86172, - "Ġtil": 10266, - "Ġtile": 10023, - "ĠtileSize": 93775, - "Ġtiled": 81870, - "Ġtiles": 20493, - "Ġtill": 11956, - "Ġtilt": 36200, - "Ġtilted": 85917, - "Ġtim": 6792, - "Ġtimber": 44788, - "Ġtime": 882, - "ĠtimeStamp": 64276, - "ĠtimeZone": 98764, - "Ġtimed": 25182, - "Ġtimedelta": 42255, - "Ġtimeframe": 69953, - "Ġtimeless": 57005, - "Ġtimeline": 24808, - "Ġtimelines": 87144, - "Ġtimely": 31000, - "Ġtimeout": 9632, - "Ġtimeouts": 91444, - "Ġtimer": 9021, - "Ġtimers": 44522, - "Ġtimes": 3039, - "Ġtimespec": 71156, - "Ġtimestamp": 11441, - "Ġtimestamps": 48781, - "Ġtimestep": 74578, - "Ġtimetable": 66540, - "Ġtimeval": 51334, - "Ġtimezone": 33957, - "Ġtimid": 98049, - "Ġtiming": 18405, - "Ġtimings": 84798, - "Ġtimp": 76645, - "Ġtin": 24790, - "Ġtinder": 89165, - "Ġting": 42227, - "Ġtinha": 94948, - "Ġtink": 90584, - "Ġtint": 48004, - "Ġtiny": 13673, - "Ġtion": 72252, - "Ġtip": 11552, - "Ġtipo": 16298, - "Ġtipos": 63862, - "Ġtipped": 65372, - "Ġtipping": 71193, - "Ġtips": 10414, - "Ġtir": 44612, - "Ġtire": 27287, - "Ġtired": 19227, - "Ġtirelessly": 98129, - "Ġtires": 30700, - "Ġtissue": 19847, - "Ġtissues": 38781, - "Ġtit": 8142, - "Ġtitan": 85512, - "Ġtitanium": 70304, - "Ġtitle": 2265, - "ĠtitleLabel": 60820, - "Ġtitled": 24849, - "Ġtitles": 15311, - "Ġtitre": 63060, - "Ġtits": 29582, - "Ġtitten": 92375, - "Ġtitular": 80105, - "Ġtitulo": 51063, - "Ġtiên": 128924, - "Ġtiêu": 128575, - "Ġtiế": 128606, - "Ġtiến": 129263, - "Ġtiếng": 128607, - "Ġtiếp": 128424, - "Ġtiết": 128861, - "Ġtiá»ģm": 141673, - "Ġtiá»ģn": 128515, - "Ġtiá»ĥu": 132037, - "Ġtiá»ĩn": 129698, - "Ġtj": 65254, - "Ġtjejer": 71907, - "Ġtk": 17162, - "Ġtkinter": 40490, - "Ġtl": 29796, - "Ġtls": 55026, - "Ġtm": 17333, - "Ġtmp": 4174, - "Ġtmpl": 79839, - "Ġtn": 43308, - "Ġto": 311, - "ĠtoArray": 78190, - "ĠtoDate": 81103, - "ĠtoItem": 98360, - "ĠtoJSON": 79522, - "ĠtoJson": 65257, - "ĠtoReturn": 81998, - "ĠtoString": 14330, - "Ġtoast": 22405, - "Ġtoasted": 92872, - "Ġtoaster": 89818, - "Ġtoastr": 58352, - "Ġtob": 24406, - "Ġtobacco": 26433, - "Ġtoc": 54861, - "Ġtoch": 97698, - "Ġtod": 11530, - "Ġtoda": 40178, - "Ġtodas": 30101, - "Ġtodav": 140022, - "ĠtodavÃŃa": 140023, - "Ġtoday": 3351, - "Ġtodd": 37934, - "Ġtoddler": 51235, - "Ġtoddlers": 78835, - "Ġtodo": 11804, - "Ġtodos": 15519, - "Ġtoe": 30216, - "Ġtoen": 99034, - "Ġtoes": 44613, - "Ġtofu": 79147, - "Ġtog": 13144, - "Ġtogether": 3786, - "Ġtogg": 53806, - "Ġtoggle": 14999, - "Ġtoi": 75320, - "Ġtoile": 48675, - "Ġtoilet": 26214, - "Ġtoilets": 62187, - "Ġtok": 9628, - "Ġtoken": 3950, - "ĠtokenId": 87038, - "Ġtokenize": 77651, - "Ġtokenizer": 45958, - "Ġtokens": 11211, - "Ġtol": 38574, - "Ġtold": 3229, - "Ġtoler": 14885, - "Ġtolerance": 24098, - "Ġtolerant": 73482, - "Ġtolerate": 49034, - "Ġtolerated": 65341, - "Ġtoll": 25851, - "Ġtolua": 65524, - "Ġtom": 10180, - "Ġtomar": 63711, - "Ġtomato": 41020, - "Ġtomatoes": 40513, - "Ġtomb": 43080, - "Ġtome": 84742, - "Ġtomorrow": 16577, - "Ġton": 8766, - "Ġtone": 16232, - "Ġtoned": 97731, - "Ġtones": 41976, - "Ġtong": 21365, - "Ġtongue": 24459, - "Ġtongues": 88335, - "Ġtonic": 98205, - "Ġtonight": 17913, - "Ġtonnes": 50921, - "Ġtons": 19608, - "Ġtonumber": 66296, - "Ġtoo": 2238, - "Ġtook": 3867, - "Ġtool": 5392, - "ĠtoolStrip": 46902, - "Ġtoolbar": 25942, - "Ġtoolbox": 67870, - "Ġtoolkit": 65894, - "Ġtools": 7375, - "Ġtooltip": 25451, - "Ġtooltips": 91234, - "Ġtooth": 25507, - "Ġtop": 1909, - "ĠtopLeft": 79103, - "ĠtopLevel": 90420, - "Ġtopic": 8544, - "Ġtopical": 65276, - "Ġtopics": 13347, - "Ġtoplant": 135368, - "Ġtoplantı": 135369, - "Ġtopo": 72519, - "Ġtopology": 44882, - "Ġtopp": 44041, - "Ġtopped": 39801, - "Ġtopping": 60276, - "Ġtoppings": 89671, - "Ġtops": 32422, - "Ġtor": 5683, - "Ġtorch": 7834, - "Ġtorchvision": 67825, - "Ġtore": 62008, - "Ġtorino": 70443, - "Ġtorment": 72670, - "Ġtorn": 21145, - "Ġtornado": 44172, - "Ġtorpedo": 91883, - "Ġtorque": 41031, - "Ġtorrent": 30575, - "Ġtorrents": 97831, - "Ġtors": 94460, - "Ġtorso": 63200, - "Ġtort": 16426, - "Ġtorture": 29567, - "Ġtortured": 55934, - "Ġtoss": 25187, - "Ġtossed": 50149, - "Ġtossing": 84051, - "Ġtostring": 70890, - "Ġtot": 2401, - "Ġtotal": 2790, - "ĠtotalCount": 59713, - "ĠtotalPages": 92294, - "ĠtotalPrice": 72205, - "ĠtotalTime": 91746, - "Ġtotaled": 88418, - "Ġtotalement": 93673, - "Ġtotaling": 81123, - "Ġtotalitarian": 89264, - "Ġtotally": 12473, - "Ġtotalmente": 80141, - "Ġtotals": 43645, - "Ġtote": 87519, - "Ġtou": 14776, - "Ġtouch": 5796, - "Ġtouchdown": 25027, - "Ġtouchdowns": 42779, - "Ġtouched": 23939, - "Ġtouches": 28627, - "Ġtouching": 30587, - "Ġtouchscreen": 76757, - "Ġtough": 11045, - "Ġtougher": 48231, - "Ġtoughest": 59306, - "Ġtoughness": 76218, - "Ġtoujours": 42993, - "Ġtour": 7216, - "Ġtoured": 90613, - "Ġtouring": 47451, - "Ġtourism": 30983, - "Ġtourist": 29970, - "Ġtourists": 31653, - "Ġtournament": 16129, - "Ġtournaments": 39061, - "Ġtours": 30161, - "Ġtous": 25642, - "Ġtout": 16559, - "Ġtoute": 42805, - "Ġtouted": 66428, - "Ġtoutes": 39644, - "Ġtow": 15813, - "Ġtoward": 8841, - "Ġtowards": 6974, - "Ġtowel": 42613, - "Ġtowels": 52884, - "Ġtower": 21271, - "Ġtowering": 86694, - "Ġtowers": 39725, - "Ġtowing": 88692, - "Ġtown": 6290, - "Ġtowns": 24824, - "Ġtownship": 87175, - "Ġtox": 40469, - "Ġtoxic": 20836, - "Ġtoxicity": 56911, - "Ġtoxin": 97434, - "Ġtoxins": 61086, - "Ġtoy": 21357, - "Ġtoys": 23069, - "Ġtoán": 130051, - "ĠtoÃłn": 128401, - "Ġtp": 18101, - "Ġtph": 73779, - "Ġtpl": 60979, - "Ġtq": 35885, - "Ġtqdm": 39404, - "Ġtr": 489, - "Ġtra": 9586, - "Ġtrab": 17598, - "Ġtrabaj": 38874, - "Ġtrabajar": 94565, - "Ġtrabajo": 38218, - "Ġtrabal": 36268, - "Ġtrabalho": 54639, - "Ġtrace": 11655, - "Ġtraceback": 46058, - "Ġtraced": 50300, - "Ġtracer": 64306, - "Ġtraces": 34383, - "Ġtracing": 45415, - "Ġtrack": 3754, - "Ġtracked": 33056, - "Ġtracker": 28331, - "Ġtrackers": 90982, - "Ġtracking": 14849, - "Ġtracks": 13918, - "Ġtract": 41829, - "Ġtraction": 46855, - "Ġtractor": 58685, - "Ġtrad": 4685, - "Ġtrade": 6559, - "Ġtraded": 30107, - "Ġtrademark": 31364, - "Ġtrademarks": 41034, - "Ġtrader": 44365, - "Ġtraders": 34587, - "Ġtrades": 30342, - "Ġtrading": 11133, - "Ġtradition": 13815, - "Ġtraditional": 8606, - "Ġtraditionally": 35242, - "Ġtraditions": 30906, - "Ġtraf": 98888, - "Ġtraff": 8258, - "Ġtraffic": 9442, - "Ġtrafficking": 33463, - "Ġtrag": 71602, - "Ġtraged": 27276, - "Ġtragedies": 98770, - "Ġtragedy": 30826, - "Ġtragic": 34179, - "Ġtrail": 8849, - "Ġtrailed": 96071, - "Ġtrailer": 19253, - "Ġtrailers": 49705, - "Ġtrailing": 27748, - "Ġtrails": 32865, - "Ġtrain": 5426, - "Ġtrainable": 87661, - "Ġtrained": 16176, - "Ġtrainer": 28894, - "Ġtrainers": 50091, - "Ġtraining": 4862, - "Ġtrains": 27688, - "Ġtrait": 17567, - "Ġtraitement": 88614, - "Ġtraits": 24055, - "Ġtraj": 62028, - "Ġtrajectories": 85548, - "Ġtrajectory": 34682, - "Ġtram": 52245, - "Ġtran": 23686, - "Ġtrance": 97431, - "Ġtranny": 69598, - "Ġtranqu": 40564, - "Ġtranquil": 66940, - "Ġtrans": 1356, - "Ġtransaction": 7745, - "Ġtransactions": 14131, - "Ġtransc": 41490, - "Ġtranscend": 73709, - "Ġtranscript": 35715, - "Ġtranscription": 45840, - "Ġtranscripts": 60312, - "Ġtransf": 19839, - "Ġtransfer": 8317, - "Ġtransferred": 22409, - "Ġtransferring": 49951, - "Ġtransfers": 30611, - "Ġtransform": 5165, - "Ġtransformation": 17991, - "Ġtransformations": 52970, - "Ġtransformative": 86335, - "Ġtransformed": 23507, - "Ġtransformer": 42578, - "Ġtransformers": 86870, - "Ġtransforming": 45790, - "Ġtransforms": 28475, - "Ġtransgender": 27208, - "Ġtransient": 40558, - "Ġtransistor": 97941, - "Ġtransit": 24065, - "Ġtransition": 9142, - "Ġtransitional": 65643, - "Ġtransitioning": 72094, - "Ġtransitions": 33592, - "Ġtransl": 11949, - "Ġtranslate": 14683, - "ĠtranslateY": 87749, - "Ġtranslated": 24531, - "Ġtranslates": 46918, - "Ġtranslating": 66271, - "Ġtranslation": 14468, - "Ġtranslations": 36693, - "Ġtranslator": 45488, - "Ġtranslators": 72704, - "Ġtranslucent": 84264, - "Ġtransmission": 18368, - "Ġtransmissions": 90996, - "Ġtransmit": 29282, - "Ġtransmitted": 33599, - "Ġtransmitter": 61110, - "Ġtransmitting": 77668, - "Ġtransparency": 27231, - "Ġtransparent": 17821, - "Ġtransplant": 42829, - "Ġtransplantation": 97602, - "Ġtransport": 7557, - "Ġtransportation": 17903, - "Ġtransporte": 95388, - "Ġtransported": 39360, - "Ġtransporter": 72465, - "Ġtransporting": 66657, - "Ġtransports": 68069, - "Ġtranspose": 50923, - "Ġtrap": 22862, - "Ġtrapped": 30591, - "Ġtrapping": 92569, - "Ġtraps": 44560, - "Ġtras": 33164, - "Ġtrash": 22854, - "Ġtrat": 40821, - "Ġtrata": 63267, - "Ġtratamiento": 88645, - "Ġtratt": 92934, - "Ġtrauma": 29888, - "Ġtraumat": 98036, - "Ġtraumatic": 53186, - "Ġtrav": 10137, - "Ġtrava": 57573, - "Ġtravail": 41675, - "Ġtravel": 5821, - "Ġtraveled": 30696, - "Ġtraveler": 62765, - "Ġtravelers": 39286, - "Ġtraveling": 20971, - "Ġtravelled": 45268, - "Ġtraveller": 85194, - "Ġtravellers": 58968, - "Ġtravelling": 30729, - "Ġtravels": 34192, - "Ġtravers": 29417, - "Ġtraversal": 56302, - "Ġtraverse": 37546, - "Ġtravés": 49352, - "Ġtray": 34688, - "Ġtrays": 91725, - "Ġtre": 4258, - "Ġtread": 47714, - "Ġtreadmill": 84646, - "Ġtreason": 78259, - "Ġtreasure": 31626, - "Ġtreasurer": 95391, - "Ġtreasures": 58849, - "Ġtreasury": 78253, - "Ġtreat": 4228, - "Ġtreated": 11758, - "Ġtreaties": 75377, - "Ġtreating": 26625, - "Ġtreatment": 6380, - "Ġtreatments": 22183, - "Ġtreats": 31739, - "Ġtreaty": 37897, - "Ġtrebuie": 94558, - "Ġtree": 4916, - "ĠtreeNode": 65275, - "Ġtrees": 12408, - "Ġtreff": 75687, - "Ġtreffen": 51873, - "Ġtrek": 44588, - "Ġtrem": 18162, - "Ġtrembling": 91988, - "Ġtremend": 23451, - "Ġtremendous": 26942, - "Ġtremendously": 71323, - "Ġtren": 73600, - "Ġtrench": 53252, - "Ġtrenches": 94978, - "Ġtrend": 9149, - "Ġtrending": 50850, - "Ġtrends": 18339, - "Ġtrendy": 57830, - "Ġtres": 30623, - "Ġtrespass": 74230, - "ĠtreÅĽci": 140889, - "Ġtrg": 97260, - "Ġtri": 2406, - "Ġtrial": 9091, - "Ġtrials": 19080, - "Ġtriang": 76405, - "Ġtriangle": 21495, - "Ġtriangles": 42446, - "Ġtriangular": 65494, - "Ġtrib": 13802, - "Ġtribal": 39389, - "Ġtribe": 33571, - "Ġtribes": 38403, - "Ġtribunal": 62892, - "Ġtribute": 34391, - "Ġtrick": 14068, - "Ġtrickle": 97344, - "Ġtricks": 28762, - "Ġtricky": 33453, - "Ġtrie": 59067, - "Ġtried": 6679, - "Ġtries": 16297, - "Ġtrif": 89103, - "Ġtrig": 52933, - "Ġtrigger": 8183, - "Ġtriggered": 22119, - "Ġtriggering": 51505, - "Ġtriggers": 30754, - "Ġtrillion": 31510, - "Ġtrilogy": 56786, - "Ġtrim": 11013, - "Ġtrimest": 74010, - "Ġtrimmed": 50981, - "Ġtrimming": 81887, - "Ġtrio": 33962, - "Ġtrip": 8411, - "Ġtriple": 23725, - "Ġtriples": 88561, - "Ġtriplet": 98709, - "Ġtripod": 91054, - "Ġtrips": 22466, - "Ġtritur": 66141, - "Ġtrium": 91806, - "Ġtriumph": 37486, - "Ġtrivia": 72932, - "Ġtrivial": 35647, - "Ġtriá»ĥn": 128531, - "Ġtriá»ĩu": 129077, - "Ġtro": 8185, - "Ġtroch": 135218, - "ĠtrochÄĻ": 135219, - "Ġtrois": 55221, - "Ġtroll": 57434, - "Ġtrolling": 89510, - "Ġtrolls": 64585, - "Ġtrom": 64536, - "Ġtrong": 69086, - "Ġtroop": 70716, - "Ġtroops": 16886, - "Ġtrop": 21267, - "Ġtrope": 84148, - "Ġtrophies": 53444, - "Ġtrophy": 37682, - "Ġtropical": 34048, - "Ġtrot": 56577, - "Ġtrotz": 90039, - "Ġtrou": 25410, - "Ġtroub": 19904, - "Ġtrouble": 12264, - "Ġtroubled": 41032, - "Ġtroubles": 34565, - "Ġtroubleshooting": 68671, - "Ġtroublesome": 77418, - "Ġtroubling": 51229, - "Ġtrough": 77965, - "Ġtrous": 60028, - "Ġtrousers": 67676, - "Ġtrout": 79727, - "Ġtrouve": 70351, - "Ġtrouver": 45424, - "Ġtrouvé": 99062, - "Ġtrov": 53539, - "Ġtrovare": 82583, - "Ġtruck": 10855, - "Ġtrucks": 26763, - "Ġtrue": 830, - "Ġtruly": 9428, - "Ġtrump": 38055, - "Ġtrumpet": 91259, - "Ġtrunc": 62850, - "Ġtruncate": 56772, - "Ġtruncated": 59756, - "Ġtrunk": 37311, - "Ġtrust": 6950, - "Ġtrusted": 21789, - "Ġtrustee": 75766, - "Ġtrustees": 78711, - "Ġtrusting": 68244, - "Ġtrusts": 65514, - "Ġtrustworthy": 55942, - "Ġtruth": 8046, - "Ġtruthful": 89867, - "Ġtruths": 52119, - "Ġtruyá»ģn": 129045, - "Ġtruyá»ĩn": 135867, - "ĠtrwaÅĤ": 141124, - "Ġtrx": 73021, - "Ġtry": 1430, - "Ġtrying": 4460, - "Ġtrách": 131368, - "Ġtrái": 130641, - "Ġtránh": 131282, - "Ġträ": 85623, - "Ġtrès": 24901, - "Ġtrên": 128273, - "Ġtrês": 81529, - "Ġtrì": 132630, - "Ġtrình": 128361, - "Ġtrò": 129659, - "Ġtrông": 140494, - "Ġtrùng": 136658, - "Ġtrú": 136003, - "Ġtrúc": 134383, - "ĠtrÃł": 130491, - "ĠtrÃŃ": 128597, - "ĠtrÄĥm": 137451, - "Ġtrưng": 138397, - "Ġtrương": 140996, - "ĠtrÆ°á»Ľc": 128371, - "Ġtrưá»Ŀng": 128331, - "ĠtrÆ°á»Łng": 129528, - "Ġtrạng": 129916, - "Ġtrả": 129477, - "Ġtrải": 132465, - "Ġtrầm": 141631, - "Ġtrần": 142035, - "Ġtrắng": 130595, - "Ġtrẻ": 128634, - "ĠtráºŃn": 130121, - "Ġtrợ": 128886, - "Ġtrụ": 134902, - "Ġtrứng": 138432, - "Ġtrừ": 137329, - "Ġtrữ": 141207, - "Ġtrá»±c": 129372, - "Ġtrá»ĭ": 128466, - "Ġtrá»įng": 128550, - "Ġtrá»ĵng": 135149, - "Ġtrá»Ŀi": 130868, - "Ġtrợ": 128570, - "Ġts": 10591, - "Ġtsl": 46386, - "Ġtslib": 94261, - "Ġtslint": 48681, - "Ġtsp": 37920, - "Ġtst": 71707, - "Ġtsunami": 71055, - "Ġtt": 17853, - "Ġttk": 66464, - "Ġttl": 53932, - "Ġtts": 98540, - "Ġtty": 60067, - "Ġtu": 9765, - "Ġtua": 63884, - "Ġtub": 14938, - "Ġtube": 13705, - "Ġtuberculosis": 87134, - "Ġtubes": 32983, - "Ġtubing": 73902, - "Ġtucked": 60118, - "Ġtud": 70059, - "Ġtudo": 55696, - "Ġtug": 81615, - "Ġtuition": 37938, - "Ġtul": 60936, - "Ġtum": 15394, - "Ġtumble": 86950, - "Ġtumblr": 45300, - "Ġtumor": 35154, - "Ġtumors": 54971, - "Ġtumult": 84577, - "Ġtun": 11460, - "Ġtuna": 73957, - "Ġtune": 25240, - "Ġtuned": 32419, - "Ġtuner": 90695, - "Ġtunes": 53990, - "Ġtung": 84207, - "Ġtuning": 41338, - "Ġtunnel": 25629, - "Ġtunnels": 52727, - "Ġtuo": 62158, - "Ġtup": 57385, - "Ġtuple": 14405, - "Ġtuples": 45225, - "Ġtur": 13232, - "Ġturb": 28012, - "Ġturbine": 65170, - "Ġturbines": 75675, - "Ġturbo": 47027, - "Ġturbulence": 94067, - "Ġturbulent": 82221, - "Ġturf": 58990, - "Ġturkey": 44305, - "Ġturmoil": 62255, - "Ġturn": 2484, - "Ġturnaround": 66510, - "Ġturned": 6519, - "Ġturning": 13054, - "Ġturno": 97867, - "Ġturnout": 51919, - "Ġturnover": 47539, - "Ġturnovers": 80627, - "Ġturns": 10577, - "Ġturquoise": 95947, - "Ġturret": 64386, - "Ġturtle": 36089, - "Ġturtles": 71403, - "Ġtus": 40684, - "Ġtussen": 88722, - "Ġtut": 18060, - "Ġtutor": 25302, - "Ġtutorial": 21514, - "Ġtutorials": 43812, - "Ġtutoring": 77043, - "Ġtutors": 82932, - "Ġtutte": 74157, - "Ġtutti": 43280, - "Ġtutto": 51182, - "Ġtuy": 130544, - "Ġtuyên": 135593, - "Ġtuyến": 130980, - "Ġtuyá»ĥn": 131535, - "Ġtuyá»ĩt": 130545, - "Ġtuần": 130681, - "Ġtuá»ķi": 128790, - "Ġtv": 11086, - "Ġtvb": 85907, - "Ġtw": 4384, - "Ġtwe": 14545, - "Ġtweak": 51043, - "Ġtweaked": 88460, - "Ġtweaking": 88247, - "Ġtweaks": 62337, - "Ġtwee": 72608, - "Ġtween": 65517, - "Ġtweet": 11809, - "Ġtweeted": 25955, - "Ġtweeting": 68715, - "Ġtweets": 23150, - "Ġtwelve": 29235, - "Ġtwenties": 96596, - "Ġtwentieth": 61420, - "Ġtwenty": 17073, - "Ġtwice": 10917, - "Ġtwig": 51246, - "Ġtwilight": 92622, - "Ġtwin": 27397, - "Ġtwink": 96400, - "Ġtwins": 43636, - "Ġtwist": 26646, - "Ġtwisted": 37717, - "Ġtwisting": 79554, - "Ġtwists": 61890, - "Ġtwitch": 59413, - "Ġtwitter": 22272, - "Ġtwo": 1378, - "Ġtwó": 141779, - "Ġtwórc": 141780, - "Ġtx": 9854, - "Ġtxn": 49721, - "Ġtxt": 7932, - "Ġty": 13580, - "Ġtying": 62043, - "Ġtylko": 52044, - "Ġtym": 38377, - "Ġtyp": 3582, - "Ġtype": 943, - "ĠtypeId": 89747, - "ĠtypeName": 52600, - "Ġtypealias": 87230, - "Ġtyped": 31969, - "Ġtypedef": 13501, - "Ġtypeid": 86806, - "Ġtypename": 11246, - "Ġtypeof": 7804, - "Ġtypes": 4494, - "Ġtypical": 14260, - "Ġtypically": 11136, - "Ġtyping": 19496, - "Ġtypings": 24921, - "ĠtypingsJapgolly": 71640, - "ĠtypingsSlinky": 59834, - "Ġtypo": 85105, - "Ġtypography": 96282, - "Ġtyr": 41949, - "Ġtyranny": 76901, - "Ġtyre": 72928, - "Ġtyres": 68693, - "Ġtys": 77439, - "Ġtytu": 136602, - "ĠtytuÅĤ": 136603, - "Ġtz": 42528, - "Ġtá": 79584, - "Ġtác": 128400, - "Ġtái": 135578, - "Ġtán": 141873, - "Ġtâm": 128396, - "Ġtây": 141567, - "Ġtão": 95672, - "Ġtä": 50790, - "Ġtäglich": 140729, - "Ġté": 46189, - "Ġtéc": 86163, - "Ġtécn": 70523, - "Ġtécnica": 131322, - "Ġtécnico": 133251, - "Ġtélé": 42016, - "Ġtélécharg": 141504, - "Ġtéléphone": 98907, - "Ġtér": 89635, - "Ġtérmino": 139413, - "Ġtêm": 98860, - "Ġtên": 129064, - "Ġtête": 81967, - "Ġtë": 41095, - "Ġtìm": 128611, - "Ġtình": 128419, - "Ġtòa": 136977, - "Ġtóc": 132591, - "Ġtô": 130003, - "Ġtôi": 128296, - "Ġtôn": 134342, - "Ġtö": 63573, - "Ġtù": 135735, - "Ġtùy": 135736, - "Ġtú": 89218, - "Ġtúi": 136610, - "Ġtü": 127669, - "Ġtüket": 134783, - "Ġtüm": 128817, - "Ġtürl": 136166, - "Ġtürlü": 136167, - "ĠtÃł": 133464, - "ĠtÃłi": 128556, - "ĠtÃłn": 138878, - "ĠtÃłu": 133465, - "ĠtÃŃ": 76407, - "ĠtÃŃch": 128761, - "ĠtÃŃn": 129913, - "ĠtÃŃnh": 128439, - "ĠtÃŃtulo": 84951, - "ĠtÄ©nh": 139843, - "ĠtÄĥng": 128529, - "ĠtÄĻ": 134692, - "ĠtÅĤ": 141082, - "ĠtÅĤum": 141083, - "ĠtÅĤumacz": 141084, - "Ġtư": 128379, - "Ġtươi": 133683, - "Ġtương": 129509, - "Ġtượng": 129014, - "ĠtÆ°á»Ľng": 131943, - "Ġtưá»Ŀng": 137173, - "ĠtÆ°á»Łng": 129608, - "Ġtại": 128272, - "Ġtạm": 139511, - "Ġtạo": 128425, - "Ġtạp": 138628, - "Ġtả": 134358, - "Ġtải": 130897, - "Ġtấm": 136562, - "Ġtấn": 133270, - "Ġtất": 129202, - "Ġtầ": 131519, - "Ġtầm": 134059, - "Ġtầng": 131520, - "Ġtắc": 135352, - "Ġtắm": 137565, - "Ġtắt": 141070, - "Ġtặng": 133269, - "Ġtế": 128384, - "ĠtáºŃn": 132247, - "ĠtáºŃp": 128553, - "Ġtá»": 46500, - "Ġtụ": 126411, - "Ġtục": 128884, - "Ġtá»§": 135783, - "Ġtứ": 129594, - "Ġtức": 129595, - "Ġtừ": 94576, - "Ġtừng": 128981, - "Ġtá»±": 128377, - "Ġtá»·": 129427, - "Ġtá»ĩ": 139091, - "Ġtá»ī": 126450, - "Ġtá»īnh": 129018, - "Ġtá»ĭch": 131443, - "Ġtá»ı": 132367, - "Ġtá»ij": 129556, - "Ġtá»ijc": 133061, - "Ġtá»iji": 129597, - "Ġtá»ijt": 128418, - "Ġtá»ĵ": 137105, - "Ġtá»ĵn": 137106, - "Ġtá»ķ": 126341, - "Ġtá»ķng": 129822, - "Ġtá»Ļc": 133952, - "Ġtá»Ļi": 134057, - "ĠtỼi": 128447, - "Ġtá»Ŀ": 137971, - "Ġtá»Ń": 128804, - "Ġu": 575, - "ĠuLocal": 81368, - "Ġua": 45559, - "Ġuart": 46868, - "Ġub": 17910, - "Ġuber": 92039, - "Ġubic": 62774, - "Ġubiqu": 52236, - "Ġubiquitous": 63464, - "Ġubuntu": 84214, - "Ġuc": 25721, - "Ġucfirst": 66921, - "Ġuchar": 61646, - "Ġucwords": 95404, - "Ġucz": 87426, - "Ġuczni": 143697, - "Ġuczniów": 143698, - "Ġud": 26994, - "Ġuda": 142590, - "ĠudaÅĤo": 142591, - "Ġuden": 92755, - "Ġudp": 49219, - "ĠudziaÅĤ": 131905, - "Ġue": 60098, - "Ġuf": 54051, - "Ġug": 67656, - "Ġugl": 91118, - "Ġugly": 27261, - "Ġuh": 43744, - "Ġui": 7505, - "Ġuid": 14617, - "Ġuint": 2622, - "Ġuintptr": 38190, - "Ġuit": 24302, - "Ġuk": 14670, - "ĠukÅĤad": 135033, - "Ġul": 8557, - "Ġula": 129679, - "ĠulaÅŁ": 129680, - "Ġulcer": 95871, - "Ġull": 52296, - "Ġullam": 77008, - "Ġulong": 41991, - "Ġult": 8507, - "Ġultimate": 16724, - "Ġultimately": 13653, - "Ġultimo": 92006, - "Ġultr": 36132, - "Ġultra": 23998, - "Ġultrasound": 62759, - "Ġulus": 141884, - "Ġuluslararası": 141885, - "Ġum": 4443, - "Ġuma": 10608, - "Ġumb": 36681, - "Ġumbrella": 47898, - "Ġumie": 142903, - "ĠumiejÄĻ": 142904, - "ĠumiejÄĻtn": 142905, - "ĠumiejÄĻtnoÅĽci": 142906, - "Ġumo": 141252, - "Ġumoż": 141253, - "Ġumożli": 141254, - "Ġumożliw": 141255, - "Ġumożliwia": 141256, - "Ġump": 85042, - "Ġun": 650, - "Ġuna": 5093, - "Ġunab": 95618, - "Ġunable": 11889, - "Ġunacceptable": 42985, - "Ġunaffected": 77522, - "Ġuname": 74474, - "Ġunanim": 39975, - "Ġunanimous": 67409, - "Ġunanimously": 64078, - "Ġunanswered": 75447, - "Ġunarmed": 63899, - "Ġunary": 75678, - "Ġunas": 76826, - "Ġunauthorized": 44471, - "Ġunavailable": 34987, - "Ġunavoid": 77202, - "Ġunavoidable": 83016, - "Ġunaware": 40647, - "Ġunb": 41544, - "Ġunbe": 65571, - "Ġunbearable": 98830, - "Ġunbelie": 38937, - "Ġunbelievable": 51129, - "Ġunbiased": 73215, - "Ġunborn": 85233, - "Ġunc": 20815, - "Ġuncert": 23082, - "Ġuncertain": 35118, - "Ġuncertainties": 68767, - "Ġuncertainty": 26826, - "Ġunchanged": 34857, - "Ġunchecked": 53191, - "Ġuncle": 37494, - "Ġunclear": 24416, - "Ġuncomfort": 26726, - "Ġuncomfortable": 28113, - "Ġuncomment": 62073, - "Ġuncommon": 40196, - "Ġuncomp": 65537, - "Ġuncompressed": 92382, - "Ġuncon": 25062, - "Ġunconditional": 83563, - "Ġunconscious": 39611, - "Ġunconstitutional": 52825, - "Ġuncont": 69993, - "Ġunconventional": 72878, - "Ġuncover": 43963, - "Ġuncovered": 42422, - "Ġund": 2030, - "Ġunde": 58895, - "Ġundead": 69104, - "Ġundecided": 93455, - "Ġundef": 31144, - "Ġundefeated": 92476, - "Ġundefined": 5614, - "Ġundeniable": 80732, - "Ġunder": 1212, - "Ġunderage": 87012, - "Ġundercover": 57481, - "Ġundercut": 95009, - "Ġunderestimate": 78483, - "Ġunderestimated": 86036, - "Ġundergo": 36671, - "Ġundergoing": 46297, - "Ġundergone": 63138, - "Ġundergrad": 85072, - "Ġundergraduate": 40434, - "Ġunderground": 25260, - "Ġunderline": 51874, - "Ġunderlying": 16533, - "Ġundermin": 41086, - "Ġundermine": 41947, - "Ġundermined": 79517, - "Ġundermines": 95136, - "Ġundermining": 77369, - "Ġunderneath": 29356, - "Ġunderrated": 93679, - "Ġunders": 25373, - "Ġunderscore": 52109, - "Ġunderscores": 71790, - "Ġunderside": 95221, - "Ġunderst": 14316, - "Ġunderstand": 3535, - "Ġunderstandable": 48739, - "Ġunderstandably": 86998, - "Ġunderstanding": 8660, - "Ġunderstands": 30769, - "Ġunderstood": 15985, - "Ġundert": 18649, - "Ġundertake": 48543, - "Ġundertaken": 44079, - "Ġundertaking": 48226, - "Ġunderwater": 45374, - "Ġunderway": 37099, - "Ġunderwear": 54144, - "Ġunderwent": 53993, - "Ġunderworld": 99125, - "Ġundes": 55738, - "Ġundesirable": 76244, - "Ġundis": 80937, - "Ġundisclosed": 82857, - "Ġundo": 28721, - "Ġundocumented": 46657, - "Ġundone": 78741, - "Ġundoubtedly": 36948, - "Ġundue": 90542, - "Ġune": 6185, - "Ġunearth": 78575, - "Ġuneasy": 82272, - "Ġunemployed": 48889, - "Ġunemployment": 25608, - "Ġunequal": 77195, - "Ġunequiv": 82935, - "Ġunethical": 88635, - "Ġuneven": 60337, - "Ġunexpected": 16500, - "Ġunexpectedly": 50609, - "Ġunf": 9474, - "Ġunfair": 27643, - "Ġunfairly": 75625, - "Ġunfamiliar": 49283, - "Ġunfavor": 80283, - "Ġunfavorable": 91971, - "Ġunfinished": 63616, - "Ġunfit": 93467, - "Ġunfold": 27472, - "Ġunfolded": 75682, - "Ġunfolding": 32731, - "Ġunfolds": 89665, - "Ġunfore": 95591, - "Ġunforgettable": 59998, - "Ġunfortunate": 33607, - "Ġunfortunately": 25822, - "Ġung": 50490, - "Ġunge": 66796, - "Ġunh": 30075, - "Ġunhappy": 42151, - "Ġunhealthy": 52708, - "Ġunheard": 85460, - "Ġuni": 47886, - "Ġunic": 87549, - "Ġunicode": 26077, - "Ġunicorn": 81830, - "Ġunidad": 96722, - "Ġunidades": 94431, - "Ġunidentified": 64478, - "Ġunified": 42690, - "Ġuniform": 13794, - "Ġuniformly": 77809, - "Ġuniforms": 44133, - "Ġunify": 85340, - "Ġunilateral": 85878, - "Ġunimagin": 86112, - "Ġunin": 70013, - "Ġuninitialized": 97287, - "Ġunins": 65103, - "Ġuninstall": 53635, - "Ġuninsured": 81607, - "Ġunint": 34777, - "Ġunintended": 72343, - "Ġunintention": 69476, - "Ġuninterrupted": 98150, - "Ġunion": 11300, - "Ġunions": 28490, - "Ġuniq": 54152, - "Ġuniqu": 28021, - "Ġunique": 4911, - "Ġuniquely": 41229, - "Ġuniqueness": 59057, - "Ġunit": 4982, - "ĠunitOfWork": 84053, - "Ġunite": 51596, - "Ġunited": 28192, - "Ġunits": 8153, - "Ġunittest": 19905, - "Ġunity": 30326, - "Ġunivers": 10919, - "Ġuniversal": 20178, - "Ġuniversally": 60428, - "Ġuniverse": 15494, - "Ġuniversities": 23106, - "Ġuniversity": 12103, - "Ġunix": 51866, - "Ġunjust": 51483, - "Ġunk": 64431, - "Ġunknow": 83544, - "Ġunknown": 9788, - "Ġunl": 64885, - "Ġunlaw": 38857, - "Ġunlawful": 44422, - "Ġunle": 37726, - "Ġunleash": 77435, - "Ġunleashed": 68264, - "Ġunless": 7241, - "Ġunlike": 19836, - "Ġunlikely": 17367, - "Ġunlimited": 26764, - "Ġunlink": 47479, - "Ġunload": 62714, - "Ġunloaded": 87706, - "Ġunlock": 15055, - "Ġunlocked": 35618, - "Ġunlocking": 79378, - "Ġunlocks": 73191, - "Ġunlucky": 88444, - "Ġunm": 37431, - "Ġunmanned": 87840, - "Ġunmarried": 94487, - "Ġunmatched": 68377, - "Ġunmist": 91258, - "Ġunmistak": 95107, - "Ġunn": 16950, - "Ġunnamed": 52773, - "Ġunnatural": 80746, - "Ġunnecessarily": 82374, - "Ġunnecessary": 25165, - "Ġunnoticed": 76923, - "Ġuno": 23895, - "Ġunofficial": 56651, - "Ġunordered": 55733, - "Ġunos": 52898, - "Ġunp": 21624, - "Ġunpack": 31065, - "Ġunpaid": 54084, - "Ġunparalleled": 70157, - "Ġunpl": 83845, - "Ġunpleasant": 46889, - "Ġunpopular": 65758, - "Ġunprecedented": 29969, - "Ġunpredict": 43596, - "Ġunpredictable": 49135, - "Ġunprotected": 93351, - "Ġunpublished": 84217, - "Ġunquestion": 74533, - "Ġunr": 40380, - "Ġunravel": 73973, - "Ġunre": 37123, - "Ġunreachable": 69322, - "Ġunread": 60291, - "Ġunreal": 49104, - "Ġunrealistic": 70885, - "Ġunreasonable": 58425, - "Ġunrecognized": 96139, - "Ġunregister": 62113, - "Ġunrelated": 45205, - "Ġunreliable": 66029, - "Ġunresolved": 80161, - "Ġunrest": 58222, - "Ġunrestricted": 77839, - "Ġuns": 6975, - "Ġunsafe": 19860, - "Ġunseen": 63133, - "Ġunser": 23898, - "Ġunsere": 44367, - "Ġunserem": 77012, - "Ġunseren": 66482, - "Ġunserer": 44160, - "Ġunserialize": 75494, - "Ġunset": 18000, - "Ġunsett": 67670, - "Ġunsettling": 90980, - "Ġunsigned": 3774, - "Ġunspecified": 54311, - "Ġunst": 64790, - "Ġunstable": 44211, - "Ġunstoppable": 92664, - "Ġunsub": 79204, - "Ġunsubscribe": 44374, - "Ġunsuccessful": 44925, - "Ġunsuccessfully": 96625, - "Ġunsupported": 40409, - "Ġunsur": 68117, - "Ġunsure": 42903, - "Ġunsus": 91551, - "Ġunsustainable": 97509, - "Ġunt": 13065, - "Ġunten": 82816, - "Ġunter": 21506, - "Ġunters": 57686, - "Ġunterschied": 80260, - "Ġunterstüt": 81429, - "Ġunterstützen": 143562, - "Ġunterstützt": 143037, - "Ġunthinkable": 95503, - "Ġuntil": 3080, - "Ġunto": 29349, - "Ġuntouched": 67522, - "Ġuntranslated": 90348, - "Ġuntreated": 82820, - "Ġuntrue": 87877, - "Ġuntuk": 19593, - "Ġunus": 15857, - "Ġunused": 20006, - "Ġunusual": 18511, - "Ġunusually": 56799, - "Ġunve": 27747, - "Ġunveil": 91031, - "Ġunveiled": 38197, - "Ġunveiling": 91488, - "Ġunw": 15025, - "Ġunwanted": 34921, - "Ġunwilling": 45143, - "Ġunwind": 81510, - "Ġunwitting": 94019, - "Ġunwrap": 79813, - "Ġunzip": 75913, - "Ġuom": 50053, - "Ġuomini": 55413, - "Ġuomo": 35126, - "Ġup": 705, - "Ġupbeat": 84673, - "Ġupbringing": 91285, - "Ġupcoming": 14487, - "Ġupd": 79003, - "Ġupdate": 2647, - "ĠupdateTime": 75335, - "ĠupdateUser": 60391, - "Ġupdated": 6049, - "ĠupdatedAt": 48831, - "Ġupdater": 68249, - "Ġupdates": 8837, - "Ġupdating": 21010, - "Ġupfront": 64351, - "Ġupgrade": 13910, - "Ġupgraded": 32524, - "Ġupgrades": 31614, - "Ġupgrading": 45935, - "Ġuphe": 95610, - "Ġupheld": 61311, - "Ġuphill": 76658, - "Ġuphol": 69204, - "Ġuphold": 63423, - "Ġupholstery": 95688, - "Ġupkeep": 96096, - "Ġuplift": 96447, - "Ġuplifting": 94509, - "Ġupload": 8135, - "Ġuploaded": 22853, - "Ġuploader": 82257, - "Ġuploading": 47329, - "Ġuploads": 66563, - "Ġupon": 5193, - "Ġupp": 63433, - "Ġupper": 8416, - "Ġuppercase": 39482, - "Ġupright": 48585, - "Ġuprising": 69406, - "Ġupro": 96832, - "Ġups": 32734, - "Ġupscale": 73923, - "Ġupset": 22459, - "Ġupsetting": 89969, - "Ġupside": 35841, - "Ġupstairs": 48907, - "Ġupstream": 41730, - "Ġupt": 34335, - "Ġuptake": 68475, - "Ġuptime": 86689, - "Ġupto": 80126, - "Ġupward": 39772, - "Ġupwards": 43954, - "Ġur": 4335, - "Ġuranium": 53844, - "Ġuranus": 95228, - "Ġurb": 77710, - "Ġurban": 15662, - "Ġure": 52460, - "Ġurg": 60839, - "Ġurge": 32047, - "Ġurged": 27832, - "Ġurgency": 53817, - "Ġurgent": 33671, - "Ġurgently": 76620, - "Ġurges": 62837, - "Ġurging": 42576, - "Ġuri": 13071, - "Ġurinary": 71635, - "Ġurine": 39235, - "Ġurl": 2515, - "ĠurlString": 82489, - "Ġurlencode": 58691, - "Ġurllib": 24090, - "Ġurlparse": 80067, - "Ġurlpatterns": 63434, - "Ġurls": 29984, - "Ġurn": 65867, - "Ġurz": 143475, - "ĠurzÄħd": 140821, - "ĠurzÄħdzenia": 140822, - "ĠurzÄĻd": 143476, - "Ġus": 601, - "Ġusa": 33715, - "Ġusability": 75060, - "Ġusable": 39930, - "Ġusado": 97343, - "Ġusage": 10431, - "Ġusando": 57141, - "Ġusar": 46515, - "Ġusb": 26983, - "Ġuse": 990, - "ĠuseCallback": 43505, - "ĠuseClass": 97675, - "ĠuseContext": 34652, - "ĠuseDispatch": 39894, - "ĠuseEffect": 14233, - "ĠuseForm": 90926, - "ĠuseHistory": 44033, - "ĠuseMemo": 72479, - "ĠuseNewUrlParser": 92630, - "ĠuseParams": 84189, - "ĠuseRef": 40133, - "ĠuseRouter": 93915, - "ĠuseSelector": 32392, - "ĠuseState": 8102, - "ĠuseStyles": 34129, - "Ġused": 1483, - "Ġuseful": 5390, - "Ġusefulness": 75864, - "Ġuseless": 28848, - "Ġuser": 1196, - "ĠuserAgent": 94196, - "ĠuserDao": 77961, - "ĠuserData": 34385, - "ĠuserDetails": 88103, - "ĠuserEmail": 87570, - "ĠuserID": 35204, - "ĠuserId": 10329, - "ĠuserInfo": 24469, - "ĠuserInput": 64173, - "ĠuserList": 64374, - "ĠuserManager": 65662, - "ĠuserModel": 82785, - "ĠuserName": 19855, - "ĠuserProfile": 86656, - "ĠuserRepository": 49508, - "ĠuserService": 30662, - "ĠuserType": 87547, - "Ġuserdata": 66874, - "Ġuserid": 32270, - "Ġuserinfo": 91178, - "Ġusern": 75012, - "Ġusername": 5934, - "Ġusernames": 82051, - "Ġusers": 3847, - "Ġuses": 5711, - "Ġusher": 63160, - "Ġushort": 43024, - "Ġusing": 1667, - "Ġusize": 22301, - "Ġusleep": 82601, - "Ġuso": 33910, - "Ġusr": 43071, - "Ġust": 87589, - "Ġusted": 60295, - "Ġusu": 40288, - "Ġusual": 13475, - "Ġusually": 5990, - "Ġusuario": 16382, - "Ġusuarios": 41756, - "Ġusur": 95088, - "Ġusuário": 59018, - "ĠusÅĤug": 130680, - "Ġut": 8621, - "Ġutan": 81764, - "Ġutc": 69596, - "Ġuten": 85473, - "Ġutens": 80936, - "Ġuterus": 84556, - "Ġutf": 10644, - "Ġutil": 4094, - "Ġutilis": 41487, - "Ġutilisateur": 86526, - "Ġutilise": 68052, - "Ġutiliser": 74044, - "Ġutilisé": 134449, - "Ġutilities": 29419, - "Ġutility": 15549, - "Ġutiliz": 32172, - "Ġutiliza": 76061, - "Ġutilizado": 98533, - "Ġutilizando": 75990, - "Ġutilizar": 63980, - "Ġutilization": 49449, - "Ġutilize": 28066, - "Ġutilized": 33616, - "Ġutilizes": 59780, - "Ġutilizing": 34888, - "Ġutils": 12439, - "Ġutmost": 53611, - "Ġutrecht": 95073, - "Ġutter": 21532, - "Ġuttered": 89739, - "Ġutterly": 37531, - "Ġuu": 41179, - "Ġuuid": 16040, - "Ġuur": 88760, - "Ġuv": 29663, - "Ġuw": 37343, - "Ġuwag": 134907, - "ĠuwagÄĻ": 134908, - "Ġuważ": 137800, - "Ġuważa": 137801, - "Ġux": 89803, - "Ġuy": 81900, - "Ġuyar": 140741, - "Ġuyarı": 140742, - "Ġuz": 44476, - "Ġuç": 141477, - "Ġuçak": 141478, - "Ġuçu": 143783, - "ĠuçuÅŁ": 143784, - "ĠuÄŁ": 136119, - "ĠuÄŁra": 136120, - "Ġuży": 61408, - "Ġużytk": 88324, - "Ġużytkow": 131897, - "Ġużywa": 133290, - "Ġuá»ijng": 130069, - "Ġv": 348, - "ĠvX": 92845, - "Ġva": 11164, - "Ġvac": 9283, - "Ġvacancies": 66651, - "Ġvacancy": 61462, - "Ġvacant": 48691, - "Ġvacation": 20161, - "Ġvacations": 74567, - "Ġvacc": 13712, - "Ġvaccinated": 69458, - "Ġvaccination": 46065, - "Ġvaccinations": 90871, - "Ġvaccine": 24467, - "Ġvaccines": 39200, - "Ġvacuum": 28202, - "Ġvad": 70852, - "Ġvag": 17314, - "Ġvagina": 38788, - "Ġvaginal": 57059, - "Ġvague": 39046, - "Ġvaguely": 71959, - "Ġvagy": 61532, - "Ġvai": 39486, - "Ġvain": 45504, - "Ġvais": 90407, - "Ġvak": 74825, - "Ġval": 1044, - "Ġvale": 33722, - "Ġvaleur": 50204, - "Ġvaleurs": 95935, - "Ġvalid": 2697, - "Ġvalida": 91687, - "Ġvalidar": 83115, - "Ġvalidate": 9593, - "Ġvalidated": 32332, - "Ġvalidates": 26257, - "Ġvalidating": 68672, - "Ġvalidation": 10519, - "ĠvalidationResult": 96533, - "Ġvalidations": 83388, - "Ġvalidator": 22935, - "Ġvalidators": 38588, - "Ġvalide": 98756, - "Ġvalidity": 31839, - "Ġvalido": 89315, - "Ġvalign": 23858, - "Ġvalley": 33581, - "Ġvalleys": 85397, - "Ġvalor": 14116, - "Ġvalore": 93942, - "Ġvalores": 36152, - "Ġvals": 28356, - "Ġvalu": 92931, - "Ġvaluable": 15172, - "Ġvaluation": 50162, - "Ġvalue": 897, - "ĠvalueForKey": 48588, - "ĠvalueType": 96438, - "Ġvalued": 32547, - "Ġvalues": 2750, - "Ġvalve": 31430, - "Ġvalves": 63000, - "Ġvamos": 69670, - "Ġvamp": 59055, - "Ġvampire": 50487, - "Ġvampires": 77190, - "Ġvan": 5242, - "Ġvandal": 61407, - "Ġvandalism": 88852, - "Ġvanilla": 32065, - "Ġvanish": 91127, - "Ġvanished": 58481, - "Ġvanity": 51571, - "Ġvans": 76024, - "Ġvant": 96671, - "Ġvap": 67757, - "Ġvape": 68170, - "Ġvaping": 80288, - "Ġvapor": 37652, - "Ġvar": 762, - "Ġvara": 62801, - "Ġvarargin": 52439, - "Ġvarchar": 32958, - "Ġvard": 127127, - "Ġvardı": 136959, - "Ġvardır": 131477, - "Ġvari": 4151, - "Ġvariability": 53609, - "Ġvariable": 3890, - "Ġvariables": 7332, - "Ġvariance": 32273, - "Ġvariant": 11424, - "Ġvariants": 26012, - "Ġvarias": 84950, - "Ġvariation": 22990, - "Ġvariations": 26244, - "Ġvaried": 27730, - "Ġvaries": 34227, - "Ġvarieties": 35580, - "Ġvariety": 8045, - "Ġvarios": 73818, - "Ġvarious": 5257, - "Ġvars": 19942, - "Ġvary": 13289, - "Ġvarying": 28765, - "Ġvas": 43396, - "Ġvascular": 63503, - "Ġvase": 92384, - "Ġvast": 12767, - "Ġvastly": 52008, - "Ġvat": 78526, - "Ġvatanda": 133277, - "ĠvatandaÅŁ": 133278, - "Ġvault": 34584, - "Ġvaz": 143854, - "Ġvazge": 143855, - "Ġvazgeç": 143856, - "ĠvaÌĢ": 139607, - "Ġvb": 34719, - "ĠvbCrLf": 89407, - "Ġvbox": 85977, - "Ġvc": 24553, - "Ġvd": 61527, - "Ġve": 5208, - "Ġvec": 7486, - "Ġveces": 56329, - "Ġvect": 55635, - "Ġvector": 4621, - "Ġvectors": 22879, - "Ġved": 27933, - "Ġvedere": 87745, - "Ġveel": 50137, - "Ġveg": 47338, - "Ġvegan": 29149, - "Ġvegas": 72439, - "Ġveget": 12997, - "Ġvegetable": 35481, - "Ġvegetables": 23880, - "Ġvegetarian": 45382, - "Ġvegetation": 53732, - "Ġveggies": 59299, - "Ġveh": 5164, - "Ġvehement": 91368, - "Ġvehicle": 7310, - "Ġvehicles": 11474, - "ĠvehÃŃculo": 139759, - "Ġveil": 58255, - "Ġvein": 53244, - "Ġveins": 59664, - "Ġvej": 92460, - "Ġvel": 9054, - "Ġvelit": 71548, - "Ġveloc": 40509, - "Ġvelocidad": 98094, - "Ġvelocities": 74057, - "Ġvelocity": 15435, - "Ġvelvet": 71326, - "Ġvem": 97062, - "Ġven": 11208, - "Ġvend": 18672, - "Ġvenda": 93545, - "Ġvending": 85044, - "Ġvendor": 20728, - "Ġvendors": 28529, - "Ġvene": 76751, - "Ġvener": 90131, - "Ġvenez": 73990, - "Ġvengeance": 71688, - "Ġveniam": 87970, - "Ġvenir": 95486, - "Ġvenom": 73708, - "Ġvent": 10378, - "Ġventa": 55402, - "Ġventana": 63146, - "Ġventas": 99019, - "Ġvente": 73090, - "Ġventil": 70602, - "Ġventilation": 55134, - "Ġvents": 80207, - "Ġventure": 25191, - "Ġventured": 98407, - "Ġventures": 65624, - "Ġvenue": 21434, - "Ġvenues": 36178, - "Ġver": 2739, - "Ġvera": 91244, - "Ġverb": 18607, - "Ġverbal": 35770, - "Ġverbally": 84107, - "Ġverbess": 98038, - "Ġverbose": 13694, - "Ġverbosity": 71387, - "Ġverbs": 61846, - "Ġverd": 25658, - "Ġverdad": 81171, - "Ġverdade": 81585, - "Ġverde": 73161, - "Ġverdict": 35443, - "Ġverdienen": 91440, - "ĠverdiÄŁi": 136704, - "Ġvere": 72943, - "Ġverfüg": 141436, - "Ġverfügbar": 141437, - "Ġverg": 37801, - "Ġverge": 58718, - "Ġverifica": 91071, - "Ġverificar": 91819, - "Ġverification": 22901, - "Ġverified": 23933, - "Ġverifier": 88737, - "Ġverifies": 87856, - "Ġverify": 10146, - "Ġverifying": 68863, - "Ġverk": 68336, - "Ġverm": 95898, - "Ġvern": 71593, - "Ġvero": 78287, - "Ġverr": 71467, - "Ġvers": 5436, - "Ġversa": 45291, - "Ġversatile": 31945, - "Ġversatility": 59012, - "Ġversch": 47708, - "Ġverschied": 51892, - "Ġverschiedene": 95710, - "Ġverschiedenen": 88687, - "Ġverschill": 91864, - "Ġverse": 32387, - "Ġverses": 49299, - "Ġversion": 2319, - "Ġversions": 10795, - "Ġversión": 96491, - "Ġverso": 91865, - "Ġverst": 85104, - "Ġversus": 19041, - "Ġvert": 5198, - "Ġverte": 66761, - "Ġvertex": 11936, - "Ġvertical": 12140, - "Ġvertically": 50935, - "Ġvertices": 17228, - "Ġverts": 59414, - "Ġverv": 96441, - "Ġverw": 31100, - "Ġverwenden": 79551, - "Ġverwendet": 74191, - "Ġvery": 1602, - "Ġverz": 73197, - "Ġveröffent": 141870, - "Ġveröffentlicht": 141871, - "Ġves": 64535, - "Ġvess": 17441, - "Ġvessel": 26182, - "Ġvessels": 29980, - "Ġvest": 27605, - "Ġvested": 77951, - "Ġvestib": 90934, - "Ġvests": 97273, - "Ġvet": 23313, - "Ġveter": 12569, - "Ġveteran": 20820, - "Ġveterans": 25820, - "Ġveterin": 60571, - "Ġveterinarian": 81240, - "Ġveterinary": 68240, - "Ġveto": 47860, - "Ġvetor": 75457, - "Ġvets": 97018, - "Ġveut": 75505, - "Ġvex": 83165, - "Ġveya": 86959, - "Ġvez": 20563, - "Ġvezes": 76693, - "ĠveÃŃculo": 138736, - "Ġvf": 58454, - "Ġvfs": 92941, - "Ġvg": 84530, - "Ġvh": 67888, - "Ġvi": 3275, - "Ġvia": 4566, - "Ġviability": 67407, - "Ġviable": 30428, - "Ġviagra": 19695, - "Ġvib": 55300, - "Ġvibe": 46711, - "Ġvibes": 89849, - "Ġvibr": 16929, - "Ġvibrant": 32976, - "Ġvibrating": 49937, - "Ġvibration": 47813, - "Ġvibrations": 77252, - "Ġvibrator": 60724, - "Ġvic": 31431, - "Ġvice": 16774, - "Ġvicinity": 52751, - "Ġvicious": 42410, - "Ġvict": 5199, - "Ġvictim": 11734, - "Ġvictims": 12415, - "Ġvictories": 45046, - "Ġvictorious": 73710, - "Ġvictory": 12560, - "Ġvid": 18127, - "Ġvida": 24949, - "Ġvide": 23029, - "Ġvideo": 2766, - "Ġvideoer": 69057, - "Ġvideog": 88017, - "Ġvideos": 6803, - "Ġvideot": 71274, - "Ġvids": 70512, - "Ġvidé": 39638, - "Ġvidéo": 56046, - "Ġvidéos": 71786, - "Ġvie": 17098, - "Ġvieille": 69211, - "Ġviel": 36077, - "Ġviele": 41983, - "Ġvielen": 68042, - "Ġvielleicht": 83835, - "Ġviene": 55404, - "Ġvient": 85000, - "Ġvier": 57093, - "Ġviet": 84359, - "Ġvieux": 91522, - "Ġview": 1651, - "ĠviewBox": 37996, - "ĠviewController": 52722, - "ĠviewDidLoad": 21625, - "ĠviewHolder": 43473, - "ĠviewModel": 20710, - "ĠviewPager": 85972, - "ĠviewType": 53081, - "ĠviewWillAppear": 65665, - "Ġviewed": 19334, - "Ġviewer": 25708, - "Ġviewers": 21762, - "Ġviewing": 20102, - "Ġviewpoint": 58385, - "Ġviewpoints": 89809, - "Ġviewport": 32253, - "Ġviews": 6194, - "Ġvig": 20802, - "Ġvigil": 37394, - "Ġvigilant": 80234, - "Ġvign": 92792, - "Ġvigor": 54922, - "Ġvigorous": 70820, - "Ġvigorously": 76749, - "Ġvil": 25801, - "Ġvile": 80214, - "Ġvill": 8901, - "Ġvilla": 46525, - "Ġvillage": 14126, - "Ġvillagers": 60821, - "Ġvillages": 32789, - "Ġvillain": 39048, - "Ġvillains": 60710, - "Ġville": 38873, - "Ġvim": 36157, - "Ġvin": 23902, - "Ġvinc": 81710, - "Ġvind": 37805, - "Ġvinden": 92651, - "Ġvine": 28950, - "Ġvinegar": 46105, - "Ġvines": 85429, - "Ġvintage": 23790, - "Ġvinyl": 33449, - "Ġviol": 4634, - "Ġviolate": 40487, - "Ġviolated": 33421, - "Ġviolates": 50313, - "Ġviolating": 44362, - "Ġviolation": 19940, - "Ġviolations": 26557, - "Ġviolence": 9170, - "Ġviolent": 16401, - "Ġviolently": 64200, - "Ġviolet": 79736, - "Ġviolin": 62037, - "Ġvip": 62868, - "Ġviper": 95132, - "Ġvir": 8867, - "Ġviral": 28862, - "Ġvirgin": 35899, - "Ġvirt": 12763, - "Ġvirtual": 4108, - "Ġvirtually": 21214, - "Ġvirtue": 34360, - "Ġvirtues": 65527, - "Ġvirus": 16770, - "Ġviruses": 40968, - "Ġvis": 2098, - "Ġvisa": 26655, - "Ġvisas": 55677, - "Ġvisc": 58565, - "Ġvisceral": 88016, - "Ġviscosity": 98430, - "Ġvisibility": 23160, - "Ġvisible": 9434, - "Ġvisibly": 73006, - "Ġvision": 11129, - "Ġvisionary": 86390, - "Ġvisions": 57295, - "Ġvisit": 3947, - "Ġvisita": 80833, - "Ġvisite": 74736, - "Ġvisited": 11994, - "Ġvisiting": 16721, - "Ġvisitor": 20181, - "Ġvisitors": 15255, - "Ġvisits": 21051, - "Ġvista": 39036, - "Ġvistas": 95141, - "Ġvisto": 65418, - "Ġvisual": 9124, - "Ġvisualization": 41048, - "Ġvisualize": 50087, - "Ġvisually": 42295, - "Ġvisuals": 52977, - "Ġvit": 13157, - "Ġvita": 54476, - "Ġvitae": 63120, - "Ġvital": 16198, - "Ġvitality": 74616, - "Ġvitamin": 27071, - "Ġvitamins": 45092, - "Ġvite": 82357, - "Ġvitro": 53904, - "Ġviv": 17950, - "Ġvivastreet": 64792, - "Ġvive": 91902, - "Ġvivid": 42020, - "Ġvivo": 40194, - "Ġviz": 47750, - "Ġviêm": 132785, - "Ġviên": 97483, - "Ġviết": 128839, - "Ġviá»ĩc": 128289, - "Ġviá»ĩn": 129972, - "Ġvk": 34283, - "Ġvl": 41136, - "Ġvlan": 65420, - "Ġvm": 10995, - "Ġvmax": 77015, - "Ġvmin": 88263, - "Ġvn": 51017, - "Ġvnode": 68721, - "Ġvo": 4069, - "Ġvoc": 11984, - "Ġvocab": 23820, - "Ġvocabulary": 34918, - "Ġvocal": 25407, - "Ġvocalist": 95565, - "Ġvocals": 46096, - "Ġvocational": 88386, - "Ġvocê": 24709, - "Ġvodka": 75424, - "Ġvog": 62939, - "Ġvoi": 67652, - "Ġvoice": 7743, - "Ġvoiced": 51368, - "Ġvoices": 23314, - "Ġvoid": 737, - "Ġvoir": 45031, - "Ġvois": 99064, - "Ġvoiture": 80545, - "Ġvoks": 92413, - "Ġvoksen": 70920, - "Ġvoksne": 98030, - "Ġvol": 4400, - "Ġvolatile": 17072, - "Ġvolatility": 52738, - "Ġvolcan": 35273, - "Ġvolcanic": 66064, - "Ġvolcano": 65206, - "Ġvoll": 56354, - "Ġvolley": 55573, - "Ġvolleyball": 76067, - "Ġvolont": 97633, - "Ġvolt": 16393, - "Ġvolta": 53986, - "Ġvoltage": 21720, - "Ġvolte": 96459, - "Ġvolts": 86067, - "Ġvolum": 62820, - "Ġvolume": 8123, - "Ġvolumes": 26282, - "Ġvolunt": 24858, - "Ġvoluntarily": 53423, - "Ġvoluntary": 35979, - "Ġvolunte": 13376, - "Ġvolunteer": 25144, - "Ġvolunteered": 73671, - "Ġvolunteering": 69338, - "Ġvolunteers": 23010, - "Ġvolupt": 50710, - "Ġvolver": 86362, - "Ġvom": 21982, - "Ġvomiting": 62471, - "Ġvon": 6538, - "Ġvont": 81033, - "Ġvoor": 12931, - "Ġvor": 13906, - "Ġvorhand": 92670, - "Ġvortex": 86527, - "Ġvos": 25251, - "Ġvot": 4170, - "Ġvote": 6910, - "Ġvoted": 16228, - "Ġvoter": 25323, - "Ġvoters": 11707, - "Ġvotes": 12684, - "Ġvoting": 15668, - "Ġvotre": 14918, - "Ġvou": 54062, - "Ġvoucher": 48658, - "Ġvouchers": 71980, - "Ġvous": 9012, - "Ġvow": 39343, - "Ġvowed": 50030, - "Ġvowel": 76181, - "Ġvowels": 78456, - "Ġvows": 76441, - "Ġvox": 43739, - "Ġvoxel": 60184, - "Ġvoy": 23063, - "Ġvoyage": 44540, - "Ġvoyeur": 47472, - "Ġvoz": 84090, - "Ġvp": 34823, - "Ġvpn": 70806, - "Ġvr": 36100, - "Ġvra": 33823, - "Ġvrai": 82095, - "Ġvraiment": 58919, - "Ġvriend": 79782, - "Ġvrij": 69605, - "Ġvrou": 22451, - "Ġvrouw": 36379, - "Ġvrouwen": 35196, - "Ġvs": 6165, - "Ġvscode": 55380, - "Ġvt": 39105, - "Ġvtk": 29534, - "Ġvtx": 96879, - "Ġvu": 32514, - "Ġvue": 47134, - "Ġvuel": 63613, - "Ġvul": 11719, - "Ġvulgar": 73160, - "Ġvulner": 13521, - "Ġvulnerabilities": 51127, - "Ġvulnerability": 33004, - "Ġvulnerable": 19563, - "Ġvv": 56333, - "Ġvw": 74086, - "Ġvx": 43460, - "Ġvy": 45259, - "Ġvz": 87744, - "Ġvá": 57297, - "Ġvál": 85980, - "Ġválido": 97074, - "Ġvárias": 137417, - "Ġvários": 135626, - "Ġvão": 136622, - "Ġvä": 50618, - "Ġväl": 82924, - "ĠvÃ¥": 58309, - "ĠvÃ¥r": 96497, - "Ġvæ": 31370, - "Ġvære": 46073, - "Ġvé": 44065, - "Ġvéhic": 140422, - "Ġvéhicule": 140423, - "Ġvér": 76580, - "Ġvéritable": 139819, - "Ġvì": 128378, - "Ġvòng": 130604, - "Ġvô": 128867, - "Ġvõ": 79195, - "Ġvö": 143435, - "Ġvöll": 143436, - "Ġvöllig": 143437, - "Ġvùng": 129838, - "Ġvüc": 143837, - "Ġvücud": 143838, - "ĠvÃł": 47742, - "ĠvÃłi": 131302, - "ĠvÃłng": 130180, - "ĠvÃło": 86139, - "ĠvÃŃ": 30544, - "ĠvÃŃct": 142853, - "ĠvÃŃctima": 142854, - "ĠvÃŃde": 37050, - "ĠvÃŃdeo": 51230, - "ĠvÃŃdeos": 67428, - "ĠvÃŃt": 143874, - "ĠvÃŃtima": 143875, - "ĠvÄĥn": 128683, - "ĠvÅ©": 135343, - "Ġvượt": 132629, - "Ġvưá»Ŀ": 138790, - "Ġvưá»Ŀn": 138791, - "Ġvấn": 128580, - "Ġvẫn": 128487, - "Ġvẻ": 130525, - "Ġvẽ": 142077, - "Ġvết": 137866, - "ĠváºŃn": 129984, - "ĠváºŃt": 128853, - "ĠváºŃy": 128490, - "Ġvợ": 130888, - "Ġvụ": 128367, - "Ġvừa": 128727, - "Ġvững": 135584, - "Ġvá»±c": 128978, - "Ġvá»ģ": 128265, - "Ġvá»ĩ": 129067, - "Ġvá»ĭ": 128444, - "Ġvá»įng": 130949, - "Ġvá»ı": 141419, - "Ġvá»ijn": 130498, - "ĠvỼi": 128250, - "Ġvá»Ŀi": 135421, - "Ġw": 289, - "ĠwParam": 56624, - "Ġwa": 10450, - "Ġwaar": 37295, - "Ġwag": 64325, - "Ġwage": 19062, - "Ġwaged": 91400, - "Ġwager": 55343, - "Ġwages": 23123, - "Ġwagon": 60419, - "Ġwah": 85227, - "Ġwaist": 28042, - "Ġwait": 3783, - "ĠwaitFor": 52223, - "Ġwaited": 29215, - "Ġwaiter": 67169, - "Ġwaiting": 8580, - "Ġwaitress": 95207, - "Ġwaits": 46936, - "Ġwaive": 90283, - "Ġwaived": 81482, - "Ġwaiver": 53105, - "Ġwaivers": 90900, - "Ġwake": 15156, - "Ġwakes": 61567, - "Ġwakeup": 91331, - "Ġwaking": 47628, - "Ġwaktu": 85882, - "Ġwal": 40826, - "Ġwalk": 4227, - "Ġwalked": 14858, - "Ġwalker": 62524, - "Ġwalkers": 94637, - "Ġwalking": 11435, - "Ġwalks": 22479, - "Ġwalkthrough": 98944, - "Ġwall": 7002, - "Ġwallet": 15085, - "Ġwallets": 53308, - "Ġwallpaper": 43586, - "Ġwallpapers": 81895, - "Ġwalls": 14285, - "Ġwalmart": 70125, - "Ġwalnut": 92629, - "Ġwan": 77753, - "Ġwand": 28710, - "Ġwander": 39220, - "Ġwandered": 81194, - "Ġwandering": 53963, - "Ġwang": 96944, - "Ġwann": 54505, - "Ġwanna": 32733, - "Ġwannonce": 83576, - "Ġwant": 1366, - "Ġwanted": 4829, - "Ġwanting": 19211, - "Ġwants": 6801, - "Ġwar": 4116, - "Ġward": 25657, - "Ġwardrobe": 45746, - "Ġwards": 77151, - "Ġware": 50706, - "Ġwarehouse": 30112, - "Ġwarehouses": 82173, - "Ġwaren": 43303, - "Ġwarfare": 38207, - "Ġwarm": 8205, - "Ġwarmed": 81730, - "Ġwarmer": 44939, - "Ġwarming": 23867, - "Ġwarmly": 96370, - "Ġwarmth": 40363, - "Ġwarn": 8809, - "Ġwarned": 18683, - "Ġwarning": 9958, - "Ġwarnings": 18993, - "Ġwarns": 48040, - "Ġwarp": 46320, - "Ġwarped": 86212, - "Ġwarrant": 7091, - "Ġwarranted": 73180, - "Ġwarranties": 60813, - "Ġwarrants": 54588, - "Ġwarranty": 8475, - "Ġwarrior": 37390, - "Ġwarriors": 42500, - "Ġwars": 24936, - "Ġwart": 59945, - "Ġwartime": 86852, - "Ġwarto": 78834, - "ĠwartoÅĽci": 135646, - "Ġwary": 54174, - "Ġwas": 572, - "Ġwash": 11369, - "Ġwashed": 37493, - "Ġwasher": 52892, - "Ġwashing": 27686, - "Ġwashington": 93671, - "Ġwasm": 98263, - "Ġwasn": 5710, - "Ġwast": 40321, - "Ġwaste": 12291, - "Ġwasted": 38828, - "Ġwastes": 81220, - "Ġwastewater": 76581, - "Ġwasting": 47797, - "Ġwat": 29025, - "Ġwatch": 3736, - "Ġwatchdog": 46911, - "Ġwatched": 15384, - "Ġwatcher": 55727, - "Ġwatchers": 86572, - "Ġwatches": 31760, - "Ġwatching": 10099, - "Ġwater": 3015, - "Ġwaterfall": 69051, - "Ġwaterfront": 68927, - "Ġwatering": 72741, - "Ġwatermark": 88006, - "Ġwaterproof": 46419, - "Ġwaters": 20520, - "Ġwatershed": 91356, - "Ġwatt": 66172, - "Ġwatts": 71022, - "Ġwav": 53807, - "Ġwave": 12060, - "Ġwaved": 64582, - "Ġwaveform": 72364, - "Ġwavelength": 45306, - "Ġwavelengths": 92859, - "Ġwaves": 16876, - "Ġwaving": 63111, - "Ġwax": 36023, - "Ġway": 1616, - "Ġwaypoint": 65176, - "Ġwaypoints": 81286, - "Ġways": 5510, - "Ġważ": 139215, - "Ġważne": 139216, - "Ġwb": 37858, - "Ġwc": 26548, - "Ġwchar": 41049, - "Ġwcs": 96668, - "ĠwczeÅĽ": 134098, - "ĠwczeÅĽniej": 134099, - "Ġwd": 45404, - "Ġwe": 582, - "Ġweak": 7469, - "ĠweakSelf": 73759, - "Ġweaken": 32456, - "Ġweakened": 57664, - "Ġweakening": 82426, - "Ġweaker": 42283, - "Ġweakest": 80763, - "Ġweakness": 23078, - "Ġweaknesses": 43567, - "Ġwealth": 11939, - "Ġwealthiest": 92018, - "Ġwealthy": 27894, - "Ġweap": 6158, - "Ġweapon": 10288, - "Ġweaponry": 77022, - "Ġweapons": 9893, - "Ġwear": 9850, - "Ġwearable": 77248, - "Ġwearer": 84602, - "Ġwearing": 12233, - "Ġwears": 37300, - "Ġweary": 75556, - "Ġweather": 9104, - "Ġweave": 67508, - "Ġweaving": 83609, - "Ġweb": 3482, - "ĠwebView": 56358, - "Ġwebcam": 25951, - "Ġwebdriver": 45681, - "Ġwebhook": 75268, - "Ġwebinar": 62560, - "Ġweblog": 93298, - "Ġwebpack": 31179, - "Ġwebpage": 44610, - "Ġwebs": 80920, - "Ġwebsite": 3910, - "Ġwebsites": 13037, - "Ġwebsocket": 58943, - "Ġwed": 10840, - "Ġwedding": 13008, - "Ġweddings": 54244, - "Ġwedge": 63685, - "ĠwedÅĤug": 140919, - "Ġwee": 74065, - "Ġweed": 39375, - "Ġweeds": 69435, - "Ġweek": 2003, - "Ġweekday": 46578, - "Ġweekdays": 71995, - "Ġweekend": 9001, - "Ġweekends": 37002, - "Ġweekly": 17059, - "Ġweeks": 5555, - "Ġweer": 65150, - "Ġweg": 70511, - "Ġwegen": 83281, - "Ġwei": 83904, - "Ġweiber": 70349, - "Ġweigh": 17529, - "Ġweighed": 46612, - "Ġweighing": 46726, - "Ġweighs": 49442, - "Ġweight": 4680, - "Ġweighted": 36824, - "Ġweighting": 88939, - "Ġweights": 14324, - "Ġweil": 52507, - "Ġweir": 96986, - "Ġweird": 16283, - "Ġweit": 85117, - "Ġweiter": 30632, - "Ġweitere": 61550, - "ĠweiÃŁ": 67278, - "Ġwel": 12442, - "Ġwelche": 58319, - "Ġwelcome": 10565, - "Ġwelcomed": 30969, - "Ġwelcomes": 56258, - "Ġwelcoming": 35287, - "Ġweld": 32766, - "Ġwelded": 81061, - "Ġwelding": 58922, - "Ġwelfare": 22634, - "Ġwell": 1632, - "Ġwellbeing": 56830, - "Ġwellness": 38790, - "Ġwells": 47296, - "Ġwelt": 77748, - "Ġwen": 37357, - "Ġwenig": 69987, - "Ġweniger": 83801, - "Ġwenn": 22075, - "Ġwent": 3937, - "Ġwer": 7060, - "Ġwerd": 72597, - "Ġwerde": 86913, - "Ġwerden": 12643, - "Ġwere": 1033, - "Ġwereld": 87885, - "Ġweren": 14716, - "Ġwerk": 58618, - "Ġwes": 97168, - "Ġwest": 9710, - "Ġwestern": 18494, - "Ġwet": 14401, - "ĠwewnÄĻtrzn": 141456, - "Ġwf": 41248, - "Ġwg": 63581, - "Ġwget": 64508, - "Ġwh": 420, - "Ġwhale": 50019, - "Ġwhales": 56774, - "Ġwhat": 1128, - "Ġwhatever": 8820, - "Ġwhats": 40109, - "Ġwhatsapp": 60208, - "Ġwhatsoever": 35634, - "Ġwhe": 14894, - "Ġwheat": 33053, - "Ġwheel": 13284, - "Ġwheelchair": 53518, - "Ġwheels": 22696, - "Ġwhen": 979, - "Ġwhence": 87449, - "Ġwhenever": 15356, - "Ġwhere": 1380, - "Ġwhereabouts": 79502, - "Ġwhereas": 19853, - "Ġwhereby": 47901, - "Ġwherein": 41318, - "Ġwherever": 27478, - "Ġwhether": 3425, - "Ġwhich": 892, - "Ġwhichever": 53684, - "Ġwhile": 1393, - "Ġwhilst": 23856, - "Ġwhim": 73471, - "Ġwhims": 69105, - "Ġwhip": 50076, - "Ġwhipped": 63257, - "Ġwhipping": 97522, - "Ġwhirl": 63683, - "Ġwhisk": 40659, - "Ġwhiskey": 64254, - "Ġwhisky": 80483, - "Ġwhisper": 34855, - "Ġwhispered": 57266, - "Ġwhispers": 88148, - "Ġwhistle": 39549, - "Ġwhistlebl": 64666, - "Ġwhistleblower": 90968, - "Ġwhit": 33699, - "Ġwhite": 4158, - "ĠwhiteColor": 45281, - "Ġwhitelist": 67727, - "Ġwhites": 21874, - "Ġwhitespace": 36372, - "Ġwho": 879, - "Ġwhoever": 38271, - "Ġwhole": 4361, - "Ġwholes": 25211, - "Ġwholesale": 34457, - "Ġwholesalers": 89897, - "Ġwholesome": 87218, - "Ġwholly": 41141, - "Ġwhom": 8711, - "Ġwhopping": 62869, - "Ġwhore": 71925, - "Ġwhose": 6693, - "Ġwhy": 3170, - "Ġwi": 23250, - "Ġwich": 70367, - "Ġwicht": 90796, - "Ġwichtig": 65733, - "Ġwicked": 43977, - "Ġwid": 9724, - "Ġwida": 142268, - "ĠwidaÄĩ": 142269, - "Ġwide": 6884, - "Ġwidely": 13570, - "Ġwiden": 93315, - "Ġwidened": 85888, - "Ġwidening": 84400, - "Ġwider": 21864, - "Ġwides": 23003, - "Ġwidespread": 23782, - "Ġwidest": 80239, - "Ġwidget": 9086, - "Ġwidgets": 31855, - "Ġwidow": 56796, - "Ġwidth": 2374, - "Ġwidths": 64411, - "Ġwie": 13368, - "Ġwieder": 26252, - "Ġwiel": 63979, - "Ġwield": 41845, - "Ġwielding": 86823, - "Ġwife": 7403, - "Ġwifi": 33417, - "Ġwig": 58741, - "Ġwij": 49551, - "Ġwik": 97175, - "Ġwiki": 28609, - "Ġwikipedia": 58218, - "Ġwil": 30231, - "Ġwild": 8380, - "Ġwildcard": 59104, - "Ġwilderness": 48262, - "Ġwildfire": 92125, - "Ġwildfires": 98382, - "Ġwildlife": 29305, - "Ġwildly": 47195, - "Ġwill": 686, - "Ġwillen": 84337, - "Ġwilling": 9831, - "Ġwillingly": 72552, - "Ġwillingness": 38275, - "Ġwilt": 74496, - "Ġwin": 3164, - "Ġwind": 9956, - "Ġwinding": 53726, - "Ġwindow": 3241, - "ĠwindowHeight": 88547, - "Ġwindows": 11030, - "Ġwinds": 28492, - "Ġwindshield": 73939, - "Ġwindy": 92921, - "Ġwine": 13078, - "Ġwines": 42755, - "Ġwing": 20013, - "Ġwinger": 73439, - "Ġwings": 26204, - "Ġwink": 68339, - "Ġwinner": 13632, - "Ġwinners": 25448, - "Ġwinning": 10987, - "Ġwinnings": 86349, - "Ġwins": 14816, - "Ġwinter": 12406, - "Ġwinters": 84982, - "Ġwipe": 39094, - "Ġwiped": 48166, - "Ġwipes": 83538, - "Ġwiping": 83139, - "Ġwir": 16111, - "Ġwird": 14821, - "Ġwire": 9067, - "ĠwireType": 89243, - "Ġwired": 52121, - "Ġwireless": 20739, - "Ġwires": 35008, - "Ġwiring": 18827, - "Ġwirk": 50368, - "Ġwirklich": 55813, - "Ġwis": 18599, - "Ġwisdom": 23389, - "Ġwise": 23335, - "Ġwisely": 65613, - "Ġwish": 6426, - "Ġwished": 36187, - "Ġwishes": 24240, - "Ġwishing": 45127, - "Ġwishlist": 71662, - "Ġwissen": 75130, - "Ġwit": 37367, - "Ġwitch": 36382, - "Ġwitches": 80162, - "Ġwith": 448, - "ĠwithObject": 75298, - "ĠwithRouter": 54532, - "ĠwithString": 94974, - "ĠwithStyles": 63310, - "Ġwithd": 44974, - "Ġwithdraw": 14798, - "Ġwithdrawal": 29736, - "Ġwithdrawals": 85204, - "Ġwithdrawing": 82960, - "Ġwithdrawn": 49582, - "Ġwithdrew": 61665, - "Ġwithheld": 76003, - "Ġwithhold": 86800, - "Ġwithholding": 80512, - "Ġwithin": 2878, - "Ġwithout": 2041, - "Ġwithstand": 50471, - "Ġwitness": 11298, - "Ġwitnessed": 31026, - "Ġwitnesses": 27723, - "Ġwitnessing": 68942, - "Ġwitty": 82633, - "Ġwives": 38620, - "Ġwizard": 33968, - "Ġwizards": 88163, - "ĠwiÄĻ": 44916, - "ĠwiÄĻc": 98701, - "ĠwiÄĻcej": 80444, - "ĠwiÄĻks": 128169, - "ĠwiÄĻksze": 141841, - "ĠwiÄĻkszo": 143022, - "ĠwiÄĻkszoÅĽÄĩ": 143023, - "Ġwk": 73760, - "Ġwl": 44709, - "Ġwlan": 78353, - "Ġwm": 51634, - "Ġwn": 65480, - "Ġwnd": 80432, - "ĠwnÄĻtr": 138976, - "ĠwnÄĻtrz": 138977, - "Ġwo": 23738, - "Ġwoes": 76725, - "Ġwohl": 72170, - "Ġwoke": 38726, - "Ġwol": 79614, - "Ġwolf": 36542, - "Ġwoll": 73184, - "Ġwollen": 56945, - "Ġwollte": 96434, - "Ġwolves": 55171, - "Ġwom": 2358, - "Ġwoman": 5220, - "Ġwomb": 72837, - "Ġwomen": 3198, - "Ġwomens": 87361, - "Ġwon": 2765, - "Ġwonder": 5775, - "Ġwondered": 30056, - "Ġwonderful": 11117, - "Ġwonderfully": 59985, - "Ġwondering": 20293, - "Ġwonders": 39064, - "Ġwont": 39364, - "Ġwoo": 68632, - "Ġwood": 7579, - "Ġwooded": 93371, - "Ġwooden": 22360, - "Ġwoodland": 97631, - "Ġwoods": 32533, - "Ġwoodworking": 95953, - "Ġwool": 38540, - "Ġwor": 4099, - "Ġword": 3409, - "Ġworden": 30179, - "Ġwording": 60227, - "Ġwordpress": 75113, - "Ġwords": 4244, - "Ġwordt": 40260, - "Ġwore": 27570, - "Ġwork": 975, - "Ġworkaround": 59030, - "Ġworkbook": 45155, - "Ġworked": 6439, - "Ġworker": 11864, - "Ġworkers": 7337, - "Ġworkflow": 28288, - "Ġworkflows": 87468, - "Ġworkforce": 30927, - "Ġworking": 3238, - "Ġworkings": 78136, - "Ġworkload": 53596, - "Ġworkout": 25242, - "Ġworkouts": 45844, - "Ġworkplace": 26368, - "Ġworkplaces": 92062, - "Ġworks": 4278, - "Ġworksheet": 36636, - "Ġworksheets": 67525, - "Ġworkshop": 25073, - "Ġworkshops": 34836, - "Ġworkspace": 27514, - "Ġworkstation": 95891, - "Ġworld": 1879, - "Ġworldly": 96606, - "Ġworlds": 23859, - "Ġworldview": 77062, - "Ġworldwide": 15245, - "Ġworm": 34211, - "Ġworms": 61900, - "Ġworn": 23704, - "Ġworried": 17811, - "Ġworries": 37045, - "Ġworry": 10955, - "Ġworrying": 39776, - "Ġwors": 46193, - "Ġworse": 10960, - "Ġworsening": 92305, - "Ġworsh": 81978, - "Ġworship": 23916, - "Ġworst": 11785, - "Ġworth": 5802, - "Ġworthless": 65021, - "Ġworthwhile": 47676, - "Ġworthy": 27290, - "Ġwould": 1035, - "Ġwouldn": 8270, - "Ġwound": 26555, - "Ġwounded": 27493, - "Ġwounds": 33154, - "Ġwoven": 55774, - "Ġwow": 35665, - "Ġwp": 12609, - "ĠwpÅĤyw": 132631, - "Ġwr": 3112, - "Ġwrap": 15061, - "Ġwrapped": 19472, - "Ġwrapper": 13261, - "Ġwrappers": 78094, - "Ġwrapping": 41195, - "Ġwraps": 39709, - "Ġwrath": 63291, - "Ġwre": 66508, - "Ġwreak": 82575, - "Ġwreck": 35750, - "Ġwreckage": 87095, - "Ġwrench": 59488, - "Ġwrest": 23055, - "Ġwrestler": 82062, - "Ġwrestlers": 97830, - "Ġwrestling": 35440, - "Ġwrink": 57270, - "Ġwrinkles": 73107, - "Ġwrist": 32171, - "Ġwrists": 85778, - "Ġwrit": 2107, - "Ġwritable": 45905, - "Ġwrite": 3270, - "ĠwriteFile": 92820, - "ĠwriteTo": 83122, - "Ġwriteln": 80947, - "Ġwriter": 6916, - "Ġwriters": 16093, - "Ġwrites": 13914, - "Ġwriting": 4378, - "Ġwritings": 42322, - "Ġwritten": 5326, - "Ġwrong": 4969, - "Ġwrongdoing": 64228, - "Ġwrongful": 92632, - "Ġwrongly": 71209, - "Ġwrote": 6139, - "Ġwrought": 78603, - "ĠwrzeÅĽ": 137718, - "ĠwrzeÅĽnia": 137719, - "Ġws": 17624, - "Ġwsp": 62507, - "Ġwspóln": 133374, - "ĠwspóÅĤ": 127549, - "ĠwspóÅĤpr": 133908, - "ĠwspóÅĤprac": 133909, - "Ġwsz": 38391, - "Ġwszyst": 44827, - "Ġwt": 40473, - "Ġwur": 20600, - "Ġwurde": 26109, - "Ġwurden": 47650, - "Ġww": 65732, - "Ġwww": 8438, - "Ġwx": 9076, - "ĠwxDefault": 83586, - "ĠwxString": 56616, - "ĠwxT": 74197, - "Ġwy": 16590, - "Ġwyb": 143557, - "Ġwybra": 141362, - "ĠwybraÄĩ": 141363, - "Ġwybór": 143558, - "Ġwygl": 133563, - "ĠwyglÄħda": 133564, - "Ġwyja": 142442, - "ĠwyjaÅĽni": 142443, - "ĠwyjÄħ": 135759, - "ĠwyjÄħtk": 135760, - "Ġwykon": 98161, - "Ġwym": 71241, - "Ġwyn": 60934, - "Ġwypos": 136043, - "Ġwyposaż": 136044, - "Ġwys": 54547, - "Ġwysoko": 140256, - "ĠwysokoÅĽci": 140257, - "Ġwyst": 87564, - "ĠwystÄĻp": 135052, - "ĠwyÅĤÄħ": 141464, - "ĠwyÅĤÄħcznie": 141465, - "ĠwyÅĽ": 143084, - "ĠwyÅĽw": 143085, - "ĠwyÅĽwiet": 143086, - "ĠwyÅĽwietl": 143087, - "Ġwz": 62920, - "Ġwzgl": 127904, - "ĠwzglÄĻ": 137102, - "ĠwzglÄĻd": 140140, - "ĠwzglÄĻdu": 137103, - "Ġwäh": 52367, - "Ġwährend": 66983, - "Ġwäre": 68573, - "Ġwür": 43243, - "Ġwürde": 58881, - "ĠwÅĤ": 79224, - "ĠwÅĤa": 81906, - "ĠwÅĤad": 139693, - "ĠwÅĤadz": 139694, - "ĠwÅĤas": 136443, - "ĠwÅĤasne": 136444, - "ĠwÅĤaÅĽ": 140617, - "ĠwÅĤaÅĽc": 140618, - "ĠwÅĤaÅĽciciel": 140619, - "ĠwÅĤaÅĽnie": 131489, - "ĠwÅĤos": 141866, - "ĠwÅĤosów": 141867, - "ĠwÅĽ": 136781, - "ĠwÅĽród": 136782, - "Ġx": 856, - "ĠxAxis": 61185, - "ĠxOffset": 90638, - "ĠxPos": 75041, - "Ġxa": 71800, - "Ġxamarin": 95479, - "Ġxb": 55932, - "Ġxbmc": 82265, - "Ġxbox": 81472, - "Ġxc": 56901, - "Ġxcb": 95569, - "Ġxd": 79052, - "Ġxe": 82790, - "Ġxen": 52165, - "Ġxf": 59364, - "Ġxhr": 28282, - "Ġxhttp": 96197, - "Ġxi": 37590, - "Ġxl": 33008, - "Ġxlabel": 54778, - "Ġxlim": 93669, - "Ġxlink": 96239, - "Ġxls": 96578, - "Ġxm": 55249, - "Ġxmax": 52286, - "Ġxmin": 56459, - "Ġxml": 8396, - "ĠxmlDoc": 91467, - "Ġxmlhttp": 69300, - "Ġxmlns": 24967, - "Ġxmm": 57607, - "Ġxn": 54895, - "Ġxnxx": 94051, - "Ġxo": 97021, - "Ġxor": 53941, - "Ġxp": 37245, - "Ġxpath": 64525, - "Ġxpos": 74395, - "Ġxr": 38670, - "Ġxrange": 33073, - "Ġxs": 11943, - "Ġxsi": 37757, - "Ġxt": 62390, - "Ġxtype": 60614, - "Ġxu": 92654, - "Ġxuyên": 132278, - "Ġxuân": 142893, - "Ġxuất": 128415, - "Ġxuá»ijng": 129630, - "Ġxv": 83411, - "Ġxx": 20908, - "Ġxxx": 12319, - "Ġxxxx": 83976, - "Ġxy": 30784, - "Ġxyz": 40511, - "Ġxác": 129207, - "Ġxây": 128943, - "Ġxã": 128847, - "Ġxét": 130985, - "Ġxúc": 132242, - "Ġxưa": 139518, - "Ġxương": 138036, - "Ġxảy": 131871, - "Ġxấu": 135429, - "Ġxếp": 134143, - "Ġxứ": 134640, - "Ġxá»Ń": 129888, - "Ġy": 379, - "ĠyAxis": 62578, - "ĠyOffset": 81938, - "ĠyPos": 64679, - "Ġya": 13526, - "Ġyab": 139321, - "Ġyabanc": 139322, - "Ġyabancı": 139323, - "Ġyacc": 47364, - "Ġyacht": 71932, - "Ġyahoo": 64528, - "Ġyak": 73678, - "ĠyaklaÅŁ": 127814, - "ĠyaklaÅŁÄ±k": 136073, - "Ġyakın": 130009, - "Ġyal": 137824, - "Ġyalnız": 137825, - "Ġyaml": 32246, - "Ġyan": 82792, - "Ġyang": 10371, - "Ġyanlı": 137667, - "ĠyanlÄ±ÅŁ": 137668, - "Ġyans": 140230, - "Ġyansı": 140231, - "Ġyanı": 130057, - "Ġyanında": 134800, - "Ġyap": 39428, - "Ġyapt": 125801, - "Ġyaptı": 130583, - "Ġyaptır": 137466, - "Ġyaptıģı": 130333, - "Ġyapı": 84700, - "Ġyapıl": 125620, - "Ġyapılacak": 136966, - "Ġyapılan": 129573, - "Ġyapılması": 138541, - "Ġyapılır": 140646, - "Ġyapıyor": 135919, - "Ġyard": 19515, - "Ġyards": 13692, - "Ġyardı": 133344, - "Ġyardım": 132874, - "Ġyardımc": 133345, - "Ġyardımcı": 133346, - "Ġyarg": 141473, - "Ġyargı": 141474, - "Ġyarn": 38247, - "Ġyarı": 130397, - "Ġyat": 131454, - "Ġyatırım": 131455, - "ĠyavaÅŁ": 142050, - "Ġyaw": 45672, - "Ġyay": 97559, - "Ġyayg": 143839, - "Ġyaygın": 143840, - "Ġyayı": 143640, - "Ġyayıml": 143641, - "Ġyayımla": 143642, - "Ġyayın": 127525, - "Ġyayınlan": 140436, - "Ġyaz": 78114, - "Ġyazı": 129654, - "Ġyazılı": 135050, - "ĠyaÄŁ": 132724, - "ĠyaÅŁ": 83568, - "ĠyaÅŁad": 141664, - "ĠyaÅŁadıģı": 141665, - "ĠyaÅŁam": 131750, - "ĠyaÅŁama": 137788, - "ĠyaÅŁan": 131697, - "ĠyaÅŁayan": 139862, - "ĠyaÅŁÄ±nda": 135521, - "Ġyc": 81858, - "Ġydk": 62328, - "Ġye": 19478, - "Ġyeah": 21639, - "Ġyear": 1042, - "Ġyearly": 44270, - "Ġyears": 1635, - "Ġyeast": 40480, - "Ġyell": 64313, - "Ġyelled": 55077, - "Ġyelling": 52202, - "Ġyellow": 13753, - "Ġyen": 57340, - "Ġyeni": 98713, - "Ġyer": 54195, - "ĠyerleÅŁ": 141421, - "Ġyes": 9834, - "Ġyesterday": 13671, - "Ġyet": 3602, - "Ġyeti": 143417, - "ĠyetiÅŁtir": 143418, - "Ġyg": 92786, - "Ġyi": 61697, - "Ġyield": 7540, - "Ġyielded": 57387, - "Ġyielding": 77404, - "Ġyields": 35408, - "Ġyii": 20788, - "Ġylabel": 49812, - "Ġylim": 83914, - "Ġymax": 56078, - "Ġymin": 59115, - "Ġyn": 80761, - "Ġyo": 29496, - "Ġyog": 41353, - "Ġyoga": 26011, - "Ġyogurt": 54475, - "Ġyok": 89677, - "Ġyol": 93482, - "Ġyork": 49572, - "Ġyou": 498, - "Ġyoung": 3908, - "Ġyounger": 14650, - "Ġyoungest": 38537, - "Ġyoungster": 82271, - "Ġyoungsters": 59995, - "Ġyour": 697, - "Ġyoure": 70075, - "Ġyours": 18316, - "Ġyourself": 6133, - "Ġyourselves": 57896, - "Ġyouth": 12537, - "Ġyouthful": 64555, - "Ġyouths": 63962, - "Ġyoutube": 27178, - "ĠyoÄŁun": 135373, - "Ġyp": 75975, - "Ġypos": 70593, - "Ġyr": 42338, - "Ġyrs": 54023, - "Ġys": 31810, - "Ġyt": 68753, - "Ġyuan": 72283, - "Ġyuk": 142725, - "Ġyukarı": 142726, - "Ġyum": 68870, - "Ġyummy": 75354, - "Ġyup": 75446, - "Ġyy": 13197, - "Ġyyn": 85607, - "Ġyytype": 86396, - "Ġyyyy": 57989, - "Ġyên": 134226, - "Ġyêu": 128498, - "Ġyö": 97413, - "Ġyön": 130490, - "Ġyönel": 134158, - "Ġyönelik": 134159, - "Ġyönet": 125981, - "Ġyönetici": 141399, - "Ġyönetim": 132452, - "Ġyönt": 133028, - "Ġyöntem": 133029, - "Ġyü": 134135, - "Ġyük": 126736, - "Ġyüks": 134136, - "Ġyüksek": 129876, - "Ġyüksel": 134137, - "Ġyür": 137042, - "Ġyürüt": 137043, - "Ġyüz": 125723, - "Ġyüzde": 131008, - "Ġyüzden": 137599, - "Ġyı": 128034, - "Ġyık": 136998, - "Ġyıl": 128503, - "Ġyıll": 128035, - "Ġyıllarda": 142054, - "Ġyıllık": 139038, - "Ġyılı": 126851, - "Ġyılında": 130300, - "Ġyếu": 129553, - "Ġz": 1147, - "ĠzIndex": 59717, - "Ġza": 14694, - "Ġzab": 73071, - "Ġzach": 96812, - "Ġzad": 70648, - "Ġzag": 89019, - "Ġzahl": 88628, - "Ġzaj": 81347, - "Ġzak": 50315, - "ĠzakÅĤad": 135230, - "Ġzal": 65558, - "Ġzale": 142463, - "Ġzależy": 142464, - "Ġzam": 60476, - "Ġzaman": 83140, - "Ġzamów": 142343, - "Ġzamówienia": 142344, - "Ġzap": 32978, - "Ġzar": 58824, - "Ġzarówn": 134237, - "Ġzarówno": 134238, - "Ġzaw": 64007, - "Ġzb": 74355, - "Ġzd": 36249, - "Ġzdarma": 96052, - "ĠzdjÄĻ": 83737, - "ĠzdjÄĻcia": 136813, - "ĠzdjÄĻÄĩ": 143297, - "Ġze": 13703, - "Ġzeal": 68679, - "Ġzeigen": 85239, - "Ġzeigt": 77509, - "Ġzeit": 77158, - "Ġzelf": 59011, - "Ġzen": 53462, - "Ġzend": 78568, - "Ġzenith": 98429, - "Ġzer": 76178, - "Ġzero": 7168, - "Ġzeroes": 97443, - "Ġzeros": 17516, - "Ġzes": 137584, - "Ġzespo": 137585, - "ĠzespoÅĤ": 137586, - "Ġzest": 80531, - "ĠzewnÄĻtrzn": 141881, - "Ġzf": 99048, - "Ġzg": 92058, - "Ġzh": 59748, - "Ġzi": 63473, - "Ġzich": 52419, - "Ġzie": 74247, - "Ġzien": 79407, - "Ġzig": 85812, - "Ġzij": 91914, - "Ġzijn": 18488, - "Ġzinc": 48501, - "Ġzip": 10308, - "Ġzipcode": 80349, - "Ġzipfile": 86952, - "Ġzipper": 68761, - "Ġzk": 94528, - "Ġzlib": 81218, - "Ġzm": 47129, - "Ġzmq": 90740, - "Ġzn": 29874, - "Ġznaj": 67715, - "Ġznajdu": 139698, - "ĠznajdujÄħ": 139699, - "Ġznal": 141024, - "Ġznalaz": 141025, - "ĠznalazÅĤ": 141026, - "Ġznale": 137836, - "Ġznaleź": 137837, - "ĠznaleźÄĩ": 137838, - "Ġzo": 18741, - "Ġzoals": 83441, - "Ġzob": 128165, - "Ġzobac": 141611, - "ĠzobaczyÄĩ": 141612, - "Ġzobow": 142818, - "ĠzobowiÄħ": 142819, - "ĠzobowiÄħz": 142820, - "Ġzoek": 73800, - "Ġzoekt": 43702, - "Ġzombie": 37736, - "Ġzombies": 47073, - "Ġzona": 44012, - "Ġzonder": 74160, - "Ġzone": 10143, - "Ġzones": 25395, - "Ġzoning": 64978, - "Ġzoo": 40914, - "Ġzoom": 15562, - "Ġzost": 95926, - "Ġzosta": 61875, - "ĠzostaÄĩ": 142671, - "ĠzostaÅĤ": 130473, - "ĠzostaÅĤa": 134882, - "ĠzostaÅĤy": 137218, - "Ġzou": 72121, - "Ġzro": 135396, - "Ġzrobi": 135397, - "ĠzrobiÄĩ": 135398, - "Ġzs": 68512, - "Ġzu": 6395, - "Ġzug": 84911, - "Ġzum": 16034, - "Ġzun": 98175, - "Ġzunächst": 142596, - "ĠzupeÅĤ": 141998, - "ĠzupeÅĤnie": 141999, - "Ġzur": 17312, - "Ġzurück": 49503, - "Ġzus": 38158, - "Ġzusammen": 53383, - "Ġzusätzlich": 136249, - "Ġzw": 24396, - "Ġzwar": 82664, - "Ġzwarte": 92086, - "Ġzwe": 54936, - "Ġzwei": 40462, - "Ġzwischen": 47226, - "ĠzwiÄħz": 127970, - "ĠzwiÄħzane": 139067, - "ĠzwiÄħzku": 138136, - "Ġzwy": 143597, - "Ġzwyk": 143598, - "ĠzwykÅĤ": 143599, - "ĠzwÅĤ": 142384, - "ĠzwÅĤas": 142385, - "ĠzwÅĤaszc": 142386, - "ĠzwÅĤaszcza": 142387, - "Ġzx": 71322, - "Ġzz": 32633, - "Ġzza": 97649, - "ĠzÅĤ": 58068, - "Ġ{": 314, - "Ġ{!": 30344, - "Ġ{!!": 21353, - "Ġ{\"": 5212, - "Ġ{$": 13924, - "Ġ{%": 52261, - "Ġ{'": 5360, - "Ġ{(": 32798, - "Ġ{*": 29808, - "Ġ{*}": 47437, - "Ġ{-": 29669, - "Ġ{.": 50336, - "Ġ{...": 14916, - "Ġ{/*": 17234, - "Ġ{//": 17154, - "Ġ{:": 22069, - "Ġ{:.": 47518, - "Ġ{:?}\",": 71964, - "Ġ{?": 49376, - "Ġ{?>Ċ": 67615, - "Ġ{?}": 94469, - "Ġ{@": 6418, - "Ġ{[": 45591, - "Ġ{\\": 28152, - "Ġ{\\Ċ": 95519, - "Ġ{_": 48617, - "Ġ{{": 5867, - "Ġ{{$": 30108, - "Ġ{{--": 23896, - "Ġ{{--<": 57931, - "Ġ{{{": 47908, - "Ġ{{Ċ": 80505, - "Ġ{|": 40960, - "Ġ{}": 4687, - "Ġ{}\",": 24689, - "Ġ{}\".": 20863, - "Ġ{}'.": 25241, - "Ġ{})": 37713, - "Ġ{}));Ċ": 99007, - "Ġ{}),Ċ": 77872, - "Ġ{}).": 72727, - "Ġ{});Ċ": 35311, - "Ġ{});ĊĊ": 87894, - "Ġ{})Ċ": 35248, - "Ġ{},": 16452, - "Ġ{},Ċ": 14573, - "Ġ{}.": 84412, - "Ġ{}:": 90912, - "Ġ{};": 52166, - "Ġ{};Ċ": 9321, - "Ġ{};ĊĊ": 20375, - "Ġ{};čĊ": 55122, - "Ġ{}\\": 56057, - "Ġ{}Ċ": 5613, - "Ġ{}ĊĊ": 10086, - "Ġ{}ĊĊĊ": 91935, - "Ġ{}čĊ": 34141, - "Ġ{}čĊčĊ": 70846, - "Ġ{Ċ": 341, - "Ġ{ĊĊ": 1476, - "Ġ{ĊĊĊ": 18507, - "Ġ{ĊĊĊĊ": 70180, - "Ġ{čĊ": 972, - "Ġ{čĊčĊ": 8022, - "Ġ{čĊčĊčĊ": 94679, - "Ġ{ččĊ": 50474, - "Ġ|": 760, - "Ġ|-": 44561, - "Ġ|--": 30588, - "Ġ|--------------------------------------------------------------------------Ċ": 61250, - "Ġ|/": 97845, - "Ġ|=": 8662, - "Ġ|>": 58721, - "Ġ|\\": 63596, - "Ġ|_": 70886, - "Ġ|_|": 66091, - "Ġ||": 1369, - "Ġ||=": 35002, - "Ġ||Ċ": 8244, - "Ġ||čĊ": 45748, - "Ġ|Ċ": 9248, - "Ġ|ĊĊ": 35721, - "Ġ|čĊ": 49777, - "Ġ}": 335, - "Ġ}(": 95916, - "Ġ}()Ċ": 50746, - "Ġ})": 6413, - "Ġ})(": 48885, - "Ġ})();Ċ": 92228, - "Ġ}))": 87771, - "Ġ})),Ċ": 78384, - "Ġ})).": 70457, - "Ġ}));Ċ": 17830, - "Ġ}));ĊĊ": 27126, - "Ġ}))Ċ": 28712, - "Ġ}),": 31706, - "Ġ}),Ċ": 11973, - "Ġ}),ĊĊ": 50940, - "Ġ}).": 8533, - "Ġ}):": 86709, - "Ġ});": 18113, - "Ġ});Ċ": 1625, - "Ġ});ĊĊ": 3011, - "Ġ});ĊĊĊ": 27311, - "Ġ});ĊĊĊĊ": 81767, - "Ġ});čĊ": 12397, - "Ġ});čĊčĊ": 28375, - "Ġ})}Ċ": 29324, - "Ġ})Ċ": 2751, - "Ġ})ĊĊ": 9568, - "Ġ})ĊĊĊ": 61277, - "Ġ})čĊ": 25821, - "Ġ})čĊčĊ": 91276, - "Ġ}*/Ċ": 42833, - "Ġ}*/ĊĊ": 62021, - "Ġ},": 2470, - "Ġ},{": 89072, - "Ġ},{Ċ": 51387, - "Ġ},Ċ": 1153, - "Ġ},ĊĊ": 7331, - "Ġ},ĊĊĊ": 73952, - "Ġ},čĊ": 9879, - "Ġ},čĊčĊ": 54622, - "Ġ}.": 16908, - "Ġ}//": 17629, - "Ġ}:": 35374, - "Ġ};": 20066, - "Ġ};Ċ": 2605, - "Ġ};ĊĊ": 3634, - "Ġ};ĊĊĊ": 38497, - "Ġ};čĊ": 16511, - "Ġ};čĊčĊ": 26828, - "Ġ}": 83287, - "Ġ}>Ċ": 63156, - "Ġ}?>Ċ": 55556, - "Ġ}\\": 51300, - "Ġ}]": 58592, - "Ġ}]);Ċ": 88853, - "Ġ}])Ċ": 94239, - "Ġ}],Ċ": 29043, - "Ġ}];Ċ": 19376, - "Ġ}];ĊĊ": 85604, - "Ġ}]Ċ": 28394, - "Ġ}}": 3869, - "Ġ}}\"": 14483, - "Ġ}}\">": 41800, - "Ġ}}\"><": 75015, - "Ġ}}\">{{": 68177, - "Ġ}}\">Ċ": 22084, - "Ġ}}\"Ċ": 60559, - "Ġ}},Ċ": 64395, - "Ġ}}/": 92502, - "Ġ}};Ċ": 87037, - "Ġ}}": 45521, - "Ġ}}>{": 87715, - "Ġ}}>Ċ": 17844, - "Ġ}}}": 97901, - "Ġ}}Ċ": 8096, - "Ġ}}ĊĊ": 67436, - "Ġ}}čĊ": 82672, - "Ġ}Ċ": 456, - "Ġ}ĊĊ": 555, - "Ġ}ĊĊĊ": 4455, - "Ġ}ĊĊĊĊ": 16968, - "Ġ}ĊĊĊĊĊ": 43153, - "Ġ}ĊĊĊĊĊĊ": 79739, - "Ġ}čĊ": 1686, - "Ġ}čĊčĊ": 2553, - "Ġ}čĊčĊčĊ": 24097, - "Ġ}čĊčĊčĊčĊ": 75947, - "Ġ}ččĊ": 86729, - "Ġ~": 3968, - "Ġ~(": 34546, - "Ġ~/": 41495, - "Ġ~/.": 39958, - "Ġ~=": 21684, - "Ġ~>": 84632, - "Ġ~~": 77777, - "ĠÂ": 2139, - "Ġ¡": 48813, - "Ġ£": 6938, - "ĠÂ¥": 71488, - "Ġ§": 16625, - "Ġ§§": 64331, - "Ġ©": 7240, - "Ġ«": 12486, - "Ġ¬": 96165, - "Ġ®": 60479, - "Ġ°": 36286, - "Ġ±": 20287, - "Ġµ": 62912, - "Ġ¶": 78846, - "Ġ·": 9592, - "Ġ»": 8182, - "Ġ»,": 64701, - "Ġ».": 87891, - "Ġ»ĊĊ": 18292, - "Ġ¿": 28286, - "ĠÂł": 17091, - "ĠÂłĠÂł": 32045, - "ĠÂłĠÂłĠÂłĠÂł": 75620, - "ĠÂŃ": 49855, - "ĠÃ": 1683, - "Ġá": 18698, - "Ġágua": 132461, - "Ġál": 142865, - "Ġálbum": 142866, - "Ġáll": 94785, - "Ġámb": 143477, - "Ġámbito": 143478, - "Ġán": 128595, - "Ġáo": 129970, - "Ġáp": 129470, - "Ġárea": 54171, - "Ġáreas": 94062, - "Ġâ": 27905, - "Ġâm": 129610, - "Ġä": 12709, - "Ġähn": 141152, - "Ġähnlich": 141153, - "Ġäl": 88768, - "Ġän": 97985, - "Ġär": 18593, - "Ġäven": 93603, - "ĠÃ¥": 13076, - "ĠÃ¥r": 33980, - "ĠÃ¥rhus": 69124, - "Ġæ": 65013, - "Ġç": 18086, - "Ġça": 37943, - "ĠçalÄ±ÅŁ": 77487, - "ĠçalÄ±ÅŁan": 132384, - "ĠçalÄ±ÅŁm": 127721, - "ĠçalÄ±ÅŁma": 129711, - "ĠçalÄ±ÅŁmalar": 127722, - "ĠçalÄ±ÅŁmaları": 135122, - "ĠçalÄ±ÅŁtı": 139010, - "ĠçalÄ±ÅŁÄ±yor": 140363, - "Ġçarp": 140935, - "ĠçaÄŁ": 142850, - "ĠçaÄŁrı": 142851, - "Ġçe": 134147, - "Ġçek": 126428, - "Ġçekil": 140033, - "Ġçer": 141513, - "Ġçerç": 141514, - "Ġçerçeve": 141515, - "Ġçev": 127486, - "Ġçevir": 140383, - "Ġçevre": 133515, - "ĠçeÅŁ": 134148, - "ĠçeÅŁit": 134149, - "ĠçeÅŁitli": 134150, - "Ġçift": 136747, - "Ġçiz": 134810, - "Ġço": 135135, - "Ġçoc": 125321, - "Ġçocuk": 125939, - "Ġçocuklar": 136049, - "Ġçocukların": 143034, - "ĠçocuÄŁu": 138711, - "Ġçok": 57012, - "ĠçoÄŁu": 135136, - "Ġçöz": 127489, - "Ġçözüm": 133541, - "Ġçünkü": 137698, - "Ġçı": 125614, - "Ġçık": 125652, - "Ġçıkan": 134669, - "Ġçıkar": 129155, - "Ġçıkma": 137372, - "Ġçıkt": 134693, - "Ġçıktı": 134694, - "ĠçıkÄ±ÅŁ": 143310, - "Ġè": 11422, - "Ġé": 3958, - "Ġéc": 90229, - "Ġéconom": 81553, - "Ġéconomique": 135779, - "Ġécrit": 88432, - "Ġégalement": 43667, - "Ġél": 31913, - "Ġélect": 97051, - "Ġélectrique": 139390, - "Ġélev": 141449, - "Ġélevé": 141450, - "Ġélè": 142918, - "Ġélèves": 142919, - "Ġéléments": 141067, - "Ġép": 49410, - "Ġépoca": 133285, - "Ġéquip": 93516, - "Ġéquipé": 143886, - "Ġés": 21533, - "Ġét": 13916, - "Ġétaient": 96858, - "Ġétait": 42889, - "Ġétant": 138157, - "Ġétape": 141333, - "Ġété": 23639, - "Ġév": 50813, - "Ġéxito": 80886, - "Ġéén": 130269, - "Ġê": 19610, - "Ġêtes": 61199, - "Ġêtre": 22911, - "Ġî": 14364, - "Ġîn": 18531, - "Ġînt": 65574, - "Ġó": 40867, - "Ġórg": 143013, - "Ġórgão": 143014, - "Ġô": 128435, - "Ġông": 128436, - "Ġö": 16942, - "Ġöd": 127554, - "Ġöde": 135659, - "Ġödeme": 133941, - "Ġödül": 140579, - "Ġöff": 63318, - "Ġöl": 127909, - "Ġöld": 138925, - "Ġöldür": 138926, - "Ġölç": 137202, - "Ġölçü": 137203, - "Ġölüm": 137792, - "Ġön": 78605, - "Ġönce": 128489, - "Ġönem": 126392, - "Ġönemli": 128848, - "Ġöner": 136818, - "Ġöneri": 136819, - "Ġönlem": 140962, - "Ġönü": 143017, - "Ġönünde": 139455, - "Ġönüne": 143018, - "Ġör": 136235, - "Ġörg": 136493, - "Ġörgüt": 136494, - "Ġörnek": 136236, - "Ġöver": 76050, - "Ġöz": 125952, - "Ġözel": 129485, - "Ġözelli": 139782, - "Ġözellik": 127250, - "Ġözellikle": 132139, - "Ġözellikleri": 138118, - "ĠözelliÄŁi": 139783, - "Ġözgü": 135705, - "ĠÃ¶ÄŁ": 125281, - "ĠÃ¶ÄŁren": 130947, - "ĠÃ¶ÄŁrenc": 127589, - "ĠÃ¶ÄŁrenci": 135992, - "ĠÃ¶ÄŁrenciler": 134176, - "ĠÃ¶ÄŁret": 137092, - "ĠÃ¶ÄŁretmen": 137093, - "Ġø": 38118, - "Ġøns": 87292, - "Ġú": 17964, - "Ġúlt": 31429, - "Ġúltima": 71028, - "Ġúltimo": 61478, - "Ġúltimos": 78421, - "Ġún": 51163, - "Ġúnica": 88172, - "Ġúnico": 74301, - "Ġútil": 137741, - "Ġü": 10489, - "Ġüber": 13785, - "Ġüberh": 139905, - "Ġüberhaupt": 139906, - "Ġücret": 134799, - "Ġücrets": 137568, - "Ġücretsiz": 137569, - "Ġülk": 127868, - "Ġülke": 129871, - "Ġülkeler": 136675, - "Ġülkem": 139210, - "Ġülkemiz": 139211, - "Ġünivers": 137761, - "Ġüniversite": 137762, - "Ġünl": 142137, - "Ġünlü": 142138, - "Ġüret": 127016, - "Ġüretim": 133352, - "Ġürün": 125970, - "Ġürünler": 132309, - "Ġürünü": 142545, - "Ġüst": 127242, - "Ġüstün": 136195, - "Ġüy": 141747, - "Ġüye": 131153, - "Ġüyeler": 141748, - "Ġüyeleri": 141749, - "Ġüz": 130429, - "Ġüzer": 91557, - "Ġüzere": 130430, - "Ġüzerinde": 129947, - "Ġüzerinden": 132643, - "Ġüzerine": 130563, - "Ġüç": 132773, - "Ġý": 128431, - "Ġþ": 79607, - "ĠÃĢ": 64281, - "ĠÃģ": 42812, - "ĠÃģrea": 143733, - "ĠÃĤ": 45333, - "ĠÃĤu": 135285, - "ĠÃĥ": 73780, - "ĠÃĦ": 48686, - "ĠÃħ": 79252, - "ĠÃĩ": 63005, - "ĠÃĩa": 131098, - "ĠÃĩalÄ±ÅŁ": 137874, - "ĠÃĩok": 133987, - "ĠÃĩünkü": 133829, - "ĠÃĪ": 131390, - "ĠÃī": 28024, - "ĠÃİ": 59108, - "ĠÃĶ": 130797, - "ĠÃĶng": 130798, - "ĠÃĸ": 34037, - "ĠÃĸl": 136990, - "ĠÃĸn": 133470, - "ĠÃĸnce": 143567, - "ĠÃĸnceki": 143568, - "ĠÃĸsterreich": 140108, - "ĠÃĸz": 130307, - "ĠÃĸzel": 137215, - "ĠÃĸzellik": 136636, - "ĠÃĸzellikle": 136637, - "ĠÃĹ": 24768, - "ĠÃĺ": 88943, - "ĠÃľ": 30512, - "ĠÃľber": 49371, - "ĠÃľlke": 140320, - "ĠÃľnivers": 133696, - "ĠÃľniversites": 133697, - "ĠÃľniversitesi": 133698, - "ĠÃľrün": 140046, - "ĠÃľye": 137160, - "ĠÃł": 3784, - "ĠÃłs": 52529, - "ĠÃŃ": 40136, - "ĠÃŃch": 130123, - "ĠÃŃnd": 143282, - "ĠÃŃndice": 143283, - "ĠÃŃt": 129530, - "ĠÄ": 9843, - "Ġİ": 38421, - "Ġİki": 134361, - "Ġİl": 126803, - "Ġİlk": 133447, - "Ġİlçe": 140194, - "Ġİn": 131693, - "Ġİns": 135129, - "Ġİnsan": 135130, - "Ġİnt": 142600, - "Ġİnternet": 142601, - "Ġİs": 130173, - "Ġİsl": 137655, - "Ġİslam": 137656, - "Ġİstanbul": 129514, - "Ġİyi": 136681, - "Ġİz": 136284, - "Ġİzmir": 136285, - "Ġİç": 127607, - "Ġİçin": 137822, - "ĠÄ°ÅŁ": 126664, - "ĠÄ°ÅŁte": 137361, - "Ġısı": 139515, - "ĠÄĥn": 128442, - "ĠÄĩe": 81431, - "ĠÄį": 32802, - "ĠÄIJ": 50327, - "ĠÄIJi": 125807, - "ĠÄIJiá»ģu": 130406, - "ĠÄIJiá»ĥm": 141915, - "ĠÄIJiá»ĩn": 135601, - "ĠÄIJo": 138119, - "ĠÄIJoÃłn": 138120, - "ĠÄIJây": 130244, - "ĠÄIJình": 136929, - "ĠÄIJó": 134845, - "ĠÄIJông": 130215, - "ĠÄIJÃł": 129329, - "ĠÄIJÄĥng": 132719, - "ĠÄIJược": 135632, - "ĠÄIJưá»Ŀng": 136002, - "ĠÄIJại": 129393, - "ĠÄIJảng": 134355, - "ĠÄIJầu": 137720, - "ĠÄIJặc": 135359, - "ĠÄIJến": 136146, - "ĠÄIJức": 129938, - "ĠÄIJá»ģ": 142303, - "ĠÄIJá»ĥ": 130526, - "ĠÄIJá»ĭa": 134467, - "ĠÄIJá»ĭnh": 140401, - "ĠÄIJá»iji": 134914, - "ĠÄIJá»ĵng": 130717, - "ĠÄIJá»Ļ": 131283, - "ĠÄij": 14854, - "ĠÄija": 128907, - "ĠÄijang": 128348, - "ĠÄijau": 129952, - "ĠÄijem": 131881, - "ĠÄijen": 133549, - "ĠÄiji": 73586, - "ĠÄijiá»ģu": 128334, - "ĠÄijiá»ĥm": 128406, - "ĠÄijiá»ĥn": 138713, - "ĠÄijiá»ĩn": 128484, - "ĠÄijo": 125190, - "ĠÄijoán": 136149, - "ĠÄijoÃłn": 129675, - "ĠÄijoạn": 130393, - "ĠÄiju": 142920, - "ĠÄijua": 141305, - "ĠÄijuá»ķi": 142921, - "ĠÄijá": 129411, - "ĠÄijám": 136864, - "ĠÄijáng": 129861, - "ĠÄijánh": 128826, - "ĠÄijáo": 136335, - "ĠÄijáp": 130925, - "ĠÄijâu": 129625, - "ĠÄijây": 128358, - "ĠÄijã": 79126, - "ĠÄijè": 134399, - "ĠÄijèn": 134400, - "ĠÄijêm": 131571, - "ĠÄijình": 128890, - "ĠÄijò": 138584, - "ĠÄijòi": 138585, - "ĠÄijó": 128270, - "ĠÄijóng": 130889, - "ĠÄijô": 130287, - "ĠÄijôi": 130351, - "ĠÄijông": 131026, - "ĠÄijúng": 129315, - "ĠÄijÃłn": 129560, - "ĠÄijÃło": 131912, - "ĠÄijÃŃch": 134569, - "ĠÄijÄĥng": 129418, - "ĠÄijÆ¡n": 128666, - "ĠÄijưa": 128930, - "ĠÄijương": 138051, - "ĠÄijược": 63478, - "ĠÄijưá»Ŀng": 128448, - "ĠÄijại": 128479, - "ĠÄijạo": 128854, - "ĠÄijạt": 129664, - "ĠÄijả": 129550, - "ĠÄijảm": 129551, - "ĠÄijảng": 140431, - "ĠÄijảo": 131638, - "ĠÄijất": 128750, - "ĠÄijấu": 129507, - "ĠÄijấy": 135077, - "ĠÄijầu": 128278, - "ĠÄijầy": 129433, - "ĠÄijẩ": 132667, - "ĠÄijẩy": 132668, - "ĠÄijẳng": 136338, - "ĠÄijặc": 128788, - "ĠÄijặt": 128845, - "ĠÄijẹ": 128500, - "ĠÄijẹp": 128501, - "ĠÄijến": 128263, - "ĠÄijáºŃm": 143219, - "ĠÄijáºŃu": 140747, - "ĠÄijỡ": 137205, - "ĠÄijợi": 137183, - "ĠÄijá»§": 129078, - "ĠÄijứ": 137067, - "ĠÄijứa": 137068, - "ĠÄijức": 138063, - "ĠÄijứng": 130719, - "ĠÄijừng": 135094, - "ĠÄijá»±": 143200, - "ĠÄijá»±ng": 143201, - "ĠÄijá»ģ": 128456, - "ĠÄijá»ģu": 128582, - "ĠÄijá»ĥ": 79668, - "ĠÄijá»ĩ": 139112, - "ĠÄijá»īnh": 140868, - "ĠÄijá»ĭa": 128704, - "ĠÄijá»ĭch": 140787, - "ĠÄijá»ĭnh": 128333, - "ĠÄijá»įc": 130606, - "ĠÄijá»ı": 131928, - "ĠÄijá»ijc": 133796, - "ĠÄijá»iji": 128421, - "ĠÄijá»ĵ": 128913, - "ĠÄijá»ĵng": 128329, - "ĠÄijá»ķ": 136008, - "ĠÄijá»ķi": 128726, - "ĠÄijá»Ļ": 128368, - "ĠÄijá»Ļc": 129703, - "ĠÄijá»Ļi": 129188, - "ĠÄijá»Ļng": 128285, - "ĠÄijá»Ŀi": 129169, - "ĠÅ": 25917, - "ĠÅ¡": 36424, - "ĠÅ¡to": 79700, - "ĠÅ»": 138128, - "ĠÅ»y": 138129, - "Ġż": 46053, - "Ġże": 23345, - "Ġżeby": 131119, - "Ġży": 134625, - "Ġżyc": 73492, - "Ġżycia": 131472, - "Ġżycie": 133096, - "Ġżyciu": 139319, - "Ġżyw": 134626, - "Ġž": 30963, - "Ġže": 84774, - "ĠÅģ": 141297, - "ĠÅģa": 141298, - "ĠÅĤ": 74427, - "ĠÅĤad": 143481, - "ĠÅĤadn": 143482, - "ĠÅĤat": 142663, - "ĠÅĤatwo": 142664, - "ĠÅĤaz": 143161, - "ĠÅĤazien": 143162, - "ĠÅĤazienk": 143163, - "ĠÅĵ": 98125, - "ĠÅļ": 92027, - "ĠÅļw": 128193, - "ĠÅļwiat": 142466, - "ĠÅļwiÄĻt": 139340, - "ĠÅĽ": 29186, - "ĠÅĽc": 139587, - "ĠÅĽcian": 139588, - "ĠÅĽl": 141577, - "ĠÅĽlub": 141578, - "ĠÅĽm": 143254, - "ĠÅĽmier": 143255, - "ĠÅĽmierci": 143256, - "ĠÅĽredni": 135416, - "ĠÅĽro": 140339, - "ĠÅĽrod": 137537, - "ĠÅĽrodk": 140340, - "ĠÅĽrodków": 140341, - "ĠÅĽrodow": 137538, - "ĠÅĽrodowisk": 137539, - "ĠÅĽw": 81908, - "ĠÅĽwi": 127852, - "ĠÅĽwiad": 142289, - "ĠÅĽwiadom": 142290, - "ĠÅĽwiat": 130863, - "ĠÅĽwiata": 136431, - "ĠÅĽwie": 127784, - "ĠÅĽwiecie": 135703, - "ĠÅĽwież": 143607, - "ĠÅĽwiÄĻt": 138092, - "ĠÅŀ": 78819, - "ĠÅŀa": 130998, - "ĠÅŀe": 129964, - "ĠÅŀi": 132484, - "ĠÅŀimdi": 137748, - "ĠÅŀu": 133805, - "ĠÅŀub": 136040, - "ĠÅŀubat": 136041, - "ĠÅŁ": 22066, - "ĠÅŁa": 130338, - "ĠÅŁark": 139887, - "ĠÅŁarkı": 139888, - "ĠÅŁart": 133968, - "ĠÅŁeh": 133124, - "ĠÅŁek": 93295, - "ĠÅŁeker": 143041, - "ĠÅŁekil": 142693, - "ĠÅŁekilde": 128813, - "ĠÅŁeklin": 136031, - "ĠÅŁeklinde": 136032, - "ĠÅŁey": 126417, - "ĠÅŁeyler": 135434, - "ĠÅŁi": 35350, - "ĠÅŁidd": 140364, - "ĠÅŁiddet": 140365, - "ĠÅŁiir": 141697, - "ĠÅŁik": 144000, - "ĠÅŁikay": 144001, - "ĠÅŁikayet": 144002, - "ĠÅŁimdi": 133875, - "ĠÅŁirk": 131023, - "ĠÅŁirket": 131024, - "ĠÅŁu": 129607, - "ĠÅŁÃ¶yle": 134881, - "ĠÅŁÃ¼": 142507, - "ĠÅŁÃ¼phe": 142508, - "ĠÆ¡n": 133170, - "Ġưu": 130483, - "ĠÈĻi": 29334, - "ĠÎ": 7851, - "Ġα": 19043, - "Ġβ": 33218, - "Ġγ": 62027, - "Ġδ": 69334, - "Ġε": 59147, - "Ġκ": 71638, - "Ġλ": 48338, - "Ġμ": 32883, - "Ġν": 98686, - "ĠÎĵ": 84216, - "ĠÎĶ": 81163, - "ĠÏ": 17383, - "ĠÏĢ": 51745, - "ĠÏĥ": 47723, - "ĠÏĦ": 38470, - "ĠÏĨ": 97875, - "ĠÐ": 1278, - "ĠС": 27499, - "ĠСШ": 133917, - "ĠСШÐIJ": 133918, - "ĠСам": 131492, - "ĠСан": 140024, - "ĠСанкÑĤ": 140025, - "ĠСегоднÑı": 138679, - "ĠСейÑĩаÑģ": 140644, - "ĠСеÑĢ": 127418, - "ĠСеÑĢг": 142419, - "ĠСеÑĢгей": 142420, - "ĠСмоÑĤÑĢ": 142243, - "ĠСо": 126509, - "ĠСов": 137551, - "ĠСовеÑĤ": 137552, - "ĠСозд": 95679, - "ĠСообÑī": 142095, - "ĠСÑĤа": 131486, - "ĠТ": 50318, - "ĠТа": 131877, - "ĠТак": 125658, - "ĠТакже": 134075, - "ĠТаким": 141852, - "ĠТе": 130833, - "ĠТем": 136623, - "ĠТеп": 140649, - "ĠТепеÑĢÑĮ": 140650, - "ĠТо": 131345, - "ĠТолÑĮко": 141584, - "ĠТÑĥÑĢ": 138825, - "ĠУ": 58742, - "ĠУкÑĢа": 127872, - "ĠУкÑĢаин": 137829, - "ĠУкÑĢаинÑĭ": 136727, - "ĠФ": 66791, - "ĠФедеÑĢ": 127828, - "ĠФедеÑĢаÑĨии": 136238, - "ĠÐ¥": 125560, - "ĠХо": 137247, - "ĠХоÑĤ": 143955, - "ĠХоÑĤÑı": 143956, - "ĠЦ": 126699, - "ĠЦена": 142492, - "ĠЧ": 124713, - "ĠЧа": 134456, - "ĠЧе": 131234, - "ĠЧеÑĢ": 137594, - "ĠЧи": 134985, - "ĠЧÑĤ": 135579, - "ĠЧÑĤо": 130802, - "ĠЧÑĤобÑĭ": 135580, - "ĠШ": 128936, - "ĠЮ": 142055, - "ĠЮÑĢ": 142056, - "ĠЯ": 128557, - "Ġа": 20396, - "Ġаб": 142749, - "ĠабÑģол": 142750, - "ĠабÑģолÑİÑĤ": 142751, - "ĠабÑģолÑİÑĤно": 142752, - "Ġав": 67728, - "Ġавг": 141638, - "ĠавгÑĥÑģÑĤ": 141639, - "ĠавгÑĥÑģÑĤа": 141640, - "Ġави": 140273, - "Ġавиа": 140274, - "ĠавÑĤо": 129722, - "ĠавÑĤом": 125347, - "ĠавÑĤомаÑĤ": 127363, - "ĠавÑĤомаÑĤÑĭ": 137018, - "ĠавÑĤомоб": 141235, - "ĠавÑĤомоби": 141236, - "ĠавÑĤомобилÑĮ": 140663, - "ĠавÑĤомобилÑı": 141237, - "ĠавÑĤоÑĢ": 132718, - "Ġад": 142742, - "ĠадминиÑģÑĤ": 142743, - "ĠадминиÑģÑĤÑĢа": 142744, - "ĠадминиÑģÑĤÑĢаÑĨи": 142745, - "ĠадÑĢеÑģ": 90895, - "Ġак": 85330, - "ĠакÑĤив": 130304, - "ĠакÑĤÑĥ": 142991, - "ĠакÑĤÑĥалÑĮн": 142992, - "Ġал": 141812, - "Ġалк": 141813, - "Ġалког": 141814, - "Ġалкогол": 141815, - "ĠамеÑĢ": 142078, - "ĠамеÑĢик": 142079, - "ĠамеÑĢикан": 142080, - "ĠамеÑĢиканÑģк": 142081, - "Ġан": 127704, - "Ġана": 127723, - "Ġанализ": 135126, - "Ġаналог": 140892, - "Ġанг": 141020, - "Ġангли": 141021, - "Ġанглий": 141022, - "ĠанглийÑģк": 141023, - "ĠанÑĤи": 134986, - "Ġапп": 137693, - "ĠаппаÑĢаÑĤ": 137694, - "ĠапÑĢ": 139630, - "ĠапÑĢелÑı": 139631, - "ĠаÑĢенд": 139786, - "Ġб": 14062, - "Ġба": 128986, - "Ġбаз": 78273, - "Ġбан": 141931, - "Ġбанков": 141932, - "Ġбез": 91357, - "Ġбезоп": 127874, - "ĠбезопаÑģ": 127875, - "ĠбезопаÑģн": 140599, - "ĠбезопаÑģноÑģÑĤи": 136762, - "Ġбел": 131395, - "ĠбеÑĢ": 141052, - "ĠбеÑĢем": 141053, - "ĠбеÑĢеменн": 141054, - "ĠбеÑģ": 130014, - "ĠбеÑģп": 130060, - "ĠбеÑģплаÑĤ": 130061, - "ĠбеÑģплаÑĤно": 130062, - "Ġбиз": 132198, - "ĠбизнеÑģ": 132199, - "Ġбил": 142249, - "ĠбилеÑĤ": 142250, - "Ġбл": 90294, - "Ġблаг": 138422, - "Ġблагод": 138423, - "ĠблагодаÑĢ": 138424, - "ĠблагодаÑĢÑı": 138425, - "Ġбо": 129396, - "Ġбог": 137887, - "Ġбол": 128713, - "Ġболее": 128714, - "ĠболÑĮ": 83599, - "ĠболÑĮÑĪ": 126129, - "ĠболÑĮÑĪе": 129258, - "ĠболÑĮÑĪим": 143936, - "ĠболÑĮÑĪое": 143193, - "ĠболÑĮÑĪой": 136365, - "Ġбон": 135114, - "ĠбонÑĥÑģ": 135115, - "ĠбÑĢенд": 143140, - "ĠбÑĥд": 50470, - "ĠбÑĥдеÑĤ": 68823, - "ĠбÑĥдÑĥ": 134437, - "ĠбÑĥдÑĥÑĤ": 130414, - "ĠбÑĥк": 141750, - "ĠбÑĥкв": 141751, - "ĠбÑĥм": 142354, - "ĠбÑĥмаг": 142355, - "ĠбÑĭ": 37660, - "ĠбÑĭл": 128897, - "ĠбÑĭла": 129760, - "ĠбÑĭли": 129482, - "ĠбÑĭло": 128656, - "ĠбÑĭÑģÑĤÑĢо": 131993, - "ĠбÑĭÑĤÑĮ": 61631, - "ĠбÑİ": 136763, - "ĠбÑİдж": 136764, - "ĠбÑİджеÑĤ": 136765, - "Ġв": 5805, - "Ġва": 140745, - "Ġваж": 135496, - "Ġважно": 135497, - "Ġвал": 143490, - "ĠвалÑİÑĤ": 143491, - "Ġвам": 129379, - "ĠваÑĢи": 131939, - "ĠваÑĢианÑĤ": 131940, - "ĠваÑģ": 129998, - "ĠваÑĪ": 97017, - "ĠваÑĪего": 142044, - "ĠваÑĪи": 140746, - "ĠведÑĮ": 133820, - "Ġвек": 141626, - "Ġвека": 141627, - "Ġвели": 138486, - "Ġвелик": 138487, - "ĠвеÑĢ": 63262, - "ĠвеÑģ": 131480, - "ĠвеÑģÑĮ": 128113, - "ĠвеÑģÑĮма": 143021, - "ĠвеÑĩ": 137244, - "ĠвеÑĩеÑĢ": 137245, - "ĠвеÑī": 136788, - "ĠвеÑīеÑģÑĤв": 136789, - "Ġвз": 125811, - "ĠвзглÑıд": 140262, - "ĠвзÑıÑĤÑĮ": 141618, - "Ġвид": 72920, - "Ġвиде": 126994, - "Ġвидео": 130866, - "ĠвкÑĥÑģ": 135042, - "Ġвла": 138920, - "Ġвлад": 143319, - "ĠвладелÑĮ": 143320, - "ĠвладелÑĮÑĨ": 143321, - "ĠвлаÑģÑĤи": 138921, - "Ġвли": 134904, - "ĠвлиÑı": 134905, - "ĠвмеÑģÑĤ": 135013, - "ĠвмеÑģÑĤе": 135014, - "Ġвн": 143472, - "Ġвне": 132739, - "ĠÐ²Ð½ÐµÑĪ": 143473, - "ĠвнеÑĪне": 143474, - "Ġвним": 133186, - "Ġвнимание": 133187, - "ĠвнÑĥÑĤ": 140467, - "ĠвнÑĥÑĤÑĢи": 140468, - "Ġво": 126231, - "Ġвод": 127680, - "Ġводо": 134841, - "ĠводÑĭ": 135091, - "Ġвоз": 85191, - "Ġвозд": 127924, - "ĠвоздейÑģÑĤв": 140736, - "ĠвоздейÑģÑĤви": 140737, - "ĠвоздÑĥÑħ": 137460, - "Ġвозмож": 125898, - "Ġвозможно": 132656, - "ĠвозможноÑģÑĤи": 137168, - "ĠвозможноÑģÑĤÑĮ": 131169, - "ĠвозÑĢаÑģÑĤ": 132887, - "Ġвой": 141967, - "ĠвойнÑĭ": 141968, - "Ġвок": 142983, - "ĠвокÑĢÑĥг": 142984, - "Ġволн": 141724, - "ĠволоÑģ": 135228, - "ĠвообÑīе": 135167, - "Ġвоп": 126608, - "ĠвопÑĢоÑģ": 126609, - "ĠвопÑĢоÑģÑĭ": 135693, - "ĠвоÑģ": 129430, - "ĠвоÑĤ": 130607, - "Ġвполн": 140794, - "Ġвполне": 140795, - "ĠвÑĢа": 133759, - "ĠвÑĢаÑĩ": 133760, - "ĠвÑĢем": 64711, - "ĠвÑĢемен": 134654, - "ĠвÑĢемени": 130775, - "ĠвÑĢемÑı": 91778, - "ĠвÑģ": 34614, - "ĠвÑģе": 43993, - "ĠвÑģег": 130355, - "ĠвÑģегда": 130356, - "ĠвÑģего": 129291, - "ĠвÑģей": 137189, - "ĠвÑģем": 130642, - "ĠвÑģеÑħ": 90993, - "ĠвÑģÑĤÑĢ": 127958, - "ĠвÑģÑĤÑĢеÑĩ": 137920, - "ĠвÑģÑĤÑĢеÑĩа": 140557, - "ĠвÑģÑİ": 140002, - "ĠвÑģÑı": 142478, - "ĠвÑģÑıк": 142479, - "ĠвÑģÑij": 131896, - "ĠвÑĤоÑĢ": 138616, - "ĠвÑĤоÑĢой": 138617, - "ĠвÑħод": 137514, - "ĠвÑĭ": 20811, - "ĠвÑĭб": 62129, - "ĠвÑĭбиÑĢа": 140209, - "ĠвÑĭбоÑĢ": 130699, - "ĠвÑĭбÑĢ": 137944, - "ĠвÑĭбÑĢаÑĤÑĮ": 137945, - "ĠвÑĭвод": 84294, - "ĠвÑĭгод": 139059, - "ĠвÑĭз": 96666, - "ĠвÑĭп": 70960, - "ĠвÑĭпол": 136721, - "ĠвÑĭполн": 98296, - "ĠвÑĭполнен": 133880, - "ĠвÑĭполнÑı": 136722, - "ĠвÑĭпÑĥÑģ": 136116, - "ĠвÑĭпÑĥÑģк": 136117, - "ĠвÑĭÑĢаж": 143587, - "ĠвÑĭÑĢажен": 143588, - "ĠвÑĭÑģ": 131799, - "ĠвÑĭÑģоко": 131800, - "ĠвÑĭÑħод": 132399, - "ĠвÑĭÑĪе": 134058, - "Ġг": 24725, - "ĠгаÑĢ": 137112, - "ĠгаÑĢан": 137113, - "ĠгаÑĢанÑĤи": 137114, - "Ġгде": 129162, - "ĠгеÑĢ": 137797, - "ĠгеÑĢо": 137798, - "Ġгл": 132853, - "Ġглав": 143003, - "Ġглавное": 143004, - "Ġглаз": 132854, - "ĠговоÑĢ": 132173, - "ĠговоÑĢиÑĤ": 132174, - "Ġгод": 125632, - "Ġгода": 128536, - "ĠгодÑĥ": 129257, - "ĠгодÑĭ": 139146, - "Ġгол": 138325, - "Ġголов": 132169, - "ĠголоÑģ": 138430, - "ĠгоÑĢ": 125191, - "ĠгоÑĢод": 126887, - "ĠгоÑĢода": 131644, - "ĠгоÑĢоде": 138462, - "ĠгоÑģ": 126081, - "ĠгоÑģÑĥд": 127637, - "ĠгоÑģÑĥдаÑĢ": 127638, - "ĠгоÑģÑĥдаÑĢÑģÑĤв": 127639, - "ĠгоÑģÑĥдаÑĢÑģÑĤвенн": 139653, - "ĠгоÑĤов": 130645, - "ĠгÑĢ": 140911, - "ĠгÑĢаж": 131363, - "ĠгÑĢаждан": 131364, - "ĠгÑĢаниÑĨ": 141283, - "ĠгÑĢаÑĦ": 143414, - "ĠгÑĢаÑĦик": 143415, - "ĠгÑĢн": 140912, - "ĠгÑĢÑĥпп": 127942, - "ĠгÑĢÑĥппа": 143298, - "ĠгÑĢÑĥппÑĭ": 137715, - "Ġд": 7796, - "Ġда": 91810, - "Ġдав": 139834, - "Ġдавно": 139835, - "Ġдаж": 129127, - "Ġдаже": 129128, - "Ġдал": 143624, - "Ġдалек": 143625, - "Ġдалеко": 143626, - "ĠдалÑĮ": 142377, - "ĠдалÑĮн": 141766, - "ĠдалÑĮÑĪе": 142378, - "Ġдан": 97499, - "Ġданного": 143390, - "Ġданной": 140785, - "Ġданном": 141536, - "ĠданнÑĭ": 34364, - "ĠданнÑĭе": 66081, - "ĠданнÑĭй": 140397, - "ĠданнÑĭм": 140856, - "ĠданнÑĭÑħ": 52276, - "Ġдв": 73154, - "Ġдва": 130876, - "Ġдве": 132676, - "Ġдвиг": 141744, - "ĠдвигаÑĤ": 141745, - "ĠдвигаÑĤел": 141746, - "Ġдвиж": 141046, - "ĠдвижениÑı": 141047, - "ĠдвоÑĢ": 140732, - "ĠдвÑĥÑħ": 132006, - "Ġде": 125543, - "Ġдев": 127913, - "ĠдевÑĥÑĪ": 137980, - "ĠдевÑĥÑĪк": 137981, - "ĠдейÑģÑĤв": 126114, - "ĠдейÑģÑĤвие": 142668, - "ĠдейÑģÑĤвиÑĤелÑĮно": 136896, - "ĠдейÑģÑĤвиÑı": 135470, - "Ġдек": 139384, - "Ġдекаб": 139385, - "ĠдекабÑĢÑı": 139386, - "Ġдел": 94269, - "Ġдела": 129691, - "ĠделаÑĤÑĮ": 133106, - "Ġделе": 137915, - "Ġдело": 133279, - "Ġдем": 141834, - "Ġдемо": 141835, - "Ġден": 127981, - "Ġденег": 138419, - "Ġденеж": 141916, - "Ġденежн": 141917, - "ĠденÑĮ": 126585, - "ĠденÑĮги": 131659, - "Ġдеп": 143381, - "ĠдепÑĥÑĤ": 143382, - "ĠдепÑĥÑĤаÑĤ": 143383, - "ĠдеÑĢ": 134817, - "ĠдеÑĢев": 134818, - "ĠдеÑĤ": 125870, - "ĠдеÑĤей": 130963, - "ĠдеÑĤи": 140497, - "ĠдеÑĤÑģк": 132951, - "ĠдеÑıÑĤ": 127358, - "ĠдеÑıÑĤелÑĮ": 127359, - "ĠдеÑıÑĤелÑĮноÑģÑĤи": 132796, - "ĠдеÑıÑĤелÑĮноÑģÑĤÑĮ": 140855, - "Ġди": 143755, - "Ġдиаг": 143756, - "ĠдиагноÑģÑĤ": 143757, - "Ġдиз": 135385, - "Ġдизайн": 135386, - "ĠдиÑĢ": 138364, - "ĠдиÑĢекÑĤоÑĢ": 138365, - "ĠдиÑģк": 136151, - "Ġдл": 142191, - "Ġдлин": 136319, - "ĠдлиÑĤелÑĮн": 142192, - "ĠдлÑı": 19849, - "Ġдней": 133141, - "ĠднÑı": 133072, - "Ġдо": 56197, - "Ġдоб": 140444, - "Ġдобав": 58269, - "ĠдобÑĢо": 140445, - "Ġдов": 138162, - "ĠдоволÑĮ": 138163, - "ĠдоволÑĮно": 138164, - "Ġдог": 131647, - "ĠдоговоÑĢ": 131648, - "ĠдокÑĥменÑĤ": 127067, - "ĠдокÑĥменÑĤов": 139475, - "Ġдол": 126092, - "Ġдолг": 139760, - "Ġдолго": 134806, - "Ġдолж": 55349, - "Ġдолжен": 132563, - "Ġдолжна": 136230, - "Ġдолжно": 136648, - "ĠдолжноÑģÑĤ": 142889, - "ĠдолжнÑĭ": 132128, - "Ġдолл": 139714, - "ĠдоллаÑĢ": 139715, - "Ġдом": 126711, - "Ġдома": 130174, - "Ġдоп": 142861, - "Ġдополн": 142862, - "ĠдополниÑĤелÑĮно": 142863, - "ĠдоÑĢ": 131487, - "ĠдоÑĢог": 131488, - "ĠдоÑģÑĤ": 66325, - "ĠдоÑģÑĤаÑĤ": 132459, - "ĠдоÑģÑĤаÑĤоÑĩно": 132460, - "ĠдоÑģÑĤиг": 139062, - "ĠдоÑģÑĤиж": 143365, - "ĠдоÑģÑĤижени": 143366, - "ĠдоÑģÑĤÑĥп": 91041, - "ĠдоÑħод": 136937, - "ĠдÑĢев": 139671, - "ĠдÑĢÑĥг": 80742, - "ĠдÑĢÑĥгие": 132083, - "ĠдÑĢÑĥгими": 142746, - "ĠдÑĢÑĥгиÑħ": 130599, - "ĠдÑĢÑĥгой": 135361, - "ĠдÑĢÑĥз": 143438, - "ĠдÑĢÑĥзÑĮÑı": 143439, - "ĠдÑĥÑħ": 141787, - "ĠдÑĥÑħов": 141788, - "Ġе": 22132, - "Ġев": 143943, - "ĠевÑĢ": 143944, - "ĠевÑĢо": 143125, - "ĠевÑĢоп": 143945, - "ĠевÑĢопей": 143946, - "Ġего": 72285, - "Ġедин": 141426, - "ĠединÑģÑĤв": 141427, - "Ġее": 128992, - "ĠемÑĥ": 131596, - "ĠеÑģли": 46253, - "ĠеÑģÑĤÑĮ": 79165, - "ĠеÑī": 134412, - "ĠеÑīе": 128863, - "ĠеÑīÑij": 134413, - "ĠеÑij": 134709, - "Ġж": 57217, - "Ġже": 128346, - "Ġжел": 139573, - "Ġжелез": 139574, - "Ġжен": 131161, - "ĠженÑīин": 131162, - "Ġжив": 134030, - "ĠживоÑĤ": 134031, - "Ġжид": 141996, - "Ġжидк": 141997, - "Ġжиз": 126768, - "Ġжизни": 129982, - "ĠжизнÑĮ": 132902, - "ĠжÑĥÑĢ": 137012, - "ĠжÑĥÑĢнал": 137013, - "Ġз": 10885, - "Ġза": 43846, - "Ġзаб": 140335, - "Ġзабол": 140336, - "Ġзаболев": 140337, - "ĠзаболеваниÑı": 140338, - "Ġзав": 92223, - "ĠзавиÑģ": 128039, - "ĠзавиÑģим": 139132, - "ĠзавиÑģимоÑģÑĤи": 139133, - "ĠзавиÑģиÑĤ": 139182, - "Ġзавод": 138651, - "Ġзаг": 71490, - "Ġзад": 52180, - "ĠзадаÑĩ": 133771, - "Ġзай": 140516, - "Ġзайм": 140517, - "Ġзак": 58213, - "Ġзаказ": 86905, - "Ġзакон": 129707, - "Ġзам": 127912, - "ĠзамеÑĤ": 137275, - "ĠзамеÑĩа": 141559, - "Ġзан": 135674, - "Ġзани": 131668, - "Ġзанима": 131669, - "ĠзанÑıÑĤ": 135675, - "Ġзап": 29789, - "ĠзапиÑģ": 55511, - "ĠзапиÑģи": 142573, - "ĠзапÑĢоÑģ": 69083, - "ĠзаÑĢ": 143917, - "ĠзаÑĢегиÑģÑĤ": 143918, - "ĠзаÑĢегиÑģÑĤÑĢи": 143919, - "ĠзаÑĢегиÑģÑĤÑĢиÑĢова": 143920, - "ĠзаÑĤ": 138264, - "ĠзаÑĤем": 138265, - "ĠзаÑīиÑĤ": 141946, - "ĠзаÑīиÑĤÑĭ": 141947, - "ĠзаÑı": 128103, - "ĠзаÑıв": 128104, - "ĠзаÑıвил": 140009, - "ĠзаÑıвк": 143734, - "ĠздеÑģÑĮ": 131337, - "ĠздоÑĢов": 142421, - "ĠздоÑĢовÑĮÑı": 142422, - "Ġзим": 138812, - "Ġзло": 143112, - "Ġзн": 143198, - "Ġзна": 127903, - "ĠзнаеÑĤ": 140131, - "Ġзнак": 143119, - "ĠзнаÑĤÑĮ": 143199, - "ĠзнаÑĩ": 39550, - "ĠзнаÑĩение": 65359, - "ĠзнаÑĩениÑı": 87512, - "ĠзнаÑĩиÑĤ": 138721, - "ĠзнаÑĩиÑĤелÑĮно": 139951, - "ĠзнаÑİ": 137096, - "ĠзÑĢ": 143220, - "ĠзÑĢениÑı": 143221, - "ĠзÑĥб": 140212, - "Ġи": 7587, - "Ġиг": 70522, - "ĠигÑĢ": 125635, - "ĠигÑĢаÑĤÑĮ": 135242, - "ĠигÑĢов": 138601, - "ĠигÑĢовÑĭе": 138602, - "ĠигÑĢок": 134633, - "ĠигÑĢÑĭ": 131420, - "Ġиде": 142567, - "ĠидеалÑĮн": 142568, - "Ġиз": 23064, - "ĠизвеÑģÑĤ": 131199, - "ĠизгоÑĤов": 139968, - "ĠизгоÑĤовлен": 139969, - "Ġизд": 143879, - "Ġиздели": 143880, - "ĠизделиÑı": 143881, - "Ġизмен": 70021, - "ĠизменениÑı": 138506, - "Ġили": 45077, - "Ġим": 47735, - "Ġиме": 125798, - "ĠимееÑĤ": 130318, - "Ġимени": 142112, - "Ġименно": 131122, - "ĠимеÑĤÑĮ": 140292, - "ĠимеÑİÑĤ": 134850, - "ĠимÑı": 84656, - "Ġин": 40978, - "ĠинвеÑģÑĤи": 143347, - "ĠинвеÑģÑĤиÑĨи": 143348, - "Ġиногда": 142013, - "ĠиноÑģÑĤ": 143058, - "ĠиноÑģÑĤÑĢан": 143059, - "ĠиноÑģÑĤÑĢанн": 143060, - "ĠинÑĤеÑĢ": 96951, - "ĠинÑĤеÑĢеÑģ": 129611, - "ĠинÑĤеÑĢнеÑĤ": 130231, - "ĠинÑĤеÑĢÑĮеÑĢ": 143275, - "ĠинÑĦоÑĢм": 81983, - "ĠинÑĦоÑĢмаÑĨии": 135074, - "ĠинÑĦоÑĢмаÑĨиÑİ": 137673, - "ĠинÑĦоÑĢмаÑĨиÑı": 139493, - "ĠиÑģ": 125109, - "ĠиÑģкÑĥÑģ": 136456, - "ĠиÑģкÑĥÑģÑģÑĤв": 136457, - "ĠиÑģп": 52587, - "ĠиÑģпол": 142546, - "ĠиÑģполни": 142547, - "ĠиÑģполÑĮз": 89695, - "ĠиÑģполÑĮзов": 88227, - "ĠиÑģполÑĮзова": 135817, - "ĠиÑģполÑĮзование": 138710, - "ĠиÑģполÑĮзованиÑı": 138719, - "ĠиÑģполÑĮзоваÑĤÑĮ": 132805, - "ĠиÑģполÑĮзÑĥеÑĤÑģÑı": 143248, - "ĠиÑģполÑĮзÑĥÑİÑĤ": 139193, - "ĠиÑģпÑĭÑĤа": 143302, - "ĠиÑģÑģлед": 127959, - "ĠиÑģÑģледова": 137938, - "ĠиÑģÑģледованиÑı": 141441, - "ĠиÑģÑĤ": 126144, - "ĠиÑģÑĤоÑĢ": 127927, - "ĠиÑģÑĤоÑĢии": 137524, - "ĠиÑģÑĤоÑĢиÑı": 143982, - "ĠиÑģÑĤоÑĩ": 137403, - "ĠиÑģÑĤоÑĩник": 137404, - "ĠиÑħ": 128488, - "ĠиÑİ": 128082, - "ĠиÑİлÑı": 140460, - "ĠиÑİнÑı": 139775, - "Ġк": 7665, - "Ġка": 143986, - "Ġкаж": 143845, - "Ġкажд": 88566, - "Ġкаждого": 138393, - "Ġкаждой": 143285, - "Ġкаждом": 140567, - "ĠкаждÑĭй": 132946, - "ĠкажеÑĤÑģÑı": 143846, - "Ġказ": 131046, - "Ġказино": 131047, - "Ġкак": 51670, - "Ġкакие": 136048, - "Ġкакой": 134207, - "Ġкам": 140945, - "ĠкамеÑĢ": 140946, - "Ġкан": 138205, - "Ġканал": 138206, - "Ġкап": 127894, - "ĠкапиÑĤ": 141159, - "ĠкапиÑĤал": 141160, - "ĠкаÑĢ": 129297, - "ĠкаÑĢÑĤ": 90634, - "ĠкаÑĢÑĤин": 134341, - "ĠкаÑĤ": 143890, - "ĠкаÑĤал": 143891, - "ĠкаÑĤалог": 143892, - "ĠкаÑĤегоÑĢ": 143117, - "ĠкаÑĤегоÑĢии": 143118, - "ĠкаÑĦе": 143987, - "ĠкаÑĩ": 125296, - "ĠкаÑĩеÑģÑĤв": 125902, - "ĠкаÑĩеÑģÑĤва": 137094, - "ĠкаÑĩеÑģÑĤве": 131191, - "ĠкаÑĩеÑģÑĤво": 139403, - "ĠкваÑĢ": 130828, - "ĠкваÑĢÑĤиÑĢ": 130829, - "Ġкино": 138288, - "Ġкл": 47346, - "ĠклаÑģÑģ": 59648, - "Ġкли": 89089, - "ĠклиенÑĤ": 131562, - "ĠклÑĥб": 135549, - "ĠклÑİÑĩ": 96355, - "Ġкни": 127398, - "Ġкниг": 132981, - "Ġкниги": 139984, - "Ġкноп": 84949, - "Ġкнопк": 143197, - "Ġко": 87415, - "Ġкогда": 128895, - "Ġкод": 68026, - "Ġкож": 139044, - "Ġкожи": 139045, - "Ġкол": 50448, - "ĠколиÑĩеÑģÑĤво": 88601, - "Ġколл": 143747, - "ĠколлекÑĤив": 143748, - "Ġком": 43116, - "Ġкоманд": 131418, - "ĠкомиÑģ": 142047, - "ĠкомиÑģÑģи": 142048, - "ĠкомнаÑĤ": 135040, - "Ġкомп": 76473, - "Ġкомпани": 126821, - "Ġкомпании": 130188, - "Ġкомпаний": 142490, - "ĠкомпаниÑı": 134979, - "ĠкомплекÑģ": 133516, - "ĠкомпÑĮÑİ": 134231, - "ĠкомпÑĮÑİÑĤеÑĢ": 134232, - "ĠкомÑĦ": 139095, - "ĠкомÑĦоÑĢÑĤ": 139096, - "Ġкон": 36998, - "ĠконеÑĩно": 133859, - "ĠконкÑĢ": 138897, - "ĠконкÑĢеÑĤ": 138898, - "ĠконкÑĥÑĢ": 137507, - "ĠконкÑĥÑĢÑģ": 137508, - "ĠконÑģÑĤÑĢÑĥк": 139686, - "ĠконÑģÑĤÑĢÑĥкÑĨи": 139687, - "ĠконÑĤ": 76985, - "ĠконÑĤак": 139404, - "ĠконÑĤакÑĤ": 139405, - "ĠконÑĤÑĢ": 132160, - "ĠконÑĤÑĢол": 132161, - "ĠконÑĨе": 136229, - "ĠкоÑĢ": 66869, - "ĠкоÑĢпÑĥÑģ": 142574, - "ĠкоÑĤоÑĢ": 37053, - "ĠкоÑĤоÑĢаÑı": 130407, - "ĠкоÑĤоÑĢого": 133785, - "ĠкоÑĤоÑĢое": 134546, - "ĠкоÑĤоÑĢой": 132226, - "ĠкоÑĤоÑĢом": 133669, - "ĠкоÑĤоÑĢÑĥÑİ": 137778, - "ĠкоÑĤоÑĢÑĭе": 128548, - "ĠкоÑĤоÑĢÑĭй": 97751, - "ĠкоÑĤоÑĢÑĭм": 135810, - "ĠкоÑĤоÑĢÑĭÑħ": 130455, - "ĠкÑĢай": 143110, - "ĠкÑĢайне": 143111, - "ĠкÑĢаÑģ": 127736, - "ĠкÑĢаÑģив": 135329, - "ĠкÑĢаÑģоÑĤ": 142171, - "ĠкÑĢед": 130926, - "ĠкÑĢедиÑĤ": 130927, - "ĠкÑĢов": 142238, - "ĠкÑĢови": 142239, - "ĠкÑĢоме": 141727, - "ĠкÑĢÑĥ": 134419, - "ĠкÑĢÑĥг": 137023, - "ĠкÑĢÑĥп": 134420, - "ĠкÑĢÑĭ": 143615, - "ĠкÑĢÑĭÑĪ": 143616, - "ĠкÑĤо": 129796, - "ĠкÑĥд": 141012, - "ĠкÑĥда": 141013, - "ĠкÑĥлÑĮÑĤ": 141959, - "ĠкÑĥлÑĮÑĤÑĥ": 141960, - "ĠкÑĥлÑĮÑĤÑĥÑĢÑĭ": 141961, - "ĠкÑĥпиÑĤÑĮ": 130074, - "ĠкÑĥÑĢÑģ": 132961, - "Ġл": 25460, - "Ġлег": 133362, - "Ġлегко": 133363, - "ĠлеÑĤ": 128696, - "ĠлеÑĩ": 138560, - "ĠлеÑĩение": 140381, - "ĠлеÑĩениÑı": 138561, - "Ġли": 58095, - "Ġлид": 142950, - "ĠлидеÑĢ": 142951, - "ĠлиÑĤ": 140564, - "ĠлиÑĤеÑĢ": 140565, - "ĠлиÑĤеÑĢаÑĤÑĥÑĢ": 140566, - "ĠлиÑĨ": 131111, - "ĠлиÑĨа": 135279, - "ĠлиÑĩно": 134609, - "ĠлиÑĪ": 127225, - "ĠлиÑĪÑĮ": 131991, - "ĠлÑĥÑĩ": 126891, - "ĠлÑĥÑĩÑĪе": 130458, - "ĠлÑĥÑĩÑĪиÑħ": 143937, - "ĠлÑİ": 93036, - "ĠлÑİб": 125389, - "ĠлÑİбим": 138158, - "ĠлÑİбого": 143736, - "ĠлÑİбой": 134706, - "ĠлÑİбом": 141793, - "ĠлÑİдей": 131007, - "ĠлÑİди": 132782, - "Ġм": 11310, - "Ġма": 128692, - "ĠмакÑģ": 140684, - "ĠмакÑģималÑĮ": 140685, - "ĠмакÑģималÑĮно": 140686, - "Ġмал": 127575, - "Ġмало": 134083, - "ĠмалÑĭÑĪ": 142283, - "Ġмам": 141617, - "ĠмаÑĢ": 126064, - "ĠмаÑĢÑĤа": 138856, - "ĠмаÑĢÑĪ": 143872, - "ĠмаÑĢÑĪÑĢÑĥÑĤ": 143873, - "ĠмаÑģ": 142762, - "ĠмаÑģло": 142763, - "ĠмаÑģÑģ": 131434, - "ĠмаÑģÑģив": 50237, - "ĠмаÑģÑĤ": 135903, - "ĠмаÑģÑĤеÑĢ": 135904, - "ĠмаÑĤ": 95473, - "ĠмаÑĤеÑĢи": 136970, - "ĠмаÑĤеÑĢиал": 128076, - "ĠмаÑĤеÑĢиалов": 139696, - "ĠмаÑĤеÑĢиалÑĭ": 141158, - "ĠмаÑĤÑĩ": 138357, - "ĠмаÑĪ": 130838, - "ĠмаÑĪин": 130839, - "ĠмаÑı": 137659, - "Ġме": 127336, - "Ġмед": 127620, - "Ġмеди": 137972, - "ĠмеждÑĥ": 130724, - "Ġмен": 68744, - "Ġменее": 133959, - "ĠменÑĮ": 137200, - "ĠменÑĮÑĪе": 137201, - "ĠменÑı": 129052, - "ĠмеÑĢ": 143779, - "ĠмеÑĢоп": 143780, - "ĠмеÑĢопÑĢи": 143781, - "ĠмеÑĢопÑĢиÑıÑĤиÑı": 143782, - "ĠмеÑģÑĤ": 125270, - "ĠмеÑģÑĤа": 134548, - "ĠмеÑģÑĤе": 136052, - "ĠмеÑģÑĤо": 130746, - "ĠмеÑģÑı": 127337, - "ĠмеÑģÑıÑĨ": 132698, - "ĠмеÑģÑıÑĨев": 138693, - "ĠмеÑĤ": 127765, - "ĠмеÑĤал": 135565, - "ĠмеÑĤалл": 135566, - "ĠмеÑĤод": 55629, - "ĠмеÑĤÑĢо": 140184, - "ĠмеÑħ": 143430, - "ĠмеÑħаниз": 143431, - "ĠмеÑħанизм": 143432, - "Ġмик": 135189, - "ĠмикÑĢо": 135190, - "Ġмил": 128073, - "Ġмилли": 139641, - "Ġмиллион": 139642, - "Ġмин": 97868, - "ĠминималÑĮ": 143857, - "ĠминималÑĮн": 143858, - "ĠминÑĥÑĤ": 131687, - "ĠмиÑĢ": 137144, - "ĠмиÑĢа": 135093, - "ĠмиÑĢе": 137145, - "ĠмиÑĢов": 138061, - "Ġмл": 137958, - "Ġмлн": 137959, - "Ġмм": 134774, - "Ġмн": 126133, - "Ġмне": 129075, - "Ġмног": 127869, - "Ġмногие": 136676, - "ĠмногиÑħ": 137908, - "Ġмного": 128991, - "Ġмнож": 141311, - "ĠмножеÑģÑĤво": 141312, - "Ġмо": 128468, - "ĠмобилÑĮ": 138625, - "ĠмобилÑĮн": 138626, - "Ġмог": 125649, - "ĠмогÑĥ": 139572, - "ĠмогÑĥÑĤ": 129348, - "Ġмод": 70139, - "Ġмодели": 138082, - "ĠмоделÑĮ": 141335, - "Ġмож": 44483, - "ĠможеÑĤ": 66988, - "ĠможеÑĤе": 130619, - "Ġможно": 90298, - "Ġмой": 139732, - "Ġмолод": 132210, - "Ġмом": 130485, - "ĠмоменÑĤ": 130486, - "ĠмоÑī": 137034, - "ĠмоÑīн": 137035, - "ĠмÑĥ": 133294, - "ĠмÑĥж": 127584, - "ĠмÑĥжÑĩин": 134144, - "ĠмÑĥзÑĭк": 133295, - "ĠмÑĭ": 87200, - "ĠмÑı": 141224, - "ĠмÑıг": 141225, - "ĠмÑıгк": 141226, - "ĠмÑıÑģ": 143499, - "Ġн": 6709, - "Ġна": 13073, - "Ġнаб": 140202, - "ĠнаблÑİ": 140203, - "ĠнаблÑİда": 140204, - "Ġнаг": 143960, - "ĠнагÑĢÑĥз": 143961, - "ĠнагÑĢÑĥзк": 143962, - "Ġнад": 126939, - "Ġнадо": 131507, - "Ġназ": 127550, - "Ġназад": 133915, - "Ġназвание": 138943, - "ĠназнаÑĩен": 139779, - "Ġнаи": 135804, - "Ġнаибол": 135805, - "Ġнаиболее": 135806, - "Ġнай": 134173, - "Ġнайд": 86758, - "ĠнайÑĤи": 134174, - "ĠналиÑĩ": 128139, - "ĠналиÑĩие": 142132, - "ĠналиÑĩии": 140885, - "Ġналог": 139674, - "Ġналогов": 139675, - "Ġнам": 130512, - "Ġнап": 90005, - "ĠнапÑĢав": 131584, - "ĠнапÑĢавлен": 131585, - "ĠнаÑĢ": 141824, - "ĠнаÑĢко": 141825, - "ĠнаÑĢÑĥ": 135338, - "ĠнаÑĢÑĥÑĪен": 135339, - "ĠнаÑģ": 126460, - "ĠнаÑģел": 140877, - "ĠнаÑģелениÑı": 140878, - "ĠнаÑģÑĤоÑı": 127754, - "ĠнаÑģÑĤоÑıÑī": 127755, - "ĠнаÑģÑĤоÑıÑīее": 142526, - "ĠнаÑĤÑĥÑĢ": 143114, - "ĠнаÑĤÑĥÑĢалÑĮн": 143115, - "ĠнаÑĥк": 138912, - "ĠнаÑĥÑĩ": 133695, - "ĠнаÑħод": 127254, - "ĠнаÑħодиÑĤÑģÑı": 135480, - "ĠнаÑĩ": 72542, - "ĠнаÑĩал": 129971, - "ĠнаÑĩала": 135883, - "ĠнаÑĩина": 131107, - "ĠнаÑĪ": 126096, - "ĠнаÑĪего": 140072, - "ĠнаÑĪей": 134978, - "ĠнаÑĪем": 135999, - "ĠнаÑĪи": 137122, - "ĠнаÑĪиÑħ": 139290, - "Ġне": 18658, - "Ġнев": 142323, - "Ġневоз": 142324, - "Ġневозможно": 142325, - "Ġнего": 131326, - "Ġнед": 127782, - "Ġнедел": 143223, - "ĠнеделÑİ": 143224, - "Ġнедо": 135681, - "Ġнек": 126164, - "ĠнекоÑĤоÑĢ": 126165, - "ĠнекоÑĤоÑĢÑĭе": 139437, - "ĠнекоÑĤоÑĢÑĭÑħ": 141059, - "ĠнелÑĮ": 138914, - "ĠнелÑĮз": 138915, - "ĠнелÑĮзÑı": 138916, - "Ġнем": 137966, - "Ġнемного": 137967, - "ĠнеобÑħодим": 125742, - "ĠнеобÑħодимо": 129945, - "ĠнеобÑħодимоÑģÑĤи": 142280, - "ĠнеÑģк": 126814, - "ĠнеÑģколÑĮ": 141497, - "ĠнеÑģколÑĮки": 141498, - "ĠнеÑģколÑĮкиÑħ": 141499, - "ĠнеÑģколÑĮко": 130157, - "ĠнеÑĤ": 76638, - "Ġни": 126491, - "Ġниже": 139784, - "Ġник": 126073, - "Ġникак": 134212, - "Ġникогда": 139544, - "ĠникÑĤо": 142084, - "ĠниÑħ": 129690, - "ĠниÑĩ": 134009, - "ĠниÑĩего": 134010, - "Ġно": 128330, - "Ġнов": 48951, - "Ġнового": 137008, - "ĠновоÑģÑĤи": 141268, - "ĠновÑĭе": 136035, - "ĠновÑĭй": 136415, - "ĠновÑĭÑħ": 136820, - "Ġног": 135960, - "ĠномеÑĢ": 73934, - "ĠноÑĢм": 127844, - "ĠноÑĢмалÑĮн": 141177, - "ĠноÑĩ": 142430, - "ĠноÑĩÑĮ": 142431, - "ĠноÑı": 140522, - "ĠноÑıбÑĢÑı": 140523, - "ĠнÑĥж": 75983, - "ĠнÑĥжно": 129100, - "ĠнÑĥжнÑĭ": 141217, - "Ġо": 8215, - "Ġоб": 21229, - "ĠобеÑģп": 137457, - "ĠобеÑģпеÑĩ": 137458, - "ĠобеÑģпеÑĩива": 137459, - "Ġобла": 126684, - "ĠоблаÑģÑĤи": 129729, - "ĠоблаÑģÑĤÑĮ": 137291, - "Ġобо": 130584, - "ĠобоÑĢ": 128148, - "ĠобоÑĢÑĥд": 128149, - "ĠобоÑĢÑĥдование": 141681, - "ĠобоÑĢÑĥдованиÑı": 141123, - "ĠобÑĢаз": 127273, - "ĠобÑĢазованиÑı": 136731, - "ĠобÑĢазом": 132256, - "ĠобÑĢаÑĤ": 131705, - "ĠобÑĢаÑī": 139617, - "ĠобÑĢаÑīа": 139618, - "ĠобÑģлÑĥж": 138446, - "ĠобÑģлÑĥжива": 138447, - "ĠобÑĥÑĩ": 143180, - "ĠобÑĥÑĩениÑı": 143181, - "ĠобÑī": 142217, - "ĠобÑīеÑģÑĤв": 142218, - "ĠобÑīеÑģÑĤвенно": 142219, - "ĠобÑĬ": 47340, - "ĠобÑĬекÑĤ": 53953, - "ĠобÑĬем": 134718, - "ĠобÑĬÑı": 136914, - "ĠобÑĬÑıвл": 136915, - "ĠобÑĭ": 135925, - "ĠобÑĭÑĩ": 135926, - "ĠобÑĭÑĩно": 135927, - "ĠобÑıз": 127838, - "ĠобÑıзан": 138823, - "ĠобÑıзаÑĤелÑĮ": 136346, - "ĠобÑıзаÑĤелÑĮно": 136347, - "ĠогÑĢ": 127776, - "ĠогÑĢани": 137872, - "ĠогÑĢаниÑĩен": 137873, - "ĠогÑĢомн": 135663, - "Ġод": 52319, - "Ġодеж": 137073, - "Ġодежд": 137074, - "Ġодин": 129385, - "Ġодна": 136109, - "Ġоднако": 138284, - "Ġодним": 138502, - "Ġодно": 131550, - "Ġодного": 134682, - "Ġодной": 133304, - "Ġодном": 138433, - "ĠоднÑĥ": 142060, - "Ġожи": 137928, - "Ġожида": 137929, - "Ġок": 71564, - "Ġоказ": 127595, - "Ġоказа": 134236, - "ĠоказÑĭва": 142131, - "Ġокол": 134304, - "Ġоколо": 134305, - "ĠокÑĢÑĥ": 142482, - "ĠокÑĢÑĥг": 143652, - "ĠокÑĢÑĥжа": 142483, - "ĠокÑĢÑĥжаÑİÑī": 142484, - "ĠокÑĤÑı": 139791, - "ĠокÑĤÑıбÑĢÑı": 139792, - "Ġон": 98745, - "Ġона": 129171, - "Ġони": 128729, - "Ġонл": 129210, - "Ġонлайн": 129211, - "Ġоп": 45239, - "ĠопаÑģ": 136129, - "ĠопеÑĢ": 96958, - "ĠопиÑģание": 143696, - "ĠопÑĨион": 141131, - "ĠопÑĭ": 132389, - "ĠопÑĭÑĤ": 132390, - "ĠоÑĢг": 125186, - "ĠоÑĢган": 129651, - "ĠоÑĢганиз": 126030, - "ĠоÑĢганизаÑĨии": 133248, - "ĠоÑĢганизаÑĨиÑı": 142390, - "ĠоÑĢганизм": 134280, - "ĠоÑĢи": 140980, - "ĠоÑĢиг": 140981, - "ĠоÑĢигина": 140982, - "ĠоÑĢигинал": 140983, - "ĠоÑģ": 80276, - "ĠоÑģнов": 126068, - "ĠоÑģнован": 134067, - "ĠоÑģнове": 137854, - "ĠоÑģновном": 143498, - "ĠоÑģоб": 127071, - "ĠоÑģобенно": 131222, - "ĠоÑģÑĤ": 139856, - "ĠоÑģÑĤа": 129993, - "ĠоÑģÑĤалÑĮн": 139857, - "ĠоÑģÑĥÑīеÑģÑĤв": 134673, - "ĠоÑģÑĥÑīеÑģÑĤвлÑı": 134674, - "ĠоÑĤ": 20264, - "ĠоÑĤвеÑĤ": 92647, - "ĠоÑĤд": 135982, - "ĠоÑĤдел": 132650, - "ĠоÑĤдÑĭÑħ": 135983, - "ĠоÑĤз": 127789, - "ĠоÑĤзÑĭв": 127790, - "ĠоÑĤзÑĭвÑĭ": 135758, - "ĠоÑĤказ": 135738, - "ĠоÑĤкÑĢ": 142474, - "ĠоÑĤкÑĢÑĭва": 142475, - "ĠоÑĤкÑĢÑĭÑĤ": 131187, - "ĠоÑĤлиÑĩ": 127888, - "ĠоÑĤлиÑĩа": 136867, - "ĠоÑĤлиÑĩно": 141233, - "ĠоÑĤмеÑĤ": 128176, - "ĠоÑĤмеÑĤил": 142041, - "ĠоÑĤмеÑĤиÑĤÑĮ": 143758, - "ĠоÑĤно": 128001, - "ĠоÑĤноÑĪ": 128002, - "ĠоÑĤноÑĪении": 142723, - "ĠоÑĤноÑĪениÑı": 138623, - "ĠоÑĤпÑĢав": 86088, - "ĠоÑĦ": 139923, - "ĠоÑĦи": 133835, - "ĠоÑĦиÑģ": 139924, - "ĠоÑĦиÑĨиалÑĮн": 133836, - "ĠоÑĦоÑĢм": 137412, - "ĠоÑĦоÑĢмлен": 137413, - "ĠоÑĩ": 94812, - "ĠоÑĩенÑĮ": 128632, - "ĠоÑĩеÑĢ": 128015, - "ĠоÑĩеÑĢед": 140995, - "ĠоÑĩеÑĢедÑĮ": 138738, - "ĠоÑĪиб": 88663, - "Ġп": 5063, - "Ġпа": 129642, - "ĠпаÑĢ": 62680, - "ĠпаÑĢа": 133499, - "ĠпаÑĢамеÑĤ": 66345, - "ĠпаÑĢÑĤ": 140509, - "ĠпаÑĢÑĤи": 140216, - "ĠпаÑĢÑĤнеÑĢ": 140510, - "ĠпаÑĨи": 138299, - "ĠпаÑĨиенÑĤ": 138300, - "Ġпед": 142553, - "Ġпедаг": 142554, - "Ġпедагог": 142555, - "Ġпен": 139507, - "ĠпенÑģи": 139508, - "ĠпеÑĢ": 27016, - "ĠпеÑĢв": 76801, - "ĠпеÑĢвого": 142188, - "ĠпеÑĢвой": 141695, - "ĠпеÑĢвÑĥÑİ": 141517, - "ĠпеÑĢвÑĭй": 135756, - "ĠпеÑĢе": 126219, - "ĠпеÑĢев": 139054, - "ĠпеÑĢевод": 139055, - "ĠпеÑĢед": 77657, - "ĠпеÑĢем": 70801, - "ĠпеÑĢемен": 80099, - "ĠпеÑĢеÑħод": 140312, - "ĠпеÑĢи": 131243, - "ĠпеÑĢиод": 131244, - "ĠпеÑģ": 132415, - "ĠпеÑĩ": 137158, - "Ġпи": 129856, - "ĠпиÑĤ": 141684, - "ĠпиÑĤаниÑı": 141685, - "Ġпл": 125717, - "Ġплан": 129740, - "ĠплаÑģÑĤ": 136356, - "ĠплаÑĤ": 127026, - "ĠплаÑĤеж": 141706, - "ĠплиÑĤ": 143057, - "Ġпло": 127265, - "ĠплоÑĤ": 142284, - "ĠплоÑħо": 141466, - "ĠплоÑī": 132227, - "ĠплоÑīад": 132228, - "Ġпо": 17686, - "Ġпоб": 138021, - "Ġпобед": 138022, - "Ġпов": 94934, - "ĠповеÑĢ": 136225, - "ĠповеÑĢÑħ": 136226, - "ĠповеÑĢÑħноÑģÑĤ": 136227, - "ĠповÑĤоÑĢ": 139716, - "ĠповÑĭ": 133825, - "ĠповÑĭÑĪен": 133826, - "Ġпод": 39742, - "ĠподаÑĢ": 135049, - "ĠподгоÑĤов": 137846, - "ĠподгоÑĤовк": 137847, - "ĠподдеÑĢжива": 141403, - "ĠподпиÑģ": 139585, - "ĠподÑĢоб": 137641, - "ĠподÑĢобн": 137642, - "ĠподÑħод": 133903, - "Ġпозв": 126060, - "Ġпозвол": 142224, - "ĠпозволиÑĤ": 142225, - "ĠпозволÑı": 127556, - "ĠпозволÑıеÑĤ": 133973, - "ĠпоиÑģк": 133570, - "Ġпок": 134227, - "Ġпока": 131636, - "Ġпоказ": 131121, - "ĠпокÑĥп": 134228, - "ĠпокÑĥпа": 134229, - "Ġпол": 28519, - "Ġполи": 133261, - "ĠполиÑĤ": 137745, - "ĠполиÑĤик": 137746, - "Ġполно": 135870, - "ĠполноÑģÑĤÑĮÑİ": 134825, - "Ġполов": 141557, - "Ġполовин": 141558, - "Ġполож": 142189, - "ĠположиÑĤелÑĮн": 142190, - "ĠполÑĥ": 136739, - "ĠполÑĥÑĩ": 51332, - "ĠполÑĥÑĩа": 130783, - "ĠполÑĥÑĩен": 135435, - "ĠполÑĥÑĩениÑı": 140368, - "ĠполÑĥÑĩи": 133652, - "ĠполÑĥÑĩил": 135164, - "ĠполÑĥÑĩиÑĤÑĮ": 132693, - "ĠполÑĮз": 127417, - "ĠполÑĮзоваÑĤ": 45295, - "ĠполÑĮзоваÑĤелÑı": 66149, - "ĠполÑĮзÑĥ": 139032, - "ĠполÑı": 88202, - "Ġпом": 75301, - "ĠпомеÑī": 143299, - "ĠпомеÑīениÑı": 143300, - "Ġпомог": 132050, - "ĠпоможеÑĤ": 141075, - "ĠпомоÑī": 125978, - "ĠпомоÑīи": 135993, - "ĠпомоÑīÑĮ": 140130, - "ĠпомоÑīÑĮÑİ": 132409, - "Ġпон": 141688, - "ĠпонÑĢав": 141689, - "ĠпонÑĢави": 141690, - "Ġпоп": 133049, - "ĠпопÑĥ": 133050, - "ĠпопÑĥлÑıÑĢ": 133051, - "ĠпоÑĢ": 90046, - "ĠпоÑĢÑĤал": 142606, - "ĠпоÑĢÑıд": 142265, - "ĠпоÑĢÑıдке": 142266, - "ĠпоÑģк": 138727, - "ĠпоÑģколÑĮ": 138728, - "ĠпоÑģколÑĮкÑĥ": 138729, - "ĠпоÑģл": 60713, - "ĠпоÑģле": 128693, - "ĠпоÑģлед": 90567, - "ĠпоÑģледние": 142396, - "ĠпоÑģÑĤоÑı": 127768, - "ĠпоÑģÑĤоÑıн": 127769, - "ĠпоÑģÑĤоÑıнн": 143545, - "ĠпоÑģÑĤоÑıнно": 135605, - "ĠпоÑĤ": 80703, - "ĠпоÑĤеÑĢ": 142523, - "ĠпоÑĤеÑĢÑı": 142524, - "ĠпоÑĤом": 133931, - "ĠпоÑĤомÑĥ": 132903, - "ĠпоÑĤÑĢеб": 142516, - "ĠпоÑĤÑĢебиÑĤел": 142517, - "ĠпоÑĩ": 135003, - "ĠпоÑĩем": 137323, - "ĠпоÑĩемÑĥ": 137324, - "ĠпоÑĩÑĤи": 135004, - "ĠпоÑįÑĤомÑĥ": 131603, - "ĠпоÑı": 134484, - "ĠпоÑıви": 134485, - "ĠпÑĢ": 12281, - "ĠпÑĢав": 72126, - "ĠпÑĢава": 136468, - "ĠпÑĢавила": 138700, - "ĠпÑĢавило": 139577, - "ĠпÑĢавилÑĮно": 135544, - "ĠпÑĢавиÑĤелÑĮ": 140727, - "ĠпÑĢавиÑĤелÑĮÑģÑĤв": 140728, - "ĠпÑĢаво": 132092, - "ĠпÑĢаз": 137963, - "ĠпÑĢазд": 137964, - "ĠпÑĢаздник": 137965, - "ĠпÑĢакÑĤи": 135083, - "ĠпÑĢакÑĤиÑĩ": 135084, - "ĠпÑĢакÑĤиÑĩеÑģ": 135085, - "ĠпÑĢакÑĤиÑĩеÑģки": 135086, - "ĠпÑĢе": 126384, - "ĠпÑĢед": 56825, - "ĠпÑĢедлаг": 138900, - "ĠпÑĢедлагаеÑĤ": 138901, - "ĠпÑĢедложениÑı": 142927, - "ĠпÑĢедмеÑĤ": 136705, - "ĠпÑĢедн": 141259, - "ĠпÑĢедназ": 141260, - "ĠпÑĢедназнаÑĩен": 141261, - "ĠпÑĢедоÑģÑĤ": 127987, - "ĠпÑĢедоÑģÑĤав": 127988, - "ĠпÑĢедоÑģÑĤавлен": 140796, - "ĠпÑĢедоÑģÑĤавлÑı": 138499, - "ĠпÑĢедпоÑĩ": 143620, - "ĠпÑĢедпÑĢи": 139827, - "ĠпÑĢедпÑĢиÑıÑĤиÑı": 139828, - "ĠпÑĢедÑģÑĤав": 125975, - "ĠпÑĢедÑģÑĤавлен": 132363, - "ĠпÑĢедÑģÑĤавлÑı": 142364, - "ĠпÑĢедÑģÑĤавлÑıеÑĤ": 141107, - "ĠпÑĢедÑĥÑģ": 142424, - "ĠпÑĢедÑĥÑģмоÑĤÑĢ": 142425, - "ĠпÑĢедÑĥÑģмоÑĤÑĢен": 142426, - "ĠпÑĢеж": 142388, - "ĠпÑĢежде": 142389, - "ĠпÑĢез": 137703, - "ĠпÑĢезиденÑĤ": 137704, - "ĠпÑĢеим": 139338, - "ĠпÑĢеимÑĥÑīеÑģÑĤв": 139339, - "ĠпÑĢек": 137061, - "ĠпÑĢекÑĢаÑģ": 137062, - "ĠпÑĢекÑĢаÑģн": 137063, - "ĠпÑĢеп": 133693, - "ĠпÑĢепаÑĢаÑĤ": 133694, - "ĠпÑĢи": 36305, - "ĠпÑĢид": 142895, - "ĠпÑĢидеÑĤÑģÑı": 142896, - "ĠпÑĢием": 134011, - "ĠпÑĢизна": 132545, - "ĠпÑĢим": 127670, - "ĠпÑĢимен": 127671, - "ĠпÑĢименениÑı": 143175, - "ĠпÑĢименÑı": 134792, - "ĠпÑĢимеÑĢ": 131616, - "ĠпÑĢин": 126017, - "ĠпÑĢиним": 133026, - "ĠпÑĢинима": 133027, - "ĠпÑĢинÑĨип": 136396, - "ĠпÑĢинÑı": 141365, - "ĠпÑĢинÑıл": 141366, - "ĠпÑĢиÑĩ": 131207, - "ĠпÑĢиÑĩин": 131208, - "ĠпÑĢиÑıÑĤ": 138513, - "ĠпÑĢиÑıÑĤн": 138514, - "ĠпÑĢо": 40191, - "ĠпÑĢоб": 126963, - "ĠпÑĢоблем": 126964, - "ĠпÑĢоблемÑĭ": 136696, - "ĠпÑĢов": 61215, - "ĠпÑĢовед": 127950, - "ĠпÑĢоведен": 137831, - "ĠпÑĢоведениÑı": 139867, - "ĠпÑĢовеÑĢ": 68456, - "ĠпÑĢог": 141079, - "ĠпÑĢогн": 141080, - "ĠпÑĢогноз": 141081, - "ĠпÑĢогÑĢам": 80362, - "ĠпÑĢогÑĢамм": 93408, - "ĠпÑĢогÑĢаммÑĭ": 136059, - "ĠпÑĢод": 88615, - "ĠпÑĢодол": 139935, - "ĠпÑĢодолж": 136702, - "ĠпÑĢодолжа": 136703, - "ĠпÑĢодÑĥк": 128086, - "ĠпÑĢодÑĥкÑĤов": 143578, - "ĠпÑĢодÑĥкÑĨии": 139814, - "ĠпÑĢоекÑĤ": 129708, - "ĠпÑĢож": 141933, - "ĠпÑĢожива": 141934, - "ĠпÑĢоиз": 126034, - "ĠпÑĢоизведен": 142292, - "ĠпÑĢоизвод": 137852, - "ĠпÑĢоизводÑģÑĤва": 137853, - "ĠпÑĢоиÑģ": 136829, - "ĠпÑĢоиÑģÑħодиÑĤ": 136830, - "ĠпÑĢоÑģ": 140668, - "ĠпÑĢоÑģмоÑĤÑĢ": 140669, - "ĠпÑĢоÑģÑĤ": 129020, - "ĠпÑĢоÑģÑĤо": 129021, - "ĠпÑĢоÑĤ": 127351, - "ĠпÑĢоÑĤив": 127352, - "ĠпÑĢоÑĤиво": 135095, - "ĠпÑĢоÑĦеÑģÑģиона": 134391, - "ĠпÑĢоÑĦеÑģÑģионалÑĮн": 134392, - "ĠпÑĢоÑĨ": 125697, - "ĠпÑĢоÑĨед": 136920, - "ĠпÑĢоÑĨедÑĥÑĢ": 136921, - "ĠпÑĢоÑĨенÑĤ": 138083, - "ĠпÑĢоÑĨеÑģÑģ": 129644, - "ĠпÑĢоÑĩ": 133140, - "ĠпÑĢÑı": 135150, - "ĠпÑĢÑıмо": 135151, - "ĠпÑģ": 140581, - "ĠпÑģиÑħ": 140582, - "ĠпÑģиÑħолог": 140583, - "ĠпÑĥ": 141385, - "ĠпÑĥнк": 136095, - "ĠпÑĥнкÑĤ": 136096, - "ĠпÑĥÑĤ": 141859, - "ĠпÑĥÑĤеÑĪ": 141860, - "ĠпÑĥÑĤеÑĪеÑģÑĤв": 141861, - "ĠпÑĥÑĤи": 141386, - "ĠпÑĭÑĤа": 138725, - "ĠпÑıÑĤ": 132000, - "ĠÐIJ": 56755, - "ĠÐIJв": 138307, - "ĠÐIJвÑĤоÑĢ": 138308, - "ĠÐIJл": 134653, - "ĠÐIJлекÑģ": 133865, - "ĠÐIJлекÑģан": 133866, - "ĠÐIJлекÑģандÑĢ": 133867, - "ĠÐIJн": 127128, - "ĠÐIJна": 138937, - "ĠÐIJндÑĢ": 137882, - "ĠÐIJÑĢ": 131083, - "ĠÐij": 63471, - "ĠÐijа": 132223, - "ĠÐijез": 139335, - "ĠÐijеÑģ": 141180, - "ĠÐijо": 131419, - "ĠÐijог": 140506, - "ĠÐijолÑĮ": 136500, - "ĠÐijолÑĮÑĪ": 136501, - "ĠÐijÑĢ": 138930, - "ĠÐijÑĥд": 141920, - "ĠÐĴ": 22933, - "ĠÐĴам": 133535, - "ĠÐĴаÑģ": 133371, - "ĠÐĴаÑĪ": 132165, - "ĠÐĴедÑĮ": 141922, - "ĠÐĴеÑĢ": 137604, - "ĠÐĴлад": 136182, - "ĠÐĴладим": 136183, - "ĠÐĴладимиÑĢ": 136184, - "ĠÐĴо": 129307, - "ĠÐĴоз": 128115, - "ĠÐĴозможно": 143711, - "ĠÐĴоÑĤ": 134948, - "ĠÐĴÑģе": 129117, - "ĠÐĴÑĭ": 71631, - "ĠÐĵ": 60465, - "ĠÐĵлав": 136201, - "ĠÐĵоÑĢ": 139776, - "ĠÐĵÑĢ": 138908, - "ĠÐĶ": 38803, - "ĠÐĶа": 129279, - "ĠÐĶан": 138999, - "ĠÐĶе": 129762, - "ĠÐĶж": 132657, - "ĠÐĶи": 133441, - "ĠÐĶлÑı": 129002, - "ĠÐĶм": 142577, - "ĠÐĶмиÑĤ": 142578, - "ĠÐĶмиÑĤÑĢ": 142579, - "ĠÐĶо": 128734, - "ĠÐķ": 59276, - "ĠÐķго": 138328, - "ĠÐķÑģли": 71144, - "ĠÐķÑģÑĤÑĮ": 139065, - "ĠÐķÑīе": 140725, - "ĠÐĸ": 129219, - "ĠÐĹ": 52577, - "ĠÐĹа": 128460, - "ĠÐĹдеÑģÑĮ": 138505, - "ĠÐĹна": 140226, - "ĠÐĺ": 42796, - "ĠÐĺгÑĢ": 133978, - "ĠÐĺз": 129977, - "ĠÐĺменно": 141552, - "ĠÐĺн": 126895, - "ĠÐĺнÑĤеÑĢ": 138586, - "ĠÐĺнÑĤеÑĢнеÑĤ": 138587, - "ĠÐĺÑģ": 133158, - "ĠÐļ": 35379, - "ĠÐļа": 128889, - "ĠÐļак": 128654, - "ĠÐļаÑĢ": 133387, - "ĠÐļи": 127465, - "ĠÐļиев": 138868, - "ĠÐļо": 129911, - "ĠÐļогда": 134937, - "ĠÐļол": 137686, - "ĠÐļом": 133412, - "ĠÐļон": 127443, - "ĠÐļонеÑĩно": 143194, - "ĠÐļоÑĢ": 134610, - "ĠÐļÑĢоме": 134429, - "ĠÐļÑĥ": 132100, - "ĠÐĽ": 124805, - "ĠÐĽÐ°": 135427, - "ĠÐĽÐµ": 131884, - "ĠÐĽÐ¸": 131895, - "ĠÐĽÑİ": 138817, - "ĠÐĽÑİб": 138818, - "ĠÐľ": 44358, - "ĠÐľÐ°": 129047, - "ĠÐľÐ°Ðº": 138047, - "ĠÐľÐ°ÑĢи": 141058, - "ĠÐľÐµ": 129633, - "ĠÐľÐµÐ¶Ð´Ñĥ": 142160, - "ĠÐľÐ¸": 132511, - "ĠÐľÐ¸Ð½": 134279, - "ĠÐľÐ½Ðµ": 140704, - "ĠÐľÐ¾": 129494, - "ĠÐľÐ¾Ð¶ÐµÑĤ": 143685, - "ĠÐľÐ¾Ð¶Ð½Ð¾": 139490, - "ĠÐľÐ¾Ñģ": 125386, - "ĠÐľÐ¾Ñģк": 126082, - "ĠÐľÐ¾Ñģква": 137639, - "ĠÐľÐ¾Ñģкве": 134464, - "ĠÐľÐ¾ÑģквÑĭ": 141594, - "ĠÐľÐ¾Ñģков": 141897, - "ĠÐľÐ¾ÑģковÑģк": 141898, - "ĠÐľÑĭ": 130275, - "ĠÐĿ": 34789, - "ĠÐĿа": 128313, - "ĠÐĿапÑĢимеÑĢ": 140085, - "ĠÐĿе": 128544, - "ĠÐĿи": 130952, - "ĠÐĿо": 128543, - "ĠÐĿово": 130922, - "ĠÐĿÑĥ": 132965, - "ĠÐŀ": 34348, - "ĠÐŀб": 79698, - "ĠÐŀд": 132593, - "ĠÐŀднако": 132594, - "ĠÐŀн": 129917, - "ĠÐŀна": 135432, - "ĠÐŀни": 133482, - "ĠÐŀÐŀ": 139283, - "ĠÐŀÐŀÐŀ": 139284, - "ĠÐŀÑģоб": 143345, - "ĠÐŀÑģобенно": 143346, - "ĠÐŀÑĤ": 128876, - "ĠÐŀÑĩ": 140152, - "ĠÐŀÑĩенÑĮ": 140153, - "ĠÐŁ": 22419, - "ĠÐŁÐ°": 133059, - "ĠÐŁÐ°ÑĢ": 137353, - "ĠÐŁÐµÑĢ": 135067, - "ĠÐŁÐµÑĢв": 135068, - "ĠÐŁÐµÑĢе": 132578, - "ĠÐŁÐµÑĤ": 140710, - "ĠÐŁÐµÑĤÑĢ": 140711, - "ĠÐŁÐ¾": 126206, - "ĠÐŁÐ¾Ð´": 130041, - "ĠÐŁÐ¾Ð»": 134922, - "ĠÐŁÐ¾Ð»ÑĥÑĩ": 88933, - "ĠÐŁÐ¾Ñģ": 131374, - "ĠÐŁÐ¾Ñģле": 131375, - "ĠÐŁÐ¾Ñĩ": 143171, - "ĠÐŁÐ¾Ñĩем": 143172, - "ĠÐŁÐ¾ÑĩемÑĥ": 143173, - "ĠÐŁÐ¾ÑįÑĤомÑĥ": 133841, - "ĠÐŁÑĢ": 79484, - "ĠÐŁÑĢе": 134004, - "ĠÐŁÑĢед": 132419, - "ĠÐŁÑĢи": 128462, - "ĠÐŁÑĢо": 128598, - "ĠÐł": 48420, - "ĠÐłÐ¤": 131177, - "ĠÐłÐ°": 130114, - "ĠÐłÐ°Ð·": 127088, - "ĠÐłÐ°Ð·Ð¼ÐµÑĢ": 143040, - "ĠÐłÐ°Ñģ": 133199, - "ĠÐłÐµ": 129170, - "ĠÐłÐµÑģп": 142155, - "ĠÐłÐµÑģпÑĥб": 142156, - "ĠÐłÐµÑģпÑĥблик": 142157, - "ĠÐłÐ¾": 130026, - "ĠÐłÐ¾Ñģ": 125598, - "ĠÐłÐ¾ÑģÑģ": 125599, - "ĠÐłÐ¾ÑģÑģии": 129069, - "ĠÐłÐ¾ÑģÑģий": 136069, - "ĠÐłÐ¾ÑģÑģийÑģкой": 136070, - "ĠÐłÐ¾ÑģÑģиÑı": 137421, - "ĠÐłÑĥÑģ": 140869, - "ĠÐŃ": 80429, - "ĠÐŃÑĤ": 139470, - "ĠÐŃÑĤи": 141726, - "ĠÐŃÑĤо": 128868, - "ĠÐŃÑĤоÑĤ": 139471, - "ĠÑ": 8839, - "ĠÑĢ": 18108, - "ĠÑĢа": 142014, - "ĠÑĢаÐ": 24212, - "ĠÑĢабоÑĤ": 53104, - "ĠÑĢабоÑĤа": 129897, - "ĠÑĢабоÑĤаеÑĤ": 136533, - "ĠÑĢабоÑĤе": 135088, - "ĠÑĢабоÑĤник": 137271, - "ĠÑĢабоÑĤÑĥ": 133400, - "ĠÑĢабоÑĤÑĭ": 94867, - "ĠÑĢав": 135933, - "ĠÑĢавно": 135934, - "ĠÑĢад": 134296, - "ĠÑĢади": 134297, - "ĠÑĢаз": 38379, - "ĠÑĢазв": 139098, - "ĠÑĢазвива": 139099, - "ĠÑĢазвиÑĤ": 127416, - "ĠÑĢазвиÑĤие": 139853, - "ĠÑĢазвиÑĤиÑı": 133079, - "ĠÑĢаздел": 132528, - "ĠÑĢазлиÑĩ": 127810, - "ĠÑĢазлиÑĩнÑĭе": 142491, - "ĠÑĢазлиÑĩнÑĭÑħ": 136004, - "ĠÑĢазмеÑĢ": 99047, - "ĠÑĢазмеÑīен": 141011, - "ĠÑĢазнÑĭÑħ": 137396, - "ĠÑĢай": 127233, - "ĠÑĢайон": 132025, - "ĠÑĢайона": 138452, - "ĠÑĢам": 138722, - "ĠÑĢамкаÑħ": 138723, - "ĠÑĢан": 128177, - "ĠÑĢанее": 142113, - "ĠÑĢанÑĮ": 142816, - "ĠÑĢанÑĮÑĪе": 142817, - "ĠÑĢаÑģ": 77776, - "ĠÑĢаÑģпол": 134425, - "ĠÑĢаÑģполож": 134426, - "ĠÑĢаÑģположен": 134427, - "ĠÑĢаÑģпÑĢ": 140972, - "ĠÑĢаÑģпÑĢоÑģÑĤ": 140973, - "ĠÑĢаÑģпÑĢоÑģÑĤÑĢан": 140974, - "ĠÑĢаÑģпÑĢоÑģÑĤÑĢанен": 140975, - "ĠÑĢаÑģÑģ": 125326, - "ĠÑĢаÑģÑģказ": 143631, - "ĠÑĢаÑģÑģказал": 141195, - "ĠÑĢаÑģÑģказÑĭва": 143632, - "ĠÑĢаÑģÑģмаÑĤ": 142145, - "ĠÑĢаÑģÑģмаÑĤÑĢ": 142146, - "ĠÑĢаÑģÑģмаÑĤÑĢива": 142147, - "ĠÑĢаÑģÑĤв": 142015, - "ĠÑĢаÑģÑĤвоÑĢ": 142016, - "ĠÑĢаÑģÑħод": 137540, - "ĠÑĢаÑģÑĩеÑĤ": 139973, - "ĠÑĢе": 124619, - "ĠÑĢеак": 143605, - "ĠÑĢеакÑĨи": 143606, - "ĠÑĢеализ": 139754, - "ĠÑĢеализаÑĨи": 139755, - "ĠÑĢеалÑĮно": 139395, - "ĠÑĢеб": 135821, - "ĠÑĢебен": 135822, - "ĠÑĢебенка": 135823, - "ĠÑĢег": 142405, - "ĠÑĢегиона": 142406, - "ĠÑĢегиÑģÑĤ": 135146, - "ĠÑĢегиÑģÑĤÑĢа": 135147, - "ĠÑĢегиÑģÑĤÑĢаÑĨии": 135148, - "ĠÑĢеж": 133887, - "ĠÑĢежим": 133888, - "ĠÑĢезÑĥлÑĮÑĤаÑĤ": 98200, - "ĠÑĢезÑĥлÑĮÑĤаÑĤе": 137580, - "ĠÑĢей": 143894, - "ĠÑĢейÑĤ": 143895, - "ĠÑĢейÑĤинг": 143896, - "ĠÑĢек": 133962, - "ĠÑĢекл": 133963, - "ĠÑĢеклам": 133964, - "ĠÑĢем": 132912, - "ĠÑĢемонÑĤ": 132913, - "ĠÑĢеÑģÑĤ": 142710, - "ĠÑĢеÑģÑĤоÑĢ": 142711, - "ĠÑĢеÑģÑĤоÑĢан": 142712, - "ĠÑĢеÑĨеп": 138852, - "ĠÑĢеÑĨепÑĤ": 138853, - "ĠÑĢеÑĪ": 126091, - "ĠÑĢеÑĪа": 141682, - "ĠÑĢеÑĪение": 134746, - "ĠÑĢеÑĪениÑı": 136080, - "ĠÑĢеÑĪи": 136991, - "ĠÑĢеÑĪил": 136992, - "ĠÑĢиÑģк": 136802, - "ĠÑĢод": 129757, - "ĠÑĢож": 142486, - "ĠÑĢожд": 142487, - "ĠÑĢождениÑı": 142488, - "ĠÑĢол": 143528, - "ĠÑĢоли": 143529, - "ĠÑĢолÑĮ": 141432, - "ĠÑĢом": 143724, - "ĠÑĢоман": 143725, - "ĠÑĢÑĥб": 126582, - "ĠÑĢÑĥблей": 131473, - "ĠÑĢÑĥк": 126722, - "ĠÑĢÑĥков": 131850, - "ĠÑĢÑĥковод": 131851, - "ĠÑĢÑĭ": 127633, - "ĠÑĢÑĭб": 134542, - "ĠÑĢÑĭн": 139929, - "ĠÑĢÑĭнке": 139930, - "ĠÑĢÑıд": 140283, - "ĠÑĢÑıдом": 140284, - "ĠÑģ": 5409, - "ĠÑģай": 82362, - "ĠÑģайÑĤ": 130644, - "ĠÑģайÑĤа": 134249, - "ĠÑģайÑĤе": 131595, - "ĠÑģам": 96085, - "ĠÑģами": 137830, - "ĠÑģамо": 129355, - "ĠÑģамого": 140205, - "ĠÑģамом": 136147, - "ĠÑģамоÑģÑĤоÑı": 139025, - "ĠÑģамоÑģÑĤоÑıÑĤелÑĮно": 139026, - "ĠÑģамÑĭе": 139149, - "ĠÑģамÑĭй": 139524, - "ĠÑģамÑĭм": 138766, - "ĠÑģамÑĭÑħ": 135041, - "ĠÑģаÑħ": 143708, - "ĠÑģаÑħаÑĢ": 143709, - "ĠÑģбоÑĢ": 134005, - "ĠÑģв": 44816, - "ĠÑģвеÑĤ": 130865, - "ĠÑģво": 124460, - "ĠÑģвоб": 134387, - "ĠÑģвобод": 134388, - "ĠÑģвое": 133375, - "ĠÑģвоего": 133520, - "ĠÑģвоей": 131189, - "ĠÑģвоем": 136548, - "ĠÑģвои": 131382, - "ĠÑģвоим": 136173, - "ĠÑģвоими": 137581, - "ĠÑģвоиÑħ": 132393, - "ĠÑģвой": 130210, - "ĠÑģвоÑİ": 131398, - "ĠÑģвÑıз": 126032, - "ĠÑģвÑıзан": 133287, - "ĠÑģвÑıзи": 134023, - "ĠÑģдел": 125871, - "ĠÑģдела": 134943, - "ĠÑģделал": 140896, - "ĠÑģделаÑĤÑĮ": 130965, - "ĠÑģеб": 126564, - "ĠÑģебе": 130688, - "ĠÑģебÑı": 129364, - "ĠÑģегоднÑı": 132110, - "ĠÑģез": 135070, - "ĠÑģезон": 135071, - "ĠÑģейÑĩаÑģ": 131405, - "ĠÑģек": 143542, - "ĠÑģекÑĢ": 143543, - "ĠÑģекÑĢеÑĤ": 143544, - "ĠÑģем": 127258, - "ĠÑģемей": 140054, - "ĠÑģемÑĮ": 132176, - "ĠÑģенÑĤ": 140185, - "ĠÑģенÑĤÑı": 140186, - "ĠÑģенÑĤÑıбÑĢÑı": 140187, - "ĠÑģеÑĢ": 65286, - "ĠÑģеÑĢвеÑĢ": 92764, - "ĠÑģеÑĢвиÑģ": 137317, - "ĠÑģеÑĢи": 143182, - "ĠÑģеÑĢиал": 143183, - "ĠÑģеÑĢии": 141827, - "ĠÑģеÑĢÑĮ": 139998, - "ĠÑģеÑĢÑĮезн": 139999, - "ĠÑģеÑĤ": 137528, - "ĠÑģеÑĤи": 137529, - "ĠÑģиг": 141204, - "ĠÑģигнал": 141205, - "ĠÑģил": 130386, - "ĠÑģилÑĮно": 137947, - "ĠÑģимв": 77912, - "ĠÑģимвол": 141802, - "ĠÑģиÑģÑĤем": 91999, - "ĠÑģиÑģÑĤема": 134450, - "ĠÑģиÑģÑĤемÑĭ": 131773, - "ĠÑģиÑĤ": 128050, - "ĠÑģиÑĤÑĥ": 128051, - "ĠÑģиÑĤÑĥаÑĨии": 139367, - "ĠÑģиÑĤÑĥаÑĨиÑı": 142985, - "ĠÑģк": 68371, - "ĠÑģка": 131682, - "ĠÑģказал": 133260, - "ĠÑģказаÑĤÑĮ": 136670, - "ĠÑģкаÑĩ": 131683, - "ĠÑģкаÑĩаÑĤÑĮ": 131684, - "ĠÑģкоÑĢ": 143688, - "ĠÑģкоÑĢо": 138366, - "ĠÑģкоÑĢоÑģÑĤÑĮ": 143689, - "ĠÑģл": 34775, - "ĠÑģлед": 92029, - "ĠÑģледÑĥеÑĤ": 132996, - "ĠÑģли": 140827, - "ĠÑģлиÑĪ": 140828, - "ĠÑģлиÑĪком": 140829, - "ĠÑģлов": 91107, - "ĠÑģлова": 135381, - "ĠÑģловам": 138469, - "ĠÑģложно": 136927, - "ĠÑģлÑĥж": 141975, - "ĠÑģлÑĥжбÑĭ": 141976, - "ĠÑģлÑĥÑĩ": 89126, - "ĠÑģлÑĥÑĩа": 129401, - "ĠÑģлÑĥÑĩае": 129402, - "ĠÑģлÑĥÑĩай": 140664, - "ĠÑģлÑĥÑĩаÑı": 141113, - "ĠÑģлÑĥÑĩаÑıÑħ": 141114, - "ĠÑģм": 126762, - "ĠÑģмог": 136406, - "ĠÑģмож": 138931, - "ĠÑģможеÑĤе": 138932, - "ĠÑģмÑĭÑģл": 138869, - "ĠÑģни": 141736, - "ĠÑģнижен": 141737, - "ĠÑģнов": 141029, - "ĠÑģнова": 141030, - "ĠÑģо": 33843, - "ĠÑģоб": 124972, - "ĠÑģобак": 141534, - "ĠÑģобиÑĢа": 138483, - "ĠÑģобой": 133104, - "ĠÑģобÑĢан": 142631, - "ĠÑģобÑģÑĤвенно": 133620, - "ĠÑģобÑĭÑĤи": 143921, - "ĠÑģобÑĭÑĤиÑı": 143922, - "ĠÑģов": 124955, - "ĠÑģовеÑĢ": 128079, - "ĠÑģовеÑĢÑĪ": 139730, - "ĠÑģовеÑĢÑĪен": 142855, - "ĠÑģовеÑĢÑĪенно": 139731, - "ĠÑģовеÑĤ": 131847, - "ĠÑģовÑĢем": 131662, - "ĠÑģовÑĢеменн": 131663, - "ĠÑģовÑģ": 136844, - "ĠÑģовÑģем": 136845, - "ĠÑģог": 132801, - "ĠÑģоглаÑģ": 132802, - "ĠÑģодеÑĢж": 79495, - "ĠÑģодеÑĢжа": 132636, - "ĠÑģодеÑĢжиÑĤ": 143132, - "ĠÑģозд": 51224, - "ĠÑģозда": 130222, - "ĠÑģоздан": 136295, - "ĠÑģозданиÑı": 141132, - "ĠÑģообÑī": 66021, - "ĠÑģообÑīаеÑĤ": 142894, - "ĠÑģообÑīил": 140102, - "ĠÑģооÑĤвеÑĤ": 136783, - "ĠÑģооÑĤвеÑĤÑģÑĤв": 136784, - "ĠÑģооÑĤвеÑĤÑģÑĤвии": 136785, - "ĠÑģоÑģ": 143410, - "ĠÑģоÑģед": 143411, - "ĠÑģоÑģÑĤ": 91075, - "ĠÑģоÑģÑĤав": 126737, - "ĠÑģоÑģÑĤавлÑıеÑĤ": 137851, - "ĠÑģоÑģÑĤо": 140271, - "ĠÑģоÑģÑĤоиÑĤ": 140272, - "ĠÑģоÑģÑĤоÑı": 128134, - "ĠÑģоÑģÑĤоÑıние": 140716, - "ĠÑģоÑģÑĤоÑıнии": 141894, - "ĠÑģоÑĤ": 134715, - "ĠÑģоÑĤÑĢÑĥд": 134716, - "ĠÑģоÑĤÑĢÑĥдник": 134717, - "ĠÑģоÑħ": 143362, - "ĠÑģоÑħÑĢ": 143363, - "ĠÑģоÑħÑĢан": 92681, - "ĠÑģоÑħÑĢани": 143364, - "ĠÑģоÑĨиалÑĮно": 137936, - "ĠÑģоÑĩеÑĤ": 142151, - "ĠÑģоÑĩеÑĤа": 142152, - "ĠÑģп": 83614, - "ĠÑģпе": 136429, - "ĠÑģпеÑĨ": 131548, - "ĠÑģпеÑĨиалÑĮно": 136430, - "ĠÑģпин": 142186, - "ĠÑģпиÑģ": 45630, - "ĠÑģпиÑģка": 97533, - "ĠÑģпиÑģок": 73332, - "ĠÑģпоÑĢÑĤ": 132454, - "ĠÑģпоÑģоб": 129187, - "ĠÑģпÑĢав": 134876, - "ĠÑģÑĢав": 134855, - "ĠÑģÑĢавн": 134856, - "ĠÑģÑĢаз": 133306, - "ĠÑģÑĢазÑĥ": 133307, - "ĠÑģÑĢед": 125265, - "ĠÑģÑĢеди": 134987, - "ĠÑģÑĢедне": 135141, - "ĠÑģÑĢедÑģÑĤв": 130589, - "ĠÑģÑĢедÑģÑĤва": 133198, - "ĠÑģÑĢок": 131561, - "ĠÑģÑģÑĭл": 94394, - "ĠÑģÑĤ": 18362, - "ĠÑģÑĤал": 139426, - "ĠÑģÑĤала": 140325, - "ĠÑģÑĤали": 135906, - "ĠÑģÑĤало": 139427, - "ĠÑģÑĤан": 128130, - "ĠÑģÑĤанд": 137254, - "ĠÑģÑĤандаÑĢÑĤ": 137255, - "ĠÑģÑĤанеÑĤ": 140735, - "ĠÑģÑĤанов": 140661, - "ĠÑģÑĤановиÑĤÑģÑı": 140662, - "ĠÑģÑĤаÑĢ": 129511, - "ĠÑģÑĤаÑĤÑĮ": 129934, - "ĠÑģÑĤен": 134253, - "ĠÑģÑĤеп": 143589, - "ĠÑģÑĤепени": 143590, - "ĠÑģÑĤилÑĮ": 143813, - "ĠÑģÑĤо": 125868, - "ĠÑģÑĤоим": 127854, - "ĠÑģÑĤоимоÑģÑĤи": 143608, - "ĠÑģÑĤоимоÑģÑĤÑĮ": 136467, - "ĠÑģÑĤоиÑĤ": 130960, - "ĠÑģÑĤол": 130297, - "ĠÑģÑĤоÑĢ": 132519, - "ĠÑģÑĤоÑĢо": 133418, - "ĠÑģÑĤоÑĢон": 132520, - "ĠÑģÑĤоÑĢонÑĭ": 133419, - "ĠÑģÑĤÑĢ": 29292, - "ĠÑģÑĤÑĢа": 138032, - "ĠÑģÑĤÑĢан": 126540, - "ĠÑģÑĤÑĢаниÑĨ": 61480, - "ĠÑģÑĤÑĢанÑĭ": 135096, - "ĠÑģÑĤÑĢаÑħ": 138033, - "ĠÑģÑĤÑĢаÑħов": 138034, - "ĠÑģÑĤÑĢем": 140867, - "ĠÑģÑĤÑĢок": 43922, - "ĠÑģÑĤÑĢоки": 92714, - "ĠÑģÑĤÑĥд": 140830, - "ĠÑģÑĤÑĥденÑĤ": 140831, - "ĠÑģÑĥ": 128975, - "ĠÑģÑĥд": 126869, - "ĠÑģÑĥдеб": 142594, - "ĠÑģÑĥдебн": 142595, - "ĠÑģÑĥм": 143433, - "ĠÑģÑĥммÑĥ": 143434, - "ĠÑģÑĥÑīеÑģÑĤв": 127339, - "ĠÑģÑĥÑīеÑģÑĤвÑĥеÑĤ": 142738, - "ĠÑģÑĦ": 142728, - "ĠÑģÑĦеÑĢе": 142729, - "ĠÑģÑĩеÑĤ": 131206, - "ĠÑģÑĩиÑĤ": 130480, - "ĠÑģÑĩиÑĤа": 130481, - "ĠÑģÑĭ": 128167, - "ĠÑģÑĭн": 141723, - "ĠÑģÑĭÑĢ": 142195, - "ĠÑĤ": 10813, - "ĠÑĤаблиÑĨ": 78227, - "ĠÑĤак": 49845, - "ĠÑĤакже": 128547, - "ĠÑĤакие": 132842, - "ĠÑĤаким": 135536, - "ĠÑĤакиÑħ": 133360, - "ĠÑĤакого": 137566, - "ĠÑĤакое": 134322, - "ĠÑĤакой": 131392, - "ĠÑĤам": 130769, - "ĠÑĤе": 126515, - "ĠÑĤеаÑĤ": 142633, - "ĠÑĤеаÑĤÑĢ": 142634, - "ĠÑĤеб": 128071, - "ĠÑĤебе": 141763, - "ĠÑĤебÑı": 139596, - "ĠÑĤек": 49090, - "ĠÑĤекÑģÑĤ": 70895, - "ĠÑĤекÑĥÑī": 85146, - "ĠÑĤеле": 136148, - "ĠÑĤелеÑĦ": 131019, - "ĠÑĤелеÑĦон": 131020, - "ĠÑĤем": 128680, - "ĠÑĤеп": 127623, - "ĠÑĤепеÑĢÑĮ": 134475, - "ĠÑĤепло": 136282, - "ĠÑĤеÑĢ": 135010, - "ĠÑĤеÑĢÑĢиÑĤоÑĢ": 135011, - "ĠÑĤеÑĢÑĢиÑĤоÑĢии": 135012, - "ĠÑĤеÑģÑĤ": 137901, - "ĠÑĤеÑħ": 126468, - "ĠÑĤеÑħнолог": 142650, - "ĠÑĤеÑħнологии": 142651, - "ĠÑĤеÑĩение": 133945, - "ĠÑĤип": 63833, - "ĠÑĤипа": 137796, - "ĠÑĤо": 58246, - "ĠÑĤоваÑĢ": 73712, - "ĠÑĤоваÑĢов": 140659, - "ĠÑĤогда": 134564, - "ĠÑĤого": 128798, - "ĠÑĤож": 131558, - "ĠÑĤоже": 131559, - "ĠÑĤолÑĮко": 73626, - "ĠÑĤом": 128856, - "ĠÑĤомÑĥ": 136392, - "ĠÑĤоÑĢ": 127367, - "ĠÑĤоÑĢг": 132834, - "ĠÑĤоÑĢгов": 132835, - "ĠÑĤоÑĢÑĢ": 137877, - "ĠÑĤоÑĢÑĢенÑĤ": 137878, - "ĠÑĤоÑĤ": 134316, - "ĠÑĤоÑĩ": 81602, - "ĠÑĤоÑĩки": 142996, - "ĠÑĤоÑĩно": 136268, - "ĠÑĤÑĢ": 85895, - "ĠÑĤÑĢав": 137486, - "ĠÑĤÑĢе": 131125, - "ĠÑĤÑĢеб": 126155, - "ĠÑĤÑĢебова": 139907, - "ĠÑĤÑĢебованиÑı": 138412, - "ĠÑĤÑĢебÑĥеÑĤÑģÑı": 143157, - "ĠÑĤÑĢеÑĤÑĮ": 140528, - "ĠÑĤÑĢеÑħ": 138733, - "ĠÑĤÑĢи": 131703, - "ĠÑĤÑĢÑĥб": 138379, - "ĠÑĤÑĢÑĥд": 129771, - "ĠÑĤÑĥ": 141634, - "ĠÑĤÑĥÑĢиÑģÑĤ": 141635, - "ĠÑĤÑĭ": 127429, - "ĠÑĤÑĭÑģ": 138994, - "ĠÑĤÑĭÑģÑı": 133155, - "ĠÑĤÑĭÑģÑıÑĩ": 133156, - "ĠÑĥ": 13932, - "ĠÑĥвели": 136325, - "ĠÑĥвелиÑĩи": 136326, - "ĠÑĥвеÑĢ": 137892, - "ĠÑĥвеÑĢен": 137893, - "ĠÑĥг": 143263, - "ĠÑĥгол": 143264, - "ĠÑĥд": 127189, - "ĠÑĥдал": 57391, - "ĠÑĥдален": 142499, - "ĠÑĥдалоÑģÑĮ": 143954, - "ĠÑĥдаÑĢ": 141344, - "ĠÑĥдоб": 131810, - "ĠÑĥже": 90777, - "ĠÑĥзн": 140802, - "ĠÑĥзна": 140380, - "ĠÑĥзнаÑĤÑĮ": 140803, - "ĠÑĥказ": 67114, - "ĠÑĥказан": 134321, - "ĠÑĥкÑĢа": 138131, - "ĠÑĥкÑĢаин": 138132, - "ĠÑĥме": 137504, - "ĠÑĥни": 142644, - "ĠÑĥнивеÑĢ": 142645, - "ĠÑĥнивеÑĢÑģ": 142646, - "ĠÑĥнивеÑĢÑģиÑĤеÑĤ": 142647, - "ĠÑĥника": 140511, - "ĠÑĥникалÑĮн": 140512, - "ĠÑĥпÑĢав": 135860, - "ĠÑĥпÑĢавлениÑı": 135861, - "ĠÑĥÑĢов": 126146, - "ĠÑĥÑĢовенÑĮ": 137779, - "ĠÑĥÑĢовне": 137485, - "ĠÑĥÑĢовнÑı": 138646, - "ĠÑĥÑģи": 139864, - "ĠÑĥÑģили": 139865, - "ĠÑĥÑģл": 96891, - "ĠÑĥÑģлов": 127757, - "ĠÑĥÑģловиÑı": 127758, - "ĠÑĥÑģловиÑıÑħ": 135447, - "ĠÑĥÑģлÑĥг": 127387, - "ĠÑĥÑģлÑĥги": 136911, - "ĠÑĥÑģп": 81533, - "ĠÑĥÑģпеÑħ": 141656, - "ĠÑĥÑģпеÑĪ": 90513, - "ĠÑĥÑģпеÑĪно": 142982, - "ĠÑĥÑģÑĤанов": 133837, - "ĠÑĥÑģÑĤановлен": 133838, - "ĠÑĥÑģÑĤÑĢой": 142285, - "ĠÑĥÑģÑĤÑĢойÑģÑĤва": 142286, - "ĠÑĥÑĩ": 134889, - "ĠÑĥÑĩаÑģÑĤ": 127609, - "ĠÑĥÑĩаÑģÑĤие": 135119, - "ĠÑĥÑĩаÑģÑĤник": 134389, - "ĠÑĥÑĩеб": 134890, - "ĠÑĥÑĩеÑĤ": 134931, - "ĠÑĥÑĩиÑĤÑĭва": 141816, - "ĠÑĦ": 17574, - "ĠÑĦа": 131494, - "ĠÑĦай": 35256, - "ĠÑĦайл": 46318, - "ĠÑĦайла": 70773, - "ĠÑĦак": 127481, - "ĠÑĦакÑĤ": 133480, - "ĠÑĦакÑĤоÑĢ": 138786, - "ĠÑĦев": 140718, - "ĠÑĦевÑĢа": 140719, - "ĠÑĦевÑĢалÑı": 140720, - "ĠÑĦедеÑĢ": 142868, - "ĠÑĦедеÑĢалÑĮн": 142869, - "ĠÑĦиг": 143372, - "ĠÑĦигÑĥÑĢ": 143373, - "ĠÑĦилÑĮ": 131158, - "ĠÑĦилÑĮм": 131159, - "ĠÑĦин": 135156, - "ĠÑĦинанÑģ": 135157, - "ĠÑĦинанÑģов": 135158, - "ĠÑĦиÑĢ": 138634, - "ĠÑĦиÑĢм": 138635, - "ĠÑĦл": 141316, - "ĠÑĦон": 140406, - "ĠÑĦонд": 140407, - "ĠÑĦоÑĢ": 140167, - "ĠÑĦоÑĢм": 53161, - "ĠÑĦоÑĢма": 135005, - "ĠÑĦоÑĢме": 141342, - "ĠÑĦоÑĢмиÑĢов": 140955, - "ĠÑĦоÑĢмиÑĢова": 140956, - "ĠÑĦоÑĢмÑĥ": 139677, - "ĠÑĦоÑĢмÑĭ": 141092, - "ĠÑĦоÑĢÑĥм": 140168, - "ĠÑĦоÑĤ": 127020, - "ĠÑĦоÑĤо": 130942, - "ĠÑĦоÑĤогÑĢаÑĦ": 137243, - "ĠÑĦÑĥнкÑĨи": 54713, - "ĠÑĦÑĥÑĤ": 138370, - "ĠÑĦÑĥÑĤбол": 138371, - "ĠÑħ": 44558, - "ĠÑħа": 127504, - "ĠÑħаÑĢак": 127505, - "ĠÑħаÑĢакÑĤеÑĢ": 127506, - "ĠÑħаÑĢакÑĤеÑĢиÑģÑĤ": 137677, - "ĠÑħаÑĢакÑĤеÑĢиÑģÑĤик": 137678, - "ĠÑħоз": 140219, - "ĠÑħозÑı": 140220, - "ĠÑħозÑıй": 140221, - "ĠÑħозÑıйÑģÑĤв": 140222, - "ĠÑħолод": 140625, - "ĠÑħоÑĢо": 126824, - "ĠÑħоÑĢоÑĪ": 126825, - "ĠÑħоÑĢоÑĪо": 133097, - "ĠÑħоÑĤ": 125351, - "ĠÑħоÑĤел": 136730, - "ĠÑħоÑĤиÑĤе": 142942, - "ĠÑħоÑĤÑĮ": 142929, - "ĠÑħоÑĤÑı": 132957, - "ĠÑħоÑĩ": 127893, - "ĠÑħоÑĩеÑĤ": 136953, - "ĠÑħоÑĩÑĥ": 143612, - "ĠÑħÑĢ": 133708, - "ĠÑĨ": 38133, - "ĠÑĨвеÑĤ": 129596, - "ĠÑĨел": 129151, - "ĠÑĨелÑĮ": 142963, - "ĠÑĨелÑĮÑİ": 142964, - "ĠÑĨен": 129827, - "ĠÑĨена": 133599, - "ĠÑĨенÑĭ": 134972, - "ĠÑĨиÑĦ": 141615, - "ĠÑĨиÑĦÑĢ": 141616, - "ĠÑĩ": 17307, - "ĠÑĩа": 125948, - "ĠÑĩаÑģ": 127770, - "ĠÑĩаÑģа": 141031, - "ĠÑĩаÑģов": 135612, - "ĠÑĩаÑģÑĤ": 127174, - "ĠÑĩаÑģÑĤи": 132153, - "ĠÑĩаÑģÑĤноÑģÑĤи": 143311, - "ĠÑĩаÑģÑĤо": 131704, - "ĠÑĩаÑģÑĤÑĮ": 131964, - "ĠÑĩаÑīе": 141648, - "ĠÑĩего": 133197, - "ĠÑĩел": 126633, - "ĠÑĩелов": 126634, - "ĠÑĩеловек": 126635, - "ĠÑĩеловека": 130914, - "ĠÑĩем": 128743, - "ĠÑĩеÑĢ": 89111, - "ĠÑĩеÑĢез": 129334, - "ĠÑĩеÑĤ": 139845, - "ĠÑĩеÑĤÑĭ": 139846, - "ĠÑĩеÑĤÑĭÑĢе": 139847, - "ĠÑĩиÑģ": 40076, - "ĠÑĩиÑģл": 135752, - "ĠÑĩиÑģле": 134307, - "ĠÑĩиÑģло": 64519, - "ĠÑĩÑĤ": 69360, - "ĠÑĩÑĤо": 47389, - "ĠÑĩÑĤобÑĭ": 81150, - "ĠÑĩÑĥв": 143774, - "ĠÑĩÑĥвÑģÑĤво": 143775, - "ĠÑĩÑĥÑĤÑĮ": 143425, - "ĠÑĪ": 54517, - "ĠÑĪаг": 140697, - "ĠÑĪиÑĢ": 142704, - "ĠÑĪиÑĢоко": 142705, - "ĠÑĪкол": 131862, - "ĠÑĪколÑĮ": 141712, - "ĠÑĪколÑĮн": 141713, - "ĠÑį": 20928, - "ĠÑįк": 80657, - "ĠÑįкон": 138360, - "ĠÑįконом": 138361, - "ĠÑįкономиÑĩеÑģк": 138362, - "ĠÑįкÑĢан": 141244, - "ĠÑįкÑģ": 132664, - "ĠÑįкÑģп": 137978, - "ĠÑįкÑģпеÑĢÑĤ": 137979, - "ĠÑįлекÑĤ": 131228, - "ĠÑįлекÑĤÑĢо": 131229, - "ĠÑįлеменÑĤ": 44988, - "ĠÑįнеÑĢ": 140228, - "ĠÑįнеÑĢги": 140229, - "ĠÑįÑĤ": 48003, - "ĠÑįÑĤа": 134891, - "ĠÑįÑĤап": 137232, - "ĠÑįÑĤи": 126979, - "ĠÑįÑĤим": 134100, - "ĠÑįÑĤиÑħ": 133142, - "ĠÑįÑĤо": 67879, - "ĠÑįÑĤого": 128866, - "ĠÑįÑĤой": 129892, - "ĠÑįÑĤом": 128649, - "ĠÑįÑĤомÑĥ": 138627, - "ĠÑįÑĤоÑĤ": 129863, - "ĠÑįÑĤÑĥ": 135401, - "ĠÑįÑĦÑĦ": 132716, - "ĠÑįÑĦÑĦекÑĤив": 132717, - "ĠÑı": 45310, - "ĠÑıв": 125609, - "ĠÑıвлÑı": 125610, - "ĠÑıвлÑıеÑĤÑģÑı": 129143, - "ĠÑıвлÑıÑİÑĤÑģÑı": 134958, - "ĠÑıзÑĭк": 130844, - "ĠÑıн": 139550, - "ĠÑıнваÑĢ": 139551, - "ĠÑıнваÑĢÑı": 139552, - "ĠÑĸ": 83854, - "Ġ×": 17284, - "Ġס": 124313, - "Ġספר": 126528, - "Ġספר×Ļ×Ŀ": 135592, - "Ġסר×ĺ": 131079, - "Ġס×ij×Ļ×ij": 136036, - "Ġס×ķ": 129206, - "Ġס×ķ×Ĵ": 137308, - "Ġס×ķ×Ĵ×Ļ": 137309, - "Ġס×Ļ": 128497, - "Ġס×Ļפ×ķר": 131737, - "Ġ×¢": 123855, - "Ġעסק": 136549, - "Ġעסק×Ļ": 137910, - "Ġעסק×Ļ×Ŀ": 136550, - "Ġעצ": 125272, - "Ġעצ×ŀ": 139608, - "Ġעצ×ŀ×ķ": 130758, - "Ġעצ×ŀ×Ļ": 132755, - "Ġעצ×ŀ×Ŀ": 139609, - "Ġ×¢×§×ij": 135654, - "Ġער": 136297, - "Ġער×Ļ׼×Ķ": 136298, - "Ġעש": 134727, - "Ġעשר×ķת": 141077, - "Ġעש×ķ×Ļ": 134728, - "Ġ×¢×ijר": 131917, - "Ġ×¢×ij×ķר": 128952, - "Ġ×¢×ij×ķ×ĵ": 125751, - "Ġ×¢×ij×ķ×ĵת": 139619, - "Ġ×¢×ij×ķ×ĵ×Ķ": 130006, - "Ġ×¢×ij×ķ×ĵ×ķת": 142881, - "Ġ×¢×ĵ": 128372, - "Ġ×¢×ĵ×Ļ": 130713, - "Ġ×¢×ĵ×Ļ×Ļף": 130714, - "Ġ×¢×ķ": 128686, - "Ġ×¢×ķס": 141657, - "Ġ×¢×ķסק": 141658, - "Ġ×¢×ķר": 140857, - "Ġ×¢×ķר׼×Ļ": 140858, - "Ġ×¢×ķש": 127381, - "Ġ×¢×ķש×Ķ": 132888, - "Ġ×¢×ķש×Ļ×Ŀ": 133605, - "Ġ×¢×ķ×ij": 136618, - "Ġ×¢×ķ×ijר": 136554, - "Ġ×¢×ķ×ij×ĵ×Ļ×Ŀ": 136619, - "Ġ×¢×ķ×ĵ": 128524, - "Ġ×¢×ķ׾×Ķ": 134677, - "Ġ×¢×ķ×ŀ": 133273, - "Ġ×¢×ķ×ŀ×ĵ": 133274, - "Ġ×¢×Ļצ×ķ×ij": 131782, - "Ġ×¢×Ľ×©×Ļ×ķ": 130581, - "Ġ×¢×ľ": 126194, - "Ġ×¢×ľ×Ļ×Ķ×Ŀ": 137547, - "Ġ×¢×ľ×Ļ×ķ": 130368, - "Ġ×¢×Ŀ": 128256, - "Ġ×¢×ŀ": 126753, - "Ġ×¢×ŀ×ķ×§": 140788, - "Ġפ": 123991, - "Ġפע": 126639, - "Ġפע×ķ׾×Ķ": 133413, - "Ġפע×Ŀ": 129601, - "Ġפר": 124550, - "Ġפרס": 137467, - "Ġפרס×ķ×Ŀ": 137468, - "Ġפרשת": 141045, - "Ġפר×ķפ": 139946, - "Ġפר×ĺ×Ļ": 127094, - "Ġפר×ĺ×Ļ×ķת": 137588, - "Ġפר×ĺ×Ļ×Ŀ": 137147, - "Ġפר×Ļ": 131760, - "Ġפש×ķ×ĺ": 129389, - "Ġפת": 139262, - "Ġפת×ķ×Ĺ": 139263, - "Ġפת×Ĺ": 136659, - "Ġפ×ķ": 129908, - "Ġפ×ķס": 142321, - "Ġפ×ķס×ĺ×Ļ×Ŀ": 142322, - "Ġפ×Ĺ×ķת": 131115, - "Ġפ×Ļ": 128483, - "Ġפ׳×Ļ": 130265, - "Ġצ": 124393, - "Ġצע×Ļר": 139478, - "Ġצפ×ķ": 138286, - "Ġצר": 125606, - "Ġצר×Ļ×ļ": 129107, - "Ġצר×Ļ׼": 134416, - "Ġצר×Ļ׼×Ķ": 137033, - "Ġצר×Ļ׼×Ļ×Ŀ": 134417, - "Ġצ×ķר×ļ": 134046, - "Ġצ×Ļ×ij×ķר": 134847, - "Ġ×§": 123974, - "Ġקצר": 134751, - "Ġקצת": 130667, - "Ġקר": 129350, - "Ġקשר": 129478, - "Ġקש×Ķ": 131230, - "Ġ×§×ij×ķ×¢": 140103, - "Ġ×§×ķ": 129088, - "Ġ×§×ķפ": 142730, - "Ġ×§×ķר×Ķ": 138633, - "Ġ×§×ķ×ĵ": 127142, - "Ġ×§×ķ×ĵ×Ŀ": 133992, - "Ġ×§×ķ׳": 138981, - "Ġ×§×ĺ": 126035, - "Ġ×§×ĺף": 133389, - "Ġ×§×ĺ׳×Ķ": 139504, - "Ġ×§×ĺ׳×Ļ×Ŀ": 138970, - "Ġ×§×Ļש": 137036, - "Ġ×§×Ļש×ķר×Ļ×Ŀ": 137037, - "Ġ×§×Ļ×ij׾": 132360, - "Ġק׾": 129465, - "Ġק׳": 136488, - "Ġר": 123937, - "Ġרפ×ķ×IJ×Ļ": 134567, - "Ġרק": 128390, - "Ġרש": 126162, - "Ġרש×IJ×Ļ": 143101, - "Ġרש×ķ×ŀ": 139108, - "Ġרש×Ļ×ŀת": 141856, - "Ġר×IJ": 124869, - "Ġר×IJש": 126525, - "Ġר×IJש×ķף": 132455, - "Ġר×IJש×Ļ": 133513, - "Ġר×IJ×ķ×Ļ": 139927, - "Ġר×IJ×Ļת×Ļ": 143537, - "Ġר×ij": 129079, - "Ġר×ij×Ķ": 133524, - "Ġר×ij×ķת": 131674, - "Ġר×ij×Ļ×Ŀ": 129747, - "Ġר×Ĵ׾": 141642, - "Ġר×ķ": 129226, - "Ġר×ķצ×Ķ": 129469, - "Ġר×ķצ×Ļ×Ŀ": 131812, - "Ġר×ķ×IJ×Ķ": 136409, - "Ġר×ķ×ij": 131913, - "Ġר×Ĺ×ij": 134085, - "Ġר×Ĺ×ķ×§": 142118, - "Ġר×Ļ": 129716, - "Ġש": 87798, - "Ġשע": 130202, - "Ġשע×ijר": 135587, - "Ġשע×ķת": 131717, - "Ġ×©×¢×ľ": 134635, - "Ġשצר": 138202, - "Ġשצר×Ļ×ļ": 138203, - "Ġשק": 143487, - "Ġשק×Ļ×ij׾": 143488, - "Ġשק׾": 127798, - "Ġשק׾×Ļ×Ŀ": 139195, - "Ġשר": 129684, - "Ġשש": 132979, - "Ġשת": 129158, - "Ġשת×Ļ": 131513, - "Ġש×IJ": 124508, - "Ġש×IJת": 127598, - "Ġש×IJת×Ķ": 134273, - "Ġש×IJת×Ŀ": 134906, - "Ġש×IJ×Ļ": 134073, - "Ġש×IJ×Ļף": 131794, - "Ġש×IJ×Ļ׳×ķ": 140643, - "Ġש×IJ×Ļ׳×Ŀ": 143693, - "Ġש×IJ׾×Ķ": 136576, - "Ġש×IJ׳": 136370, - "Ġש×IJ׳×Ĺ׳×ķ": 136371, - "Ġש×IJ׳×Ļ": 129557, - "Ġש×ij": 126234, - "Ġש×ij×Ķ": 131861, - "Ġש×ij×ķ": 129670, - "Ġש×Ĵ×Ŀ": 135721, - "Ġש×Ķ": 124601, - "Ġש×Ķת": 131960, - "Ġש×Ķ×ķ×IJ": 128770, - "Ġש×Ķ×Ļ×IJ": 130381, - "Ġש×Ķ×Ļ×Ķ": 132369, - "Ġש×Ķ×Ļ×ķ": 138555, - "Ġש×Ķ×Ŀ": 130325, - "Ġש×ķ": 128945, - "Ġש×ķ×ij": 130953, - "Ġש×ķ׳×Ķ": 136894, - "Ġש×ķ׳×ķת": 133497, - "Ġש×ķ׳×Ļ×Ŀ": 130384, - "Ġש×ĸ×Ķ": 130424, - "Ġש×Ĺ": 129929, - "Ġש×Ĺ×ķר": 139387, - "Ġש×Ļ": 128326, - "Ġש×Ļר×ķת": 127009, - "Ġש×Ļר×ķת×Ļ": 136014, - "Ġש×Ļש": 128756, - "Ġש×Ļ×Ķ": 138409, - "Ġש×Ļ×Ķ×Ļ×Ķ": 138410, - "Ġש×Ļ׼×ķ׾": 139800, - "Ġש×Ļ×ŀ×ķש": 130251, - "Ġש×Ļ׳×ķ×Ļ": 139200, - "Ġש×Ļ׳×ķ×Ļ×Ļ×Ŀ": 139201, - "Ġש׼": 126494, - "Ġש׼×ijר": 140213, - "Ġש׼׾": 132974, - "Ġש׼ף": 135672, - "Ġש׾": 124756, - "Ġש׾×IJ": 128517, - "Ġש׾×Ķ": 126617, - "Ġש׾×Ķ×Ŀ": 129812, - "Ġש׾×ķ": 128581, - "Ġש׾×Ļ": 128554, - "Ġש׾×Ļש×Ļ": 140135, - "Ġש׾×ļ": 128723, - "Ġש׾׼×Ŀ": 129406, - "Ġש׾׳×ķ": 128733, - "Ġש×Ŀ": 128768, - "Ġש×ŀ": 126222, - "Ġש×ŀ×ķר×ķת": 131739, - "Ġש׳": 128383, - "Ġ×©×ł×ª": 133581, - "Ġש׳×Ķ": 129391, - "Ġש׳×Ļ": 128735, - "Ġש׳×Ļת": 139259, - "Ġש׳×Ļ×ª×Ł": 139260, - "Ġש׳×Ļ×Ŀ": 129051, - "Ġת": 123921, - "Ġתע": 133739, - "Ġתפ": 135655, - "Ġתפק×Ļ×ĵ": 136066, - "Ġתש": 131784, - "Ġ×ª×©×ľ×ķ×Ŀ": 140452, - "Ġתת": 134831, - "Ġת×IJ": 132517, - "Ġת×Ĵ×ķ×ij×Ķ": 131690, - "Ġת×Ĵ×ķ×ij×ķת": 132081, - "Ġת×Ķ": 134020, - "Ġת×Ķ×Ļ×Ķ": 134021, - "Ġת×ķ": 129440, - "Ġת×ķר×Ķ": 140534, - "Ġת×ķ×ĵ×Ķ": 131027, - "Ġת×ķ×ļ": 130792, - "Ġת×ķ׼": 127557, - "Ġת×ķ׼׾": 140418, - "Ġת×ķ׼׾×ķ": 133974, - "Ġת×ķ׼׳": 139689, - "Ġת×Ļ×§": 136638, - "Ġ×ª×ľ": 126758, - "Ġ×ª×ľ×ķ×Ļ": 139590, - "Ġת×ŀ": 133596, - "Ġת×ŀ×ķ׳×Ķ": 139823, - "Ġת×ŀ×Ļ×ĵ": 130308, - "Ġ×ª×ł": 131934, - "Ġ×ª×ł×IJ×Ļ": 131935, - "Ġ×IJ": 61960, - "Ġ×IJס×ķר": 141705, - "Ġ×IJ×£": 129540, - "Ġ×IJפשר": 126378, - "Ġ×IJפשר×ķת": 137710, - "Ġ×IJפ×Ļ׾×ķ": 131061, - "Ġ×IJצ׾": 126820, - "Ġ×IJצ׾׳×ķ": 138877, - "Ġ×IJר": 128789, - "Ġ×IJש": 130782, - "Ġ×IJשר": 128645, - "Ġ×IJת": 125005, - "Ġ×IJתר": 126788, - "Ġ×IJתר×Ļ×Ŀ": 130605, - "Ġ×IJת×Ķ": 128810, - "Ġ×IJ×ª×Ľ×Ŀ": 136104, - "Ġ×IJת×Ŀ": 129146, - "Ġ×IJ×ijר×Ķ": 143354, - "Ġ×IJ×ijר×Ķ×Ŀ": 143355, - "Ġ×IJ×ij×Ļ": 131785, - "Ġ×IJ×ij×Ļ×ij": 129811, - "Ġ×IJ×ij׾": 128343, - "Ġ×IJ×ĵ×Ŀ": 129412, - "Ġ×IJ×Ķ": 139452, - "Ġ×IJ×Ķ×ijת×Ļ": 139453, - "Ġ×IJ×ķ": 128255, - "Ġ×IJ×ķר": 129997, - "Ġ×IJ×ķת": 124507, - "Ġ×IJ×ķת×Ķ": 129272, - "Ġ×IJ×ķת×ķ": 128532, - "Ġ×IJ×ķת×Ļ": 129990, - "Ġ×IJ×ķת×ļ": 133025, - "Ġ×IJ×ķת×Ŀ": 129394, - "Ġ×IJ×ķ×ª×Ł": 138305, - "Ġ×IJ×ķ×ª×ł×ķ": 132817, - "Ġ×IJ×ķ×ĵ×ķת": 134767, - "Ġ×IJ×ķ×Ķ": 128163, - "Ġ×IJ×ķ×Ķ×ijת": 141505, - "Ġ×IJ×ķ×Ķ×ij×Ļ×Ŀ": 143361, - "Ġ×IJ×ķ×ķ×Ļר": 142005, - "Ġ×IJ×ķ׾×Ļ": 130432, - "Ġ×IJ×ķ×ŀר": 129552, - "Ġ×IJ×ĸ": 128619, - "Ġ×IJ×ĸר": 142399, - "Ġ×IJ×ĸר×Ĺ×Ļ": 142400, - "Ġ×IJ×Ĺ": 127576, - "Ġ×IJ×Ĺר": 124521, - "Ġ×IJ×Ĺרת": 131406, - "Ġ×IJ×Ĺר×ķת": 135113, - "Ġ×IJ×Ĺר×ķ׳×ķת": 141924, - "Ġ×IJ×Ĺר×ķ׳×Ļ×Ŀ": 142433, - "Ġ×IJ×Ĺר×Ļ": 128709, - "Ġ×IJ×Ĺר×Ļ×Ŀ": 130387, - "Ġ×IJ×Ĺת": 128966, - "Ġ×IJ×Ĺ×ĵ": 128395, - "Ġ×IJ×Ĺ×ķ×ĸ": 138613, - "Ġ×IJ×Ĺ×Ļ": 139934, - "Ġ×IJ×Ļ": 128303, - "Ġ×IJ×Ļפ×Ķ": 139414, - "Ġ×IJ×Ļר×ķ×¢": 136419, - "Ġ×IJ×Ļר×ķ×¢×Ļ×Ŀ": 136420, - "Ġ×IJ×Ļש": 135793, - "Ġ×IJ×Ļש×Ļ": 130982, - "Ġ×IJ×Ļש×Ļת": 135794, - "Ġ×IJ×Ļת": 139430, - "Ġ×IJ×Ļת×ķ": 139431, - "Ġ×IJ×Ļ×ļ": 128829, - "Ġ×IJ×Ļ׼×ķת": 138438, - "Ġ×IJ×Ļ׼×ķת×Ļ": 138439, - "Ġ×IJ×Ļ׾": 138372, - "Ġ×IJ×Ļ×ŀ×Ļ": 142457, - "Ġ×IJ×Ļ×ŀ×Ļ×Ļ׾": 142458, - "Ġ×IJ×Ļף": 128455, - "Ġ×IJ×Ļ׳×Ķ": 133183, - "Ġ×IJ×Ļ׳×ķ": 130256, - "Ġ×IJ×Ļ׳×Ŀ": 135479, - "Ġ×IJ×ļ": 128594, - "Ġ×IJ׼ף": 137152, - "Ġ×IJ׾": 124612, - "Ġ×IJ×ľ×£": 138642, - "Ġ×IJ׾פ×Ļ": 139879, - "Ġ×IJ׾ק": 135299, - "Ġ×IJ׾ק×ĺר": 135300, - "Ġ×IJ׾ק×ĺר×ķ׳×Ļ": 135301, - "Ġ×IJ׾×IJ": 128919, - "Ġ×IJ׾×Ķ": 129672, - "Ġ×IJ׾×ķ": 129474, - "Ġ×IJ׾×Ļ×Ķ": 134498, - "Ġ×IJ׾×Ļ×ķ": 134332, - "Ġ×IJ׾×Ļ׳×ķ": 141006, - "Ġ×IJ×Ŀ": 128316, - "Ġ×IJ×ŀר": 129042, - "Ġ×IJ×ŀ×Ļת×Ļ": 135924, - "Ġ×IJ×ŀ׳": 139129, - "Ġ×IJ×ŀ׳×Ŀ": 139130, - "Ġ×IJ׳": 125594, - "Ġ×IJ׳ש×Ļ×Ŀ": 129403, - "Ġ×IJ׳×ķ": 129172, - "Ġ×IJ׳×Ĺ׳×ķ": 129055, - "Ġ×IJ׳×Ļ": 128297, - "Ġ×ij": 88531, - "Ġ×ijס": 125684, - "Ġ×ijספר": 136321, - "Ġ×ijס×ĵר": 136099, - "Ġ×ij×¢": 124182, - "Ġ×ijעצ": 138257, - "Ġ×ijעצ×Ŀ": 138258, - "Ġ×ijעת": 134555, - "Ġ×ij×¢×ijר": 136477, - "Ġ×ij×¢×ķ×ĵ": 135857, - "Ġ×ij×¢×ķ׾×Ŀ": 129973, - "Ġ×ij×¢×ĸר": 138297, - "Ġ×ij×¢×ĸרת": 138298, - "Ġ×ij×¢×Ļקר": 132480, - "Ġ×ij×¢×Ļר": 134474, - "Ġ×ij×¢×Ļ׳×Ļ": 136918, - "Ġ×ij×¢×ľ": 129746, - "Ġ×ij×¢×ľ×Ļ": 130703, - "Ġ×ijפ×Ļ×Ļס×ij×ķ×§": 138042, - "Ġ×ijפ׳×Ļ": 131995, - "Ġ×ijצ": 127047, - "Ġ×ijצ×ķר×Ķ": 131086, - "Ġ×ijקר×ij": 136377, - "Ġ×ij×§×ķ": 135044, - "Ġ×ijק׾": 142472, - "Ġ×ijק׾×ķת": 142473, - "Ġ×ijר": 124803, - "Ġ×ijרשת": 136394, - "Ġ×ijר×IJש": 133833, - "Ġ×ijר×ķר": 131733, - "Ġ×ijר×Ĺ": 139937, - "Ġ×ijר×Ĺ×ij×Ļ": 139938, - "Ġ×ijר×Ļ×IJ": 131588, - "Ġ×ijש": 124823, - "Ġ×ijש×ij": 127212, - "Ġ×ijש×ij×ķ×¢": 139662, - "Ġ×ijש×ij×Ļ׾": 131914, - "Ġ×ijש׾": 127185, - "Ġ×ijש׾×ij": 137393, - "Ġ×ijש×Ŀ": 136318, - "Ġ×ij×©×ł×ª": 131676, - "Ġ×ijש׳×Ķ": 139198, - "Ġ×ijש׳×Ļ×Ŀ": 138572, - "Ġ×ijת": 125025, - "Ġ×ijת×ķר": 138814, - "Ġ×ijת×ķ×ļ": 131515, - "Ġ×ijת×Ĺ": 130971, - "Ġ×ijת×Ĺ×ķ×Ŀ": 130972, - "Ġ×ij×ª×ľ": 134973, - "Ġ×ij×IJ": 124820, - "Ġ×ij×IJר": 127062, - "Ġ×ij×IJרץ": 131197, - "Ġ×ij×IJר×Ķ": 140698, - "Ġ×ij×IJתר": 129011, - "Ġ×ij×IJ×ķ": 132355, - "Ġ×ij×IJ×ķפף": 129110, - "Ġ×ij×IJ×ķת": 127935, - "Ġ×ij×IJ×ķת×Ķ": 140702, - "Ġ×ij×IJ×ķת×ķ": 137605, - "Ġ×ij×IJ×ĸ×ķר": 134941, - "Ġ×ij×IJ×Ļ": 131992, - "Ġ×ij×IJ×Ļ׳×ĺר׳×ĺ": 136795, - "Ġ×ij×IJ×ŀ": 126536, - "Ġ×ij×IJ×ŀצע": 129267, - "Ġ×ij×IJ×ŀצע×ķת": 129268, - "Ġ×ij×IJ×ŀת": 130979, - "Ġ×ij×ij": 125644, - "Ġ×ij×ij×§": 143393, - "Ġ×ij×ijקש×Ķ": 143394, - "Ġ×ij×ij×ķקר": 142880, - "Ġ×ij×ij×Ļת": 129326, - "Ġ×ij×Ĵ": 125773, - "Ġ×ij×Ĵ×Ļ׾": 137363, - "Ġ×ij×Ĵ×Ļף": 138958, - "Ġ×ij×Ĵ׾": 131948, - "Ġ×ij×Ĵ׾׾": 131949, - "Ġ×ij×ĵר×ļ": 130687, - "Ġ×ij×ĵ×ijר": 139237, - "Ġ×ij×ĵ×Ļ": 131624, - "Ġ×ij×ĵ×Ļ×ķ×§": 131625, - "Ġ×ij×Ķ": 125443, - "Ġ×ij×Ķת": 134130, - "Ġ×ij×Ķת×IJ×Ŀ": 134131, - "Ġ×ij×Ķ×Ĺ׾×ĺ": 136536, - "Ġ×ij×Ķ×Ŀ": 130586, - "Ġ×ij×ķ": 128408, - "Ġ×ij×ĸ×Ķ": 137598, - "Ġ×ij×ĸ׼": 141170, - "Ġ×ij×ĸ׼×ķת": 141171, - "Ġ×ij×ĸ×ŀף": 131814, - "Ġ×ij×Ĺ": 124842, - "Ġ×ij×Ĺש×ij×ķף": 141573, - "Ġ×ij×Ĺ×ĵר": 140471, - "Ġ×ij×Ĺ×ķ": 131259, - "Ġ×ij×Ĺ×Ļ": 127983, - "Ġ×ij×Ĺ×Ļ×Ļ": 138454, - "Ġ×ij×Ĺ×Ļ×Ļ×Ŀ": 140390, - "Ġ×ij×Ĺ×Ļ׳×Ŀ": 143356, - "Ġ×ij×ĺ": 130120, - "Ġ×ij×Ļ": 128851, - "Ġ×ij×Ļ×§": 141561, - "Ġ×ij×Ļקש": 141562, - "Ġ×ij×Ļר×ķש׾×Ļ×Ŀ": 137341, - "Ġ×ij×Ļשר×IJ׾": 129564, - "Ġ×ij×Ļת": 128520, - "Ġ×ij×Ļ×ĵ×Ļ": 135422, - "Ġ×ij×Ļ×ķתר": 128567, - "Ġ×ij×Ļ×ķ×Ŀ": 130433, - "Ġ×ij×Ļ×Ĺ": 140991, - "Ġ×ij×Ļ×Ĺ×ĵ": 140992, - "Ġ×ij×Ļף": 128389, - "Ġ×ij×Ļ׳": 127660, - "Ġ×ij×Ļ׳׾×IJ×ķ×ŀ×Ļ": 143963, - "Ġ×ij׼": 129199, - "Ġ×ij×Ľ×ª×ij": 138781, - "Ġ×ij׼×ļ": 135000, - "Ġ×ij׼׾": 126262, - "Ġ×ij׼׾׾": 131650, - "Ġ×ij׾": 130661, - "Ġ×ij׾×ij×ĵ": 130662, - "Ġ×ij׾×ķ×Ĵ": 137567, - "Ġ×ij׾×Ļ": 129563, - "Ġ×ij×ŀ": 125014, - "Ġ×ij×ŀס": 132928, - "Ġ×ij×ŀס×Ĵר": 132929, - "Ġ×ij×ŀס×Ĵרת": 132930, - "Ġ×ij×ŀצ×ij": 136895, - "Ġ×ij×ŀקר×Ķ": 133664, - "Ġ×ij×ŀקר×Ļ×Ŀ": 142619, - "Ġ×ij×ŀ×§×ķ×Ŀ": 129995, - "Ġ×ij×ŀר׼×ĸ": 137807, - "Ġ×ij×ŀש×ļ": 133517, - "Ġ×ij×ŀ×Ķ": 130806, - "Ġ×ij×ŀ×Ķ׾": 130807, - "Ġ×ij×ŀ×Ķ׾×ļ": 130808, - "Ġ×ij×ŀ×Ĺ×Ļר": 139006, - "Ġ×ij×ŀ×Ļ": 131447, - "Ġ×ij×ŀ×Ļ×ĵ": 135936, - "Ġ×ij×ŀ×Ļ×ĵ×Ķ": 135937, - "Ġ×ij×ŀ×Ļ×ķ×Ĺ×ĵ": 131448, - "Ġ×ijף": 129218, - "Ġ×ij׳": 125278, - "Ġ×ij׳×ķסף": 132993, - "Ġ×ij׳×ķש×IJ": 130886, - "Ġ×ij׳×ķ×Ĵ": 143694, - "Ġ×ij׳×ķ×Ĵ×¢": 143695, - "Ġ×ij׳×Ļ": 126466, - "Ġ×ij׳×Ļ×Ļת": 135548, - "Ġ×Ĵ": 124203, - "Ġ×Ĵר": 129338, - "Ġ×Ĵ×ij×ķ×Ķ": 127449, - "Ġ×Ĵ×ij×ķ×Ķ×Ķ": 133772, - "Ġ×Ĵ×ij×Ļ": 136205, - "Ġ×Ĵ×ĵ": 126527, - "Ġ×Ĵ×ĵ×ķ׾": 129251, - "Ġ×Ĵ×ĵ×ķ׾×Ķ": 133699, - "Ġ×Ĵ×ķפ": 134977, - "Ġ×Ĵ×ķ×Ĵ׾": 143913, - "Ġ×Ĵ×Ļ׾": 131334, - "Ġ×Ĵ×Ŀ": 128274, - "Ġ×ĵ": 124113, - "Ġ×ĵעת": 131076, - "Ġ×ĵ×§×ķת": 132104, - "Ġ×ĵר×ļ": 129487, - "Ġ×ĵר׼×Ļ×Ŀ": 140034, - "Ġ×ĵ×ijר": 128852, - "Ġ×ĵ×ijר×Ļ×Ŀ": 131184, - "Ġ×ĵ×ķ": 128681, - "Ġ×ĵ×ķר": 143078, - "Ġ×ĵ×ķרש": 143079, - "Ġ×ĵ×ķ×IJר": 140360, - "Ġ×ĵ×ķ׾": 136479, - "Ġ×ĵ×ķ׾ר": 136480, - "Ġ×ĵ×Ļ": 128593, - "Ġ×ĵ×Ļ×Ĵ": 141953, - "Ġ×ĵ×Ļ×Ĵ×Ļ×ĺ": 141954, - "Ġ×ĵ×Ļ×Ĵ×Ļ×ĺ׾×Ļ": 141955, - "Ġ×ĵ×Ļף": 130774, - "Ġ×Ķ": 69346, - "Ġ×Ķס": 124622, - "Ġ×Ķספר": 129417, - "Ġ×Ķסר×ĺ": 133284, - "Ġ×Ķס×ķ": 132518, - "Ġ×Ķס×Ļ": 131427, - "Ġ×Ķס×Ļפ×ķר": 137219, - "Ġ×Ķ×¢": 124327, - "Ġ×Ķעסק": 131713, - "Ġ×Ķער×ij": 134250, - "Ġ×Ķ×¢×ij×ķ×ĵ": 131332, - "Ġ×Ķ×¢×ij×ķ×ĵ×Ķ": 131333, - "Ġ×Ķ×¢×ķ×ij": 139546, - "Ġ×Ķ×¢×ķ×ij×ĵ×Ķ": 139547, - "Ġ×Ķ×¢×ķ׾×Ŀ": 130122, - "Ġ×Ķ×¢×Ļ×§": 139625, - "Ġ×Ķ×¢×Ļקר×Ļ": 139626, - "Ġ×Ķ×¢×Ļר": 130189, - "Ġ×Ķ×¢×ľ": 133885, - "Ġ×Ķ×¢×ľ×Ļ": 141134, - "Ġ×Ķ×¢×ľ×Ļ×ķף": 141135, - "Ġ×Ķפ": 126338, - "Ġ×Ķפר": 129161, - "Ġ×Ķפ×ķ×¢×ľ": 136976, - "Ġ×Ķפ×Ļ": 133582, - "Ġ×Ķצ": 124664, - "Ġ×Ķצ×ĵ": 138085, - "Ġ×Ķצ×ĵ×ĵ×Ļ×Ŀ": 138086, - "Ġ×Ķצ×ķר×ļ": 142098, - "Ġ×Ķצ×ĺר": 143397, - "Ġ×Ķצ×ĺרפ×ķ": 143398, - "Ġ×Ķצ×Ļ": 134565, - "Ġ×Ķצ×Ļ×ij": 142427, - "Ġ×Ķצ×Ļ×ij×ķר": 136362, - "Ġ×Ķצ×Ļ×ij×ķר×Ļ": 142428, - "Ġ×Ķצ׾×Ļ×Ĺ": 138223, - "Ġ×Ķ×§": 124814, - "Ġ×Ķקר": 136021, - "Ġ×Ķקר×ķ×ij": 136022, - "Ġ×Ķקשר": 137689, - "Ġ×Ķקש×ķר": 142608, - "Ġ×Ķ×§×ķ": 130877, - "Ġ×Ķ×§×ķ×ĵ": 143289, - "Ġ×Ķ×§×ķ×ĵ×Ŀ": 143290, - "Ġ×Ķק׾": 135599, - "Ġ×Ķר": 125036, - "Ġ×Ķרפ×ķ×IJ×Ļ": 143511, - "Ġ×Ķר×IJש": 125230, - "Ġ×Ķר×IJש×ķף": 130126, - "Ġ×Ķר×IJש×ķ׳×Ķ": 131980, - "Ġ×Ķר×IJש×ķ׳×Ļ×Ŀ": 143268, - "Ġ×Ķר×ij": 129292, - "Ġ×Ķר×ij×Ķ": 128923, - "Ġ×Ķר×Ļ": 129933, - "Ġ×Ķר׼×ij": 133737, - "Ġ×Ķש": 124081, - "Ġ×Ķשק": 136899, - "Ġ×Ķשת": 133313, - "Ġ×Ķש×IJ": 140004, - "Ġ×Ķש×IJ׾×Ķ": 140005, - "Ġ×Ķש×ij×ķ×¢": 133312, - "Ġ×Ķש×ķ׳×Ļ×Ŀ": 140453, - "Ġ×Ķש×Ļ": 130675, - "Ġ×Ķש×Ļר×ķת": 135030, - "Ġ×Ķש×Ļ×ŀ×ķש": 133369, - "Ġ×Ķש׾": 127462, - "Ġ×Ķש׾×Ļש×Ļ": 139709, - "Ġ×Ķש׳×Ķ": 131523, - "Ġ×Ķש׳×Ļ": 126975, - "Ġ×Ķש׳×Ļ×Ļ×Ķ": 139747, - "Ġ×Ķש׳×Ļ×Ŀ": 136001, - "Ġ×Ķת": 125433, - "Ġ×Ķתק": 132166, - "Ġ×Ķת×ij": 141487, - "Ġ×Ķת×ij×Ļ×¢×Ķ": 141488, - "Ġ×Ķת×ķר×Ķ": 139510, - "Ġ×Ķ×IJ": 123960, - "Ġ×Ķ×IJר": 132482, - "Ġ×Ķ×IJרץ": 132483, - "Ġ×Ķ×IJש": 139710, - "Ġ×Ķ×IJתר": 129967, - "Ġ×Ķ×IJ×ĵ×Ŀ": 132209, - "Ġ×Ķ×IJ×ķ": 130090, - "Ġ×Ķ×IJ×ķ×ķ×Ļר": 141248, - "Ġ×Ķ×IJ×Ĺ": 133193, - "Ġ×Ķ×IJ×Ĺר": 125372, - "Ġ×Ķ×IJ×Ĺר×ķף": 133747, - "Ġ×Ķ×IJ×Ĺר×ķ׳×Ķ": 138531, - "Ġ×Ķ×IJ×Ĺר×ķ׳×ķת": 135687, - "Ġ×Ķ×IJ×Ĺר×ķ׳×Ļ×Ŀ": 141646, - "Ġ×Ķ×IJ×Ļ": 129192, - "Ġ×Ķ×IJ×Ļר×ķ×¢": 135907, - "Ġ×Ķ×IJ×Ļש×Ļ": 135724, - "Ġ×Ķ×IJ×Ļ׳×ĺר׳×ĺ": 137593, - "Ġ×Ķ×IJ׾×Ķ": 134912, - "Ġ×Ķ×IJ׾×ķ": 139751, - "Ġ×Ķ×IJ×Ŀ": 128807, - "Ġ×Ķ×IJ×ŀר": 142986, - "Ġ×Ķ×IJ×ŀר×Ļ×§": 142987, - "Ġ×Ķ×IJ×ŀר×Ļ×§×IJ×Ļ": 142988, - "Ġ×Ķ×IJ×ŀ×Ļת×Ļ": 142599, - "Ġ×Ķ×ij": 124815, - "Ġ×Ķ×ij×¢": 139351, - "Ġ×Ķ×ij×¢×Ļ×Ķ": 139352, - "Ġ×Ķ×ijר": 128023, - "Ġ×Ķ×ijר×Ļת": 138864, - "Ġ×Ķ×ijר×Ļ×IJ×ķת": 140756, - "Ġ×Ķ×ij×IJ": 129851, - "Ġ×Ķ×ij×IJ×Ļ×Ŀ": 138161, - "Ġ×Ķ×ij×ķקר": 143690, - "Ġ×Ķ×ij×Ļ": 132824, - "Ġ×Ķ×ij×Ļת": 129073, - "Ġ×Ķ×ij׾": 139244, - "Ġ×Ķ×ij׾×ķ×Ĵ": 139245, - "Ġ×Ķ×Ĵ": 125064, - "Ġ×Ķ×Ĵ×ij×ķ×Ķ": 140875, - "Ġ×Ķ×Ĵ×ĵ×ķ׾": 129682, - "Ġ×Ķ×Ĵ×ķ×£": 136906, - "Ġ×Ķ×Ĵ×Ļ×¢": 130879, - "Ġ×Ķ×ĵ": 126484, - "Ġ×Ķ×ĵר×ļ": 132868, - "Ġ×Ķ×ĵ×ijר": 127320, - "Ġ×Ķ×ĵ×ijר×Ļ×Ŀ": 133983, - "Ġ×Ķ×ĵ×ķ": 132121, - "Ġ×Ķ×ĵ×Ļ": 132865, - "Ġ×Ķ×ĵ×Ļף": 132030, - "Ġ×Ķ×Ķ": 128341, - "Ġ×Ķ×Ķת": 133417, - "Ġ×Ķ×ķ": 128437, - "Ġ×Ķ×ķ×IJ": 128262, - "Ġ×Ķ×ķ×ĵ": 140832, - "Ġ×Ķ×ķ×ĵ×¢×Ķ": 140833, - "Ġ×Ķ×ķ׾×ĵ": 141691, - "Ġ×Ķ×ķ׾×ĵת": 141692, - "Ġ×Ķ×ĸ": 124892, - "Ġ×Ķ×ĸ×IJת": 134471, - "Ġ×Ķ×ĸ×Ķ": 128561, - "Ġ×Ķ×ĸ×ķ": 130948, - "Ġ×Ķ×ĸ×ķ×Ĵ": 137897, - "Ġ×Ķ×ĸ׼": 131093, - "Ġ×Ķ×ĸ׼×ķ×Ļ×ķת": 131094, - "Ġ×Ķ×ĸ×ŀף": 130576, - "Ġ×Ķ×Ĺ": 124789, - "Ġ×Ķ×Ĺ×ijר×Ķ": 129904, - "Ġ×Ķ×Ĺ×ĵ": 137365, - "Ġ×Ķ×Ĺ×ĵש": 131074, - "Ġ×Ķ×Ĺ×ĵש×Ķ": 137366, - "Ġ×Ķ×Ĺ×ķ": 133443, - "Ġ×Ķ×Ĺ×ķ×§": 133500, - "Ġ×Ķ×Ĺ×ķ׾×Ļ×Ŀ": 141956, - "Ġ×Ķ×Ĺ×Ļ": 127030, - "Ġ×Ķ×Ĺ×Ļ×Ļ×Ŀ": 131002, - "Ġ×Ķ×Ĺ׾": 129063, - "Ġ×Ķ×ĺ": 125182, - "Ġ×Ķ×ĺ×ij×¢": 137095, - "Ġ×Ķ×ĺ×ķ×ij": 130786, - "Ġ×Ķ×ĺ×Ļפ×ķ׾": 136797, - "Ġ×Ķ×Ļ": 125037, - "Ġ×Ķ×Ļש": 133740, - "Ġ×Ķ×Ļשר×IJ": 133741, - "Ġ×Ķ×Ļשר×IJ׾": 138573, - "Ġ×Ķ×Ļשר×IJ׾×Ļ": 133742, - "Ġ×Ķ×Ļשר×IJ׾×Ļת": 138574, - "Ġ×Ķ×Ļת": 134812, - "Ġ×Ķ×Ļתר": 134813, - "Ġ×Ķ×Ļת×Ķ": 131288, - "Ġ×Ķ×Ļ×IJ": 128302, - "Ġ×Ķ×Ļ×Ķ": 126215, - "Ġ×Ķ×Ļ×Ķ×ķ×ĵ×Ļ": 134294, - "Ġ×Ķ×Ļ×ķ": 128591, - "Ġ×Ķ×Ļ×ķ×Ŀ": 128795, - "Ġ×Ķ×Ļ×Ĺ×Ļ×ĵ": 134604, - "Ġ×Ķ×Ļ×ĺ×ij": 138671, - "Ġ×Ķ×Ļ×Ļת×Ķ": 129813, - "Ġ×Ķ×Ļ×Ļת×Ļ": 131907, - "Ġ×Ķ×Ļ׾×ĵ": 136011, - "Ġ×Ķ×Ļ׾×ĵ×Ļ×Ŀ": 133256, - "Ġ×Ķ׼": 129586, - "Ġ×Ķ׼ר": 132780, - "Ġ×Ķ׼×ķ׾": 139612, - "Ġ×Ķ׼×ķ׾׾": 139613, - "Ġ×Ķ׼×Ļ": 129092, - "Ġ×Ķ׼׾": 128961, - "Ġ×Ķ×Ľ×ł×¡×ª": 137871, - "Ġ×Ķ׾": 126863, - "Ġ×Ķ׾×IJ×ķ×ŀ×Ļ": 140342, - "Ġ×Ķ׾×ij": 135585, - "Ġ×Ķ׾׾×ķ": 136833, - "Ġ×Ķ×Ŀ": 128414, - "Ġ×Ķ×ŀ": 123919, - "Ġ×Ķ×ŀס": 133262, - "Ġ×Ķ×ŀ×¢": 135072, - "Ġ×Ķ×ŀ×¢×¨×Ľ×ª": 140068, - "Ġ×Ķ×ŀצ": 143925, - "Ġ×Ķ×ŀצ×ij": 138271, - "Ġ×Ķ×ŀצ×Ļ×IJ×ķת": 143926, - "Ġ×Ķ×ŀ×§": 125391, - "Ġ×Ķ×ŀקצ×ķ×¢×Ļ": 143095, - "Ġ×Ķ×ŀ×§×ķר×Ļ": 143553, - "Ġ×Ķ×ŀ×§×ķ×Ŀ": 135233, - "Ġ×Ķ×ŀ×§×ķ×ŀ×Ļ": 139482, - "Ġ×Ķ×ŀר׼×ĸ×Ļ": 137918, - "Ġ×Ķ×ŀש": 124696, - "Ġ×Ķ×ŀשפ": 136598, - "Ġ×Ķ×ŀשפ×Ĺ×Ķ": 136599, - "Ġ×Ķ×ŀשפ×ĺ": 129671, - "Ġ×Ķ×ŀשת": 141980, - "Ġ×Ķ×ŀשת×ŀש": 141981, - "Ġ×Ķ×ŀש×Ĺ×§": 134571, - "Ġ×Ķ×ŀש×Ļ×ij": 142222, - "Ġ×Ķ×ŀת": 129113, - "Ġ×Ķ×ŀ×ijקש": 140751, - "Ġ×Ķ×ŀ×ĵ": 131755, - "Ġ×Ķ×ŀ×ĵ×Ļ׳×Ķ": 131756, - "Ġ×Ķ×ŀ×ķ": 128679, - "Ġ×Ķ×ŀ×ķצר": 135489, - "Ġ×Ķ×ŀ×ķף": 137487, - "Ġ×Ķ×ŀ×Ĺ": 127474, - "Ġ×Ķ×ŀ×Ĺ×Ļר": 137400, - "Ġ×Ķ×ŀ×Ļ": 127111, - "Ġ×Ķ×ŀ×Ļ×ĵ×¢": 135134, - "Ġ×Ķ×ŀ×Ļ×ķ×Ĺ×ĵ": 143801, - "Ġ×Ķ×ŀ׼": 136699, - "Ġ×Ķ×ŀ׾×IJ": 136042, - "Ġ×Ķ×ŀ×ŀש׾×Ķ": 135357, - "Ġ×Ķף": 130032, - "Ġ×Ķ׳": 125448, - "Ġ×Ķ×ł×ª": 133700, - "Ġ×Ķ×ł×ª×ij×¢": 133701, - "Ġ×Ķ׳×IJ": 142177, - "Ġ×Ķ׳×IJש×Ŀ": 142178, - "Ġ×Ķ׳×Ķ": 134078, - "Ġ×Ķ׳×ķ׼": 141089, - "Ġ×Ķ׳×ķ׼×Ĺ×Ļ": 141090, - "Ġ×ķ": 123822, - "Ġ×ķ×¢×ĵ": 130364, - "Ġ×ķ×¢×ķ×ĵ": 129525, - "Ġ×ķ×¢×ľ": 130279, - "Ġ×ķרק": 138435, - "Ġ×ķש": 129231, - "Ġ×ķש׾": 137293, - "Ġ×ķ×IJ": 124416, - "Ġ×ķ×IJ×£": 135199, - "Ġ×ķ×IJפ×Ļ׾×ķ": 139753, - "Ġ×ķ×IJת": 129860, - "Ġ×ķ×IJ×ĸ": 133681, - "Ġ×ķ×IJ×Ĺ": 133253, - "Ġ×ķ×IJ×Ļ": 130468, - "Ġ×ķ×IJ×Ļף": 136030, - "Ġ×ķ×IJ×Ŀ": 134167, - "Ġ×ķ×IJ׳×Ļ": 131426, - "Ġ×ķ×ij": 126205, - "Ġ×ķ×ij׼׾": 138511, - "Ġ×ķ×Ĵ": 136076, - "Ġ×ķ×Ĵ×Ŀ": 129319, - "Ġ×ķ×ĵ": 134594, - "Ġ×ķ×Ķ": 125008, - "Ġ×ķ×Ķת": 133258, - "Ġ×ķ×Ķ×ķ×IJ": 130958, - "Ġ×ķ×Ķ×Ļ×IJ": 135713, - "Ġ×ķ×Ķ×ŀ": 132797, - "Ġ×ķ×ĸ": 140721, - "Ġ×ķ×ĸ×IJת": 140722, - "Ġ×ķ×ĸ×Ķ": 131667, - "Ġ×ķ×Ĺ": 129794, - "Ġ×ķ×Ļ": 128746, - "Ġ×ķ×Ļש": 132320, - "Ġ×ķ×Ļ×ķתר": 143312, - "Ġ×ķ׼": 126485, - "Ġ×ķ׼×ķ": 135209, - "Ġ×ķ׼×Ļ": 135034, - "Ġ×ķ׼×ļ": 137544, - "Ġ×ķ׼׾": 132041, - "Ġ×ķ׼×ŀ×ķ×ijף": 142821, - "Ġ×ķ׼ף": 132362, - "Ġ×ķ׾": 126209, - "Ġ×ķ׾×IJ": 126273, - "Ġ×ķ׾×IJ×Ĺר": 139733, - "Ġ×ķ׾×Ķ": 128950, - "Ġ×ķ׾׼ף": 131601, - "Ġ×ķ×ŀ": 128308, - "Ġ×ķ×ŀת": 133075, - "Ġ×ķ×ŀ×Ķ": 131740, - "Ġ×ķ׳": 128970, - "Ġ×ĸ": 124253, - "Ġ×ĸ×§": 142540, - "Ġ×ĸ×§×ķ×§": 142541, - "Ġ×ĸ×IJת": 128602, - "Ġ×ĸ×Ķ": 126197, - "Ġ×ĸ×Ķ×ķ": 135224, - "Ġ×ĸ×ķ": 128407, - "Ġ×ĸ×ķ׼ר": 141731, - "Ġ×ĸ׼×IJ": 143923, - "Ġ×ĸ×ŀף": 129247, - "Ġ×ĸ×ŀ׳": 142017, - "Ġ×Ĺ": 123852, - "Ġ×Ĺר": 132702, - "Ġ×Ĺש": 133562, - "Ġ×Ĺש×ij×ķף": 133067, - "Ġ×Ĺש×ķ×ij": 129166, - "Ġ×Ĺ×ij": 133614, - "Ġ×Ĺ×ijר": 125200, - "Ġ×Ĺ×ijרת": 129777, - "Ġ×Ĺ×ijר×ķת": 132860, - "Ġ×Ĺ×ijר×Ļ": 136687, - "Ġ×Ĺ×ijר×Ļ×Ŀ": 137859, - "Ġ×Ĺ×Ĵ": 134468, - "Ġ×Ĺ×ĵ": 124894, - "Ġ×Ĺ×ĵר": 132836, - "Ġ×Ĺ×ĵש": 129665, - "Ġ×Ĺ×ĵש×Ķ": 133384, - "Ġ×Ĺ×ĵש×ķת": 130756, - "Ġ×Ĺ×ĵש×Ļ×Ŀ": 132986, - "Ġ×Ĺ×ķ": 126462, - "Ġ×Ĺ×ķפ": 142109, - "Ġ×Ĺ×ķפש×Ļ": 142110, - "Ġ×Ĺ×ķ×§": 130456, - "Ġ×Ĺ×ķש": 131855, - "Ġ×Ĺ×ķש×ij": 131856, - "Ġ×Ĺ×ķ×ij": 135742, - "Ġ×Ĺ×ķ×ĵ": 133716, - "Ġ×Ĺ×ķ×ĵש×Ļ×Ŀ": 133717, - "Ġ×Ĺ×ķ×ķת": 136013, - "Ġ×Ĺ×ķ×ĸ": 136199, - "Ġ×Ĺ×ķ×ĸר": 136200, - "Ġ×Ĺ×ķ׾": 131790, - "Ġ×Ĺ×ĸ": 130941, - "Ġ×Ĺ×Ļ": 124834, - "Ġ×Ĺ×Ļפ×Ķ": 139676, - "Ġ×Ĺ×Ļ×ķ×ij×Ļ": 143523, - "Ġ×Ĺ×Ļ×Ļ": 130721, - "Ġ×Ĺ×Ļ×Ļ×ij": 131689, - "Ġ×Ĺ×Ļ×Ļ×Ŀ": 129842, - "Ġ×Ĺ×Ļ׳×Ŀ": 139717, - "Ġ×Ĺ׾ק": 128905, - "Ġ×Ĺ׾×ķ": 136397, - "Ġ×Ĺ×ŀ": 134490, - "Ġ×ĺ": 124395, - "Ġ×ĺ×ij×¢": 137574, - "Ġ×ĺ×ij×¢×Ļ": 137575, - "Ġ×ĺ×ķ×¢": 143766, - "Ġ×ĺ×ķ×¢×Ł": 143767, - "Ġ×ĺ×ķ×ij": 128571, - "Ġ×ĺ×ķ×ij×Ķ": 131798, - "Ġ×ĺ×Ļ": 135345, - "Ġ×ĺ×Ļפ×ķ׾": 131410, - "Ġ×ĺ×Ļ×ķ׾": 135346, - "Ġ×ĺ׾": 143186, - "Ġ×ĺ׾פ×ķף": 143187, - "Ġ×Ļ": 123872, - "Ġ×Ļ×¢": 140589, - "Ġ×Ļ×¢×§×ij": 140590, - "Ġ×Ļ×¢×ľ": 142570, - "Ġ×Ļצ": 125986, - "Ġ×Ļצ×IJ": 132527, - "Ġ×Ļצ×Ĺ×§": 140424, - "Ġ×Ļצ×Ļרת": 135185, - "Ġ×Ļר×ķ×§": 141354, - "Ġ×Ļש": 125010, - "Ġ×Ļשר×IJ׾": 128458, - "Ġ×Ļש×Ļר": 136231, - "Ġ×Ļש׳×Ŀ": 140508, - "Ġ×Ļתר": 134044, - "Ġ×Ļ×ĵ×Ļ": 128549, - "Ġ×Ļ×Ķ": 125174, - "Ġ×Ļ×Ķ×ķ×ĵ×Ķ": 139915, - "Ġ×Ļ×Ķ×ķ×ĵ×Ļ": 134190, - "Ġ×Ļ×Ķ×Ļ×Ķ": 129503, - "Ġ×Ļ×Ķ×Ļ×ķ": 136873, - "Ġ×Ļ×ķ": 128699, - "Ġ×Ļ×ķסף": 139496, - "Ġ×Ļ×ķצ×IJ": 132443, - "Ġ×Ļ×ķר": 143328, - "Ġ×Ļ×ķרק": 143329, - "Ġ×Ļ×ķתר": 128315, - "Ġ×Ļ×ķ×ĵ": 126826, - "Ġ×Ļ×ķ×ĵ×¢": 130206, - "Ġ×Ļ×ķ×ĵ×¢×Ļ×Ŀ": 136097, - "Ġ×Ļ×ķ׼׾": 136893, - "Ġ×Ļ×ķ×Ŀ": 128915, - "Ġ×Ļ×Ĺ": 132877, - "Ġ×Ļ×Ĺס×Ļ": 132878, - "Ġ×Ļ×Ĺ×ĵ": 131340, - "Ġ×Ļ×Ļת": 142074, - "Ġ×Ļ×Ļ×ª×Ľ×Ł": 142075, - "Ġ×Ļ׼×ķ׾": 125485, - "Ġ×Ļ׼×ķ׾×Ķ": 132509, - "Ġ×Ļ׼×ķ׾×Ļ×Ŀ": 131022, - "Ġ×Ļ׾": 130419, - "Ġ×Ļ׾×ĵ×Ļ×Ŀ": 130420, - "Ġ׼": 123845, - "Ġ×Ľ×¡": 133358, - "Ġ×Ľ×¡×£": 133359, - "Ġ×Ľ×¢×ª": 138384, - "Ġ׼פ×Ļ": 130672, - "Ġ׼ש": 128574, - "Ġ׼ש×Ķ": 132284, - "Ġ×Ľ×ª": 125659, - "Ġ×Ľ×ª×ij": 129416, - "Ġ×Ľ×ª×ķצ×IJ×Ķ": 142471, - "Ġ×Ľ×ª×ķ×ijת": 135108, - "Ġ׼×IJ": 125091, - "Ġ׼×IJשר": 129004, - "Ġ׼×IJ×Ļ׾": 138463, - "Ġ׼×IJ×Ļ׾×ķ": 138464, - "Ġ׼×IJ׾×Ķ": 136436, - "Ġ׼×IJ×ŀ": 138337, - "Ġ׼×IJ×ŀ×ķר": 138338, - "Ġ׼×IJף": 128816, - "Ġ׼×ijר": 128648, - "Ġ׼×Ĵ": 136054, - "Ġ׼×Ĵ×ķף": 136055, - "Ġ׼×ĵ": 132803, - "Ġ׼×ĵ×IJ×Ļ": 132804, - "Ġ׼×ĵ×Ļ": 128413, - "Ġ׼×ķ׾": 126833, - "Ġ׼×ķ׾×ķ": 143460, - "Ġ׼×ķ׾׾": 130230, - "Ġ׼×ĸ×Ķ": 131712, - "Ġ׼×Ļ": 128276, - "Ġ׼×Ļצ": 132126, - "Ġ׼×Ļצ×ĵ": 132127, - "Ġ׼×Ļ×ķ×Ŀ": 132998, - "Ġ׼×ļ": 128397, - "Ġ׼׼×Ķ": 137128, - "Ġ׼׼׾": 133773, - "Ġ׼׾": 124759, - "Ġ׼׾פ×Ļ": 136787, - "Ġ׼׾×ķ×ŀר": 136170, - "Ġ׼׾×Ļ": 135140, - "Ġ׼׾׾": 130476, - "Ġ׼׾׾×Ļ": 134545, - "Ġ׼×ŀ×¢×ĺ": 132241, - "Ġ׼×ŀ×Ķ": 128638, - "Ġ׼×ŀ×ķ": 128381, - "Ġ׼×ŀ×ķ×ijף": 132939, - "Ġ׼ף": 128996, - "Ġ׼׳×Ĵ×ĵ": 140811, - "Ġ׼׳×Ļס": 139859, - "Ġ׼׳×Ļס×Ķ": 139860, - "Ġ׾": 76962, - "Ġ×ľ×¡": 129415, - "Ġ×ľ×¢": 124336, - "Ġ×ľ×¢×©×ķת": 128988, - "Ġ×ľ×¢×ij×ķר": 138972, - "Ġ×ľ×¢×ij×ķ×ĵ": 132076, - "Ġ×ľ×¢×ķ׾×Ŀ": 136006, - "Ġ×ľ×¢×ķ×ŀ": 137131, - "Ġ×ľ×¢×ķ×ŀת": 137132, - "Ġ×ľ×¢×ĸ×ķר": 138413, - "Ġ×ľ×¢×Ļת": 142361, - "Ġ×ľ×¢×Ļת×Ļ×Ŀ": 142362, - "Ġ×ľ×¢×ŀ×ķ×ĵ": 137717, - "Ġ׾פ": 125050, - "Ġ×ľ×¤×¢": 140189, - "Ġ×ľ×¤×¢×ķ׾": 141818, - "Ġ×ľ×¤×¢×ŀ×Ļ×Ŀ": 140190, - "Ġ׾פר": 143030, - "Ġ׾פר×ĺ×Ļ×Ŀ": 143031, - "Ġ×ľ×¤×ª": 143647, - "Ġ×ľ×¤×ª×ķ×Ĺ": 143648, - "Ġ׾פ×Ĺ×ķת": 134112, - "Ġ׾פ×Ļ": 128887, - "Ġ׾פ׳×ķת": 137988, - "Ġ׾פ׳×Ļ": 128519, - "Ġ׾צ": 124899, - "Ġ׾צפ": 143980, - "Ġ׾צפ×Ļ×Ķ": 143981, - "Ġ׾צ×IJת": 133343, - "Ġ׾צ×ĵ": 136050, - "Ġ׾צ×ķר×ļ": 137340, - "Ġ׾צ×Ļ×Ļף": 140066, - "Ġ׾ק": 124557, - "Ġ׾קר": 133174, - "Ġ׾קר×IJ": 136974, - "Ġ׾קר×IJת": 136975, - "Ġ׾קר×ķ×IJ": 133175, - "Ġ׾ק×ij׾": 126662, - "Ġ׾ק×ij×ľ×ª": 138330, - "Ġ׾ק×ķ×Ĺ": 135106, - "Ġ׾ק×ķ×Ĺ×ķת": 135107, - "Ġ׾ק×Ĺת": 134503, - "Ġ׾ק׳×ķת": 138794, - "Ġ׾ר": 129269, - "Ġ׾ר×IJ": 130257, - "Ġ׾ר×IJש": 142571, - "Ġ׾ר×IJש×ķ׳×Ķ": 142572, - "Ġ׾ר×IJ×ķת": 130258, - "Ġ׾ר׼": 140503, - "Ġ׾ר׼×ķש": 140504, - "Ġ׾ש": 126221, - "Ġ׾ש׾×Ŀ": 139777, - "Ġ׾ש×Ŀ": 136688, - "Ġ׾ש×ŀ": 127856, - "Ġ׾ש×ŀ×ķ×¢": 141730, - "Ġ׾ש×ŀ×ķר": 136519, - "Ġ׾ש׳×ķת": 133977, - "Ġ×ľ×ª": 126329, - "Ġ×ľ×ª×ª": 133211, - "Ġ׾×IJ": 124597, - "Ġ׾×IJתר": 133060, - "Ġ׾×IJ×ķר": 135600, - "Ġ׾×IJ×ķר×ļ": 134345, - "Ġ׾×IJ×ķ×ŀ×Ļ": 137394, - "Ġ׾×IJ×Ĺר": 126304, - "Ġ׾×IJ×Ĺר×ķ׳×Ķ": 139745, - "Ġ׾×ij": 124804, - "Ġ׾×ijצע": 134531, - "Ġ׾×ij×ĵ": 128007, - "Ġ׾×ij×ĵ×ķ×§": 138647, - "Ġ׾×ij×Ĺ": 134461, - "Ġ׾×ij×Ĺ×ķר": 134462, - "Ġ׾×ij×ĺ׾": 140291, - "Ġ׾×ij×Ļת": 131979, - "Ġ׾×ij×Ļף": 133342, - "Ġ׾×Ĵ": 127037, - "Ġ׾×Ĵר": 141832, - "Ġ׾×Ĵר×ķ×Ŀ": 141833, - "Ġ׾×Ĵ×ij×Ļ": 131044, - "Ġ׾×Ĵ×ŀר×Ļ": 138755, - "Ġ׾×ĵ": 126790, - "Ġ׾×ĵעת": 130073, - "Ġ׾×ĵ×ijר": 132788, - "Ġ׾×Ķ": 124007, - "Ġ׾×Ķ×¢×ij×Ļר": 140069, - "Ġ׾×Ķ×§": 134559, - "Ġ׾×Ķש": 127631, - "Ġ׾×Ķשת×ŀש": 133640, - "Ġ׾×Ķש×Ļ×Ĵ": 140871, - "Ġ׾×Ķת": 126278, - "Ġ׾×Ķת×ŀ×ķ×ĵ": 140825, - "Ġ׾×Ķת×ŀ×ķ×ĵ×ĵ": 140826, - "Ġ׾×Ķ×ij×Ļ×IJ": 137960, - "Ġ׾×Ķ×ij×Ļף": 134460, - "Ġ׾×Ķ×Ĵ×Ļ×¢": 131147, - "Ġ׾×Ķ×Ĵ×Ļ×ĵ": 141325, - "Ġ׾×Ķ×ķס×Ļ×£": 139597, - "Ġ׾×Ķ×Ļ": 129237, - "Ġ׾×Ķ×Ļ×ķת": 128535, - "Ġ׾×Ķ×Ļ׼": 141857, - "Ġ׾×Ķ×Ļ×Ľ×ł×¡": 141858, - "Ġ׾×Ķ×Ŀ": 129354, - "Ġ׾×Ķ×ŀש×Ļ×ļ": 137993, - "Ġ׾×ķ": 128398, - "Ġ׾×ķ×§": 136951, - "Ġ׾×ķ×§×Ĺ": 136952, - "Ġ׾×ķ×ŀר": 135928, - "Ġ׾×ĸ": 133966, - "Ġ׾×ĸ×Ķ": 134560, - "Ġ׾×Ĺ": 125035, - "Ġ׾×Ĺצ×ķ": 137044, - "Ġ׾×Ĺ×ijר": 132616, - "Ġ׾×Ĺ×ķ×§": 139070, - "Ġ׾×Ĺ׾": 139940, - "Ġ׾×Ĺ׾×ķ×ĺ": 139941, - "Ġ׾×Ĺ׾×ķ×ĺ×Ļף": 139942, - "Ġ׾×ĺ": 127091, - "Ġ׾×ĺ×ķ×ijת": 142469, - "Ġ׾×Ļ": 128298, - "Ġ׾×Ļצ×ķר": 135181, - "Ġ׾×Ļשר×IJ׾": 139378, - "Ġ׾×Ļ×ĵ": 136842, - "Ġ׾×Ļ×ĵ×Ļ": 139017, - "Ġ׾×Ļ׾×ĵ×Ļ×Ŀ": 135884, - "Ġ׾×Ļ×ŀ": 137479, - "Ġ׾×Ļ×ŀ×ķ×ĵ×Ļ": 137480, - "Ġ׾×ļ": 128879, - "Ġ׾׼": 131030, - "Ġ×ľ×Ľ×ª×ķ×ij": 135461, - "Ġ׾׼×ļ": 131442, - "Ġ׾׼׾": 128710, - "Ġ׾׼×Ŀ": 128873, - "Ġ׾׼ף": 132255, - "Ġ׾׾": 134866, - "Ġ׾׾×IJ": 128995, - "Ġ×ľ×ľ×Ľ×ª": 139105, - "Ġ׾׾×ŀ×ķ×ĵ": 134867, - "Ġ׾×ŀ": 128359, - "Ġ׾×ŀ×¢": 126116, - "Ġ׾×ŀעש×Ķ": 135764, - "Ġ׾×ŀ×¢×ľ×Ķ": 138103, - "Ġ׾×ŀ×¢×Ł": 139931, - "Ġ׾×ŀצ": 131143, - "Ġ׾×ŀצ×ķ×IJ": 131144, - "Ġ׾×ŀ×§×ķ×Ŀ": 139763, - "Ġ׾×ŀר": 132193, - "Ġ׾×ŀר×ķת": 132194, - "Ġ׾×ŀש׾": 132967, - "Ġ׾×ŀ×Ķ": 129783, - "Ġ׾×ŀ×Ļ": 131811, - "Ġ׾×ŀ׳": 140361, - "Ġ׾×ŀ׳×ķ×¢": 140362, - "Ġ׾׳": 130735, - "Ġ×ľ×ł×¡": 142379, - "Ġ×ľ×ł×¡×ķת": 142380, - "Ġ׾׳×ķ": 128697, - "Ġ×ŀ": 91511, - "Ġ×ŀס": 124816, - "Ġ×ŀספר": 128933, - "Ġ×ŀספ×Ļ×§": 134983, - "Ġ×ŀס×ķ": 129475, - "Ġ×ŀס×ķ×Ĵ": 137041, - "Ġ×ŀ×¢": 125128, - "Ġ×ŀ×¢×¨×Ľ×ª": 131238, - "Ġ×ŀ×¢×ķ׾×Ķ": 139766, - "Ġ×ŀ×¢×ĺ": 131439, - "Ġ×ŀ×¢×ľ": 131331, - "Ġ×ŀפת×Ĺ": 142273, - "Ġ×ŀפ׳×Ļ": 137688, - "Ġ×ŀצ": 125348, - "Ġ×ŀצ×ij": 131295, - "Ġ×ŀצ×ĵ": 133572, - "Ġ×ŀצ×ķ×ķ×Ķ": 143653, - "Ġ×ŀצ×ķ×Ļ": 132843, - "Ġ×ŀצ×Ļ×¢": 135007, - "Ġ×ŀ×§": 124679, - "Ġ×ŀקצ×ķ×¢×Ļ": 131221, - "Ġ×ŀקר×Ķ": 138785, - "Ġ×ŀ×§×ij׾": 133030, - "Ġ×ŀ×§×ķר": 130172, - "Ġ×ŀ×§×ķ×Ŀ": 129872, - "Ġ×ŀ×§×ķ×ŀ×Ļ": 140543, - "Ġ×ŀר": 129001, - "Ġ×ŀר×IJש": 135330, - "Ġ×ŀר×Ĵ×Ļש": 137248, - "Ġ×ŀר׼×ĸ×Ļ": 138904, - "Ġ×ŀש": 124399, - "Ġ×ŀשפ": 136213, - "Ġ×ŀשפ×ĺ×Ļ": 136214, - "Ġ×ŀשר": 131465, - "Ġ×ŀשר×ĵ": 131466, - "Ġ×ŀשת": 132431, - "Ġ×ŀשת×ŀש": 132252, - "Ġ×ŀש×Ķ": 135550, - "Ġ×ŀש×Ķ×ķ": 130186, - "Ġ×ŀש×ķ": 132464, - "Ġ×ŀש×ķ×Ŀ": 136531, - "Ġ×ŀש×Ĺ×§": 128101, - "Ġ×ŀש×Ĺ×§×Ļ": 139966, - "Ġ×ŀש×Ĺ×§×Ļ×Ŀ": 141199, - "Ġ×ŀש×ŀ×¢×ķת": 134124, - "Ġ×ŀש×ŀ×¢×ķת×Ļ": 134125, - "Ġ×ŀש׳×Ķ": 137603, - "Ġ×ŀת": 125435, - "Ġ×ŀת×IJ×Ļ×Ŀ": 137364, - "Ġ×ŀת×ķ×ļ": 130568, - "Ġ×ŀת×Ĺת": 138810, - "Ġ×ŀת×Ĺ×Ļ׾": 133635, - "Ġ×ŀ×IJ": 124270, - "Ġ×ŀ×IJפשר": 134573, - "Ġ×ŀ×IJשר": 134901, - "Ġ×ŀ×IJת": 133136, - "Ġ×ŀ×IJ×ĵ": 132396, - "Ġ×ŀ×IJ×ķ": 135880, - "Ġ×ŀ×IJ×ķת": 136964, - "Ġ×ŀ×IJ×ķ×ĵ": 128576, - "Ġ×ŀ×IJ×ĸ": 132570, - "Ġ×ŀ×IJ×Ĺ": 140143, - "Ġ×ŀ×IJ×Ĺ×ķר×Ļ": 140144, - "Ġ×ŀ×IJ×ŀר×Ļ×Ŀ": 134940, - "Ġ×ŀ×ij": 125145, - "Ġ×ŀ×ij×ķס": 141971, - "Ġ×ŀ×ij×ķסס": 141972, - "Ġ×ŀ×ij×Ĺ": 137509, - "Ġ×ŀ×ij×Ĺ×Ļ×ł×ª": 137510, - "Ġ×ŀ×ij×Ļף": 137733, - "Ġ×ŀ×ij׾×Ļ": 139315, - "Ġ×ŀ×Ĵ": 125656, - "Ġ×ŀ×Ĵ×Ļ×¢": 130993, - "Ġ×ŀ×Ĵ×Ļ×ij": 140151, - "Ġ×ŀ×ĵ": 126878, - "Ġ×ŀ×ĵ×Ķ": 142316, - "Ġ×ŀ×ĵ×Ķ×Ļ×Ŀ": 142317, - "Ġ×ŀ×ĵ×ķ×¢": 137140, - "Ġ×ŀ×ĵ×ķ×ijר": 130410, - "Ġ×ŀ×ĵ×Ļ": 129667, - "Ġ×ŀ×Ķ": 124757, - "Ġ×ŀ×Ķ×ķ×ķ×Ķ": 139863, - "Ġ×ŀ×Ķ×Ŀ": 132691, - "Ġ×ŀ×Ķ×ŀ": 135112, - "Ġ×ŀ×Ķ×ŀ×¢": 142997, - "Ġ×ŀ×Ķ×ŀ×¢×¨×Ľ×ª": 142998, - "Ġ×ŀ×ķ": 128299, - "Ġ×ŀ×ķצר": 135739, - "Ġ×ŀ×ķצר×Ļ×Ŀ": 137040, - "Ġ×ŀ×ķר": 139266, - "Ġ×ŀ×ķר׼×ij": 139267, - "Ġ×ŀ×ķ׼ר": 137902, - "Ġ×ŀ×ķ׾": 130385, - "Ġ×ŀ×ĸ×Ķ": 133181, - "Ġ×ŀ×Ĺ": 125540, - "Ġ×ŀ×Ĺפש": 135604, - "Ġ×ŀ×Ĺ×ĵש": 136416, - "Ġ×ŀ×Ĺ×Ļר": 131287, - "Ġ×ŀ×Ļ": 126211, - "Ġ×ŀ×Ļש×Ķ": 136859, - "Ġ×ŀ×Ļש×Ķ×ķ": 136860, - "Ġ×ŀ×Ļ×ĵ": 133265, - "Ġ×ŀ×Ļ×ĵ×¢": 129886, - "Ġ×ŀ×Ļ×ķ×Ĺ×ĵ": 130212, - "Ġ×ŀ×Ļ׾×Ļ": 134533, - "Ġ×ŀ×Ļ׾×Ļ×ķף": 134534, - "Ġ×ŀ׼": 128989, - "Ġ×ŀ׼׾": 130611, - "Ġ×ŀ׼ף": 135598, - "Ġ×ŀ׾": 129160, - "Ġ×ŀ׾×IJ": 129661, - "Ġ×ŀ×ŀ": 126573, - "Ġ×ŀ×ŀש": 129098, - "Ġ×ŀ×ŀ׳×ķ": 133597, - "Ġ×ŀף": 130875, - "Ġ×ŀ׳": 131381, - "Ġ×ŀ×ł×ª": 130216, - "Ġ׳": 123901, - "Ġ×ł×¢": 126566, - "Ġ×ł×¢×©×Ķ": 139990, - "Ġ׳ר×IJ×Ķ": 130708, - "Ġ׳ש": 125929, - "Ġ׳ש×IJר": 139532, - "Ġ׳ש×ŀ×¢": 141278, - "Ġ×ł×ª": 126545, - "Ġ×ł×ª×ķ׳×Ļ×Ŀ": 142627, - "Ġ׳×Ĵ×ĵ": 130152, - "Ġ׳×Ĵ×Ļש": 140897, - "Ġ׳×Ĵ×Ļש×ķת": 140898, - "Ġ׳×ĵר": 141193, - "Ġ׳×ĵרש": 141194, - "Ġ׳×Ķ": 128141, - "Ġ׳×Ķ×ĵר": 140921, - "Ġ׳×Ķ׳": 141886, - "Ġ׳×ķס": 125266, - "Ġ׳×ķסף": 131988, - "Ġ׳×ķספת": 136181, - "Ġ׳×ķספ×ķת": 136993, - "Ġ׳×ķספ×Ļ×Ŀ": 130614, - "Ġ׳×ķת": 143463, - "Ġ׳×ķ×ª×Ł": 143464, - "Ġ׳×ķ׾×ĵ": 140556, - "Ġ׳×Ĺש×ij": 140109, - "Ġ׳×Ļת": 128694, - "Ġ׳×Ļ×ª×Ł": 128695, - "Ġ׳×Ļ×Ķ": 135813, - "Ġ׳×Ļ×Ķ×ķ׾": 135814, - "Ġ׳׼": 127096, - "Ġ×ł×Ľ×ª×ij": 140549, - "Ġ׳׼×ķף": 131348, - "Ġ׳׼×ķ׳×Ķ": 143006, - "Ġ×ł×Ľ×ł×¡": 135133, - "Ġ׳×ŀצ×IJ": 129715, - "ĠØ": 8803, - "ĠØ¢": 125108, - "Ġآخر": 129197, - "ĠØ¢ÙĦ": 130484, - "ĠØ¢ÙĦاÙģ": 142525, - "ĠØ£": 63415, - "Ġأبر": 137810, - "ĠأبرÙĬÙĦ": 137811, - "ĠأبÙĪ": 130261, - "ĠأبÙĬ": 133423, - "ĠأثÙĨ": 134016, - "ĠأثÙĨاء": 134017, - "Ġأج": 135274, - "ĠأجÙĦ": 130214, - "ĠأخرÙī": 129446, - "ĠأخÙĬ": 142439, - "Ġأد": 131549, - "Ġأس": 128962, - "Ġأساس": 133122, - "ĠأسبÙĪØ¹": 142569, - "ĠأشÙĩر": 137270, - "ĠأصبØŃ": 133455, - "ĠأصØŃاب": 139040, - "Ġأع": 131694, - "ĠأعÙĦÙĨ": 134120, - "ĠأعÙĦÙī": 137992, - "ĠأعÙħاÙĦ": 133519, - "Ġأغ": 138244, - "Ġأغسط": 138245, - "Ġأغسطس": 138246, - "ĠØ£ØŃ": 132562, - "ĠØ£ØŃد": 129289, - "ĠØ£ØŃÙħد": 131118, - "ĠØ£Ùģ": 142922, - "ĠØ£Ù쨱ÙĬ": 142923, - "ĠØ£Ù쨱ÙĬÙĤÙĬ": 142924, - "ĠØ£Ù쨱ÙĬÙĤÙĬا": 142925, - "ĠØ£Ù쨶ÙĦ": 130259, - "ĠØ£ÙĤÙĦ": 135761, - "ĠØ£Ùĥبر": 132291, - "ĠØ£Ùĥثر": 128773, - "ĠØ£Ùĥد": 134415, - "ĠØ£ÙĦ": 134499, - "ĠØ£ÙĦÙģ": 131261, - "ĠØ£Ùħ": 126418, - "ĠØ£Ùħا": 130639, - "ĠØ£ÙħاÙħ": 130063, - "ĠØ£Ùħر": 130656, - "ĠØ£ÙħرÙĬ": 140019, - "ĠØ£ÙħرÙĬÙĥÙĬ": 140020, - "ĠØ£Ùħس": 135311, - "ĠØ£ÙĨ": 125007, - "ĠØ£ÙĨا": 132823, - "ĠØ£ÙĨØŃ": 143399, - "ĠØ£ÙĨØŃاء": 143400, - "ĠØ£ÙĨÙĩ": 128636, - "ĠØ£ÙĨÙĩا": 130543, - "ĠØ£ÙĨÙij": 133432, - "ĠØ£ÙĩÙħ": 133453, - "ĠØ£ÙĪ": 128264, - "ĠØ£ÙĪÙĦ": 129445, - "ĠØ£ÙĬ": 124793, - "ĠØ£ÙĬاÙħ": 133674, - "ĠØ£ÙĬض": 138194, - "ĠØ£ÙĬضا": 126899, - "ĠØ£ÙĬضاÙĭ": 133525, - "ĠØ£ÙĬضÙĭا": 138195, - "ĠØ£Ùİ": 131422, - "ĠØ¥": 85153, - "Ġإدارة": 132113, - "Ġإذ": 131649, - "Ġإذا": 128754, - "Ġإطار": 136320, - "ĠإطÙĦاÙĤ": 139789, - "Ġإعادة": 136950, - "ĠØ¥ØŃ": 133341, - "ĠØ¥ÙĦا": 128941, - "ĠØ¥ÙĦÙī": 128252, - "ĠØ¥ÙĦÙĬ": 126000, - "ĠØ¥ÙĦÙĬÙĩ": 132674, - "ĠØ¥ÙĦÙĬÙĩا": 136709, - "ĠØ¥ÙĨ": 128342, - "ĠØ¥ÙĨÙĩ": 133534, - "ĠØ¥ÙĬ": 132170, - "Ġا": 12961, - "ĠابÙĨ": 130016, - "ĠابÙĪ": 141533, - "Ġاخت": 136837, - "ĠاختÙĬار": 136838, - "Ġاذا": 137756, - "Ġاست": 93153, - "ĠاستخداÙħ": 130322, - "ĠاستراتÙĬج": 143024, - "ĠاستراتÙĬجÙĬØ©": 143025, - "ĠاسÙħ": 131198, - "Ġاعت": 134787, - "ĠاØŃد": 139078, - "ĠاÙĥثر": 140165, - "ĠاÙĦ": 17166, - "ĠاÙĦØ¢": 125700, - "ĠاÙĦآخر": 132491, - "ĠاÙĦØ¢ÙĨ": 129968, - "ĠاÙĦØ£": 123877, - "ĠاÙĦأب": 136466, - "ĠاÙĦأج": 140223, - "ĠاÙĦأجÙĨب": 140224, - "ĠاÙĦأجÙĨبÙĬØ©": 140225, - "ĠاÙĦأخ": 134514, - "ĠاÙĦأخرÙī": 132893, - "ĠاÙĦأخÙĬر": 140117, - "ĠاÙĦأخÙĬرة": 134515, - "ĠاÙĦأربع": 134955, - "ĠاÙĦأربعاء": 134956, - "ĠاÙĦأرض": 132093, - "ĠاÙĦأس": 139089, - "ĠاÙĦأساس": 139743, - "ĠاÙĦأساسÙĬØ©": 139744, - "ĠاÙĦأسبÙĪØ¹": 138147, - "ĠاÙĦأسÙĩÙħ": 139090, - "ĠاÙĦأطÙ쨧ÙĦ": 134668, - "ĠاÙĦأعÙħاÙĦ": 133798, - "ĠاÙĦØ£ØŃد": 134967, - "ĠاÙĦØ£Ùĥثر": 138208, - "ĠاÙĦØ£ÙĦÙħ": 142734, - "ĠاÙĦØ£ÙĦÙħاÙĨÙĬ": 142735, - "ĠاÙĦØ£Ùħ": 124695, - "ĠاÙĦØ£Ùħر": 130208, - "ĠاÙĦØ£ÙħرÙĬ": 127482, - "ĠاÙĦØ£ÙħرÙĬÙĥ": 133492, - "ĠاÙĦØ£ÙħرÙĬÙĥÙĬ": 136760, - "ĠاÙĦØ£ÙħرÙĬÙĥÙĬØ©": 133493, - "ĠاÙĦØ£ÙħÙħ": 133906, - "ĠاÙĦØ£ÙħÙĨ": 130496, - "ĠاÙĦØ£ÙħÙĬر": 127640, - "ĠاÙĦØ£ÙħÙĬرÙĥÙĬ": 134575, - "ĠاÙĦØ£ÙĨ": 131714, - "ĠاÙĦØ£Ùĩ": 139911, - "ĠاÙĦØ£ÙĩÙĦÙĬ": 139912, - "ĠاÙĦØ£ÙĪ": 136259, - "ĠاÙĦØ£ÙĪØ±ÙĪ": 135264, - "ĠاÙĦØ£ÙĪØ±ÙĪØ¨ÙĬ": 135265, - "ĠاÙĦØ£ÙĪØ³Ø·": 139870, - "ĠاÙĦØ£ÙĪÙĦ": 126506, - "ĠاÙĦØ£ÙĪÙĦÙī": 130528, - "ĠاÙĦØ£ÙĬ": 141821, - "ĠاÙĦØ£ÙĬاÙħ": 141822, - "ĠاÙĦØ¥": 124058, - "ĠاÙĦإثÙĨ": 142585, - "ĠاÙĦإثÙĨÙĬÙĨ": 142586, - "ĠاÙĦإدارة": 137740, - "ĠاÙĦإرÙĩاب": 134562, - "ĠاÙĦإسرائÙĬÙĦ": 134442, - "ĠاÙĦإسرائÙĬÙĦÙĬ": 134443, - "ĠاÙĦإسÙĦاÙħ": 126051, - "ĠاÙĦإسÙĦاÙħÙĬ": 138224, - "ĠاÙĦإسÙĦاÙħÙĬØ©": 134318, - "ĠاÙĦإعÙĦاÙħ": 132919, - "ĠاÙĦØ¥ÙĦÙĥ": 134153, - "ĠاÙĦØ¥ÙĦÙĥترÙĪ": 134154, - "ĠاÙĦØ¥ÙĦÙĥترÙĪÙĨÙĬ": 134155, - "ĠاÙĦØ¥Ùħ": 133927, - "ĠاÙĦØ¥Ùħارات": 133928, - "ĠاÙĦØ¥ÙħاÙħ": 139528, - "ĠاÙĦØ¥ÙĨ": 127630, - "ĠاÙĦØ¥ÙĨترÙĨت": 137564, - "ĠاÙĦØ¥ÙĨس": 129823, - "ĠاÙĦØ¥ÙĨساÙĨ": 129824, - "ĠاÙĦØ¥ÙĬر": 137559, - "ĠاÙĦØ¥ÙĬراÙĨÙĬ": 137560, - "ĠاÙĦا": 125434, - "ĠاÙĦاتØŃاد": 131534, - "ĠاÙĦاتÙ쨧ÙĤ": 137484, - "ĠاÙĦاث": 139418, - "ĠاÙĦاثÙĨÙĬÙĨ": 139419, - "ĠاÙĦاجتÙħاع": 127696, - "ĠاÙĦاجتÙħاعÙĬ": 134934, - "ĠاÙĦاجتÙħاعÙĬØ©": 136355, - "ĠاÙĦاخ": 138311, - "ĠاÙĦاخبار": 138312, - "ĠاÙĦاس": 139558, - "ĠاÙĦاست": 126455, - "ĠاÙĦاستث": 136265, - "ĠاÙĦاستثÙħار": 136266, - "ĠاÙĦاسÙĦاÙħ": 139559, - "ĠاÙĦاØŃت": 138079, - "ĠاÙĦاØŃتÙĦاÙĦ": 138080, - "ĠاÙĦاÙĤتصاد": 127831, - "ĠاÙĦاÙĤتصادÙĬ": 139691, - "ĠاÙĦاÙĤتصادÙĬØ©": 136251, - "ĠاÙĦاÙĨ": 125696, - "ĠاÙĦاÙĨتخاب": 138751, - "ĠاÙĦاÙĨتخابات": 138752, - "ĠاÙĦاÙĨترÙĨت": 141962, - "ĠاÙĦاÙĨساÙĨ": 143088, - "ĠاÙĦاÙĪÙĦ": 136447, - "ĠاÙĦب": 126249, - "ĠاÙĦبر": 125332, - "ĠاÙĦبرÙĦÙħ": 138578, - "ĠاÙĦبرÙĦÙħاÙĨ": 138579, - "ĠاÙĦبرÙĨاÙħج": 134966, - "ĠاÙĦبرÙĬØ·": 139773, - "ĠاÙĦبرÙĬطاÙĨÙĬ": 139774, - "ĠاÙĦبشر": 132012, - "ĠاÙĦبط": 132624, - "ĠاÙĦبع": 137646, - "ĠاÙĦبعض": 137647, - "ĠاÙĦبØŃØ«": 132764, - "ĠاÙĦبØŃر": 131010, - "ĠاÙĦبÙĦ": 126926, - "ĠاÙĦبÙĦاد": 133483, - "ĠاÙĦبÙĦد": 130596, - "ĠاÙĦبÙĨ": 140048, - "ĠاÙĦبÙĨÙĥ": 140049, - "ĠاÙĦبÙĬ": 125925, - "ĠاÙĦبÙĬاÙĨ": 138749, - "ĠاÙĦبÙĬاÙĨات": 138750, - "ĠاÙĦبÙĬت": 138821, - "ĠاÙĦت": 94957, - "ĠاÙĦتاب": 142351, - "ĠاÙĦتابعة": 142352, - "ĠاÙĦتارÙĬØ®": 132450, - "ĠاÙĦتاÙĦÙĬ": 132701, - "ĠاÙĦتج": 126058, - "ĠاÙĦتجارة": 137907, - "ĠاÙĦتجارÙĬØ©": 136411, - "ĠاÙĦتداÙĪÙĦ": 132863, - "ĠاÙĦتربÙĬØ©": 139317, - "ĠاÙĦترÙĥ": 135542, - "ĠاÙĦترÙĥÙĬ": 135543, - "ĠاÙĦتش": 136113, - "ĠاÙĦتط": 137868, - "ĠاÙĦتطبÙĬÙĤ": 137869, - "ĠاÙĦتع": 126901, - "ĠاÙĦتعا": 136353, - "ĠاÙĦتعاÙĪÙĨ": 136354, - "ĠاÙĦتعÙĦÙĬÙħ": 130487, - "ĠاÙĦتÙĤ": 136524, - "ĠاÙĦتÙĨ": 128052, - "ĠاÙĦتÙĨÙģÙĬ": 140597, - "ĠاÙĦتÙĨÙģÙĬذÙĬ": 140598, - "ĠاÙĦتÙĨÙħÙĬØ©": 139391, - "ĠاÙĦتÙĪØ§ØµÙĦ": 135203, - "ĠاÙĦتÙĪÙĨ": 143825, - "ĠاÙĦتÙĪÙĨسÙĬ": 143826, - "ĠاÙĦتÙī": 131846, - "ĠاÙĦتÙĬ": 128261, - "ĠاÙĦØ«": 124437, - "ĠاÙĦثاÙĦ": 132606, - "ĠاÙĦثاÙĦØ«": 132607, - "ĠاÙĦثاÙĨÙĬ": 130277, - "ĠاÙĦثاÙĨÙĬØ©": 133403, - "ĠاÙĦØ«ÙĤ": 139575, - "ĠاÙĦØ«ÙĤاÙģÙĬ": 139576, - "ĠاÙĦØ«ÙĦاث": 127560, - "ĠاÙĦØ«ÙĦاثاء": 133982, - "ĠاÙĦØ«ÙĨ": 136489, - "ĠاÙĦØ«ÙĨائÙĬØ©": 136490, - "ĠاÙĦج": 124012, - "ĠاÙĦجارÙĬ": 141048, - "ĠاÙĦجاÙħعة": 138695, - "ĠاÙĦجاÙĨب": 138029, - "ĠاÙĦجدÙĬد": 131424, - "ĠاÙĦجدÙĬدة": 132061, - "ĠاÙĦجز": 141912, - "ĠاÙĦجزائ": 141913, - "ĠاÙĦجزائرÙĬ": 141914, - "ĠاÙĦجسÙħ": 137617, - "ĠاÙĦجÙħع": 133322, - "ĠاÙĦجÙħعة": 133323, - "ĠاÙĦجÙħÙĩ": 140779, - "ĠاÙĦجÙħÙĩÙĪØ±": 140780, - "ĠاÙĦجÙħÙĬع": 136656, - "ĠاÙĦجÙĨ": 127214, - "ĠاÙĦجÙĨس": 136194, - "ĠاÙĦجÙĨÙĪØ¨": 135090, - "ĠاÙĦجÙĩ": 142980, - "ĠاÙĦجÙĩا": 138808, - "ĠاÙĦجÙĩات": 142981, - "ĠاÙĦجÙĩاز": 138809, - "ĠاÙĦجÙĪ": 130156, - "ĠاÙĦجÙĬØ´": 133291, - "ĠاÙĦØ®": 124147, - "ĠاÙĦخار": 133460, - "ĠاÙĦخارج": 133461, - "ĠاÙĦخارجÙĬØ©": 133462, - "ĠاÙĦخاص": 131216, - "ĠاÙĦخاصة": 130245, - "ĠاÙĦخاÙħ": 139306, - "ĠاÙĦخاÙħس": 139307, - "ĠاÙĦخبر": 131997, - "ĠاÙĦخدÙħات": 135744, - "ĠاÙĦخط": 130648, - "ĠاÙĦØ®ÙĦ": 133445, - "ĠاÙĦØ®ÙĦÙĬ": 136495, - "ĠاÙĦØ®ÙĦÙĬج": 136496, - "ĠاÙĦØ®Ùħ": 133448, - "ĠاÙĦØ®ÙħÙĬس": 133449, - "ĠاÙĦØ®ÙĬ": 134326, - "ĠاÙĦØ®ÙĬار": 141939, - "ĠاÙĦØ®ÙĬارات": 134327, - "ĠاÙĦد": 124220, - "ĠاÙĦداخÙĦ": 135275, - "ĠاÙĦداخÙĦÙĬØ©": 135276, - "ĠاÙĦدر": 143760, - "ĠاÙĦدراسÙĬ": 143761, - "ĠاÙĦدÙģØ§Ø¹": 135988, - "ĠاÙĦدÙĥت": 131203, - "ĠاÙĦدÙĥتÙĪØ±": 131204, - "ĠاÙĦدÙħ": 132033, - "ĠاÙĦدÙĨÙĬ": 141188, - "ĠاÙĦدÙĨÙĬا": 141189, - "ĠاÙĦدÙĪØ±ÙĬ": 137763, - "ĠاÙĦدÙĪÙĦ": 125702, - "ĠاÙĦدÙĪÙĦØ©": 129814, - "ĠاÙĦدÙĪÙĦÙĬ": 130924, - "ĠاÙĦدÙĪÙĦÙĬØ©": 131936, - "ĠاÙĦدÙĬÙħÙĤرا": 143849, - "ĠاÙĦدÙĬÙħÙĤراط": 143850, - "ĠاÙĦدÙĬÙħÙĤراطÙĬØ©": 143851, - "ĠاÙĦدÙĬÙĨ": 129950, - "ĠاÙĦذ": 125621, - "ĠاÙĦذÙĩب": 136421, - "ĠاÙĦذÙī": 137453, - "ĠاÙĦذÙĬ": 128307, - "ĠاÙĦذÙĬÙĨ": 129174, - "ĠاÙĦر": 124269, - "ĠاÙĦرئÙĬس": 126543, - "ĠاÙĦرئÙĬسÙĬØ©": 130649, - "ĠاÙĦراب": 137059, - "ĠاÙĦرابع": 137060, - "ĠاÙĦرجاÙĦ": 142841, - "ĠاÙĦرجÙĦ": 137153, - "ĠاÙĦرسÙħÙĬ": 134862, - "ĠاÙĦرغÙħ": 139066, - "ĠاÙĦرØŃ": 142648, - "ĠاÙĦرØŃÙħÙĨ": 142649, - "ĠاÙĦرÙĤÙħ": 140302, - "ĠاÙĦرÙĪ": 127763, - "ĠاÙĦرÙĪØ³ÙĬ": 137561, - "ĠاÙĦرÙĬاض": 130918, - "ĠاÙĦز": 125572, - "ĠاÙĦزÙħÙĨ": 141364, - "ĠاÙĦزÙĪØ¬": 139155, - "ĠاÙĦس": 123913, - "ĠاÙĦساب": 125923, - "ĠاÙĦسابع": 140844, - "ĠاÙĦسابÙĤ": 131438, - "ĠاÙĦسابÙĤØ©": 138743, - "ĠاÙĦساد": 141395, - "ĠاÙĦسادس": 141396, - "ĠاÙĦساعة": 131643, - "ĠاÙĦسبت": 134432, - "ĠاÙĦسعÙĪØ¯": 126787, - "ĠاÙĦسعÙĪØ¯ÙĬ": 134661, - "ĠاÙĦسعÙĪØ¯ÙĬØ©": 130047, - "ĠاÙĦسÙĦ": 125273, - "ĠاÙĦسÙĦاÙħ": 130781, - "ĠاÙĦسÙĦØ·": 141404, - "ĠاÙĦسÙĦطات": 141405, - "ĠاÙĦسÙĦطة": 137024, - "ĠاÙĦسÙħ": 132436, - "ĠاÙĦسÙĨ": 127538, - "ĠاÙĦسÙĨØ©": 136272, - "ĠاÙĦسÙĨÙĪØ§Øª": 143551, - "ĠاÙĦسÙĪØ¯": 134040, - "ĠاÙĦسÙĪØ¯Ø§ÙĨ": 134041, - "ĠاÙĦسÙĪØ±ÙĬ": 133568, - "ĠاÙĦسÙĪØ±ÙĬØ©": 137130, - "ĠاÙĦسÙĪÙĤ": 133320, - "ĠاÙĦسÙĬ": 125143, - "ĠاÙĦسÙĬارات": 139370, - "ĠاÙĦسÙĬاس": 132792, - "ĠاÙĦسÙĬاسÙĬ": 133527, - "ĠاÙĦسÙĬاسÙĬØ©": 132793, - "ĠاÙĦسÙĬد": 132634, - "ĠاÙĦØ´": 124209, - "ĠاÙĦشباب": 133655, - "ĠاÙĦشخص": 127902, - "ĠاÙĦشخصÙĬØ©": 139477, - "ĠاÙĦشر": 125249, - "ĠاÙĦشرÙĤ": 132051, - "ĠاÙĦشرÙĥات": 134744, - "ĠاÙĦشرÙĥØ©": 131927, - "ĠاÙĦشرÙĬÙģ": 141343, - "ĠاÙĦشعب": 129839, - "ĠاÙĦشعر": 133892, - "ĠاÙĦØ´ÙħاÙĦ": 136614, - "ĠاÙĦØ´Ùħس": 139560, - "ĠاÙĦØ´Ùĩر": 136005, - "ĠاÙĦØ´ÙĬØ®": 131017, - "ĠاÙĦص": 124265, - "ĠاÙĦصادر": 142740, - "ĠاÙĦصØŃ": 127991, - "ĠاÙĦصØŃØ©": 135223, - "ĠاÙĦصØŃÙģÙĬ": 142975, - "ĠاÙĦصØŃÙĬ": 138998, - "ĠاÙĦصØŃÙĬØ©": 138554, - "ĠاÙĦصØŃÙĬØŃ": 141757, - "ĠاÙĦصÙģ": 127753, - "ĠاÙĦصÙģØŃØ©": 139463, - "ĠاÙĦصÙĬÙĨ": 132781, - "ĠاÙĦض": 129755, - "ĠاÙĦØ·": 124663, - "ĠاÙĦطب": 130280, - "ĠاÙĦطبÙĬعÙĬ": 136471, - "ĠاÙĦطرÙĬÙĤ": 132866, - "ĠاÙĦطعاÙħ": 140591, - "ĠاÙĦØ·ÙģÙĦ": 136529, - "ĠاÙĦØ·ÙĦ": 140122, - "ĠاÙĦØ·ÙĦاب": 140123, - "ĠاÙĦع": 123894, - "ĠاÙĦعاص": 139247, - "ĠاÙĦعاصÙħØ©": 139248, - "ĠاÙĦعاÙĦÙħ": 125547, - "ĠاÙĦعاÙĦÙħÙĬ": 136364, - "ĠاÙĦعاÙĦÙħÙĬØ©": 132895, - "ĠاÙĦعاÙĦÙĬ": 140984, - "ĠاÙĦعاÙħ": 128586, - "ĠاÙĦعاÙħØ©": 129701, - "ĠاÙĦعب": 138534, - "ĠاÙĦعدÙĪ": 140427, - "ĠاÙĦعدÙĬد": 130684, - "ĠاÙĦعرا": 135194, - "ĠاÙĦعراÙĤ": 130372, - "ĠاÙĦعراÙĤÙĬ": 135195, - "ĠاÙĦعرب": 131941, - "ĠاÙĦعربÙĬ": 130538, - "ĠاÙĦعربÙĬØ©": 129071, - "ĠاÙĦعسÙĥ": 140420, - "ĠاÙĦعسÙĥر": 138276, - "ĠاÙĦعسÙĥرÙĬ": 140421, - "ĠاÙĦعسÙĥرÙĬØ©": 138277, - "ĠاÙĦعشر": 141471, - "ĠاÙĦعÙĦاÙĤات": 138795, - "ĠاÙĦعÙĦاÙĤØ©": 143229, - "ĠاÙĦعÙĦÙħ": 129726, - "ĠاÙĦعÙĦÙĬ": 140764, - "ĠاÙĦعÙĦÙĬا": 140765, - "ĠاÙĦعÙħ": 132875, - "ĠاÙĦعÙħر": 138414, - "ĠاÙĦعÙħÙĦ": 125503, - "ĠاÙĦعÙħÙĦات": 137371, - "ĠاÙĦعÙħÙĦÙĬØ©": 137637, - "ĠاÙĦعÙĨ": 132638, - "ĠاÙĦغ": 125110, - "ĠاÙĦغذ": 140800, - "ĠاÙĦغذائÙĬ": 140801, - "ĠاÙĦغربÙĬØ©": 139981, - "ĠاÙĦغرÙģ": 140841, - "ĠاÙĦØŃ": 123961, - "ĠاÙĦØŃاج": 139498, - "ĠاÙĦØŃاÙĦ": 130690, - "ĠاÙĦØŃاÙĦÙĬ": 134898, - "ĠاÙĦØŃدÙĬØ«": 131801, - "ĠاÙĦØŃدÙĬد": 141043, - "ĠاÙĦØŃر": 129395, - "ĠاÙĦØŃرب": 133058, - "ĠاÙĦØŃصÙĪÙĦ": 134516, - "ĠاÙĦØŃÙĤ": 127405, - "ĠاÙĦØŃÙĤÙĪÙĤ": 143056, - "ĠاÙĦØŃÙĤÙĬÙĤÙĬ": 138606, - "ĠاÙĦØŃÙĥÙħ": 134710, - "ĠاÙĦØŃÙĥÙĪÙħ": 126807, - "ĠاÙĦØŃÙĥÙĪÙħØ©": 130119, - "ĠاÙĦØŃÙĥÙĪÙħÙĬØ©": 140447, - "ĠاÙĦØŃÙĦ": 132151, - "ĠاÙĦØŃÙħÙĦ": 137636, - "ĠاÙĦØŃÙĪØ§Ø±": 140689, - "ĠاÙĦØŃÙĪØ«": 143130, - "ĠاÙĦØŃÙĪØ«ÙĬ": 143131, - "ĠاÙĦØŃÙĬ": 133612, - "ĠاÙĦØŃÙĬاة": 131359, - "ĠاÙĦÙģ": 124114, - "ĠاÙĦÙģØª": 135920, - "ĠاÙĦÙģØªØ±Ø©": 134396, - "ĠاÙĦÙģØ±Øµ": 142847, - "ĠاÙĦÙ쨱ÙĨ": 135556, - "ĠاÙĦÙ쨱ÙĨسÙĬ": 135557, - "ĠاÙĦÙ쨱ÙĬÙĤ": 133531, - "ĠاÙĦÙģÙĤر": 140141, - "ĠاÙĦÙģÙĥر": 137020, - "ĠاÙĦÙģÙĦ": 127565, - "ĠاÙĦÙģÙĦسطÙĬÙĨ": 127566, - "ĠاÙĦÙģÙĦسطÙĬÙĨÙĬ": 134037, - "ĠاÙĦÙģÙĦسطÙĬÙĨÙĬØ©": 136987, - "ĠاÙĦÙģÙĨاÙĨ": 138331, - "ĠاÙĦÙģÙĨد": 141211, - "ĠاÙĦÙģÙĨدÙĤ": 141212, - "ĠاÙĦÙģÙĨÙĬ": 134947, - "ĠاÙĦÙģÙĪØ±": 131639, - "ĠاÙĦÙģÙĪØ±Ùĥس": 131640, - "ĠاÙĦÙĤ": 124172, - "ĠاÙĦÙĤاد": 135170, - "ĠاÙĦÙĤادÙħ": 135171, - "ĠاÙĦÙĤاÙĨÙĪÙĨ": 130771, - "ĠاÙĦÙĤاÙĩرة": 134999, - "ĠاÙĦÙĤدس": 138238, - "ĠاÙĦÙĤدÙħ": 136079, - "ĠاÙĦÙĤر": 125993, - "ĠاÙĦÙĤرآÙĨ": 134074, - "ĠاÙĦÙĤرار": 134466, - "ĠاÙĦÙĤرÙĨ": 135640, - "ĠاÙĦÙĤض": 142887, - "ĠاÙĦÙĤضÙĬØ©": 142888, - "ĠاÙĦÙĤØ·": 134848, - "ĠاÙĦÙĤطاع": 134849, - "ĠاÙĦÙĤÙĪØ§Øª": 137279, - "ĠاÙĦÙĤÙĪÙħ": 141397, - "ĠاÙĦÙĤÙĪÙħÙĬ": 141398, - "ĠاÙĦÙĤÙĬاÙħ": 136708, - "ĠاÙĦÙĥ": 124326, - "ĠاÙĦÙĥاÙħÙĦ": 140286, - "ĠاÙĦÙĥبر": 141674, - "ĠاÙĦÙĥبرÙī": 141675, - "ĠاÙĦÙĥبÙĬر": 132927, - "ĠاÙĦÙĥتاب": 134145, - "ĠاÙĦÙĥØ«ÙĬر": 130346, - "ĠاÙĦÙĥر": 130913, - "ĠاÙĦÙĥرÙĬÙħ": 134233, - "ĠاÙĦÙĥÙĦ": 126985, - "ĠاÙĦÙĥÙĦاÙħ": 142518, - "ĠاÙĦÙĥÙħ": 143790, - "ĠاÙĦÙĥÙħبÙĬ": 143791, - "ĠاÙĦÙĥÙħبÙĬÙĪØªØ±": 143792, - "ĠاÙĦÙĥÙĪÙĬ": 134384, - "ĠاÙĦÙĥÙĪÙĬت": 134385, - "ĠاÙĦÙĦ": 124478, - "ĠاÙĦÙĦا": 143098, - "ĠاÙĦÙĦازÙħØ©": 143099, - "ĠاÙĦÙĦبÙĨ": 136823, - "ĠاÙĦÙĦبÙĨاÙĨÙĬ": 136824, - "ĠاÙĦÙĦج": 133505, - "ĠاÙĦÙĦجÙĨØ©": 133506, - "ĠاÙĦÙĦعبة": 143974, - "ĠاÙĦÙĦغ": 137056, - "ĠاÙĦÙĦغة": 137057, - "ĠاÙĦÙĦÙĤاء": 141266, - "ĠاÙĦÙĦÙĩ": 128286, - "ĠاÙĦÙĦÙĬ": 127517, - "ĠاÙĦÙĦÙĬبÙĬ": 143509, - "ĠاÙĦÙħ": 53479, - "ĠاÙĦÙħؤ": 127647, - "ĠاÙĦÙħؤتÙħر": 138069, - "ĠاÙĦÙħادة": 138324, - "ĠاÙĦÙħاض": 129744, - "ĠاÙĦÙħاضÙĬ": 129745, - "ĠاÙĦÙħاÙĦ": 132013, - "ĠاÙĦÙħاÙĦÙĬØ©": 132071, - "ĠاÙĦÙħباراة": 140809, - "ĠاÙĦÙħباشر": 143371, - "ĠاÙĦÙħت": 128631, - "ĠاÙĦÙħتعÙĦ": 141721, - "ĠاÙĦÙħتعÙĦÙĤØ©": 141722, - "ĠاÙĦÙħتØŃ": 129039, - "ĠاÙĦÙħتØŃدة": 129040, - "ĠاÙĦÙħتÙĪ": 141358, - "ĠاÙĦÙħتÙĪØ³Ø·": 141359, - "ĠاÙĦÙħج": 126913, - "ĠاÙĦÙħجاÙĦ": 134975, - "ĠاÙĦÙħجتÙħع": 130555, - "ĠاÙĦÙħجÙĦس": 132700, - "ĠاÙĦÙħختÙĦÙģ": 136972, - "ĠاÙĦÙħختÙĦÙ쨩": 136973, - "ĠاÙĦÙħدÙĨÙĬ": 134636, - "ĠاÙĦÙħدÙĬÙĨØ©": 132879, - "ĠاÙĦÙħر": 125637, - "ĠاÙĦÙħرأ": 133467, - "ĠاÙĦÙħرأة": 133468, - "ĠاÙĦÙħرØŃÙĦØ©": 138070, - "ĠاÙĦÙħرÙĥز": 131052, - "ĠاÙĦÙħزÙĬد": 133082, - "ĠاÙĦÙħس": 127072, - "ĠاÙĦÙħسؤÙĪÙĦ": 135673, - "ĠاÙĦÙħست": 125616, - "ĠاÙĦÙħستÙĤبÙĦ": 138471, - "ĠاÙĦÙħستÙĪÙī": 139148, - "ĠاÙĦÙħسÙĦ": 142339, - "ĠاÙĦÙħسÙĦØŃØ©": 142340, - "ĠاÙĦÙħسÙĦÙħ": 134926, - "ĠاÙĦÙħسÙĦÙħÙĬÙĨ": 134927, - "ĠاÙĦÙħسÙĬ": 138402, - "ĠاÙĦÙħسÙĬØŃ": 138403, - "ĠاÙĦÙħØ´": 125358, - "ĠاÙĦÙħشار": 134871, - "ĠاÙĦÙħشارÙĥØ©": 134872, - "ĠاÙĦÙħشترÙĥ": 138144, - "ĠاÙĦÙħشرÙĪØ¹": 134790, - "ĠاÙĦÙħØ´ÙĥÙĦ": 143331, - "ĠاÙĦÙħØ´ÙĥÙĦØ©": 143332, - "ĠاÙĦÙħص": 131924, - "ĠاÙĦÙħصدر": 138026, - "ĠاÙĦÙħصر": 133839, - "ĠاÙĦÙħصرÙĬ": 131925, - "ĠاÙĦÙħصرÙĬØ©": 133840, - "ĠاÙĦÙħع": 129200, - "ĠاÙĦÙħعار": 143385, - "ĠاÙĦÙħعارضة": 143386, - "ĠاÙĦÙħعÙĦÙĪÙħات": 132733, - "ĠاÙĦÙħغرب": 131242, - "ĠاÙĦÙħØŃ": 126453, - "ĠاÙĦÙħØŃÙĦ": 137386, - "ĠاÙĦÙħØŃÙĦÙĬ": 141279, - "ĠاÙĦÙħØŃÙĦÙĬØ©": 137387, - "ĠاÙĦÙħÙĤ": 133476, - "ĠاÙĦÙħÙĤبÙĦ": 133205, - "ĠاÙĦÙħÙĤدس": 143898, - "ĠاÙĦÙħÙĦ": 131267, - "ĠاÙĦÙħÙĦÙĥ": 130815, - "ĠاÙĦÙħÙħÙĦ": 132904, - "ĠاÙĦÙħÙħÙĦÙĥØ©": 132905, - "ĠاÙĦÙħÙĨ": 125088, - "ĠاÙĦÙħÙĨا": 136719, - "ĠاÙĦÙħÙĨاسب": 141938, - "ĠاÙĦÙħÙĨاطÙĤ": 136720, - "ĠاÙĦÙħÙĨت": 127955, - "ĠاÙĦÙħÙĨتخب": 139620, - "ĠاÙĦÙħÙĨتدÙī": 137875, - "ĠاÙĦÙħÙĨزÙĦ": 136875, - "ĠاÙĦÙħÙĨØ·ÙĤØ©": 131263, - "ĠاÙĦÙħÙĩ": 142822, - "ĠاÙĦÙħÙĩÙĨÙĬ": 142823, - "ĠاÙĦÙħÙĪ": 125867, - "ĠاÙĦÙħÙĪØ§": 138353, - "ĠاÙĦÙħÙĪØ§Ø¯": 137499, - "ĠاÙĦÙħÙĪØ§Ø·ÙĨ": 138354, - "ĠاÙĦÙħÙĪØ§Ø·ÙĨÙĬÙĨ": 138355, - "ĠاÙĦÙħÙĪØ¬ÙĪØ¯": 143591, - "ĠاÙĦÙħÙĪØ¬ÙĪØ¯Ø©": 143592, - "ĠاÙĦÙħÙĪØ³Ùħ": 140496, - "ĠاÙĦÙħÙĪØ¶ÙĪØ¹": 130989, - "ĠاÙĦÙħÙĪÙĤع": 133052, - "ĠاÙĦÙħÙĬاÙĩ": 137010, - "ĠاÙĦÙħÙı": 137635, - "ĠاÙĦÙĨ": 124080, - "ĠاÙĦÙĨار": 137889, - "ĠاÙĦÙĨاس": 129781, - "ĠاÙĦÙĨبÙĬ": 134588, - "ĠاÙĦÙĨساء": 137169, - "ĠاÙĦÙĨظاÙħ": 130867, - "ĠاÙĦÙĨظر": 134430, - "ĠاÙĦÙĨÙģ": 135887, - "ĠاÙĦÙĨÙ쨳": 135087, - "ĠاÙĦÙĨÙ쨷": 135888, - "ĠاÙĦÙĨÙĤ": 132474, - "ĠاÙĦÙĨÙĤد": 139878, - "ĠاÙĦÙĨÙĩائÙĬ": 141051, - "ĠاÙĦÙĨÙĪ": 141568, - "ĠاÙĦÙĨÙĪØ§Ø¨": 142304, - "ĠاÙĦÙĨÙĪØ¹": 140136, - "ĠاÙĦÙĨÙĪÙĪÙĬ": 141569, - "ĠاÙĦÙĩ": 125100, - "ĠاÙĦÙĩاتÙģ": 140810, - "ĠاÙĦÙĩÙĨد": 136157, - "ĠاÙĦÙĩÙĬئة": 138928, - "ĠاÙĦÙĪ": 124666, - "ĠاÙĦÙĪØ§": 141239, - "ĠاÙĦÙĪØ§ØŃد": 141240, - "ĠاÙĦÙĪØ§ÙĤع": 133474, - "ĠاÙĦÙĪØ²": 134769, - "ĠاÙĦÙĪØ²Ø±Ø§Ø¡": 134770, - "ĠاÙĦÙĪØµÙĪÙĦ": 137410, - "ĠاÙĦÙĪØ·ÙĨ": 127275, - "ĠاÙĦÙĪØ·ÙĨÙĬ": 131262, - "ĠاÙĦÙĪØ·ÙĨÙĬØ©": 132260, - "ĠاÙĦÙĪØŃ": 140425, - "ĠاÙĦÙĪØŃÙĬد": 140426, - "ĠاÙĦÙĪÙĤ": 129815, - "ĠاÙĦÙĪÙĤت": 129816, - "ĠاÙĦÙĪÙĦا": 132371, - "ĠاÙĦÙĪÙĦاÙĬات": 132372, - "ĠاÙĦÙī": 128470, - "ĠاÙĦÙĬ": 125461, - "ĠاÙĦÙĬÙħÙĨ": 131194, - "ĠاÙĦÙĬÙĪÙħ": 128438, - "ĠاÙĦÙĴ": 130049, - "ĠاÙĨ": 128295, - "ĠاÙĨÙĩ": 131524, - "ĠاÙĪ": 129118, - "ĠاÙĬ": 127068, - "ĠاÙĬضا": 140218, - "Ġاﻷ": 137989, - "Ġب": 27846, - "Ġبأ": 129521, - "ĠبأÙĨ": 126513, - "ĠبأÙĨÙĩ": 136897, - "Ġبإ": 130394, - "Ġبا": 82611, - "ĠباستخداÙħ": 139073, - "ĠباسÙħ": 135208, - "ĠباÙĦ": 124476, - "ĠباÙĦØ£": 134964, - "ĠباÙĦØ¥": 127586, - "ĠباÙĦإض": 134156, - "ĠباÙĦإضاÙ쨩": 134157, - "ĠباÙĦت": 132548, - "ĠباÙĦÙħ": 129890, - "ĠباÙĦÙĨ": 132982, - "ĠباÙĦÙĨسبة": 132983, - "Ġبت": 126805, - "ĠبتارÙĬØ®": 140701, - "Ġبد": 138829, - "Ġبدأت": 138830, - "Ġبدا": 135769, - "ĠبداÙĬØ©": 135770, - "ĠبدÙĪÙĨ": 135172, - "ĠبذÙĦÙĥ": 137007, - "Ġبر": 129920, - "ĠبرÙĨ": 130440, - "ĠبرÙĨاÙħج": 130441, - "Ġبسبب": 130153, - "Ġبش": 126436, - "ĠبشأÙĨ": 133707, - "ĠبشÙĥÙĦ": 128953, - "Ġبص": 127726, - "ĠبصÙĪØ±Ø©": 142882, - "Ġبط": 141600, - "ĠبطرÙĬ": 141601, - "ĠبطرÙĬÙĤØ©": 141602, - "Ġبعد": 128325, - "Ġبعض": 128538, - "ĠبعÙĬد": 136156, - "Ġبغ": 141868, - "Ġبغداد": 141869, - "ĠبØŃÙĬ": 140769, - "ĠبØŃÙĬØ«": 140770, - "ĠبÙĥ": 129834, - "ĠبÙĥÙĦ": 132319, - "ĠبÙĦ": 126420, - "ĠبÙĦا": 134933, - "ĠبÙĦد": 132428, - "ĠبÙħ": 128763, - "ĠبÙħا": 129869, - "ĠبÙĨ": 125449, - "ĠبÙĨسبة": 139102, - "ĠبÙĨÙ쨳": 138854, - "ĠبÙĩ": 81768, - "ĠبÙĩا": 128794, - "ĠبÙĩذا": 136791, - "ĠبÙĩذÙĩ": 139116, - "ĠبÙĪ": 126941, - "ĠبÙĪØ§Ø³": 135131, - "ĠبÙĪØ§Ø³Ø·Ø©": 135132, - "ĠبÙĬ": 129517, - "ĠبÙĬاÙĨ": 142011, - "ĠبÙĬاÙĨات": 142012, - "ĠبÙĬÙĨ": 126212, - "ĠبÙĬÙĨÙħا": 134939, - "Ġت": 39434, - "ĠتارÙĬØ®": 130570, - "Ġتت": 129015, - "Ġتخ": 134684, - "ĠتراÙħ": 137985, - "ĠتراÙħب": 137986, - "ĠترÙĥ": 136520, - "ĠترÙĥÙĬا": 136521, - "ĠترÙĬد": 138169, - "Ġتس": 130243, - "Ġتست": 131723, - "Ġتش": 143700, - "ĠتشرÙĬÙĨ": 143701, - "Ġتص": 130546, - "ĠتصÙĨÙĬ": 130547, - "ĠتصÙĨÙĬÙģ": 130548, - "Ġتع": 126731, - "ĠتعاÙĦ": 131467, - "ĠتعاÙĦÙī": 131468, - "Ġتعتبر": 140118, - "Ġتعد": 138073, - "Ġتعرض": 138481, - "ĠتعÙħÙĦ": 135545, - "ĠتØŃ": 125857, - "ĠتØŃت": 129375, - "ĠتØŃتاج": 138756, - "ĠتØŃدÙĬØ«": 138383, - "ĠتØŃÙĤÙĬÙĤ": 132745, - "ĠتÙĤ": 133114, - "ĠتÙĤدÙĬ": 133115, - "ĠتÙĤدÙĬÙħ": 133116, - "ĠتÙĤÙĪÙħ": 133393, - "ĠتÙĥÙĪÙĨ": 129286, - "ĠتÙĦÙĥ": 129341, - "ĠتÙħ": 128510, - "ĠتÙħاÙħ": 138787, - "ĠتÙħاÙħا": 138788, - "ĠتÙĨ": 129458, - "ĠتÙĪ": 130616, - "ĠتÙĪÙģ": 139408, - "ĠتÙĪÙģÙĬر": 139409, - "ĠØ«": 125069, - "ĠثاÙĨÙĬ": 135222, - "ĠØ«ÙĦاث": 135376, - "ĠØ«ÙĦاثة": 135377, - "ĠØ«Ùħ": 128637, - "ĠØ«ÙĨ": 143342, - "ĠØ«ÙĨائÙĬ": 143343, - "Ġج": 82168, - "Ġجاء": 131813, - "ĠجاÙħعة": 134193, - "ĠجاÙĨب": 131351, - "Ġجدا": 127119, - "ĠجداÙĭ": 139757, - "ĠجدÙĬد": 130461, - "ĠجدÙĬدة": 130282, - "ĠجÙħÙĬع": 128858, - "ĠجÙħÙĬÙĦ": 138518, - "ĠجÙĨÙĬ": 135986, - "ĠجÙĨÙĬÙĩ": 135987, - "ĠجÙĩØ©": 138887, - "ĠØ®": 74315, - "Ġخاصة": 130439, - "ĠخدÙħات": 136310, - "Ġخط": 129163, - "ĠØ®ÙĦاÙĦ": 128374, - "Ġد": 44330, - "Ġدائ": 140214, - "ĠدائÙħ": 136075, - "ĠدائÙħا": 140215, - "ĠداخÙĦ": 129996, - "ĠدبÙĬ": 137373, - "Ġدر": 76841, - "ĠدÙĤ": 141890, - "ĠدÙĤائÙĤ": 141891, - "ĠدÙĤÙĬÙĤØ©": 136574, - "ĠدÙħØ´": 143401, - "ĠدÙħØ´ÙĤ": 143402, - "ĠدÙĪØ±": 129366, - "ĠدÙĪÙĦ": 127012, - "ĠدÙĪÙĦار": 130907, - "ĠدÙĪÙĨ": 129193, - "ĠدÙĬ": 126920, - "ĠدÙĬسÙħ": 135977, - "ĠدÙĬسÙħبر": 135978, - "Ġذ": 125447, - "Ġذات": 129632, - "ĠذÙĦÙĥ": 128349, - "ĠذÙĪ": 137776, - "Ġر": 53710, - "ĠرئÙĬس": 128755, - "Ġرائع": 136629, - "Ġرب": 139868, - "ĠربÙħا": 139869, - "ĠرجاÙĦ": 139589, - "Ġرد": 130852, - "Ġرس": 127490, - "ĠرساÙĦØ©": 139268, - "ĠرسÙħÙĬ": 138359, - "ĠرسÙĪÙĦ": 133555, - "ĠرغÙħ": 135297, - "ĠرÙĤÙħ": 131273, - "ĠرÙħض": 135865, - "ĠرÙħضاÙĨ": 135866, - "ĠرÙĪ": 131384, - "ĠرÙĬ": 137542, - "ĠرÙĬاÙĦ": 137543, - "Ġز": 125555, - "ĠزÙħÙĨ": 141492, - "ĠزÙĬ": 134777, - "ĠزÙĬادة": 134778, - "Ġس": 59842, - "Ġساب": 134577, - "ĠسابÙĤ": 134578, - "Ġساع": 138717, - "Ġساعات": 138718, - "Ġساعة": 135512, - "ĠسبØŃ": 143750, - "ĠسبØŃاÙĨ": 143751, - "ĠسبØŃاÙĨÙĩ": 143752, - "ĠسبÙĬÙĦ": 135638, - "Ġست": 128875, - "ĠسرÙĬع": 140675, - "ĠسعÙĪØ¯": 139398, - "ĠسÙħ": 131409, - "ĠسÙĨ": 126760, - "ĠسÙĨØ©": 130643, - "ĠسÙĨÙĪØ§Øª": 132351, - "ĠسÙĪØ§Ø¡": 134607, - "ĠسÙĪØ±": 132681, - "ĠسÙĪØ±ÙĬا": 132682, - "ĠسÙĪØ±ÙĬØ©": 141241, - "ĠسÙĪÙģ": 131959, - "ĠسÙĪÙī": 140545, - "ĠسÙĬ": 125027, - "ĠسÙĬاسÙĬ": 134874, - "ĠسÙĬتÙħ": 141420, - "ĠسÙĬÙĥÙĪÙĨ": 137139, - "ĠØ´": 52157, - "ĠشأÙĨ": 139894, - "ĠشاÙħÙĦ": 143870, - "Ġشب": 138566, - "ĠشبÙĥØ©": 138567, - "Ġشخص": 129843, - "ĠشرÙĥØ©": 129798, - "ĠØ´Ùĥ": 143622, - "ĠØ´Ùĥرا": 143623, - "ĠØ´ÙħاÙĦ": 137855, - "ĠØ´Ùĩر": 130777, - "ĠØ´ÙĬ": 127050, - "ĠØ´ÙĬØ¡": 131113, - "ĠØ´ÙĬئ": 142613, - "ĠØ´ÙĬئا": 142614, - "Ġص": 92072, - "ĠصاÙĦ": 137263, - "ĠصاÙĦØŃ": 137264, - "ĠصباØŃ": 134711, - "Ġصغ": 139849, - "ĠصغÙĬرة": 139850, - "ĠصØŃ": 134772, - "ĠصØŃÙĬØŃ": 136826, - "ĠصØŃÙĬÙ쨩": 134773, - "ĠصÙģ": 141949, - "ĠصÙģØŃØ©": 141950, - "ĠصÙĦÙī": 131108, - "Ġض": 126815, - "Ġضد": 130160, - "ĠضÙħÙĨ": 131695, - "ĠØ·": 124665, - "ĠطبÙĬعÙĬ": 141755, - "ĠطرÙĬÙĤ": 129072, - "ĠØ·ÙģÙĦ": 139820, - "ĠØ·ÙĪÙĬÙĦ": 128054, - "ĠØ·ÙĪÙĬÙĦØ©": 139412, - "Ġع": 43982, - "ĠعاÙĦÙĬØ©": 137091, - "ĠعاÙħ": 128443, - "Ġعبد": 125584, - "ĠعبداÙĦ": 127604, - "ĠعبداÙĦÙĦÙĩ": 140533, - "Ġعبر": 129353, - "Ġعدة": 133407, - "Ġعدد": 128912, - "ĠعدÙħ": 130283, - "ĠعربÙĬ": 135410, - "Ġعشر": 130520, - "ĠعÙĦاÙĤØ©": 140691, - "ĠعÙĦÙħ": 130226, - "ĠعÙĦÙī": 128248, - "ĠعÙĦÙĬ": 124794, - "ĠعÙĦÙĬÙĥ": 133254, - "ĠعÙĦÙĬÙĨ": 139978, - "ĠعÙĦÙĬÙĨا": 139979, - "ĠعÙĦÙĬÙĩ": 128471, - "ĠعÙĦÙĬÙĩا": 129387, - "ĠعÙĦÙĬÙĩÙħ": 135293, - "ĠعÙħ": 131268, - "ĠعÙħر": 130657, - "ĠعÙħÙĦ": 126349, - "ĠعÙħÙĦÙĬØ©": 130759, - "ĠعÙĨ": 126195, - "ĠعÙĨد": 126350, - "ĠعÙĨدÙħا": 129919, - "ĠعÙĨÙĩ": 131045, - "ĠعÙĨÙĩا": 134035, - "Ġغ": 125040, - "ĠغاÙĦ": 142327, - "ĠغاÙĦب": 142328, - "Ġغزة": 138348, - "ĠغÙĬر": 128478, - "ĠØĮ": 128287, - "ĠØŃ": 68238, - "ĠØŃاج": 143276, - "ĠØŃاجة": 143277, - "ĠØŃاÙĦ": 129466, - "ĠØŃاÙĦØ©": 131032, - "ĠØŃت": 128522, - "ĠØŃتÙī": 128523, - "ĠØŃد": 130740, - "ĠØŃر": 130630, - "ĠØŃسÙĬÙĨ": 141549, - "ĠØŃص": 137982, - "ĠØŃÙĤ": 126906, - "ĠØŃÙĤÙĪÙĤ": 133547, - "ĠØŃÙĤÙĬÙĤÙĬ": 142182, - "ĠØŃÙĦ": 130260, - "ĠØŃÙĪ": 140062, - "ĠØŃÙĪØ§ÙĦÙĬ": 140063, - "ĠØŃÙĪÙĦ": 128967, - "ĠØŃÙĬات": 139542, - "ĠØŃÙĬاتÙĩ": 139543, - "ĠØŃÙĬØ«": 128476, - "ĠØŃÙĬÙĨ": 130492, - "ĠÙ¾": 87417, - "ĠÙģ": 45577, - "ĠÙ쨣": 131666, - "ĠÙ쨥": 143026, - "ĠÙģØ¥Ø°Ø§": 143027, - "ĠÙ쨥ÙĨ": 128843, - "ĠÙ쨧ÙĦ": 130044, - "ĠÙģØªØ±Ø©": 133933, - "ĠÙģØ±Øµ": 134642, - "ĠÙ쨹ÙĦ": 131394, - "ĠÙģÙĤاÙĦ": 134598, - "ĠÙģÙĤد": 129828, - "ĠÙģÙĤØ·": 129346, - "ĠÙģÙĥرة": 142139, - "ĠÙģÙĦا": 132225, - "ĠÙģÙħÙĨ": 139400, - "ĠÙģÙĩÙĪ": 133965, - "ĠÙģÙĩÙĬ": 137687, - "ĠÙģÙĪÙĤ": 135726, - "ĠÙģÙī": 128393, - "ĠÙģÙĬ": 77273, - "ĠÙģÙĬÙħا": 130339, - "ĠÙģÙĬÙĩ": 128985, - "ĠÙģÙĬÙĩا": 128857, - "ĠÙģÙIJ": 135948, - "ĠÙģÙIJÙĬ": 135949, - "ĠÙĤ": 77703, - "ĠÙĤائ": 142760, - "ĠÙĤائÙĦا": 142761, - "ĠÙĤادر": 139825, - "ĠÙĤاÙĦ": 128506, - "ĠÙĤاÙħت": 140164, - "ĠÙĤبÙĦ": 128474, - "ĠÙĤد": 128416, - "ĠÙĤرÙĬب": 138148, - "ĠÙĤصة": 141714, - "ĠÙĤض": 134541, - "ĠÙĤطر": 136510, - "ĠÙĤÙĨا": 138847, - "ĠÙĤÙĨاة": 138848, - "ĠÙĤÙĪÙĦ": 137436, - "ĠÙĤÙĪÙĦÙĩ": 137437, - "ĠÙĤÙĬÙħØ©": 138272, - "ĠÙĤÙİ": 142085, - "ĠÙĤÙİØ§ÙĦ": 142086, - "ĠÙĤÙİØ§ÙĦÙİ": 142087, - "ĠÙĥ": 86941, - "ĠÙĥاÙ쨩": 133550, - "ĠÙĥاÙĦ": 133394, - "ĠÙĥاÙħÙĦ": 132435, - "ĠÙĥاÙĨ": 126214, - "ĠÙĥاÙĨت": 128671, - "ĠÙĥاÙĨÙĪØ§": 137809, - "ĠÙĥب": 130854, - "ĠÙĥبÙĬر": 129766, - "ĠÙĥبÙĬرة": 130855, - "ĠÙĥتاب": 131211, - "ĠÙĥØ«ÙĬر": 129724, - "ĠÙĥذÙĦÙĥ": 135283, - "ĠÙĥرة": 139581, - "ĠÙĥس": 141585, - "ĠÙĥسارة": 141586, - "ĠÙĥÙĦ": 128288, - "ĠÙĥÙĦÙħ": 136366, - "ĠÙĥÙĦÙħØ©": 136367, - "ĠÙĥÙħا": 128388, - "ĠÙĥÙĨت": 130309, - "ĠÙĥÙĪ": 130190, - "ĠÙĥÙĬÙģ": 127046, - "ĠÙĥÙĬÙģÙĬØ©": 137146, - "ĠÙĦ": 56794, - "ĠÙĦØ£": 129232, - "ĠÙĦØ£ÙĨ": 126554, - "ĠÙĦØ£ÙĨÙĩ": 134270, - "ĠÙĦØ¥": 131425, - "ĠÙĦا": 128259, - "ĠÙĦبÙĨ": 133092, - "ĠÙĦبÙĨاÙĨ": 133093, - "ĠÙĦت": 128769, - "ĠÙĦتØŃ": 143011, - "ĠÙĦتØŃÙĤÙĬÙĤ": 143012, - "ĠÙĦدÙī": 132266, - "ĠÙĦدÙĬ": 125998, - "ĠÙĦدÙĬÙĥ": 142360, - "ĠÙĦدÙĬÙĨا": 140554, - "ĠÙĦدÙĬÙĩ": 132653, - "ĠÙĦذÙĦÙĥ": 132730, - "ĠÙĦعبة": 139925, - "ĠÙĦÙĤد": 133431, - "ĠÙĦÙĥ": 129361, - "ĠÙĦÙĥرة": 143185, - "ĠÙĦÙĥÙĦ": 131863, - "ĠÙĦÙĥÙħ": 135109, - "ĠÙĦÙĥÙĨ": 128762, - "ĠÙĦÙĦ": 125006, - "ĠÙĦÙĦØ£": 130579, - "ĠÙĦÙĦت": 131037, - "ĠÙĦÙĦغا": 140537, - "ĠÙĦÙĦغاÙĬØ©": 140538, - "ĠÙĦÙĦÙħ": 128883, - "ĠÙĦÙħ": 126208, - "ĠÙĦÙħا": 127301, - "ĠÙĦÙħاذا": 138867, - "ĠÙĦÙħدة": 135745, - "ĠÙĦÙĨ": 129225, - "ĠÙĦÙĨا": 133289, - "ĠÙĦÙĩ": 125490, - "ĠÙĦÙĩا": 129046, - "ĠÙĦÙĩذا": 133310, - "ĠÙĦÙĩذÙĩ": 137726, - "ĠÙĦÙĩÙħ": 131029, - "ĠÙĦÙĪ": 129768, - "ĠÙĦÙĬ": 125502, - "ĠÙĦÙĬبÙĬ": 140441, - "ĠÙĦÙĬبÙĬا": 140442, - "ĠÙĦÙĬس": 129581, - "ĠÙĦÙĬست": 134436, - "ĠÙħ": 23364, - "ĠÙħؤ": 133427, - "ĠÙħا": 126198, - "ĠÙħاÙĬÙĪ": 136057, - "ĠÙħباراة": 136369, - "ĠÙħباشر": 127922, - "ĠÙħباشرة": 137450, - "ĠÙħت": 128546, - "ĠÙħØ«ÙĦ": 128718, - "ĠÙħج": 140333, - "ĠÙħجاÙĦ": 131132, - "ĠÙħجاÙĨÙĬ": 140334, - "ĠÙħجر": 142000, - "ĠÙħجرد": 142001, - "ĠÙħجÙĦ": 143506, - "ĠÙħجÙĦØ©": 143507, - "ĠÙħجÙĦس": 129878, - "ĠÙħجÙħÙĪØ¹Ø©": 131175, - "ĠÙħختÙĦÙģ": 127519, - "ĠÙħختÙĦÙ쨩": 135526, - "ĠÙħد": 142610, - "ĠÙħدرÙĬد": 142611, - "ĠÙħدÙī": 138983, - "ĠÙħدÙĬر": 132889, - "ĠÙħدÙĬÙĨØ©": 130632, - "ĠÙħر": 128707, - "ĠÙħرة": 131658, - "ĠÙħرÙĥز": 131822, - "ĠÙħساء": 128010, - "ĠÙħساءÙĭ": 143036, - "ĠÙħست": 126492, - "ĠÙħستÙĪÙī": 132106, - "ĠÙħØ´": 125709, - "ĠÙħشرÙĪØ¹": 131563, - "ĠÙħØ´ÙĬرا": 141838, - "ĠÙħصدر": 137369, - "ĠÙħصر": 128748, - "ĠÙħض": 133020, - "ĠÙħع": 126196, - "ĠÙħعدÙĦ": 139013, - "ĠÙħعظÙħ": 136700, - "ĠÙħØŃ": 126502, - "ĠÙħØŃاÙ쨏": 139347, - "ĠÙħØŃاÙģØ¸Ø©": 139348, - "ĠÙħØŃÙĦ": 134689, - "ĠÙħØŃÙħ": 139811, - "ĠÙħØŃÙħد": 128724, - "ĠÙħØŃÙħÙĪØ¯": 139812, - "ĠÙħÙĤ": 127115, - "ĠÙħÙĤابÙĦ": 133860, - "ĠÙħÙĥاÙĨ": 131865, - "ĠÙħÙĦÙģ": 136930, - "ĠÙħÙĦÙĬ": 126993, - "ĠÙħÙĦÙĬار": 134652, - "ĠÙħÙĦÙĬÙĪÙĨ": 130859, - "ĠÙħÙħا": 129943, - "ĠÙħÙĨ": 63237, - "ĠÙħÙĨت": 143122, - "ĠÙħÙĨتخب": 143123, - "ĠÙħÙĨذ": 129185, - "ĠÙħÙĨزÙĦ": 138594, - "ĠÙħÙĨØ·ÙĤØ©": 131478, - "ĠÙħÙĨÙĩ": 130622, - "ĠÙħÙĨÙĩا": 129431, - "ĠÙħÙĨÙĩÙħ": 133576, - "ĠÙħÙĩÙħ": 141182, - "ĠÙħÙĩÙħØ©": 141183, - "ĠÙħÙĪ": 129435, - "ĠÙħÙĪØ§": 142685, - "ĠÙħÙĪØ§Ø¶": 142686, - "ĠÙħÙĪØ§Ø¶ÙĬع": 142687, - "ĠÙħÙĪØ§ÙĤع": 136215, - "ĠÙħÙĪØ¬ÙĪØ¯": 140674, - "ĠÙħÙĪØ¶ÙĪØ¹": 131476, - "ĠÙħÙĪÙĤع": 129436, - "ĠÙħÙĪÙĤÙģ": 138990, - "ĠÙħÙIJ": 137489, - "ĠÙħÙIJÙĨ": 137490, - "ĠÙħÙIJÙĨÙĴ": 137491, - "ĠÙĨ": 50243, - "ĠÙĨتÙĬ": 135305, - "ĠÙĨتÙĬجة": 135306, - "ĠÙĨسبة": 135778, - "ĠÙĨØ·": 143683, - "ĠÙĨطاÙĤ": 143684, - "ĠÙĨظاÙħ": 130895, - "ĠÙĨØŃÙĪ": 130770, - "ĠÙĨÙ쨳": 125759, - "ĠÙĨÙ쨳Ùĩ": 131581, - "ĠÙĨÙ쨳Ùĩا": 139505, - "ĠÙĨÙĤ": 142402, - "ĠÙĨÙĤاط": 142403, - "ĠÙĨÙĤØ·": 137622, - "ĠÙĨÙĤطة": 137623, - "ĠÙĨÙĩا": 134258, - "ĠÙĨÙĩائÙĬ": 142565, - "ĠÙĨÙĩاÙĬØ©": 134259, - "ĠÙĨÙĪØ¹": 131876, - "ĠÙĨÙĪÙģ": 136611, - "ĠÙĨÙĪÙģÙħبر": 136612, - "ĠÙĨÙĬ": 137516, - "ĠÙĨÙĬÙĪØ²": 137517, - "ĠÙĩ": 55891, - "ĠÙĩاتÙģ": 137209, - "ĠÙĩذا": 128280, - "ĠÙĩذÙĩ": 128305, - "ĠÙĩÙĦ": 129859, - "ĠÙĩÙĨا": 126437, - "ĠÙĩÙĨاÙĥ": 128954, - "ĠÙĩÙĪ": 128321, - "ĠÙĩÙĬ": 128420, - "ĠÙĪ": 37524, - "ĠÙĪØ£": 124766, - "ĠÙĪØ£Ø´Ø§Ø±": 138699, - "ĠÙĪØ£Ø¶Ø§Ùģ": 132670, - "ĠÙĪØ£Ùĥد": 137817, - "ĠÙĪØ£ÙĨ": 129265, - "ĠÙĪØ£ÙĪØ¶ØŃ": 139229, - "ĠÙĪØ¥": 126530, - "ĠÙĪØ¥Ø°Ø§": 139790, - "ĠÙĪØ¥ÙĨ": 130915, - "ĠÙĪØ§": 125475, - "ĠÙĪØ§Ø³Øª": 132178, - "ĠÙĪØ§Ø¶": 136314, - "ĠÙĪØ§Ø¶ØŃ": 136315, - "ĠÙĪØ§ØŃد": 126761, - "ĠÙĪØ§ØŃدة": 131205, - "ĠÙĪØ§ÙĦ": 124072, - "ĠÙĪØ§ÙĦØ£": 129271, - "ĠÙĪØ§ÙĦØ¥": 131795, - "ĠÙĪØ§ÙĦا": 131894, - "ĠÙĪØ§ÙĦاست": 138027, - "ĠÙĪØ§ÙĦت": 129006, - "ĠÙĪØ§ÙĦتÙĬ": 129833, - "ĠÙĪØ§ÙĦذÙĬ": 132052, - "ĠÙĪØ§ÙĦس": 134274, - "ĠÙĪØ§ÙĦع": 132525, - "ĠÙĪØ§ÙĦØŃ": 134018, - "ĠÙĪØ§ÙĦÙģ": 135635, - "ĠÙĪØ§ÙĦÙĦÙĩ": 139353, - "ĠÙĪØ§ÙĦÙħ": 128405, - "ĠÙĪØ§ÙĦÙĨ": 133843, - "ĠÙĪØ¨": 124838, - "ĠÙĪØ¨Ø§ÙĦ": 134264, - "ĠÙĪØ¨Ø§ÙĦت": 138826, - "ĠÙĪØ¨Ø§ÙĦتاÙĦÙĬ": 138827, - "ĠÙĪØ¨Ø¹Ø¯": 133593, - "ĠÙĪØ¨ÙĬÙĨ": 135647, - "ĠÙĪØª": 128293, - "ĠÙĪØ¬": 130677, - "ĠÙĪØ¬Ùĩ": 130995, - "ĠÙĪØ¬ÙĪØ¯": 130678, - "ĠÙĪØ®": 142794, - "ĠÙĪØ®Ø§ØµØ©": 142795, - "ĠÙĪØ°ÙĦÙĥ": 129673, - "ĠÙĪØ²": 126857, - "ĠÙĪØ²Ø§Ø±Ø©": 131209, - "ĠÙĪØ²ÙĬر": 130316, - "ĠÙĪØ³ÙĦÙħ": 130753, - "ĠÙĪØ³ÙĬ": 131452, - "ĠÙĪØ¶Ø¹": 130519, - "ĠÙĪØ·ÙĨÙĬ": 143007, - "ĠÙĪØ¹Ø¯": 139361, - "ĠÙĪØ¹Ø¯Ùħ": 139362, - "ĠÙĪØ¹ÙĦÙī": 131247, - "ĠÙĪØ¹ÙĨ": 131933, - "ĠÙĪØºÙĬر": 127751, - "ĠÙĪØºÙĬرÙĩا": 137052, - "ĠÙĪØŃØª": 139082, - "ĠÙĪØŃØªÙī": 139083, - "ĠÙĪÙģÙĬ": 128641, - "ĠÙĪÙĤاÙĦ": 129022, - "ĠÙĪÙĤت": 130133, - "ĠÙĪÙĤد": 128835, - "ĠÙĪÙĥ": 127555, - "ĠÙĪÙĥاÙĨ": 130117, - "ĠÙĪÙĥاÙĨت": 135415, - "ĠÙĪÙĥذÙĦÙĥ": 133950, - "ĠÙĪÙĥÙĦ": 133749, - "ĠÙĪÙĦ": 128827, - "ĠÙĪÙĦا": 128464, - "ĠÙĪÙĦÙĥ": 128701, - "ĠÙĪÙĦÙĥÙĨ": 128702, - "ĠÙĪÙĦÙħ": 130444, - "ĠÙĪÙĦÙĪ": 137814, - "ĠÙĪÙĦÙĬس": 132402, - "ĠÙĪÙħ": 128402, - "ĠÙĪÙħا": 129891, - "ĠÙĪÙħع": 132294, - "ĠÙĪÙħÙĨ": 128562, - "ĠÙĪÙĩ": 124821, - "ĠÙĪÙĩذا": 130267, - "ĠÙĪÙĩذÙĩ": 139769, - "ĠÙĪÙĩÙĨا": 140676, - "ĠÙĪÙĩÙĨاÙĥ": 140677, - "ĠÙĪÙĩÙĪ": 128660, - "ĠÙĪÙĩÙĬ": 129308, - "ĠÙĪÙĬ": 128306, - "ĠÙĪÙĬÙħ": 137049, - "ĠÙĪÙĬÙħÙĥÙĨ": 137050, - "ĠÙĪÙİ": 129095, - "ĠÙĬ": 73274, - "ĠÙĬأتÙĬ": 139379, - "ĠÙĬؤ": 140620, - "ĠÙĬؤدÙĬ": 140621, - "ĠÙĬا": 129720, - "ĠÙĬبدÙĪ": 140260, - "ĠÙĬت": 128657, - "ĠÙĬتعÙĦÙĤ": 137961, - "ĠÙĬتÙħ": 129106, - "ĠÙĬجب": 129539, - "ĠÙĬجعÙĦ": 137204, - "ĠÙĬرÙĬد": 137229, - "ĠÙĬست": 126850, - "ĠÙĬستطÙĬع": 140922, - "ĠÙĬصÙĦ": 137283, - "ĠÙĬعتبر": 137727, - "ĠÙĬعد": 136884, - "ĠÙĬعرÙģ": 136090, - "ĠÙĬعÙħÙĦ": 135048, - "ĠÙĬعÙĨÙĬ": 132338, - "ĠÙĬØŃتاج": 140326, - "ĠÙĬØŃدث": 138996, - "ĠÙĬÙĤدÙħ": 137702, - "ĠÙĬÙĤÙĪÙĦ": 130664, - "ĠÙĬÙĤÙĪÙħ": 133450, - "ĠÙĬÙĥÙĨ": 134192, - "ĠÙĬÙĥÙĪÙĨ": 128731, - "ĠÙĬÙħÙĥÙĨ": 126298, - "ĠÙĬÙħÙĥÙĨÙĥ": 132148, - "ĠÙĬÙĨا": 134339, - "ĠÙĬÙĨاÙĬر": 134340, - "ĠÙĬÙĨب": 140879, - "ĠÙĬÙĨبغÙĬ": 140880, - "ĠÙĬÙĪØ¬Ø¯": 134842, - "ĠÙĬÙĪØ³": 141173, - "ĠÙĬÙĪØ³Ùģ": 141174, - "ĠÙĬÙĪÙĦ": 135620, - "ĠÙĬÙĪÙĦÙĬÙĪ": 135621, - "ĠÙĬÙĪÙħ": 128587, - "ĠÙĬÙĪÙĨ": 135332, - "ĠÙĬÙĪÙĨÙĬÙĪ": 135333, - "ĠÙĬÙİ": 133770, - "ĠÙĬÙı": 129453, - "ĠÚ©": 45593, - "Ġà": 27982, - "Ġà¤": 14925, - "Ġप": 83636, - "Ġम": 91217, - "Ġस": 68158, - "Ġह": 84310, - "Ġà¤ķ": 47809, - "Ġà¦": 35178, - "Ġà¨": 69033, - "Ġàª": 94491, - "Ġà®": 70597, - "Ġà°": 93255, - "Ġà²": 89434, - "Ġม": 143737, - "Ġมา": 129739, - "Ġมี": 126250, - "Ġมีà¸Ļา": 142536, - "Ġมีà¸Ļาà¸Ħม": 142537, - "Ġมà¸ģร": 143738, - "Ġมà¸ģราà¸Ħม": 143739, - "Ġลà¹īาà¸Ļ": 131745, - "Ġวัà¸Ļ": 130175, - "Ġส": 129328, - "Ġสำหรัà¸ļ": 129629, - "Ġสิ": 142444, - "Ġสิà¸ĩ": 142445, - "Ġสิà¸ĩหา": 142446, - "Ġสิà¸ĩหาà¸Ħม": 142447, - "Ġสà¹Īวà¸Ļ": 129983, - "Ġหรืà¸Ń": 128404, - "Ġหาà¸ģ": 130138, - "Ġà¸ģ": 126675, - "Ġà¸ģร": 143866, - "Ġà¸ģรà¸ģà¸İ": 143867, - "Ġà¸ģรà¸ģà¸İาà¸Ħม": 143868, - "Ġà¸ģัà¸Ļ": 143134, - "Ġà¸ģัà¸Ļย": 143135, - "Ġà¸ģัà¸Ļยายà¸Ļ": 143136, - "Ġà¸ģาร": 128539, - "Ġà¸ģุม": 143208, - "Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀ": 143209, - "Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļ": 143210, - "Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļà¸ĺ": 143211, - "Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļà¸ĺà¹Į": 143212, - "Ġà¸ģà¹ĩ": 129300, - "Ġà¸Ĥà¸ĵะà¸Ĺีà¹Ī": 140265, - "Ġà¸Ħืà¸Ń": 129457, - "Ġà¸Ħุà¸ĵ": 130167, - "Ġà¸Ħà¸Ļ": 129619, - "Ġà¸Īะ": 129515, - "Ġà¸Īาà¸ģ": 126648, - "Ġà¸Īาà¸ģà¸Ļัà¹īà¸Ļ": 138072, - "Ġà¸Īึà¸ĩ": 130301, - "Ġà¸ĭึà¹Īà¸ĩ": 126240, - "Ġà¸ĭึà¹Īà¸ĩà¹Ģà¸Ľà¹ĩà¸Ļ": 134357, - "Ġà¸Ķัà¸ĩ": 133793, - "Ġà¸Ķัà¸ĩà¸Ļัà¹īà¸Ļ": 133794, - "Ġà¸ķุ": 142914, - "Ġà¸ķุลา": 142915, - "Ġà¸ķุลาà¸Ħม": 142916, - "Ġà¸ĸà¹īา": 129190, - "Ġà¸Ĺัà¹īà¸ĩ": 137406, - "Ġà¸Ĺัà¹īà¸ĩà¸Ļีà¹ī": 137407, - "Ġà¸Ĺำà¹ĥหà¹ī": 130659, - "Ġà¸Ĺีà¹Ī": 128477, - "Ġà¸ĺ": 142696, - "Ġà¸ĺัà¸Ļ": 142697, - "Ġà¸ĺัà¸Ļวา": 142698, - "Ġà¸ĺัà¸Ļวาà¸Ħม": 142699, - "Ġà¸Ļาย": 130499, - "Ġà¸Ļà¸Ńà¸ģà¸Īาà¸ģ": 134353, - "Ġà¸Ļà¸Ńà¸ģà¸Īาà¸ģà¸Ļีà¹ī": 134354, - "Ġà¸ļาà¸Ĺ": 129649, - "Ġà¸Ľà¸µ": 128806, - "Ġà¸ľà¸¡": 130131, - "Ġà¸ľà¸¹à¹ī": 129543, - "Ġà¸ŀ": 126473, - "Ġà¸ŀรà¹īà¸Ńม": 129575, - "Ġà¸ŀฤษ": 143147, - "Ġà¸ŀà¸¤à¸©à¸łà¸²": 143148, - "Ġà¸ŀà¸¤à¸©à¸łà¸²à¸Ħม": 143149, - "Ġà¸Ń": 129544, - "Ġà¸Ńยà¹Īาà¸ĩà¹Ħร": 142061, - "Ġà¸Ńยà¹Īาà¸ĩà¹Ħรà¸ģà¹ĩà¸ķาม": 142062, - "Ġà¸Ńีà¸ģ": 143045, - "Ġà¸Ńีà¸ģà¸Ĺัà¹īà¸ĩ": 143046, - "Ġà¹Ģ": 94482, - "Ġà¹Ģม": 126419, - "Ġà¹Ģมษ": 143428, - "Ġà¹Ģมษายà¸Ļ": 143429, - "Ġà¹Ģมืà¹Īà¸Ń": 128903, - "Ġà¹Ģรา": 129468, - "Ġà¹Ģà¸Ĭ": 130246, - "Ġà¹Ģà¸Ĭà¹Īà¸Ļ": 130247, - "Ġà¹Ģà¸Ľ": 126323, - "Ġà¹Ģà¸Ľà¹ĩà¸Ļ": 126324, - "Ġà¹Ģà¸Ľà¹ĩà¸Ļà¸ķà¹īà¸Ļ": 138547, - "Ġà¹Ģà¸ŀ": 126306, - "Ġà¹Ģà¸ŀราะ": 128616, - "Ġà¹Ģà¸ŀืà¹Īà¸Ń": 128840, - "Ġà¹ģละ": 128258, - "Ġà¹ģลà¹īว": 129775, - "Ġà¹ģà¸ķà¹Ī": 125442, - "Ġà¹ģà¸ķà¹Īà¸ģà¹ĩ": 139599, - "Ġà¹ģà¸ķà¹Īà¸ĸà¹īา": 141286, - "Ġà¹Ĥà¸Ķย": 126235, - "Ġà¹Ĥà¸Ķยมี": 136931, - "Ġà¹ĥà¸Ļ": 128579, - "Ġà¹Ħมà¹Ī": 129214, - "Ġà¹Ħà¸Ķà¹ī": 126526, - "Ġà¹Ħà¸Ķà¹īà¹ģà¸ģà¹Ī": 140461, - "Ġà¹Ĩ": 128630, - "Ġá": 86089, - "Ġảnh": 128492, - "ĠẤ": 142690, - "ĠẤn": 142691, - "Ġấy": 129331, - "ĠỦ": 142393, - "ĠỦy": 142394, - "Ġá»§ng": 141718, - "Ġá»§y": 137930, - "Ġứng": 128740, - "Ġá»ķ": 133712, - "Ġá»ķn": 133713, - "Ġợ": 128269, - "Ġâ": 2858, - "ĠâĢ": 636, - "ĠâĢ¢": 7288, - "Ġâ̦": 4593, - "Ġâ̦.": 65521, - "Ġâ̦ĊĊ": 12022, - "ĠâĢ«": 131530, - "ĠâĢº": 45633, - "ĠâĢ»": 83399, - "ĠâĢĭ": 29748, - "ĠâĢĭâĢĭ": 72363, - "ĠâĢİ": 53564, - "ĠâĢĵ": 1365, - "ĠâĢĵĊĊ": 46796, - "ĠâĢĶ": 1959, - "ĠâĢĶĊĊ": 62877, - "ĠâĢķ": 50653, - "ĠâĢĺ": 3369, - "ĠâĢĻ": 17744, - "ĠâĢľ": 1036, - "ĠâĢľ[": 65750, - "ĠâĢľâ̦": 91013, - "ĠâĢĿ": 18987, - "ĠâĢĿĊĊ": 66786, - "ĠâĢŀ": 14835, - "Ġâģ": 77137, - "ĠâĤ¬": 12984, - "ĠâĤ¹": 89791, - "ĠâĦ": 28653, - "ĠâĦķ": 57201, - "ĠâĦĸ": 96890, - "ĠâĦĿ": 86023, - "ĠâĨ": 9035, - "ĠâĨIJ": 47464, - "ĠâĨij": 46363, - "ĠâĨĴ": 11397, - "ĠâĨĴĊĊ": 28429, - "ĠâĨĵ": 77854, - "ĠâĨĶ": 77650, - "Ġâĩ": 46018, - "ĠâĩĴ": 58703, - "ĠâĪ": 11995, - "ĠâΧ": 73978, - "ĠâĪĢ": 54700, - "ĠâĪĪ": 48335, - "ĠâĪĴ": 24196, - "Ġâī": 21103, - "Ġâī¤": 37294, - "Ġâī¥": 62147, - "Ġâīł": 94304, - "ĠâĬ": 53025, - "Ġâĵĺ": 89800, - "ĠâĶ": 22612, - "ĠâĶĤ": 33391, - "ĠâĶľ": 71678, - "ĠâĶľâĶĢâĶĢ": 80493, - "Ġâķ": 58208, - "Ġâĸ": 14520, - "Ġâĸº": 65211, - "ĠâĸĪ": 32588, - "ĠâĸĪâĸĪ": 56773, - "ĠâĸĪâĸĪâĸĪâĸĪâĸĪ": 92329, - "Ġâĸij": 90813, - "Ġâĸł": 49450, - "ĠâĹ": 55729, - "ĠâĹĭ": 129183, - "ĠâĹı": 50461, - "Ġâĺ": 25125, - "Ġâĺħ": 37234, - "ĠâĺĨ": 92848, - "ĠâĻ": 35358, - "ĠâĻ¥": 67579, - "Ġâľ": 25521, - "Ġâľĵ": 52375, - "ĠâľĶ": 57156, - "ĠâĿ": 51414, - "ĠâĿ¤": 70470, - "Ġâŀ": 82706, - "ĠâŁ": 34410, - "Ġ⣨": 42005, - "ĠãĢĤ": 59133, - "ĠãĢĮ": 44531, - "ĠãĢIJ": 33576, - "Ġãģ®": 96618, - "Ġãģĵãģ®": 129770, - "ĠãĤ": 17587, - "ĠãĤ¢": 93532, - "ĠãĤ³": 66942, - "ĠãĤ¹": 78950, - "ĠãĤĴ": 94271, - "Ġãĥ": 20711, - "Ġãĥ»": 62315, - "ĠãĥĪãĥ©": 143983, - "ĠãĥĪãĥ©ãĥĥãĤ¯": 143984, - "ĠãĥĪãĥ©ãĥĥãĤ¯ãĥIJãĥĥãĤ¯": 143985, - "Ġ主": 89982, - "Ġä¸Ĭ": 64118, - "Ġä¸ĭ": 39095, - "Ġä¸ĭåįĪ": 56904, - "Ġä¸į": 86009, - "Ġä¸Ń": 72858, - "Ġ使ç͍": 85658, - "Ġä¿®æĶ¹": 63071, - "Ġå": 4891, - "Ġå¤": 40666, - "Ġå¦Ĥ": 69372, - "Ġå¦Ĥæŀľ": 81263, - "Ġå®": 41479, - "Ġå®ŀ": 92293, - "Ġå¯": 48754, - "Ġ对": 69162, - "Ġå°": 58230, - "Ġå±": 79621, - "Ġå·": 83002, - "Ġå¹": 74577, - "Ġåº": 95522, - "Ġå¼": 52506, - "Ġå¼Ģ": 81947, - "Ġå½": 65197, - "Ġå½ĵ": 84897, - "Ġå¾": 84141, - "Ġå¿": 88940, - "Ġåħ": 34369, - "Ġåħ³": 91417, - "ĠåĨ": 68739, - "Ġåĩ": 65727, - "ĠåĪ": 19468, - "ĠåĪĨ": 58657, - "ĠåĪĽå»º": 47758, - "ĠåĪĿå§ĭåĮĸ": 76090, - "ĠåĪłéϤ": 63073, - "ĠåĬ": 54599, - "ĠåĬł": 93883, - "ĠåĮ": 94305, - "Ġåį": 66521, - "Ġåı": 26853, - "ĠåıĤæķ°": 70969, - "Ġåıij": 69425, - "ĠåIJ": 38433, - "ĠåIJį": 61105, - "ĠåĴĮ": 58143, - "Ġåķ": 78971, - "ĠåķĨ": 83310, - "ĠåķĨåĵģ": 95307, - "ĠåĽ": 49602, - "ĠåĽ¾": 90867, - "Ġåľ": 53599, - "Ġåľ¨": 73562, - "ĠåŃ": 53497, - "ĠåŃĹ": 73312, - "Ġæ": 6567, - "Ġæ³": 59053, - "Ġ注": 62579, - "Ġ注æĦı": 97161, - "Ġæµ": 98313, - "Ġæ·»åĬł": 82339, - "Ġæ¸": 97259, - "ĠæĢ": 90476, - "ĠæĪ": 49434, - "ĠæĪIJ": 86546, - "ĠæĪĸ": 92313, - "Ġæī": 46750, - "ĠæĬ": 96155, - "Ġæİ": 46602, - "Ġæİ§": 80851, - "Ġæı": 55059, - "ĠæıIJ": 93685, - "ĠæĶ": 80090, - "Ġæķ": 43614, - "Ġæķ°": 47685, - "Ġæķ°æį®": 62262, - "Ġæĸ": 31286, - "Ġæĸ°": 78919, - "Ġæĸ¹": 71773, - "Ġæĸ¹æ³ķ": 81454, - "Ġæĸĩ": 53040, - "Ġæĸĩä»¶": 69594, - "ĠæĹ¥": 75402, - "ĠæĹ¶éĹ´": 91218, - "Ġæĺ": 38903, - "Ġæĺ¯": 54851, - "Ġæĺ¯åIJ¦": 71951, - "ĠæĽ": 65456, - "ĠæĽ´": 72669, - "ĠæĽ´æĸ°": 78103, - "ĠæľĢ": 82539, - "ĠæĿ": 60596, - "Ġæŀ": 93920, - "ĠæŁ¥": 69353, - "ĠæŁ¥è¯¢": 80528, - "Ġæł": 51461, - "ĠæŃ": 71928, - "Ġç": 10236, - "Ġç¤": 76952, - "Ġ示": 79704, - "Ġ示ä¾ĭ": 80426, - "Ġç§": 75671, - "Ġç¬": 48840, - "Ġ第": 50331, - "Ġç±": 68433, - "Ġç±»": 69674, - "Ġç»": 44054, - "Ġç»ĵ": 89254, - "Ġç¼": 84238, - "Ġçī": 64388, - "Ġç͍æĪ·": 50042, - "ĠçĶŁ": 58263, - "ĠçĶŁåij½åij¨æľŁ": 63079, - "ĠçĶŁåij½åij¨æľŁåĩ½æķ°": 63860, - "ĠçĻ": 68294, - "ĠçĻ»": 91427, - "ĠçļĦ": 43589, - "ĠçĽ": 74866, - "Ġè": 8908, - "Ġè¡": 77407, - "Ġè§": 54955, - "Ġè§£": 85122, - "Ġè®": 33424, - "Ġ设": 46466, - "Ġ设置": 53054, - "Ġ请æ±Ĥ": 80876, - "Ġè¾": 42849, - "Ġè¾ĵ": 44372, - "Ġè¾ĵåħ¥": 69058, - "Ġè¾ĵåĩº": 70568, - "Ġè¿": 32181, - "Ġè¿ĶåĽŀ": 55616, - "Ġèĩ": 58464, - "Ġèĩª": 61991, - "ĠèĩªåĬ¨çĶŁæĪIJ": 97028, - "Ġèĭ": 83226, - "Ġèĭ¥": 92498, - "Ġèĭ¥è¦ģ": 98396, - "Ġèİ·åıĸ": 40671, - "Ġé": 18137, - "Ġ页éĿ¢": 74159, - "Ġé»": 72036, - "Ġé»ĺ认": 80546, - "ĠéĶ": 93178, - "Ġê": 8620, - "Ġê°": 16778, - "Ġê°Ģ": 35509, - "Ġê°ĢëĬ¥": 95351, - "Ġê°ĢëĬ¥ìĦ±": 142724, - "Ġê°ĢëĬ¥íķľ": 143964, - "Ġê°Ģì§Ģ": 127154, - "Ġê°Ģì§Ģê³ł": 131670, - "Ġê°Ģì¹ĺ": 140890, - "Ġê°Ģìļ´": 142179, - "Ġê°Ģìļ´ëį°": 142180, - "Ġê°Ģìŀ¥": 130887, - "Ġê°Ģìł¸": 88846, - "Ġê°ģ": 126804, - "Ġê°ģì¢ħ": 142684, - "Ġê°IJ": 129423, - "Ġê°Ĵ": 45563, - "Ġê°ĴìĿĦ": 93668, - "Ġê°ķ": 129413, - "Ġê°ĸ": 143143, - "Ġê°ĸê³ł": 143144, - "Ġê°Ļ": 78374, - "Ġê°Ļëĭ¤": 135898, - "Ġê°ĻìĬµëĭĪëĭ¤": 138691, - "Ġê°ĻìĿ´": 131050, - "Ġê°ĻìĿĢ": 129381, - "Ġê°ľ": 73523, - "Ġê°ľëħIJ": 142497, - "Ġê°ľìµľ": 143497, - "Ġê°ľìĿ¸": 126799, - "Ġê°ľìĿ¸ìłķë³´": 130096, - "Ġê°Ŀì²´": 75232, - "Ġê±": 97172, - "Ġê±°": 126352, - "Ġê±°ìĿĺ": 138313, - "Ġê±´": 130270, - "Ġ걸": 131961, - "Ġê²": 23894, - "Ġê²°": 82619, - "Ġê²°ê³¼": 98801, - "Ġê²°êµŃ": 136724, - "Ġê²°ìłķ": 135763, - "Ġê²½": 43115, - "Ġê²½ìļ°": 49052, - "Ġê²½ìļ°ìĹIJëĬĶ": 134832, - "Ġê²½íĹĺ": 138704, - "Ġê²Ģ": 85322, - "Ġê²ģ": 141693, - "Ġê²ģëĭĪëĭ¤": 141694, - "Ġê²ĥ": 71108, - "Ġê²ĥëıĦ": 137638, - "Ġê²ĥìľ¼ë¡ľ": 132091, - "Ġê²ĥìĿ´": 128584, - "Ġê²ĥìĿ´ëĭ¤": 128900, - "Ġê²ĥìĿĢ": 129274, - "Ġê²ĥìĿĦ": 129337, - "Ġê²ĥìŀħëĭĪëĭ¤": 130882, - "Ġê²Į": 98927, - "Ġê³": 45130, - "Ġê³µ": 125466, - "Ġê³µê°Ħ": 142496, - "Ġê³µëıĻ": 140429, - "Ġê³Ħ": 94203, - "Ġê³ĦìĨį": 133788, - "Ġê³ł": 126429, - "Ġê³łê°Ŀ": 138501, - "Ġê´Ģ": 92751, - "Ġê´Ģ볨": 129985, - "Ġê´Ģìĭ¬": 138449, - "Ġê´Ģíķľ": 130207, - "Ġêµ": 124459, - "Ġ구": 58777, - "Ġ구ìĦ±": 136239, - "Ġêµī": 142660, - "Ġêµīìŀ¥": 142661, - "Ġêµīìŀ¥íŀĪ": 142662, - "ĠêµIJ": 127048, - "ĠêµIJìĪĺ": 142220, - "ĠêµŃ": 124973, - "ĠêµŃê°Ģ": 133152, - "ĠêµŃ민": 135138, - "ĠêµŃëĤ´": 141185, - "ĠêµŃìłľ": 138249, - "ĠêµŃíļĮ": 143333, - "Ġê¶": 142451, - "Ġê¶Į": 142452, - "Ġê¶Į리": 142453, - "Ġê·": 134312, - "Ġê·¸": 54825, - "Ġê·¸ê²ĥ": 126038, - "Ġê·¸ê²ĥìĿĢ": 136742, - "Ġê·¸ê²ĥìĿĦ": 139484, - "Ġ그리": 126342, - "Ġê·¸ë¦¬ê³ł": 128719, - "Ġ그리ìĬ¤": 142103, - "Ġ그리ìĬ¤ëıĦ": 142104, - "Ġê·¸ëĥ¥": 139456, - "Ġê·¸ëŀĺ": 129547, - "Ġê·¸ëŀĺìĦľ": 129548, - "Ġê·¸ëŁ¬": 125261, - "Ġê·¸ëŁ¬ë©´": 135243, - "Ġê·¸ëŁ¬ëĤĺ": 130549, - "Ġê·¸ëŁ¬ëĭĪê¹Į": 141306, - "Ġê·¸ëŁ°": 126615, - "Ġê·¸ëŁ°ëį°": 130790, - "Ġê·¸ëŁ¼": 141357, - "Ġê·¸ëłĩ": 125971, - "Ġê·¸ëłĩê²Į": 132330, - "Ġê·¸ëłĩì§Ģ": 143600, - "Ġê·ľ": 134313, - "Ġê·ľìłķ": 134314, - "Ġê¸": 40771, - "Ġ기": 54116, - "Ġ기본": 136089, - "Ġ기ìĸµ": 140914, - "Ġ기íĥĢ": 137734, - "Ġê¸Ģ": 131522, - "Ġê¹": 130507, - "Ġê¹Ģ": 130508, - "Ġë": 5140, - "Ġë¡": 70585, - "Ġë¡ľ": 71015, - "Ġ리": 56983, - "Ġ리ìĬ¤íĬ¸": 83634, - "Ġë§": 32985, - "Ġ매": 126932, - "Ġ매ìļ°": 137016, - "Ġë§Ī": 95577, - "Ġë§Ī볨": 140175, - "Ġë§Īì§Ģ": 140886, - "Ġë§Īì§Ģë§ī": 140887, - "Ġë§ĪìĿĮ": 131766, - "Ġë§Į": 62107, - "Ġë§ĮëĤĺ": 142353, - "Ġë§Įëĵ¤": 127579, - "Ġë§Įëĵ¤ìĸ´": 134108, - "Ġë§Įìķ½": 139327, - "Ġë§İ": 126735, - "Ġë§İìĿ´": 130966, - "Ġë§İìĿĢ": 129875, - "Ġë§IJ": 126254, - "Ġë§IJìĶĢ": 129907, - "Ġë§ŀ": 131417, - "Ġë¨": 137767, - "Ġ먼": 137768, - "Ġ먼ìłĢ": 137769, - "Ġë©": 48108, - "Ġë©Ķ": 51391, - "Ġëª": 36978, - "Ġ모": 54070, - "Ġ모르": 136105, - "Ġ모ëijIJ": 130593, - "Ġ모ëĵł": 129304, - "Ġ모ìĬµ": 136665, - "Ġ목": 134952, - "Ġ목ìłģ": 134953, - "Ġ못": 129293, - "Ġëªħ": 130345, - "Ġë¬": 133552, - "Ġ무": 125149, - "Ġ무ë£Į": 139737, - "Ġ무ìĬ¨": 142374, - "Ġ무ìĹĩ": 132779, - "Ġ문": 53435, - "Ġ문ìĦľ": 139236, - "Ġ문ìŀIJ": 79921, - "Ġë¬¸ìłľ": 126674, - "Ġë¬¸ìłľê°Ģ": 137903, - "Ġ물": 133553, - "Ġë¬¼ë¡ł": 133554, - "Ġë¯": 125713, - "Ġ미": 125714, - "Ġ미êµŃ": 132662, - "Ġ미ëŀĺ": 143005, - "Ġë°": 22042, - "Ġë°©": 74808, - "Ġ방문": 141875, - "Ġë°©ë²ķ": 130864, - "Ġë°°": 73669, - "Ġë°°ìĹ´": 90960, - "Ġë°ı": 128355, - "Ġë°Ķ": 81718, - "Ġë°Ķë¡ľ": 130737, - "Ġë°Ķëŀį": 136924, - "Ġë°ĶëŀįëĭĪëĭ¤": 136925, - "Ġë°ĺ": 63757, - "Ġë°ĺëĵľ": 141761, - "Ġë°ĺëĵľìĭľ": 141762, - "Ġë°ĺíĻĺ": 94879, - "Ġë°Ľ": 83596, - "Ġë°ĽìķĦ": 135839, - "Ġë°ľ": 95996, - "Ġë°ľê²¬": 142300, - "Ġë°ľìĥĿ": 133396, - "Ġë°ľíijľ": 142234, - "Ġë²": 47665, - "Ġë²Ħ": 86831, - "Ġë²Ī": 84621, - "Ġë²ķ": 126785, - "Ġë²ķë¥ł": 136324, - "Ġë³": 30520, - "Ġë³´": 63332, - "Ġ보기": 138540, - "Ġë³´ë©´": 132513, - "Ġë³´ëĤ´": 141836, - "Ġ본": 129238, - "Ġë³Ģ": 46319, - "Ġë³Ģê²½": 87737, - "Ġë³ĢìĪĺ": 80740, - "Ġë³ĢíĻĶ": 137525, - "Ġë¶": 62740, - "Ġë¶Ģ": 85403, - "Ġë¶Ģë¶Ħ": 129881, - "Ġë¶ģ": 139963, - "Ġë¶ģíķľ": 139964, - "Ġë¶Ħ": 128618, - "Ġë¶Ī": 126488, - "Ġë¶Ī구": 143681, - "Ġë¶Ī구íķĺê³ł": 143682, - "Ġë¹Ħ": 73986, - "Ġë¹ĦêµIJ": 142350, - "ĠëĤ": 37195, - "ĠëĤ¨": 129624, - "ĠëĤ´": 66136, - "ĠëĤ´ê°Ģ": 131277, - "ĠëĤ´ìļ©": 130213, - "ĠëĤĺ": 73518, - "ĠëĤĺëĬĶ": 132311, - "ĠëĤĺëĿ¼": 137449, - "ĠëĤĺìĺ¤": 137298, - "ĠëĤĺíĥĢ": 135513, - "ĠëĦ": 65553, - "ĠëĦĪ": 127454, - "ĠëĦĪ무": 133267, - "ĠëĦĪíĿ¬": 139616, - "ĠëĦĺ": 143835, - "ĠëĦĺìĸ´": 143836, - "Ġëħ": 127041, - "Ġëħ¸": 127042, - "Ġëħ¸ëł¥": 136111, - "ĠëĪ": 138658, - "ĠëĪĦ": 138659, - "ĠëĪĦ구": 138660, - "ĠëĬ": 143861, - "ĠëĬIJ": 143862, - "ĠëĬIJëĤĮ": 143863, - "Ġëĭ": 34143, - "Ġëĭ¤": 49367, - "Ġëĭ¤ë¥´": 142512, - "Ġëĭ¤ë¥¸": 128772, - "Ġëĭ¤ë§Į": 139293, - "Ġëĭ¤ìĭľ": 131170, - "Ġëĭ¤ìĸij": 135391, - "Ġëĭ¤ìĸijíķľ": 135392, - "Ġëĭ¤ìĿĮ": 126844, - "Ġëĭ¤ìĿĮê³¼": 139107, - "Ġëĭ¨": 129400, - "Ġëĭµ": 143603, - "Ġëĭµë³Ģ": 143604, - "Ġëĭ¹": 125834, - "Ġëĭ¹ìĭľ": 140730, - "Ġëĭ¹ìĭł": 131502, - "ĠëĮ": 143241, - "ĠëĮĢ": 60960, - "ĠëĮĢë¶Ģ": 140093, - "ĠëĮĢë¶Ģë¶Ħ": 140094, - "ĠëĮĢíĨµ": 136773, - "ĠëĮĢíĨµëł¹": 136774, - "ĠëĮĢíķ´": 131978, - "ĠëĮĢíķ´ìĦľ": 130869, - "ĠëĮĢíķĺìŬ": 135878, - "ĠëĮĢíķľ": 128605, - "ĠëĮĵ": 143242, - "ĠëĮĵê¸Ģ": 143243, - "Ġëį": 126365, - "Ġëį°ìĿ´íĦ°": 54248, - "ĠëįĶ": 126366, - "ĠëįĶìļ±": 140084, - "Ġëı": 64805, - "ĠëıĦ": 129392, - "ĠëıĮ": 137843, - "ĠëıĮìķĦ": 137844, - "ĠëıĻ": 126322, - "ĠëıĻìĭľ": 143408, - "ĠëıĻìĭľìĹIJ": 143409, - "ĠëIJ": 72344, - "ĠëIJĺ": 97143, - "ĠëIJľ": 130722, - "ĠëIJľëĭ¤": 130723, - "ĠëIJł": 130647, - "ĠëijIJ": 129419, - "Ġëĵ": 55838, - "Ġëĵ¤": 129900, - "Ġëĵ¤ìĸ´": 129901, - "Ġëĵ±": 77002, - "Ġëĵ±ìĿĦ": 134454, - "Ġëĵ±ìĿĺ": 136357, - "ĠëĶ": 76497, - "ĠëͰ": 125686, - "ĠëĶ°ë¥¸": 136707, - "ĠëͰëĿ¼": 126629, - "ĠëͰëĿ¼ìĦľ": 134084, - "ĠëķĮ": 53618, - "ĠëķĮ문": 126495, - "ĠëķĮ문ìĹIJ": 129147, - "ĠëķĮ문ìĿ´ëĭ¤": 137141, - "Ġëĺ": 125639, - "ĠëĺIJ": 125640, - "ĠëĺIJëĬĶ": 129549, - "ĠëĺIJíķľ": 130005, - "Ġì": 3315, - "Ġì¡°": 65510, - "Ġì¡°ê¸Ī": 134422, - "Ġì¡°ì§ģ": 141655, - "Ġì¡°íļĮ": 97167, - "Ġì¡´": 134014, - "Ġì¡´ìŀ¬": 134015, - "Ġì¢": 65699, - "Ġì¢Ģ": 130572, - "Ġì¢ħ": 98358, - "Ġì¢ĭ": 125953, - "Ġì¢ĭìķĦ": 138779, - "Ġì¢ĭìĿĢ": 132968, - "Ġ주": 55673, - "Ġ주ìŀ¥": 140200, - "Ġì¤": 53989, - "Ġì¤Ģ": 138267, - "Ġì¤Ģë¹Ħ": 138268, - "Ġì¤ij": 70943, - "Ġì¤ijêµŃ": 138373, - "Ġì¤ijìĭ¬": 141482, - "Ġì¤ijìļĶ": 127840, - "Ġì¤ijìļĶíķľ": 136361, - "Ġì¦": 132376, - "Ġì¦ī": 132377, - "Ġì§": 47911, - "Ġì§Ģ": 66790, - "Ġì§Ģê¸Ī": 129082, - "Ġì§ĢëĤľ": 133146, - "Ġì§ĢìĹŃ": 131937, - "Ġì§ĢìĽIJ": 132185, - "Ġì§ģ": 137351, - "Ġì§ģìłij": 137352, - "Ġì§Ħ": 126616, - "Ġì§Ħíĸī": 132876, - "Ġì§Ī": 138519, - "Ġì§Ī문": 138520, - "Ġì§ij": 130263, - "Ġì°": 62099, - "Ġì°¨": 129882, - "Ġì°¸": 127969, - "Ġì°¸ê³ł": 142616, - "Ġì°¸ìŬ": 138098, - "Ġì°¾": 138037, - "Ġì°¾ìķĦ": 138038, - "Ġì±ħ": 138001, - "Ġì±ħìŀĦ": 138002, - "Ġì²": 48364, - "Ġì²ĺ": 71647, - "Ġì²ĺ리": 81058, - "Ġì²ĺìĿĮ": 136065, - "Ġì´Ī": 83315, - "Ġì´Ī기": 95313, - "Ġìµľ": 81173, - "Ġìµľê·¼": 139465, - "Ġì¶": 36330, - "Ġì¶Ķ": 57835, - "Ġì¶Ķê°Ģ": 68408, - "Ġì¶Ķì§Ħ": 141210, - "Ġì¶ľëł¥": 61126, - "Ġì·¨": 131565, - "Ġì¹": 90711, - "Ġì»": 89095, - "Ġì»´": 143520, - "Ġì»´íĵ¨": 143521, - "Ġì»´íĵ¨íĦ°": 143522, - "Ġì½Ķëĵľ": 91605, - "ĠìĤ": 127165, - "ĠìĤ¬": 32129, - "ĠìĤ¬ê±´": 138629, - "ĠìĤ¬ëŀ": 124693, - "ĠìĤ¬ëŀĮ": 124889, - "ĠìĤ¬ëŀĮëĵ¤": 131508, - "ĠìĤ¬ëŀĮëĵ¤ìĿ´": 135990, - "ĠìĤ¬ëŀĮìĿ´": 133166, - "ĠìĤ¬ëŀĮìĿĢ": 140173, - "ĠìĤ¬ëŀij": 132488, - "ĠìĤ¬ì§Ħ": 139764, - "ĠìĤ¬ìĭ¤": 130037, - "ĠìĤ¬ìĹħ": 131608, - "ĠìĤ¬ìļ©": 40720, - "ĠìĤ¬ìĿ´": 136541, - "ĠìĤ¬íļĮ": 130592, - "ĠìĤ´": 127166, - "ĠìĤ´ìķĦ": 137879, - "ĠìĤŃìłľ": 76592, - "Ġìĥ": 134582, - "Ġìĥģ": 58034, - "Ġìĥģíĥľ": 137619, - "ĠìĥĪ": 134583, - "ĠìĥĪë¡ľ": 134584, - "ĠìĥĪë¡ľìļ´": 134585, - "ĠìĥĿ": 47818, - "ĠìĥĿê°ģ": 128646, - "ĠìĥĿëªħ": 141659, - "ĠìĥĿìĤ°": 141091, - "ĠìĥĿìĦ±": 51917, - "ĠìĦ": 27767, - "ĠìĦ¤": 57852, - "ĠìĦ¤ëªħ": 133828, - "ĠìĦ¤ì¹ĺ": 134739, - "ĠìĦ¤ìłķ": 65880, - "ĠìĦ±": 128677, - "ĠìĦ¸": 125674, - "ĠìĦ¸ê³Ħ": 133196, - "ĠìĦ¸ìĥģ": 134976, - "ĠìĦľ": 89860, - "ĠìĦľë¡ľ": 137765, - "ĠìĦľë¹ĦìĬ¤": 130778, - "ĠìĦľìļ¸": 136905, - "ĠìĦł": 129296, - "ĠìĦłíĥĿ": 86038, - "ĠìĨ": 77596, - "ĠìĨĮ": 126291, - "ĠìĨĮê°ľ": 142559, - "ĠìĪ": 69192, - "ĠìĪĺ": 28733, - "ĠìĪĺëıĦ": 134013, - "ĠìĪĺì§ij": 140458, - "ĠìĪĺìłķ": 88513, - "ĠìĪĺíĸī": 139393, - "ĠìĪľ": 143802, - "ĠìĪľê°Ħ": 143803, - "Ġìī": 142067, - "Ġìī½": 142068, - "Ġìī½ê²Į": 142069, - "ĠìĬ": 79207, - "ĠìĬ¤": 141767, - "ĠìĬ¤ìĬ¤": 141768, - "ĠìĬ¤ìĬ¤ë¡ľ": 141769, - "Ġìĭ": 28927, - "Ġìĭ¤": 126423, - "Ġìĭ¤ìłľ": 142700, - "Ġìĭ¤ìłľë¡ľ": 142701, - "Ġìĭ¤í": 60985, - "Ġìĭ¤íĸī": 85788, - "Ġìĭľ": 44518, - "Ġìĭľê°Ħ": 130217, - "Ġìĭľìŀij": 93721, - "Ġìĭľíĸī": 138767, - "Ġìĭł": 128753, - "Ġìķ": 23872, - "ĠìķĦ": 48408, - "ĠìķĦë§Ī": 140749, - "ĠìķĦ무": 134006, - "ĠìķĦëĭĪ": 126523, - "ĠìķĦëĭĪëĭ¤": 139429, - "ĠìķĦëĭĪëĿ¼": 130651, - "ĠìķĦëĭĮ": 134808, - "ĠìķĦëŀĺ": 136646, - "ĠìķĦ주": 138652, - "ĠìķĦì§ģ": 137289, - "ĠìķĦìĿ´": 130902, - "ĠìķĪ": 95170, - "ĠìķĬ": 50696, - "ĠìķĬê³ł": 135201, - "ĠìķĬëĬĶ": 127728, - "ĠìķĬëĬĶëĭ¤": 137764, - "ĠìķĬìĬµëĭĪëĭ¤": 138539, - "ĠìķĬìķĺ": 133995, - "ĠìķĬìĿĢ": 136278, - "ĠìķĬìĿĦ": 136982, - "ĠìķĮ": 125214, - "ĠìķĮê³ł": 135420, - "ĠìķĮ볤": 138630, - "ĠìķĮìķĦ": 137676, - "Ġìķŀ": 139274, - "Ġìķŀìľ¼ë¡ľ": 139275, - "Ġìĸ": 79302, - "Ġìĸ´": 124685, - "Ġìĸ´ëĬIJ": 133487, - "Ġìĸ´ëĶĶ": 139740, - "Ġìĸ´ëĸ": 126537, - "Ġìĸ´ëĸ¤": 129273, - "Ġìĸ´ëĸ»": 130107, - "Ġìĸ´ëĸ»ê²Į": 130108, - "Ġìĸ´ëłµ": 143337, - "Ġìĸ¸": 139957, - "Ġìĸ¸ìłľ": 139958, - "Ġìĸ¼": 138665, - "Ġìĸ¼ë§Ī": 138666, - "Ġìĸ¼ë§ĪëĤĺ": 138667, - "Ġìĸĺ": 135939, - "Ġìĸĺ기": 135940, - "ĠìĹ": 24485, - "ĠìŬ": 83518, - "ĠìĹ¬ê¸°": 131180, - "ĠìŬ룬": 127296, - "ĠìŬ룬ë¶Ħ": 134637, - "ĠìŬìĦ±": 140546, - "ĠìŬíĸī": 142815, - "ĠìŰ": 77353, - "ĠìĹ°ê²°": 141819, - "ĠìĹ°êµ¬": 131698, - "ĠìĹ´": 130847, - "ĠìĹĨ": 46682, - "ĠìĹĨëĬĶ": 130768, - "ĠìĹĨëĭ¤": 130671, - "ĠìĹĨìĬµëĭĪëĭ¤": 136673, - "ĠìĹIJ": 90486, - "ĠìĹŃ": 127864, - "ĠìĹŃìĤ¬": 136608, - "ĠìĹŃìĭľ": 139512, - "Ġìĺ": 38523, - "Ġìĺ¤": 73077, - "Ġìĺ¤ëĬĺ": 133857, - "Ġìĺ¤í": 142209, - "Ġìĺ¤íŀ": 142210, - "Ġìĺ¤íŀĪ": 142211, - "Ġìĺ¤íŀĪ볤": 142212, - "Ġìĺģ": 126440, - "ĠìĺģíĻĶ": 137116, - "ĠìĺĪ": 95617, - "ĠìĺĪìĤ°": 138892, - "ĠìĺĪìĪĺ": 128040, - "ĠìĺĪìĪĺëĭĺ": 139174, - "ĠìĻ": 74884, - "Ġìļ": 65722, - "Ġìļ°": 124657, - "Ġìļ°ë¦¬": 124830, - "Ġìļ°ë¦¬ê°Ģ": 131025, - "Ġìļ°ë¦¬ëĤĺ": 142336, - "Ġìļ°ë¦¬ëĤĺëĿ¼": 142337, - "Ġìļ°ë¦¬ëĬĶ": 131746, - "Ġìļ°ë¦¬ìĿĺ": 137808, - "Ġìļ°ìĦł": 140680, - "Ġìļ´": 132028, - "Ġìļ´ìĺģ": 132029, - "ĠìļĶ": 85997, - "ĠìļĶ구": 135797, - "ĠìļĶì²Ń": 142163, - "ĠìĽ": 85413, - "ĠìĽIJ": 129093, - "Ġìľ": 37064, - "ĠìľĦ": 45710, - "ĠìľĦì¹ĺ": 98987, - "ĠìľĦìĽIJ": 143128, - "ĠìľĦìĽIJëĭĺ": 143129, - "ĠìľĦíķ´": 130039, - "ĠìľĦíķ´ìĦľ": 133083, - "ĠìľĦíķĺìŬ": 133621, - "ĠìľĦíķľ": 130679, - "Ġìľł": 126310, - "Ġìľłì§Ģ": 139871, - "ĠìĿ": 16751, - "ĠìĿ´": 23084, - "ĠìĿ´ê²ĥ": 128022, - "ĠìĿ´ê²ĥìĿ´": 143419, - "ĠìĿ´ê²ĥìĿĢ": 138849, - "ĠìĿ´ê²Į": 139365, - "ĠìĿ´ë£¨": 139646, - "ĠìĿ´ë£¨ìĸ´": 139647, - "ĠìĿ´ë¥¼": 136342, - "ĠìĿ´ë¦Ħ": 86034, - "ĠìĿ´ë¯¸": 90667, - "ĠìĿ´ë²Ī": 132183, - "ĠìĿ´ë٬": 131366, - "ĠìĿ´ë٬íķľ": 131367, - "ĠìĿ´ëٰ": 129007, - "ĠìĿ´ëłĩ": 130652, - "ĠìĿ´ëłĩê²Į": 130653, - "ĠìĿ´ìĥģ": 130408, - "ĠìĿ´ìķ¼": 130860, - "ĠìĿ´ìķ¼ê¸°": 130861, - "ĠìĿ´ìļ©": 126563, - "ĠìĿ´ìļ©ìŀIJ": 139436, - "ĠìĿ´ìľł": 132819, - "ĠìĿ´ìłľ": 132911, - "ĠìĿ´íķ´": 133329, - "ĠìĿ´íĽĦ": 136331, - "ĠìĿ¸": 58677, - "ĠìĿ¸ê°Ħ": 133204, - "ĠìĿ¸ìłķ": 139180, - "ĠìĿ¼": 83556, - "ĠìĿ¼ë°ĺ": 134664, - "ĠìĿ¼ë³¸": 136293, - "ĠìĿ¼ë¶Ģ": 136605, - "ĠìĿ¼ëĭ¨": 140667, - "ĠìĿ¼ìĿ´": 136168, - "ĠìĿ¼ìĿĦ": 138507, - "ĠìĿĺ": 124970, - "ĠìĿĺ견": 140264, - "ĠìĿĺ미": 132989, - "ĠìĿĺìĤ¬": 141888, - "ĠìĿĺìĽIJ": 138842, - "ĠìĿĺíķ´": 136009, - "Ġìŀ": 16235, - "Ġìŀ¥": 129359, - "Ġìŀ¬": 129242, - "Ġìŀħ": 38150, - "Ġìŀħëł¥": 42349, - "Ġìŀħìŀ¥": 140585, - "ĠìŀĪ": 35339, - "ĠìŀĪê²Į": 142161, - "ĠìŀĪê³ł": 131891, - "ĠìŀĪ기": 137334, - "ĠìŀĪëĬĶ": 64521, - "ĠìŀĪëĬĶëį°": 134563, - "ĠìŀĪëĭ¤": 90686, - "ĠìŀĪëĭ¤ê³ł": 137119, - "ĠìŀĪëĭ¤ëĬĶ": 135511, - "ĠìŀĪëıĦë¡Ŀ": 136303, - "ĠìŀĪì§Ģ": 141231, - "ĠìŀĪì§Ģë§Į": 141258, - "ĠìŀĪìĬµëĭĪëĭ¤": 128472, - "ĠìŀĪìĸ´": 127353, - "ĠìŀĪìĸ´ìĦľ": 136633, - "ĠìŀĪìĹĪ": 132236, - "ĠìŀĪìĹĪëĭ¤": 137046, - "ĠìŀĪìľ¼": 135354, - "ĠìŀĪìľ¼ë©°": 132931, - "ĠìŀĪìĿĦ": 130689, - "ĠìŀIJ": 64577, - "ĠìŀIJ기": 131823, - "ĠìŀIJ리": 140210, - "ĠìŀIJì²´": 136751, - "ĠìŀIJìĭł": 127218, - "ĠìŀIJìĭłìĿĺ": 134748, - "ĠìŀIJìŰ": 140577, - "ĠìŀIJìľł": 138266, - "Ġìŀij": 68232, - "ĠìŀijìĦ±": 140174, - "ĠìŀijìĹħ": 139495, - "ĠìŀijìĿĢ": 143416, - "ĠìŀijíĴĪ": 143586, - "Ġìŀĺ": 126720, - "Ġìŀĺ못": 142357, - "Ġìł": 18585, - "ĠìłĢ": 125569, - "ĠìłĢëĬĶ": 134561, - "ĠìłĢìŀ¥": 57547, - "ĠìłĢíĿ¬": 132301, - "Ġìłģ": 135968, - "Ġìłģìļ©": 135969, - "ĠìłĦ": 56419, - "ĠìłĦì²´": 137138, - "ĠìłĦíĺĢ": 143552, - "Ġìłij": 143188, - "Ġìłijê·¼": 143189, - "Ġìłķ": 36055, - "Ġìłķë§IJ": 134247, - "Ġìłķë³´": 60039, - "ĠìłķëıĦ": 131219, - "Ġìłķì¹ĺ": 136994, - "Ġìłľ": 62071, - "Ġìłľê°Ģ": 132254, - "Ġìłľê³µ": 130094, - "ĠìłľíĴĪ": 138017, - "Ġí": 10764, - "Ġíģ": 45313, - "Ġíģ¬": 143230, - "Ġíģ¬ê²Į": 143231, - "Ġíģ°": 132182, - "Ġíģ´": 62938, - "Ġíģ´ëŀĺìĬ¤": 93182, - "Ġíĥ": 74361, - "ĠíĨµ": 125206, - "ĠíĨµíķ´": 131582, - "ĠíĨµíķ´ìĦľ": 140853, - "ĠíĨµíķĺìŬ": 142196, - "ĠíĬ": 127819, - "ĠíĬ¹": 127820, - "ĠíĬ¹ìłķ": 142976, - "ĠíĬ¹íŀĪ": 136115, - "ĠíĮ": 45104, - "ĠíĮĮ": 54969, - "ĠíĮĮìĿ¼": 67629, - "ĠíĮIJ": 140568, - "ĠíĮIJëĭ¨": 140569, - "ĠíİĺìĿ´ì§Ģ": 92889, - "Ġíı": 69441, - "Ġíı¬": 98869, - "Ġíı¬íķ¨": 133970, - "Ġíijľ": 139052, - "ĠíijľíĺĦ": 139053, - "ĠíĶ": 142509, - "Ġíͼ": 142510, - "Ġíͼíķ´": 142511, - "ĠíĶĦ": 84255, - "Ġíķ": 20136, - "Ġíķ¨": 50972, - "Ġíķ¨ê»ĺ": 129676, - "Ġíķ¨ìĪĺ": 58440, - "Ġíķ©ëĭĪëĭ¤": 130650, - "Ġíķ´": 60716, - "Ġíķ´ê²°": 138327, - "Ġíķ´ëĭ¹": 94613, - "ĠíķĦ": 75528, - "ĠíķĦìļĶ": 126871, - "ĠíķĦìļĶíķľ": 134028, - "Ġíķĺ": 53900, - "Ġíķĺê³ł": 130127, - "ĠíķĺëĤĺ": 125703, - "ĠíķĺëĤĺëĭĺ": 127024, - "ĠíķĺëĤĺëĭĺìĿĺ": 136299, - "ĠíķĺëĬĶ": 128956, - "Ġíķĺì§Ģë§Į": 130331, - "Ġíķľ": 61298, - "ĠíķľêµŃ": 130092, - "Ġíķľë²Ī": 138903, - "Ġíķľëĭ¤": 129112, - "Ġíķł": 95002, - "ĠíķŃ": 142654, - "ĠíķŃìĥģ": 142655, - "Ġíĸī": 126174, - "Ġíĸīë³µ": 142506, - "ĠíĸīëıĻ": 140692, - "ĠíĸīìĤ¬": 140888, - "Ġíĺ": 47455, - "Ġíĺ¸": 91043, - "Ġíĺ¸ì¶ľ": 95499, - "Ġíĺ¸íħĶ": 139962, - "Ġíĺ¹": 137601, - "Ġíĺ¹ìĿĢ": 137602, - "ĠíĺĦ": 141526, - "ĠíĺĦìĭ¤": 141527, - "ĠíĺĦìŀ¬": 132270, - "Ġíĺķ": 141965, - "Ġíĺķíĥľ": 141966, - "ĠíĻ": 46832, - "ĠíĻĪ": 142786, - "ĠíĻĪíİĺìĿ´ì§Ģ": 142787, - "ĠíĻķ": 130729, - "ĠíĻķìĿ¸": 73859, - "ĠíĻľ": 140968, - "ĠíĻľìļ©": 140969, - "Ġíļ": 141539, - "Ġíļ¨": 141540, - "Ġíļ¨ê³¼": 141541, - "ĠíļĮ": 98005, - "ĠíļĮìĽIJ": 133662, - "ĠíĽĦ": 94315, - "Ġï": 32495, - "Ġ": 75780, - "Ġï¼": 62823, - "Ġï¼Ī": 42344, - "Ġï¼Į": 41175, - "Ġï¼ļ": 30372, - "Ġ�": 29333, - "Ġ����": 59630, - "ĠïĤ": 68298, - "ĠðĿ": 81250, - "ĠðŁ": 11162, - "ĠðŁij": 61804, - "ĠðŁĴ": 63039, - "ĠðŁĶ": 95069, - "ĠðŁĺ": 26525, - "ĠðŁĺĢ": 90316, - "ĠðŁĺī": 55937, - "ĠðŁĺīĊĊ": 81436, - "ĠðŁĻĤ": 27484, - "ĠðŁĻĤĊĊ": 39024, - "Ġĉ": 7018, - "Ġĉĉ": 13043, - "Ġĉĉĉ": 22207, - "Ġĉĉĉĉ": 35627, - "Ġĉĉĉĉĉ": 54712, - "Ġĉĉĉĉĉĉ": 79682, - "ĠĉĉĊ": 98207, - "ĠĉĊ": 17476, - "ĠĉĠ": 65497, - "ĠĉĠĠĠ": 79524, - "ĠĊ": 715, - "ĠĊĉĉĊ": 67392, - "ĠĊĉĊ": 51141, - "ĠĊĊ": 4710, - "ĠĊĊĊ": 14731, - "ĠĊĊĊĊ": 22701, - "ĠĊĊĊĊĊ": 76325, - "ĠĊĠĊ": 31906, - "ĠĊĠĠĊ": 48426, - "ĠĊĠĠĠĠĊ": 36845, - "ĠĊĠĠĠĠĠĠĠĠĊ": 49987, - "ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĊ": 83913, - "ĠčĊ": 2529, - "ĠčĊčĊ": 23341, - "ĠčĊĠčĊ": 90440, - "ĠččĊ": 94691, - "ĠĠ": 256, - "ĠĠĉ": 19271, - "ĠĠĉĉ": 35329, - "ĠĠĉĉĉ": 54833, - "ĠĠĉĉĉĉ": 87728, - "ĠĠĉĊ": 98251, - "ĠĠĉĠ": 78099, - "ĠĠĊ": 2303, - "ĠĠĊĊ": 18611, - "ĠĠĊĊĊ": 79226, - "ĠĠĊĠĠĊ": 30779, - "ĠĠĊĠĠĠĠĊ": 77787, - "ĠĠčĊ": 10419, - "ĠĠčĊčĊ": 72745, - "ĠĠĠ": 262, - "ĠĠĠĉ": 39767, - "ĠĠĠĉĉ": 68546, - "ĠĠĠĊ": 5872, - "ĠĠĠĊĊ": 33933, - "ĠĠĠĊĠĠĠĠĊ": 78672, - "ĠĠĠčĊ": 20338, - "ĠĠĠĠ": 257, - "ĠĠĠĠĉ": 7782, - "ĠĠĠĠĉĉ": 15287, - "ĠĠĠĠĉĉĉ": 29936, - "ĠĠĠĠĉĉĉĉ": 50538, - "ĠĠĠĠĉĉĉĉĉ": 79039, - "ĠĠĠĠĉĉĊ": 85422, - "ĠĠĠĠĉĊ": 34483, - "ĠĠĠĠĉčĊ": 84852, - "ĠĠĠĠĉĠ": 80840, - "ĠĠĠĠĉĠĠĠ": 59949, - "ĠĠĠĠĊ": 1066, - "ĠĠĠĠĊĊ": 14808, - "ĠĠĠĠĊĊĊ": 61439, - "ĠĠĠĠĊĠĠĠĠĊ": 9401, - "ĠĠĠĠĊĠĠĠĠĊĠĠĠĠĊ": 41693, - "ĠĠĠĠĊĠĠĠĠĊĠĠĠĠĊĠĠĠĠĊ": 80719, - "ĠĠĠĠčĊ": 6421, - "ĠĠĠĠčĊčĊ": 58949, - "ĠĠĠĠčĊĠĠĠĠčĊ": 45432, - "ĠĠĠĠĠ": 414, - "ĠĠĠĠĠĉ": 85065, - "ĠĠĠĠĠĊ": 10947, - "ĠĠĠĠĠĊĊ": 74525, - "ĠĠĠĠĠčĊ": 38085, - "ĠĠĠĠĠĠ": 981, - "ĠĠĠĠĠĠĉ": 51370, - "ĠĠĠĠĠĠĉĉ": 86359, - "ĠĠĠĠĠĠĊ": 6926, - "ĠĠĠĠĠĠĊĊ": 60998, - "ĠĠĠĠĠĠĊĠĠĠĠĠĠĊ": 93004, - "ĠĠĠĠĠĠčĊ": 17260, - "ĠĠĠĠĠĠĠ": 286, - "ĠĠĠĠĠĠĠĉ": 88044, - "ĠĠĠĠĠĠĠĊ": 12306, - "ĠĠĠĠĠĠĠĊĊ": 65668, - "ĠĠĠĠĠĠĠčĊ": 39648, - "ĠĠĠĠĠĠĠĠ": 260, - "ĠĠĠĠĠĠĠĠĉ": 17362, - "ĠĠĠĠĠĠĠĠĉĉ": 36920, - "ĠĠĠĠĠĠĠĠĉĉĉ": 64204, - "ĠĠĠĠĠĠĠĠĉĉĉĉ": 91693, - "ĠĠĠĠĠĠĠĠĉĊ": 73196, - "ĠĠĠĠĠĠĠĠĊ": 1789, - "ĠĠĠĠĠĠĠĠĊĊ": 23459, - "ĠĠĠĠĠĠĠĠĊĠĠĠĠĊ": 88998, - "ĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĊ": 16885, - "ĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĊ": 73363, - "ĠĠĠĠĠĠĠĠčĊ": 8998, - "ĠĠĠĠĠĠĠĠčĊčĊ": 88763, - "ĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠčĊ": 73867, - "ĠĠĠĠĠĠĠĠĠ": 688, - "ĠĠĠĠĠĠĠĠĠĊ": 15677, - "ĠĠĠĠĠĠĠĠĠčĊ": 58559, - "ĠĠĠĠĠĠĠĠĠĠ": 1843, - "ĠĠĠĠĠĠĠĠĠĠĊ": 16159, - "ĠĠĠĠĠĠĠĠĠĠčĊ": 62217, - "ĠĠĠĠĠĠĠĠĠĠĠ": 310, - "ĠĠĠĠĠĠĠĠĠĠĠĊ": 19011, - "ĠĠĠĠĠĠĠĠĠĠĠčĊ": 64783, - "ĠĠĠĠĠĠĠĠĠĠĠĠ": 1797, - "ĠĠĠĠĠĠĠĠĠĠĠĠĉ": 35557, - "ĠĠĠĠĠĠĠĠĠĠĠĠĉĉ": 69562, - "ĠĠĠĠĠĠĠĠĠĠĠĠĊ": 3374, - "ĠĠĠĠĠĠĠĠĠĠĠĠĊĊ": 39865, - "ĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĊ": 34642, - "ĠĠĠĠĠĠĠĠĠĠĠĠčĊ": 16075, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠ": 1060, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 28247, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 2290, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 26285, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ": 89160, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 394, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 26546, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ": 91205, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 338, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĉ": 60123, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 6360, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĊ": 71248, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 59649, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ": 27365, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 1698, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 41636, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 4293, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 36577, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 503, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 40337, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 3824, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĉ": 96800, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 10683, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 88804, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ": 45575, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 2549, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 55447, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 5180, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 52720, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 664, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 51124, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 5108, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 15865, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ": 65317, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 3502, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 75228, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 5968, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 69877, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 999, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 71779, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 6526, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 25435, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 4597, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 96017, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 7561, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 86770, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 1383, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 90306, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 786, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 33641, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 6656, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 9699, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 1920, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 10589, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 45807, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 8333, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 11070, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 2559, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 12841, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 56596, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 10503, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 14265, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 3344, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 15429, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 77993, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 13463, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 17264, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 4569, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 18749, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ": 94947, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 17648, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 21509, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 6374, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 24348, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 20974, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 25773, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 8136, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 28802, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 26065, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 32678, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 11950, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 38484, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 31979, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 37083, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 15270, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 5238, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 38171, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 47549, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 19273, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 51068, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 42708, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 46771, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 22335, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 37144, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 46145, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 41056, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 14642, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 55799, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 58591, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 81221, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 39484, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 97417, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 95429, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 51475, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 65271, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 79871, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 86766, - "ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 56940, - "ġ": 221, - "Ģ": 222, - "Ģìŀ¥": 54470, - "ģ": 223, - "Ĥ": 224, - "Ĥ¤": 92120, - "Ĥ¨": 60757, - "Ĥ¬": 7492, - "Ĥ¹": 23272, - "Ĥæķ°": 27260, - "ĤŃ": 64520, - "ĤŃìłľ": 65519, - "ĥ": 225, - "ĥ½": 22597, - "ĥģ": 36109, - "ĥĿ": 29389, - "Ħ": 226, - "Ħä»¶": 93437, - "Ħìŀ¬": 79879, - "ħ": 227, - "ħ§": 91771, - "ħĮ": 72509, - "ħį": 44104, - "Ĩ": 228, - "Ĩµ": 89179, - "ĩ": 229, - "Ī": 230, - "ĪæĿĥ": 81942, - "Īëĭ¤": 19946, - "ĪìĬµëĭĪëĭ¤": 89363, - "Īĺ": 15902, - "ī": 231, - "Ĭ": 232, - "Ĭ¶": 37440, - "Ĭ¶æĢģ": 39366, - "ĭ": 233, - "ĭè¯ķ": 66635, - "Į": 234, - "Į¨": 98642, - "ĮĢ": 39834, - "į": 235, - "į°": 41902, - "į°ìĿ´": 46218, - "į°ìĿ´íĦ°": 50362, - "İ": 236, - "İ·": 25452, - "İ·åıĸ": 27487, - "İĺìĿ´": 69383, - "İĺìĿ´ì§Ģ": 79427, - "ı": 237, - "ıè¿°": 44834, - "IJ": 238, - "IJèĹı": 68172, - "IJľ": 54492, - "IJľç´¢": 68941, - "ij": 239, - "ijIJ": 78910, - "ijľ": 71443, - "Ĵ": 240, - "Ĵáŀ": 72496, - "ĴĮ": 26254, - "ĵ": 241, - "ĵåIJį": 61617, - "ĵį": 34429, - "ĵįä½ľ": 36548, - "ĵĺ": 67895, - "Ķ": 242, - "ĶåĽŀ": 25011, - "ĶĦ": 62544, - "ķ": 243, - "ķãĤĵ": 84567, - "ķìĿ¸": 66261, - "ķĮ": 47378, - "ĸ": 244, - "ĸī": 51275, - "Ĺ": 245, - "Ĺı": 23444, - "ĺ": 246, - "ĺ认": 37509, - "ĺìĿ´": 62618, - "Ļ": 247, - "ύ": 30828, - "϶": 103895, - "ĻĤ": 18535, - "ļ": 248, - "ļĮ": 47379, - "Ľ": 249, - "Ľå»º": 31338, - "ĽĦ": 74209, - "ľ": 250, - "ľëł¥": 57133, - "Ŀ": 251, - "Ŀ¼": 45881, - "Ŀå§ĭ": 43716, - "Ŀå§ĭåĮĸ": 51088, - "Ŀì²´": 73147, - "ŀ": 252, - "ŀæĢ§": 59139, - "ŀĭ": 23781, - "Ł": 253, - "Ł¥": 22129, - "ٳ": 58715, - "Łèĥ½": 96808, - "ł": 254, - "łéϤ": 24045, - "łí": 57160, - "łíĥĿ": 75132, - "łĢ": 63219, - "łģ": 15675, - "Ń": 255, - "ŃIJ": 98734 -} diff --git a/gr00t/model/modules/qwen3_backbone.py b/gr00t/model/modules/qwen3_backbone.py new file mode 100644 index 000000000..b7665be7a --- /dev/null +++ b/gr00t/model/modules/qwen3_backbone.py @@ -0,0 +1,372 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 logging + +from huggingface_hub.errors import GatedRepoError +import torch +from transformers.feature_extraction_utils import BatchFeature + + +logger = logging.getLogger(__name__) + + +try: + from transformers import Qwen3VLForConditionalGeneration + + _QWEN3VL_AVAILABLE = True +except ImportError: + _QWEN3VL_AVAILABLE = False + + +_GATED_BACKBONE_HINT = ( + "Cannot download the VLM backbone '{model_name}', which is a gated Hugging " + "Face repo. Every GR00T checkpoint (including the base nvidia/GR00T-N1.7-3B) " + "loads this backbone, so both zero-shot inference and finetuning require " + "access to it. Request access at https://huggingface.co/{model_name} and " + "authenticate with `hf auth login` (or set the HF_TOKEN environment variable) " + "before loading a GR00T model." +) + + +_GATED_MARKERS = ("gated repo", "is restricted", "access to model", "401 client error") + + +def _is_gated_repo_error(exc: BaseException) -> bool: + """True if ``exc`` (or any exception it wraps) is a gated/forbidden HF download. + + transformers may raise ``GatedRepoError`` directly or wrap it (as + ``__cause__``/``__context__``) inside an ``OSError`` whose own message omits + the gated markers, so we walk the chain. + """ + cur: BaseException | None = exc + for _ in range(10): # bounded walk guards against cyclic exception chains + if cur is None: + break + if isinstance(cur, GatedRepoError) or any(m in str(cur).lower() for m in _GATED_MARKERS): + return True + cur = cur.__cause__ or cur.__context__ + return False + + +def _real_inference_device(module: torch.nn.Module) -> torch.device: + """Best-effort real (non-meta) device backing a module, defaulting to CPU. + + RoPE buffers must be rebuilt on the device holding the loaded weights, never + on the ``meta`` device that may be the active default during nested load. + """ + for tensor in module.parameters(): + if tensor.device.type != "meta": + return tensor.device + for tensor in module.buffers(): + if tensor.device.type != "meta": + return tensor.device + return torch.device("cpu") + + +def recompute_vision_rotary_inv_freq( + rotary: torch.nn.Module, head_dim_half: int, device: torch.device +) -> torch.Tensor: + """Re-derive Qwen3-VL's vision RoPE ``inv_freq`` via the module's own class. + + Reusing ``type(rotary)(...)`` keeps the analytic formula owned by Transformers; + the real-device context makes it correct even under a ``meta`` default device. + """ + with torch.device(device): + fresh = type(rotary)(head_dim_half) + return fresh.inv_freq.detach().to(device=device, dtype=torch.float32) + + +def recompute_text_rotary_inv_freq( + rotary: torch.nn.Module, config, device: torch.device +) -> tuple[torch.Tensor, float]: + """Re-derive Qwen3-VL's text RoPE ``inv_freq`` via the module's own class. + + Delegates to the module's constructor so the configured ``rope_init_fn`` + (default / scaled / dynamic) stays the single source of truth; returns the + FP32 ``inv_freq`` and its ``attention_scaling``. + """ + with torch.device(device): + fresh = type(rotary)(config=config, device=device) + inv_freq = fresh.inv_freq.detach().to(device=device, dtype=torch.float32) + attention_scaling = float(getattr(fresh, "attention_scaling", 1.0)) + return inv_freq, attention_scaling + + +def _assign_inv_freq( + rotary: torch.nn.Module, name: str, value: torch.Tensor, *, persistent: bool +) -> bool: + """Write ``value`` onto ``rotary.`` if it differs; return whether it changed. + + Returns ``True`` when the buffer/attribute was (re)written, ``False`` when the + existing value already matched (idempotent no-op). This boolean lets tests + assert that a corrupted buffer is actually repaired rather than silently + skipped. + """ + current = getattr(rotary, name, None) + if ( + isinstance(current, torch.Tensor) + and current.device.type != "meta" + and current.device == value.device + and current.shape == value.shape + and current.dtype == value.dtype + and torch.equal(current, value) + ): + return False + if name in rotary._buffers: + rotary.register_buffer(name, value, persistent=persistent) + else: + setattr(rotary, name, value) + return True + + +class Qwen3Backbone(torch.nn.Module): + def __init__( + self, + model_name: str = "nvidia/Cosmos-Reason2-2B", + tune_llm: bool = False, + tune_visual: bool = False, + select_layer: int = -1, + reproject_vision: bool = True, + use_flash_attention: bool = False, + projector_dim: int = -1, + load_bf16: bool = False, + tune_top_llm_layers: int = 0, + trainable_params_fp32: bool = False, + transformers_loading_kwargs: dict = {}, + ): + """ + Qwen3Backbone is to generate n_queries to represent the future action hidden states. + Args: + model_name: nvidia/Cosmos-Reason2-2B + tune_llm: whether to tune the LLM model (default: False) + tune_visual: whether to tune the visual model (default: False) + """ + if not _QWEN3VL_AVAILABLE: + raise ImportError( + "Qwen3VLForConditionalGeneration is not available. " + "Please upgrade transformers to a version that supports Qwen3-VL: " + "pip install transformers>=4.57.0" + ) + + super().__init__() + + # Add attention kwargs + extra_kwargs = {} + if use_flash_attention: + try: + import flash_attn # noqa: F401 + + extra_kwargs["attn_implementation"] = "flash_attention_2" + except ImportError: + logger.warning( + "flash_attn is not installed. Falling back to sdpa attention. " + "Install flash-attn for better performance: pip install flash-attn" + ) + extra_kwargs["attn_implementation"] = "sdpa" + if load_bf16: + extra_kwargs["torch_dtype"] = torch.bfloat16 + + try: + self.model = Qwen3VLForConditionalGeneration.from_pretrained( + model_name, + **extra_kwargs, + **transformers_loading_kwargs, + ).eval() + except Exception as exc: + if _is_gated_repo_error(exc): + raise RuntimeError(_GATED_BACKBONE_HINT.format(model_name=model_name)) from exc + raise + + # needed since we don't use these layers. Also saves compute + while len(self.model.language_model.layers) > select_layer: + self.model.language_model.layers.pop(-1) + + self.select_layer = select_layer + self.set_trainable_parameters(tune_llm, tune_visual, tune_top_llm_layers) + if load_bf16 and trainable_params_fp32: + # cast trainable parameters to fp32 + for n, p in self.named_parameters(): + if p.requires_grad: + p.data = p.data.to(torch.float32) + logger.debug(f"Casting trainable parameter {n} to fp32") + + # Repair Qwen3-VL's non-persistent RoPE buffers once, after weights are + # loaded and trainable dtypes are finalized. See _reset_rotary_inv_freq. + self._reset_rotary_inv_freq() + + # Restore the fast vision patch-embed kernel on torch>=2.9. See method docstring. + self._apply_vision_patch_embed_channels_last() + + def _apply_vision_patch_embed_channels_last(self) -> None: + """Force the Qwen3-VL vision patch-embed ``Conv3d`` to ``channels_last_3d``. + + On torch>=2.9 (cuDNN 9.10.x) the contiguous bf16 patch-embed ``Conv3d`` + dispatches to a pathologically slow kernel on sm_80; ``channels_last_3d`` + selects the fast one and is numerically equivalent (harmless elsewhere). + """ + visual = getattr(self.model, "visual", None) + if visual is None: + return + + def _to_channels_last_3d(_module, inputs): + # Skip while tracing: the legacy TorchScript ONNX exporter cannot lower a + # memory_format on .contiguous() ("onnx memory_format support is not + # implemented"). This is a runtime-only perf hint, so the plain contiguous + # graph is numerically equivalent for export. + if not inputs or torch.jit.is_tracing(): + return inputs + x = inputs[0] + if isinstance(x, torch.Tensor) and x.dim() == 5: + return (x.contiguous(memory_format=torch.channels_last_3d), *inputs[1:]) + return inputs + + patched = 0 + for module in visual.modules(): + if isinstance(module, torch.nn.Conv3d): + module.to(memory_format=torch.channels_last_3d) + module.register_forward_pre_hook(_to_channels_last_3d) + patched += 1 + if patched: + logger.debug( + "Applied channels_last_3d to %d vision patch-embed Conv3d module(s) " + "(torch>=2.9 cuDNN Conv3d perf workaround).", + patched, + ) + + def set_trainable_parameters(self, tune_llm: bool, tune_visual: bool, tune_top_llm_layers: int): + self.tune_llm = tune_llm + self.tune_visual = tune_visual + for p in self.parameters(): + p.requires_grad = True + if not tune_llm: + self.model.language_model.requires_grad_(False) + if not tune_visual: + self.model.visual.requires_grad_(False) + + if tune_top_llm_layers > 0: + for layer in self.model.language_model.layers[-tune_top_llm_layers:]: + for param in layer.parameters(): + param.requires_grad = True + + logger.debug(f"Tune backbone llm: {self.tune_llm}") + logger.debug(f"Tune backbone visual: {self.tune_visual}") + # Check if any parameters are still trainable. If not, log a warning. + for name, p in self.named_parameters(): + if p.requires_grad: + logger.debug(f"Backbone trainable parameter: {name}") + if not any(p.requires_grad for p in self.parameters()): + logger.warning("No backbone trainable parameters found.") + + def set_frozen_modules_to_eval_mode(self): + """ + Huggingface will call model.train() at each training_step. To ensure + the expected behaviors for modules like dropout, batchnorm, etc., we + need to call model.eval() for the frozen modules. + """ + if self.training: + if self.model.language_model and not self.tune_llm: + self.model.language_model.eval() + if self.model.visual and not self.tune_visual: + self.model.visual.eval() + + def _reset_rotary_inv_freq(self) -> None: + """Re-derive Qwen3-VL's non-persistent RoPE ``inv_freq`` buffers once at load. + + These ``persistent=False`` buffers are not restored from a checkpoint and + can be left uninitialized under the nested ``no_init_weights`` load, so we + rebuild the analytic FP32 frequencies here (load time only, no per-forward + cost). Fails closed (raises) when the layout/config needed to rebuild is + missing, so a drifted transformers version cannot silently serve + uninitialized buffers. + """ + config = getattr(self.model, "config", None) + vision_changed = self._reset_vision_rotary_inv_freq(config) + text_changed = self._reset_language_rotary_inv_freq() + logger.debug( + "Qwen3-VL RoPE inv_freq reset (vision_rewritten=%s, text_rewritten=%s).", + vision_changed, + text_changed, + ) + + def _reset_vision_rotary_inv_freq(self, config) -> bool: + visual = getattr(self.model, "visual", None) + rotary = getattr(visual, "rotary_pos_emb", None) + if rotary is None or not hasattr(rotary, "inv_freq"): + raise RuntimeError( + "Qwen3-VL visual rotary_pos_emb/inv_freq not found; cannot rebuild the " + "non-persistent vision RoPE inv_freq. Continuing would leave it " + "uninitialized and silently corrupt inference, so we fail the load. The " + "transformers Qwen3-VL layout may have changed; pin a compatible version." + ) + + vision_config = getattr(config, "vision_config", None) + if vision_config is None or not all( + hasattr(vision_config, attr) for attr in ("hidden_size", "num_heads") + ): + raise RuntimeError( + "Qwen3-VL vision_config missing hidden_size/num_heads; cannot rebuild the " + "non-persistent vision RoPE inv_freq (continuing would leave it " + "uninitialized and silently corrupt inference)." + ) + + head_dim = vision_config.hidden_size // vision_config.num_heads + device = _real_inference_device(visual) + inv_freq = recompute_vision_rotary_inv_freq(rotary, head_dim // 2, device) + return _assign_inv_freq(rotary, "inv_freq", inv_freq, persistent=False) + + def _reset_language_rotary_inv_freq(self) -> bool: + language_model = getattr(self.model, "language_model", None) + rotary = getattr(language_model, "rotary_emb", None) + text_config = getattr(rotary, "config", None) or getattr(language_model, "config", None) + if rotary is None or not hasattr(rotary, "inv_freq") or text_config is None: + raise RuntimeError( + "Qwen3-VL language rotary_emb/inv_freq/config not found; cannot rebuild the " + "non-persistent text RoPE inv_freq. Continuing would leave it uninitialized " + "and silently corrupt inference, so we fail the load. The transformers " + "Qwen3-VL layout may have changed; pin a compatible version." + ) + + device = _real_inference_device(language_model) + inv_freq, _attention_scaling = recompute_text_rotary_inv_freq(rotary, text_config, device) + changed = _assign_inv_freq(rotary, "inv_freq", inv_freq, persistent=False) + # ``original_inv_freq`` is a plain attribute (not a buffer) that dynamic + # RoPE updates restore from; keep it consistent with inv_freq. + if hasattr(rotary, "original_inv_freq"): + changed = ( + _assign_inv_freq(rotary, "original_inv_freq", inv_freq.clone(), persistent=False) + or changed + ) + return changed + + def prepare_input(self, batch: dict) -> BatchFeature: + return BatchFeature(data=batch) + + def forward(self, vl_input: BatchFeature) -> BatchFeature: + self.set_frozen_modules_to_eval_mode() + # 0. Set frozen module to eval + keys_to_use = ["input_ids", "attention_mask", "pixel_values", "image_grid_thw"] + vl_input = {k: vl_input[k] for k in keys_to_use} + outputs = self.model(**vl_input, output_hidden_states=True) + outputs = outputs.hidden_states[-1] + image_mask = vl_input["input_ids"] == self.model.config.image_token_id + attention_mask = vl_input["attention_mask"] == 1 + return BatchFeature( + data={ + "backbone_features": outputs, + "backbone_attention_mask": attention_mask, + "image_mask": image_mask, + } + ) # [B, T2, hidden_size] diff --git a/gr00t/model/registry.py b/gr00t/model/registry.py index ea7827c12..4e4fbf84d 100644 --- a/gr00t/model/registry.py +++ b/gr00t/model/registry.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + MODEL_REGISTRY = {} diff --git a/gr00t/policy/__init__.py b/gr00t/policy/__init__.py index 948c4fa66..a8a77ce9f 100644 --- a/gr00t/policy/__init__.py +++ b/gr00t/policy/__init__.py @@ -1,7 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from .gr00t_policy import Gr00tPolicy from .policy import BasePolicy, PolicyWrapper __all__ = [ "BasePolicy", + "Gr00tPolicy", "PolicyWrapper", ] diff --git a/gr00t/policy/gr00t_policy.py b/gr00t/policy/gr00t_policy.py index 227b2eabf..6f5a46b10 100644 --- a/gr00t/policy/gr00t_policy.py +++ b/gr00t/policy/gr00t_policy.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """Gr00t Policy implementation for inference. This module provides the core policy classes for running Gr00t models: @@ -12,7 +27,7 @@ import torch from transformers import AutoModel, AutoProcessor -from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.embodiment_tags import FINETUNE_ONLY_TAGS, POSTTRAIN_TAGS, EmbodimentTag from gr00t.data.interfaces import BaseProcessor from gr00t.data.types import MessageType, ModalityConfig, VLAStepData @@ -43,6 +58,15 @@ def _rec_to_dtype(x: Any, dtype: torch.dtype) -> Any: return x +def _sim_language_batch_to_sequence(value: Any) -> Any: + """Normalize sim language batches while preserving validation semantics.""" + if isinstance(value, np.ndarray): + return value.reshape(-1).tolist() + if isinstance(value, str): + return [value] + return value + + class Gr00tPolicy(BasePolicy): """Core policy class for Gr00t model inference. @@ -58,7 +82,7 @@ class Gr00tPolicy(BasePolicy): def __init__( self, - embodiment_tag: EmbodimentTag, + embodiment_tag: EmbodimentTag | str, model_path: str, *, device: int | str, @@ -67,7 +91,8 @@ def __init__( """Initialize the Gr00t Policy. Args: - embodiment_tag: The embodiment tag defining the robot/environment type + embodiment_tag: The embodiment tag defining the robot/environment type. + Accepts an EmbodimentTag enum or a string (resolved case-insensitively). model_path: Path to the pretrained model checkpoint directory device: Device to run the model on (e.g., 'cuda:0', 0, 'cpu') strict: Whether to enforce strict input validation (default: True) @@ -76,6 +101,8 @@ def __init__( import gr00t.model # noqa: F401 super().__init__(strict=strict) + if isinstance(embodiment_tag, str): + embodiment_tag = EmbodimentTag.resolve(embodiment_tag) model_dir = Path(model_path) # Load the pretrained model and move to target device with bfloat16 precision @@ -84,21 +111,67 @@ def __init__( model.to(device=device, dtype=torch.bfloat16) self.model = model - # Load the processor for input/output transformation - self.processor: BaseProcessor = AutoProcessor.from_pretrained(model_dir) + # Load the processor for input/output transformation. + # Training saves processor files under a "processor/" subdirectory, but + # AutoProcessor expects them at the model root. Fall back to the + # subdirectory when the root lacks a processor_config.json. + processor_dir = ( + model_dir / "processor" + if (model_dir / "processor").is_dir() + and not (model_dir / "processor_config.json").exists() + else model_dir + ) + self.processor: BaseProcessor = AutoProcessor.from_pretrained(processor_dir) self.processor.eval() # Store embodiment-specific configurations self.embodiment_tag = embodiment_tag - self.modality_configs = self.processor.get_modality_configs()[self.embodiment_tag.value] + all_modality_configs = self.processor.get_modality_configs() + if self.embodiment_tag.value not in all_modality_configs: + # Map raw checkpoint tag values to user-friendly enum names where possible. + supported_lines = [] + for tag_value in sorted(all_modality_configs.keys()): + enum_name = EmbodimentTag.reverse_lookup(tag_value) + if enum_name != tag_value: + supported_lines.append(f" {enum_name:30s} (--embodiment-tag {enum_name})") + else: + supported_lines.append(f" {tag_value:30s} (internal, no public enum)") + supported_str = "\n".join(supported_lines) + + hint = "" + if self.embodiment_tag in POSTTRAIN_TAGS: + hint = ( + f"\n\nHint: '{self.embodiment_tag.name}' is a posttrain tag that requires " + f"a finetuned checkpoint, not the base model. " + f"See the example READMEs for how to finetune and download checkpoints." + ) + elif self.embodiment_tag in FINETUNE_ONLY_TAGS: + hint = ( + f"\n\nHint: '{self.embodiment_tag.name}' is for finetuning custom robots. " + f"Use it with launch_finetune.py, not with the base model directly." + ) + + raise ValueError( + f"Embodiment tag '{self.embodiment_tag.name}' " + f"(value='{self.embodiment_tag.value}') is not supported " + f"by this checkpoint.\n\n" + f"Supported tags in this checkpoint:\n{supported_str}" + f"{hint}" + ) + self.modality_configs = { + k: v + for k, v in all_modality_configs[self.embodiment_tag.value].items() + if k != "rl_info" + } self.collate_fn = self.processor.collator # Extract and validate language configuration - # Currently only supports single language input per timestep + # Some embodiments (e.g. OXE_DROID) define multiple language keys for + # training-time augmentation (paraphrases). At inference we only use the first key. language_keys = self.modality_configs["language"].modality_keys language_delta_indices = self.modality_configs["language"].delta_indices + assert len(language_keys) >= 1, "At least one language key is required" assert len(language_delta_indices) == 1, "Only one language delta index is supported" - assert len(language_keys) == 1, "Only one language key is supported" self.language_key = language_keys[0] def _unbatch_observation(self, value: dict[str, Any]) -> list[dict[str, Any]]: @@ -180,6 +253,10 @@ def check_observation(self, observation: dict[str, Any]) -> None: # ===== VIDEO VALIDATION ===== # Validate each video stream defined in the modality config for video_key in self.modality_configs["video"].modality_keys: + assert video_key in observation["video"], ( + f"Video key '{video_key}' must be in observation" + ) + # Set or verify batch size consistency across all video keys if bs == -1: bs = len(observation["video"][video_key]) @@ -188,11 +265,6 @@ def check_observation(self, observation: dict[str, Any]) -> None: f"Video key '{video_key}' must have batch size {bs}. Got {len(observation['video'][video_key])}" ) - # Check that the expected video key exists in the observation - assert video_key in observation["video"], ( - f"Video key '{video_key}' must be in observation" - ) - batched_video = observation["video"][video_key] # Verify data type is numpy array @@ -223,6 +295,12 @@ def check_observation(self, observation: dict[str, Any]) -> None: # ===== STATE VALIDATION ===== # Validate each state stream defined in the modality config for state_key in self.modality_configs["state"].modality_keys: + # Check that the expected state key exists in the observation + # (must happen before indexing — see video validation above) + assert state_key in observation["state"], ( + f"State key '{state_key}' must be in observation" + ) + # Set or verify batch size consistency across all state keys if bs == -1: bs = len(observation["state"][state_key]) @@ -231,11 +309,6 @@ def check_observation(self, observation: dict[str, Any]) -> None: f"State key '{state_key}' must have batch size {bs}. Got {len(observation['state'][state_key])}" ) - # Check that the expected state key exists in the observation - assert state_key in observation["state"], ( - f"State key '{state_key}' must be in observation" - ) - batched_state = observation["state"][state_key] # Verify data type is numpy array @@ -261,6 +334,12 @@ def check_observation(self, observation: dict[str, Any]) -> None: # ===== LANGUAGE VALIDATION ===== # Validate each language stream defined in the modality config for language_key in self.modality_configs["language"].modality_keys: + # Check that the expected language key exists in the observation + # (must happen before indexing — see video validation above) + assert language_key in observation["language"], ( + f"Language key '{language_key}' must be in observation" + ) + # Set or verify batch size consistency (language uses len instead of .shape) if bs == -1: bs = len(observation["language"][language_key]) @@ -269,11 +348,6 @@ def check_observation(self, observation: dict[str, Any]) -> None: f"Language key '{language_key}' must have batch size {bs}. Got {len(observation['language'][language_key])}" ) - # Check that the expected language key exists in the observation - assert language_key in observation["language"], ( - f"Language key '{language_key}' must be in observation" - ) - batched_language: list[list[str]] = observation["language"][language_key] # Verify outer structure is a list (batch dimension) @@ -547,12 +621,14 @@ def check_observation(self, observation: dict[str, Any]) -> None: ) # In Gr00t sim format, language is a tuple of strings (B,) - batched_language: tuple[str] | list[str] = observation[language_key] # (B,) + batched_language = _sim_language_batch_to_sequence(observation[language_key]) # Verify outer structure is a tuple (batch dimension) assert isinstance(batched_language, (tuple, list)), ( - f"Language key '{language_key}' must be a tuple or list. Got {type(batched_language)}" + f"Language key '{language_key}' must be a tuple, list, or numpy array. " + f"Got {type(observation[language_key])}" ) + assert batched_language, f"Language key '{language_key}' must not be empty" # Verify each batch item is a string assert isinstance(batched_language[0], str), ( @@ -602,6 +678,7 @@ def _get_action( # Transform to nested format if modality == "language": + arr = _sim_language_batch_to_sequence(arr) # Convert from tuple[str] or list[str] (B,) to list[list[str]] (B, 1) # Each element becomes a list with one string for temporal dimension new_obs[modality][key] = [[str(item)] for item in arr] diff --git a/gr00t/policy/policy.py b/gr00t/policy/policy.py index f8da0b909..bab968f9d 100644 --- a/gr00t/policy/policy.py +++ b/gr00t/policy/policy.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from abc import ABC, abstractmethod from typing import Any diff --git a/gr00t/policy/replay_policy.py b/gr00t/policy/replay_policy.py index 9c96622de..6bb5436bd 100644 --- a/gr00t/policy/replay_policy.py +++ b/gr00t/policy/replay_policy.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """Replay Policy implementation for replaying actions from a dataset. This module provides a policy that replays recorded actions from a LeRobot-style dataset, @@ -46,8 +61,6 @@ def __init__( modality_configs: dict[str, ModalityConfig], execution_horizon: int, *, - video_backend: str = "torchcodec", - video_backend_kwargs: dict[str, Any] | None = None, strict: bool = True, ): """Initialize the Replay Policy. @@ -57,8 +70,6 @@ def __init__( modality_configs: Dictionary mapping modality names to ModalityConfig objects that specify temporal sampling and data keys to load execution_horizon: Policy execution horizon during inference. Will determine the number of steps to skip per get_action call. - video_backend: Video decoding backend ('torchcodec', 'decord', etc.) - video_backend_kwargs: Additional arguments for the video backend strict: Whether to enforce strict input validation (default: True) """ super().__init__(strict=strict) @@ -83,8 +94,6 @@ def __init__( self.episode_loader = LeRobotEpisodeLoader( dataset_path=dataset_path, modality_configs=modality_configs, - video_backend=video_backend, - video_backend_kwargs=video_backend_kwargs, ) # Load the episode data @@ -152,6 +161,10 @@ def check_observation(self, observation: dict[str, Any]) -> None: # ===== VIDEO VALIDATION ===== for video_key in self.modality_configs["video"].modality_keys: + assert video_key in observation["video"], ( + f"Video key '{video_key}' must be in observation" + ) + if bs == -1: bs = len(observation["video"][video_key]) else: @@ -159,10 +172,6 @@ def check_observation(self, observation: dict[str, Any]) -> None: f"Video key '{video_key}' must have batch size {bs}. Got {len(observation['video'][video_key])}" ) - assert video_key in observation["video"], ( - f"Video key '{video_key}' must be in observation" - ) - batched_video = observation["video"][video_key] assert isinstance(batched_video, np.ndarray), ( @@ -187,6 +196,11 @@ def check_observation(self, observation: dict[str, Any]) -> None: # ===== STATE VALIDATION ===== for state_key in self.modality_configs["state"].modality_keys: + # Existence check must precede indexing — see video validation above. + assert state_key in observation["state"], ( + f"State key '{state_key}' must be in observation" + ) + if bs == -1: bs = len(observation["state"][state_key]) else: @@ -194,10 +208,6 @@ def check_observation(self, observation: dict[str, Any]) -> None: f"State key '{state_key}' must have batch size {bs}. Got {len(observation['state'][state_key])}" ) - assert state_key in observation["state"], ( - f"State key '{state_key}' must be in observation" - ) - batched_state = observation["state"][state_key] assert isinstance(batched_state, np.ndarray), ( @@ -218,6 +228,11 @@ def check_observation(self, observation: dict[str, Any]) -> None: # ===== LANGUAGE VALIDATION ===== for language_key in self.modality_configs["language"].modality_keys: + # Existence check must precede indexing — see video validation above. + assert language_key in observation["language"], ( + f"Language key '{language_key}' must be in observation" + ) + if bs == -1: bs = len(observation["language"][language_key]) else: @@ -225,10 +240,6 @@ def check_observation(self, observation: dict[str, Any]) -> None: f"Language key '{language_key}' must have batch size {bs}. Got {len(observation['language'][language_key])}" ) - assert language_key in observation["language"], ( - f"Language key '{language_key}' must be in observation" - ) - batched_language: list[list[str]] = observation["language"][language_key] assert isinstance(batched_language, list), ( @@ -300,16 +311,24 @@ def _get_action( """Replay the next action chunk from the dataset. Args: - observation: Batched observation dictionary (used for validation, not inference) - options: Optional parameters (currently unused) + observation: Optional batched observation dictionary (used for validation, not inference) + options: Optional parameters + - batch_size: int - Batch size to use for the action chunk Returns: Tuple of (actions_dict, info_dict) where actions_dict contains action chunks with shape (B, action_horizon, D) for each action key """ # Infer batch size from observation - first_video_key = self.modality_configs["video"].modality_keys[0] - batch_size = observation["video"][first_video_key].shape[0] + if observation is not None: + first_video_key = self.modality_configs["video"].modality_keys[0] + batch_size = observation["video"][first_video_key].shape[0] + # If batch size is not provided in observation, check if it's provided in options + elif "batch_size" in options: + batch_size = options["batch_size"] + else: + batch_size = 1 + print("No batch size provided, using default batch size of 1") # Note that this can differ form the execution horizon, as the policy can predict more steps than what's actually executed. action_horizon = ( self.modality_configs["action"].delta_indices[-1] diff --git a/gr00t/policy/server_client.py b/gr00t/policy/server_client.py index 6941da011..cff26ea23 100644 --- a/gr00t/policy/server_client.py +++ b/gr00t/policy/server_client.py @@ -1,8 +1,26 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from dataclasses import dataclass +import functools import io +import json from typing import Any, Callable import msgpack +import msgpack_numpy as mnp import numpy as np import zmq @@ -13,32 +31,108 @@ class MsgSerializer: + """msgpack_numpy serializer with a hard ``allow_pickle=False`` boundary. + + Implementation note: msgpack_numpy's ``Packer``/``Unpacker`` wire any + user-provided ``default``/``object_hook`` *behind* their own + ``mnp.encode``/``mnp.decode`` (``functools.partial(encode, chain=user_fn)``). + That means an object-dtype ndarray is serialised by ``mnp.encode`` (and a + forged ``{nd: True, kind: 'O', ...}`` payload is fed to ``pickle.loads`` by + ``mnp.decode``) *before* a hook installed via ``mnp.packb``/``mnp.unpackb`` + can intervene. We therefore drive ``msgpack`` directly and chain + ``_safe_{encode,decode} → mnp.{encode,decode} → custom`` ourselves, so the + refusal runs first. + """ + @staticmethod def to_bytes(data: Any) -> bytes: - return msgpack.packb(data, default=MsgSerializer.encode_custom_classes) + default = functools.partial(MsgSerializer._safe_encode, chain=MsgSerializer._encode_custom) + return msgpack.packb(data, default=default) @staticmethod def from_bytes(data: bytes) -> Any: - return msgpack.unpackb(data, object_hook=MsgSerializer.decode_custom_classes) + object_hook = functools.partial( + MsgSerializer._safe_decode, chain=MsgSerializer._decode_custom + ) + return msgpack.unpackb(data, object_hook=object_hook, raw=False) @staticmethod - def decode_custom_classes(obj): - if not isinstance(obj, dict): - return obj - if "__ModalityConfig_class__" in obj: - return ModalityConfig(**obj["as_json"]) - if "__ndarray_class__" in obj: - return np.load(io.BytesIO(obj["as_npy"]), allow_pickle=False) - return obj + def _safe_encode(obj, chain=None): + # Refuse object-dtype ndarrays before mnp.encode would emit a + # ``{nd: True, kind: 'O', data: pickle.dumps(arr)}`` envelope, which + # silently re-enables the arbitrary-code surface that the previous + # ``np.save(..., allow_pickle=False)`` path explicitly forbade. + if isinstance(obj, np.ndarray): + if obj.dtype.kind == "O": + raise TypeError( + f"Refusing to encode object-dtype ndarray (shape={obj.shape}); " + f"msgpack_numpy would invoke pickle. Convert to a concrete " + f"numeric dtype before sending." + ) + return mnp.encode(obj, chain=chain) + + @staticmethod + def _safe_decode(obj, chain=None): + if isinstance(obj, dict): + marker = obj.get("__ndarray_class__", obj.get(b"__ndarray_class__")) + if marker: + payload = obj.get("as_npy", obj.get(b"as_npy")) + if payload is None: + raise ValueError( + "Malformed ndarray payload: marker present but 'as_npy' missing" + ) + return np.load(io.BytesIO(payload), allow_pickle=False) + + # Refuse object-dtype ndarray payloads before mnp.decode would call + # ``pickle.loads`` on attacker-controlled bytes. Check both bytes- and + # str-encoded keys, and accept any truthy ``nd`` value (not just + # boolean ``True``) so a forged ``{nd: 1, kind: 'O', ...}`` payload + # can't sidestep the guard via msgpack's int-vs-bool type codes. + # msgpack_numpy 0.4.8's own check is ``obj[b'nd'] is True``, so the + # described variants don't actually reach pickle.loads today, but + # MsgSerializer enforces the contract at this boundary regardless of + # mnp's wire / identity-check conventions. + if isinstance(obj, dict): + nd_val = obj.get(b"nd", obj.get("nd")) + kind_val = obj.get(b"kind", obj.get("kind")) + if nd_val and kind_val in (b"O", "O"): + raise ValueError( + "Refusing to decode object-dtype ndarray payload (pickle-bearing); " + "the allow_pickle=False contract is enforced by MsgSerializer." + ) + return mnp.decode(obj, chain=chain) @staticmethod - def encode_custom_classes(obj): + def _encode_custom(obj): if isinstance(obj, ModalityConfig): - return {"__ModalityConfig_class__": True, "as_json": to_json_serializable(obj)} - if isinstance(obj, np.ndarray): - output = io.BytesIO() - np.save(output, obj, allow_pickle=False) - return {"__ndarray_class__": True, "as_npy": output.getvalue()} + return {"__ModalityConfig__": True, "as_json": to_json_serializable(obj)} + return obj + + @staticmethod + def _decode_custom(obj): + if not isinstance(obj, dict): + return obj + # If the ModalityConfig marker is present but 'as_json' is missing, + # raise instead of returning a half-broken dict. + has_modality_marker = ( + "__ModalityConfig__" in obj + or b"__ModalityConfig__" in obj + or "__ModalityConfig_class__" in obj + or b"__ModalityConfig_class__" in obj + ) + if has_modality_marker: + key = next((k for k in ("as_json", b"as_json") if k in obj), None) + if key is None: + raise ValueError( + f"Malformed ModalityConfig payload: marker present but " + f"'as_json' missing. keys={sorted(repr(k) for k in obj.keys())}" + ) + payload = obj[key] + if isinstance(payload, bytes): + payload = payload.decode() + if isinstance(payload, str): + payload = json.loads(payload) + return ModalityConfig(**payload) return obj @@ -54,11 +148,22 @@ class PolicyServer: Can add custom endpoints by calling `register_endpoint`. """ + # Bounded linger (ms) on close so a pending reply (e.g. the `kill` ack) + # flushes instead of being dropped, while still releasing the port promptly. + _CLOSE_LINGER_MS = 1000 + def __init__( - self, policy: BasePolicy, host: str = "*", port: int = 5555, api_token: str = None + self, + policy: BasePolicy, + host: str = "*", + port: int = 5555, + api_token: str = None, ): self.policy = policy + self.host = host + self.port = port self.running = True + self._closed = False self.context = zmq.Context() self.socket = self.context.socket(zmq.REP) self.socket.bind(f"tcp://{host}:{port}") @@ -77,11 +182,37 @@ def __init__( ) def _kill_server(self): - """ - Kill the server. - """ + """Stop the run loop. Does not release the socket / context — use ``close()``.""" self.running = False + def close(self) -> None: + """Release the bound socket and ZMQ context. Idempotent.""" + if getattr(self, "_closed", True): + return + self._closed = True + self.running = False + socket = getattr(self, "socket", None) + if socket is not None: + try: + socket.close(linger=self._CLOSE_LINGER_MS) + except Exception: + pass + context = getattr(self, "context", None) + if context is not None: + try: + context.term() + except Exception: + pass + + def __enter__(self): + # Reached only after __init__ completed socket.bind(), so the socket is + # guaranteed live here — safe to announce readiness. + print(f"\n✓ Server ready — listening on {self.host}:{self.port}\n") + return self + + def __exit__(self, exc_type, exc, tb): + self.close() + def _handle_ping(self) -> dict: """ Simple ping handler that returns a success message. @@ -142,9 +273,9 @@ def run(self): self.socket.send(MsgSerializer.to_bytes({"error": str(e)})) @staticmethod - def start_server(policy: BasePolicy, port: int, api_token: str = None): - server = PolicyServer(policy, port=port, api_token=api_token) - server.run() + def start_server(policy: BasePolicy, port: int, host: str = "*", api_token: str = None): + with PolicyServer(policy, host=host, port=port, api_token=api_token) as server: + server.run() class PolicyClient(BasePolicy): @@ -157,6 +288,7 @@ def __init__( strict: bool = False, ): super().__init__(strict=strict) + self._closed = False self.context = zmq.Context() self.host = host self.port = port @@ -167,6 +299,8 @@ def __init__( def _init_socket(self): """Initialize or reinitialize the socket with current settings""" self.socket = self.context.socket(zmq.REQ) + self.socket.setsockopt(zmq.RCVTIMEO, self.timeout_ms) + self.socket.setsockopt(zmq.SNDTIMEO, self.timeout_ms) self.socket.connect(f"tcp://{self.host}:{self.port}") def ping(self) -> bool: @@ -200,8 +334,15 @@ def call_endpoint( if self.api_token: request["api_token"] = self.api_token - self.socket.send(MsgSerializer.to_bytes(request)) - message = self.socket.recv() + try: + self.socket.send(MsgSerializer.to_bytes(request)) + message = self.socket.recv() + except zmq.error.Again: + # Timeout — REQ socket is now in an invalid state (waiting for a + # reply that will never arrive). Recreate it so the next call can + # send again, then re-raise so the caller knows this request failed. + self._init_socket() + raise if message == b"ERROR": raise RuntimeError("Server error. Make sure we are running the correct policy server.") response = MsgSerializer.from_bytes(message) @@ -210,10 +351,38 @@ def call_endpoint( raise RuntimeError(f"Server error: {response['error']}") return response + def close(self) -> None: + """Release the REQ socket and ZMQ context. Idempotent.""" + if getattr(self, "_closed", True): + return + self._closed = True + socket = getattr(self, "socket", None) + if socket is not None: + try: + socket.close(linger=0) + except Exception: + pass + context = getattr(self, "context", None) + if context is not None: + try: + context.term() + except Exception: + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, tb): + self.close() + def __del__(self): - """Cleanup resources on destruction""" - self.socket.close() - self.context.term() + # Best-effort GC fallback. ``__del__`` can fire during interpreter + # shutdown after module-level names (``zmq``, our own attributes) + # have been torn down; raising here is just noise on stderr. + try: + self.close() + except Exception: + pass def _get_action( self, observation: dict[str, Any], options: dict[str, Any] | None = None diff --git a/gr00t/utils/determinism.py b/gr00t/utils/determinism.py new file mode 100644 index 000000000..7adce3332 --- /dev/null +++ b/gr00t/utils/determinism.py @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Determinism helpers for reproducible evaluation runs. + +Seeding is opt-in. If no seed is supplied and the ``GR00T_EVAL_SEED`` +environment variable is unset, these helpers are no-ops, so training and +production code paths are unaffected. + +When enabled, :func:`seed_everything` seeds Python, NumPy, torch CPU and +torch CUDA RNGs, sets cuDNN to deterministic mode, and (optionally) asks +torch to use deterministic algorithm implementations. This is required +before any historical metric recording so that run-to-run variance on the +same checkpoint is driven by hardware/library noise only, not by unseeded +RNGs. +""" + +from __future__ import annotations + +import logging +import os +import random + +import numpy as np +import torch + + +EVAL_SEED_ENV_VAR = "GR00T_EVAL_SEED" + + +logger = logging.getLogger(__name__) + + +def get_eval_seed(default: int | None = None) -> int | None: + """Read the eval seed from the environment, or return ``default``. + + Returns ``None`` if the env var is unset / empty and no default is given. + Raises ``ValueError`` if the env var is set but not a valid integer. + """ + raw = os.environ.get(EVAL_SEED_ENV_VAR) + if raw is None or raw == "": + return default + try: + return int(raw) + except ValueError as exc: + raise ValueError(f"{EVAL_SEED_ENV_VAR}={raw!r} is not a valid integer") from exc + + +def seed_everything(seed: int | None = None, *, warn_only: bool = True) -> int | None: + """Seed all standard RNGs and enable deterministic cuDNN / CUDA kernels. + + Args: + seed: Seed to apply. If ``None``, reads ``GR00T_EVAL_SEED``; if that + is also unset, the function returns ``None`` without changing + any global state. + warn_only: Forwarded to ``torch.use_deterministic_algorithms``. When + ``True`` (default), ops without a deterministic implementation + warn instead of raising. + + Returns: + The effective seed that was applied, or ``None`` if no seeding was + done (so callers can pass it downstream unconditionally). + """ + if seed is None: + seed = get_eval_seed() + if seed is None: + return None + + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + torch.use_deterministic_algorithms(True, warn_only=warn_only) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + # Required by some CUDA kernels when deterministic algorithms are on. + os.environ.setdefault("CUBLAS_WORKSPACE_CONFIG", ":4096:8") + + logger.info("Determinism enabled: seed=%d warn_only=%s", seed, warn_only) + return seed diff --git a/gr00t/utils/dist_utils.py b/gr00t/utils/dist_utils.py new file mode 100644 index 000000000..b4a67d8bd --- /dev/null +++ b/gr00t/utils/dist_utils.py @@ -0,0 +1,115 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +# Make training work w/ and w/o distributed training. +from contextlib import contextmanager + +import torch + + +def is_dist_avail_and_initialized() -> bool: + return torch.distributed.is_available() and torch.distributed.is_initialized() + + +def get_rank() -> int: + if is_dist_avail_and_initialized(): + return torch.distributed.get_rank() + return 0 + + +def barrier(): + if is_dist_avail_and_initialized(): + torch.distributed.barrier() + + +def _collective_device() -> torch.device: + """Pick the device used for status-broadcast collectives. + + NCCL backend requires CUDA tensors; gloo / mpi accept CPU. We rely on the + caller (typically `experiment.run` after `torch.cuda.set_device(local_rank)`) + having already pinned the current CUDA device. + """ + if torch.distributed.get_backend() == "nccl": + return torch.device(f"cuda:{torch.cuda.current_device()}") + return torch.device("cpu") + + +@contextmanager +def run_or_wait_on_rank0(label: str | None = None): + """Run the body on rank-0 only, broadcasting any rank-0 error to all ranks. + + Yields ``True`` on rank-0, ``False`` elsewhere; callers gate the body with + ``if is_rank0:``. If rank-0 raises, every rank raises consistently + (rank-0 re-raises the original; others get ``RuntimeError(label: ...)``). + Without this contract a rank-0 raise inside a plain ``if get_rank() == 0:`` + block leaves other ranks hanging at the next NCCL collective until the + 30-min timeout fires. + + Degenerates to a plain ``with`` block when distributed is not initialized. + + with run_or_wait_on_rank0(label="generate_stats") as is_rank0: + if is_rank0: + ... + """ + if not is_dist_avail_and_initialized(): + yield True + return + + rank = torch.distributed.get_rank() + is_rank0 = rank == 0 + device = _collective_device() + status = torch.zeros(1, dtype=torch.int, device=device) + rank0_err: BaseException | None = None + error_summary: list[str | None] = [None] + try: + yield is_rank0 + except BaseException as exc: + if is_rank0: + status += 1 + rank0_err = exc + error_summary[0] = f"{type(exc).__name__}: {exc}" + else: + # Work outside the ``if is_rank0:`` gate raised on a non-rank-0 rank; + # propagate locally — we only broadcast rank-0 failures. + raise + finally: + torch.distributed.all_reduce(status, op=torch.distributed.ReduceOp.MAX) + if status.item() != 0: + torch.distributed.broadcast_object_list(error_summary, src=0) + torch.distributed.barrier() + + if status.item() == 0: + return + if rank0_err is not None: + raise rank0_err + label_prefix = f"{label}: " if label else "" + raise RuntimeError( + f"{label_prefix}rank-0 failed inside run_or_wait_on_rank0() with " + f"{error_summary[0] or ''}; " + "see rank-0's traceback for the full stack." + ) from None + + +def run_on_rank0(fn, *args, label: str | None = None, **kwargs): + """Call ``fn(*args, **kwargs)`` on rank-0 only; return its result there, ``None`` elsewhere. + + A rank-0 failure is broadcast to every rank (see ``run_or_wait_on_rank0``). + ``args`` / ``kwargs`` are evaluated on every rank, so keep rank-0-only work inside ``fn``. + """ + result = None + with run_or_wait_on_rank0(label=label or getattr(fn, "__qualname__", None)) as is_rank0: + if is_rank0: + result = fn(*args, **kwargs) + return result diff --git a/gr00t/utils/initial_actions.py b/gr00t/utils/initial_actions.py index 04165ad49..41274d5c0 100644 --- a/gr00t/utils/initial_actions.py +++ b/gr00t/utils/initial_actions.py @@ -1,3 +1,45 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Safe (pickle-free) save/load for the per-dataset initial-actions cache. + +Why this isn't just ``np.savez(path, the_nested_list)``: + The cache is a nested ``list[dict[trajectory, dict[action_key, ndarray]]]``. + numpy can only store plain arrays, so handing it the nested object forces + it to *pickle* the whole structure — and reading a pickle runs whatever + code the file tells it to. An ``initial_actions.npz`` can come from an + untrusted place (a HuggingFace dataset bundle, shared NFS), so that load + would be an arbitrary-code-execution hole. + +How we avoid pickle: + We flatten the nested structure to one plain array per leaf, keyed by a + string ``"{dataset_idx}::{trajectory}::{action_key}"``. For example:: + + [{"traj_0": {"action.arm": arr}}] # nested input + -> {"0::traj_0::action.arm": arr, # what's stored on disk + "__schema__": } + + Every stored value is now a plain numeric array, so saving needs no pickle + and loading uses ``np.load(..., allow_pickle=False)`` (numpy's safe + default). The ``__schema__`` marker lets the loader recognise our format + and reject anything else. ``::`` is reserved as the field separator, so a + trajectory / action-key string containing it is rejected at save time + (otherwise the loader might split a key in the wrong place). +""" + +import json from pathlib import Path import numpy as np @@ -5,31 +47,125 @@ INITIAL_ACTIONS_FILENAME = "initial_actions.npz" +_KEY_SEP = "::" +_SCHEMA_KEY = "__schema__" +_FORMAT_VERSION = 1 + + +def _encode_key(dataset_idx: int, trajectory: str, action_key: str) -> str: + if _KEY_SEP in trajectory or _KEY_SEP in action_key: + raise ValueError( + f"trajectory / action_key must not contain {_KEY_SEP!r}; got " + f"trajectory={trajectory!r}, action_key={action_key!r}. The " + f"keyed-npz format reserves {_KEY_SEP!r} as a structural separator." + ) + return f"{dataset_idx}{_KEY_SEP}{trajectory}{_KEY_SEP}{action_key}" + + +def _decode_key(key: str) -> tuple[int, str, str]: + parts = key.split(_KEY_SEP, 2) + if len(parts) != 3: + raise ValueError( + f"Malformed initial-actions key {key!r}: expected three " + f"{_KEY_SEP!r}-separated fields (dataset_idx, trajectory, action_key)." + ) + dataset_idx_str, trajectory, action_key = parts + return int(dataset_idx_str), trajectory, action_key + def save_initial_actions( - initial_actions: dict[str, dict[str, np.ndarray]], initial_actions_path: str | Path -): - np.savez(str(initial_actions_path), initial_actions) + initial_actions: list[dict[str, dict[str, np.ndarray]]], + initial_actions_path: str | Path, +) -> None: + """Save the cache as a flat, pickle-free npz (see module docstring). + Flattens the nested ``list[dict[traj, dict[action_key, ndarray]]]`` to one + array per leaf under ``"{dataset_idx}::{trajectory}::{action_key}"`` keys, + plus a ``__schema__`` marker. Every stored value is a plain array, so the + matching loader can stay on the safe ``allow_pickle=False`` path. -def load_initial_actions(initial_actions_path: str | Path): + Raises ``ValueError`` if a trajectory or action-key string contains the + reserved ``::`` separator. """ - initial_actions: list[dict[str, dict[str, np.ndarray]]] - 0: (the first dataset) - trajectory_name: - action_key: - action: np.ndarray - 1: (the second dataset) - ... + flat: dict[str, np.ndarray] = {} + for dataset_idx, dataset_actions in enumerate(initial_actions): + for trajectory, action_dict in dataset_actions.items(): + for action_key, array in action_dict.items(): + encoded = _encode_key(dataset_idx, trajectory, action_key) + flat[encoded] = np.asarray(array) + schema = { + "format": "gr00t.initial_actions", + "version": _FORMAT_VERSION, + "key_sep": _KEY_SEP, + "num_datasets": len(initial_actions), + } + flat[_SCHEMA_KEY] = np.frombuffer(json.dumps(schema).encode("utf-8"), dtype=np.uint8) + np.savez(str(initial_actions_path), **flat) + + +def load_initial_actions( + initial_actions_path: str | Path, +) -> list[dict[str, dict[str, np.ndarray]]]: + """Load the cache without ever enabling pickle, rebuilding the nested + ``list[dict[traj, dict[action_key, ndarray]]]`` from the flat keys. + + Old files written before this fix were pickle-encoded (``np.savez(path, + the_nested_list)``). Rather than silently re-enabling pickle to read them + — which would re-open the code-execution hole — they are rejected with a + clear "re-generate the cache" error. Files missing or mismatching the + ``__schema__`` marker are rejected for the same reason. """ - initial_actions_npz = np.load(str(initial_actions_path), allow_pickle=True) - initial_actions = [] - initial_actions_array = initial_actions_npz[ - "arr_0" - ] # This is the default key when np.savez saves a list - for dataset_initial_actions in initial_actions_array: - initial_actions_for_this_dataset = {} - for trajectory_name, action_dict in dataset_initial_actions.items(): - initial_actions_for_this_dataset[trajectory_name] = action_dict - initial_actions.append(initial_actions_for_this_dataset) - return initial_actions + # Narrow the np.load() call so its ValueError can't shadow our own + # schema / decode validators below. + try: + npz_ctx = np.load(str(initial_actions_path), allow_pickle=False) + except ValueError as e: + # Match broadly: numpy's exact wording for the allow_pickle=False + # rejection has shifted across releases ("Object arrays cannot be + # loaded when allow_pickle=False" / "pickle"). Catch any of them. + if "pickle" in str(e).lower(): + raise ValueError( + f"{initial_actions_path}: rejected unsafe pickle-encoded " + "initial-actions file. The pre-2026-05 save format embedded " + "Python objects via numpy's pickle path, which is an arbitrary-" + "code-execution gadget when the file comes from an external " + "dataset / shared NFS. Re-generate the cache via the current " + "save_initial_actions()." + ) from e + raise + + with npz_ctx as npz: + keys = list(npz.files) + if _SCHEMA_KEY not in keys: + raise ValueError( + f"{initial_actions_path}: missing {_SCHEMA_KEY!r} marker — " + "this file appears to be in the pre-2026-05 pickle-based " + "format (or an unrelated npz). Re-save it via " + "save_initial_actions() to migrate to the safe keyed-npz " + "format." + ) + schema = json.loads(bytes(npz[_SCHEMA_KEY]).decode("utf-8")) + if schema.get("format") != "gr00t.initial_actions": + raise ValueError( + f"{initial_actions_path}: unrecognised schema {schema!r}; " + "expected format='gr00t.initial_actions'." + ) + if schema.get("version") != _FORMAT_VERSION: + raise ValueError( + f"{initial_actions_path}: unsupported version " + f"{schema.get('version')!r} (this build expects " + f"{_FORMAT_VERSION})." + ) + num_datasets = int(schema.get("num_datasets", 0)) + grouped: list[dict[str, dict[str, np.ndarray]]] = [{} for _ in range(num_datasets)] + for key in keys: + if key == _SCHEMA_KEY: + continue + dataset_idx, trajectory, action_key = _decode_key(key) + if dataset_idx < 0 or dataset_idx >= num_datasets: + raise ValueError( + f"{initial_actions_path}: key {key!r} references " + f"dataset_idx={dataset_idx} outside [0, {num_datasets})." + ) + grouped[dataset_idx].setdefault(trajectory, {})[action_key] = np.asarray(npz[key]) + return grouped diff --git a/gr00t/utils/video_utils.py b/gr00t/utils/video_utils.py index 0dbccb6e9..9eace127c 100644 --- a/gr00t/utils/video_utils.py +++ b/gr00t/utils/video_utils.py @@ -1,459 +1,133 @@ -import json +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 math -import subprocess from typing import List, Optional, Tuple -import av -import cv2 import numpy as np -import torchvision - - -# Import decord with graceful fallback -try: - import decord - - DECORD_AVAILABLE = True -except ImportError: - DECORD_AVAILABLE = False - -try: - import torchcodec - - TORCHCODEC_AVAILABLE = True -except (ImportError, RuntimeError): - TORCHCODEC_AVAILABLE = False - - -def _get_video_info_ffmpeg(video_path: str) -> dict: - """Get video metadata using ffprobe.""" - cmd = [ - "ffprobe", - "-v", - "error", - "-select_streams", - "v:0", - "-show_entries", - "stream=nb_frames,duration,r_frame_rate", - "-of", - "json", - video_path, - ] - - try: - output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode("utf-8") - probe_data = json.loads(output) - stream = probe_data["streams"][0] - - # Parse frame rate (comes as fraction like "15/1") - if "/" in stream["r_frame_rate"]: - num, den = map(int, stream["r_frame_rate"].split("/")) - fps = num / den - else: - fps = float(stream["r_frame_rate"]) - - # Get frame count and duration - nb_frames = int(stream.get("nb_frames", 0)) - duration = float(stream.get("duration", 0)) - - # If nb_frames is not available, estimate from duration and fps - if nb_frames == 0 and duration > 0: - nb_frames = int(duration * fps) - - return { - "nb_frames": nb_frames, - "fps": fps, - "duration": duration, - } - except (subprocess.CalledProcessError, json.JSONDecodeError, KeyError) as e: - raise ValueError(f"Failed to get video info for {video_path}: {e}") - - -def _extract_frames_ffmpeg(video_path: str, frame_indices: list[int]) -> np.ndarray: - """Extract specific frames using ffmpeg.""" - frames = [] - - for idx in frame_indices: - # Use ffmpeg to extract a specific frame - cmd = [ - "ffmpeg", - "-i", - video_path, - "-vf", - f"select=eq(n\\,{idx})", - "-vframes", - "1", - "-f", - "image2pipe", - "-pix_fmt", - "rgb24", - "-vcodec", - "rawvideo", - "-", - ] - - try: - output = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) - - # Check if output is empty (frame doesn't exist) - if len(output) == 0: - raise subprocess.CalledProcessError(1, cmd) - - # Get frame dimensions by probing first - if len(frames) == 0: - info_cmd = [ - "ffprobe", - "-v", - "error", - "-select_streams", - "v:0", - "-show_entries", - "stream=width,height", - "-of", - "json", - video_path, - ] - info_output = subprocess.check_output(info_cmd).decode("utf-8") - info_data = json.loads(info_output) - width = info_data["streams"][0]["width"] - height = info_data["streams"][0]["height"] - - # Decode raw RGB data - frame_data = np.frombuffer(output, dtype=np.uint8) - frame = frame_data.reshape((height, width, 3)) - frames.append(frame) - - except subprocess.CalledProcessError: - # Frame might not exist, create a black frame - if len(frames) > 0: - frames.append(np.zeros_like(frames[0])) - else: - # Default fallback frame - frames.append(np.zeros((480, 640, 3), dtype=np.uint8)) - - return np.array(frames) -def _extract_frames_at_timestamps_ffmpeg(video_path: str, timestamps: list[float]) -> np.ndarray: - """Extract frames at specific timestamps using ffmpeg.""" - frames = [] +_TORCHCODEC_INSTALL_HINT = ( + "torchcodec is required for video decoding. Install it via the platform " + "deployment script (scripts/deployment/{dgpu,orin,thor,spark}/install_deps.sh) " + "or `uv pip install torchcodec`." +) - for timestamp in timestamps: - cmd = [ - "ffmpeg", - "-ss", - str(timestamp), - "-i", - video_path, - "-vframes", - "1", - "-f", - "image2pipe", - "-pix_fmt", - "rgb24", - "-vcodec", - "rawvideo", - "-", - ] +_TORCHCODEC_FFMPEG_HINT = ( + "torchcodec is installed but its native library could not be loaded. This is " + "almost always an FFmpeg version mismatch: torchcodec 0.8.0 only ships loaders " + "for FFmpeg 4-7 and cannot run against FFmpeg 8 (the default on Ubuntu 25.10+ " + "and 26.04). Install an FFmpeg<8 runtime (e.g. `conda install -c conda-forge " + "'ffmpeg<8'` or a distro package) and ensure its shared libraries are on " + "LD_LIBRARY_PATH. Original error: {error}" +) - try: - output = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) +_DEFAULT_DECODER_KWARGS = { + "device": "cpu", + "dimension_order": "NHWC", + "num_ffmpeg_threads": 0, +} - # Check if output is empty (timestamp doesn't exist) - if len(output) == 0: - raise subprocess.CalledProcessError(1, cmd) - # Get frame dimensions - if len(frames) == 0: - info_cmd = [ - "ffprobe", - "-v", - "error", - "-select_streams", - "v:0", - "-show_entries", - "stream=width,height", - "-of", - "json", - video_path, - ] - info_output = subprocess.check_output(info_cmd).decode("utf-8") - info_data = json.loads(info_output) - width = info_data["streams"][0]["width"] - height = info_data["streams"][0]["height"] +def _decoder_import_error(exc: BaseException) -> ImportError: + """Map a torchcodec import/load failure to an actionable ImportError. - # Decode raw RGB data - frame_data = np.frombuffer(output, dtype=np.uint8) - frame = frame_data.reshape((height, width, 3)) - frames.append(frame) - - except subprocess.CalledProcessError: - # Timestamp might be out of bounds, use last frame or black frame - if len(frames) > 0: - frames.append(frames[-1]) - else: - frames.append(np.zeros((480, 640, 3), dtype=np.uint8)) - - return np.array(frames) - - -def _extract_all_frames_ffmpeg(video_path: str) -> tuple[np.ndarray, np.ndarray]: - """Extract all frames and their timestamps using ffmpeg.""" - # Get video info - info = _get_video_info_ffmpeg(video_path) - fps = info["fps"] + A plain ``ImportError`` means torchcodec is not installed. An ``OSError`` or + ``RuntimeError`` means torchcodec is present but its native library failed to + load, which is most commonly an FFmpeg major-version mismatch. + """ + if isinstance(exc, ImportError): + return ImportError(_TORCHCODEC_INSTALL_HINT) + return ImportError(_TORCHCODEC_FFMPEG_HINT.format(error=exc)) - # Extract all frames - cmd = [ - "ffmpeg", - "-i", - video_path, - "-f", - "image2pipe", - "-pix_fmt", - "rgb24", - "-vcodec", - "rawvideo", - "-", - ] +def _get_video_decoder_cls(): try: - output = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) - - # Get frame dimensions - info_cmd = [ - "ffprobe", - "-v", - "error", - "-select_streams", - "v:0", - "-show_entries", - "stream=width,height", - "-of", - "json", - video_path, - ] - info_output = subprocess.check_output(info_cmd).decode("utf-8") - info_data = json.loads(info_output) - width = info_data["streams"][0]["width"] - height = info_data["streams"][0]["height"] + from torchcodec.decoders import VideoDecoder + except (ImportError, OSError, RuntimeError) as exc: + raise _decoder_import_error(exc) from exc + return VideoDecoder - # Decode all frames - frame_data = np.frombuffer(output, dtype=np.uint8) - total_pixels = len(frame_data) // 3 - actual_frames = total_pixels // (width * height) - frames = frame_data[: actual_frames * width * height * 3].reshape( - (actual_frames, height, width, 3) - ) - - # Generate timestamps - timestamps = np.arange(actual_frames) / fps - - return frames, timestamps - - except subprocess.CalledProcessError as e: - raise ValueError(f"Failed to extract frames from {video_path}: {e}") +def _build_decoder(video_path: str, decoder_kwargs: Optional[dict]): + video_decoder_cls = _get_video_decoder_cls() + kwargs = {**_DEFAULT_DECODER_KWARGS, **(decoder_kwargs or {})} + return video_decoder_cls(video_path, **kwargs) def get_frames_by_indices( video_path: str, indices: list[int] | np.ndarray, - video_backend: str = "ffmpeg", - video_backend_kwargs: dict = {}, + decoder_kwargs: Optional[dict] = None, ) -> np.ndarray: - if video_backend == "decord": - if not DECORD_AVAILABLE: - raise ImportError("decord is not available. Install it with: pip install decord") - vr = decord.VideoReader(video_path, **video_backend_kwargs) - frames = vr.get_batch(indices) - return frames.asnumpy() - elif video_backend == "torchcodec": - if not TORCHCODEC_AVAILABLE: - raise ImportError("torchcodec is not available.") - decoder = torchcodec.decoders.VideoDecoder( - video_path, device="cpu", dimension_order="NHWC", num_ffmpeg_threads=0 - ) - return decoder.get_frames_at(indices=indices).data.numpy() - elif video_backend == "ffmpeg": - return _extract_frames_ffmpeg(video_path, list(indices)) - elif video_backend == "opencv": - frames = [] - cap = cv2.VideoCapture(video_path, **video_backend_kwargs) - for idx in indices: - cap.set(cv2.CAP_PROP_POS_FRAMES, idx) - ret, frame = cap.read() - if not ret: - raise ValueError(f"Unable to read frame at index {idx}") - frames.append(frame) - cap.release() - frames = np.array(frames) - return frames - else: - raise NotImplementedError + decoder = _build_decoder(video_path, decoder_kwargs) + return decoder.get_frames_at(indices=indices).data.numpy() def get_frames_by_timestamps( video_path: str, timestamps: list[float] | np.ndarray, - video_backend: str = "ffmpeg", - video_backend_kwargs: dict = {}, + decoder_kwargs: Optional[dict] = None, ) -> np.ndarray: """Get frames from a video at specified timestamps. Args: video_path (str): Path to the video file. - timestamps (list[int] | np.ndarray): Timestamps to retrieve frames for, in seconds. - video_backend (str, optional): Video backend to use. Defaults to "ffmpeg". + timestamps (list[float] | np.ndarray): Timestamps to retrieve frames for, in seconds. Returns: np.ndarray: Frames at the specified timestamps. """ - if video_backend == "decord": - if not DECORD_AVAILABLE: - raise ImportError("decord is not available. Install it with: pip install decord") - vr = decord.VideoReader(video_path, **video_backend_kwargs) - num_frames = len(vr) - # Retrieve the timestamps for each frame in the video - frame_ts: np.ndarray = vr.get_frame_timestamp(range(num_frames)) - # Map each requested timestamp to the closest frame index - # Only take the first element of the frame_ts array which corresponds to start_seconds - indices = np.abs(frame_ts[:, :1] - timestamps).argmin(axis=0) - frames = vr.get_batch(indices) - return frames.asnumpy() - elif video_backend == "torchcodec": - if not TORCHCODEC_AVAILABLE: - raise ImportError("torchcodec is not available.") - decoder = torchcodec.decoders.VideoDecoder( - video_path, device="cpu", dimension_order="NHWC", num_ffmpeg_threads=0 + decoder = _build_decoder(video_path, decoder_kwargs) + + # https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.decoders.VideoStreamMetadata.html#torchcodec.decoders.VideoStreamMetadata + fps = decoder.metadata.average_fps + interval = 1 / fps + timestamps = np.array(timestamps).astype(np.float64) + + # Correct float precision issues in timestamps + # E.g. for 5fps video: [1.0, 1.20000005, 1.39999998] -> [1.0, 1.2, 1.4] + # Without this, torchcodec will read the delayed frame (e.g. 1.39999998 -> 1.2) + # Round to nearest frame interval to prevent torchcodec from reading wrong frames. + # Allow max 1% error from expected interval. + closest_timestamps = np.round(timestamps / interval) * interval + timestamp_errors = np.abs(closest_timestamps - timestamps) / interval + invalid_mask = timestamp_errors >= 0.01 + if np.any(invalid_mask): + invalid_indices = np.where(invalid_mask)[0] + invalid_timestamps = timestamps[invalid_indices] + raise ValueError( + f"Try to read invalid timestamps {invalid_timestamps} from video {video_path} (FPS: {fps})" ) - # https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.decoders.VideoStreamMetadata.html#torchcodec.decoders.VideoStreamMetadata - fps = decoder.metadata.average_fps - interval = 1 / fps - timestamps = np.array(timestamps).astype(np.float64) - - # Correct float precision issues in timestamps - # E.g. for 5fps video: [1.0, 1.20000005, 1.39999998] -> [1.0, 1.2, 1.4] - # Without this, the torchcodec will read the delayed frame (e.g. 1.39999998 -> 1.2) - # Round to nearest frame interval to prevent torchcodec from reading wrong frames - # Allow max 1% error from expected interval - closest_timestamps = np.round(timestamps / interval) * interval - timestamp_errors = np.abs(closest_timestamps - timestamps) / interval - invalid_mask = timestamp_errors >= 0.01 - if np.any(invalid_mask): - invalid_indices = np.where(invalid_mask)[0] - invalid_timestamps = timestamps[invalid_indices] - raise ValueError( - f"Try to read invalid timestamps {invalid_timestamps} from video {video_path} (FPS: {fps})" - ) - - timestamps = closest_timestamps - - return decoder.get_frames_played_at(seconds=timestamps).data.numpy() - elif video_backend == "ffmpeg": - return _extract_frames_at_timestamps_ffmpeg(video_path, list(timestamps)) - elif video_backend == "opencv": - # Open the video file - cap = cv2.VideoCapture(video_path, **video_backend_kwargs) - if not cap.isOpened(): - raise ValueError(f"Unable to open video file: {video_path}") - # Retrieve the total number of frames - num_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - # Calculate timestamps for each frame - fps = cap.get(cv2.CAP_PROP_FPS) - frame_ts = np.arange(num_frames) / fps - frame_ts = frame_ts[:, np.newaxis] # Reshape to (num_frames, 1) for broadcasting - # Map each requested timestamp to the closest frame index - indices = np.abs(frame_ts - timestamps).argmin(axis=0) - frames = [] - for idx in indices: - cap.set(cv2.CAP_PROP_POS_FRAMES, idx) - ret, frame = cap.read() - if not ret: - raise ValueError(f"Unable to read frame at index {idx}") - frames.append(frame) - cap.release() - frames = np.array(frames) - return frames - - elif video_backend == "torchvision_av": - # set backend - torchvision.set_video_backend("pyav") - - # set a video stream reader - # TODO(rcadene): also load audio stream at the same time - reader = torchvision.io.VideoReader(video_path, "video") - - # set the first and last requested timestamps - # Note: previous timestamps are usually loaded, since we need to access the previous key frame - first_ts = timestamps[0] - last_ts = timestamps[-1] - - # access closest key frame of the first requested frame - # Note: closest key frame timestamp is usally smaller than `first_ts` (e.g. key frame can be the first frame of the video) - # for details on what `seek` is doing see: https://pyav.basswood-io.com/docs/stable/api/container.html?highlight=inputcontainer#av.container.InputContainer.seek - reader.seek(first_ts, keyframes_only=True) - - # load all frames until last requested frame - loaded_frames = [] - loaded_ts = [] - for frame in reader: - current_ts = frame["pts"] - loaded_frames.append(frame["data"]) - loaded_ts.append(current_ts) - if current_ts >= last_ts: - break - - reader.container.close() - reader = None - frames = np.array(loaded_frames) - return frames.transpose(0, 2, 3, 1) - - else: - raise NotImplementedError + timestamps = closest_timestamps + return decoder.get_frames_played_at(seconds=timestamps).data.numpy() def get_all_frames( video_path: str, - video_backend: str = "ffmpeg", - video_backend_kwargs: dict = {}, + decoder_kwargs: Optional[dict] = None, ) -> tuple[np.ndarray, np.ndarray]: """Get all frames from a video. Returns: tuple[np.ndarray, np.ndarray]: Frames and timestamps. """ - if video_backend == "decord": - if not DECORD_AVAILABLE: - raise ImportError("decord is not available. Install it with: pip install decord") - vr = decord.VideoReader(video_path, **video_backend_kwargs) - frames = vr.get_batch(range(len(vr))).asnumpy() - return frames, vr.get_frame_timestamp(range(len(vr)))[:, 0] - elif video_backend == "torchcodec": - if not TORCHCODEC_AVAILABLE: - raise ImportError("torchcodec is not available.") - decoder = torchcodec.decoders.VideoDecoder( - video_path, device="cpu", dimension_order="NHWC", num_ffmpeg_threads=0 - ) - frames = decoder.get_frames_at(indices=range(len(decoder))) - return frames.data.numpy(), frames.pts_seconds.numpy() - elif video_backend == "ffmpeg": - return _extract_all_frames_ffmpeg(video_path) - elif video_backend == "pyav": - container = av.open(video_path) - stream = container.streams.video[0] - assert stream.time_base is not None - frames = [] - timestamps = [] - for frame in container.decode(video=0): - frames.append(frame.to_ndarray(format="rgb24")) - timestamps.append(frame.pts * stream.time_base) - container.close() - return np.stack(frames), np.array(timestamps) - - else: - raise NotImplementedError + decoder = _build_decoder(video_path, decoder_kwargs) + frames = decoder.get_frames_at(indices=range(len(decoder))) + return frames.data.numpy(), frames.pts_seconds.numpy() def get_accumulate_timestamp_idxs( diff --git a/media/behavior_n1d6.mp4 b/media/behavior_n1d6.mp4 deleted file mode 100644 index 0232a46b6..000000000 Binary files a/media/behavior_n1d6.mp4 and /dev/null differ diff --git a/media/open_loop_eval_rebot_arm_dm.jpg b/media/open_loop_eval_rebot_arm_dm.jpg new file mode 100644 index 000000000..1d95f92c6 Binary files /dev/null and b/media/open_loop_eval_rebot_arm_dm.jpg differ diff --git a/media/open_loop_eval_so100.jpg b/media/open_loop_eval_so100.jpg new file mode 100644 index 000000000..12f400563 Binary files /dev/null and b/media/open_loop_eval_so100.jpg differ diff --git a/media/open_loop_eval_so100.png b/media/open_loop_eval_so100.png deleted file mode 100644 index eb4990cd6..000000000 Binary files a/media/open_loop_eval_so100.png and /dev/null differ diff --git a/pyproject.toml b/pyproject.toml index 0f2c5b58e..9beb9e504 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,4 @@ -#This is the single project pyproject.toml +# Default platform pyproject.toml (x86, GB200, and any non-Jetson GPU) [build-system] requires = ["setuptools>=67", "wheel", "pip"] @@ -7,58 +7,129 @@ build-backend = "setuptools.build_meta" [project] name = "gr00t" version = "0.1.0" -requires-python = "==3.10.*" -# Mirror the main repo's baseline dependencies so install behaves the same. +requires-python = ">=3.12,<3.13" dependencies = [ "albumentations==1.4.18", - "av==15.0.0", + "huggingface-hub[cli]", + "opencv-python-headless>=4.5,<4.13", "diffusers==0.35.1", - "dm-tree==0.1.8", + "dm-tree", "lmdb==1.7.5", "msgpack==1.1.0", "msgpack-numpy==0.4.8", "pandas==2.2.3", "peft==0.17.1", "termcolor==3.2.0", - "torch==2.7.0", - "torchvision==0.22.0", - "transformers==4.51.3", + "torch==2.9.0", + "torchvision==0.24.0", + "transformers==4.57.3", "tyro==0.9.17", - "flash-attn==2.7.4.post1", "click==8.1.8", "datasets==3.6.0", + "cryptography>=46.0.7", "einops==0.8.1", + "gitpython==3.1.50", + "jsonlines==4.0.0", "gymnasium==1.2.2", "matplotlib==3.10.1", "numpy==1.26.4", "omegaconf==2.3.0", "scipy==1.15.3", - "torchcodec==0.4.0", + # torchcodec 0.8.0 pairs with torch 2.9 and supports FFmpeg 4-7. It does NOT + # support FFmpeg 8 (the default on Ubuntu 25.10+/26.04); on those distros + # install an FFmpeg<8 runtime. x86_64: PyPI wheel; aarch64 Linux: prebuilt + # wheel in scripts/deployment/dgpu/wheels/ (no aarch64 wheel published on PyPI). + "torchcodec==0.8.0; platform_machine == 'x86_64'", + "torchcodec==0.8.0; platform_machine == 'aarch64' and sys_platform == 'linux'", "wandb==0.23.0", "pyzmq==27.0.1", - "deepspeed==0.17.6", + # deepspeed publishes wheels only for x86_64 Linux. + "deepspeed==0.17.6; sys_platform == 'linux' and platform_machine == 'x86_64'", + # triton is needed on aarch64 (GB200) but ships with torch on x86_64 + "triton==3.5.0; sys_platform == 'linux' and platform_machine == 'aarch64'", + # flash-attn wheels are sourced from `[tool.uv.sources]` below (official cp312 wheels for x86_64 and aarch64). + "flash-attn==2.8.3; sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64')", + "onnx>=1.20.0", + "onnxscript", + # cu12 wheels only exist for x86_64; Blackwell / aarch64 requires cu13. + "tensorrt-cu12>=10.15.1.29; platform_machine == 'x86_64'", + "tensorrt-cu13>=10.15.1.29; platform_machine == 'aarch64'", + "tensorrt-cu12-libs>=10.15.1.29; platform_machine == 'x86_64'", + "tensorrt-cu13-libs>=10.15.1.29; platform_machine == 'aarch64'", ] [project.optional-dependencies] dev = [ + "boto3", "ruff", "ipython", -] -tensorrt = [ - "onnx>=1.20.0", - "tensorrt>=10.14.1.48.post1", + "pip-licenses", + "pytest", + "pytest-cov", + "pytest-timeout", + "pytest-xdist", + "build", + "pre-commit", + # `tomllib` is 3.11+ stdlib; provide `tomli` for the 3.10 fallback. + "tomli; python_version < '3.11'", ] [tool.setuptools.packages.find] where = ["."] include = ["gr00t*"] +[tool.uv] +required-environments = [ + "sys_platform == 'linux' and platform_machine == 'x86_64'", + "sys_platform == 'linux' and platform_machine == 'aarch64'", +] + +[tool.uv.sources] +torch = [ + { index = "pytorch-cu128", marker = "sys_platform == 'linux'" }, +] +torchvision = [ + { index = "pytorch-cu128", marker = "sys_platform == 'linux'" }, +] +triton = [ + { index = "pytorch-cu128", marker = "sys_platform == 'linux'" }, +] +flash-attn = [ + { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine == 'x86_64'" }, + { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64'" }, +] +torchcodec = [ + { path = "scripts/deployment/dgpu/wheels/torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64'" }, +] +tensorrt-cu12-libs = [ + { index = "nvidia-pypi", marker = "platform_machine == 'x86_64'" }, +] +tensorrt-cu13-libs = [ + { index = "nvidia-pypi", marker = "platform_machine == 'aarch64'" }, +] + [tool.uv.extra-build-dependencies] -flash-attn = ["torch==2.7.0", "numpy==1.26.4"] +flash-attn = ["torch==2.9.0", "numpy==1.26.4", "triton==3.5.0"] + +[tool.pytest.ini_options] +pythonpath = [".", "tests"] +addopts = "--import-mode=importlib" +markers = [ + "gpu: tests that require a GPU", + "edge_device: tests that run on edge device runners (Orin, Thor, DGX Spark)", + "multigpu: tests that require multiple GPUs and use all visible GPUs", + "serial: run in the CPU job's serial phase instead of under pytest-xdist -n auto (e.g. it forks torch-importing subprocesses that oversubscribe the box and time out under full fan-out)", +] +# Include fixture setup/teardown in JUnit so duration +# reports (ci/print_duration_summary.py) and TestRun.duration in testdb +# reflect real wall-clock time. With the default ("call"), expensive +# session/module/class-scoped fixtures (e.g. NFS->local model staging, +# Gr00tPolicy load) are invisible and tests look misleadingly fast. +junit_duration_report = "total" [tool.ruff] line-length = 100 -target-version = "py310" +target-version = "py312" src = ["gr00t"] exclude = [ "__pycache__", @@ -70,7 +141,6 @@ exclude = [ "dist", "logs", "*.ipynb", - "gr00t/model/modules/nvidia/Eagle-Block2A-2B-v2", "external_dependencies", ] @@ -94,3 +164,13 @@ force-wrap-aliases = false split-on-trailing-comma = false lines-after-imports = 2 section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] + +[[tool.uv.index]] +name = "nvidia-pypi" +url = "https://pypi.nvidia.com" +explicit = true + +[[tool.uv.index]] +name = "pytorch-cu128" +url = "https://download.pytorch.org/whl/cu128" +explicit = true diff --git a/scripts/activate_jetpack72.sh b/scripts/activate_jetpack72.sh new file mode 100644 index 000000000..85960db2b --- /dev/null +++ b/scripts/activate_jetpack72.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# activate_jetpack72.sh — Source this in each new shell to configure a JetPack 7.2 environment. +# Usage: source scripts/activate_jetpack72.sh +# +# Sets TRITON_PTXAS_PATH and LD_LIBRARY_PATH needed for inference on Jetson Orin and Thor. +# Docker users don't need this — the Dockerfile sets these via ENV directives. + +# torch.compile needs ptxas from the CUDA toolkit +if [ -f /usr/local/cuda-13.2/bin/ptxas ]; then + export TRITON_PTXAS_PATH=/usr/local/cuda-13.2/bin/ptxas + export CUDA_HOME=/usr/local/cuda-13.2 + export CUDA_PATH=/usr/local/cuda-13.2 +elif [ -f /usr/local/cuda/bin/ptxas ]; then + export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas + export CUDA_HOME=/usr/local/cuda + export CUDA_PATH=/usr/local/cuda +else + echo "WARNING: ptxas not found. torch.compile may fail." + echo " Install CUDA toolkit or set TRITON_PTXAS_PATH manually." +fi + +# Ensure CUDA 13.2 runtime is loaded for the PyTorch cu132 stack. +if [ -d /usr/local/cuda-13.2/lib64 ]; then + export LD_LIBRARY_PATH="/usr/local/cuda-13.2/lib64:${LD_LIBRARY_PATH:-}" +fi + +# Triton and torchcodec need PyTorch's shared libraries on the runtime linker path. +TORCH_LIB_DIR="$(python3 -c 'import site; print(site.getsitepackages()[0])' 2>/dev/null || true)" +if [ -n "${TORCH_LIB_DIR:-}" ] && [ -d "${TORCH_LIB_DIR}/torch/lib" ]; then + export LD_LIBRARY_PATH="${TORCH_LIB_DIR}/torch/lib:${LD_LIBRARY_PATH:-}" +fi + +# Triton compiles small CUDA helper modules and expects cuda.h to be discoverable. +if [ -d "${CUDA_HOME:-}/include" ]; then + export CPATH="${CUDA_HOME}/include:${CPATH:-}" + export C_INCLUDE_PATH="${CUDA_HOME}/include:${C_INCLUDE_PATH:-}" + export CPLUS_INCLUDE_PATH="${CUDA_HOME}/include:${CPLUS_INCLUDE_PATH:-}" +fi + +# Add CUDA, NVIDIA, and TensorRT pip package libs to LD_LIBRARY_PATH. +SITE_PKGS="$(python3 -c 'import site; print(site.getsitepackages()[0])' 2>/dev/null || true)" +if [ -n "${SITE_PKGS:-}" ]; then + EXTRA_LIB_DIRS=$(find "$SITE_PKGS" \ + \( -path "$SITE_PKGS/nvidia/*/lib" \ + -o -path "$SITE_PKGS/cuda*/lib" \ + -o -path "$SITE_PKGS/tensorrt_libs" \ + -o -path "$SITE_PKGS/tensorrt*/lib" \) \ + -type d 2>/dev/null | tr '\n' ':') + if [ -n "$EXTRA_LIB_DIRS" ]; then + export LD_LIBRARY_PATH="${EXTRA_LIB_DIRS}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + fi +fi + +echo "JetPack 7.2 environment configured." +echo " TRITON_PTXAS_PATH=${TRITON_PTXAS_PATH:-}" +echo " CUDA_HOME=${CUDA_HOME:-}" +echo " LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-}" diff --git a/scripts/activate_orin.sh b/scripts/activate_orin.sh new file mode 120000 index 000000000..87a97199a --- /dev/null +++ b/scripts/activate_orin.sh @@ -0,0 +1 @@ +activate_jetpack72.sh \ No newline at end of file diff --git a/scripts/activate_spark.sh b/scripts/activate_spark.sh new file mode 100644 index 000000000..0420abc1f --- /dev/null +++ b/scripts/activate_spark.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# activate_spark.sh — Source this in each new shell to configure the Spark environment. +# Usage: source scripts/activate_spark.sh +# +# Sets TRITON_PTXAS_PATH and LD_LIBRARY_PATH needed for inference on DGX Spark. +# Docker users don't need this — the Dockerfile sets these via ENV directives. + +# torch.compile needs ptxas from the CUDA toolkit +if [ -f /usr/local/cuda-13.0/bin/ptxas ]; then + export TRITON_PTXAS_PATH=/usr/local/cuda-13.0/bin/ptxas + export CUDA_HOME=/usr/local/cuda-13.0 + export CUDA_PATH=/usr/local/cuda-13.0 +elif [ -f /usr/local/cuda/bin/ptxas ]; then + export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas + export CUDA_HOME=/usr/local/cuda + export CUDA_PATH=/usr/local/cuda +else + echo "WARNING: ptxas not found. torch.compile may fail." + echo " Install CUDA toolkit or set TRITON_PTXAS_PATH manually." +fi + +# Triton and torchcodec need PyTorch's shared libraries on the runtime linker path. +TORCH_LIB_DIR="$(python3 -c 'import site; print(site.getsitepackages()[0])' 2>/dev/null || true)" +if [ -n "${TORCH_LIB_DIR:-}" ] && [ -d "${TORCH_LIB_DIR}/torch/lib" ]; then + export LD_LIBRARY_PATH="${TORCH_LIB_DIR}/torch/lib:${LD_LIBRARY_PATH:-}" +fi + +# Triton compiles small CUDA helper modules and expects cuda.h to be discoverable. +if [ -d "${CUDA_HOME:-}/include" ]; then + export CPATH="${CUDA_HOME}/include:${CPATH:-}" + export C_INCLUDE_PATH="${CUDA_HOME}/include:${C_INCLUDE_PATH:-}" + export CPLUS_INCLUDE_PATH="${CUDA_HOME}/include:${CPLUS_INCLUDE_PATH:-}" +fi + +# Add nvidia pip package libs (cudnn, cudss, etc.) to LD_LIBRARY_PATH +SITE_PKGS="$(python3 -c 'import site; print(site.getsitepackages()[0])' 2>/dev/null || true)" +if [ -n "${SITE_PKGS:-}" ]; then + NVIDIA_LIB_DIRS=$(find "$SITE_PKGS/nvidia" -name "lib" -type d 2>/dev/null | tr '\n' ':') + if [ -n "$NVIDIA_LIB_DIRS" ]; then + export LD_LIBRARY_PATH="${NVIDIA_LIB_DIRS}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + fi +fi + +echo "Spark environment configured." +echo " TRITON_PTXAS_PATH=${TRITON_PTXAS_PATH:-}" +echo " CUDA_HOME=${CUDA_HOME:-}" +echo " LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-}" diff --git a/scripts/activate_thor.sh b/scripts/activate_thor.sh new file mode 120000 index 000000000..87a97199a --- /dev/null +++ b/scripts/activate_thor.sh @@ -0,0 +1 @@ +activate_jetpack72.sh \ No newline at end of file diff --git a/scripts/deployment/GR00T_inference_timing.ipynb b/scripts/deployment/GR00T_inference_timing.ipynb index 8e2defce9..7a9de5639 100644 --- a/scripts/deployment/GR00T_inference_timing.ipynb +++ b/scripts/deployment/GR00T_inference_timing.ipynb @@ -7,7 +7,7 @@ "# GR00T Inference Timing Analysis\n", "\n", "This notebook analyzes the inference time breakdown between:\n", - "- **Backbone** (Eagle VLM): Processes visual and language inputs\n", + "- **Backbone** (Cosmos-Reason2-2B / Qwen3-VL): Processes visual and language inputs\n", "- **Action Head** (DiT diffusion model): Generates actions using flow matching\n", "\n", "### Inference Modes Benchmarked:\n", @@ -56,11 +56,11 @@ ], "source": [ "# Configuration\n", - "MODEL_PATH = \"nvidia/GR00T-N1.6-3B\"\n", + "MODEL_PATH = \"nvidia/GR00T-N1.7-3B\"\n", "\n", "REPO_PATH = os.path.dirname(os.path.dirname(gr00t.__file__))\n", - "DATASET_PATH = os.path.join(REPO_PATH, \"demo_data/gr1.PickNPlace\")\n", - "EMBODIMENT_TAG = \"gr1\"\n", + "DATASET_PATH = os.path.join(REPO_PATH, \"demo_data/droid_sample\")\n", + "EMBODIMENT_TAG = \"OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT\"\n", "\n", "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "print(f\"Using device: {device}\")" @@ -82,7 +82,7 @@ "# Load the policy\n", "policy = Gr00tPolicy(\n", " model_path=MODEL_PATH,\n", - " embodiment_tag=EmbodimentTag(EMBODIMENT_TAG),\n", + " embodiment_tag=EmbodimentTag.resolve(EMBODIMENT_TAG),\n", " device=device,\n", " strict=True,\n", ")\n", @@ -122,8 +122,6 @@ "dataset = LeRobotEpisodeLoader(\n", " dataset_path=DATASET_PATH,\n", " modality_configs=modality_config,\n", - " video_backend=\"torchcodec\",\n", - " video_backend_kwargs=None,\n", ")\n", "print(f\"Dataset loaded with {len(dataset)} episodes\")" ] @@ -217,7 +215,7 @@ " episode_data, \n", " step_index=0, \n", " modality_configs=modality_config, \n", - " embodiment_tag=EmbodimentTag(EMBODIMENT_TAG), \n", + " embodiment_tag=EmbodimentTag.resolve(EMBODIMENT_TAG), \n", " allow_padding=False\n", ")\n", "\n", @@ -779,7 +777,7 @@ "================================================================================\n", "\n", "Hardware: NVIDIA H100 80GB HBM3\n", - "Model: nvidia/GR00T-N1.6-3B\n", + "Model: nvidia/GR00T-N1.7-3B\n", "Action Horizon: 50\n", "Denoising Steps: 4\n", "\n", @@ -953,7 +951,7 @@ "print(\"Loading fresh policy for torch.compile...\")\n", "policy_compiled = Gr00tPolicy(\n", " model_path=MODEL_PATH,\n", - " embodiment_tag=EmbodimentTag(EMBODIMENT_TAG),\n", + " embodiment_tag=EmbodimentTag.resolve(EMBODIMENT_TAG),\n", " device=device,\n", " strict=True,\n", ")\n", @@ -1370,8 +1368,8 @@ "else:\n", " print(f\"✗ TensorRT engine not found at: {TRT_ENGINE_PATH}\")\n", " print(\" To build the engine, run:\")\n", - " print(\" python scripts/deployment/export_onnx_n1d6.py --model_path nvidia/GR00T-N1.6-3B --dataset_path --output_dir ./groot_n1d6_onnx\")\n", - " print(\" python scripts/deployment/build_tensorrt_engine.py --onnx ./groot_n1d6_onnx/dit_model.onnx --engine ~/tensorrt-engine/dit_model_bf16.trt --precision bf16\")\n", + " print(\" python scripts/deployment/export_onnx_n1d7.py --model-path nvidia/GR00T-N1.7-3B --dataset-path --output-dir ./gr00t_n1d7_onnx\")\n", + " print(\" python scripts/deployment/build_tensorrt_engine.py --onnx ./gr00t_n1d7_onnx/dit_bf16.onnx --engine ~/tensorrt-engine/dit_model_bf16.trt --precision bf16\")\n", " TRT_AVAILABLE = False" ] }, @@ -1513,11 +1511,23 @@ ], "source": [ "if TRT_AVAILABLE:\n", + " # Free the torch.compile policy before loading the TensorRT policy.\n", + " # Keeping the eager, torch.compile, and TensorRT policies resident at\n", + " # once can exceed GPU memory on smaller cards (e.g. NVIDIA A16, 15 GB)\n", + " # and raise a CUDA OutOfMemoryError here. Only the compiled policy's\n", + " # numeric timing results are needed later, so its object can be freed.\n", + " import gc\n", + "\n", + " if \"policy_compiled\" in globals():\n", + " del globals()[\"policy_compiled\"]\n", + " gc.collect()\n", + " torch.cuda.empty_cache()\n", + "\n", " # Load a fresh policy for TensorRT\n", " print(\"Loading fresh policy for TensorRT...\")\n", " policy_trt = Gr00tPolicy(\n", " model_path=MODEL_PATH,\n", - " embodiment_tag=EmbodimentTag(EMBODIMENT_TAG),\n", + " embodiment_tag=EmbodimentTag.resolve(EMBODIMENT_TAG),\n", " device=device,\n", " strict=True,\n", " )\n", @@ -1946,7 +1956,7 @@ "====================================================================================================\n", "\n", "Hardware: NVIDIA H100 80GB HBM3\n", - "Model: nvidia/GR00T-N1.6-3B\n", + "Model: nvidia/GR00T-N1.7-3B\n", "Action Horizon: 50\n", "Denoising Steps: 4\n", "\n", diff --git a/scripts/deployment/README.md b/scripts/deployment/README.md index 71ebb5e5a..c9f6850bd 100644 --- a/scripts/deployment/README.md +++ b/scripts/deployment/README.md @@ -1,234 +1,510 @@ # GR00T Deployment & Inference Guide -Run inference with PyTorch or TensorRT acceleration for the GR00T policy. +Run inference with PyTorch or TensorRT acceleration for the GR00T N1.7 policy. --- ## Prerequisites -- Model checkpoint (e.g., `nvidia/GR00T-N1.6-3B`) -- Dataset in LeRobot format +- Model checkpoint: `nvidia/GR00T-N1.7-3B` +- Dataset in LeRobot format (e.g., `demo_data/libero_demo`) - CUDA-enabled GPU +- Setup uv environment following README.md -### Installation +| Platform | Installation | +|----------|-------------| +| **dGPU** (H100, A100, RTX 4090/5090, L20, RTX Pro 5000/6000, etc.) | `uv sync` — GPU deps (`flash-attn`, `onnx`, `tensorrt`) included | +| **[Jetson Thor](https://developer.nvidia.com/embedded/jetson)** | [Jetson Thor Setup](#jetson-thor-setup) (Docker or bare metal) | +| **[DGX Spark](https://developer.nvidia.com/dgx-spark)** | [DGX Spark Setup](#dgx-spark-setup) (Docker or bare metal) | +| **[Jetson Orin](https://developer.nvidia.com/embedded/jetson)** | [Jetson Orin Setup](#jetson-orin-setup) (Docker or bare metal) | + +- dGPU local environment: use the installation commands below, then use the PyTorch or TensorRT commands in this guide +- Thor Docker or bare metal: skip to [Jetson Thor Setup](#jetson-thor-setup) +- Spark Docker or bare metal: skip to [DGX Spark Setup](#dgx-spark-setup) +- Orin Docker or bare metal: skip to [Jetson Orin Setup](#jetson-orin-setup) + +### dGPU Installation -**PyTorch mode** (default installation): ```bash uv sync ``` -**TensorRT mode** (includes ONNX and TensorRT dependencies): +GPU dependencies (`flash-attn`, `onnx`, `tensorrt`) are included in the default install. + +## Download Model and Dataset + +Download the finetuned model to a local directory (HuggingFace does not support nested repo paths directly): + ```bash -uv sync --extra tensorrt +uv run hf download nvidia/GR00T-N1.7-LIBERO \ + --include "libero_10/config.json" "libero_10/embodiment_id.json" \ + "libero_10/model-*.safetensors" "libero_10/model.safetensors.index.json" \ + "libero_10/processor_config.json" "libero_10/statistics.json" \ + --local-dir checkpoints/GR00T-N1.7-LIBERO ``` +For demo dataset setup, see the [Data Format section in the main README](../../README.md#data-format). + --- -## Quick Start: PyTorch Mode +## Quick Start: PyTorch Inference + +Run inference on demo trajectories using PyTorch (no TRT setup needed): ```bash -python scripts/deployment/standalone_inference_script.py \ - --model-path nvidia/GR00T-N1.6-3B \ - --dataset-path /path/to/dataset \ - --embodiment-tag GR1 \ - --traj-ids 0 1 2 \ +uv run python scripts/deployment/standalone_inference_script.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA \ + --traj-ids 0 1 2 3 4 \ --inference-mode pytorch \ - --action-horizon 8 + --execution-horizon 8 ``` --- -## TensorRT Mode (2x Faster) +## TensorRT Acceleration + +The `trt_full_pipeline` mode (passed via `--inference-mode trt_full_pipeline` +in `standalone_inference_script.py`) accelerates all model components with +TRT engines. Speedup varies by platform — see benchmark tables below for +measured results on each device. The same pipeline is referred to as +`n17_full_pipeline` inside the engine-loading and build scripts +(`trt_model_forward.py`, `build_trt_pipeline.py`); the two names describe +the same set of engines. + +| Component | Engine | Notes | +|-----------|--------|-------| +| ViT | **TRT** | Qwen3-VL Vision (24 blocks, FP32 for accuracy) | +| LLM | **TRT** | Qwen3-VL Text Model (16 layers, with deepstack injection) | +| VL Self-Attention | **TRT** | SelfAttentionTransformer (4 layers, if present) | +| State Encoder | **TRT** | CategorySpecificMLP | +| Action Encoder | **TRT** | MultiEmbodimentActionEncoder | +| DiT | **TRT** | AlternateVLDiT (32 layers) | +| Action Decoder | **TRT** | CategorySpecificMLP | -### Step 1: Export to ONNX +Lightweight ops remain in PyTorch: `embed_tokens`, `masked_scatter`, `get_rope_index`, VLLN. + +### TRT Export Modes + +| Export mode | TRT components | PyTorch components | Typical use | +|-------------|----------------|--------------------|-------------| +| `dit_only` | DiT only | Backbone, state encoder, action encoder, action decoder | Legacy path and fallback/debug | +| `action_head` | State encoder, action encoder, DiT, action decoder | Backbone | Isolate action-head TRT accuracy/performance | +| `full_pipeline` | Backbone and action head | Lightweight glue ops listed above | Recommended fast path on dGPU, Thor, Spark, and Orin | + +
+DiT-only mode (legacy from N1.6) + +The `dit_only` export mode (`--export-mode dit_only`) optimizes only the action head DiT, leaving the backbone in PyTorch. This was the default in N1.6. For N1.7, **full_pipeline is recommended** as it accelerates the backbone (ViT + LLM) which dominates inference time. +
+ +### Build TRT Engines + +The unified `build_trt_pipeline.py` script runs all steps (export ONNX → build engines → verify accuracy → benchmark) in a single command: ```bash -python scripts/deployment/export_onnx_n1d6.py \ - --model-path nvidia/GR00T-N1.6-3B \ - --dataset-path /path/to/dataset \ - --embodiment-tag GR1 \ - --output-dir ./groot_n1d6_onnx +uv run python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA ``` -**Output:** `./groot_n1d6_onnx/dit_model.onnx` +> **Finetuned models:** Replace `--model-path` with your checkpoint path. The pipeline is identical for base and finetuned models. + +> **Note:** Engine build takes ~2-5 minutes depending on GPU. Engines are GPU-architecture-specific and must be rebuilt for different GPUs. + +> **Batch size:** The `--batch-size` value is baked as a **static** dimension into the ONNX and TRT models. Engines built with one batch size cannot be used with a different batch size at runtime. If you need a different batch size, re-run the full pipeline (`--steps export,build,verify`) with the new `--batch-size` value. + +> **ONNX exporter:** The N1.7 TRT export path uses PyTorch's legacy ONNX exporter explicitly (`dynamo=False`) for all components. Keep this explicit in custom export code as well: the dynamo exporter can specialize dynamic sequence dimensions such as `vl_seq_len`, which breaks TensorRT runtime flexibility for different token lengths. -### Step 2: Build TensorRT Engine +You can also run a subset of steps: ```bash -python scripts/deployment/build_tensorrt_engine.py \ - --onnx ./groot_n1d6_onnx/dit_model.onnx \ - --engine ./groot_n1d6_onnx/dit_model_bf16.trt \ - --precision bf16 +# Export + build only (skip verify and benchmark) +uv run python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA \ + --steps export,build ``` -**Output:** `./groot_n1d6_onnx/dit_model_bf16.trt` +
+What each step does -> **Note:** Engine build takes ~5-10 minutes depending on GPU. The engine is GPU-specific and needs to be rebuilt for different GPU architectures. +The pipeline runs 4 steps in sequence: -### Step 3: Run with TensorRT +1. **Export to ONNX** (`export`) — Exports all model components (LLM, VL Self-Attention, State Encoder, Action Encoder, DiT, Action Decoder) to ONNX format under `/onnx/`. +2. **Build TensorRT Engines** (`build`) — Compiles each ONNX model into a GPU-specific TensorRT engine under `/engines/`. +3. **Verify Accuracy** (`verify`) — Runs PyTorch vs TRT output comparison. Expected: `Cosine Similarity: 0.999+` (PASS). +4. **Benchmark** (`benchmark`) — Measures E2E latency for PyTorch Eager, torch.compile, and TRT modes. + +Each step can be run individually via `--steps `. Verbose logs are written to `/pipeline.log`. +
+ +--- + +## Performance + +### Benchmark Results + +GR00T N1.7 Inference Timing (4 denoising steps, 1 camera): + +| Device | Mode | Data Processing | Backbone | Action Head | E2E | Frequency | E2E Speedup | +|--------|------|-----------------|----------|-------------|-----|-----------|-------------| +| **dGPU** | | | | | | | | +| H100 80GB HBM3 | PyTorch Eager | 6.2 ms | 31.3 ms | 48.2 ms | 85.8 ms | 11.7 Hz | 1.00x | +| | torch.compile | 6.2 ms | 30.4 ms | 12.0 ms | 48.6 ms | 20.6 Hz | 1.77x | +| | **TensorRT (Full Pipeline)** | **6.2 ms** | **8.8 ms** | **12.3 ms** | **27.9 ms** | **35.9 Hz** | **3.08x** | +| H20 96GB HBM3 | PyTorch Eager | 5.33 ms | 30.8 ms | 47.3 ms | 83.4 ms | 12.0 Hz | 1.00x | +| | torch.compile | 5.33 ms | 31.1 ms | 13.3 ms | 49.7 ms | 20.1 Hz | 1.68x | +| | **TensorRT (Full Pipeline)** | **5.33 ms** | **14.2 ms** | **14.5 ms** | **34.0 ms** | **29.4 Hz** | **2.45x** | +| RTX Pro 6000 Blackwell | PyTorch Eager | 4.8 ms | 29.3 ms | 44.0 ms | 78.4 ms | 12.8 Hz | 1.00x | +| | torch.compile | 4.8 ms | 29.4 ms | 16.5 ms | 50.7 ms | 19.7 Hz | 1.55x | +| | **TensorRT (Full Pipeline)** | **4.8 ms** | **9.9 ms** | **13.2 ms** | **27.9 ms** | **35.9 Hz** | **2.81x** | +| RTX Pro 5000 72GB | PyTorch Eager | 8.85 ms | 54.01 ms | 63.19 ms | 126.4 ms | 7.9 Hz | 1.00x | +| | torch.compile | 8.85 ms | 55.74 ms | 20.38 ms | 84.9 ms | 11.8 Hz | 1.49x | +| | **TensorRT (Full Pipeline)** | **8.85 ms** | **14.37 ms** | **17.33 ms** | **40.5 ms** | **24.7 Hz** | **3.13x** | +| L40 | PyTorch Eager | 6.6 ms | 42.8 ms | 78.9 ms | 128.3 ms | 7.8 Hz | 1.00x | +| | torch.compile | 6.6 ms | 42.7 ms | 19.8 ms | 69.0 ms | 14.5 Hz | 1.86x | +| | **TensorRT (Full Pipeline)** | **6.6 ms** | **13.1 ms** | **18.8 ms** | **38.4 ms** | **26.0 Hz** | **3.34x** | +| L20 | PyTorch Eager | 5.7 ms | 47.58 ms | 86.92 ms | 140.3 ms | 7.1 Hz | 1.00x | +| | torch.compile | 5.7 ms | 47.2 ms | 20.18 ms | 73.1 ms | 13.7 Hz | 1.92x | +| | **TensorRT (Full Pipeline)** | **5.7 ms** | **17.27 ms** | **19.79 ms** | **42.8 ms** | **23.3 Hz** | **3.28x** | +| **Jetson / Spark** | | | | | | | | +| DGX Spark | PyTorch Eager | 13.14 ms | 38.22 ms | 74.94 ms | 126.4 ms | 7.9 Hz | 1.00x | +| | torch.compile | 13.14 ms | 39.23 ms | 56.49 ms | 108.8 ms | 9.2 Hz | 1.16x | +| | **TensorRT (Full Pipeline)** | **13.14 ms** | **33.43 ms** | **52.37 ms** | **98.6 ms** | **10.1 Hz** | **1.28x** | +| AGX Thor | PyTorch Eager | 7.18 ms | 45.41 ms | 59.94 ms | 112.8 ms | 8.9 Hz | 1.00x | +| | torch.compile | 7.18 ms | 46.31 ms | 48.79 ms | 102.3 ms | 9.8 Hz | 1.10x | +| | **TensorRT (Full Pipeline)** | **7.18 ms** | **26.17 ms** | **46.93 ms** | **80.4 ms** | **12.4 Hz** | **1.40x** | +| Jetson Orin | PyTorch Eager | 9.03 ms | 134.39 ms | 210.41 ms | 354.0 ms | 2.8 Hz | 1.00x | +| | torch.compile | 9.03 ms | 135.68 ms | 82.24 ms | 227.1 ms | 4.4 Hz | 1.56x | +| | **TensorRT (Full Pipeline)** | **9.03 ms** | **63.62 ms** | **78.16 ms** | **150.9 ms** | **6.6 Hz** | **2.35x** | + +
+Raw benchmark output (H100 80GB HBM3) + +``` +Hardware: NVIDIA H100 80GB HBM3 +Model: checkpoints/GR00T-N1.7-LIBERO/libero_10 +1 camera, Denoising Steps: 4 + +PyTorch Eager: + E2E: 85.8 ms (11.7 Hz) + Data Processing: 6.2 ms | Backbone: 31.3 ms | Action Head: 48.2 ms + +torch.compile: + E2E: 48.6 ms (20.6 Hz), 1.77x speedup + Data Processing: 6.2 ms | Backbone: 30.4 ms | Action Head: 12.0 ms + +TensorRT (Full Pipeline): + E2E: 27.9 ms (35.9 Hz), 3.08x speedup + Data Processing: 6.2 ms | Backbone: 8.8 ms | Action Head: 12.3 ms +``` +
+ +### Standalone Inference with TRT + +The standalone inference script serves as both an accuracy validation and a reference for deploying TRT inference in your own code. It runs per-step inference on real trajectories and compares action predictions: ```bash -python scripts/deployment/standalone_inference_script.py \ - --model-path nvidia/GR00T-N1.6-3B \ - --dataset-path /path/to/dataset \ - --embodiment-tag GR1 \ - --traj-ids 0 1 2 \ - --inference-mode tensorrt \ - --trt-engine-path ./groot_n1d6_onnx/dit_model_bf16.trt \ - --action-horizon 8 +uv run python scripts/deployment/standalone_inference_script.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA \ + --traj-ids 0 1 2 3 4 \ + --inference-mode trt_full_pipeline \ + --trt-engine-path ./gr00t_trt_deployment/engines \ + --save-plot-path ./output/trt_inference.png ``` ---- +Expected accuracy: MSE/MAE match PyTorch within noise. TRT produces identical action quality. Speedup varies by platform — run `build_trt_pipeline.py --steps benchmark` on your hardware for exact numbers. -## Command-Line Arguments +### Optional: LIBERO Closed-Loop Sim Evaluation -### `standalone_inference_script.py` +To validate TRT accuracy in end-to-end robotic tasks, run the LIBERO closed-loop evaluation. This requires a separate environment setup (~10-30 min, MuJoCo simulator + dependencies). -| Argument | Default | Description | -|----------|---------|-------------| -| `--model-path` | (required) | Path to model checkpoint | -| `--dataset-path` | (required) | Path to LeRobot dataset | -| `--embodiment-tag` | `GR1` | Embodiment tag | -| `--traj-ids` | `[0]` | List of trajectory IDs to evaluate | -| `--steps` | `200` | Max steps per trajectory | -| `--action-horizon` | `16` | Action horizon for inference | -| `--inference-mode` | `pytorch` | `pytorch` or `tensorrt` | -| `--trt-engine-path` | `./groot_n1d6_onnx/dit_model_bf16.trt` | TensorRT engine path | -| `--denoising-steps` | `4` | Number of denoising steps | -| `--skip-timing-steps` | `1` | Steps to skip for timing (warmup) | -| `--seed` | `42` | Random seed for reproducibility | -| `--video-backend` | `torchcodec` | Video backend (`decord`, `torchvision_av`, `torchcodec`) | +
+Setup, commands, and results (H100, 20 episodes) -### `export_onnx_n1d6.py` +Task: `KITCHEN_SCENE3_turn_on_the_stove_and_put_the_moka_pot_on_it`, 20 episodes: -| Argument | Default | Description | -|----------|---------|-------------| -| `--model-path` | (required) | Path to model checkpoint | -| `--dataset-path` | (required) | Path to dataset (for input shape capture) | -| `--embodiment-tag` | `GR1` | Embodiment tag | -| `--output-dir` | `./groot_n1d6_onnx` | Output directory for ONNX model | -| `--video-backend` | `torchcodec` | Video backend | +| Mode | Success Rate | +|------|-------------| +| PyTorch | 100% (20/20) | +| TRT (n17_full_pipeline) | 95% (19/20) | -### `build_tensorrt_engine.py` +Difference is within simulation noise (p >> 0.05). -| Argument | Default | Description | -|----------|---------|-------------| -| `--onnx` | (required) | Path to ONNX model | -| `--engine` | (required) | Path to save TensorRT engine | -| `--precision` | `bf16` | Precision (`fp32`, `fp16`, `bf16`, `fp8`) | -| `--workspace` | `8192` | Workspace size in MB | +> **Note:** Use `--n-envs 1` for TRT evaluation (ViT engine has static shapes for single-observation inference). -### `benchmark_inference.py` +```bash +# One-time LIBERO setup (~10 min) +bash gr00t/eval/sim/LIBERO/setup_libero.sh + +# Activate LIBERO venv and install additional deps +source gr00t/eval/sim/LIBERO/libero_uv/.venv/bin/activate +uv pip install diffusers transformers accelerate safetensors torchcodec + +# TRT full pipeline evaluation +python gr00t/eval/rollout_policy.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --env-name "libero_sim/KITCHEN_SCENE3_turn_on_the_stove_and_put_the_moka_pot_on_it" \ + --n-episodes 20 --n-envs 1 --max-episode-steps 504 \ + --trt-engine-path ./gr00t_trt_deployment/engines \ + --trt-mode n17_full_pipeline +``` +
-| Argument | Default | Description | -|----------|---------|-------------| -| `--model-path` | `nvidia/GR00T-N1.6-3B` | Path to model checkpoint | -| `--dataset-path` | `demo_data/gr1.PickNPlace` | Path to dataset | -| `--embodiment-tag` | `GR1` | Embodiment tag | -| `--trt-engine-path` | (optional) | Path to TensorRT engine | -| `--num-iterations` | `20` | Number of benchmark iterations | -| `--warmup` | `5` | Number of warmup iterations | -| `--skip-compile` | `false` | Skip torch.compile benchmark | -| `--seed` | `42` | Random seed for reproducibility | +> Run `python scripts/deployment/build_trt_pipeline.py --steps benchmark` to generate benchmarks for your hardware. --- -## Benchmarks - -### Component-wise Breakdown - -> **Note:** The backbone (Vision Encoder + Language Model) timing is the same across all modes (Eager, torch.compile, TensorRT). Only the **Action Head (DiT)** is optimized with torch.compile or TensorRT, which is why you see significant speedups in the Action Head column while the Backbone column remains constant. - -GR00T-N1.6-3B inference timing (4 denoising steps): - -| Device | Mode | Data Processing | Backbone | Action Head | E2E | Frequency | -|--------|------|-----------------|----------|-------------|-----|-----------| -| RTX 5090 | PyTorch Eager | 2 ms | 18 ms | 38 ms | 58 ms | 17.3 Hz | -| RTX 5090 | torch.compile | 2 ms | 18 ms | 16 ms | 37 ms | 27.3 Hz | -| RTX 5090 | TensorRT | 2 ms | 18 ms | 11 ms | 31 ms | 32.1 Hz | -| H100 | PyTorch Eager | 4 ms | 23 ms | 49 ms | 77 ms | 13.0 Hz | -| H100 | torch.compile | 4 ms | 23 ms | 11 ms | 38 ms | 26.3 Hz | -| H100 | TensorRT | 4 ms | 22 ms | 10 ms | 36 ms | 27.9 Hz | -| RTX 4090 | PyTorch Eager | 2 ms | 25 ms | 55 ms | 82 ms | 12.2 Hz | -| RTX 4090 | torch.compile | 2 ms | 25 ms | 17 ms | 44 ms | 22.8 Hz | -| RTX 4090 | TensorRT | 2 ms | 24 ms | 16 ms | 43 ms | 23.3 Hz | -| Thor | PyTorch Eager | 5 ms | 38 ms | 74 ms | 117 ms | 8.6 Hz | -| Thor | torch.compile | 5 ms | 39 ms | 61 ms | 105 ms | 9.5 Hz | -| Thor | TensorRT | 5 ms | 38 ms | 49 ms | 92 ms | 10.9 Hz | -| Orin | PyTorch Eager | 6 ms | 93 ms | 202 ms | 300 ms | 3.3 Hz | -| Orin | torch.compile | 6 ms | 93 ms | 101 ms | 199 ms | 5.0 Hz | -| Orin | TensorRT | 6 ms | 95 ms | 72 ms | 173 ms | 5.8 Hz | - - -### Speedup vs PyTorch Eager - -| Device | Mode | E2E Speedup | Action Head Speedup | -|--------|------|-------------|---------------------| -| RTX 5090 | PyTorch Eager | 1.00x | 1.00x | -| RTX 5090 | torch.compile | 1.58x | 2.32x | -| RTX 5090 | TensorRT | 1.86x | 3.59x | -| H100 | PyTorch Eager | 1.00x | 1.00x | -| H100 | torch.compile | 2.02x | 4.60x | -| H100 | TensorRT | 2.14x | 4.80x | -| RTX 4090 | PyTorch Eager | 1.00x | 1.00x | -| RTX 4090 | torch.compile | 1.87x | 3.26x | -| RTX 4090 | TensorRT | 1.92x | 3.48x | -| Thor | PyTorch Eager | 1.00x | 1.00x | -| Thor | torch.compile | 1.11x | 1.20x | -| Thor | TensorRT | 1.27x | 1.49x | -| Orin | PyTorch Eager | 1.00x | 1.00x | -| Orin | torch.compile | 1.50x | 2.00x | -| Orin | TensorRT | 1.73x | 2.80x | - -> Run `python scripts/deployment/benchmark_inference.py` to generate benchmarks for your hardware. -> See `GR00T_inference_timing.ipynb` for detailed analysis and visualizations. - -> Experiments on Thor and Orin used different dependency stacks. Thor with CUDA 13, PyTorch 2.9, using supporting packages sourced from the [Jetson AI Lab cu130 index](https://pypi.jetson-ai-lab.io/sbsa/cu130); and Orin with CUDA 12.6, PyTorch 2.8, using supporting packages sourced from the [Jetson AI Lab cu126 index](https://pypi.jetson-ai-lab.io/jp6/cu126). +## Platform-Specific Setup + +> Jetson and Spark platforms use different dependency stacks than dGPU. Thor and Orin use JetPack 7.2 / CUDA 13.2 with PyTorch 2.13.0 from the [PyTorch cu132 index](https://download.pytorch.org/whl/cu132). Spark uses CUDA 13.0 with PyTorch 2.10.0 from the [Jetson AI Lab cu130 index](https://pypi.jetson-ai-lab.io/sbsa/cu130). + +> ⚠️ **aarch64 users (Spark / Thor / Orin):** After running `install_deps.sh`, always +> activate the venv with `source .venv/bin/activate && source scripts/activate_.sh` +> (`activate_spark.sh`, `activate_thor.sh`, or `activate_orin.sh`) and run the example +> commands with **plain `python`** / `torchrun`, not `uv run python` / `uv run torchrun` — +> the latter re-syncs against the root `pyproject.toml` (x86_64 Python 3.12) and destroys +> the platform-specific environment. This applies to every platform below; see also the +> [aarch64 note in the main README](../../README.md#set-up-the-environment). + +### Shared Docker Workflow + +The Docker steps below are identical across Thor, Spark, and Orin except the image tag +(`gr00t-thor`, `gr00t-spark`, or `gr00t-orin`). Each platform section builds its image, then +reuses these steps: + +1. **Download the model** once on the host — see [Download Model and Dataset](#download-model-and-dataset). +2. **Start an interactive session** (replace `` with `thor`, `spark`, or `orin`): + +```bash +docker run -it --rm --runtime nvidia --gpus all \ + --ipc=host \ + --ulimit memlock=-1 \ + --ulimit stack=67108864 \ + --network host \ + -v "$(pwd)":/workspace/repo \ + -v "${HF_HOME:-${HOME}/.cache/huggingface}":/root/.cache/huggingface \ + -w /workspace/repo \ + -e HF_TOKEN="${HF_TOKEN:-}" \ + gr00t- \ + bash +``` + +Then run the platform's TRT pipeline command inside the container (shown per platform below). + +### Jetson Thor Setup + +Thor uses JetPack 7.2 / Jetson Linux 39.2, CUDA 13.2, Python 3.12, and +PyTorch 2.13.0 from the PyTorch cu132 index. Older JetPack releases are no +longer supported. Thor and Orin share one CUDA 13.2 / PyTorch 2.13.0 +`flash-attn` wheel containing both `sm_87` and `sm_110` kernels. The installer +builds it when a local or cached wheel is unavailable. +There are two ways to run on Thor: Docker (recommended) or bare metal. + +
+Docker (Recommended) + +Build the Thor container from the repo root: + +```bash +cd docker && bash build.sh --profile=thor && cd .. +``` + +Then follow the [Shared Docker Workflow](#shared-docker-workflow) (image `gr00t-thor`) to download the model and start the container. Inside the container, run the full TRT pipeline (export, build, verify, benchmark): + +```bash +python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA +``` +
+ +
+Bare Metal + +```bash +# One-time install (validates JetPack 7.x/R39, installs FFmpeg, uv, CUDA 13.2 +# dev packages when needed, Python deps, and a source-built flash-attn wheel) +bash scripts/deployment/thor/install_deps.sh + +# In each new shell +source .venv/bin/activate +source scripts/activate_thor.sh +``` + +Then run the TRT pipeline or PyTorch inference as shown in the [TensorRT Acceleration](#tensorrt-acceleration) and [Quick Start](#quick-start-pytorch-inference) sections above. +The activation script exports the PyTorch and CUDA library/include paths that `torchcodec` +and `torch.compile` need on Thor. +If you later run `uv sync`, rerun the Thor installer to restore the locally built wheel. +
+ --- -## Troubleshooting +### DGX Spark Setup -### Engine Build Fails +Spark uses CUDA 13 and Python 3.12 like Thor, but requires a dedicated dependency stack and +source-built `flash-attn` for `sm121`. There are two ways to run on Spark: Docker (recommended) +or bare metal. -- Ensure you have enough GPU memory (8GB+ recommended) -- Try reducing workspace size: `--workspace 4096` -- Ensure TensorRT version matches your CUDA version +
+Docker (Recommended) -### ONNX Export Issues +Build the Spark container from the repo root: -- If export fails, ensure the model loads correctly in PyTorch first -- Check that the dataset path is valid and contains at least one trajectory +```bash +cd docker && bash build.sh --profile=spark && cd .. +``` + +Then follow the [Shared Docker Workflow](#shared-docker-workflow) (image `gr00t-spark`) to download the model and start the container. Inside the container, run the full TRT pipeline (export, build, verify, benchmark): + +```bash +python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA +``` +
+ +
+Bare Metal + +```bash +# One-time install (installs NVPL libs, uv, Python deps, source-builds flash-attn for sm121, and builds +# torchcodec from source against the system FFmpeg runtime) +bash scripts/deployment/spark/install_deps.sh + +# In each new shell +source .venv/bin/activate +source scripts/activate_spark.sh +``` + +Then run the TRT pipeline or PyTorch inference as shown in the [TensorRT Acceleration](#tensorrt-acceleration) and [Quick Start](#quick-start-pytorch-inference) sections above. +If you later rerun `uv sync`, rerun `bash scripts/deployment/spark/install_deps.sh` so the +Spark-specific `flash-attn` build is restored and revalidated. +
--- -## Architecture +### Jetson Orin Setup + +Orin uses JetPack 7.2 / Jetson Linux 39.2, CUDA 13.2, Python 3.12, and PyTorch 2.13.0 from the PyTorch cu132 index. JetPack 6.x / Jetson Linux R36 is no longer supported. Orin and Thor share one CUDA 13.2 / PyTorch 2.13.0 `flash-attn` wheel containing both `sm_87` and `sm_110` kernels; the installer builds it when a local or cached wheel is unavailable. +There are two ways to run on Orin: Docker (recommended) or bare metal. + +
+Docker (Recommended) +Build the Orin container from the repo root: + +```bash +cd docker && bash build.sh --profile=orin && cd .. +``` + +Then follow the [Shared Docker Workflow](#shared-docker-workflow) (image `gr00t-orin`) to download the model and start the container. Inside the container, run the full TRT pipeline (export, build, verify, benchmark): + +```bash +python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA ``` -┌─────────────────────────────────────────────────────────────┐ -│ GR00T Policy │ -│ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐ │ -│ │ Vision Encoder│ │Language Model │ │ Action Head │ │ -│ │(Cosmos-Reason)│──│(Cosmos-Reason)│──│ (DiT) │ │ -│ └───────────────┘ └───────────────┘ └─────────────────┘ │ -│ ▲ │ -│ │ │ -│ ┌─────────┴─────────┐ │ -│ │ TensorRT Engine │ │ -│ │ (dit_model.trt) │ │ -│ └───────────────────┘ │ -└─────────────────────────────────────────────────────────────┘ +
+ +
+Bare Metal + +```bash +# One-time install (validates JetPack 7.x/R39, installs FFmpeg, uv, CUDA 13.2 +# dev packages when needed, Python deps, and a source-built flash-attn wheel) +bash scripts/deployment/orin/install_deps.sh + +# In each new shell +source .venv/bin/activate +source scripts/activate_orin.sh ``` -The TensorRT optimization targets the **DiT (Diffusion Transformer)** component of the action head, which is the main computational bottleneck during inference. +Then run the TRT pipeline or PyTorch inference as shown in the [TensorRT Acceleration](#tensorrt-acceleration) and [Quick Start](#quick-start-pytorch-inference) sections above. +The activation script exports the PyTorch and CUDA library/include paths that `torchcodec` +and `torch.compile` need on Orin. +If you later run `uv sync`, rerun the Orin installer to restore the locally built wheel. +
+ +> **Orin storage tip:** If your eMMC root is low on space, redirect the HuggingFace cache to an NVMe SSD with `export HF_HOME=/path/to/ssd/.cache/huggingface` before downloading models. --- +## Command-Line Arguments + +### `build_trt_pipeline.py` + +| Argument | Default | Description | +|----------|---------|-------------| +| `--model-path` | (required) | Path to model checkpoint | +| `--dataset-path` | `demo_data/libero_demo` | Path to dataset (LeRobot format) | +| `--embodiment-tag` | Auto-detected | Embodiment tag (auto-detected from processor_config.json if single embodiment) | +| `--output-dir` | `./gr00t_trt_deployment` | Root output directory. ONNX → `/onnx/`, engines → `/engines/` | +| `--precision` | `bf16` | Precision for ONNX export and TRT engine build (`bf16` only) | +| `--batch-size` | `1` | Batch size baked into exported ONNX/TRT models (static — see note below) | +| `--export-mode` | `full_pipeline` | Export mode: `dit_only`, `action_head`, or `full_pipeline` | +| `--workspace` | `8192` | TRT builder workspace size in MB | +| `--num-iterations` | `20` | Number of benchmark iterations | +| `--warmup` | `5` | Number of warmup iterations | +| `--skip-compile` | `false` | Skip torch.compile benchmark | +| `--steps` | `all` | Steps to run: `all` or comma-separated subset of `export,build,verify,benchmark` | +| `--log-file` | `/pipeline.log` | Log file path | + +### `standalone_inference_script.py` + +| Argument | Default | Description | +|----------|---------|-------------| +| `--model-path` | (required) | Path to model checkpoint | +| `--dataset-path` | `demo_data/droid_sample` | Path to dataset (LeRobot format) | +| `--embodiment-tag` | `OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT` | Robot embodiment tag | +| `--traj-ids` | `[0]` | Episode indices to evaluate (space-separated) | +| `--steps` | `200` | Max steps per trajectory (capped by actual length) | +| `--execution-horizon` | `16` | Steps of each predicted chunk to execute per inference (old `--action-horizon` deprecated) | +| `--inference-mode` | `pytorch` | `pytorch`, `tensorrt` (DiT-only TRT), or `trt_full_pipeline` (all engines) | +| `--trt-engine-path` | `./gr00t_trt_deployment/engines` | Directory containing pre-built TRT engines (matches `build_trt_pipeline.py` output) | +| `--denoising-steps` | `4` | Diffusion denoising iterations | +| `--save-plot-path` | `None` | Save per-trajectory GT-vs-predicted comparison plots | +| `--skip-timing-steps` | `1` | Initial steps excluded from timing stats (warmup) | +| `--host` / `--port` | `127.0.0.1` / `5555` | Server address (when using client mode without `--model-path`) | +| `--seed` | `42` | Random seed for reproducibility | + ## Files | File | Description | |------|-------------| -| `standalone_inference_script.py` | Main inference script (PyTorch + TensorRT) | -| `export_onnx_n1d6.py` | Export DiT model to ONNX format | -| `build_tensorrt_engine.py` | Build TensorRT engine from ONNX | -| `benchmark_inference.py` | Benchmark data processing, backbone, action head, and E2E timing | -| `GR00T_inference_timing.ipynb` | Inference timing analysis notebook with visualizations | +| `build_trt_pipeline.py` | Unified pipeline: export ONNX, build engines, verify, benchmark | +| `standalone_inference_script.py` | Main inference script (PyTorch + DiT-only or full-pipeline TensorRT) | +| `trt_torch.py` | TRT Engine wrapper class (load, bind, execute) | +| `trt_model_forward.py` | TRT forward functions and setup (backbone + action head) | + +--- + +## Troubleshooting + +### Engine Build Fails + +- Ensure you have enough GPU memory (16GB+ recommended for full pipeline) +- Try reducing workspace size: `--workspace 4096` +- Ensure TensorRT version matches your CUDA version +- LLM engine requires `batch_size` dimension handling when using custom shape profiles + +### ONNX Export Issues + +- If export fails with COMPLEX128 error: ensure `_simple_causal_mask` is used (not HuggingFace's `create_causal_mask`) +- If `masked_scatter` size assertion fails: ensure `visual_pos_masks` has the correct number of True values matching deepstack tensor size +- Check that the dataset path is valid and contains at least one trajectory + +### Accuracy Issues + +- If cosine < 0.99: check that LLM export does NOT include the final RMSNorm (backbone returns pre-norm `hidden_states[-1]`) +- If output magnitude is ~12x too small: this is the norm bug — see above +- Run `build_trt_pipeline.py --steps verify --export-mode action_head` first to isolate backbone vs action head drift diff --git a/scripts/deployment/__init__.py b/scripts/deployment/__init__.py index e69de29bb..467079831 100644 --- a/scripts/deployment/__init__.py +++ b/scripts/deployment/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/scripts/deployment/_trt_contract.py b/scripts/deployment/_trt_contract.py new file mode 100644 index 000000000..101d6d49c --- /dev/null +++ b/scripts/deployment/_trt_contract.py @@ -0,0 +1,362 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Single source of truth for the TRT engine's ``action_horizon`` and +``batch_size``, read back from ``export_metadata.json``. + +When a model is exported to ONNX/TensorRT, two numbers are baked into the +engine and recorded in ``export_metadata.json`` next to it: + +* ``action_horizon`` — the predicted action-chunk length. It also determines + the engine's static ``sa_seq_len`` (``1 + action_horizon``). +* ``batch_size`` — baked as a *static* shape (the exporter registers only the + sequence dim in ``dynamic_axes``), so the engine only accepts that exact + batch at runtime. + +The same two numbers are then re-stated independently elsewhere: in the +loaded model's config, in the ``--batch-size`` flag of the verify / benchmark +scripts, and in the ``--action-horizon`` open-loop stride of the standalone +inference script. When any copy drifts from the engine, the failure is silent +or cryptic — a foreign or stale ``.engine`` dropped into the bundle, or a +typo'd ``--batch-size``, surfaces only as a generic ``Invalid input shape`` +raised deep inside the engine's ``forward()``, naming neither the engine's +baked value nor the user's flag. + +The helpers here read the baked values back from ``export_metadata.json`` and +validate each re-stated copy against them up-front, with error messages that +name both sides. If the metadata file is missing (older bundles) the checks +degrade to a warning rather than failing. +""" + +from __future__ import annotations + +import json +import logging +import os +from typing import Any + + +logger = logging.getLogger(__name__) + +_METADATA_FILENAME = "export_metadata.json" + +# Bumped when export_metadata.json changes incompatibly (a key the build/runtime +# readers depend on is renamed, removed, or repurposed). The exporter stamps +# this; the build reader rejects a bundle whose version it does not recognize. +EXPORT_METADATA_SCHEMA_VERSION = 1 + +# Keys the build reader (build_tensorrt_engine.build_full_pipeline) needs to size +# the TRT shape profiles, plus the values the runtime contract re-checks. A bundle +# missing any of these cannot be built without guessing a sequence/patch shape. +# ``schema_version`` is intentionally not here: the version gate in +# validate_export_metadata handles its absence before the missing-keys check runs. +REQUIRED_EXPORT_METADATA_KEYS = ( + "sa_seq_len", + "vl_seq_len", + "llm_seq_len", + "num_patches", + "num_merged_patches", + "num_vis_tokens", + "action_horizon", + "batch_size", + "precision", +) + + +def validate_export_metadata( + metadata: dict[str, Any], + *, + source: str = "export metadata", + engine_path: str = "", +) -> None: + """Raise unless ``metadata`` is a current-schema, build-ready bundle. + + Checks ``schema_version`` equals :data:`EXPORT_METADATA_SCHEMA_VERSION` and + every :data:`REQUIRED_EXPORT_METADATA_KEYS` entry is present, so a stale + bundle or a renamed/dropped field fails here — naming the cause — instead of + silently defaulting to a wrong sequence/patch hint deep in the TRT build. The + message states the problem; the caller decides the remedy. + """ + where = f" at {engine_path}" if engine_path else "" + version = metadata.get("schema_version") + if version != EXPORT_METADATA_SCHEMA_VERSION: + raise ValueError( + f"{source}: {_METADATA_FILENAME}{where} has schema_version={version!r}, but " + f"this build expects {EXPORT_METADATA_SCHEMA_VERSION}" + ) + missing = [k for k in REQUIRED_EXPORT_METADATA_KEYS if k not in metadata] + if missing: + raise ValueError( + f"{source}: {_METADATA_FILENAME}{where} is missing required key(s) {missing}" + ) + + +def _candidate_metadata_paths(engine_path: str) -> list[str]: + """Locations to look for ``export_metadata.json`` given an engine path. + + ``engine_path`` may be an engine directory or a single ``.engine`` file + (dit_only mode). The metadata is written by ``export_onnx_n1d7`` into the + ONNX output dir and copied next to the engines by ``build_trt_pipeline``, + so we also check a sibling ``onnx/`` dir for un-copied legacy layouts. + """ + base = engine_path + if os.path.isfile(engine_path) or engine_path.endswith(".engine"): + base = os.path.dirname(engine_path) + candidates = [ + os.path.join(base, _METADATA_FILENAME), + os.path.join(os.path.dirname(base.rstrip("/")), "onnx", _METADATA_FILENAME), + ] + return candidates + + +def load_export_metadata(engine_path: str) -> dict[str, Any] | None: + """Return the export metadata for an engine bundle, or ``None`` if absent. + + A missing *or unreadable* (corrupt JSON / IO error) metadata file returns + ``None`` so callers can degrade to a warning uniformly rather than crashing + on a malformed file. + """ + for path in _candidate_metadata_paths(engine_path): + if os.path.exists(path): + try: + with open(path) as f: + return json.load(f) + except (json.JSONDecodeError, OSError) as e: + logger.warning( + "Failed to read export metadata %s (%s); treating as absent.", + path, + e, + ) + return None + return None + + +def _policy_action_horizon(policy: Any) -> int | None: + """Best-effort read of the loaded policy's action horizon.""" + action_head = getattr(getattr(policy, "model", None), "action_head", None) + if action_head is None: + return None + cfg = getattr(action_head, "config", None) + if cfg is not None and getattr(cfg, "action_horizon", None) is not None: + return int(cfg.action_horizon) + if getattr(action_head, "action_horizon", None) is not None: + return int(action_head.action_horizon) + return None + + +def assert_engine_matches_policy( + policy: Any, + engine_path: str, + *, + source: str = "setup_tensorrt_engines", +) -> dict[str, Any] | None: + """Validate that an engine bundle was built for the loaded policy. + + Compares the engine's recorded ``action_horizon`` (and the derived + ``sa_seq_len == 1 + action_horizon``) against the loaded policy's action + head. A mismatch — e.g. a foreign or stale ``.engine`` dropped into the + bundle — raises here, naming both values, instead of surfacing as a + generic ``Invalid input shape`` deep inside ``Engine.forward()``. + + When ``export_metadata.json`` is absent the contract cannot be checked; we + log a warning and return ``None`` rather than failing (older bundles). + """ + metadata = load_export_metadata(engine_path) + if metadata is None: + logger.warning( + "%s: no %s found next to %s; cannot validate that the engine's " + "action_horizon / batch_size match the loaded policy. A " + "mismatched engine will fail later as a cryptic 'Invalid input " + "shape' inside Engine.forward().", + source, + _METADATA_FILENAME, + engine_path, + ) + return None + + engine_ah = metadata.get("action_horizon") + engine_sa = metadata.get("sa_seq_len") + if engine_ah is not None and engine_sa is not None and engine_sa != engine_ah + 1: + raise ValueError( + f"{source}: corrupt {_METADATA_FILENAME} for {engine_path}: " + f"sa_seq_len={engine_sa} but action_horizon={engine_ah} " + f"(expected sa_seq_len == 1 + action_horizon == {engine_ah + 1})." + ) + + policy_ah = _policy_action_horizon(policy) + if engine_ah is not None and policy_ah is not None and engine_ah != policy_ah: + sa_note = f" (baked into sa_seq_len={engine_sa})" if engine_sa is not None else "" + raise ValueError( + f"{source}: TRT engine bundle at {engine_path} was built for " + f"action_horizon={engine_ah}{sa_note}, but the loaded policy has " + f"action_horizon={policy_ah}. The engine and policy disagree on " + "chunk size; re-export/rebuild the engines for this model, or load " + "the model the engines were built from." + ) + return metadata + + +def assert_engine_bundle_present( + engine_path: str, + required_files, + *, + mode: str = "n17_full_pipeline", + source: str = "setup_tensorrt_engines", +) -> None: + """Fail fast, with build instructions, when a TRT engine bundle is missing. + + ``setup_tensorrt_engines`` swaps in several ``.engine`` files that have no + PyTorch fallback (the action head's state/action encoders, the DiT, and the + action decoder). If the ``--trt-engine-path`` directory does not exist, or + exists but is missing one of those files, the loader would otherwise die with + a bare ``FileNotFoundError`` deep inside ``Engine.load`` — giving the user no + hint that they simply have not built the engines yet. Raise an actionable + error here instead, naming the missing directory / files and the build step. + """ + build_hint = ( + "Build the engines first, e.g.:\n" + " python scripts/deployment/build_trt_pipeline.py \\\n" + " --model-path --dataset-path \\\n" + " --embodiment-tag --output-dir ./gr00t_trt_deployment\n" + "then pass --trt-engine-path ./gr00t_trt_deployment/engines " + "(see scripts/deployment/ for the full deployment guide)." + ) + if not os.path.isdir(engine_path): + raise FileNotFoundError( + f"{source}: inference-mode '{mode}' needs a TensorRT engine " + f"directory, but none exists at {engine_path!r}.\n{build_hint}" + ) + missing = [f for f in required_files if not os.path.exists(os.path.join(engine_path, f))] + if missing: + raise FileNotFoundError( + f"{source}: inference-mode '{mode}' requires these TensorRT engine " + f"file(s) in {engine_path!r}, which are missing: " + f"{', '.join(sorted(missing))}.\n{build_hint}" + ) + + +def resolve_batch_size( + engine_path: str, + requested: int | None = None, + *, + source: str = "TRT runtime", +) -> int: + """Resolve the runtime batch size against the engine's build-time batch. + + ``export_onnx_n1d7`` bakes the batch dim as a static shape (only + ``seq_len`` is in ``dynamic_axes``), so the engine only accepts the exact + batch it was built at. This reads that value from ``export_metadata.json`` + and validates the requested batch against it: + + - ``requested is None`` -> return the engine's build batch. + - ``requested != build batch`` -> raise, naming both (a typo'd + ``--batch-size`` otherwise fails as a cryptic ``Invalid input shape``). + """ + metadata = load_export_metadata(engine_path) + built = metadata.get("batch_size") if metadata else None + + if requested is None: + if built is None: + return 1 + return int(built) + + if built is not None and int(requested) != int(built): + raise ValueError( + f"{source}: requested batch_size={requested} but the TRT engine at " + f"{engine_path} was built (statically) for batch_size={built}. " + "The export pipeline does not register the batch dim in " + "dynamic_axes, so the engine only accepts its build batch. Pass " + f"--batch-size {built}, or rebuild the engines at batch_size=" + f"{requested}." + ) + return int(requested) + + +def assert_grid_thw_matches( + baked_grid: Any, + runtime_grid_thw: Any, + *, + source: str = "ViT TRT forward", +) -> None: + """Validate a runtime ``image_grid_thw`` against the ViT engine's baked grid. + + The ViT export pre-computes position/rotary embeddings for the captured + ``grid_thw`` and freezes them as buffers; the engine's only input is + ``pixel_values``. Those buffers depend on each view's ``[t, h, w]`` + *layout*, not on how many views are present: batching tiles the same + per-view grid, so the runtime view count scales with batch size while the + layouts stay fixed (and a real total-shape mismatch is already rejected by + the static ``pixel_values`` shape). So we require every runtime view's + layout to be one the engine baked; a view with an unbaked layout (e.g. H/W + swapped, different resolution or temporal span) would get the wrong + embeddings and is rejected, while a different view *count* (batch) is fine. + + ``baked_grid`` is ``None`` for engine bundles built before ``vit_grid_thw`` + was recorded; skip the check then (degrade like a missing metadata file). + """ + if baked_grid is None: + return + rt = runtime_grid_thw + if hasattr(rt, "detach"): + rt = rt.detach().cpu() + if hasattr(rt, "tolist"): + rt = rt.tolist() + rt_rows = [tuple(int(x) for x in row) for row in rt] + baked_layouts = {tuple(int(x) for x in row) for row in baked_grid} + unbaked = sorted({row for row in rt_rows if row not in baked_layouts}) + if unbaked: + raise ValueError( + f"{source}: ViT TRT engine baked position/rotary buffers for " + f"image_grid_thw layouts {sorted(baked_layouts)}, but this observation " + f"has view layout(s) {[list(r) for r in unbaked]} that were never baked. " + f"The engine ignores runtime grid_thw (pixel_values is its only input) " + f"and would silently produce wrong vision features. Re-export/rebuild " + f"the ViT engine for this image configuration, or run with a baked layout." + ) + + +def assert_exec_horizon_within_model( + *, + exec_horizon: int, + model_action_horizon: int, + source: str = "inference", +) -> None: + """Validate an open-loop execution stride against the model's chunk size. + + ``standalone_inference_script --execution-horizon`` is the number of actions + consumed per predicted chunk; it must not exceed the model's + ``action_horizon`` (the predicted chunk length), otherwise indexing the + chunk by ``range(exec_horizon)`` runs past the end. + """ + if not (1 <= exec_horizon <= model_action_horizon): + raise ValueError( + f"{source}: --execution-horizon={exec_horizon} must satisfy " + f"1 <= execution_horizon <= model action_horizon={model_action_horizon} " + "(= the predicted chunk length). A larger stride indexes past the " + "predicted action chunk." + ) + + +__all__ = [ + "EXPORT_METADATA_SCHEMA_VERSION", + "REQUIRED_EXPORT_METADATA_KEYS", + "validate_export_metadata", + "load_export_metadata", + "assert_engine_matches_policy", + "assert_engine_bundle_present", + "resolve_batch_size", + "assert_grid_thw_matches", + "assert_exec_horizon_within_model", +] diff --git a/scripts/deployment/benchmark_inference.py b/scripts/deployment/benchmark_inference.py index 8560651b7..fd7d9df2f 100644 --- a/scripts/deployment/benchmark_inference.py +++ b/scripts/deployment/benchmark_inference.py @@ -1,27 +1,57 @@ #!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """ Benchmark script for GR00T inference timing. Measures component-wise timing for: - Data Processing: VLAStepData preparation and collation -- Backbone (VLM): Eagle VLM forward pass +- Backbone (VLM): Qwen3-VL forward pass - Action Head (DiT): Flow-matching diffusion model - E2E: Full end-to-end inference -Supports three inference modes: +Supports five inference modes: 1. PyTorch Eager: Standard PyTorch execution 2. torch.compile: PyTorch 2.0+ JIT compilation with max-autotune -3. TensorRT: Optimized DiT action head using TensorRT engine +3. TensorRT (DiT-only): Optimized DiT action head using TensorRT engine +4. TensorRT (Full Pipeline): All 6 components in TRT (ViT + LLM + Action Head) +5. TensorRT (vit_llm_only): ViT + LLM in TRT, action head in PyTorch (use on Spark/sm121) Usage: + # Basic benchmark (Eager + torch.compile) + python scripts/deployment/benchmark_inference.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 + + # With DiT-only TRT + python scripts/deployment/benchmark_inference.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --trt-engine-path ./gr00t_trt_deployment/engines/dit_bf16.engine + + # With full-pipeline TRT (6 engines) python scripts/deployment/benchmark_inference.py \ - --model_path nvidia/GR00T-N1.6-3B \ - --dataset_path /path/to/dataset \ - --trt_engine_path ./groot_n1d6_onnx/dit_model_bf16.trt + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --trt-engine-path ./gr00t_trt_deployment/engines \ + --trt-mode n17_full_pipeline """ -import argparse +from dataclasses import dataclass +import gc import os +import sys import time import gr00t @@ -29,9 +59,18 @@ from gr00t.data.dataset.sharded_single_step_dataset import extract_step_data from gr00t.data.embodiment_tags import EmbodimentTag from gr00t.data.types import MessageType, VLAStepData +from gr00t.deployment.modes import BenchmarkMode from gr00t.policy.gr00t_policy import Gr00tPolicy import numpy as np import torch +import tyro + + +# Ensure scripts/deployment/ is on sys.path for sibling module imports +_DEPLOY_DIR = os.path.dirname(os.path.abspath(__file__)) +if _DEPLOY_DIR not in sys.path: + sys.path.insert(0, _DEPLOY_DIR) +from _trt_contract import resolve_batch_size # noqa: E402 def set_seed(seed: int = 42): @@ -261,7 +300,7 @@ def print_markdown_table(results, device_name, denoising_steps): print("\n" + "=" * 100) print("MARKDOWN TABLE (copy/paste into README)") print("=" * 100) - print(f"\nGR00T-N1.6-3B Inference Timing ({denoising_steps} denoising steps):\n") + print(f"\nGR00T N1.7 Inference Timing ({denoising_steps} denoising steps):\n") # Component breakdown table (using median for robustness against outliers) print("### Component-wise Breakdown\n") @@ -297,46 +336,59 @@ def print_markdown_table(results, device_name, denoising_steps): print("\n" + "=" * 100) -def main(): - parser = argparse.ArgumentParser(description="Benchmark GR00T inference timing") - parser.add_argument("--model_path", type=str, default="nvidia/GR00T-N1.6-3B") - parser.add_argument( - "--dataset_path", - type=str, - default=None, - help="Path to dataset. Defaults to demo_data/gr1.PickNPlace", - ) - parser.add_argument("--embodiment_tag", type=str, default="gr1") - parser.add_argument( - "--trt_engine_path", - type=str, - default=None, - help="Path to TensorRT engine. If not provided, TensorRT benchmark is skipped.", - ) - parser.add_argument("--num_iterations", type=int, default=20) - parser.add_argument("--warmup", type=int, default=5) - parser.add_argument("--seed", type=int, default=42) - parser.add_argument( - "--skip_compile", - action="store_true", - help="Skip torch.compile benchmark (can take a while due to JIT compilation)", - ) - parser.add_argument( - "--use_trajectory", - action="store_true", - help="Benchmark on full trajectory instead of single data point. " - "This cycles through all steps in an episode for more realistic benchmarking.", - ) - args = parser.parse_args() +@dataclass +class BenchmarkConfig: + """Configuration for GR00T inference benchmarking.""" + + model_path: str = "checkpoints/GR00T-N1.7-LIBERO/libero_10" + """Path to model checkpoint (local path, e.g. checkpoints/GR00T-N1.7-LIBERO/libero_10).""" + + dataset_path: str | None = None + """Path to dataset. Defaults to demo_data/libero_demo.""" + + embodiment_tag: str = "libero_sim" + """Embodiment tag to use.""" + + trt_engine_path: str | None = None + """Path to TensorRT engine. If not provided, TensorRT benchmark is skipped.""" + + num_iterations: int = 20 + """Number of benchmark iterations.""" + + warmup: int = 5 + """Number of warmup iterations.""" + + seed: int = 42 + """Random seed for reproducibility.""" + + trt_mode: BenchmarkMode = BenchmarkMode.dit_only + """TRT mode: 'dit_only' (DiT engine only), 'n17_full_pipeline' (all 6 engines), or 'vit_llm_only' (ViT+LLM TRT, action head in PyTorch — use on Spark/sm121).""" + + skip_compile: bool = False + """Skip torch.compile benchmark (can take a while due to JIT compilation).""" + + batch_size: int = 1 + """Batch size for TRT inference. Must match the batch size used during ONNX export.""" + + use_trajectory: bool = False + """Benchmark on full trajectory instead of single data point. This cycles through all steps in an episode for more realistic benchmarking.""" + + +def main(args: BenchmarkConfig | None = None): + if args is None: + args = tyro.cli(BenchmarkConfig) set_seed(args.seed) device = "cuda" if torch.cuda.is_available() else "cpu" + if device == "cpu": + print("ERROR: No CUDA GPU detected. Benchmarking requires a GPU.") + sys.exit(1) device_name = get_device_name() # Default dataset path if args.dataset_path is None: repo_path = os.path.dirname(os.path.dirname(gr00t.__file__)) - args.dataset_path = os.path.join(repo_path, "demo_data/gr1.PickNPlace") + args.dataset_path = os.path.join(repo_path, "demo_data/libero_demo") print("=" * 100) print("GR00T INFERENCE BENCHMARK") @@ -355,7 +407,7 @@ def main(): print("Loading policy...") policy = Gr00tPolicy( model_path=args.model_path, - embodiment_tag=EmbodimentTag(args.embodiment_tag), + embodiment_tag=EmbodimentTag.resolve(args.embodiment_tag), device=device, strict=True, ) @@ -365,11 +417,13 @@ def main(): print(f"Action Horizon: {action_horizon}") print(f"Denoising Steps: {denoising_steps}") + if args.trt_engine_path: + resolve_batch_size(args.trt_engine_path, args.batch_size, source="benchmark_inference") + modality_config = policy.get_modality_config() dataset = LeRobotEpisodeLoader( dataset_path=args.dataset_path, modality_configs=modality_config, - video_backend="torchcodec", ) episode_data = dataset[0] @@ -386,7 +440,7 @@ def main(): episode_data, step_index=step_idx, modality_configs=modality_config, - embodiment_tag=EmbodimentTag(args.embodiment_tag), + embodiment_tag=EmbodimentTag.resolve(args.embodiment_tag), allow_padding=False, ) obs = { @@ -406,7 +460,7 @@ def main(): episode_data, step_index=0, modality_configs=modality_config, - embodiment_tag=EmbodimentTag(args.embodiment_tag), + embodiment_tag=EmbodimentTag.resolve(args.embodiment_tag), allow_padding=False, ) @@ -416,6 +470,16 @@ def main(): "language": {modality_config["language"].modality_keys[0]: [[step_data.text]]}, } + # Tile observations to match the batch size baked into TRT engines + if args.batch_size > 1: + from verify_n1d7_trt import _tile_observation + + print(f"Tiling observations to batch_size={args.batch_size}") + if isinstance(observation, list): + observation = [_tile_observation(obs, args.batch_size) for obs in observation] + else: + observation = _tile_observation(observation, args.batch_size) + results = {} # ======================================== @@ -466,9 +530,15 @@ def main(): print("(This may take a while due to JIT compilation on first run)") print("-" * 50) + # Free the eager policy before loading the compiled instance to avoid + # holding two full model copies in GPU memory simultaneously (OOM on Orin). + del policy + torch.cuda.empty_cache() + gc.collect() + policy_compiled = Gr00tPolicy( model_path=args.model_path, - embodiment_tag=EmbodimentTag(args.embodiment_tag), + embodiment_tag=EmbodimentTag.resolve(args.embodiment_tag), device=device, strict=True, ) @@ -503,19 +573,46 @@ def main(): # 3. TensorRT (if available) # ======================================== if args.trt_engine_path and os.path.exists(args.trt_engine_path): + trt_label = f"TensorRT ({args.trt_mode})" print("\n" + "-" * 50) - print("Benchmarking TensorRT...") + print(f"Benchmarking {trt_label}...") print("-" * 50) + # Free whichever policy is still in memory before loading TRT, to avoid + # holding two full model copies in GPU memory simultaneously (OOM on Orin). + try: + del policy_compiled + except NameError: + pass + try: + del policy + except NameError: + pass + torch.cuda.empty_cache() + gc.collect() + + sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from standalone_inference_script import replace_dit_with_tensorrt policy_trt = Gr00tPolicy( model_path=args.model_path, - embodiment_tag=EmbodimentTag(args.embodiment_tag), + embodiment_tag=EmbodimentTag.resolve(args.embodiment_tag), device=device, strict=True, ) - replace_dit_with_tensorrt(policy_trt, args.trt_engine_path) + + if args.trt_mode in ("n17_full_pipeline", "vit_llm_only"): + from trt_model_forward import setup_tensorrt_engines + + setup_tensorrt_engines(policy_trt, args.trt_engine_path, mode=args.trt_mode) + else: + from standalone_inference_script import replace_dit_with_tensorrt + + # dit_only mode: trt_engine_path may be a directory; resolve the engine file + dit_engine_path = args.trt_engine_path + if os.path.isdir(dit_engine_path): + dit_engine_path = os.path.join(dit_engine_path, "dit_bf16.engine") + replace_dit_with_tensorrt(policy_trt, dit_engine_path) # TensorRT needs extra warmup for engine initialization and CUDA context setup trt_warmup = max(args.warmup + 5, 10) @@ -529,7 +626,7 @@ def main(): "action_head": times_components["action_head"], } components["e2e"] = compute_e2e_from_components(components) - results["TensorRT"] = components + results[trt_label] = components e2e_median = np.median(components["e2e"]) print(f" E2E: {e2e_median:.0f} ms ({1000 / e2e_median:.1f} Hz)") @@ -538,12 +635,14 @@ def main(): print(f" Action Head: {np.median(components['action_head']):.0f} ms") elif args.trt_engine_path: print(f"\nTensorRT engine not found: {args.trt_engine_path}") - print("To build the engine, run:") + print("To build engines for full pipeline, run:") print( - " python scripts/deployment/export_onnx_n1d6.py --model_path nvidia/GR00T-N1.6-3B --output_dir ./groot_n1d6_onnx" + " python scripts/deployment/export_onnx_n1d7.py --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10" + " --dataset-path demo_data/libero_demo --output-dir ./gr00t_trt_deployment/onnx --export-mode full_pipeline" ) print( - " python scripts/deployment/build_tensorrt_engine.py --onnx ./groot_n1d6_onnx/dit_model.onnx --engine .trt --precision bf16" + " python scripts/deployment/build_tensorrt_engine.py --mode full_pipeline" + " --onnx-dir ./gr00t_trt_deployment/onnx --engine-dir ./gr00t_trt_deployment/engines --precision bf16" ) # ======================================== @@ -575,4 +674,5 @@ def main(): if __name__ == "__main__": - main() + config = tyro.cli(BenchmarkConfig) + main(config) diff --git a/scripts/deployment/build_flash_attn.sh b/scripts/deployment/build_flash_attn.sh new file mode 100644 index 000000000..934a09335 --- /dev/null +++ b/scripts/deployment/build_flash_attn.sh @@ -0,0 +1,144 @@ +#!/bin/bash +# Source this file from a platform installer, then call build_flash_attn. + +build_flash_attn() { + local wheel_dir="$1" + local cache_key="$2" + local cuda_archs="$3" + local torch_cuda_arch="$4" + local flash_attn_whl="" + local local_whl + local cache_whl + local build_dir + local built_whl + + : "${VENV_PYTHON:?VENV_PYTHON must be set by the platform installer}" + if [ -z "${SUDO+x}" ]; then + echo "ERROR: SUDO must be set by the platform installer" >&2 + return 1 + fi + + local_whl=$(find "$wheel_dir" -name 'flash_attn-*.whl' -print -quit 2>/dev/null || true) + if [ -n "$local_whl" ]; then + echo "Found local flash-attn wheel: $local_whl" + flash_attn_whl="$local_whl" + fi + + if [ -z "$flash_attn_whl" ] && [ -n "${GROOT_CACHE_DIR:-}" ]; then + cache_whl=$(find "${GROOT_CACHE_DIR}/wheels/${cache_key}" -name 'flash_attn-*.whl' -print -quit 2>/dev/null || true) + if [ -n "$cache_whl" ]; then + echo "Found cached flash-attn wheel: $cache_whl" + flash_attn_whl="$cache_whl" + fi + fi + + if [ -n "$flash_attn_whl" ]; then + echo "Installing flash-attn from prebuilt wheel..." + uv pip install --python "$VENV_PYTHON" --force-reinstall --no-deps "$flash_attn_whl" + return + fi + + echo "No prebuilt flash-attn wheel found — building v2.8.3 for sm_${cuda_archs//;/, sm_}..." + echo "To skip this in the future, commit the built wheel to $wheel_dir/" + + local missing_packages=() + local package + for package in cmake git ninja-build python3-dev; do + if ! dpkg -s "$package" >/dev/null 2>&1; then + missing_packages+=("$package") + fi + done + if [ "${#missing_packages[@]}" -gt 0 ]; then + $SUDO apt-get update -qq + $SUDO apt-get install -y --no-install-recommends "${missing_packages[@]}" + fi + + uv pip install --python "$VENV_PYTHON" pip + export MAX_JOBS="${MAX_JOBS:-$(nproc)}" + export NVCC_THREADS="${NVCC_THREADS:-1}" + export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:-$(nproc)}" + export FLASH_ATTN_CUDA_ARCHS="$cuda_archs" + export TORCH_CUDA_ARCH_LIST="$torch_cuda_arch" + + build_dir=$(mktemp -d /tmp/gr00t-flash-attn.XXXXXX) + TMP_BUILD_DIRS+=("$build_dir") + git clone --depth 1 --branch v2.8.3 https://github.com/Dao-AILab/flash-attention.git "$build_dir/flash-attn" + + # The source checkout does not populate git submodules. Pin CUTLASS so a + # rebuild is repeatable instead of silently following its moving main branch. + local cutlass_sha="f74fea9ce35868d3ae9f8d1dce1969d7250d3f90" + rm -rf "$build_dir/flash-attn/csrc/cutlass" + mkdir -p "$build_dir/flash-attn/csrc/cutlass" + git -C "$build_dir/flash-attn/csrc/cutlass" init --quiet + git -C "$build_dir/flash-attn/csrc/cutlass" remote add origin https://github.com/NVIDIA/cutlass.git + git -C "$build_dir/flash-attn/csrc/cutlass" fetch --depth 1 --quiet origin "$cutlass_sha" + git -C "$build_dir/flash-attn/csrc/cutlass" checkout --quiet FETCH_HEAD + rm -rf "$build_dir/flash-attn/.git" + + # v2.8.3's build script only knows the upstream default architectures. + # Add platform targets explicitly and fail if that upstream layout changes. + CUDA_ARCHS="$cuda_archs" "$VENV_PYTHON" - "$build_dir/flash-attn/setup.py" <<'PY' +import os +import sys +from pathlib import Path + +path = Path(sys.argv[1]) +archs = os.environ["CUDA_ARCHS"].split(";") +text = path.read_text() +old_default = 'os.getenv("FLASH_ATTN_CUDA_ARCHS", "80;90;100;120")' +if old_default not in text: + raise SystemExit(f"ERROR: flash-attn architecture default changed in {path}") +text = text.replace(old_default, f'os.getenv("FLASH_ATTN_CUDA_ARCHS", "{";".join(archs)}")', 1) + +for arch in archs: + if arch == "87": + anchor = ''' if "80" in cuda_archs(): + cc_flag.append("-gencode") + cc_flag.append("arch=compute_80,code=sm_80") +''' + addition = ''' if "87" in cuda_archs(): + cc_flag.append("-gencode") + cc_flag.append("arch=compute_87,code=sm_87") +''' + elif arch in {"110", "121"}: + anchor = ''' if bare_metal_version >= Version("12.8") and "120" in cuda_archs(): + cc_flag.append("-gencode") + cc_flag.append("arch=compute_120,code=sm_120") +''' + addition = f''' if bare_metal_version >= Version("12.8") and "{arch}" in cuda_archs(): + cc_flag.append("-gencode") + cc_flag.append("arch=compute_{arch},code=sm_{arch}") +''' + else: + raise SystemExit(f"ERROR: unsupported flash-attn architecture: {arch}") + + if addition not in text: + if anchor not in text: + raise SystemExit(f"ERROR: expected flash-attn compiler block not found in {path}") + text = text.replace(anchor, anchor + addition, 1) + +path.write_text(text) +PY + + mkdir -p "$build_dir/wheels" + "$VENV_PYTHON" -m pip wheel --no-build-isolation --no-deps \ + --wheel-dir "$build_dir/wheels" "$build_dir/flash-attn" + built_whl=$(find "$build_dir/wheels" -name 'flash_attn-*.whl' -print -quit) + if [ -z "$built_whl" ]; then + echo "ERROR: flash-attn wheel build completed without producing a wheel" >&2 + return 1 + fi + uv pip install --python "$VENV_PYTHON" --force-reinstall --no-deps "$built_whl" + + if [ -n "${GROOT_CACHE_DIR:-}" ]; then + mkdir -p "${GROOT_CACHE_DIR}/wheels/${cache_key}" + cp "$built_whl" "${GROOT_CACHE_DIR}/wheels/${cache_key}/" + echo "Cached built wheel to ${GROOT_CACHE_DIR}/wheels/${cache_key}/" + fi + + mkdir -p "$wheel_dir" + cp "$built_whl" "$wheel_dir/" + echo "Saved built wheel to $wheel_dir/" + + rm -rf "$build_dir" +} diff --git a/scripts/deployment/build_tensorrt_engine.py b/scripts/deployment/build_tensorrt_engine.py index d92a3b98e..473b76289 100644 --- a/scripts/deployment/build_tensorrt_engine.py +++ b/scripts/deployment/build_tensorrt_engine.py @@ -1,23 +1,50 @@ #!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """ -Build TensorRT Engine from ONNX Model +Build TensorRT engines from exported ONNX models. + +Supports two modes: +- single: Build engine for a single ONNX model +- full_pipeline: Build engines for all pipeline components + (ViT, LLM, State Encoder, Action Encoder, DiT, Action Decoder) -This script builds a TensorRT engine from the exported ONNX DiT model. -It's equivalent to using trtexec but works with pip-installed TensorRT. +Shape profiles are automatically derived from the ONNX models. Usage: - python build_tensorrt_engine.py \ - --onnx ./groot_n1d6_onnx/dit_model.onnx \ - --engine ./groot_n1d6_onnx/dit_model_bf16.trt \ + # Full pipeline: + python scripts/deployment/build_tensorrt_engine.py \ + --mode full_pipeline \ + --onnx-dir ./gr00t_trt_deployment/onnx \ + --engine-dir ./gr00t_trt_deployment/engines \ --precision bf16 """ -import argparse +from dataclasses import dataclass import logging import os import time +from typing import Literal +from _trt_contract import load_export_metadata, validate_export_metadata +from gr00t.deployment.modes import FULL_PIPELINE_COMPONENTS, BuildEngineMode +import onnx import tensorrt as trt +import tyro # Set up logging @@ -25,6 +52,176 @@ logger = logging.getLogger(__name__) +# STRONGLY_TYPED precision sanity check: TRT 10+ STRONGLY_TYPED reads +# precision from the ONNX tensor types and ignores --precision builder +# flags. Catch the silent mismatch (user asks fp16, ONNX is bf16, engine +# silently builds bf16) before burning build time. Indirected through +# dtype *names* so the helper can be unit-tested without TensorRT. +_PRECISION_TO_TRT_DTYPE_NAME: dict[str, str] = { + "bf16": "BF16", + "fp16": "HALF", + "fp32": "FLOAT", + "fp8": "FP8", +} + + +def _check_strongly_typed_precision_match( + network_dtype_names: set[str], requested_precision: str +) -> None: + """Raise if --precision cannot be honored by this STRONGLY_TYPED network.""" + expected = _PRECISION_TO_TRT_DTYPE_NAME.get(requested_precision) + if expected is None: + raise ValueError( + f"Unknown precision: {requested_precision!r}. " + f"Expected one of {sorted(_PRECISION_TO_TRT_DTYPE_NAME)}." + ) + if expected not in network_dtype_names: + raise ValueError( + f"--precision={requested_precision} cannot be honored by this ONNX. " + f"STRONGLY_TYPED (TRT 10+) reads precision from ONNX tensor types " + f"and ignores builder flags. Network has tensor dtypes " + f"{sorted(network_dtype_names)}; none of them are {expected}. " + f"Either re-export the ONNX with the requested precision, or " + f"pass --precision matching the existing ONNX dtypes." + ) + # When fp32 is requested, the network must not contain any reduced-precision + # tensors. STRONGLY_TYPED won't promote BF16/FP16/FP8 to FLOAT, so a mixed + # BF16+FLOAT network silently runs at BF16 for those tensors despite the + # caller asking for fp32. + if requested_precision == "fp32": + reduced = {"BF16", "HALF", "FP8"} & network_dtype_names + if reduced: + raise ValueError( + f"--precision=fp32 cannot be honored: network also contains " + f"reduced-precision tensors {sorted(reduced)}. STRONGLY_TYPED " + f"won't promote them to FLOAT, so the engine would silently " + f"run mixed precision. Re-export the ONNX as pure FP32, or " + f"pass --precision matching the dominant reduced dtype." + ) + + +def _precision_from_onnx_path(onnx_path: str, default: str) -> str: + """Return the precision tag suffixed in the ONNX filename (e.g. + ``vit_fp32.onnx`` → ``"fp32"``), else ``default``. Used so the + full-pipeline build mirrors the export's per-component dtype instead + of forwarding the pipeline-wide ``--precision`` to a mismatched ONNX. + """ + stem = os.path.splitext(os.path.basename(onnx_path))[0] + for tag in _PRECISION_TO_TRT_DTYPE_NAME: + if stem.endswith(f"_{tag}"): + return tag + return default + + +# ============================================================ +# Auto Shape Profile from ONNX +# ============================================================ + + +def derive_shapes_from_onnx(onnx_path, max_batch=8): + """Read an ONNX model and derive min/opt/max shape profiles. + + For each input: + - Fixed dimensions (concrete values) are kept as-is across min/opt/max. + - Dynamic batch dimension: min=1, opt=1, max=max_batch. + - Dynamic sequence dimensions: min=1, opt=concrete_value, max=2*concrete_value. + (concrete_value comes from the ONNX model's shape hints) + + Returns (min_shapes, opt_shapes, max_shapes) dicts. + """ + model = onnx.load(onnx_path, load_external_data=False) + + min_shapes, opt_shapes, max_shapes = {}, {}, {} + + for inp in model.graph.input: + name = inp.name + dims = inp.type.tensor_type.shape.dim + + min_shape, opt_shape, max_shape = [], [], [] + for i, d in enumerate(dims): + if d.dim_value > 0: + # Fixed dimension — use as-is + min_shape.append(d.dim_value) + opt_shape.append(d.dim_value) + max_shape.append(d.dim_value) + else: + # Dynamic dimension + if i == 0: + # Batch dimension + min_shape.append(1) + opt_shape.append(1) + max_shape.append(max_batch) + else: + # Sequence/spatial dimension — use generous range + # We don't know the "typical" value from ONNX alone, + # so use 1 / 1 / large_max. The builder will optimize for opt. + min_shape.append(1) + opt_shape.append(1) + max_shape.append(512) + + min_shapes[name] = tuple(min_shape) + opt_shapes[name] = tuple(opt_shape) + max_shapes[name] = tuple(max_shape) + + return min_shapes, opt_shapes, max_shapes + + +def derive_shapes_with_hint(onnx_path, opt_seq_lens=None, max_batch=8): + """Derive shapes from ONNX, with optional sequence length hints. + + Args: + onnx_path: Path to ONNX model + opt_seq_lens: Dict mapping dynamic dim names to optimal sequence lengths. + e.g. {"sa_seq_len": 51, "vl_seq_len": 280, "sequence_length": 280} + max_batch: Maximum batch size + """ + model = onnx.load(onnx_path, load_external_data=False) + opt_seq_lens = opt_seq_lens or {} + + min_shapes, opt_shapes, max_shapes = {}, {}, {} + + for inp in model.graph.input: + name = inp.name + dims = inp.type.tensor_type.shape.dim + + min_shape, opt_shape, max_shape = [], [], [] + for i, d in enumerate(dims): + if d.dim_value > 0: + # Fixed dimension + min_shape.append(d.dim_value) + opt_shape.append(d.dim_value) + max_shape.append(d.dim_value) + else: + dim_name = d.dim_param if d.dim_param else f"dim_{i}" + if dim_name == "batch_size": + # Batch dimension (at any index) + min_shape.append(1) + opt_shape.append(1) + max_shape.append(max_batch) + elif dim_name in opt_seq_lens: + # Named dynamic dim with a hint + opt_val = opt_seq_lens[dim_name] + min_shape.append(1) + opt_shape.append(opt_val) + max_shape.append(max(opt_val * 2, opt_val + 64)) + else: + # Unknown dynamic dim — use wide range + min_shape.append(1) + opt_shape.append(256) + max_shape.append(512) + + min_shapes[name] = tuple(min_shape) + opt_shapes[name] = tuple(opt_shape) + max_shapes[name] = tuple(max_shape) + + return min_shapes, opt_shapes, max_shapes + + +# ============================================================ +# Engine Builder +# ============================================================ + + def build_engine( onnx_path: str, engine_path: str, @@ -33,9 +230,9 @@ def build_engine( min_shapes: dict = None, opt_shapes: dict = None, max_shapes: dict = None, + trt_severity=None, ): - """ - Build TensorRT engine from ONNX model. + """Build TensorRT engine from ONNX model. Args: onnx_path: Path to ONNX model @@ -55,13 +252,21 @@ def build_engine( logger.info(f"Workspace: {workspace_mb} MB") logger.info("=" * 80) - # Create TensorRT logger - TRT_LOGGER = trt.Logger(trt.Logger.VERBOSE) + TRT_LOGGER = trt.Logger(trt.Logger.VERBOSE if trt_severity is None else trt_severity) # Create builder and network logger.info("\n[Step 1/5] Creating TensorRT builder...") builder = trt.Builder(TRT_LOGGER) - network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) + + # TRT 10.x prefers STRONGLY_TYPED; EXPLICIT_BATCH is the 9.x fallback. + use_strongly_typed = hasattr(trt.NetworkDefinitionCreationFlag, "STRONGLY_TYPED") + if use_strongly_typed: + network_flags = 1 << int(trt.NetworkDefinitionCreationFlag.STRONGLY_TYPED) + logger.info("Using STRONGLY_TYPED network (TRT 10.x+)") + else: + network_flags = 1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) + logger.info("Using EXPLICIT_BATCH network (TRT 9.x fallback)") + network = builder.create_network(network_flags) parser = trt.OnnxParser(network, TRT_LOGGER) # Parse ONNX model @@ -72,7 +277,6 @@ def build_engine( logger.error(parser.get_error(error)) raise RuntimeError("ONNX parsing failed") - # Parser successful. Network is loaded logger.info(f"Network inputs: {network.num_inputs}") for i in range(network.num_inputs): inp = network.get_input(i) @@ -87,28 +291,38 @@ def build_engine( logger.info("\n[Step 3/5] Configuring builder...") config = builder.create_builder_config() - # Enable detailed profiling for engine inspection - # This allows get_layer_information() to return layer types, precisions, tactics, etc. config.profiling_verbosity = trt.ProfilingVerbosity.DETAILED logger.info("Enabled DETAILED profiling verbosity for engine inspection") - # Set workspace config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, workspace_mb * (1024**2)) - # Set precision - if precision == "fp16": - config.set_flag(trt.BuilderFlag.FP16) - logger.info("Enabled FP16 mode") - elif precision == "bf16": - config.set_flag(trt.BuilderFlag.BF16) - logger.info("Enabled BF16 mode") - elif precision == "fp8": - config.set_flag(trt.BuilderFlag.FP8) - logger.info("Enabled FP8 mode") - elif precision == "fp32": - logger.info("Using FP32 (default precision)") + if use_strongly_typed: + network_dtype_names: set[str] = set() + for i in range(network.num_inputs): + network_dtype_names.add(network.get_input(i).dtype.name) + for i in range(network.num_outputs): + network_dtype_names.add(network.get_output(i).dtype.name) + _check_strongly_typed_precision_match(network_dtype_names, precision) + logger.info( + f"Precision '{precision}' matches ONNX tensor dtypes (STRONGLY_TYPED, " + f"network has {sorted(network_dtype_names)})" + ) else: - raise ValueError(f"Unknown precision: {precision}") + # Weak-typed fallback: explicitly set precision flags + if precision == "fp16": + config.set_flag(trt.BuilderFlag.FP16) + logger.info("Enabled FP16 mode") + elif precision == "bf16": + config.set_flag(trt.BuilderFlag.BF16) + logger.info("Enabled BF16 mode") + elif precision == "fp8": + config.set_flag(trt.BuilderFlag.FP8) + config.set_flag(trt.BuilderFlag.BF16) + logger.info("Enabled FP8 + BF16 mode") + elif precision == "fp32": + logger.info("Using FP32 (default precision)") + else: + raise ValueError(f"Unknown precision: {precision}") # Set optimization profiles for dynamic shapes if min_shapes and opt_shapes and max_shapes: @@ -148,7 +362,7 @@ def build_engine( # Save engine logger.info(f"\nSaving engine to {engine_path}...") - os.makedirs(os.path.dirname(engine_path), exist_ok=True) + os.makedirs(os.path.dirname(engine_path) or ".", exist_ok=True) with open(engine_path, "wb") as f: f.write(serialized_engine) @@ -164,63 +378,260 @@ def build_engine( logger.info(f"Precision: {precision.upper()}") logger.info("=" * 80) + return engine_path + + +# ============================================================ +# Full Pipeline Builder +# ============================================================ + + +def build_full_pipeline( + onnx_dir, + engine_dir, + precision="bf16", + workspace_mb=8192, + trt_severity=None, + only: frozenset[str] | None = None, + allow_default_hints: bool = False, +): + """Build all TRT engines for the full pipeline. + + Shape profiles are automatically derived from the ONNX models. + Dynamic sequence dimensions use hints based on typical inference shapes. -def main(): - parser = argparse.ArgumentParser(description="Build TensorRT engine from ONNX") - parser.add_argument("--onnx", type=str, required=True, help="Path to ONNX model") - parser.add_argument("--engine", type=str, required=True, help="Path to save TensorRT engine") - parser.add_argument( - "--precision", - type=str, - default="bf16", - choices=["fp32", "fp16", "bf16", "fp8"], - help="Precision mode (default: bf16)", - ) - parser.add_argument( - "--workspace", type=int, default=8192, help="Workspace size in MB (default: 8192)" - ) - - args = parser.parse_args() - - # Define shapes for your specific model (from export) - min_shapes = None - opt_shapes = None - max_shapes = None - - # Establish Dynamic Shapes to handle variable seq lengths - # Based on captured inputs but with ranges to handle variations - min_shapes = { - "sa_embs": (1, 1, 1536), # Min: 1 token - "vl_embs": (1, 1, 2048), # Min: 1 token - "timestep": (1,), - "image_mask": (1, 1), # Min: 1 token - "backbone_attention_mask": (1, 1), # Min: 1 token - } - opt_shapes = { - "sa_embs": (1, 51, 1536), # Typical: 51 tokens - "vl_embs": (1, 122, 2048), # Typical: 122 tokens - "timestep": (1,), - "image_mask": (1, 122), # Typical: 122 tokens - "backbone_attention_mask": (1, 122), # Typical: 122 tokens - } - max_shapes = { - "sa_embs": (1, 256, 1536), # Max: 256 tokens (generous) - "vl_embs": (1, 512, 2048), # Max: 512 tokens (generous) - "timestep": (1,), - "image_mask": (1, 512), # Max: 512 tokens - "backbone_attention_mask": (1, 512), # Max: 512 tokens - } - - build_engine( - onnx_path=args.onnx, - engine_path=args.engine, - precision=args.precision, - workspace_mb=args.workspace, - min_shapes=min_shapes, - opt_shapes=opt_shapes, - max_shapes=max_shapes, - ) + Args: + onnx_dir: Directory containing exported ONNX models + engine_dir: Directory to save TRT engines + precision: Precision mode + workspace_mb: Workspace size in MB + only: Restrict the build to this subset of component names (from + ``FULL_PIPELINE_COMPONENTS``). ``None`` builds the full 7. A partial + export (e.g. ``action_head``, which keeps ViT/LLM in PyTorch) must + pass its produced subset so the completeness check requires exactly + those, not the full pipeline. + """ + os.makedirs(engine_dir, exist_ok=True) + + # Sequence/patch hints for the TRT shape profiles come from export_metadata.json + # (single source of truth). A missing, stale, or incomplete bundle is rejected so + # the build can't silently bake wrong shapes; --allow-default-hints opts into the + # hardcoded GR1 single-view fallbacks. + metadata = load_export_metadata(onnx_dir) + try: + if metadata is None: + raise ValueError(f"no export_metadata.json found in {onnx_dir}") + validate_export_metadata(metadata, source="build_full_pipeline", engine_path=onnx_dir) + except ValueError as e: + if not allow_default_hints: + raise ValueError( + f"{e}. Re-export with the current exporter, or pass --allow-default-hints " + "to build with hardcoded GR1 single-view shape hints (the engine may get " + "wrong sequence/patch shapes)." + ) from e + logger.warning("%s; using default shape hints (--allow-default-hints).", e) + metadata = None + + if metadata is not None: + # The engine must be built at the precision it was exported for; a drift here + # produces a valid-but-wrong engine. Per-component precision is still taken from + # each ONNX filename below — this guards the pipeline-wide default. + if metadata["precision"] != precision: + raise ValueError( + f"build_full_pipeline: --precision={precision} but export_metadata.json in " + f"{onnx_dir} records precision={metadata['precision']!r}. Build at the " + f"exported precision (--precision {metadata['precision']}) or re-export." + ) + seq_hints = { + "sa_seq_len": metadata["sa_seq_len"], + "vl_seq_len": metadata["vl_seq_len"], + "sequence_length": metadata["llm_seq_len"], + "seq_len": metadata["llm_seq_len"], # N1.7 LLM dynamic dim name + "num_patches": metadata["num_patches"], + "num_merged_patches": metadata["num_merged_patches"], + "num_vis_tokens": metadata["num_vis_tokens"], # N1.7 deepstack + } + logger.info(f"Loaded shape hints from export_metadata.json in {onnx_dir}: {seq_hints}") + else: + seq_hints = { + "sa_seq_len": 51, # 1 state + action_horizon + "vl_seq_len": 280, # typical backbone output seq_len + "sequence_length": 280, # LLM seq_len + } + logger.warning(f"Using default shape hints (no usable metadata): {seq_hints}") + + # Build order, ONNX candidates, and engine filenames come from the shared + # component table (single source of truth). ``only`` restricts to the subset + # a partial export produced. FP32 ViT is preferred for accuracy and falls + # back to BF16; the engine filename stays precision-neutral (vit.engine) + # because the input ONNX may be either FP32 or BF16 — the real precision is + # recorded in export_metadata.json and inspectable via TRT tooling. + if only is not None: + valid_names = {c.name for c in FULL_PIPELINE_COMPONENTS} + unknown = set(only) - valid_names + if unknown: + raise ValueError( + f"Unknown pipeline component(s) {sorted(unknown)}; " + f"valid components: {sorted(valid_names)}" + ) + components: list[tuple[str, str, str]] = [] + for component in FULL_PIPELINE_COMPONENTS: + if only is not None and component.name not in only: + continue + onnx_file = next( + (c for c in component.onnx_candidates if os.path.exists(os.path.join(onnx_dir, c))), + component.onnx_candidates[0], + ) + components.append((component.name, onnx_file, component.engine)) + + results: list[tuple[str, str, str]] = [] + skipped: list[tuple[str, str]] = [] # (name, onnx_path) for components with no ONNX input + + for name, onnx_file, engine_file in components: + onnx_path = os.path.join(onnx_dir, onnx_file) + + if not os.path.exists(onnx_path): + logger.warning(f"Skipping {name}: ONNX file not found at {onnx_path}") + skipped.append((name, onnx_path)) + continue + + logger.info(f"\n{'#' * 80}") + logger.info(f"# Building {name} engine") + logger.info(f"{'#' * 80}") + + engine_path = os.path.join(engine_dir, engine_file) + # Pick the precision that actually matches this ONNX's tensor types. + # The full_pipeline export is mixed-precision (ViT FP32, rest BF16), + # so the pipeline-wide ``precision`` argument is the default but each + # component uses what it was actually exported with. + component_precision = _precision_from_onnx_path(onnx_path, default=precision) + if component_precision != precision: + logger.info( + f" Using precision={component_precision} for {name} (from ONNX filename); " + f"pipeline default is {precision}" + ) + + try: + # Derive shapes from the ONNX model itself + min_shapes, opt_shapes, max_shapes = derive_shapes_with_hint( + onnx_path, opt_seq_lens=seq_hints + ) + + logger.info(f" Auto-derived shape profiles for {name}:") + for input_name in opt_shapes: + logger.info( + f" {input_name}: min={min_shapes[input_name]} " + f"opt={opt_shapes[input_name]} max={max_shapes[input_name]}" + ) + + build_engine( + onnx_path=onnx_path, + engine_path=engine_path, + precision=component_precision, + workspace_mb=workspace_mb, + min_shapes=min_shapes, + opt_shapes=opt_shapes, + max_shapes=max_shapes, + trt_severity=trt_severity, + ) + results.append((name, engine_path, "SUCCESS")) + except Exception as e: + logger.error(f"Failed to build {name} engine: {e}") + results.append((name, engine_path, f"FAILED: {e}")) + + # Print summary + logger.info("\n" + "=" * 80) + logger.info("FULL PIPELINE BUILD SUMMARY") + logger.info("=" * 80) + for name, path, status in results: + logger.info(f" {name:20s} -> {status}") + logger.info("=" * 80) + + # Every component must build; missing ONNX inputs and failed builds are + # equally fatal, otherwise an empty/half-built engine dir exits 0. + failures = [(name, status) for name, _, status in results if status.startswith("FAILED")] + if failures or skipped: + parts = [] + if failures: + parts.append( + f"{len(failures)}/{len(components)} engine(s) failed: " + + "; ".join(f"{name} ({status})" for name, status in failures) + ) + if skipped: + parts.append( + f"{len(skipped)}/{len(components)} component(s) had no ONNX input: " + + ", ".join(f"{name} ({path})" for name, path in skipped) + ) + raise RuntimeError("Pipeline build incomplete — " + " | ".join(parts)) + + +# ============================================================ +# Main +# ============================================================ + + +@dataclass +class BuildConfig: + """Configuration for building TensorRT engines from ONNX models.""" + + mode: BuildEngineMode = BuildEngineMode.single + """Build mode: 'single' (one engine) or 'full_pipeline' (all engines).""" + + onnx: str | None = None + """Path to ONNX model (single mode).""" + + engine: str | None = None + """Path to save TensorRT engine (single mode).""" + + onnx_dir: str = "./gr00t_trt_deployment/onnx" + """Directory with ONNX models (full_pipeline mode).""" + + engine_dir: str = "./gr00t_trt_deployment/engines" + """Directory to save engines (full_pipeline mode).""" + + precision: Literal["fp32", "fp16", "bf16", "fp8"] = "bf16" + """Precision mode (default: bf16).""" + + workspace: int = 8192 + """Workspace size in MB (default: 8192).""" + + allow_default_hints: bool = False + """full_pipeline: build with hardcoded GR1 single-view shape hints when + export_metadata.json is missing/stale/incomplete, instead of failing. The + engine may get wrong sequence/patch shapes — use only for legacy bundles.""" + + +def main(args: BuildConfig | None = None, trt_severity=None): + if args is None: + args = tyro.cli(BuildConfig) + + if args.mode == "full_pipeline": + build_full_pipeline( + onnx_dir=args.onnx_dir, + engine_dir=args.engine_dir, + precision=args.precision, + workspace_mb=args.workspace, + trt_severity=trt_severity, + allow_default_hints=args.allow_default_hints, + ) + else: + if not args.onnx or not args.engine: + raise ValueError("--onnx and --engine are required in single mode") + + # Auto-derive shapes from the ONNX model + min_shapes, opt_shapes, max_shapes = derive_shapes_with_hint(args.onnx) + build_engine( + onnx_path=args.onnx, + engine_path=args.engine, + precision=args.precision, + workspace_mb=args.workspace, + min_shapes=min_shapes, + opt_shapes=opt_shapes, + max_shapes=max_shapes, + trt_severity=trt_severity, + ) if __name__ == "__main__": - main() + config = tyro.cli(BuildConfig) + main(config) diff --git a/scripts/deployment/build_trt_pipeline.py b/scripts/deployment/build_trt_pipeline.py new file mode 100644 index 000000000..b037bad62 --- /dev/null +++ b/scripts/deployment/build_trt_pipeline.py @@ -0,0 +1,528 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Unified TensorRT pipeline: export ONNX, build engines, verify accuracy, and benchmark. + +Wraps the 4 deployment steps into a single script with clean progress output. +Verbose logs from each step are written to a log file; the terminal shows only +progress headers, one-line results, and a final summary. + +Usage: + # Full pipeline (recommended) + python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo + + # Export + build only + python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --steps export,build + + # Skip benchmark + python scripts/deployment/build_trt_pipeline.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --steps export,build,verify +""" + +from __future__ import annotations + +import contextlib +from dataclasses import dataclass +from enum import Enum +import json +import logging +import os +from pathlib import Path +import shutil +import sys +import time +import traceback +from typing import IO, Literal, Optional + +from gr00t.deployment.modes import PIPELINE_STAGE_MODES as _MODE_MAP, ExportMode +import tyro + + +# Ensure scripts/deployment/ is on sys.path for sibling module imports. +_DEPLOY_DIR = os.path.dirname(os.path.abspath(__file__)) +if _DEPLOY_DIR not in sys.path: + sys.path.insert(0, _DEPLOY_DIR) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +class Step(str, Enum): + """Pipeline steps. Values are the user-facing CLI tokens for --steps.""" + + EXPORT = "export" + BUILD = "build" + VERIFY = "verify" + BENCHMARK = "benchmark" + + +VALID_STEPS = tuple(Step) + + +def _fmt_elapsed(seconds: float) -> str: + if seconds < 60: + return f"{seconds:.0f}s" + m, s = divmod(int(seconds), 60) + return f"{m}m {s:02d}s" + + +def _count_files(directory: str, suffix: str) -> int: + if not os.path.isdir(directory): + return 0 + return sum(1 for f in os.listdir(directory) if f.endswith(suffix)) + + +def _print_header(step_num: int, total: int, msg: str) -> None: + print(f"\n{'=' * 60}") + print(f"[Step {step_num}/{total}] {msg}") + print(f"{'=' * 60}") + + +def _print_result(step_num: int, total: int, msg: str, elapsed: float) -> None: + print(f"[Step {step_num}/{total}] {msg} ({_fmt_elapsed(elapsed)})") + + +class _TeeWriter: + """Write to multiple streams simultaneously.""" + + def __init__(self, *streams: IO[str]): + self._streams = streams + + def write(self, data: str) -> int: + for s in self._streams: + s.write(data) + return len(data) + + def flush(self) -> None: + for s in self._streams: + s.flush() + + +@contextlib.contextmanager +def _redirect_to_log(log_file: IO[str], tee: bool = False): + """Redirect stdout, stderr, and all logging to the log file. + + The caller's own progress prints should happen *outside* this context. + If *tee* is True, output goes to both the log file and the real terminal. + """ + old_stdout, old_stderr = sys.stdout, sys.stderr + # Redirect streams + if tee: + tee_out = _TeeWriter(log_file, old_stdout) + tee_err = _TeeWriter(log_file, old_stderr) + sys.stdout = tee_out + sys.stderr = tee_err + log_stream = tee_out + else: + sys.stdout = log_file + sys.stderr = log_file + log_stream = log_file + + # Redirect all logging handlers to the log file + root_logger = logging.getLogger() + old_handlers = root_logger.handlers[:] + root_logger.handlers.clear() + file_handler = logging.StreamHandler(log_stream) + file_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) + root_logger.addHandler(file_handler) + + try: + yield + finally: + log_file.flush() + sys.stdout = old_stdout + sys.stderr = old_stderr + root_logger.handlers.clear() + for h in old_handlers: + root_logger.addHandler(h) + + +def _resolve_embodiment(model_path: str, embodiment_tag: Optional[str]): + """Auto-detect embodiment tag from processor_config.json if not provided.""" + from gr00t.data.embodiment_tags import EmbodimentTag + + if embodiment_tag is not None: + return EmbodimentTag.resolve(embodiment_tag) + + config_file = Path(model_path) / "processor_config.json" + if not config_file.exists(): + raise ValueError( + f"Cannot auto-detect embodiment_tag: {config_file} not found. " + "Please provide --embodiment-tag explicitly." + ) + with open(config_file, "r") as f: + processor_config = json.load(f) + modality_configs = processor_config.get("processor_kwargs", {}).get("modality_configs", {}) + if len(modality_configs) == 0: + raise ValueError( + "Cannot auto-detect embodiment_tag: no modality_configs found in processor_config.json. " + "Please provide --embodiment-tag explicitly." + ) + if len(modality_configs) == 1: + embodiment_key = next(iter(modality_configs)) + tag = EmbodimentTag.resolve(embodiment_key) + print(f" Auto-detected embodiment: {tag} (from {embodiment_key})") + return tag + available = sorted(modality_configs.keys()) + raise ValueError( + f"Multiple embodiments found in processor_config.json: {available}. " + "Please provide --embodiment-tag explicitly." + ) + + +# --------------------------------------------------------------------------- +# Config +# --------------------------------------------------------------------------- + + +@dataclass +class PipelineConfig: + """Unified TensorRT deployment pipeline configuration.""" + + # -- Shared (required) -------------------------------------------------- + model_path: str = "" + """Path to the model checkpoint (required).""" + + dataset_path: str = "demo_data/libero_demo" + """Path to the dataset (LeRobot format).""" + + embodiment_tag: Optional[str] = None + """Embodiment tag. Auto-detected from processor_config.json if not provided.""" + + output_dir: str = "./gr00t_trt_deployment" + """Root output directory. ONNX files go to /onnx/, engines to /engines/.""" + + precision: Literal["bf16"] = "bf16" + """Precision baked into the exported ONNX and the built TRT engine. + + Only 'bf16' is honored end-to-end: the ONNX export hardcodes a + mixed-dtype graph (ViT FP32, every other component BF16) and the + builder treats this as the single supported configuration. Adding + 'fp16'/'fp32'/'fp8' here without first wiring them through + export_onnx_n1d7.py would silently produce a bf16 artifact under a + different name.""" + + batch_size: int = 1 + """Batch size baked into the exported ONNX/TRT models (default: 1). + + Pinned at build time: ``export_onnx_n1d7.py`` does not register the + batch dim in ``dynamic_axes``, so the resulting TRT engine only + accepts inputs with this exact batch size at runtime. Bs=1 covers + the production inference path; pick a larger value only if every + runtime call will use the same batch (e.g. tiled benchmarking via + ``verify_n1d7_trt.py``). See also + ``trt_model_forward._assert_supports_trt_padding_strip`` for the + matching runtime-side contract. + """ + + # -- Export options ------------------------------------------------------ + export_mode: ExportMode = ExportMode.full_pipeline + """Export mode: 'dit_only', 'action_head', or 'full_pipeline' (recommended).""" + + # -- Build options ------------------------------------------------------ + workspace: int = 8192 + """TRT builder workspace size in MB.""" + + # -- Benchmark options -------------------------------------------------- + num_iterations: int = 20 + """Number of benchmark iterations.""" + + warmup: int = 5 + """Number of warmup iterations.""" + + skip_compile: bool = False + """Skip torch.compile benchmark (slow JIT compilation).""" + + # -- Pipeline control --------------------------------------------------- + steps: str = "all" + """Steps to run: 'all' or comma-separated subset of 'export,build,verify,benchmark'.""" + + log_file: Optional[str] = None + """Log file path. Defaults to /pipeline.log.""" + + +# --------------------------------------------------------------------------- +# Step runners +# --------------------------------------------------------------------------- + + +def _run_export(cfg: PipelineConfig, onnx_dir: str, embodiment_tag, log_fp) -> None: + from export_onnx_n1d7 import ExportConfig, main as export_main + + export_cfg = ExportConfig( + model_path=cfg.model_path, + dataset_path=cfg.dataset_path, + embodiment_tag=embodiment_tag, + output_dir=onnx_dir, + export_mode=cfg.export_mode, + precision=cfg.precision, + batch_size=cfg.batch_size, + ) + with _redirect_to_log(log_fp): + export_main(export_cfg) + + +def _run_build( + cfg: PipelineConfig, onnx_dir: str, engine_dir: str, log_fp, trt_severity=None +) -> None: + from build_tensorrt_engine import BuildConfig, build_full_pipeline, main as build_main + from gr00t.deployment.modes import EXPORT_MODE_COMPONENTS + + build_mode, _, _ = _MODE_MAP[cfg.export_mode] + + if build_mode == "single": + # dit_only: single ONNX -> single engine + build_cfg = BuildConfig( + mode="single", + onnx=os.path.join(onnx_dir, "dit_bf16.onnx"), + engine=os.path.join(engine_dir, "dit_bf16.engine"), + precision=cfg.precision, + workspace=cfg.workspace, + ) + with _redirect_to_log(log_fp): + build_main(build_cfg, trt_severity=trt_severity) + return + + # full_pipeline builder: build exactly the components this export_mode wrote + # ONNX for. Without this, a partial export (action_head keeps ViT/LLM/VL-SA + # in PyTorch) fails the build's completeness check on ONNX it never produces. + full = EXPORT_MODE_COMPONENTS[ExportMode.full_pipeline] + only = EXPORT_MODE_COMPONENTS[cfg.export_mode] + with _redirect_to_log(log_fp): + build_full_pipeline( + onnx_dir=onnx_dir, + engine_dir=engine_dir, + precision=cfg.precision, + workspace_mb=cfg.workspace, + trt_severity=trt_severity, + only=None if only == full else only, + ) + + +def _copy_export_metadata(onnx_dir: str, engine_dir: str) -> None: + """Copy ``export_metadata.json`` next to the built engines. + + The runtime (``setup_tensorrt_engines`` / ``verify_n1d7_trt`` / + ``benchmark_inference``) reads back ``action_horizon`` / ``batch_size`` from + this file to validate against the loaded policy and the requested + ``--batch-size``, so the engine bundle must carry its own copy to be + self-describing. A missing source file is a no-op (older export layouts). + """ + src = os.path.join(onnx_dir, "export_metadata.json") + if os.path.exists(src): + shutil.copy2(src, os.path.join(engine_dir, "export_metadata.json")) + + +def _run_verify(cfg: PipelineConfig, engine_dir: str, embodiment_tag, log_fp) -> float: + from verify_n1d7_trt import VerifyConfig, main as verify_main + + _, verify_mode, _ = _MODE_MAP[cfg.export_mode] + verify_cfg = VerifyConfig( + model_path=cfg.model_path, + dataset_path=cfg.dataset_path, + engine_dir=engine_dir, + mode=verify_mode, + embodiment_tag=embodiment_tag, + batch_size=cfg.batch_size, + ) + with _redirect_to_log(log_fp, tee=True): + cosine = verify_main(verify_cfg) + return cosine + + +def _run_benchmark(cfg: PipelineConfig, engine_dir: str, embodiment_tag, log_fp) -> None: + from benchmark_inference import BenchmarkConfig, main as benchmark_main + + _, _, trt_mode = _MODE_MAP[cfg.export_mode] + + # For dit_only, engine path is the single .engine file + if cfg.export_mode == "dit_only": + trt_engine_path = os.path.join(engine_dir, "dit_bf16.engine") + else: + trt_engine_path = engine_dir + + benchmark_cfg = BenchmarkConfig( + model_path=cfg.model_path, + dataset_path=cfg.dataset_path, + embodiment_tag=embodiment_tag.value, + trt_engine_path=trt_engine_path, + trt_mode=trt_mode, + num_iterations=cfg.num_iterations, + warmup=cfg.warmup, + skip_compile=cfg.skip_compile, + batch_size=cfg.batch_size, + ) + with _redirect_to_log(log_fp, tee=True): + benchmark_main(benchmark_cfg) + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + + +def main(cfg: PipelineConfig | None = None) -> None: + if cfg is None: + cfg = tyro.cli(PipelineConfig) + + if not cfg.model_path: + raise ValueError("Please provide --model-path") + + # Parse steps + valid_names = {s.value for s in Step} + if cfg.steps == "all": + steps = list(Step) + else: + steps = [] + for token in cfg.steps.split(","): + token = token.strip() + if token not in valid_names: + raise ValueError(f"Unknown step '{token}'. Valid steps: {', '.join(valid_names)}") + steps.append(Step(token)) + + # Validate step dependencies + if Step.BUILD in steps and Step.EXPORT not in steps: + onnx_dir = os.path.join(cfg.output_dir, "onnx") + if not os.path.isdir(onnx_dir) or _count_files(onnx_dir, ".onnx") == 0: + raise ValueError( + "Step 'build' requires ONNX models. Either include 'export' in --steps " + f"or ensure ONNX files exist in {onnx_dir}" + ) + if Step.VERIFY in steps and Step.BUILD not in steps: + engine_dir = os.path.join(cfg.output_dir, "engines") + if not os.path.isdir(engine_dir) or _count_files(engine_dir, ".engine") == 0: + raise ValueError( + "Step 'verify' requires TRT engines. Either include 'build' in --steps " + f"or ensure engine files exist in {engine_dir}" + ) + if Step.BENCHMARK in steps and Step.BUILD not in steps: + engine_dir = os.path.join(cfg.output_dir, "engines") + if not os.path.isdir(engine_dir) or _count_files(engine_dir, ".engine") == 0: + raise ValueError( + "Step 'benchmark' requires TRT engines. Either include 'build' in --steps " + f"or ensure engine files exist in {engine_dir}" + ) + + # Derived paths + onnx_dir = os.path.join(cfg.output_dir, "onnx") + engine_dir = os.path.join(cfg.output_dir, "engines") + os.makedirs(cfg.output_dir, exist_ok=True) + + log_path = cfg.log_file or os.path.join(cfg.output_dir, "pipeline.log") + log_fp = open(log_path, "w") + + try: + # Resolve embodiment tag once + embodiment_tag = _resolve_embodiment(cfg.model_path, cfg.embodiment_tag) + + total = len(steps) + results: dict[str, str] = {} + cosine_val: float | None = None + + print("=" * 60) + print("GR00T TensorRT Deployment Pipeline") + print("=" * 60) + print(f" Model: {cfg.model_path}") + print(f" Dataset: {cfg.dataset_path}") + print(f" Embodiment: {embodiment_tag}") + print(f" Export mode: {cfg.export_mode}") + print(f" Batch size: {cfg.batch_size}") + print(f" Precision: {cfg.precision}") + print(f" Output: {cfg.output_dir}") + print(f" Steps: {', '.join(s.value for s in steps)}") + print(f" Log file: {log_path}") + + for i, step in enumerate(steps, 1): + t0 = time.time() # fallback for error handler + try: + if step is Step.EXPORT: + _print_header(i, total, "Exporting ONNX models...") + t0 = time.time() + _run_export(cfg, onnx_dir, embodiment_tag, log_fp) + elapsed = time.time() - t0 + n = _count_files(onnx_dir, ".onnx") + _print_result( + i, total, f"Export complete -- {n} ONNX files in {onnx_dir}", elapsed + ) + results[step.value] = f"{n} ONNX files ({_fmt_elapsed(elapsed)})" + + elif step is Step.BUILD: + _print_header(i, total, "Building TensorRT engines...") + t0 = time.time() + _run_build(cfg, onnx_dir, engine_dir, log_fp) + _copy_export_metadata(onnx_dir, engine_dir) + elapsed = time.time() - t0 + n = _count_files(engine_dir, ".engine") + _print_result( + i, total, f"Build complete -- {n} engines in {engine_dir}", elapsed + ) + results[step.value] = f"{n} engines ({_fmt_elapsed(elapsed)})" + + elif step is Step.VERIFY: + _print_header(i, total, "Verifying TRT accuracy...") + t0 = time.time() + cosine_val = _run_verify(cfg, engine_dir, embodiment_tag, log_fp) + elapsed = time.time() - t0 + status = "PASS" if cosine_val and cosine_val > 0.99 else "FAIL" + cos_str = f"{cosine_val:.6f}" if cosine_val is not None else "N/A" + _print_result( + i, total, f"Verify complete -- cosine={cos_str} {status}", elapsed + ) + results[step.value] = f"cosine={cos_str} {status} ({_fmt_elapsed(elapsed)})" + + elif step is Step.BENCHMARK: + _print_header(i, total, "Running benchmark...") + t0 = time.time() + _run_benchmark(cfg, engine_dir, embodiment_tag, log_fp) + elapsed = time.time() - t0 + _print_result(i, total, "Benchmark complete", elapsed) + results[step.value] = f"done ({_fmt_elapsed(elapsed)})" + + except Exception as e: + elapsed = time.time() - t0 + print(f"\n[Step {i}/{total}] FAILED: {step.value} ({_fmt_elapsed(elapsed)})") + print(f" Error: {e}") + print(f" See full log: {log_path}") + # Write traceback to log + log_fp.write(f"\n{'=' * 60}\nSTEP FAILED: {step.value}\n{'=' * 60}\n") + log_fp.write(traceback.format_exc()) + sys.exit(1) + + # Final summary + print(f"\n{'=' * 60}") + print("TRT Pipeline Complete!") + print(f"{'=' * 60}") + for step_name, result in results.items(): + print(f" {step_name:12s} {result}") + print(f" {'log':12s} {log_path}") + print(f"{'=' * 60}") + finally: + log_fp.close() + + +if __name__ == "__main__": + main() diff --git a/scripts/deployment/dgpu/bootstrap_wheels.sh b/scripts/deployment/dgpu/bootstrap_wheels.sh new file mode 100644 index 000000000..2b7676a05 --- /dev/null +++ b/scripts/deployment/dgpu/bootstrap_wheels.sh @@ -0,0 +1,240 @@ +#!/bin/bash +# Build missing aarch64 dGPU wheels before the root pyproject's path sources are +# resolved by uv sync. Dependency pins are the source of truth; the pyproject +# path sources are updated to point at the matching generated wheel names. +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" +PYPROJECT="$REPO_ROOT/pyproject.toml" +WHEEL_DIR="$SCRIPT_DIR/wheels" + +mkdir -p "$WHEEL_DIR" + +# Target CPython derived from the project's requires-python, so the build venv +# and the wheel's cpXY tag track the pinned interpreter. A literal cp310/python3.10 +# silently builds an unusable wheel after a runtime bump (e.g. the py3.12 migration). +resolve_python_version() { + python3 - "$PYPROJECT" <<'PY' +import pathlib +import re +import sys + +text = pathlib.Path(sys.argv[1]).read_text() +# Accept both TOML quote styles (" and ', written as hex \x22 / \x27). +m = re.search(r"requires-python\s*=\s*[\x22\x27]([^\x22\x27]+)[\x22\x27]", text) +if m is None: + raise SystemExit("ERROR: requires-python not found in pyproject.toml") +v = re.search(r"(\d+)\.(\d+)", m.group(1)) +if v is None: + raise SystemExit(f"ERROR: could not parse a CPython version from {m.group(1)!r}") +print(f"{v.group(1)}.{v.group(2)}") +PY +} + +PY_VERSION="$(resolve_python_version)" +PYTHON_BIN="python${PY_VERSION}" +CP_TAG="cp${PY_VERSION/./}" + +resolve_dependency_version() { + python3 - "$PYPROJECT" "$1" <<'PY' +import pathlib +import re +import sys + +pyproject_path = pathlib.Path(sys.argv[1]) +package = sys.argv[2] +text = pyproject_path.read_text() + +dep_line = None +for line in text.splitlines(): + if f'"{package}==' in line and "platform_machine" in line and "aarch64" in line: + dep_line = line + break +if dep_line is None: + for line in text.splitlines(): + if f'"{package}==' in line: + dep_line = line + break +if dep_line is None: + raise SystemExit(f"ERROR: pinned project dependency not found for {package}") + +dep_match = re.search(rf'"{re.escape(package)}==([^";]+)', dep_line) +if dep_match is None: + raise SystemExit(f"ERROR: could not parse pinned dependency version for {package}") + +print(dep_match.group(1)) +PY +} + +update_pyproject_path_source() { + python3 - "$PYPROJECT" "$1" "$2" <<'PY' +import pathlib +import re +import sys + +pyproject_path = pathlib.Path(sys.argv[1]) +package = sys.argv[2] +expected_path = sys.argv[3] +text = pyproject_path.read_text() + +source_block_match = re.search( + rf"^{re.escape(package)}\s*=\s*\[(.*?)^\]", + text, + flags=re.MULTILINE | re.DOTALL, +) +if source_block_match is None: + raise SystemExit(f"ERROR: [tool.uv.sources] entry not found for {package}") + +block_start, block_end = source_block_match.span(1) +block = source_block_match.group(1) + +entry_pattern = re.compile(r"\{[^\n]*path\s*=\s*\"([^\"]+)\"[^\n]*\}") +matches = list(entry_pattern.finditer(block)) +aarch64_matches = [ + match + for match in matches + if "platform_machine == 'aarch64'" in match.group(0) + and "scripts/deployment/dgpu/wheels/" in match.group(1) +] +if len(aarch64_matches) != 1: + raise SystemExit( + f"ERROR: expected exactly one dGPU aarch64 path source for {package}, " + f"found {len(aarch64_matches)}" + ) + +match = aarch64_matches[0] +current_path = match.group(1) +if current_path == expected_path: + print(f"{package} path source already points to {expected_path}") + raise SystemExit(0) + +entry = match.group(0) +updated_entry = entry.replace(f'path = "{current_path}"', f'path = "{expected_path}"') +updated_block = block[: match.start()] + updated_entry + block[match.end() :] +updated_text = text[:block_start] + updated_block + text[block_end:] +pyproject_path.write_text(updated_text) +print(f"Updated {package} path source: {current_path} -> {expected_path}") +PY +} + +wheel_path_for() { + package_prefix="$1" + version="$2" + printf "%s/%s-%s-${CP_TAG}-${CP_TAG}-linux_aarch64.whl" "$WHEEL_DIR" "$package_prefix" "$version" +} + +# flash-attn now ships as official cu12torch2.9 cp312 release wheels for both +# x86_64 and aarch64 (see [tool.uv.sources] in pyproject.toml), so the dGPU +# bootstrap only owns the aarch64 torchcodec wheel (no PyPI aarch64 wheel). +TORCHCODEC_VERSION="$(resolve_dependency_version "torchcodec")" +TORCHCODEC_SOURCE_VERSION="$(printf "%s" "$TORCHCODEC_VERSION" | sed -E 's/a[0-9]+$//')" + +TORCHCODEC_WHEEL="$(wheel_path_for "torchcodec" "$TORCHCODEC_VERSION")" +TORCHCODEC_PATH="scripts/deployment/dgpu/wheels/$(basename "$TORCHCODEC_WHEEL")" + +echo "Expected dGPU aarch64 wheels from dependency pins:" +echo " torchcodec==$TORCHCODEC_VERSION -> $TORCHCODEC_PATH" + +update_pyproject_path_source "torchcodec" "$TORCHCODEC_PATH" + +if [ "${DGPU_WHEEL_BOOTSTRAP_VALIDATE_ONLY:-0}" = "1" ]; then + exit 0 +fi + +if [ "$(uname -m)" != "aarch64" ]; then + echo "dGPU wheel bootstrap is only needed on aarch64; skipping." + exit 0 +fi + +if [ -f "$TORCHCODEC_WHEEL" ]; then + echo "Matching dGPU aarch64 torchcodec wheel already exists; skipping source build." + exit 0 +fi + +if ! command -v uv &> /dev/null; then + echo "ERROR: uv is required to bootstrap dGPU wheels." >&2 + exit 1 +fi + +BUILD_VENV="${DGPU_WHEEL_BUILD_VENV:-/tmp/gr00t-dgpu-wheel-build-venv}" +BUILD_PYTHON="$BUILD_VENV/bin/python" +TMP_BUILD_DIRS=() +trap 'rm -rf "$BUILD_VENV"; for _d in "${TMP_BUILD_DIRS[@]:-}"; do rm -rf "$_d"; done' EXIT + +rm -rf "$BUILD_VENV" +"$PYTHON_BIN" -m venv "$BUILD_VENV" + +uv_pip_install_retry() { + for attempt in 1 2 3 4 5; do + if uv pip install "$@"; then + return 0 + fi + sleep $((attempt * 10)) + done + return 1 +} + +# Build against the project's pinned torch / triton / numpy (derived from +# pyproject.toml) so the generated wheel's ABI matches the runtime stack. +# Hardcoded versions silently produce a wheel for the wrong torch after a bump. +TORCH_VERSION="$(resolve_dependency_version "torch")" +TRITON_VERSION="$(resolve_dependency_version "triton")" +NUMPY_VERSION="$(resolve_dependency_version "numpy")" + +uv_pip_install_retry --python "$BUILD_PYTHON" \ + --index-url https://download.pytorch.org/whl/cu128 \ + --extra-index-url https://pypi.org/simple \ + "torch==${TORCH_VERSION}" "triton==${TRITON_VERSION}" "numpy==${NUMPY_VERSION}" +uv_pip_install_retry --python "$BUILD_PYTHON" pip setuptools wheel packaging ninja + +SITE_PKGS=$("$BUILD_PYTHON" - <<'PY' +import site + +print(site.getsitepackages()[0]) +PY +) +NVIDIA_LIB_DIRS="$(find "${SITE_PKGS}/nvidia" -name "lib" -type d 2>/dev/null | tr '\n' ':')" +export LD_LIBRARY_PATH="/usr/local/cuda/lib64:${SITE_PKGS}/torch/lib:${NVIDIA_LIB_DIRS}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +export CUDA_HOME=/usr/local/cuda +export CUDA_PATH=/usr/local/cuda +export CPATH="${CUDA_HOME}/include:${CPATH:-}" +export C_INCLUDE_PATH="${CUDA_HOME}/include:${C_INCLUDE_PATH:-}" +export CPLUS_INCLUDE_PATH="${CUDA_HOME}/include:${CPLUS_INCLUDE_PATH:-}" +export MAX_JOBS="${MAX_JOBS:-$(nproc)}" +export NVCC_THREADS="${NVCC_THREADS:-1}" +export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:-$(nproc)}" + +build_torchcodec() { + if [ -f "$TORCHCODEC_WHEEL" ]; then + echo "torchcodec wheel already exists: $TORCHCODEC_WHEEL" + return + fi + + echo "No dGPU aarch64 torchcodec wheel found; building from source..." + rm -rf /tmp/torchcodec + TMP_BUILD_DIRS+=(/tmp/torchcodec) + git clone --depth 1 --branch "v${TORCHCODEC_SOURCE_VERSION}" \ + https://github.com/pytorch/torchcodec.git /tmp/torchcodec + rm -rf /tmp/torchcodec/.git + + I_CONFIRM_THIS_IS_NOT_A_LICENSE_VIOLATION=1 "$BUILD_PYTHON" -m pip wheel \ + --no-build-isolation \ + --no-deps \ + --wheel-dir "$WHEEL_DIR" \ + /tmp/torchcodec + + if [ ! -f "$TORCHCODEC_WHEEL" ]; then + echo "ERROR: torchcodec source build did not produce expected wheel:" >&2 + echo " $TORCHCODEC_WHEEL" >&2 + echo "Available torchcodec wheels:" >&2 + find "$WHEEL_DIR" -maxdepth 1 -name 'torchcodec-*.whl' -print >&2 + exit 1 + fi +} + +cd "$REPO_ROOT" +build_torchcodec + +echo "dGPU aarch64 wheel bootstrap complete:" +ls -lh "$TORCHCODEC_WHEEL" diff --git a/scripts/deployment/dgpu/install_deps.sh b/scripts/deployment/dgpu/install_deps.sh new file mode 100755 index 000000000..3e22b5848 --- /dev/null +++ b/scripts/deployment/dgpu/install_deps.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# install_deps.sh — One-time install of GR00T deps on dGPU systems (x86_64 or aarch64 GB200, CUDA 12.8+) +# Requires an NVIDIA discrete GPU with a CUDA 12.x or 13.x driver already installed. +# After install, activate with: source .venv/bin/activate +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" + +# Use sudo only when not already root +SUDO="" +if [ "$(id -u)" -ne 0 ]; then + SUDO="sudo" +fi + +ARCH=$(uname -m) + +# ────────────────────────────────────────────────────────────────────────────── +# System dependencies +# ────────────────────────────────────────────────────────────────────────────── + +# FFmpeg runtime libs — required by torchcodec at runtime +# libaio-dev — required by deepspeed async I/O ops +echo "Installing system dependencies..." +$SUDO apt-get update -qq +$SUDO apt-get install -y --no-install-recommends ffmpeg libaio-dev + +# CUDA toolkit — required by deepspeed (needs CUDA_HOME / nvcc to check op compatibility) +# Skip if already installed +if [ ! -d "/usr/local/cuda" ]; then + echo "CUDA toolkit not found. Installing cuda-toolkit-12-8..." + # Add NVIDIA CUDA apt repo if not already configured + if ! apt-cache show cuda-toolkit-12-8 &>/dev/null; then + UBUNTU_VERSION=$(. /etc/os-release && echo "${VERSION_ID//.}") + # aarch64 GB200 uses the sbsa (server base system architecture) repo + if [ "$ARCH" = "aarch64" ]; then + CUDA_REPO_ARCH="sbsa" + else + CUDA_REPO_ARCH="x86_64" + fi + KEYRING_URL="https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/${CUDA_REPO_ARCH}/cuda-keyring_1.1-1_all.deb" + echo "Adding NVIDIA CUDA apt repository..." + curl -fsSL "$KEYRING_URL" -o /tmp/cuda-keyring.deb + $SUDO dpkg -i /tmp/cuda-keyring.deb + rm /tmp/cuda-keyring.deb + $SUDO apt-get update -qq + fi + $SUDO apt-get install -y --no-install-recommends cuda-toolkit-12-8 +else + echo "CUDA toolkit already installed at /usr/local/cuda." +fi + +# ────────────────────────────────────────────────────────────────────────────── +# Environment +# ────────────────────────────────────────────────────────────────────────────── + +# Install uv if not present +if ! command -v uv &> /dev/null; then + echo "Installing uv..." + curl -LsSf https://astral.sh/uv/install.sh | sh + export PATH="$HOME/.local/bin:$PATH" +fi + +# ────────────────────────────────────────────────────────────────────────────── +# Python environment +# ────────────────────────────────────────────────────────────────────────────── + +cd "$REPO_ROOT" + +echo "Running uv sync (torch==2.7.1+cu128 from pytorch-cu128 index)..." +uv sync + +echo "Installing package in editable mode..." +uv pip install -e . + +echo "" +echo "Install complete! Activate with:" +echo " source .venv/bin/activate" diff --git a/scripts/deployment/dgpu/wheels/torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl b/scripts/deployment/dgpu/wheels/torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl new file mode 100644 index 000000000..2033155f7 --- /dev/null +++ b/scripts/deployment/dgpu/wheels/torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c5bf377f922d2126041b3c49846504083a015d44979ca594e368ccc8c4c0814 +size 512641 diff --git a/scripts/deployment/export_onnx_n1d6.py b/scripts/deployment/export_onnx_n1d6.py deleted file mode 100755 index df1ec44dc..000000000 --- a/scripts/deployment/export_onnx_n1d6.py +++ /dev/null @@ -1,396 +0,0 @@ -#!/usr/bin/env python3 -""" -Export GrootN1d6 model components to ONNX for TensorRT optimization. - -This script exports the DiT (Diffusion Transformer) -of the GrootN1d6 model to ONNX format for TensorRT conversion. - -Usage: - python export_onnx_n1d6.py \ - --model_path /path/to/checkpoint \ - --dataset_path /path/to/dataset \ - --output_dir ./groot_n1d6_onnx -""" - -import argparse -import logging -import os -from typing import Any - -from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader -from gr00t.data.dataset.sharded_single_step_dataset import extract_step_data -from gr00t.data.embodiment_tags import EmbodimentTag -from gr00t.policy.gr00t_policy import Gr00tPolicy -import numpy as np -import torch -import torch.onnx - - -# Set up logging -logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") -logger = logging.getLogger(__name__) - - -class DiTInputCapture: - """ - Helper class to capture DiT forward pass inputs during inference. - """ - - def __init__(self): - self.captured = False - self.sa_embs = None - self.vl_embs = None - self.timestep = None - self.image_mask = None - self.backbone_attention_mask = None - - def hook_fn(self, module, args, kwargs): - """Pre-forward hook to capture inputs.""" - if not self.captured: - self.sa_embs = kwargs["hidden_states"].detach().cpu().clone() - self.vl_embs = kwargs["encoder_hidden_states"].detach().cpu().clone() - self.timestep = kwargs["timestep"].detach().cpu().clone() - i_mask = kwargs.get("image_mask") - if i_mask is not None: - self.image_mask = i_mask.detach().cpu().clone() - bb_mask = kwargs.get("backbone_attention_mask") - if bb_mask is not None: - self.backbone_attention_mask = bb_mask.detach().cpu().clone() - - self.captured = True - logger.info(" Captured DiT inputs:") - logger.info(f" sa_embs shape: {self.sa_embs.shape}") - logger.info(f" vl_embs shape: {self.vl_embs.shape}") - logger.info( - f" timestep shape: {self.timestep.shape if self.timestep is not None else 'None'}" - ) - logger.info( - f" image_mask shape: {self.image_mask.shape if self.image_mask is not None else 'None'}" - ) - logger.info( - f" backbone_attention_mask shape: {self.backbone_attention_mask.shape if self.backbone_attention_mask is not None else 'None'}" - ) - - -def parse_observation_gr00t( - obs: dict[str, Any], modality_configs: dict[str, Any] -) -> dict[str, Any]: - new_obs = {} - for modality in ["video", "state", "language"]: - new_obs[modality] = {} - for key in modality_configs[modality].modality_keys: - if modality == "language": - parsed_key = key - else: - parsed_key = f"{modality}.{key}" - arr = obs[parsed_key] - # Add batch dimension - if isinstance(arr, str): - new_obs[modality][key] = [[arr]] - else: - new_obs[modality][key] = arr[None, :] - return new_obs - - -def prepare_observation(policy, dataset, traj_idx=0): - """ - Prepare a single observation for inference. - - Args: - policy: Loaded Gr00tPolicy - dataset: Dataset loader - traj_idx: Trajectory index to use - - Returns: - Observation dictionary ready for policy.get_action() - """ - logger.info(f"\nPreparing observation from trajectory {traj_idx}...") - - # Load trajectory - traj = dataset[traj_idx] - - # Get modality configs - modality_configs = policy.get_modality_config() - - # Extract first step - data_point = extract_step_data( - traj, - 0, # First timestep - modality_configs=modality_configs, - embodiment_tag=policy.embodiment_tag, - ) - - # Build observation dict - observation = {} - for key, value in data_point.states.items(): - observation[f"state.{key}"] = value - - for key, value in data_point.images.items(): - observation[f"video.{key}"] = np.array(value) - - for key in modality_configs["language"].modality_keys: - observation[key] = data_point.text - - # Parse observation to expected format - parsed_obs = parse_observation_gr00t(observation, modality_configs) - - logger.info(" Observation prepared") - return parsed_obs - - -def export_dit_to_onnx( - policy: Gr00tPolicy, captured_inputs: DiTInputCapture, output_path: str, use_bf16: bool = True -): - """ - Export the DiT model to ONNX. - - Args: - policy: Loaded policy with model - captured_inputs: Captured input tensors from actual inference - output_path: Path to save ONNX model - use_bf16: Whether to export in FP16 precision - """ - logger.info("\n" + "=" * 80) - logger.info("Exporting DiT to ONNX") - logger.info("=" * 80) - - # Extract DiT model - dit_model = policy.model.action_head.model - dit_model.eval() - - # NOTE: Model is already in BF16 by default (from checkpoint) - # We only need to set the dtype for dummy inputs - if use_bf16: - # Use BF16 to match model's native precision and avoid accuracy loss - dtype = torch.bfloat16 - logger.info("Using BF16 precision (native model precision)") - else: - dtype = torch.float32 - - dit_model = dit_model.cuda() - - sa_embs = torch.randn(captured_inputs.sa_embs.shape, dtype=dtype, device="cuda") - vl_embs = torch.randn(captured_inputs.vl_embs.shape, dtype=dtype, device="cuda") - timestep = torch.ones(captured_inputs.timestep.shape, dtype=torch.int64, device="cuda") - - export_inputs = [sa_embs, vl_embs, timestep] - input_names = ["sa_embs", "vl_embs", "timestep"] - # Establish the dynamix_axes: - # For example: - # vl_embs dimensions are [B, vl_seq_len, vl_embed] - # The axes of B and vl_seq_len can vary i.e. batch sz and num tokens in input - # vl_embed is fixed at 2048 and hence is not in dynalic)axes - dynamic_axes = { - "sa_embs": {0: "batch_size", 1: "sa_seq_len"}, - "vl_embs": {0: "batch_size", 1: "vl_seq_len"}, - "timestep": {0: "batch_size"}, - "output": {0: "batch_size", 1: "sa_seq_len"}, - } - - image_mask = None - if captured_inputs.image_mask is not None: - image_mask = torch.ones(captured_inputs.image_mask.shape, dtype=torch.bool, device="cuda") - export_inputs.append(image_mask) - input_names.append("image_mask") - dynamic_axes["image_mask"] = {0: "batch_size", 1: "vl_seq_len"} - - backbone_attention_mask = None - if captured_inputs.backbone_attention_mask is not None: - backbone_attention_mask = torch.ones( - captured_inputs.backbone_attention_mask.shape, dtype=torch.bool, device="cuda" - ) - export_inputs.append(backbone_attention_mask) - input_names.append("backbone_attention_mask") - dynamic_axes["backbone_attention_mask"] = {0: "batch_size", 1: "vl_seq_len"} - - logger.info("Export input shapes:") - logger.info(f" sa_embs: {sa_embs.shape} ({sa_embs.dtype})") - logger.info(f" vl_embs: {vl_embs.shape} ({vl_embs.dtype})") - logger.info(f" timestep: {timestep.shape} ({timestep.dtype})") - if image_mask is not None: - logger.info(f" image_mask: {image_mask.shape} ({image_mask.dtype})") - if backbone_attention_mask is not None: - logger.info( - f" backbone_attention_mask: {backbone_attention_mask.shape} ({backbone_attention_mask.dtype})" - ) - - # Create output directory - os.makedirs(os.path.dirname(output_path), exist_ok=True) - - # Export to ONNX - logger.info(f"Exporting to {output_path}...") - - # Create a wrapper to handle keyword arguments - # torch.onnx.export uses positional args: `dit.forward(arg1, arg2...)` - # DiT module uses keyword args: `dit.forward(hidden_states=....)` - # The DiTWrapper handles this translation - class DiTWrapper(torch.nn.Module): - def __init__(self, dit_model, has_backbone_mask): - super().__init__() - self.dit_model = dit_model - self.has_backbone_mask = has_backbone_mask - - def forward(self, sa_embs, vl_embs, timestep, image_mask, backbone_attention_mask=None): - # Call DiT with keyword arguments - if self.has_backbone_mask: - return self.dit_model( - sa_embs, - vl_embs, - timestep, - image_mask=image_mask, - backbone_attention_mask=backbone_attention_mask, - ) - else: - return self.dit_model(sa_embs, vl_embs, timestep, image_mask=image_mask) - - has_backbone_mask = backbone_attention_mask is not None - wrapped_model = DiTWrapper(dit_model, has_backbone_mask) - wrapped_model.eval() - - with torch.inference_mode(): - torch.onnx.export( - wrapped_model, - tuple(export_inputs), - output_path, - input_names=input_names, - output_names=["output"], - opset_version=19, - do_constant_folding=True, - dynamic_axes=dynamic_axes, - export_params=True, - ) - - logger.info(" DiT exported successfully!") - - # Verify the export - logger.info("\nVerifying ONNX export...") - import onnx - - # Get file size first - file_size_mb = os.path.getsize(output_path) / (1024 * 1024) - logger.info(f"Model size on disk: {file_size_mb:.2f} MB") - - # Check if external data file exists (for large models) - external_data_path = output_path.replace(".onnx", ".onnx.data") - if os.path.exists(external_data_path): - external_size_mb = os.path.getsize(external_data_path) / (1024 * 1024) - logger.info(f"External data size: {external_size_mb:.2f} MB") - logger.info(f"Total model size: {file_size_mb + external_size_mb:.2f} MB") - - # For large models, validate using file path instead of loading into memory - try: - # Use model path checking for large models - onnx.checker.check_model(output_path) - logger.info(" ONNX model is valid!") - except ValueError as e: - if "too large" in str(e): - # Model is large, just verify it can be loaded - logger.info("Model is very large, skipping full validation...") - try: - onnx.shape_inference.infer_shapes_path(output_path, output_path + ".tmp") - os.remove(output_path + ".tmp") - logger.info(" ONNX model structure verified!") - except Exception as e2: - logger.warning(f"Could not fully validate (this is OK): {e2}") - logger.info(" ONNX model exported (validation skipped for large model)") - else: - raise - - -def main(args): - logger.info("=" * 80) - logger.info("GrootN1d6 ONNX Export Script") - logger.info("=" * 80) - logger.info(f"Model path: {args.model_path}") - logger.info(f"Dataset path: {args.dataset_path}") - logger.info(f"Embodiment: {args.embodiment_tag}") - logger.info(f"Output directory: {args.output_dir}") - logger.info("=" * 80) - - # Step 1: Load the policy - logger.info("\n[Step 1] Loading policy...") - policy = Gr00tPolicy( - embodiment_tag=args.embodiment_tag, - model_path=args.model_path, - device="cuda", - ) - logger.info(" Policy loaded") - - # Step 2: Load dataset - logger.info("\n[Step 2] Loading dataset...") - dataset = LeRobotEpisodeLoader( - dataset_path=args.dataset_path, - modality_configs=policy.get_modality_config(), - video_backend=args.video_backend, - video_backend_kwargs=None, - ) - logger.info(f" Dataset loaded ({len(dataset)} trajectories)") - - # Step 3: Capture DiT inputs - logger.info("\n[Step 3] Capturing DiT inputs from actual inference...") - - # Set up hook to capture inputs - capture = DiTInputCapture() - hook = policy.model.action_head.model.register_forward_pre_hook( - capture.hook_fn, with_kwargs=True - ) - - # Run one inference to capture shapes - observation = prepare_observation(policy, dataset, traj_idx=0) - logger.info("Running inference to capture shapes...") - with torch.inference_mode(): - _ = policy.get_action(observation) - - # Remove hook - hook.remove() - - if not capture.captured: - logger.error(" Failed to capture DiT inputs!") - return - - # Step 4: Export DiT - logger.info("\n[Step 4] Exporting DiT to ONNX...") - dit_output_path = os.path.join(args.output_dir, "dit_model.onnx") - export_dit_to_onnx( - policy=policy, captured_inputs=capture, output_path=dit_output_path, use_bf16=True - ) - - # Summary - logger.info("\n" + "=" * 80) - logger.info("EXPORT COMPLETE!") - logger.info("=" * 80) - logger.info(f"\nExported files in: {args.output_dir}") - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Export GrootN1d6 model to ONNX") - parser.add_argument( - "--model_path", type=str, required=True, help="Path to the model checkpoint" - ) - parser.add_argument( - "--dataset_path", - type=str, - required=True, - help="Path to the dataset (used to capture input shapes)", - ) - parser.add_argument( - "--embodiment_tag", - type=EmbodimentTag, - default=EmbodimentTag.GR1, - help="Embodiment tag (default: GR1)", - ) - parser.add_argument( - "--output_dir", - type=str, - default="./groot_n1d6_onnx", - help="Output directory for ONNX models", - ) - parser.add_argument( - "--video_backend", - type=str, - default="torchcodec", - help="Options: ['decord', 'torchvision_av', 'torchcodec']", - ) - - args = parser.parse_args() - main(args) diff --git a/scripts/deployment/export_onnx_n1d7.py b/scripts/deployment/export_onnx_n1d7.py new file mode 100755 index 000000000..bb8086a65 --- /dev/null +++ b/scripts/deployment/export_onnx_n1d7.py @@ -0,0 +1,1580 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Export GR00T N1.7 model components to ONNX for TensorRT optimization. + +Supports three export modes: + - dit_only: Export only the DiT (backward compatible with N1.6). + - action_head: Export 4 action head components (ViT + LLM stay in PyTorch). + - full_pipeline: Export ViT + LLM + 4 action head components. Lightweight + glue ops (embed_tokens, masked_scatter, get_rope_index, + VLLN) remain in PyTorch. Referred to as 'n17_full_pipeline' + by the engine-loading code (trt_model_forward.py, + build_trt_pipeline.py) and as 'trt_full_pipeline' by the + standalone_inference_script.py --inference-mode flag; + both names describe the same engine set. + +Usage: + # Download finetuned model first (HF doesn't support nested repo paths) + uv run hf download nvidia/GR00T-N1.7-LIBERO --include "libero_10/config.json" "libero_10/embodiment_id.json" "libero_10/model-*.safetensors" "libero_10/model.safetensors.index.json" "libero_10/processor_config.json" "libero_10/statistics.json" --local-dir checkpoints/GR00T-N1.7-LIBERO + + # DiT only (default). N1.7 TRT export uses the legacy ONNX exporter + # explicitly (`dynamo=False`) so dynamic axes remain TensorRT-friendly. + python export_onnx_n1d7.py \\ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \\ + --dataset-path demo_data/libero_demo \\ + --output-dir ./gr00t_trt_deployment/onnx + + # Action head (4 components) + python export_onnx_n1d7.py \\ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \\ + --dataset-path demo_data/libero_demo \\ + --output-dir ./gr00t_trt_deployment/onnx \\ + --export-mode action_head +""" + +import copy +from dataclasses import dataclass +import json +import logging +import os +from pathlib import Path +from typing import Literal, Optional + +from _trt_contract import EXPORT_METADATA_SCHEMA_VERSION +from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader +from gr00t.data.dataset.sharded_single_step_dataset import extract_step_data +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.utils import parse_observation_gr00t +from gr00t.deployment.modes import ExportMode +from gr00t.model.modules.qwen3_backbone import _assign_inv_freq, recompute_vision_rotary_inv_freq +from gr00t.policy.gr00t_policy import Gr00tPolicy +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.onnx +import tyro + + +# Set up logging +logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") +logger = logging.getLogger(__name__) + + +def _consolidate_external_data(onnx_path: str) -> None: + """Merge scattered external-data files into a single .data file next to the ONNX model.""" + import onnx + from onnx.external_data_helper import convert_model_to_external_data + + onnx_dir = os.path.dirname(onnx_path) + onnx_name = os.path.basename(onnx_path) + data_file = onnx_name + ".data" + + # Check if there are scattered files (files without .onnx/.json extension) + scattered = [ + f + for f in os.listdir(onnx_dir) + if os.path.isfile(os.path.join(onnx_dir, f)) + and not f.endswith((".onnx", ".json", ".data")) + and f != data_file + ] + if not scattered: + return + + logger.info(f" Consolidating {len(scattered)} external data files into {data_file}...") + model = onnx.load(onnx_path, load_external_data=True) + convert_model_to_external_data( + model, all_tensors_to_one_file=True, location=data_file, size_threshold=0 + ) + onnx.save(model, onnx_path) + + # Clean up scattered files + for f in scattered: + os.remove(os.path.join(onnx_dir, f)) + logger.info(f" Consolidated and cleaned up {len(scattered)} files.") + + +def verify_onnx_export(onnx_path: str) -> None: + """Load and check the exported ONNX model for validity.""" + import onnx + + logger.info(f" Verifying {onnx_path} ...") + onnx.checker.check_model(onnx_path) + logger.info(" ONNX model verified successfully.") + + +def verify_onnx_with_ort( + onnx_path: str, + pytorch_module: torch.nn.Module, + sample_inputs: dict[str, torch.Tensor], + output_names: list[str], + label: str = "model", +) -> dict[str, float]: + """Run ONNX Runtime inference and compare against PyTorch output. + + Returns dict of {output_name: cosine_similarity}. + Requires onnxruntime-gpu; skips gracefully if not installed. + """ + try: + import onnxruntime as ort + except ImportError: + logger.warning(" onnxruntime not installed — skipping ORT verification") + return {} + + logger.info(f" ORT verification for {label}...") + + # Run PyTorch + with torch.inference_mode(): + pt_inputs = tuple(sample_inputs[name] for name in sample_inputs) + pt_outputs = pytorch_module(*pt_inputs) + if not isinstance(pt_outputs, (tuple, list)): + pt_outputs = (pt_outputs,) + + # Run ONNX Runtime + providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + sess = ort.InferenceSession(onnx_path, providers=providers) + ort_inputs = {name: t.cpu().numpy() for name, t in sample_inputs.items()} + ort_outputs = sess.run(output_names, ort_inputs) + + # Compare + results = {} + for i, name in enumerate(output_names): + pt_flat = pt_outputs[i].float().flatten().cpu() + ort_flat = torch.tensor(ort_outputs[i]).float().flatten() + cosine = torch.nn.functional.cosine_similarity( + pt_flat.unsqueeze(0), ort_flat.unsqueeze(0) + ).item() + results[name] = cosine + logger.info(f" {name}: ORT vs PyTorch cosine = {cosine:.6f}") + + return results + + +# ============================================================ +# Input Capture +# ============================================================ + + +class DiTInputCapture: + """Capture DiT forward pass inputs during inference via a pre-forward hook.""" + + def __init__(self): + self.captured = False + self.sa_embs = None + self.vl_embs = None + self.timestep = None + self.image_mask = None + self.backbone_attention_mask = None + + def hook_fn(self, module, args, kwargs): + """Pre-forward hook to capture inputs.""" + if not self.captured: + self.sa_embs = kwargs["hidden_states"].detach().cpu().clone() + self.vl_embs = kwargs["encoder_hidden_states"].detach().cpu().clone() + self.timestep = kwargs["timestep"].detach().cpu().clone() + i_mask = kwargs.get("image_mask") + if i_mask is not None: + self.image_mask = i_mask.detach().cpu().clone() + bb_mask = kwargs.get("backbone_attention_mask") + if bb_mask is not None: + self.backbone_attention_mask = bb_mask.detach().cpu().clone() + + self.captured = True + logger.info(" Captured DiT inputs:") + logger.info(f" sa_embs: {self.sa_embs.shape}") + logger.info(f" vl_embs: {self.vl_embs.shape}") + logger.info(f" timestep: {self.timestep.shape}") + if self.image_mask is not None: + logger.info(f" image_mask: {self.image_mask.shape}") + if self.backbone_attention_mask is not None: + logger.info(f" backbone_attention_mask: {self.backbone_attention_mask.shape}") + + +class ViTInputCapture: + """Capture ViT (VisionModel) forward inputs/outputs during inference.""" + + def __init__(self): + self.captured = False + self.pixel_values_shape = None + self.grid_thw = None + self.output_shape = None + self.deepstack_shapes = [] + + def hook_fn(self, module, args, kwargs, output): + if not self.captured: + self.pixel_values_shape = args[0].shape + grid = args[1] if len(args) > 1 else kwargs.get("grid_thw") + self.grid_thw = grid.detach().cpu().clone() + if isinstance(output, tuple): + self.output_shape = output[0].shape + self.deepstack_shapes = [f.shape for f in output[1]] + else: + self.output_shape = output.shape + self.captured = True + logger.info(" Captured ViT inputs:") + logger.info(f" pixel_values: {self.pixel_values_shape}") + logger.info(f" grid_thw: {self.grid_thw.tolist()}") + logger.info(f" output: {self.output_shape}") + logger.info(f" deepstack: {len(self.deepstack_shapes)} features") + + +class LLMInputCapture: + """Capture LLM (Qwen3VLTextModel) inputs during inference via a pre-forward hook. + + Captures inputs_embeds, position_ids, attention_mask, visual_pos_masks, + and deepstack_visual_embeds — everything needed to reproduce the LLM forward. + """ + + def __init__(self): + self.captured = False + self.inputs_embeds = None + self.position_ids = None + self.attention_mask = None + self.visual_pos_masks = None + self.deepstack_visual_embeds = None # list of tensors + + def hook_fn(self, module, args, kwargs): + if not self.captured: + ie = kwargs.get("inputs_embeds") + if ie is None and len(args) > 0: + ie = args[0] + if ie is not None: + self.inputs_embeds = ie.detach().cpu().clone() + + pid = kwargs.get("position_ids") + if pid is not None: + self.position_ids = pid.detach().cpu().clone() + + am = kwargs.get("attention_mask") + if am is not None: + self.attention_mask = am.detach().cpu().clone() + + vpm = kwargs.get("visual_pos_masks") + if vpm is not None: + self.visual_pos_masks = vpm.detach().cpu().clone() + + dve = kwargs.get("deepstack_visual_embeds") + if dve is not None: + self.deepstack_visual_embeds = [d.detach().cpu().clone() for d in dve] + + self.captured = True + logger.info(" Captured LLM inputs:") + if self.inputs_embeds is not None: + logger.info(f" inputs_embeds: {self.inputs_embeds.shape}") + if self.position_ids is not None: + logger.info(f" position_ids: {self.position_ids.shape}") + if self.attention_mask is not None: + logger.info(f" attention_mask: {self.attention_mask.shape}") + if self.visual_pos_masks is not None: + logger.info(f" visual_pos_masks: {self.visual_pos_masks.shape}") + if self.deepstack_visual_embeds is not None: + logger.info( + f" deepstack: {len(self.deepstack_visual_embeds)} tensors, " + f"shapes: {[d.shape for d in self.deepstack_visual_embeds]}" + ) + + +# ============================================================ +# ViT Export: ONNX-friendly attention + wrapper +# ============================================================ + + +def _apply_rotary_real(x, cos, sin): + """Apply rotary position embeddings using only real-valued ops (no complex). + + Uses float32 internally to match transformers' apply_rotary_pos_emb_vision + precision, then casts back to the original dtype. + + Args: + x: [seq, heads, head_dim] + cos, sin: [seq, head_dim] + Returns: + [seq, heads, head_dim] + """ + orig_dtype = x.dtype + x = x.float() + cos = cos.float().unsqueeze(1) # [seq, 1, head_dim] + sin = sin.float().unsqueeze(1) + half = x.shape[-1] // 2 + x1 = x[..., :half] + x2 = x[..., half:] + rotated = torch.cat((-x2, x1), dim=-1) + return (x * cos + rotated * sin).to(orig_dtype) + + +def _make_onnx_vision_attention_forward(attn_module, chunk_sizes=None): + """Create an ONNX-exportable attention forward for a single VisionAttention. + + Three key changes from the original: + 1. Replaces cu_seqlens-based splitting with static chunk splitting + (each image's patches attend only within their own chunk) + 2. Replaces apply_rotary_pos_emb_vision (uses complex numbers) with + real-valued rotate_half implementation + 3. Casts to float32 before softmax for TRT accuracy + + Args: + attn_module: The VisionAttention module to wrap + chunk_sizes: List of ints, number of patches per image. + e.g. [256, 256] for 2 images of 256 patches each. + If None or single chunk, does full-sequence attention. + """ + + def forward( + hidden_states, cu_seqlens=None, rotary_pos_emb=None, position_embeddings=None, **kwargs + ): + seq_length = hidden_states.shape[0] + qkv = attn_module.qkv(hidden_states) + qkv = qkv.reshape(seq_length, 3, attn_module.num_heads, -1) + qkv = qkv.permute(1, 0, 2, 3) + q, k, v = qkv.unbind(0) + # q, k, v: [seq_length, num_heads, head_dim] + + cos, sin = position_embeddings + q = _apply_rotary_real(q, cos, sin) + k = _apply_rotary_real(k, cos, sin) + + # Split by image chunks (mirrors cu_seqlens-based splitting in original) + # Each image's patches attend only within their own chunk. + if chunk_sizes is not None and len(chunk_sizes) > 1: + q_chunks = torch.split(q, chunk_sizes, dim=0) + k_chunks = torch.split(k, chunk_sizes, dim=0) + v_chunks = torch.split(v, chunk_sizes, dim=0) + + attn_outputs = [] + for q_c, k_c, v_c in zip(q_chunks, k_chunks, v_chunks): + # q_c, k_c, v_c: [chunk_seq, num_heads, head_dim] + q_c = q_c.transpose(0, 1) # [num_heads, chunk_seq, head_dim] + k_c = k_c.transpose(0, 1) + v_c = v_c.transpose(0, 1) + + w = torch.matmul(q_c, k_c.transpose(-2, -1)) * attn_module.scaling + w = w.to(torch.float32) + w = F.softmax(w, dim=-1) + w = w.to(v_c.dtype) + out = torch.matmul(w, v_c) # [num_heads, chunk_seq, head_dim] + attn_outputs.append(out.transpose(0, 1)) # [chunk_seq, num_heads, head_dim] + + attn_output = torch.cat(attn_outputs, dim=0) # [seq, num_heads, head_dim] + else: + # Single image: full-sequence attention + q = q.transpose(0, 1) # [num_heads, seq, head_dim] + k = k.transpose(0, 1) + v = v.transpose(0, 1) + + attn_weights = torch.matmul(q, k.transpose(-2, -1)) * attn_module.scaling + attn_weights = attn_weights.to(torch.float32) + attn_weights = F.softmax(attn_weights, dim=-1) + attn_weights = attn_weights.to(v.dtype) + attn_output = torch.matmul(attn_weights, v) + attn_output = attn_output.transpose(0, 1) # [seq, num_heads, head_dim] + + # [seq, num_heads, head_dim] → [seq, num_heads * head_dim] + attn_output = attn_output.reshape(seq_length, -1).contiguous() + attn_output = attn_module.proj(attn_output) + return attn_output + + return forward + + +def _patch_vision_attention_for_export(vision_model, chunk_sizes=None): + """Monkey-patch all VisionAttention.forward with ONNX-friendly versions. + + Args: + vision_model: The vision model whose attention blocks to patch + chunk_sizes: List of ints, patches per image (from grid_thw). + Enables per-image attention splitting. If None, full-sequence attention. + + Returns list of original forwards for restoration after export. + """ + originals = [] + for block in vision_model.blocks: + attn = block.attn + originals.append(attn.forward) + attn.forward = _make_onnx_vision_attention_forward(attn, chunk_sizes=chunk_sizes) + info = f" Patched {len(originals)} vision attention blocks for ONNX export" + if chunk_sizes and len(chunk_sizes) > 1: + info += f" (chunk_sizes={chunk_sizes})" + logger.info(info) + return originals + + +def _restore_vision_attention(vision_model, originals): + """Restore original attention forwards after export.""" + for block, orig in zip(vision_model.blocks, originals): + block.attn.forward = orig + + +class Qwen3VisionForExport(torch.nn.Module): + """ONNX-exportable wrapper for Qwen3-VL Vision Model. + + Pre-computes position embeddings and rotary embeddings for a fixed grid_thw + to avoid ComplexDouble operations that ONNX cannot handle. Replaces the + dynamic VisionModel.forward with a traceable version. + + Architecture: patch_embed → add pos_embed → blocks(attn+ffn) → deepstack → merger + """ + + def __init__(self, vision_model, grid_thw: torch.Tensor): + super().__init__() + self.patch_embed = vision_model.patch_embed + self.blocks = vision_model.blocks + self.merger = vision_model.merger + self.deepstack_visual_indexes = vision_model.deepstack_visual_indexes + self.deepstack_merger_list = vision_model.deepstack_merger_list + + # Pre-compute position embeddings (avoids grid_thw-dependent Python loops + # and ComplexDouble operations in rotary embedding computation) + with torch.no_grad(): + pos_embeds = vision_model.fast_pos_embed_interpolate(grid_thw) + rotary = vision_model.rot_pos_emb(grid_thw) + emb = torch.cat((rotary, rotary), dim=-1) + + self.register_buffer("_pos_embeds", pos_embeds.clone().detach().contiguous()) + self.register_buffer("_rot_cos", emb.cos().clone().detach().contiguous()) + self.register_buffer("_rot_sin", emb.sin().clone().detach().contiguous()) + + def forward(self, pixel_values): + hidden_states = self.patch_embed(pixel_values) + hidden_states = hidden_states + self._pos_embeds + + position_embeddings = (self._rot_cos, self._rot_sin) + + deepstack_features = [] + for layer_num, blk in enumerate(self.blocks): + hidden_states = blk( + hidden_states, + cu_seqlens=None, # not used by patched attention + position_embeddings=position_embeddings, + ) + if layer_num in self.deepstack_visual_indexes: + idx = self.deepstack_visual_indexes.index(layer_num) + deepstack_features.append(self.deepstack_merger_list[idx](hidden_states)) + + image_embeds = self.merger(hidden_states) + + if deepstack_features: + deepstack = torch.stack(deepstack_features) # [num_layers, N, D] + else: + deepstack = image_embeds.new_zeros(1, 1, 1) + + return image_embeds, deepstack + + +# ============================================================ +# Export Functions: ViT +# ============================================================ + + +def _restore_vision_rotary_inv_freq_fp32(vision, vision_config): + """Re-derive the ViT RoPE ``inv_freq`` in fp32 right before baking it into the engine. + + ``Gr00tPolicy`` loads the whole model in bf16 (``gr00t_policy.py``), which rounds + this non-persistent buffer even though the ViT itself is exported in fp32 for TRT + accuracy (max|delta| ~1.8e-4 for head_dim=64 -- a pure bf16 round-trip error). + Re-deriving the analytic fp32 value here keeps the baked rotary cos/sin at full + fp32 precision and lets the analytic-oracle guard verify a clean buffer instead of + the bf16-degraded one. Fails closed when the rotary submodule/layout is missing. + """ + rotary = getattr(vision, "rotary_pos_emb", None) + if rotary is None or not hasattr(rotary, "inv_freq"): + raise RuntimeError( + "ViT export: vision rotary_pos_emb/inv_freq not found; cannot rebuild the " + "rotary buffers before baking them into the engine (transformers Qwen3-VL " + "layout drift). Refusing to export unverified rotary." + ) + head_dim = vision_config.hidden_size // vision_config.num_heads + fp32_inv_freq = recompute_vision_rotary_inv_freq(rotary, head_dim // 2, rotary.inv_freq.device) + _assign_inv_freq(rotary, "inv_freq", fp32_inv_freq, persistent=False) + + +def _assert_vision_rotary_matches_analytic(vision, vision_config, *, atol=1e-5, rtol=1e-4): + """Abort export if the loaded ViT RoPE ``inv_freq`` drifts from the analytic oracle. + + The baked rotary cos/sin derive from this non-persistent buffer; the post-export + cosine checks are backend-vs-backend and cannot catch a common-mode error in it. + """ + rotary = getattr(vision, "rotary_pos_emb", None) + if rotary is None or not hasattr(rotary, "inv_freq"): + raise RuntimeError( + "ViT export: vision rotary_pos_emb/inv_freq not found; cannot verify the " + "rotary buffers before baking them into the engine (transformers Qwen3-VL " + "layout drift). Refusing to export unverified rotary." + ) + head_dim = vision_config.hidden_size // vision_config.num_heads + baked = rotary.inv_freq.detach().float() + analytic = recompute_vision_rotary_inv_freq(rotary, head_dim // 2, baked.device) + if not torch.allclose(baked, analytic, atol=atol, rtol=rtol): + max_err = (baked - analytic).abs().max().item() + raise RuntimeError( + "ViT export: loaded vision RoPE inv_freq diverges from the analytic oracle " + f"(max|delta|={max_err:.3e}); the baked rotary cos/sin would be silently wrong " + "and the backend-vs-backend cosine checks cannot catch it. Ensure " + "Qwen3Backbone._reset_rotary_inv_freq ran at load before exporting." + ) + + +def export_vit_to_onnx(policy, output_dir, captured_vit, use_bf16=True, batch_size=1): + """Export Qwen3-VL Vision Model to ONNX. + + Pre-computes position/rotary embeddings for the captured grid_thw to avoid + ComplexDouble ops. Monkey-patches attention to use standard SDPA (valid for + single-image inference where all patches attend to all patches). + + Input: pixel_values [num_patches * batch_size, C*T*pH*pW] + Output: image_embeds [num_merged_patches * batch_size, hidden_dim], + deepstack_features [num_layers, num_merged_patches * batch_size, hidden_dim] + """ + logger.info("\n" + "=" * 80) + logger.info("Exporting ViT (Qwen3-VL Vision) to ONNX") + logger.info("=" * 80) + + backbone = policy.model.backbone + qwen_model = backbone.model + vision = qwen_model.model.visual + + # Gr00tPolicy loads the model in bf16, which rounds the non-persistent RoPE + # inv_freq. The ViT is exported in fp32 for TRT accuracy, so re-derive the analytic + # fp32 inv_freq before baking cos/sin, then verify the (now fp32) buffer against the + # independent analytic oracle. + _restore_vision_rotary_inv_freq_fp32(vision, qwen_model.config.vision_config) + _assert_vision_rotary_matches_analytic(vision, qwen_model.config.vision_config) + + dtype = torch.bfloat16 if use_bf16 else torch.float32 + vision = vision.to(dtype).eval().cuda() + + # Compute chunk sizes from grid_thw for per-image attention splitting + # grid_thw: [num_images, 3] where each row is (temporal, height, width) + # cu_seqlens derived as: patches_per_image = h * w, repeated t times + grid_thw = captured_vit.grid_thw.to(device="cuda") + # For batch_size > 1, repeat grid_thw to tile position embeddings for all batch elements + if batch_size > 1: + grid_thw = grid_thw.repeat(batch_size, 1) + chunk_sizes = torch.repeat_interleave(grid_thw[:, 1] * grid_thw[:, 2], grid_thw[:, 0]).tolist() + logger.info(f" grid_thw: {grid_thw.tolist()}, chunk_sizes: {chunk_sizes}") + + # Patch attention for ONNX export with per-image chunk splitting + originals = _patch_vision_attention_for_export(vision, chunk_sizes=chunk_sizes) + + # Build wrapper with pre-computed position embeddings + wrapper = Qwen3VisionForExport(vision, grid_thw) + wrapper = wrapper.to(dtype).eval().cuda() + + # Input: only pixel_values (grid_thw is baked into pre-computed buffers) + # For batch_size > 1, scale num_patches by batch_size + pv_shape = captured_vit.pixel_values_shape + if batch_size > 1: + pv_shape = (pv_shape[0] * batch_size, pv_shape[1]) + pixel_values = torch.randn(pv_shape, dtype=dtype, device="cuda") + + logger.info(f" pixel_values: {pixel_values.shape} ({pixel_values.dtype})") + + precision_tag = "bf16" if use_bf16 else "fp32" + output_path = os.path.join(output_dir, f"vit_{precision_tag}.onnx") + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + output_names = ["image_embeds", "deepstack_features"] + + logger.info(f" Exporting to {output_path}...") + with torch.inference_mode(): + torch.onnx.export( + wrapper, + (pixel_values,), + output_path, + input_names=["pixel_values"], + output_names=output_names, + opset_version=19, + do_constant_folding=True, + export_params=True, + dynamo=False, + ) + + logger.info(" ViT exported successfully!") + _consolidate_external_data(output_path) + verify_onnx_export(output_path) + + # ORT verification: compare ONNX output against PyTorch wrapper + # Must run BEFORE restoring attention, since wrapper uses patched attention + verify_onnx_with_ort( + onnx_path=output_path, + pytorch_module=wrapper, + sample_inputs={"pixel_values": pixel_values}, + output_names=output_names, + label="ViT", + ) + + # Restore original attention + _restore_vision_attention(vision, originals) + + return output_path + + +# ============================================================ +# LLM Export: Qwen3-VL Text Model with Deepstack +# ============================================================ + + +def export_llm_to_onnx(policy, captured_llm, output_dir, use_bf16=True, batch_size=1): + """Export the Qwen3-VL text model (LLM) to ONNX. + + The LLM receives inputs_embeds (with vision tokens already scattered in), + pre-computed 3D position_ids, and deepstack visual embeddings. Position ID + computation (get_rope_index) stays in PyTorch at runtime — only the + transformer layers are exported to ONNX/TRT. + + Deepstack injection is handled inside the wrapper: visual features are added + to hidden states at the first N layers (N = number of deepstack features, + typically 3) at positions indicated by visual_pos_masks. + + Input: + inputs_embeds: [B, seq_len, hidden_size] + attention_mask: [B, seq_len] (int64, 1=attend, 0=pad) + position_ids: [3, B, seq_len] (temporal, height, width for 3D RoPE) + visual_pos_masks: [B, seq_len] (bool, True at visual token positions) + deepstack_0: [num_vis_tokens, hidden_size] (deepstack feature for layer 0) + deepstack_1: [num_vis_tokens, hidden_size] (deepstack feature for layer 1) + deepstack_2: [num_vis_tokens, hidden_size] (deepstack feature for layer 2) + Output: + embeddings: [B, seq_len, hidden_size] + """ + logger.info("\n" + "=" * 80) + logger.info("Exporting LLM (Qwen3-VL Text Model) to ONNX") + logger.info("=" * 80) + + backbone = policy.model.backbone + qwen_model = backbone.model # Qwen3VLForConditionalGeneration + inner_model = qwen_model.model # Qwen3VLModel + text_model = inner_model.language_model # Qwen3VLTextModel + select_layer = backbone.select_layer + + # Get text config and create eager-attention copy + from transformers.models.qwen3_vl.modeling_qwen3_vl import Qwen3VLTextRotaryEmbedding + + text_config = copy.deepcopy(text_model.config) + text_config._attn_implementation = "eager" + text_config.num_hidden_layers = select_layer + + logger.info( + f" LLM config: hidden_size={text_config.hidden_size}, " + f"num_layers={text_config.num_hidden_layers}, " + f"attn_implementation={text_config._attn_implementation}" + ) + + # Determine deepstack count + num_deepstack = 0 + if captured_llm.deepstack_visual_embeds is not None: + num_deepstack = len(captured_llm.deepstack_visual_embeds) + logger.info(f" Deepstack layers: {num_deepstack}") + + class LLMForExport(torch.nn.Module): + """ONNX-exportable wrapper for Qwen3-VL text model with deepstack. + + Key adaptations from the original Qwen3VLTextModel: + 1. Eager attention (no flash) — avoids ONNX-incompatible flash attention + 2. Simple causal mask — avoids COMPLEX128 ops from HuggingFace's mask + 3. Deepstack injection via torch.where — avoids boolean indexing + 4. Position IDs as explicit input — get_rope_index() stays in PyTorch + 5. Deepstack features as separate tensor inputs (not a Python list) + """ + + def __init__(self, config, n_deepstack): + super().__init__() + # Build fresh text model with eager attention + self.layers = nn.ModuleList( + [ + # Import the decoder layer class + __import__( + "transformers.models.qwen3_vl.modeling_qwen3_vl", + fromlist=["Qwen3VLTextDecoderLayer"], + ).Qwen3VLTextDecoderLayer(config, layer_idx) + for layer_idx in range(config.num_hidden_layers) + ] + ) + # NOTE: No final norm! Qwen3Backbone.forward returns + # hidden_states[-1] (pre-norm), not last_hidden_state (post-norm). + # The action head's VLLN handles normalization downstream. + self.rotary_emb = Qwen3VLTextRotaryEmbedding(config=config) + self.n_deepstack = n_deepstack + + def _simple_causal_mask(self, dtype, device, batch_size, seq_len, attention_mask): + """ONNX-compatible causal mask without complex type casts.""" + mask_value = torch.finfo(dtype).min * 0.5 + causal_mask = torch.triu( + torch.full((seq_len, seq_len), mask_value, device=device, dtype=dtype), + diagonal=1, + ) + causal_mask = causal_mask.unsqueeze(0).unsqueeze(0).expand(batch_size, 1, -1, -1) + + if attention_mask is not None and attention_mask.dim() == 2: + padding_mask = attention_mask[:, None, None, :].to(dtype) + padding_mask = (1.0 - padding_mask) * mask_value + causal_mask = causal_mask + padding_mask + + return causal_mask + + def _deepstack_add(self, hidden_states, visual_pos_masks, visual_embeds): + """ONNX-friendly deepstack injection using torch.where. + + Original uses boolean indexing: + hidden_states[visual_pos_masks, :] += visual_embeds + This is not ONNX-friendly. Instead we: + 1. Build a full-size delta tensor (zeros except at visual positions) + 2. Add it to hidden_states + """ + # visual_pos_masks: [B, seq_len] bool + # visual_embeds: [num_vis_tokens, hidden_size] + # hidden_states: [B, seq_len, hidden_size] + B, S, H = hidden_states.shape + + # Scatter visual_embeds into a full [B, S, H] tensor at masked positions + mask_expanded = visual_pos_masks.unsqueeze(-1) # [B, S, 1] + + # Build cumulative index for visual tokens per batch + # For single batch (B=1), this is straightforward + delta = torch.zeros_like(hidden_states) + # Use masked_scatter to place visual_embeds at the right positions + delta = delta.masked_scatter(mask_expanded.expand_as(delta), visual_embeds) + + hidden_states = hidden_states + delta + return hidden_states + + def forward( + self, + inputs_embeds, + attention_mask, + position_ids, + visual_pos_masks=None, + deepstack_0=None, + deepstack_1=None, + deepstack_2=None, + ): + batch_size, seq_len = inputs_embeds.shape[:2] + dtype = inputs_embeds.dtype + device = inputs_embeds.device + + # Build causal attention mask + attn_mask = self._simple_causal_mask(dtype, device, batch_size, seq_len, attention_mask) + + # Position IDs: [3, B, seq_len] → extract text_position_ids + text_position_ids = position_ids[0] # [B, seq_len] + + # Cache position for rotary embeddings + cache_position = torch.arange(seq_len, device=device) + + hidden_states = inputs_embeds + + # Compute rotary position embeddings (shared across layers) + position_embeddings = self.rotary_emb(hidden_states, position_ids) + + # Collect deepstack features into indexable structure + deepstack_list = [] + if deepstack_0 is not None: + deepstack_list.append(deepstack_0) + if deepstack_1 is not None: + deepstack_list.append(deepstack_1) + if deepstack_2 is not None: + deepstack_list.append(deepstack_2) + + # Decoder layers + for layer_idx, decoder_layer in enumerate(self.layers): + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attn_mask, + position_ids=text_position_ids, + past_key_values=None, + cache_position=cache_position, + position_embeddings=position_embeddings, + ) + hidden_states = layer_outputs + + # Deepstack injection at first N layers + if visual_pos_masks is not None and layer_idx < len(deepstack_list): + hidden_states = self._deepstack_add( + hidden_states, visual_pos_masks, deepstack_list[layer_idx] + ) + + # Return pre-norm hidden states (matching Qwen3Backbone.forward + # which uses hidden_states[-1], not last_hidden_state) + return hidden_states + + # Build wrapper and load weights + wrapper = LLMForExport(text_config, num_deepstack) + + # Copy weights from the existing truncated text model + # The text model has: embed_tokens, layers, norm, rotary_emb + # We only need layers, norm, rotary_emb (embed_tokens not used — we pass inputs_embeds) + src_state = text_model.state_dict() + dst_state = wrapper.state_dict() + loaded, skipped = 0, 0 + for key in dst_state: + if key in src_state: + dst_state[key] = src_state[key] + loaded += 1 + else: + skipped += 1 + logger.warning(f" Key not found in source: {key}") + wrapper.load_state_dict(dst_state) + logger.info(f" Loaded {loaded} weight tensors, skipped {skipped}") + + dtype = torch.bfloat16 if use_bf16 else torch.float32 + wrapper = wrapper.to(dtype).eval().cuda() + + # Create dummy inputs from captured shapes + seq_len = captured_llm.inputs_embeds.shape[1] + hidden_size = text_config.hidden_size + + inputs_embeds = torch.randn(batch_size, seq_len, hidden_size, dtype=dtype, device="cuda") + attention_mask = torch.ones(batch_size, seq_len, dtype=torch.int64, device="cuda") + position_ids = torch.zeros(3, batch_size, seq_len, dtype=torch.int64, device="cuda") + + export_inputs = [inputs_embeds, attention_mask, position_ids] + input_names = ["inputs_embeds", "attention_mask", "position_ids"] + # seq_len varies with tokenized input length — must be dynamic for TRT profile + llm_dynamic_axes = { + "inputs_embeds": {1: "seq_len"}, + "attention_mask": {1: "seq_len"}, + "position_ids": {2: "seq_len"}, + "embeddings": {1: "seq_len"}, + } + + if num_deepstack > 0 and captured_llm.visual_pos_masks is not None: + # Use actual captured mask so masked_scatter sizes match deepstack + vis_mask = captured_llm.visual_pos_masks.to(device="cuda") + if vis_mask.shape[0] == 1 and batch_size > 1: + vis_mask = vis_mask.expand(batch_size, -1) + export_inputs.append(vis_mask) + input_names.append("visual_pos_masks") + llm_dynamic_axes["visual_pos_masks"] = {1: "seq_len"} + + for i in range(num_deepstack): + ds = captured_llm.deepstack_visual_embeds[i] + # deepstack is [num_vis_tokens, hidden_size] — no batch dim. + # masked_scatter fills all B*num_vis_tokens positions, so repeat for batch_size > 1. + if batch_size > 1: + ds_dummy = torch.randn( + batch_size * ds.shape[0], ds.shape[1], dtype=dtype, device="cuda" + ) + else: + ds_dummy = torch.randn_like(ds, dtype=dtype, device="cuda") + export_inputs.append(ds_dummy) + name = f"deepstack_{i}" + input_names.append(name) + + logger.info(" Export input shapes:") + for name, tensor in zip(input_names, export_inputs): + logger.info(f" {name}: {tensor.shape} ({tensor.dtype})") + + precision_tag = "bf16" if use_bf16 else "fp32" + output_path = os.path.join(output_dir, f"llm_{precision_tag}.onnx") + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + logger.info(f" Exporting to {output_path}...") + with torch.inference_mode(): + torch.onnx.export( + wrapper, + tuple(export_inputs), + output_path, + input_names=input_names, + output_names=["embeddings"], + opset_version=19, + do_constant_folding=True, + dynamic_axes=llm_dynamic_axes, + export_params=True, + dynamo=False, + ) + + logger.info(" LLM exported successfully!") + _consolidate_external_data(output_path) + verify_onnx_export(output_path) + return output_path + + +# ============================================================ +# Observation Helpers +# ============================================================ + + +def prepare_observation(policy, dataset, traj_idx=0): + """Prepare a single observation for inference.""" + logger.info(f"\nPreparing observation from trajectory {traj_idx}...") + + traj = dataset[traj_idx] + modality_configs = policy.get_modality_config() + + data_point = extract_step_data( + traj, 0, modality_configs=modality_configs, embodiment_tag=policy.embodiment_tag + ) + + observation = {} + for key, value in data_point.states.items(): + observation[f"state.{key}"] = value + for key, value in data_point.images.items(): + observation[f"video.{key}"] = np.array(value) + for key in modality_configs["language"].modality_keys: + observation[key] = data_point.text + + parsed_obs = parse_observation_gr00t(observation, modality_configs) + logger.info(" Observation prepared") + return parsed_obs + + +# ============================================================ +# Export Functions: VL Self-Attention +# ============================================================ + + +def export_vl_self_attention_to_onnx(policy, output_dir, vl_seq_len, use_bf16=True, batch_size=1): + """Export the vl_self_attention (SelfAttentionTransformer) to ONNX. + + This module sits between VLLN and the DiT, transforming backbone + embeddings. If the model has no vl_self_attention (nn.Identity), skip. + + Input: hidden_states [B, T, backbone_embedding_dim] (T is dynamic) + Output: hidden_states [B, T, backbone_embedding_dim] + """ + vl_sa = policy.model.action_head.vl_self_attention + if isinstance(vl_sa, nn.Identity): + logger.info(" vl_self_attention is Identity — skipping export") + return None + + logger.info("\n" + "=" * 80) + logger.info("Exporting VL Self-Attention to ONNX") + logger.info("=" * 80) + + config = policy.model.action_head.config + dtype = torch.bfloat16 if use_bf16 else torch.float32 + model = vl_sa.to(dtype).eval().cuda() + + hidden_states = torch.randn( + batch_size, vl_seq_len, config.backbone_embedding_dim, dtype=dtype, device="cuda" + ) + logger.info(f" hidden_states: {hidden_states.shape} ({hidden_states.dtype})") + + output_path = os.path.join(output_dir, "vl_self_attention.onnx") + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + logger.info(f" Exporting to {output_path}...") + with torch.inference_mode(): + torch.onnx.export( + model, + (hidden_states,), + output_path, + input_names=["hidden_states"], + output_names=["output"], + dynamic_axes={ + "hidden_states": {1: "seq_len"}, + "output": {1: "seq_len"}, + }, + opset_version=19, + do_constant_folding=True, + dynamo=False, + ) + + logger.info(" VL Self-Attention exported successfully!") + verify_onnx_export(output_path) + return output_path + + +# ============================================================ +# Export Functions: State Encoder +# ============================================================ + + +def export_state_encoder_to_onnx(policy, output_dir, use_bf16=True, batch_size=1): + """Export the state encoder (CategorySpecificMLP) to ONNX. + + N1.7 change: input_dim = max_state_dim * state_history_length. + The state is reshaped from [B, state_history_length, max_state_dim] + to [B, 1, state_history_length * max_state_dim] before encoding. + + Input: state [B, 1, max_state_dim * state_history_length], embodiment_id [B] + Output: [B, 1, input_embedding_dim] + """ + logger.info("\n" + "=" * 80) + logger.info("Exporting State Encoder to ONNX") + logger.info("=" * 80) + + config = policy.model.action_head.config + state_encoder = policy.model.action_head.state_encoder + + dtype = torch.bfloat16 if use_bf16 else torch.float32 + model = state_encoder.to(dtype).eval().cuda() + + # N1.7: state is flattened to [B, 1, max_state_dim * state_history_length] + state_input_dim = config.max_state_dim * config.state_history_length + state = torch.randn(batch_size, 1, state_input_dim, dtype=dtype, device="cuda") + embodiment_id = torch.zeros(batch_size, dtype=torch.int64, device="cuda") + + logger.info(f" state: {state.shape} ({state.dtype})") + logger.info(f" embodiment_id: {embodiment_id.shape} ({embodiment_id.dtype})") + logger.info( + f" (max_state_dim={config.max_state_dim}, " + f"state_history_length={config.state_history_length})" + ) + + output_path = os.path.join(output_dir, "state_encoder.onnx") + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + logger.info(f" Exporting to {output_path}...") + with torch.inference_mode(): + torch.onnx.export( + model, + (state, embodiment_id), + output_path, + input_names=["state", "embodiment_id"], + output_names=["output"], + opset_version=19, + do_constant_folding=True, + # torch 2.9 flipped torch.onnx.export's dynamo default to True, but the + # dynamo graph for the state/action encoder + action decoder fuses into a + # Myelin ForeignNode (Unsqueeze...add) that TRT 10.15's NVRTC backend can't + # compile at bs=2 on Blackwell. Pin the legacy exporter for these three + # (ViT/LLM/VL-SA stay on dynamo — legacy can't export Qwen3VL memory_format). + dynamo=False, + ) + + logger.info(" State Encoder exported successfully!") + verify_onnx_export(output_path) + return output_path + + +# ============================================================ +# Export Functions: Action Encoder +# ============================================================ + + +def export_action_encoder_to_onnx(policy, output_dir, use_bf16=True, batch_size=1): + """Export the action encoder (MultiEmbodimentActionEncoder) to ONNX. + + Input: actions [B, action_horizon, max_action_dim], timesteps [B], embodiment_id [B] + Output: [B, action_horizon, input_embedding_dim] + """ + logger.info("\n" + "=" * 80) + logger.info("Exporting Action Encoder to ONNX") + logger.info("=" * 80) + + config = policy.model.action_head.config + action_encoder = policy.model.action_head.action_encoder + + dtype = torch.bfloat16 if use_bf16 else torch.float32 + model = action_encoder.to(dtype).eval().cuda() + + actions = torch.randn( + batch_size, config.action_horizon, config.max_action_dim, dtype=dtype, device="cuda" + ) + timesteps = torch.zeros(batch_size, dtype=torch.int64, device="cuda") + embodiment_id = torch.zeros(batch_size, dtype=torch.int64, device="cuda") + + logger.info(f" actions: {actions.shape} ({actions.dtype})") + logger.info(f" timesteps: {timesteps.shape} ({timesteps.dtype})") + logger.info(f" embodiment_id: {embodiment_id.shape} ({embodiment_id.dtype})") + + output_path = os.path.join(output_dir, "action_encoder.onnx") + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + logger.info(f" Exporting to {output_path}...") + with torch.inference_mode(): + torch.onnx.export( + model, + (actions, timesteps, embodiment_id), + output_path, + input_names=["actions", "timesteps", "embodiment_id"], + output_names=["output"], + opset_version=19, + do_constant_folding=True, + dynamo=False, + ) + + logger.info(" Action Encoder exported successfully!") + verify_onnx_export(output_path) + return output_path + + +# ============================================================ +# Export Functions: DiT +# ============================================================ + + +def export_dit_to_onnx(policy, captured_inputs, output_path, use_bf16=True, batch_size=1): + """Export the DiT (AlternateVLDiT) to ONNX. + + N1.7: image_mask and backbone_attention_mask are always present + (from Qwen3Backbone output). + + Input: sa_embs [B, sa_seq_len, input_embedding_dim], + vl_embs [B, vl_seq_len, backbone_embedding_dim], + timestep [B], image_mask [B, vl_seq_len], + backbone_attention_mask [B, vl_seq_len] + Output: [B, sa_seq_len, hidden_size] + """ + logger.info("\n" + "=" * 80) + logger.info("Exporting DiT to ONNX") + logger.info("=" * 80) + + dit_model = policy.model.action_head.model + dit_model.eval() + + dtype = torch.bfloat16 if use_bf16 else torch.float32 + dit_model = dit_model.to(dtype).cuda() + + # Use captured shapes but replace batch dim (index 0) with batch_size + sa_shape = (batch_size,) + captured_inputs.sa_embs.shape[1:] + vl_shape = (batch_size,) + captured_inputs.vl_embs.shape[1:] + ts_shape = (batch_size,) + + sa_embs = torch.randn(sa_shape, dtype=dtype, device="cuda") + vl_embs = torch.randn(vl_shape, dtype=dtype, device="cuda") + timestep = torch.ones(ts_shape, dtype=torch.int64, device="cuda") + + export_inputs = [sa_embs, vl_embs, timestep] + input_names = ["sa_embs", "vl_embs", "timestep"] + has_image_mask = captured_inputs.image_mask is not None + has_backbone_mask = captured_inputs.backbone_attention_mask is not None + + if has_image_mask: + im_shape = (batch_size,) + captured_inputs.image_mask.shape[1:] + image_mask = torch.ones(im_shape, dtype=torch.bool, device="cuda") + export_inputs.append(image_mask) + input_names.append("image_mask") + + if has_backbone_mask: + bm_shape = (batch_size,) + captured_inputs.backbone_attention_mask.shape[1:] + backbone_attention_mask = torch.ones(bm_shape, dtype=torch.bool, device="cuda") + export_inputs.append(backbone_attention_mask) + input_names.append("backbone_attention_mask") + + logger.info(" Export input shapes:") + for name, tensor in zip(input_names, export_inputs): + logger.info(f" {name}: {tensor.shape} ({tensor.dtype})") + + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + # Export to ONNX. Keep the legacy exporter explicit: the dynamo exporter + # specializes vl_seq_len here, which breaks the dynamic TensorRT profile. + logger.info(f"Exporting to {output_path} with legacy ONNX exporter...") + + # Create a wrapper to handle keyword arguments + # torch.onnx.export uses positional args: `dit.forward(arg1, arg2...)` + # DiT module uses keyword args: `dit.forward(hidden_states=....)` + # The DiTWrapper handles this translation + # Wrapper to convert positional args -> keyword args for DiT + class DiTWrapper(torch.nn.Module): + def __init__(self, dit, use_image_mask, use_backbone_mask): + super().__init__() + self.dit = dit + self.use_image_mask = use_image_mask + self.use_backbone_mask = use_backbone_mask + + def forward( + self, sa_embs, vl_embs, timestep, image_mask=None, backbone_attention_mask=None + ): + kwargs = {} + if self.use_image_mask and image_mask is not None: + kwargs["image_mask"] = image_mask + if self.use_backbone_mask and backbone_attention_mask is not None: + kwargs["backbone_attention_mask"] = backbone_attention_mask + return self.dit(sa_embs, vl_embs, timestep, **kwargs) + + wrapped_model = DiTWrapper(dit_model, has_image_mask, has_backbone_mask) + wrapped_model.eval() + + # vl_seq_len varies with input text length — mark it dynamic so the TRT engine + # can handle any sequence length seen at runtime, not just the export-time value. + dit_dynamic_axes = { + "vl_embs": {1: "vl_seq_len"}, + } + if has_image_mask: + dit_dynamic_axes["image_mask"] = {1: "vl_seq_len"} + if has_backbone_mask: + dit_dynamic_axes["backbone_attention_mask"] = {1: "vl_seq_len"} + + logger.info(f" Exporting to {output_path}...") + with torch.inference_mode(): + torch.onnx.export( + wrapped_model, + tuple(export_inputs), + output_path, + input_names=input_names, + output_names=["output"], + opset_version=19, + do_constant_folding=True, + export_params=True, + dynamic_axes=dit_dynamic_axes, + dynamo=False, # DiT specializes vl_seq_len under dynamo; legacy exporter needed + ) + + logger.info(" DiT exported successfully!") + + # Consolidate scattered external data files into a single .data file. + # torch.onnx.export scatters large tensors into many small files (one per tensor). + # TensorRT's parser expects external data in a single file adjacent to the .onnx. + _consolidate_external_data(output_path) + + verify_onnx_export(output_path) + return output_path + + +# ============================================================ +# Export Functions: Action Decoder +# ============================================================ + + +def export_action_decoder_to_onnx(policy, output_dir, use_bf16=True, batch_size=1): + """Export the action decoder (CategorySpecificMLP) to ONNX. + + Input: model_output [B, sa_seq_len, hidden_size], embodiment_id [B] + Output: [B, sa_seq_len, max_action_dim] + """ + logger.info("\n" + "=" * 80) + logger.info("Exporting Action Decoder to ONNX") + logger.info("=" * 80) + + config = policy.model.action_head.config + action_decoder = policy.model.action_head.action_decoder + + dtype = torch.bfloat16 if use_bf16 else torch.float32 + model = action_decoder.to(dtype).eval().cuda() + + # sa_seq_len = 1 (state) + action_horizon + sa_seq_len = 1 + config.action_horizon + model_output = torch.randn( + batch_size, sa_seq_len, config.hidden_size, dtype=dtype, device="cuda" + ) + embodiment_id = torch.zeros(batch_size, dtype=torch.int64, device="cuda") + + logger.info(f" model_output: {model_output.shape} ({model_output.dtype})") + logger.info(f" embodiment_id: {embodiment_id.shape} ({embodiment_id.dtype})") + + output_path = os.path.join(output_dir, "action_decoder.onnx") + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + logger.info(f" Exporting to {output_path}...") + with torch.inference_mode(): + torch.onnx.export( + model, + (model_output, embodiment_id), + output_path, + input_names=["model_output", "embodiment_id"], + output_names=["output"], + opset_version=19, + do_constant_folding=True, + dynamo=False, + ) + + logger.info(" Action Decoder exported successfully!") + verify_onnx_export(output_path) + return output_path + + +# ============================================================ +# Main +# ============================================================ + + +def main(args): + args.embodiment_tag = EmbodimentTag.resolve(args.embodiment_tag) + logger.info("=" * 80) + logger.info("GR00T N1.7 ONNX Export Script") + logger.info("=" * 80) + logger.info(f"Model path: {args.model_path}") + logger.info(f"Dataset path: {args.dataset_path}") + logger.info(f"Embodiment: {args.embodiment_tag}") + logger.info(f"Export mode: {args.export_mode}") + logger.info(f"Batch size: {args.batch_size}") + logger.info(f"Output directory: {args.output_dir}") + logger.info("=" * 80) + + # Step 1: Load the policy + logger.info("\n[Step 1] Loading policy...") + policy = Gr00tPolicy( + embodiment_tag=args.embodiment_tag, + model_path=args.model_path, + device="cuda", + ) + logger.info(" Policy loaded") + + # Step 2: Load dataset + logger.info("\n[Step 2] Loading dataset...") + dataset = LeRobotEpisodeLoader( + dataset_path=args.dataset_path, + modality_configs=policy.get_modality_config(), + ) + logger.info(f" Dataset loaded ({len(dataset)} trajectories)") + + # Step 3: Capture inputs via hooks + logger.info("\n[Step 3] Capturing model inputs from actual inference...") + + dit_capture = DiTInputCapture() + dit_hook = policy.model.action_head.model.register_forward_pre_hook( + dit_capture.hook_fn, with_kwargs=True + ) + + # Also capture ViT and LLM inputs if doing full_pipeline + vit_capture = None + vit_hook = None + llm_capture = None + llm_hook = None + if args.export_mode == "full_pipeline": + vit_capture = ViTInputCapture() + qwen_model = policy.model.backbone.model + vit_hook = qwen_model.model.visual.register_forward_hook( + vit_capture.hook_fn, with_kwargs=True + ) + + llm_capture = LLMInputCapture() + llm_hook = qwen_model.model.language_model.register_forward_pre_hook( + llm_capture.hook_fn, with_kwargs=True + ) + + observation = prepare_observation(policy, dataset, traj_idx=0) + logger.info(" Running inference to capture shapes...") + with torch.inference_mode(): + _ = policy.get_action(observation) + + dit_hook.remove() + if vit_hook is not None: + vit_hook.remove() + if llm_hook is not None: + llm_hook.remove() + + if not dit_capture.captured: + logger.error(" Failed to capture DiT inputs!") + return + if args.export_mode == "full_pipeline" and not vit_capture.captured: + logger.error(" Failed to capture ViT inputs!") + return + if args.export_mode == "full_pipeline" and not llm_capture.captured: + logger.error(" Failed to capture LLM inputs!") + return + + # Derive metadata + action_head_config = policy.model.action_head.config + sa_seq_len = 1 + action_head_config.action_horizon + vl_seq_len = dit_capture.vl_embs.shape[1] + + # Save export metadata + num_patches = vit_capture.pixel_values_shape[0] if vit_capture and vit_capture.captured else 256 + num_merged_patches = vit_capture.output_shape[0] if vit_capture and vit_capture.captured else 64 + # LLM metadata + llm_seq_len = ( + llm_capture.inputs_embeds.shape[1] if llm_capture and llm_capture.captured else vl_seq_len + ) + llm_hidden_size = ( + llm_capture.inputs_embeds.shape[2] if llm_capture and llm_capture.captured else 0 + ) + num_deepstack = ( + len(llm_capture.deepstack_visual_embeds) + if (llm_capture and llm_capture.deepstack_visual_embeds) + else 0 + ) + num_vis_tokens = llm_capture.deepstack_visual_embeds[0].shape[0] if num_deepstack > 0 else 0 + + export_metadata = { + "schema_version": EXPORT_METADATA_SCHEMA_VERSION, + "model_version": "n1d7", + "sa_seq_len": int(sa_seq_len), + "vl_seq_len": int(vl_seq_len), + "llm_seq_len": int(llm_seq_len), + "llm_hidden_size": int(llm_hidden_size), + "num_deepstack": int(num_deepstack), + "num_vis_tokens": int(num_vis_tokens), + "num_patches": int(num_patches), # ViT input seq length + "num_merged_patches": int(num_merged_patches), # ViT output after merger + "action_horizon": int(action_head_config.action_horizon), + "max_action_dim": int(action_head_config.max_action_dim), + "max_state_dim": int(action_head_config.max_state_dim), + "state_history_length": int(action_head_config.state_history_length), + "hidden_size": int(action_head_config.hidden_size), + "input_embedding_dim": int(action_head_config.input_embedding_dim), + "backbone_embedding_dim": int(action_head_config.backbone_embedding_dim), + "embodiment_tag": str(args.embodiment_tag), + "export_mode": args.export_mode, + "precision": args.precision, + "batch_size": args.batch_size, + } + # The ViT engine bakes pos/rotary buffers for this grid_thw and takes only + # pixel_values as input; record the grid so the runtime can reject a + # mismatched image config instead of silently using wrong embeddings. + if vit_capture is not None and vit_capture.captured: + export_metadata["vit_grid_thw"] = [ + [int(x) for x in row] for row in vit_capture.grid_thw.tolist() + ] + os.makedirs(args.output_dir, exist_ok=True) + metadata_path = os.path.join(args.output_dir, "export_metadata.json") + with open(metadata_path, "w") as f: + json.dump(export_metadata, f, indent=2) + logger.info(f" Saved export metadata to {metadata_path}") + + # Step 4: Export + bs = args.batch_size + if args.export_mode == "dit_only": + logger.info("\n[Step 4] Exporting DiT to ONNX (dit_only mode)...") + dit_output_path = os.path.join(args.output_dir, "dit_bf16.onnx") + export_dit_to_onnx( + policy=policy, + captured_inputs=dit_capture, + output_path=dit_output_path, + use_bf16=True, + batch_size=bs, + ) + + elif args.export_mode == "action_head": + logger.info("\n[Step 4] Exporting action head components to ONNX...") + + # 4a. State Encoder + logger.info("\n--- [4a] State Encoder ---") + export_state_encoder_to_onnx(policy, args.output_dir, use_bf16=True, batch_size=bs) + + # 4b. Action Encoder + logger.info("\n--- [4b] Action Encoder ---") + export_action_encoder_to_onnx(policy, args.output_dir, use_bf16=True, batch_size=bs) + + # 4c. DiT + logger.info("\n--- [4c] DiT ---") + dit_output_path = os.path.join(args.output_dir, "dit_bf16.onnx") + export_dit_to_onnx( + policy=policy, + captured_inputs=dit_capture, + output_path=dit_output_path, + use_bf16=True, + batch_size=bs, + ) + + # 4d. Action Decoder + logger.info("\n--- [4d] Action Decoder ---") + export_action_decoder_to_onnx(policy, args.output_dir, use_bf16=True, batch_size=bs) + + elif args.export_mode == "full_pipeline": + logger.info("\n[Step 4] Exporting full pipeline to ONNX...") + logger.info(" (ViT TRT + LLM TRT + Action Head TRT)") + + # 4a. ViT — exported in FP32 to avoid TRT BF16 kernel fusion accuracy issues + # ViT is patch-level: for batch_size > 1, num_patches scales by batch_size + logger.info("\n--- [4a] ViT (Qwen3-VL Vision, FP32 for TRT accuracy) ---") + export_vit_to_onnx(policy, args.output_dir, vit_capture, use_bf16=False, batch_size=bs) + + # 4b. LLM + logger.info("\n--- [4b] LLM (Qwen3-VL Text Model) ---") + export_llm_to_onnx(policy, llm_capture, args.output_dir, use_bf16=True, batch_size=bs) + + # 4c. VL Self-Attention (if present) + logger.info("\n--- [4c] VL Self-Attention ---") + export_vl_self_attention_to_onnx( + policy, args.output_dir, vl_seq_len=vl_seq_len, use_bf16=True, batch_size=bs + ) + + # 4d. State Encoder + logger.info("\n--- [4d] State Encoder ---") + export_state_encoder_to_onnx(policy, args.output_dir, use_bf16=True, batch_size=bs) + + # 4e. Action Encoder + logger.info("\n--- [4e] Action Encoder ---") + export_action_encoder_to_onnx(policy, args.output_dir, use_bf16=True, batch_size=bs) + + # 4f. DiT + logger.info("\n--- [4f] DiT ---") + dit_output_path = os.path.join(args.output_dir, "dit_bf16.onnx") + export_dit_to_onnx( + policy=policy, + captured_inputs=dit_capture, + output_path=dit_output_path, + use_bf16=True, + batch_size=bs, + ) + + # 4g. Action Decoder + logger.info("\n--- [4g] Action Decoder ---") + export_action_decoder_to_onnx(policy, args.output_dir, use_bf16=True, batch_size=bs) + + # Summary + logger.info("\n" + "=" * 80) + logger.info("EXPORT COMPLETE!") + logger.info("=" * 80) + logger.info(f"\nExported files in: {args.output_dir}") + + for f in sorted(os.listdir(args.output_dir)): + fpath = os.path.join(args.output_dir, f) + if os.path.isfile(fpath): + size_mb = os.path.getsize(fpath) / (1024 * 1024) + logger.info(f" {f}: {size_mb:.2f} MB") + + +@dataclass +class ExportConfig: + """Configuration for exporting GR00T N1.7 model to ONNX.""" + + model_path: str + """Path to the model checkpoint (required).""" + + dataset_path: str + """Path to the dataset (required, used to capture input shapes).""" + + embodiment_tag: Optional[EmbodimentTag] = None + """Embodiment tag. If not provided, auto-detected from model's processor_config.json.""" + + output_dir: str = "./gr00t_trt_deployment/onnx" + """Output directory for ONNX models.""" + + export_mode: ExportMode = ExportMode.dit_only + """Export mode: 'dit_only', 'action_head' (4 components), or 'full_pipeline' (ViT + action head).""" + + precision: Literal["bf16"] = "bf16" + """Export precision for the generated ONNX graph. + + Currently fixed to 'bf16': every Step 4 exporter passes a hardcoded + `use_bf16=` argument and does not read this field beyond writing it + into export_metadata.json. Re-introducing 'fp16'/'fp32'/'fp8' here + requires plumbing this field into each exporter first; until then + the Literal is narrowed so the CLI cannot accept a value the export + will ignore.""" + + batch_size: int = 1 + """Batch size baked into the exported ONNX models (default: 1).""" + + +if __name__ == "__main__": + args = tyro.cli(ExportConfig) + if args.embodiment_tag is None: + # Auto-detect from model's processor_config.json + config_file = Path(args.model_path) / "processor_config.json" + if not config_file.exists(): + raise ValueError( + f"Cannot auto-detect embodiment_tag: {config_file} not found. " + "Please provide --embodiment-tag explicitly." + ) + with open(config_file, "r") as f: + processor_config = json.load(f) + modality_configs = processor_config.get("processor_kwargs", {}).get("modality_configs", {}) + if len(modality_configs) == 0: + raise ValueError( + "Cannot auto-detect embodiment_tag: no modality_configs found in processor_config.json. " + "Please provide --embodiment-tag explicitly." + ) + if len(modality_configs) == 1: + embodiment_key = next(iter(modality_configs)) + args.embodiment_tag = EmbodimentTag.resolve(embodiment_key) + logger.info( + f"Auto-detected embodiment tag: {args.embodiment_tag} (from {embodiment_key})" + ) + else: + available = sorted(modality_configs.keys()) + raise ValueError( + f"Multiple embodiments found in processor_config.json: {available}. " + "Please provide --embodiment-tag explicitly." + ) + main(args) diff --git a/scripts/deployment/jetson/Dockerfile b/scripts/deployment/jetson/Dockerfile new file mode 100644 index 000000000..65a86f704 --- /dev/null +++ b/scripts/deployment/jetson/Dockerfile @@ -0,0 +1,32 @@ +FROM nvidia/cuda:13.2.1-devel-ubuntu24.04 + +ENV NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute +ENV DEBIAN_FRONTEND=noninteractive + +# System deps +RUN apt-get update && apt-get install -y \ + python3 python3-pip python3-venv \ + build-essential yasm cmake libtool git pkg-config curl \ + libass-dev libfreetype6-dev libvorbis-dev \ + autoconf automake texinfo tmux ffmpeg \ + libopenblas-dev + +COPY . /workspace/ + +# install_deps.sh consumes the shared JetPack 7.2 pyproject in place. +ENV DOCKER_CONTAINER=1 +ENV UV_PROJECT_ENVIRONMENT=/opt/gr00t-venv +RUN cd /workspace && bash scripts/deployment/jetson/install_deps.sh + +# Activate the venv by default and expose the CUDA, PyTorch, and packaged TensorRT runtimes. +ENV VIRTUAL_ENV=/opt/gr00t-venv +ENV PATH="$VIRTUAL_ENV/bin:/usr/local/cuda-13.2/bin:/usr/local/cuda/bin:$PATH" +ENV TRITON_PTXAS_PATH=/usr/local/cuda-13.2/bin/ptxas +ENV CUDA_HOME=/usr/local/cuda-13.2 +ENV CUDA_PATH=/usr/local/cuda-13.2 +ENV CPATH="/usr/local/cuda-13.2/include:${CPATH:-}" +ENV C_INCLUDE_PATH="/usr/local/cuda-13.2/include:${C_INCLUDE_PATH:-}" +ENV CPLUS_INCLUDE_PATH="/usr/local/cuda-13.2/include:${CPLUS_INCLUDE_PATH:-}" +ENV LD_LIBRARY_PATH="/usr/local/cuda-13.2/lib64:$VIRTUAL_ENV/lib/python3.12/site-packages/torch/lib:$VIRTUAL_ENV/lib/python3.12/site-packages/nvidia/cu13/lib:$VIRTUAL_ENV/lib/python3.12/site-packages/tensorrt_libs:${LD_LIBRARY_PATH:-}" + +WORKDIR /workspace/gr00t diff --git a/scripts/deployment/jetson/install_deps.sh b/scripts/deployment/jetson/install_deps.sh new file mode 100644 index 000000000..13067ffe7 --- /dev/null +++ b/scripts/deployment/jetson/install_deps.sh @@ -0,0 +1,129 @@ +#!/bin/bash +# install_deps.sh — One-time GR00T install for JetPack 7.2 (aarch64, Python 3.12). +# Used by both bare metal and the Orin/Thor Docker profiles. +# After install, use `source scripts/activate_jetpack72.sh` in each new shell. +set -euo pipefail + +TMP_BUILD_DIRS=() +trap 'for _d in "${TMP_BUILD_DIRS[@]:-}"; do rm -rf "$_d"; done' EXIT + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" + +# Use sudo only when not already root +SUDO="" +if [ "$(id -u)" -ne 0 ]; then + SUDO="sudo" +fi + +# Validate platform +ARCH=$(uname -m) +if [ "$ARCH" != "aarch64" ]; then + echo "ERROR: This script is intended for aarch64 JetPack 7.2 systems. Detected: $ARCH" + exit 1 +fi + +PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') +if [ "$PYTHON_VERSION" != "3.12" ]; then + echo "WARNING: Expected Python 3.12 for JetPack 7.2, detected Python $PYTHON_VERSION" +fi + +if [ "${DOCKER_CONTAINER:-0}" != "1" ]; then + if [ ! -r /etc/nv_tegra_release ]; then + echo "ERROR: /etc/nv_tegra_release not found. Deployment requires JetPack 7.2 / Jetson Linux 39.2." + exit 1 + fi + + L4T_RELEASE=$(sed -n 's/^# R\([0-9]\+\).*/\1/p' /etc/nv_tegra_release | head -n1) + L4T_REVISION=$(sed -n 's/.*REVISION: \([0-9.]\+\).*/\1/p' /etc/nv_tegra_release | head -n1) + if [ "$L4T_RELEASE" != "39" ]; then + echo "ERROR: Deployment supports JetPack 7.x / Jetson Linux R39 only." + echo " Tested target: JetPack 7.2 / Jetson Linux 39.2." + echo " Detected: R${L4T_RELEASE:-unknown}, revision ${L4T_REVISION:-unknown}." + echo " JetPack 6.x / Jetson Linux R36 is no longer supported." + exit 1 + fi + if [ "${L4T_REVISION%%.*}" != "2" ]; then + echo "WARNING: Tested target is JetPack 7.2 / Jetson Linux 39.2." + echo " Detected: R${L4T_RELEASE}, revision ${L4T_REVISION:-unknown}." + fi +fi + +# ────────────────────────────────────────────────────────────────────────────── +# System dependencies +# ────────────────────────────────────────────────────────────────────────────── + +echo "Installing system dependencies..." +$SUDO apt-get update -qq +$SUDO apt-get install -y --no-install-recommends ffmpeg + +# torch.compile needs ptxas; bare-metal JetPack images may only ship runtime +# libraries. The Docker image already has the full CUDA 13.2 development stack. +if [ ! -x /usr/local/cuda-13.2/bin/ptxas ] && [ ! -x /usr/local/cuda/bin/ptxas ]; then + echo "Installing CUDA 13.2 dev packages (nvcc, cudart-dev, nvrtc-dev)..." + if ! apt-cache show cuda-nvcc-13-2 &>/dev/null; then + echo "Adding NVIDIA CUDA 13.2 apt repository..." + curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/sbsa/cuda-keyring_1.1-1_all.deb \ + -o /tmp/cuda-keyring.deb + $SUDO dpkg -i /tmp/cuda-keyring.deb + rm /tmp/cuda-keyring.deb + $SUDO apt-get update -qq + fi + $SUDO apt-get install -y --no-install-recommends \ + cuda-nvcc-13-2 cuda-cudart-dev-13-2 cuda-nvrtc-dev-13-2 +else + echo "CUDA ptxas already available." +fi + +# ────────────────────────────────────────────────────────────────────────────── +# Python environment +# ────────────────────────────────────────────────────────────────────────────── + +# Install uv if not present +if ! command -v uv &> /dev/null; then + echo "Installing uv..." + curl -LsSf https://astral.sh/uv/install.sh | sh + export PATH="$HOME/.local/bin:$PATH" +fi + +# Install JetPack 7.2 deps from the shared pyproject without mutating +# the repo-root pyproject.toml / uv.lock. +# +# UV_PROJECT_ENVIRONMENT pins the venv location. Respect a pre-set value +# from the Docker build (the Orin and Thor Dockerfiles set it to +# /opt/gr00t-venv and adds /opt/gr00t-venv/bin to PATH); fall back to +# $REPO_ROOT/.venv on bare metal so activate_jetpack72.sh still finds the venv +# where users expect. +# +# --no-install-project skips installing "gr00t" from the JetPack 7.2 pyproject +# (its source layout points at the platform dir, which has no gr00t src); +# the real editable install comes from $REPO_ROOT below. +export UV_PROJECT_ENVIRONMENT="${UV_PROJECT_ENVIRONMENT:-$REPO_ROOT/.venv}" +echo "Running uv sync with the JetPack 7.2 pyproject at $SCRIPT_DIR (venv: $UV_PROJECT_ENVIRONMENT)..." +uv sync --project "$SCRIPT_DIR" --no-install-project --extra dev + +VENV_DIR="$UV_PROJECT_ENVIRONMENT" +VENV_PYTHON="$VENV_DIR/bin/python" +SITE_PKGS="$VENV_DIR/lib/python${PYTHON_VERSION}/site-packages" + +# Make the CUDA and PyTorch libraries visible while compiling the extension. +NVIDIA_LIB_DIRS="$(find "${SITE_PKGS}/nvidia" -name lib -type d 2>/dev/null | tr '\n' ':')" +export CUDA_HOME=/usr/local/cuda-13.2 +export CUDA_PATH="$CUDA_HOME" +export LD_LIBRARY_PATH="${SITE_PKGS}/torch/lib:${NVIDIA_LIB_DIRS}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +export CPATH="${CUDA_HOME}/include:${CPATH:-}" +export C_INCLUDE_PATH="${CUDA_HOME}/include:${C_INCLUDE_PATH:-}" +export CPLUS_INCLUDE_PATH="${CUDA_HOME}/include:${CPLUS_INCLUDE_PATH:-}" + +# Build a CUDA 13.2 wheel locally because upstream does not publish a cu132 +# aarch64 wheel containing the Orin and Thor GPU targets. +source "$SCRIPT_DIR/../build_flash_attn.sh" +build_flash_attn "$SCRIPT_DIR/wheels" jetpack-cu132-torch2.13 "87;110" "8.7;11.0" + +echo "Installing gr00t in editable mode from the repo root (--no-deps)..." +uv pip install --python "$VENV_PYTHON" --no-deps -e "$REPO_ROOT" + +echo "" +echo "Install complete! In each new shell, activate with:" +echo " source .venv/bin/activate" +echo " source scripts/activate_jetpack72.sh" diff --git a/scripts/deployment/jetson/pyproject.toml b/scripts/deployment/jetson/pyproject.toml new file mode 100644 index 000000000..306a7601b --- /dev/null +++ b/scripts/deployment/jetson/pyproject.toml @@ -0,0 +1,132 @@ +# JetPack 7.2 pyproject.toml — Jetson Orin and Thor (aarch64, +# Jetson Linux 39.2, CUDA 13.2, Python 3.12). +# Uses PyTorch cu132 aarch64 wheels for the CUDA-bound runtime packages. +# flash-attn is installed as a locally-built wheel by install_deps.sh because +# upstream does not publish a CUDA 13.2 aarch64 wheel for these targets. + +[build-system] +requires = ["setuptools>=67", "wheel", "pip"] +build-backend = "setuptools.build_meta" + +[project] +name = "gr00t" +version = "0.1.0" +requires-python = ">=3.12,<3.13" +dependencies = [ + "albumentations==1.4.18", + "diffusers==0.35.1", + "dm-tree==0.1.8", + "huggingface-hub[cli]", + "jsonlines==4.0.0", + "lmdb==1.7.5", + "msgpack==1.1.0", + "msgpack-numpy==0.4.8", + "opencv-python-headless>=4.5,<4.13", + "pandas==2.2.3", + "peft==0.17.1", + "termcolor==3.2.0", + "torch==2.13.0", + "triton==3.7.1", + "torchvision==0.28.0", + "transformers==4.57.6", + "tyro==0.9.17", + "click==8.1.8", + "datasets==3.6.0", + "cryptography>=46.0.7", + "einops==0.8.1", + "gitpython==3.1.50", + "gymnasium==1.2.2", + "matplotlib==3.10.1", + "numpy==1.26.4", + "omegaconf==2.3.0", + "scipy==1.15.3", + "wandb==0.23.0", + "pyzmq==27.0.1", + "torchcodec==0.15.0", + "onnx>=1.20.0", + "onnxscript", + "tensorrt-cu13>=10.16.0.72,<11", + "tensorrt-cu13-libs>=10.16.0.72,<11", +] + +[project.optional-dependencies] +dev = [ + "ruff", + "ipython", + "pytest", + "pytest-timeout", + "build", + "pre-commit", +] + +[tool.setuptools.packages.find] +where = ["."] +include = ["gr00t*"] + +[tool.uv] + +[tool.uv.sources] +torch = [{ index = "pytorch-cu132" }] +torchvision = [{ index = "pytorch-cu132" }] +torchcodec = [{ index = "pytorch-cu132" }] +triton = [{ index = "pytorch-cu132" }] +tensorrt-cu13 = [{ index = "nvidia-pypi" }] +tensorrt-cu13-libs = [{ index = "nvidia-pypi" }] + +[tool.pytest.ini_options] +addopts = "--import-mode=importlib" +markers = [ + "gpu: tests that require a GPU", + "multigpu: tests that require multiple GPUs and use all visible GPUs", +] +# Include fixture setup/teardown in JUnit so duration +# reports reflect real wall-clock time instead of call-only. +junit_duration_report = "total" + +[tool.ruff] +line-length = 100 +target-version = "py312" +src = ["gr00t"] +exclude = [ + "__pycache__", + ".git", + ".mypy_cache", + ".pytest_cache", + ".vscode", + ".venv", + "dist", + "logs", + "*.ipynb", + "external_dependencies", +] + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +docstring-code-format = true + +[tool.ruff.lint] +select = ["E", "F", "I"] +ignore = ["E501"] + +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["F401"] + +[tool.ruff.lint.isort] +case-sensitive = false +combine-as-imports = true +force-sort-within-sections = true +force-wrap-aliases = false +split-on-trailing-comma = false +lines-after-imports = 2 +section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] + +[[tool.uv.index]] +name = "nvidia-pypi" +url = "https://pypi.nvidia.com" +explicit = true + +[[tool.uv.index]] +name = "pytorch-cu132" +url = "https://download.pytorch.org/whl/cu132" +explicit = true diff --git a/scripts/deployment/jetson/uv.lock b/scripts/deployment/jetson/uv.lock new file mode 100644 index 000000000..2e2e4dd5d --- /dev/null +++ b/scripts/deployment/jetson/uv.lock @@ -0,0 +1,2383 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "platform_machine == 'aarch64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and sys_platform == 'linux'", + "sys_platform == 'darwin'", + "sys_platform != 'darwin' and sys_platform != 'linux'", +] + +[[package]] +name = "accelerate" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/14/787e5498cd062640f0f3d92ef4ae4063174f76f9afd29d13fc52a319daae/accelerate-1.13.0.tar.gz", hash = "sha256:d631b4e0f5b3de4aff2d7e9e6857d164810dfc3237d54d017f075122d057b236", size = 402835, upload-time = "2026-03-04T19:34:12.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl", hash = "sha256:cf1a3efb96c18f7b152eb0fa7490f3710b19c3f395699358f08decca2b8b62e0", size = 383744, upload-time = "2026-03-04T19:34:10.313Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/4a/064321452809dae953c1ed6e017504e72551a26b6f5708a5a80e4bf556ff/aiohttp-3.13.4.tar.gz", hash = "sha256:d97a6d09c66087890c2ab5d49069e1e570583f7ac0314ecf98294c1b6aaebd38", size = 7859748, upload-time = "2026-03-28T17:19:40.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/bd/ede278648914cabbabfdf95e436679b5d4156e417896a9b9f4587169e376/aiohttp-3.13.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ee62d4471ce86b108b19c3364db4b91180d13fe3510144872d6bad5401957360", size = 752158, upload-time = "2026-03-28T17:16:06.901Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/581c053253c07b480b03785196ca5335e3c606a37dc73e95f6527f1591fe/aiohttp-3.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c0fd8f41b54b58636402eb493afd512c23580456f022c1ba2db0f810c959ed0d", size = 501037, upload-time = "2026-03-28T17:16:08.82Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/a5ede193c08f13cc42c0a5b50d1e246ecee9115e4cf6e900d8dbd8fd6acb/aiohttp-3.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4baa48ce49efd82d6b1a0be12d6a36b35e5594d1dd42f8bfba96ea9f8678b88c", size = 501556, upload-time = "2026-03-28T17:16:10.63Z" }, + { url = "https://files.pythonhosted.org/packages/d6/10/88ff67cd48a6ec36335b63a640abe86135791544863e0cfe1f065d6cef7a/aiohttp-3.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d738ebab9f71ee652d9dbd0211057690022201b11197f9a7324fd4dba128aa97", size = 1757314, upload-time = "2026-03-28T17:16:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/8b/15/fdb90a5cf5a1f52845c276e76298c75fbbcc0ac2b4a86551906d54529965/aiohttp-3.13.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0ce692c3468fa831af7dceed52edf51ac348cebfc8d3feb935927b63bd3e8576", size = 1731819, upload-time = "2026-03-28T17:16:14.558Z" }, + { url = "https://files.pythonhosted.org/packages/ec/df/28146785a007f7820416be05d4f28cc207493efd1e8c6c1068e9bdc29198/aiohttp-3.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8e08abcfe752a454d2cb89ff0c08f2d1ecd057ae3e8cc6d84638de853530ebab", size = 1793279, upload-time = "2026-03-28T17:16:16.594Z" }, + { url = "https://files.pythonhosted.org/packages/10/47/689c743abf62ea7a77774d5722f220e2c912a77d65d368b884d9779ef41b/aiohttp-3.13.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5977f701b3fff36367a11087f30ea73c212e686d41cd363c50c022d48b011d8d", size = 1891082, upload-time = "2026-03-28T17:16:18.71Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/f7f4f318c7e58c23b761c9b13b9a3c9b394e0f9d5d76fbc6622fa98509f6/aiohttp-3.13.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54203e10405c06f8b6020bd1e076ae0fe6c194adcee12a5a78af3ffa3c57025e", size = 1773938, upload-time = "2026-03-28T17:16:21.125Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/f207cb3121852c989586a6fc16ff854c4fcc8651b86c5d3bd1fc83057650/aiohttp-3.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:358a6af0145bc4dda037f13167bef3cce54b132087acc4c295c739d05d16b1c3", size = 1579548, upload-time = "2026-03-28T17:16:23.588Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/e1289661a32161e24c1fe479711d783067210d266842523752869cc1d9c2/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:898ea1850656d7d61832ef06aa9846ab3ddb1621b74f46de78fbc5e1a586ba83", size = 1714669, upload-time = "2026-03-28T17:16:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/96/0a/3e86d039438a74a86e6a948a9119b22540bae037d6ba317a042ae3c22711/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7bc30cceb710cf6a44e9617e43eebb6e3e43ad855a34da7b4b6a73537d8a6763", size = 1754175, upload-time = "2026-03-28T17:16:28.18Z" }, + { url = "https://files.pythonhosted.org/packages/f4/30/e717fc5df83133ba467a560b6d8ef20197037b4bb5d7075b90037de1018e/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4a31c0c587a8a038f19a4c7e60654a6c899c9de9174593a13e7cc6e15ff271f9", size = 1762049, upload-time = "2026-03-28T17:16:30.941Z" }, + { url = "https://files.pythonhosted.org/packages/e4/28/8f7a2d4492e336e40005151bdd94baf344880a4707573378579f833a64c1/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2062f675f3fe6e06d6113eb74a157fb9df58953ffed0cdb4182554b116545758", size = 1570861, upload-time = "2026-03-28T17:16:32.953Z" }, + { url = "https://files.pythonhosted.org/packages/78/45/12e1a3d0645968b1c38de4b23fdf270b8637735ea057d4f84482ff918ad9/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d1ba8afb847ff80626d5e408c1fdc99f942acc877d0702fe137015903a220a9", size = 1790003, upload-time = "2026-03-28T17:16:35.468Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/60374e18d590de16dcb39d6ff62f39c096c1b958e6f37727b5870026ea30/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b08149419994cdd4d5eecf7fd4bc5986b5a9380285bcd01ab4c0d6bfca47b79d", size = 1737289, upload-time = "2026-03-28T17:16:38.187Z" }, + { url = "https://files.pythonhosted.org/packages/02/bf/535e58d886cfbc40a8b0013c974afad24ef7632d645bca0b678b70033a60/aiohttp-3.13.4-cp312-cp312-win32.whl", hash = "sha256:fc432f6a2c4f720180959bc19aa37259651c1a4ed8af8afc84dd41c60f15f791", size = 434185, upload-time = "2026-03-28T17:16:40.735Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1a/d92e3325134ebfff6f4069f270d3aac770d63320bd1fcd0eca023e74d9a8/aiohttp-3.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:6148c9ae97a3e8bff9a1fc9c757fa164116f86c100468339730e717590a3fb77", size = 461285, upload-time = "2026-03-28T17:16:42.713Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "albucore" +version = "0.0.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "opencv-python-headless" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/03/81e5b3b6ee7911a70ed19028ccfed90f5cb32fc9fb33af5bc587fc1ab6a1/albucore-0.0.17.tar.gz", hash = "sha256:e9956ac4debc47e804f0677ff4e23939ba322986eac16e801f8ea1c98269db65", size = 12271, upload-time = "2024-09-20T19:36:19.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/20/9f56b72131ea71c9566f0cc303a9e92156767845164c0f4ec10534630991/albucore-0.0.17-py3-none-any.whl", hash = "sha256:751a6d219a0b5217b44168d5fae90c27eadfa5bc381cbb7cc74536e90aeeac5b", size = 10378, upload-time = "2024-09-20T19:36:18.796Z" }, +] + +[[package]] +name = "albumentations" +version = "1.4.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "albucore" }, + { name = "eval-type-backport" }, + { name = "numpy" }, + { name = "opencv-python-headless" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "scikit-image" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/52/cd2399a7037a70dd6410a7c890a1cdfd79563c03c4a7f3311278c9a3b1b0/albumentations-1.4.18.tar.gz", hash = "sha256:701a9405f059f761f00ce00e187954d01276bdb78b33abcf864e79727db3bf1a", size = 207321, upload-time = "2024-10-08T22:32:47.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/2f/468208ac3345b59286f5a73dd6e298c111c8a6a5896f658d221cd55ebf8d/albumentations-1.4.18-py3-none-any.whl", hash = "sha256:57ed0a634de9d3b34d003585aa90e9164e164ccc4ecb797eee8fbad8da1e9eaf", size = 224034, upload-time = "2024-10-08T22:32:45.763Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "build" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/18/94eaffda7b329535d91f00fe605ab1f1e5cd68b2074d03f255c7d250687d/build-1.4.0.tar.gz", hash = "sha256:f1b91b925aa322be454f8330c6fb48b465da993d1e7e7e6fa35027ec49f3c936", size = 50054, upload-time = "2026-01-08T16:41:47.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596", size = 24141, upload-time = "2026-01-08T16:41:46.453Z" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, +] + +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, +] + +[[package]] +name = "cryptography" +version = "46.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4", size = 7179869, upload-time = "2026-04-08T01:56:17.157Z" }, + { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, + { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, + { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl", hash = "sha256:d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457", size = 3026504, upload-time = "2026-04-08T01:56:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b", size = 3488363, upload-time = "2026-04-08T01:56:41.893Z" }, + { url = "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4", size = 7165618, upload-time = "2026-04-08T01:57:10.645Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, + { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, + { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, + { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl", hash = "sha256:f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246", size = 3013001, upload-time = "2026-04-08T01:57:34.933Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl", hash = "sha256:506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3", size = 3472985, upload-time = "2026-04-08T01:57:36.714Z" }, +] + +[[package]] +name = "cuda-bindings" +version = "13.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-pathfinder" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" }, +] + +[[package]] +name = "cuda-pathfinder" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/b4/d088047afe39827556df21118cac9ffd20cc3f968c99a7681494d1eb333c/cuda_pathfinder-1.6.0-py3-none-any.whl", hash = "sha256:1503af579d8379c24bdd65528379bc57039b0455be9f5f9686cf8e473a1fce51", size = 54591, upload-time = "2026-07-21T15:03:56.224Z" }, +] + +[[package]] +name = "cuda-toolkit" +version = "13.2.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/6a/f79c134fa8e6d5fe028584933be063ce7961b1a85ce217f261cdda176e48/cuda_toolkit-13.2.1-py2.py3-none-any.whl", hash = "sha256:646d0e3668ce6f78f2312bb9cc0f668b9cbfcbef187eaa6a39eb2ea6dbec2a31", size = 2612, upload-time = "2026-04-14T01:10:36.163Z" }, +] + +[package.optional-dependencies] +cublas = [ + { name = "nvidia-cublas", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "nvidia-cuda-nvrtc", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +cudart = [ + { name = "nvidia-cuda-runtime", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +cufft = [ + { name = "nvidia-cufft", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +cufile = [ + { name = "nvidia-cufile", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +cupti = [ + { name = "nvidia-cuda-cupti", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +curand = [ + { name = "nvidia-curand", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +cusolver = [ + { name = "nvidia-cublas", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "nvidia-cusolver", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "nvidia-cusparse", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +cusparse = [ + { name = "nvidia-cusparse", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +nvjitlink = [ + { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +nvrtc = [ + { name = "nvidia-cuda-nvrtc", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] +nvtx = [ + { name = "nvidia-nvtx", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "datasets" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/89/d3d6fef58a488f8569c82fd293ab7cbd4250244d67f425dcae64c63800ea/datasets-3.6.0.tar.gz", hash = "sha256:1b2bf43b19776e2787e181cfd329cb0ca1a358ea014780c3581e0f276375e041", size = 569336, upload-time = "2025-05-07T15:15:02.659Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/34/a08b0ee99715eaba118cbe19a71f7b5e2425c2718ef96007c325944a1152/datasets-3.6.0-py3-none-any.whl", hash = "sha256:25000c4a2c0873a710df127d08a202a06eab7bf42441a6bc278b499c2f72cd1b", size = 491546, upload-time = "2025-05-07T15:14:59.742Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "diffusers" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "importlib-metadata" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/05/c4c8736c14e0efe9a835fb91c6ff5e1abddf9894a2f2a28fffe6429378a6/diffusers-0.35.1.tar.gz", hash = "sha256:6f4dc0c9d309a4c4914a2179646f2bc801b5e395a43295fff3b5f9dbd3e28fd3", size = 3369127, upload-time = "2025-08-20T04:16:10.668Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/a7/c53f294f34d9e1584388721b3d7aa024ea1ac46e86d0c302fc3db40ed960/diffusers-0.35.1-py3-none-any.whl", hash = "sha256:fe29ff10200970c7c5934c6488c213e2a77a03dad5e6fa00bbd8e1d04234cb0e", size = 4121424, upload-time = "2025-08-20T04:16:08.359Z" }, +] + +[[package]] +name = "dill" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload-time = "2024-01-27T23:42:16.145Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload-time = "2024-01-27T23:42:14.239Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + +[[package]] +name = "dm-tree" +version = "0.1.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/6d/f1997aac42e0f550c1e952a0b920eaa0bfc4d27d0421499881b934b969fc/dm-tree-0.1.8.tar.gz", hash = "sha256:0fcaabbb14e7980377439e7140bd05552739ca5e515ecb3119f234acee4b9430", size = 35384, upload-time = "2022-12-18T09:46:55.953Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/2c/e33dfc96f974ae3cba82c9836371c93fcb4d59d5a82ebb853861618a0b0b/dm_tree-0.1.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea9e59e0451e7d29aece402d9f908f2e2a80922bcde2ebfd5dcb07750fcbfee8", size = 169495, upload-time = "2024-02-06T09:09:13.276Z" }, + { url = "https://files.pythonhosted.org/packages/17/af/4030827253a5d50eb8da6f7189bc33d3c850c4109cf3414910e9af677cb7/dm_tree-0.1.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:94d3f0826311f45ee19b75f5b48c99466e4218a0489e81c0f0167bda50cacf22", size = 116525, upload-time = "2024-02-06T09:09:15.529Z" }, + { url = "https://files.pythonhosted.org/packages/10/10/5f9eed00b1186921e447960443f03cda6374cba8cd5cf7aff2b42ecb8a0e/dm_tree-0.1.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:435227cf3c5dc63f4de054cf3d00183790bd9ead4c3623138c74dde7f67f521b", size = 111436, upload-time = "2024-02-06T09:09:16.781Z" }, + { url = "https://files.pythonhosted.org/packages/4a/da/3d3d04f7a572f7649f48edc9402ff5836e2f90e18445ffde110fd6142889/dm_tree-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09964470f76a5201aff2e8f9b26842976de7889300676f927930f6285e256760", size = 146828, upload-time = "2024-02-13T21:25:21.639Z" }, + { url = "https://files.pythonhosted.org/packages/c4/12/0a8c2152655ca39c1059c762ea1dc12784166c735126eb0ab929c518ef4e/dm_tree-0.1.8-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75c5d528bb992981c20793b6b453e91560784215dffb8a5440ba999753c14ceb", size = 175054, upload-time = "2024-02-13T21:25:23.532Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/8cbb857612ca69763ee4f4f97c7b91659df1d373d62237cb9c772e55ae97/dm_tree-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a94aba18a35457a1b5cd716fd7b46c5dafdc4cf7869b4bae665b91c4682a8e", size = 152834, upload-time = "2024-02-06T09:09:18.536Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e3/96f5267fe5a47c882dce7f3d06b26ddd756681fc4fbedd55d51b78b08bca/dm_tree-0.1.8-cp312-cp312-win_amd64.whl", hash = "sha256:96a548a406a6fb15fe58f6a30a57ff2f2aafbf25f05afab00c8f5e5977b6c715", size = 101754, upload-time = "2024-02-06T09:09:20.962Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, +] + +[[package]] +name = "einops" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/81/df4fbe24dff8ba3934af99044188e20a98ed441ad17a274539b74e82e126/einops-0.8.1.tar.gz", hash = "sha256:de5d960a7a761225532e0f1959e5315ebeafc0cd43394732f103ca44b9837e84", size = 54805, upload-time = "2025-02-09T03:17:00.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737", size = 64359, upload-time = "2025-02-09T03:17:01.998Z" }, +] + +[[package]] +name = "eval-type-backport" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/a3/cafafb4558fd638aadfe4121dc6cefb8d743368c085acb2f521df0f3d9d7/eval_type_backport-0.3.1.tar.gz", hash = "sha256:57e993f7b5b69d271e37482e62f74e76a0276c82490cf8e4f0dffeb6b332d5ed", size = 9445, upload-time = "2025-12-02T11:51:42.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/22/fdc2e30d43ff853720042fa15baa3e6122722be1a7950a98233ebb55cd71/eval_type_backport-0.3.1-py3-none-any.whl", hash = "sha256:279ab641905e9f11129f56a8a78f493518515b83402b860f6f06dd7c011fdfa8", size = 6063, upload-time = "2025-12-02T11:51:41.665Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "farama-notifications" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", size = 2131, upload-time = "2023-02-27T18:28:41.047Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", size = 2511, upload-time = "2023-02-27T18:28:39.447Z" }, +] + +[[package]] +name = "filelock" +version = "3.25.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, +] + +[[package]] +name = "fonttools" +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, + { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "fsspec" +version = "2025.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491, upload-time = "2025-03-07T21:47:56.461Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615, upload-time = "2025-03-07T21:47:54.809Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + +[[package]] +name = "gr00t" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "albumentations" }, + { name = "click" }, + { name = "cryptography" }, + { name = "datasets" }, + { name = "diffusers" }, + { name = "dm-tree" }, + { name = "einops" }, + { name = "gitpython" }, + { name = "gymnasium" }, + { name = "huggingface-hub", extra = ["cli"] }, + { name = "jsonlines" }, + { name = "lmdb" }, + { name = "matplotlib" }, + { name = "msgpack" }, + { name = "msgpack-numpy" }, + { name = "numpy" }, + { name = "omegaconf" }, + { name = "onnx" }, + { name = "onnxscript" }, + { name = "opencv-python-headless" }, + { name = "pandas" }, + { name = "peft" }, + { name = "pyzmq" }, + { name = "scipy" }, + { name = "tensorrt-cu13" }, + { name = "tensorrt-cu13-libs" }, + { name = "termcolor" }, + { name = "torch" }, + { name = "torchcodec" }, + { name = "torchvision" }, + { name = "transformers" }, + { name = "triton" }, + { name = "tyro" }, + { name = "wandb" }, +] + +[package.optional-dependencies] +dev = [ + { name = "build" }, + { name = "ipython" }, + { name = "pre-commit" }, + { name = "pytest" }, + { name = "pytest-timeout" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "albumentations", specifier = "==1.4.18" }, + { name = "build", marker = "extra == 'dev'" }, + { name = "click", specifier = "==8.1.8" }, + { name = "cryptography", specifier = ">=46.0.7" }, + { name = "datasets", specifier = "==3.6.0" }, + { name = "diffusers", specifier = "==0.35.1" }, + { name = "dm-tree", specifier = "==0.1.8" }, + { name = "einops", specifier = "==0.8.1" }, + { name = "gitpython", specifier = "==3.1.50" }, + { name = "gymnasium", specifier = "==1.2.2" }, + { name = "huggingface-hub", extras = ["cli"] }, + { name = "ipython", marker = "extra == 'dev'" }, + { name = "jsonlines", specifier = "==4.0.0" }, + { name = "lmdb", specifier = "==1.7.5" }, + { name = "matplotlib", specifier = "==3.10.1" }, + { name = "msgpack", specifier = "==1.1.0" }, + { name = "msgpack-numpy", specifier = "==0.4.8" }, + { name = "numpy", specifier = "==1.26.4" }, + { name = "omegaconf", specifier = "==2.3.0" }, + { name = "onnx", specifier = ">=1.20.0" }, + { name = "onnxscript" }, + { name = "opencv-python-headless", specifier = ">=4.5,<4.13" }, + { name = "pandas", specifier = "==2.2.3" }, + { name = "peft", specifier = "==0.17.1" }, + { name = "pre-commit", marker = "extra == 'dev'" }, + { name = "pytest", marker = "extra == 'dev'" }, + { name = "pytest-timeout", marker = "extra == 'dev'" }, + { name = "pyzmq", specifier = "==27.0.1" }, + { name = "ruff", marker = "extra == 'dev'" }, + { name = "scipy", specifier = "==1.15.3" }, + { name = "tensorrt-cu13", specifier = ">=10.16.0.72,<11", index = "https://pypi.nvidia.com/" }, + { name = "tensorrt-cu13-libs", specifier = ">=10.16.0.72,<11", index = "https://pypi.nvidia.com/" }, + { name = "termcolor", specifier = "==3.2.0" }, + { name = "torch", specifier = "==2.13.0", index = "https://download.pytorch.org/whl/cu132" }, + { name = "torchcodec", specifier = "==0.15.0", index = "https://download.pytorch.org/whl/cu132" }, + { name = "torchvision", specifier = "==0.28.0", index = "https://download.pytorch.org/whl/cu132" }, + { name = "transformers", specifier = "==4.57.6" }, + { name = "triton", specifier = "==3.7.1", index = "https://download.pytorch.org/whl/cu132" }, + { name = "tyro", specifier = "==0.9.17" }, + { name = "wandb", specifier = "==0.23.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "gymnasium" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cloudpickle" }, + { name = "farama-notifications" }, + { name = "numpy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/1c/d70b2ddd067992fa0332deae08293ef2dc489917ac5342e0e4b8850641f6/gymnasium-1.2.2.tar.gz", hash = "sha256:46d927328f8518bb5a689dbe270d228c1da2b08bcb71ae0152c10aa66f48d530", size = 829250, upload-time = "2025-11-04T15:21:06.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/53/39cd8c2f85e213fce1f32367c4bdbd3402d3bcde7d0826a1172a0f2c5cc0/gymnasium-1.2.2-py3-none-any.whl", hash = "sha256:f04ec362b1fdf73a8b327db5ef89384a3f2ba411e05d3521513414fbbb2199c8", size = 952118, upload-time = "2025-11-04T15:21:03.484Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/08/23c84a26716382c89151b5b447b4beb19e3345f3a93d3b73009a71a57ad3/hf_xet-1.4.2.tar.gz", hash = "sha256:b7457b6b482d9e0743bd116363239b1fa904a5e65deede350fbc0c4ea67c71ea", size = 672357, upload-time = "2026-03-13T06:58:51.077Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/86/b40b83a2ff03ef05c4478d2672b1fc2b9683ff870e2b25f4f3af240f2e7b/hf_xet-1.4.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:71f02d6e4cdd07f344f6844845d78518cc7186bd2bc52d37c3b73dc26a3b0bc5", size = 3800339, upload-time = "2026-03-13T06:58:36.245Z" }, + { url = "https://files.pythonhosted.org/packages/64/2e/af4475c32b4378b0e92a587adb1aa3ec53e3450fd3e5fe0372a874531c00/hf_xet-1.4.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e9b38d876e94d4bdcf650778d6ebbaa791dd28de08db9736c43faff06ede1b5a", size = 3559664, upload-time = "2026-03-13T06:58:34.787Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4c/781267da3188db679e601de18112021a5cb16506fe86b246e22c5401a9c4/hf_xet-1.4.2-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:77e8c180b7ef12d8a96739a4e1e558847002afe9ea63b6f6358b2271a8bdda1c", size = 4217422, upload-time = "2026-03-13T06:58:27.472Z" }, + { url = "https://files.pythonhosted.org/packages/68/47/d6cf4a39ecf6c7705f887a46f6ef5c8455b44ad9eb0d391aa7e8a2ff7fea/hf_xet-1.4.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c3b3c6a882016b94b6c210957502ff7877802d0dbda8ad142c8595db8b944271", size = 3992847, upload-time = "2026-03-13T06:58:25.989Z" }, + { url = "https://files.pythonhosted.org/packages/2d/ef/e80815061abff54697239803948abc665c6b1d237102c174f4f7a9a5ffc5/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d9a634cc929cfbaf2e1a50c0e532ae8c78fa98618426769480c58501e8c8ac2", size = 4193843, upload-time = "2026-03-13T06:58:44.59Z" }, + { url = "https://files.pythonhosted.org/packages/54/75/07f6aa680575d9646c4167db6407c41340cbe2357f5654c4e72a1b01ca14/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6b0932eb8b10317ea78b7da6bab172b17be03bbcd7809383d8d5abd6a2233e04", size = 4432751, upload-time = "2026-03-13T06:58:46.533Z" }, + { url = "https://files.pythonhosted.org/packages/cd/71/193eabd7e7d4b903c4aa983a215509c6114915a5a237525ec562baddb868/hf_xet-1.4.2-cp37-abi3-win_amd64.whl", hash = "sha256:ad185719fb2e8ac26f88c8100562dbf9dbdcc3d9d2add00faa94b5f106aea53f", size = 3671149, upload-time = "2026-03-13T06:58:57.07Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7e/ccf239da366b37ba7f0b36095450efae4a64980bdc7ec2f51354205fdf39/hf_xet-1.4.2-cp37-abi3-win_arm64.whl", hash = "sha256:32c012286b581f783653e718c1862aea5b9eb140631685bb0c5e7012c8719a87", size = 3533426, upload-time = "2026-03-13T06:58:55.46Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/b7/8cb61d2eece5fb05a83271da168186721c450eb74e3c31f7ef3169fa475b/huggingface_hub-0.36.2.tar.gz", hash = "sha256:1934304d2fb224f8afa3b87007d58501acfda9215b334eed53072dd5e815ff7a", size = 649782, upload-time = "2026-02-06T09:24:13.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" }, +] + +[package.optional-dependencies] +cli = [ + { name = "inquirerpy" }, +] + +[[package]] +name = "identify" +version = "2.6.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/c4/7fb4db12296cdb11893d61c92048fe617ee853f8523b9b296ac03b43757e/identify-2.6.18.tar.gz", hash = "sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd", size = 99580, upload-time = "2026-03-15T18:39:50.319Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl", hash = "sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737", size = 99394, upload-time = "2026-03-15T18:39:48.915Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/84/93bcd1300216ea50811cee96873b84a1bebf8d0489ffaf7f2a3756bab866/imageio-2.37.3.tar.gz", hash = "sha256:bbb37efbfc4c400fcd534b367b91fcd66d5da639aaa138034431a1c5e0a41451", size = 389673, upload-time = "2026-03-09T11:31:12.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646, upload-time = "2026-03-09T11:31:10.771Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "inquirerpy" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pfzy" }, + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/73/7570847b9da026e07053da3bbe2ac7ea6cde6bb2cbd3c7a5a950fa0ae40b/InquirerPy-0.3.4.tar.gz", hash = "sha256:89d2ada0111f337483cb41ae31073108b2ec1e618a49d7110b0d7ade89fc197e", size = 44431, upload-time = "2022-06-27T23:11:20.598Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/ff/3b59672c47c6284e8005b42e84ceba13864aa0f39f067c973d1af02f5d91/InquirerPy-0.3.4-py3-none-any.whl", hash = "sha256:c65fdfbac1fa00e3ee4fb10679f4d3ed7a012abf4833910e63c295827fe2a7d4", size = 67677, upload-time = "2022-06-27T23:11:17.723Z" }, +] + +[[package]] +name = "ipython" +version = "8.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/61/1810830e8b93c72dcd3c0f150c80a00c3deb229562d9423807ec92c3a539/ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39", size = 5513996, upload-time = "2026-01-05T10:59:06.901Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/df/db59624f4c71b39717c423409950ac3f2c8b2ce4b0aac843112c7fb3f721/ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86", size = 831813, upload-time = "2026-01-05T10:59:04.239Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jsonlines" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload-time = "2023-09-01T12:34:44.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload-time = "2023-09-01T12:34:42.563Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, +] + +[[package]] +name = "lazy-loader" +version = "0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/ac/21a1f8aa3777f5658576777ea76bfb124b702c520bbe90edf4ae9915eafa/lazy_loader-0.5.tar.gz", hash = "sha256:717f9179a0dbed357012ddad50a5ad3d5e4d9a0b8712680d4e687f5e6e6ed9b3", size = 15294, upload-time = "2026-03-06T15:45:09.054Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl", hash = "sha256:ab0ea149e9c554d4ffeeb21105ac60bed7f3b4fd69b1d2360a4add51b170b005", size = 8044, upload-time = "2026-03-06T15:45:07.668Z" }, +] + +[[package]] +name = "lmdb" +version = "1.7.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/a3/3756f2c6adba4a1413dba55e6c81a20b38a868656517308533e33cb59e1c/lmdb-1.7.5.tar.gz", hash = "sha256:f0604751762cb097059d5412444c4057b95f386c7ed958363cf63f453e5108da", size = 883490, upload-time = "2025-10-15T03:39:44.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/b4/8b862c4d7fd6f68cb33e2a919169fda8924121dc5ff61e3cc105304a6dd4/lmdb-1.7.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b48c2359eea876d7b634b49f84019ecc8c1626da97c795fc7b39a793676815df", size = 100910, upload-time = "2025-10-15T03:39:00.727Z" }, + { url = "https://files.pythonhosted.org/packages/27/64/8ab5da48180d5f13a293ea00a9f8758b1bee080e76ea0ab0d6be0d51b55f/lmdb-1.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f84793baeb430ba984eb6c1b4e08c0a508b1c03e79ce79fcda0f29ecc06a95a", size = 99376, upload-time = "2025-10-15T03:39:01.791Z" }, + { url = "https://files.pythonhosted.org/packages/43/e0/51bc942fe5ed3fce69c631b54f52d97785de3d94487376139be6de1e199a/lmdb-1.7.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68cc21314a33faac1b749645a976b7655e7fa7cc104a72365d2429d2db7f6342", size = 298556, upload-time = "2025-10-15T03:39:02.787Z" }, + { url = "https://files.pythonhosted.org/packages/66/c5/19ea75c88b91d12da5c6f4bbe2aca633047b6b270fd613d557583d32cc5c/lmdb-1.7.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2d9b7e102fcfe5e0cfb3acdebd403eb55ccbe5f7202d8f49d60bdafb1546d1e", size = 299449, upload-time = "2025-10-15T03:39:03.903Z" }, + { url = "https://files.pythonhosted.org/packages/1b/74/365194203dbff47d3a1621366d6a1133cdcce261f4ac0e1d0496f01e6ace/lmdb-1.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:69de89cc79e03e191fc6f95797f1bef91b45c415d1ea9d38872b00b2d989a50f", size = 99328, upload-time = "2025-10-15T03:39:04.949Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3a/a441afebff5bd761f7f58d194fed7ac265279964957479a5c8a51c42f9ad/lmdb-1.7.5-cp312-cp312-win_arm64.whl", hash = "sha256:0c880ee4b309e900f2d58a710701f5e6316a351878588c6a95a9c0bcb640680b", size = 94191, upload-time = "2025-10-15T03:39:05.975Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2c/982cb5afed533d0cb8038232b40c19b5b85a2d887dec74dfd39e8351ef4b/lmdb-1.7.5-py3-none-any.whl", hash = "sha256:fc344bb8bc0786c87c4ccb19b31f09a38c08bd159ada6f037d669426fea06f03", size = 148539, upload-time = "2025-10-15T03:39:42.982Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335, upload-time = "2025-02-27T19:19:51.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488, upload-time = "2025-02-27T19:18:51.436Z" }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264, upload-time = "2025-02-27T19:18:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048, upload-time = "2025-02-27T19:18:56.536Z" }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111, upload-time = "2025-02-27T19:18:59.439Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771, upload-time = "2025-02-27T19:19:01.944Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742, upload-time = "2025-02-27T19:19:04.632Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msgpack" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260, upload-time = "2024-09-10T04:25:52.197Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421, upload-time = "2024-09-10T04:25:49.63Z" }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277, upload-time = "2024-09-10T04:24:48.562Z" }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222, upload-time = "2024-09-10T04:25:36.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971, upload-time = "2024-09-10T04:24:58.129Z" }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403, upload-time = "2024-09-10T04:25:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356, upload-time = "2024-09-10T04:25:31.406Z" }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028, upload-time = "2024-09-10T04:25:17.08Z" }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100, upload-time = "2024-09-10T04:25:08.993Z" }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254, upload-time = "2024-09-10T04:25:06.048Z" }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085, upload-time = "2024-09-10T04:25:01.494Z" }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347, upload-time = "2024-09-10T04:25:33.106Z" }, +] + +[[package]] +name = "msgpack-numpy" +version = "0.4.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msgpack" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/94/61e8aee142733ebfdc400a05bdac6e1763c4514bba3b42743d223f388450/msgpack-numpy-0.4.8.tar.gz", hash = "sha256:c667d3180513422f9c7545be5eec5d296dcbb357e06f72ed39cc683797556e69", size = 10923, upload-time = "2022-06-09T03:43:08.739Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/5d/f25ac7d4fb77cbd53ddc6d05d833c6bf52b12770a44fa9a447eed470ca9a/msgpack_numpy-0.4.8-py2.py3-none-any.whl", hash = "sha256:773c19d4dfbae1b3c7b791083e2caf66983bb19b40901646f61d8731554ae3da", size = 6919, upload-time = "2022-06-09T03:43:06.82Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload-time = "2024-01-28T18:52:34.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload-time = "2024-01-28T18:52:26.062Z" }, + { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload-time = "2024-01-28T18:52:28.115Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload-time = "2024-01-28T18:52:29.395Z" }, + { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload-time = "2024-01-28T18:52:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload-time = "2024-01-28T18:52:31.981Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, +] + +[[package]] +name = "nvidia-cublas" +version = "13.4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cuda-nvrtc" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/48/8571e55aaabbd112f06a39a71fbc3abf0b8a0d450921816a13a6d5e8fa0b/nvidia_cublas-13.4.0.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:705d7d214fbb20f134415ecadc488abf74f444c155a6555dec5687404afb18a9", size = 513051304, upload-time = "2026-04-13T09:49:32.758Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ec/c9b2998aebe3149dee2769e501257e048c8701de51263925f4dff76ddedc/nvidia_cublas-13.4.0.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:53bf22e2ccbf644db74b6cc21cea7f5efb1a52aa64515438b430abbd05af4106", size = 404872465, upload-time = "2026-04-13T09:50:12.116Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti" +version = "13.2.75" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/e2/b7bbe4e39781024fcc698fa3d0a788cd9559d9cba5e23fdbcff0a27783e4/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:003157a0ca04d34a1f83a764dcbe36eabceda5a771e9a2cc85a461b2765888b6", size = 11759634, upload-time = "2026-04-13T09:40:35.162Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2d/cbf8f6288259c502165282fdaa2b733daae98434e3f2aee2b7952ba87c6f/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:f75aca6bef89c625a4076a820302bb06764daa1d21595286f6bee5e237d3a187", size = 11986992, upload-time = "2026-04-13T09:40:54.517Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc" +version = "13.2.78" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/96/237b40b171e06eb65905375c4ad5c96f78c2f861ac6e8ae7f650d95e1dfd/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a9049031da08cbedd0c20e3470e5a978dc330af0e0326b3b05774718c665dc3e", size = 47019062, upload-time = "2026-04-13T09:45:33.875Z" }, + { url = "https://files.pythonhosted.org/packages/af/be/8476aa006686fb264d61de43e0408a8dbd001003a702574759b25e645587/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a50367a7e2a0bd00fb27e5648179149cc7a60e7c7811740a5ff559f06234526d", size = 44754755, upload-time = "2026-04-13T09:44:58.919Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime" +version = "13.2.75" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/40/56a70b5a4e0a2881a1b7c172fea8025ab6b3cfb2de61c743fb7974d1ded4/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36e539e8deb01568025830c1454216c26ef4b4529507220b1d8ef739bf5c6439", size = 2339755, upload-time = "2026-04-13T09:37:53.791Z" }, + { url = "https://files.pythonhosted.org/packages/dc/74/f1493b0774c6eaf0234512bb650e1ab90ce8f61fecf0b4aaf1fb416f571e/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72bf454902da594e0b833cadeddc8b7100ce1c7cf7ed9023943931be1aa913b7", size = 2321965, upload-time = "2026-04-13T09:38:26.359Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu13" +version = "9.20.0.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/c5/83384d846b2fd17c44bd499b36c75a45ed4f095fbbb2252294e89cea5c5c/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1", size = 444574296, upload-time = "2026-03-09T19:28:27.751Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5e/edb9c0ae051602c3ccaffe424256463636d639e27d7f302dde9975ef9e7a/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304", size = 366173588, upload-time = "2026-03-09T19:29:34.474Z" }, +] + +[[package]] +name = "nvidia-cufft" +version = "12.2.0.46" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/b1/6e36381739b51e692d91646298ad5685c562929b899331c2bb6e9722a176/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e8f3a22c2745f95327b7639ba2868ea2cbd5d3131ebe6313394e24164054f41", size = 218244743, upload-time = "2026-04-13T09:51:24.75Z" }, + { url = "https://files.pythonhosted.org/packages/36/3e/8d717a6e1f6e27b85b64650b1104dbcf6108c9dc7e27e9e26a0d8e936cc5/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a9667ae4d81b9e54ddbbad24a9e72334f89d4fc184566d05ef028e2760c820eb", size = 218258098, upload-time = "2026-04-13T09:52:04.915Z" }, +] + +[[package]] +name = "nvidia-cufile" +version = "1.17.1.22" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/fd/4b4157512a131a51e1514d40d0199b1c5b7b10c6856db274ff22e5fe15be/nvidia_cufile-1.17.1.22-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bec33d7f1f12691dce330275246587569c2ed90b1ce43b0f94b3e1ce9268744b", size = 1226736, upload-time = "2026-04-13T09:52:40.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/c5/661a73a9042fc5f81cdd5fe6e89f4170b3b33f7962e709987e2b5e5f1381/nvidia_cufile-1.17.1.22-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:87feaf8c3ad20d3d03a01933181801ff6892bace5c8f0b1e4b48f319d3e62d36", size = 1387670, upload-time = "2026-04-13T09:52:57.783Z" }, +] + +[[package]] +name = "nvidia-curand" +version = "10.4.2.55" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/7c/7c2042b5badc251236bc1f23627d5554cf2ecff37e92ea0a9d39dfc20a61/nvidia_curand-10.4.2.55-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:342e40ddcaedc92aedc72839e0c10064096fceea2f1d0eb57951f86d2901f8c0", size = 62372157, upload-time = "2026-04-13T09:53:32.34Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bc/f02a1d180d288e49b1a4548698b59755e9c485ee39c041fdeaf4d2cc2117/nvidia_curand-10.4.2.55-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b4080cab49d4939f8e46b2c195c76c698d2289835c36ede558836daa40000e70", size = 59920450, upload-time = "2026-04-13T09:54:07.224Z" }, +] + +[[package]] +name = "nvidia-cusolver" +version = "12.2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas" }, + { name = "nvidia-cusparse" }, + { name = "nvidia-nvjitlink" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/21/21e5c491a8285a6ed039cbb8c60ec13ff3aff60c669e1caa4adaeb71f997/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9def09fcf300b9465cdf800142abf10149df28c4290bdf9e7b4a700480d31d7", size = 249744985, upload-time = "2026-04-13T09:54:33.757Z" }, + { url = "https://files.pythonhosted.org/packages/6b/97/a3c41eac54c89f6aac788d2b3ccd6642b32aa6b79650af3dedb8ee7c2bfa/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4693ea3c2a5d20369da7b5a4970a41df9b40f1b6f2ef9909c95f7c8c8c5ffb4d", size = 227391570, upload-time = "2026-04-13T09:55:12.999Z" }, +] + +[[package]] +name = "nvidia-cusparse" +version = "12.7.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/09/9f1fa88dd305e838b71f2ca4e50064e7cbdf2e15cd6410d9e1b74066cc41/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80cc98b38fdcf054a80bd9782fe2e63c66f90e202cac269f641357ccac5fe7e3", size = 168860233, upload-time = "2026-04-13T09:55:48.891Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bd/bad43b37bcf13167637bef26399693d517b95092d742e8749eda5f4a85f3/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0d110640aa63e7182fa787cc245afa07c5fb84ac30f1c4029e4fa3012353172", size = 150855566, upload-time = "2026-04-13T09:56:29.21Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu13" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" }, + { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" }, +] + +[[package]] +name = "nvidia-nccl-cu13" +version = "2.29.7" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/0d/daf50d44177ee0cbc7ff0a0c91eb5ff676c82be42f9a970bc7597f440c3a/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:674a12383e3c38a1bcccae7d4f3633b37852230b6047883cb2f4c2d1b36d9bf5", size = 206014712, upload-time = "2026-03-03T05:34:20.843Z" }, + { url = "https://files.pythonhosted.org/packages/67/f4/58e4e91b6919367c7aafb8e36fce9aad1a3047e536bf7e2fd560927d3a4c/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:edd81538446786ec3b73972543e53bb43bcaf0bfc8ef76cb679fcc390ffe136d", size = 205976000, upload-time = "2026-03-03T05:36:24.472Z" }, +] + +[[package]] +name = "nvidia-nvjitlink" +version = "13.3.33" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/ee/580ca6f29dcab0221db8706badca1bbbb084f1975c4d4e83329c3a7e31f0/nvidia_nvjitlink-13.3.33-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:26a6de7fb4c8fdaa7703d3dad720d6d427ddfea5c48a528fd97c11733ad830e5", size = 40742423, upload-time = "2026-05-26T16:54:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/69/30/45414e35ff2eee7db3da037e5707037ccf9d2b5218ffbdb055ea4d5aa98a/nvidia_nvjitlink-13.3.33-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ce48b37dfeb3cb1eae4cf85adacb47d7a6539ea2272870c9a3628ce275c2037e", size = 39168635, upload-time = "2026-05-26T16:54:13.906Z" }, +] + +[[package]] +name = "nvidia-nvshmem-cu13" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" }, +] + +[[package]] +name = "nvidia-nvtx" +version = "13.2.75" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/cc/314eac684677dced22b913b5d1b3d03adcbe59d6c7332c5d04f864cdb079/nvidia_nvtx-13.2.75-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2d7c24fc582d841493c6dc2cf017c25e4428cf583a3bd9e9325a65f0ecc65f73", size = 153460, upload-time = "2026-04-13T09:46:23.256Z" }, + { url = "https://files.pythonhosted.org/packages/6a/48/c02f2aa1662edaddac87e0501142a65765af8010a788b087d920a9f80fb7/nvidia_nvtx-13.2.75-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d8e1c4a14a21d6dd4bc2fc59eb1e3f42447db40edf5d0f580c0eba5f9abb606c", size = 154291, upload-time = "2026-04-13T09:45:53.009Z" }, +] + +[[package]] +name = "omegaconf" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120, upload-time = "2022-12-08T20:59:22.753Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500, upload-time = "2022-12-08T20:59:19.686Z" }, +] + +[[package]] +name = "onnx" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/8a/335c03a8683a88a32f9a6bb98899ea6df241a41df64b37b9696772414794/onnx-1.20.1.tar.gz", hash = "sha256:ded16de1df563d51fbc1ad885f2a426f814039d8b5f4feb77febe09c0295ad67", size = 12048980, upload-time = "2026-01-10T01:40:03.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/4c/4b17e82f91ab9aa07ff595771e935ca73547b035030dc5f5a76e63fbfea9/onnx-1.20.1-cp312-abi3-macosx_12_0_universal2.whl", hash = "sha256:1d923bb4f0ce1b24c6859222a7e6b2f123e7bfe7623683662805f2e7b9e95af2", size = 17903547, upload-time = "2026-01-10T01:39:31.015Z" }, + { url = "https://files.pythonhosted.org/packages/64/5e/1bfa100a9cb3f2d3d5f2f05f52f7e60323b0e20bb0abace1ae64dbc88f25/onnx-1.20.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddc0b7d8b5a94627dc86c533d5e415af94cbfd103019a582669dad1f56d30281", size = 17412021, upload-time = "2026-01-10T01:39:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/d3fec0dcf9a7a99e7368112d9c765154e81da70fcba1e3121131a45c245b/onnx-1.20.1-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9336b6b8e6efcf5c490a845f6afd7e041c89a56199aeda384ed7d58fb953b080", size = 17510450, upload-time = "2026-01-10T01:39:36.589Z" }, + { url = "https://files.pythonhosted.org/packages/74/a7/edce1403e05a46e59b502fae8e3350ceeac5841f8e8f1561e98562ed9b09/onnx-1.20.1-cp312-abi3-win32.whl", hash = "sha256:564c35a94811979808ab5800d9eb4f3f32c12daedba7e33ed0845f7c61ef2431", size = 16238216, upload-time = "2026-01-10T01:39:39.46Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c7/8690c81200ae652ac550c1df52f89d7795e6cc941f3cb38c9ef821419e80/onnx-1.20.1-cp312-abi3-win_amd64.whl", hash = "sha256:9fe7f9a633979d50984b94bda8ceb7807403f59a341d09d19342dc544d0ca1d5", size = 16389207, upload-time = "2026-01-10T01:39:41.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/a0/4fb0e6d36eaf079af366b2c1f68bafe92df6db963e2295da84388af64abc/onnx-1.20.1-cp312-abi3-win_arm64.whl", hash = "sha256:21d747348b1c8207406fa2f3e12b82f53e0d5bb3958bcd0288bd27d3cb6ebb00", size = 16344155, upload-time = "2026-01-10T01:39:45.536Z" }, +] + +[[package]] +name = "onnx-ir" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "sympy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/a5/acc43c8fa6edbc584d127fb6bbd13ae9ebfc01b9675c74e0da2de15fa4a6/onnx_ir-0.2.0.tar.gz", hash = "sha256:8bad3906691987290789b26d05e0dbff467029a0b1e411e12e4cae02e43503e4", size = 141693, upload-time = "2026-02-24T02:31:10.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/df/a99736bcca6b16e36c687ce4996abcf4ce73c514fddd9e730cfcb6a334f2/onnx_ir-0.2.0-py3-none-any.whl", hash = "sha256:eb14d1399c2442bd1ff702719e70074e9cedfa3af5729416a32752c9e0f82591", size = 164100, upload-time = "2026-02-24T02:31:09.454Z" }, +] + +[[package]] +name = "onnxscript" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "onnx-ir" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/2b/538fdeb0e25bed5d7e0f954af5710543e2629499fb74381afc3333f8a8ae/onnxscript-0.6.2.tar.gz", hash = "sha256:abb2e6f464db40c9b8c7fbb3e64cca04cf3f4495e67c4eda5eac17b784191ce3", size = 590865, upload-time = "2026-02-10T22:53:39.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/56/e6b179397497ab93266b6eb00743403a6a699a29063a423c4a14595d3db9/onnxscript-0.6.2-py3-none-any.whl", hash = "sha256:20e3c3fd1da19b3655549d5455a2df719db47374fe430e01e865ae69127c37b9", size = 689064, upload-time = "2026-02-10T22:53:41.663Z" }, +] + +[[package]] +name = "opencv-python-headless" +version = "4.11.0.86" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929, upload-time = "2025-01-16T13:53:40.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460, upload-time = "2025-01-16T13:52:57.015Z" }, + { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330, upload-time = "2025-01-16T13:55:45.731Z" }, + { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060, upload-time = "2025-01-16T13:51:59.625Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856, upload-time = "2025-01-16T13:53:29.654Z" }, + { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425, upload-time = "2025-01-16T13:52:49.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386, upload-time = "2025-01-16T13:52:56.418Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, +] + +[[package]] +name = "parso" +version = "0.8.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, +] + +[[package]] +name = "peft" +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch" }, + { name = "tqdm" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/b8/2e79377efaa1e5f0d70a497db7914ffd355846e760ffa2f7883ab0f600fb/peft-0.17.1.tar.gz", hash = "sha256:e6002b42517976c290b3b8bbb9829a33dd5d470676b2dec7cb4df8501b77eb9f", size = 568192, upload-time = "2025-08-21T09:25:22.703Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fe/a2da1627aa9cb6310b6034598363bd26ac301c4a99d21f415b1b2855891e/peft-0.17.1-py3-none-any.whl", hash = "sha256:3d129d64def3d74779c32a080d2567e5f7b674e77d546e3585138216d903f99e", size = 504896, upload-time = "2025-08-21T09:25:18.974Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pfzy" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/5a/32b50c077c86bfccc7bed4881c5a2b823518f5450a30e639db5d3711952e/pfzy-0.3.4.tar.gz", hash = "sha256:717ea765dd10b63618e7298b2d98efd819e0b30cd5905c9707223dceeb94b3f1", size = 8396, upload-time = "2022-01-28T02:26:17.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/d7/8ff98376b1acc4503253b685ea09981697385ce344d4e3935c2af49e044d/pfzy-0.3.4-py3-none-any.whl", hash = "sha256:5f50d5b2b3207fa72e7ec0ef08372ef652685470974a107d0d4999fc5a903a96", size = 8537, upload-time = "2022-01-28T02:26:16.047Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" }, + { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" }, + { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pyarrow" +version = "23.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/22/134986a4cc224d593c1afde5494d18ff629393d74cc2eddb176669f234a4/pyarrow-23.0.1.tar.gz", hash = "sha256:b8c5873e33440b2bc2f4a79d2b47017a89c5a24116c055625e6f2ee50523f019", size = 1167336, upload-time = "2026-02-16T10:14:12.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/4b/4166bb5abbfe6f750fc60ad337c43ecf61340fa52ab386da6e8dbf9e63c4/pyarrow-23.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f4b0dbfa124c0bb161f8b5ebb40f1a680b70279aa0c9901d44a2b5a20806039f", size = 34214575, upload-time = "2026-02-16T10:09:56.225Z" }, + { url = "https://files.pythonhosted.org/packages/e1/da/3f941e3734ac8088ea588b53e860baeddac8323ea40ce22e3d0baa865cc9/pyarrow-23.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7707d2b6673f7de054e2e83d59f9e805939038eebe1763fe811ee8fa5c0cd1a7", size = 35832540, upload-time = "2026-02-16T10:10:03.428Z" }, + { url = "https://files.pythonhosted.org/packages/88/7c/3d841c366620e906d54430817531b877ba646310296df42ef697308c2705/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:86ff03fb9f1a320266e0de855dee4b17da6794c595d207f89bba40d16b5c78b9", size = 44470940, upload-time = "2026-02-16T10:10:10.704Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a5/da83046273d990f256cb79796a190bbf7ec999269705ddc609403f8c6b06/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:813d99f31275919c383aab17f0f455a04f5a429c261cc411b1e9a8f5e4aaaa05", size = 47586063, upload-time = "2026-02-16T10:10:17.95Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/b7d2ebcff47a514f47f9da1e74b7949138c58cfeb108cdd4ee62f43f0cf3/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bf5842f960cddd2ef757d486041d57c96483efc295a8c4a0e20e704cbbf39c67", size = 48173045, upload-time = "2026-02-16T10:10:25.363Z" }, + { url = "https://files.pythonhosted.org/packages/43/b2/b40961262213beaba6acfc88698eb773dfce32ecdf34d19291db94c2bd73/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564baf97c858ecc03ec01a41062e8f4698abc3e6e2acd79c01c2e97880a19730", size = 50621741, upload-time = "2026-02-16T10:10:33.477Z" }, + { url = "https://files.pythonhosted.org/packages/f6/70/1fdda42d65b28b078e93d75d371b2185a61da89dda4def8ba6ba41ebdeb4/pyarrow-23.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:07deae7783782ac7250989a7b2ecde9b3c343a643f82e8a4df03d93b633006f0", size = 27620678, upload-time = "2026-02-16T10:10:39.31Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-timeout" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-discovery" +version = "1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/7e/9f3b0dd3a074a6c3e1e79f35e465b1f2ee4b262d619de00cfce523cc9b24/python_discovery-1.1.3.tar.gz", hash = "sha256:7acca36e818cd88e9b2ba03e045ad7e93e1713e29c6bbfba5d90202310b7baa5", size = 56945, upload-time = "2026-03-10T15:08:15.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/80/73211fc5bfbfc562369b4aa61dc1e4bf07dc7b34df7b317e4539316b809c/python_discovery-1.1.3-py3-none-any.whl", hash = "sha256:90e795f0121bc84572e737c9aa9966311b9fde44ffb88a5953b3ec9b31c6945e", size = 31485, upload-time = "2026-03-10T15:08:13.06Z" }, +] + +[[package]] +name = "pytz" +version = "2026.1.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/5f/557d2032a2f471edbcc227da724c24a1c05887b5cda1e3ae53af98b9e0a5/pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b", size = 281158, upload-time = "2025-08-03T05:05:40.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/9b/c0957041067c7724b310f22c398be46399297c12ed834c3bc42200a2756f/pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd", size = 1305432, upload-time = "2025-08-03T05:03:32.177Z" }, + { url = "https://files.pythonhosted.org/packages/8e/55/bd3a312790858f16b7def3897a0c3eb1804e974711bf7b9dcb5f47e7f82c/pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd", size = 895095, upload-time = "2025-08-03T05:03:33.918Z" }, + { url = "https://files.pythonhosted.org/packages/20/50/fc384631d8282809fb1029a4460d2fe90fa0370a0e866a8318ed75c8d3bb/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a", size = 651826, upload-time = "2025-08-03T05:03:35.818Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0a/2356305c423a975000867de56888b79e44ec2192c690ff93c3109fd78081/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577", size = 839751, upload-time = "2025-08-03T05:03:37.265Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1b/81e95ad256ca7e7ccd47f5294c1c6da6e2b64fbace65b84fe8a41470342e/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e", size = 1641359, upload-time = "2025-08-03T05:03:38.799Z" }, + { url = "https://files.pythonhosted.org/packages/50/63/9f50ec965285f4e92c265c8f18344e46b12803666d8b73b65d254d441435/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb", size = 2020281, upload-time = "2025-08-03T05:03:40.338Z" }, + { url = "https://files.pythonhosted.org/packages/02/4a/19e3398d0dc66ad2b463e4afa1fc541d697d7bc090305f9dfb948d3dfa29/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55", size = 1877112, upload-time = "2025-08-03T05:03:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/bf/42/c562e9151aa90ed1d70aac381ea22a929d6b3a2ce4e1d6e2e135d34fd9c6/pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb", size = 558177, upload-time = "2025-08-03T05:03:43.979Z" }, + { url = "https://files.pythonhosted.org/packages/40/96/5c50a7d2d2b05b19994bf7336b97db254299353dd9b49b565bb71b485f03/pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686", size = 618923, upload-time = "2025-08-03T05:03:45.438Z" }, + { url = "https://files.pythonhosted.org/packages/13/33/1ec89c8f21c89d21a2eaff7def3676e21d8248d2675705e72554fb5a6f3f/pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed", size = 552358, upload-time = "2025-08-03T05:03:46.887Z" }, +] + +[[package]] +name = "regex" +version = "2026.2.28" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/71/41455aa99a5a5ac1eaf311f5d8efd9ce6433c03ac1e0962de163350d0d97/regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2", size = 415184, upload-time = "2026-02-28T02:19:42.792Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/42/9061b03cf0fc4b5fa2c3984cbbaed54324377e440a5c5a29d29a72518d62/regex-2026.2.28-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fcf26c3c6d0da98fada8ae4ef0aa1c3405a431c0a77eb17306d38a89b02adcd7", size = 489574, upload-time = "2026-02-28T02:16:50.455Z" }, + { url = "https://files.pythonhosted.org/packages/77/83/0c8a5623a233015595e3da499c5a1c13720ac63c107897a6037bb97af248/regex-2026.2.28-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02473c954af35dd2defeb07e44182f5705b30ea3f351a7cbffa9177beb14da5d", size = 291426, upload-time = "2026-02-28T02:16:52.52Z" }, + { url = "https://files.pythonhosted.org/packages/9e/06/3ef1ac6910dc3295ebd71b1f9bfa737e82cfead211a18b319d45f85ddd09/regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b65d33a17101569f86d9c5966a8b1d7fbf8afdda5a8aa219301b0a80f58cf7d", size = 289200, upload-time = "2026-02-28T02:16:54.08Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c9/8cc8d850b35ab5650ff6756a1cb85286e2000b66c97520b29c1587455344/regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71dcecaa113eebcc96622c17692672c2d104b1d71ddf7adeda90da7ddeb26fc", size = 796765, upload-time = "2026-02-28T02:16:55.905Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5d/57702597627fc23278ebf36fbb497ac91c0ce7fec89ac6c81e420ca3e38c/regex-2026.2.28-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:481df4623fa4969c8b11f3433ed7d5e3dc9cec0f008356c3212b3933fb77e3d8", size = 863093, upload-time = "2026-02-28T02:16:58.094Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/f3ecad537ca2811b4d26b54ca848cf70e04fcfc138667c146a9f3157779c/regex-2026.2.28-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64e7c6ad614573e0640f271e811a408d79a9e1fe62a46adb602f598df42a818d", size = 909455, upload-time = "2026-02-28T02:17:00.918Z" }, + { url = "https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4", size = 802037, upload-time = "2026-02-28T02:17:02.842Z" }, + { url = "https://files.pythonhosted.org/packages/44/7c/c6d91d8911ac6803b45ca968e8e500c46934e58c0903cbc6d760ee817a0a/regex-2026.2.28-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:864cdd1a2ef5716b0ab468af40139e62ede1b3a53386b375ec0786bb6783fc05", size = 775113, upload-time = "2026-02-28T02:17:04.506Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8d/4a9368d168d47abd4158580b8c848709667b1cd293ff0c0c277279543bd0/regex-2026.2.28-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:511f7419f7afab475fd4d639d4aedfc54205bcb0800066753ef68a59f0f330b5", size = 784194, upload-time = "2026-02-28T02:17:06.888Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bf/2c72ab5d8b7be462cb1651b5cc333da1d0068740342f350fcca3bca31947/regex-2026.2.28-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b42f7466e32bf15a961cf09f35fa6323cc72e64d3d2c990b10de1274a5da0a59", size = 856846, upload-time = "2026-02-28T02:17:09.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f4/6b65c979bb6d09f51bb2d2a7bc85de73c01ec73335d7ddd202dcb8cd1c8f/regex-2026.2.28-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8710d61737b0c0ce6836b1da7109f20d495e49b3809f30e27e9560be67a257bf", size = 763516, upload-time = "2026-02-28T02:17:11.004Z" }, + { url = "https://files.pythonhosted.org/packages/8e/32/29ea5e27400ee86d2cc2b4e80aa059df04eaf78b4f0c18576ae077aeff68/regex-2026.2.28-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4390c365fd2d45278f45afd4673cb90f7285f5701607e3ad4274df08e36140ae", size = 849278, upload-time = "2026-02-28T02:17:12.693Z" }, + { url = "https://files.pythonhosted.org/packages/1d/91/3233d03b5f865111cd517e1c95ee8b43e8b428d61fa73764a80c9bb6f537/regex-2026.2.28-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb3b1db8ff6c7b8bf838ab05583ea15230cb2f678e569ab0e3a24d1e8320940b", size = 790068, upload-time = "2026-02-28T02:17:14.9Z" }, + { url = "https://files.pythonhosted.org/packages/76/92/abc706c1fb03b4580a09645b206a3fc032f5a9f457bc1a8038ac555658ab/regex-2026.2.28-cp312-cp312-win32.whl", hash = "sha256:f8ed9a5d4612df9d4de15878f0bc6aa7a268afbe5af21a3fdd97fa19516e978c", size = 266416, upload-time = "2026-02-28T02:17:17.15Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/2a6f7dff190e5fa9df9fb4acf2fdf17a1aa0f7f54596cba8de608db56b3a/regex-2026.2.28-cp312-cp312-win_amd64.whl", hash = "sha256:01d65fd24206c8e1e97e2e31b286c59009636c022eb5d003f52760b0f42155d4", size = 277297, upload-time = "2026-02-28T02:17:18.723Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f0/58a2484851fadf284458fdbd728f580d55c1abac059ae9f048c63b92f427/regex-2026.2.28-cp312-cp312-win_arm64.whl", hash = "sha256:c0b5ccbb8ffb433939d248707d4a8b31993cb76ab1a0187ca886bf50e96df952", size = 270408, upload-time = "2026-02-28T02:17:20.328Z" }, +] + +[[package]] +name = "requests" +version = "2.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, +] + +[[package]] +name = "rich" +version = "14.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/df/f8629c19c5318601d3121e230f74cbee7a3732339c52b21daa2b82ef9c7d/ruff-0.15.6.tar.gz", hash = "sha256:8394c7bb153a4e3811a4ecdacd4a8e6a4fa8097028119160dffecdcdf9b56ae4", size = 4597916, upload-time = "2026-03-12T23:05:47.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/2f/4e03a7e5ce99b517e98d3b4951f411de2b0fa8348d39cf446671adcce9a2/ruff-0.15.6-py3-none-linux_armv6l.whl", hash = "sha256:7c98c3b16407b2cf3d0f2b80c80187384bc92c6774d85fefa913ecd941256fff", size = 10508953, upload-time = "2026-03-12T23:05:17.246Z" }, + { url = "https://files.pythonhosted.org/packages/70/60/55bcdc3e9f80bcf39edf0cd272da6fa511a3d94d5a0dd9e0adf76ceebdb4/ruff-0.15.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ee7dcfaad8b282a284df4aa6ddc2741b3f4a18b0555d626805555a820ea181c3", size = 10942257, upload-time = "2026-03-12T23:05:23.076Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/005c29bd1726c0f492bfa215e95154cf480574140cb5f867c797c18c790b/ruff-0.15.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3bd9967851a25f038fc8b9ae88a7fbd1b609f30349231dffaa37b6804923c4bb", size = 10322683, upload-time = "2026-03-12T23:05:33.738Z" }, + { url = "https://files.pythonhosted.org/packages/5f/74/2f861f5fd7cbb2146bddb5501450300ce41562da36d21868c69b7a828169/ruff-0.15.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13f4594b04e42cd24a41da653886b04d2ff87adbf57497ed4f728b0e8a4866f8", size = 10660986, upload-time = "2026-03-12T23:05:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/c1/a1/309f2364a424eccb763cdafc49df843c282609f47fe53aa83f38272389e0/ruff-0.15.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2ed8aea2f3fe57886d3f00ea5b8aae5bf68d5e195f487f037a955ff9fbaac9e", size = 10332177, upload-time = "2026-03-12T23:05:56.145Z" }, + { url = "https://files.pythonhosted.org/packages/30/41/7ebf1d32658b4bab20f8ac80972fb19cd4e2c6b78552be263a680edc55ac/ruff-0.15.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70789d3e7830b848b548aae96766431c0dc01a6c78c13381f423bf7076c66d15", size = 11170783, upload-time = "2026-03-12T23:06:01.742Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/6d488f6adca047df82cd62c304638bcb00821c36bd4881cfca221561fdfc/ruff-0.15.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:542aaf1de3154cea088ced5a819ce872611256ffe2498e750bbae5247a8114e9", size = 12044201, upload-time = "2026-03-12T23:05:28.697Z" }, + { url = "https://files.pythonhosted.org/packages/71/68/e6f125df4af7e6d0b498f8d373274794bc5156b324e8ab4bf5c1b4fc0ec7/ruff-0.15.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c22e6f02c16cfac3888aa636e9eba857254d15bbacc9906c9689fdecb1953ab", size = 11421561, upload-time = "2026-03-12T23:05:31.236Z" }, + { url = "https://files.pythonhosted.org/packages/f1/9f/f85ef5fd01a52e0b472b26dc1b4bd228b8f6f0435975442ffa4741278703/ruff-0.15.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98893c4c0aadc8e448cfa315bd0cc343a5323d740fe5f28ef8a3f9e21b381f7e", size = 11310928, upload-time = "2026-03-12T23:05:45.288Z" }, + { url = "https://files.pythonhosted.org/packages/8c/26/b75f8c421f5654304b89471ed384ae8c7f42b4dff58fa6ce1626d7f2b59a/ruff-0.15.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:70d263770d234912374493e8cc1e7385c5d49376e41dfa51c5c3453169dc581c", size = 11235186, upload-time = "2026-03-12T23:05:50.677Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/d5a6d065962ff7a68a86c9b4f5500f7d101a0792078de636526c0edd40da/ruff-0.15.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:55a1ad63c5a6e54b1f21b7514dfadc0c7fb40093fa22e95143cf3f64ebdcd512", size = 10635231, upload-time = "2026-03-12T23:05:37.044Z" }, + { url = "https://files.pythonhosted.org/packages/d6/56/7c3acf3d50910375349016cf33de24be021532042afbed87942858992491/ruff-0.15.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8dc473ba093c5ec238bb1e7429ee676dca24643c471e11fbaa8a857925b061c0", size = 10340357, upload-time = "2026-03-12T23:06:04.748Z" }, + { url = "https://files.pythonhosted.org/packages/06/54/6faa39e9c1033ff6a3b6e76b5df536931cd30caf64988e112bbf91ef5ce5/ruff-0.15.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:85b042377c2a5561131767974617006f99f7e13c63c111b998f29fc1e58a4cfb", size = 10860583, upload-time = "2026-03-12T23:05:58.978Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/509a201b843b4dfb0b32acdedf68d951d3377988cae43949ba4c4133a96a/ruff-0.15.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cef49e30bc5a86a6a92098a7fbf6e467a234d90b63305d6f3ec01225a9d092e0", size = 11410976, upload-time = "2026-03-12T23:05:39.955Z" }, + { url = "https://files.pythonhosted.org/packages/6c/25/3fc9114abf979a41673ce877c08016f8e660ad6cf508c3957f537d2e9fa9/ruff-0.15.6-py3-none-win32.whl", hash = "sha256:bbf67d39832404812a2d23020dda68fee7f18ce15654e96fb1d3ad21a5fe436c", size = 10616872, upload-time = "2026-03-12T23:05:42.451Z" }, + { url = "https://files.pythonhosted.org/packages/89/7a/09ece68445ceac348df06e08bf75db72d0e8427765b96c9c0ffabc1be1d9/ruff-0.15.6-py3-none-win_amd64.whl", hash = "sha256:aee25bc84c2f1007ecb5037dff75cef00414fdf17c23f07dc13e577883dca406", size = 11787271, upload-time = "2026-03-12T23:05:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/7f/d0/578c47dd68152ddddddf31cd7fc67dc30b7cdf639a86275fda821b0d9d98/ruff-0.15.6-py3-none-win_arm64.whl", hash = "sha256:c34de3dd0b0ba203be50ae70f5910b17188556630e2178fd7d79fc030eb0d837", size = 11060497, upload-time = "2026-03-12T23:05:25.968Z" }, +] + +[[package]] +name = "safetensors" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, +] + +[[package]] +name = "scikit-image" +version = "0.25.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "imageio" }, + { name = "lazy-loader" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "scipy" }, + { name = "tifffile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/a8/3c0f256012b93dd2cb6fda9245e9f4bff7dc0486880b248005f15ea2255e/scikit_image-0.25.2.tar.gz", hash = "sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde", size = 22693594, upload-time = "2025-02-18T18:05:24.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/8c/5df82881284459f6eec796a5ac2a0a304bb3384eec2e73f35cfdfcfbf20c/scikit_image-0.25.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb", size = 13986000, upload-time = "2025-02-18T18:04:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e6/93bebe1abcdce9513ffec01d8af02528b4c41fb3c1e46336d70b9ed4ef0d/scikit_image-0.25.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed", size = 13235893, upload-time = "2025-02-18T18:04:51.049Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/eda616e33f67129e5979a9eb33c710013caa3aa8a921991e6cc0b22cea33/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d", size = 14178389, upload-time = "2025-02-18T18:04:54.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b5/b75527c0f9532dd8a93e8e7cd8e62e547b9f207d4c11e24f0006e8646b36/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824", size = 15003435, upload-time = "2025-02-18T18:04:57.586Z" }, + { url = "https://files.pythonhosted.org/packages/34/e3/49beb08ebccda3c21e871b607c1cb2f258c3fa0d2f609fed0a5ba741b92d/scikit_image-0.25.2-cp312-cp312-win_amd64.whl", hash = "sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2", size = 12899474, upload-time = "2025-02-18T18:05:01.166Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, +] + +[[package]] +name = "sentry-sdk" +version = "2.55.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/b8/285293dc60fc198fffc3fcdbc7c6d4e646e0f74e61461c355d40faa64ceb/sentry_sdk-2.55.0.tar.gz", hash = "sha256:3774c4d8820720ca4101548131b9c162f4c9426eb7f4d24aca453012a7470f69", size = 424505, upload-time = "2026-03-17T14:15:51.707Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/66/20465097782d7e1e742d846407ea7262d338c6e876ddddad38ca8907b38f/sentry_sdk-2.55.0-py2.py3-none-any.whl", hash = "sha256:97026981cb15699394474a196b88503a393cbc58d182ece0d3abe12b9bd978d4", size = 449284, upload-time = "2026-03-17T14:15:49.604Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "shtab" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/7a/7f131b6082d8b592c32e4312d0a6da3d0b28b8f0d305ddd93e49c9d89929/shtab-1.8.0.tar.gz", hash = "sha256:75f16d42178882b7f7126a0c2cb3c848daed2f4f5a276dd1ded75921cc4d073a", size = 46062, upload-time = "2025-11-18T10:57:47.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/e1/202a31727b0d096a04380f78e809074d7a1d0a22d9d5a39fea1d2353fd02/shtab-1.8.0-py3-none-any.whl", hash = "sha256:f0922a82174b4007e06ac0bac4f79abd826c5cca88e201bfd927f889803c571d", size = 14457, upload-time = "2025-11-18T10:57:45.906Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tensorrt-cu13" +version = "10.16.1.11" +source = { registry = "https://pypi.nvidia.com/" } +dependencies = [ + { name = "tensorrt-cu13-bindings" }, + { name = "tensorrt-cu13-libs" }, +] +sdist = { url = "https://pypi.nvidia.com/tensorrt-cu13/tensorrt_cu13-10.16.1.11.tar.gz", hash = "sha256:5d34203a92f38851b150c4eddd32b9b55c01fd40fc4d19bff83e8dfef1d8f69e" } + +[[package]] +name = "tensorrt-cu13-bindings" +version = "10.16.1.11" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/6d/d46fd241895091d11d0e55a389abc5711c71892e8e63b03e272e61ca880a/tensorrt_cu13_bindings-10.16.1.11-cp312-none-manylinux_2_28_x86_64.whl", hash = "sha256:2fb87ac24a5e5f42e43f283c16d1b661dc72ef18568fd847ce2080b7db9ca232", size = 1341248, upload-time = "2026-04-07T19:42:10.807Z" }, + { url = "https://files.pythonhosted.org/packages/ee/bb/3513236bc1b69fc6b88722f0f1f62ae4afd74b9f417ad3abf9a2bf971f22/tensorrt_cu13_bindings-10.16.1.11-cp312-none-manylinux_2_35_aarch64.whl", hash = "sha256:80d0cea41cb695e73a442ab5a0c1fb023730c488caa93ee3ca9c49d57314821d", size = 1329585, upload-time = "2026-04-07T19:42:35.412Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a8/dfda48ab992050f40d0b2da7a795f16db403f48ee89e6a526cbd00133445/tensorrt_cu13_bindings-10.16.1.11-cp312-none-win_amd64.whl", hash = "sha256:70ca2d73301ff427104d7986c26d5fa56f6a91578242d20e82b37c139be14ec0", size = 964883, upload-time = "2026-04-07T19:44:07.702Z" }, +] + +[[package]] +name = "tensorrt-cu13-libs" +version = "10.16.1.11" +source = { registry = "https://pypi.nvidia.com/" } +wheels = [ + { url = "https://pypi.nvidia.com/tensorrt-cu13-libs/tensorrt_cu13_libs-10.16.1.11-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:91142c8ab3c58bed213cf1a563a6eb4e4f0ac529d05b5f909073acece0e3b712" }, + { url = "https://pypi.nvidia.com/tensorrt-cu13-libs/tensorrt_cu13_libs-10.16.1.11-py3-none-manylinux_2_35_aarch64.whl", hash = "sha256:26f58281c79591b68c3ba1cf061ea11fac747feba0622954dbc892c2998d0153" }, + { url = "https://pypi.nvidia.com/tensorrt-cu13-libs/tensorrt_cu13_libs-10.16.1.11-py3-none-win_amd64.whl", hash = "sha256:96262c3e8c64a45abd29aa3482d99480fac6845bd420b6de125699bb1ae365ff" }, +] + +[[package]] +name = "termcolor" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/56/ab275c2b56a5e2342568838f0d5e3e66a32354adcc159b495e374cda43f5/termcolor-3.2.0.tar.gz", hash = "sha256:610e6456feec42c4bcd28934a8c87a06c3fa28b01561d46aa09a9881b8622c58", size = 14423, upload-time = "2025-10-25T19:11:42.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/d5/141f53d7c1eb2a80e6d3e9a390228c3222c27705cbe7f048d3623053f3ca/termcolor-3.2.0-py3-none-any.whl", hash = "sha256:a10343879eba4da819353c55cb8049b0933890c2ebf9ad5d3ecd2bb32ea96ea6", size = 7698, upload-time = "2025-10-25T19:11:41.536Z" }, +] + +[[package]] +name = "tifffile" +version = "2025.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/d0/18fed0fc0916578a4463f775b0fbd9c5fed2392152d039df2fb533bfdd5d/tifffile-2025.5.10.tar.gz", hash = "sha256:018335d34283aa3fd8c263bae5c3c2b661ebc45548fde31504016fcae7bf1103", size = 365290, upload-time = "2025-05-10T19:22:34.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/06/bd0a6097da704a7a7c34a94cfd771c3ea3c2f405dd214e790d22c93f6be1/tifffile-2025.5.10-py3-none-any.whl", hash = "sha256:e37147123c0542d67bc37ba5cdd67e12ea6fbe6e86c52bee037a9eb6a064e5ad", size = 226533, upload-time = "2025-05-10T19:22:27.279Z" }, +] + +[[package]] +name = "tokenizers" +version = "0.22.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, + { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, + { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, + { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, +] + +[[package]] +name = "torch" +version = "2.13.0+cu132" +source = { registry = "https://download.pytorch.org/whl/cu132" } +dependencies = [ + { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, + { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux'" }, + { name = "setuptools" }, + { name = "sympy" }, + { name = "triton", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu132/torch-2.13.0%2Bcu132-cp312-cp312-manylinux_2_28_aarch64.whl", upload-time = "2026-07-08T11:20:33Z" }, + { url = "https://download-r2.pytorch.org/whl/cu132/torch-2.13.0%2Bcu132-cp312-cp312-manylinux_2_28_x86_64.whl", upload-time = "2026-07-08T11:20:34Z" }, + { url = "https://download-r2.pytorch.org/whl/cu132/torch-2.13.0%2Bcu132-cp312-cp312-win_amd64.whl", upload-time = "2026-07-08T11:20:36Z" }, +] + +[[package]] +name = "torchcodec" +version = "0.15.0+cu132" +source = { registry = "https://download.pytorch.org/whl/cu132" } +wheels = [ + { url = "https://download.pytorch.org/whl/cu132/torchcodec-0.15.0%2Bcu132-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:7e65c88d330c44c3b54da92b6c89329980dee472542d4417c54d486bf85705ba", upload-time = "2026-07-15T10:08:12Z" }, + { url = "https://download.pytorch.org/whl/cu132/torchcodec-0.15.0%2Bcu132-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1aec183f8111fe3adf8c9d49ce9f4f402fae7e031d78f7ee0ae4063fd268fbee", upload-time = "2026-07-15T10:08:12Z" }, + { url = "https://download.pytorch.org/whl/cu132/torchcodec-0.15.0%2Bcu132-cp312-cp312-win_amd64.whl", hash = "sha256:2781fcd30bac149c5e759088b0a88bc28fef17842a5684cf5dc52b99ec1a2c78", upload-time = "2026-07-15T10:08:12Z" }, +] + +[[package]] +name = "torchvision" +version = "0.28.0+cu132" +source = { registry = "https://download.pytorch.org/whl/cu132" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, + { name = "torch" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu132/torchvision-0.28.0%2Bcu132-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0064cb501e3e083b095b998541226cd82059e29339dab6907ef942218cfe91db", upload-time = "2026-07-08T12:26:53Z" }, + { url = "https://download-r2.pytorch.org/whl/cu132/torchvision-0.28.0%2Bcu132-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4865f491c69cbb6e0a4ad54d849004974c0a7957b1e183427119c53f09ae5125", upload-time = "2026-07-08T12:26:53Z" }, + { url = "https://download-r2.pytorch.org/whl/cu132/torchvision-0.28.0%2Bcu132-cp312-cp312-win_amd64.whl", upload-time = "2026-07-08T12:26:53Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "transformers" +version = "4.57.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/35/67252acc1b929dc88b6602e8c4a982e64f31e733b804c14bc24b47da35e6/transformers-4.57.6.tar.gz", hash = "sha256:55e44126ece9dc0a291521b7e5492b572e6ef2766338a610b9ab5afbb70689d3", size = 10134912, upload-time = "2026-01-16T10:38:39.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/b8/e484ef633af3887baeeb4b6ad12743363af7cce68ae51e938e00aaa0529d/transformers-4.57.6-py3-none-any.whl", hash = "sha256:4c9e9de11333ddfe5114bc872c9f370509198acf0b87a832a0ab9458e2bd0550", size = 11993498, upload-time = "2026-01-16T10:38:31.289Z" }, +] + +[[package]] +name = "triton" +version = "3.7.1" +source = { registry = "https://download.pytorch.org/whl/cu132" } +wheels = [ + { url = "https://download-r2.pytorch.org/whl/triton-3.7.1-cp312-cp312-linux_aarch64.whl", hash = "sha256:1f046a8d2615e389b1b8e8a4d100a03f3cb1df4bc1a107a6b678b186443bb2c9", upload-time = "2026-06-17T16:38:52Z" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.7.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:225910e79149807de74a0ca63160aa285956a8d64a2951d558997c57e2584ae1", upload-time = "2026-06-17T16:39:06Z" }, +] + +[[package]] +name = "typeguard" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/e8/66e25efcc18542d58706ce4e50415710593721aae26e794ab1dec34fb66f/typeguard-4.5.1.tar.gz", hash = "sha256:f6f8ecbbc819c9bc749983cc67c02391e16a9b43b8b27f15dc70ed7c4a007274", size = 80121, upload-time = "2026-02-19T16:09:03.392Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/88/b55b3117287a8540b76dbdd87733808d4d01c8067a3b339408c250bb3600/typeguard-4.5.1-py3-none-any.whl", hash = "sha256:44d2bf329d49a244110a090b55f5f91aa82d9a9834ebfd30bcc73651e4a8cc40", size = 36745, upload-time = "2026-02-19T16:09:01.6Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tyro" +version = "0.9.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docstring-parser" }, + { name = "rich" }, + { name = "shtab" }, + { name = "typeguard" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/86/90242f575fa5d50c6d5fae6c47a95cd5b56b17413dc6d8391190aed58ac5/tyro-0.9.17.tar.gz", hash = "sha256:4a43386c6f3c8a06ed40a2f290de22fa3306300c68599ce5d7bd6fd1ad13c35a", size = 262449, upload-time = "2025-03-13T01:39:45.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b1/c0c62adcd5e64244af876a3173f194d02dc1fe830cae28370b6d9e315971/tyro-0.9.17-py3-none-any.whl", hash = "sha256:f601fcd27edc99bc10a03602a47930ce8906ed995179a98b689bc85db38bec40", size = 123658, upload-time = "2025-03-13T01:39:43.912Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "virtualenv" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/92/58199fe10049f9703c2666e809c4f686c54ef0a68b0f6afccf518c0b1eb9/virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098", size = 5840618, upload-time = "2026-03-09T17:24:38.013Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f", size = 5825084, upload-time = "2026-03-09T17:24:35.378Z" }, +] + +[[package]] +name = "wandb" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "gitpython" }, + { name = "packaging" }, + { name = "platformdirs" }, + { name = "protobuf" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sentry-sdk" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/8b/db2d44395c967cd452517311fd6ede5d1e07310769f448358d4874248512/wandb-0.23.0.tar.gz", hash = "sha256:e5f98c61a8acc3ee84583ca78057f64344162ce026b9f71cb06eea44aec27c93", size = 44413921, upload-time = "2025-11-11T21:06:30.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/61/a3220c7fa4cadfb2b2a5c09e3fa401787326584ade86d7c1f58bf1cd43bd/wandb-0.23.0-py3-none-macosx_12_0_arm64.whl", hash = "sha256:b682ec5e38fc97bd2e868ac7615a0ab4fc6a15220ee1159e87270a5ebb7a816d", size = 18992250, upload-time = "2025-11-11T21:06:03.412Z" }, + { url = "https://files.pythonhosted.org/packages/90/16/e69333cf3d11e7847f424afc6c8ae325e1f6061b2e5118d7a17f41b6525d/wandb-0.23.0-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:ec094eb71b778e77db8c188da19e52c4f96cb9d5b4421d7dc05028afc66fd7e7", size = 20045616, upload-time = "2025-11-11T21:06:07.109Z" }, + { url = "https://files.pythonhosted.org/packages/62/79/42dc6c7bb0b425775fe77f1a3f1a22d75d392841a06b43e150a3a7f2553a/wandb-0.23.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e43f1f04b98c34f407dcd2744cec0a590abce39bed14a61358287f817514a7b", size = 18758848, upload-time = "2025-11-11T21:06:09.832Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/d6ddb78334996ccfc1179444bfcfc0f37ffd07ee79bb98940466da6f68f8/wandb-0.23.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5847f98cbb3175caf5291932374410141f5bb3b7c25f9c5e562c1988ce0bf5", size = 20231493, upload-time = "2025-11-11T21:06:12.323Z" }, + { url = "https://files.pythonhosted.org/packages/52/4d/0ad6df0e750c19dabd24d2cecad0938964f69a072f05fbdab7281bec2b64/wandb-0.23.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6151355fd922539926e870be811474238c9614b96541773b990f1ce53368aef6", size = 18793473, upload-time = "2025-11-11T21:06:14.967Z" }, + { url = "https://files.pythonhosted.org/packages/f8/da/c2ba49c5573dff93dafc0acce691bb1c3d57361bf834b2f2c58e6193439b/wandb-0.23.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df62e426e448ebc44269140deb7240df474e743b12d4b1f53b753afde4aa06d4", size = 20332882, upload-time = "2025-11-11T21:06:17.865Z" }, + { url = "https://files.pythonhosted.org/packages/40/65/21bfb10ee5cd93fbcaf794958863c7e05bac4bbeb1cc1b652094aa3743a5/wandb-0.23.0-py3-none-win32.whl", hash = "sha256:6c21d3eadda17aef7df6febdffdddfb0b4835c7754435fc4fe27631724269f5c", size = 19433198, upload-time = "2025-11-11T21:06:21.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/33/cbe79e66c171204e32cf940c7fdfb8b5f7d2af7a00f301c632f3a38aa84b/wandb-0.23.0-py3-none-win_amd64.whl", hash = "sha256:b50635fa0e16e528bde25715bf446e9153368428634ca7a5dbd7a22c8ae4e915", size = 19433201, upload-time = "2025-11-11T21:06:24.607Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/5ecfae12d78ea036a746c071e4c13b54b28d641efbba61d2947c73b3e6f9/wandb-0.23.0-py3-none-win_arm64.whl", hash = "sha256:fa0181b02ce4d1993588f4a728d8b73ae487eb3cb341e6ce01c156be7a98ec72", size = 17678649, upload-time = "2025-11-11T21:06:27.289Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, +] + +[[package]] +name = "xxhash" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744, upload-time = "2025-10-02T14:34:34.622Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035, upload-time = "2025-10-02T14:34:37.354Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, + { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163, upload-time = "2025-10-02T14:34:39.872Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411, upload-time = "2025-10-02T14:34:41.569Z" }, + { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898, upload-time = "2025-10-02T14:34:46.302Z" }, + { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655, upload-time = "2025-10-02T14:34:47.571Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001, upload-time = "2025-10-02T14:34:49.273Z" }, + { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, + { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617, upload-time = "2025-10-02T14:34:51.954Z" }, + { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534, upload-time = "2025-10-02T14:34:53.276Z" }, + { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, +] + +[[package]] +name = "yarl" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, + { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, + { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] diff --git a/scripts/deployment/jetson/wheels/flash_attn-2.8.3-cp312-cp312-linux_aarch64.whl b/scripts/deployment/jetson/wheels/flash_attn-2.8.3-cp312-cp312-linux_aarch64.whl new file mode 100644 index 000000000..56f06e9f9 --- /dev/null +++ b/scripts/deployment/jetson/wheels/flash_attn-2.8.3-cp312-cp312-linux_aarch64.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcddabe341390f550982b05fd6ba7da0a28bebd38db611715aa6f8bc3be6a160 +size 122785227 diff --git a/scripts/deployment/orin b/scripts/deployment/orin new file mode 120000 index 000000000..734b32a68 --- /dev/null +++ b/scripts/deployment/orin @@ -0,0 +1 @@ +jetson \ No newline at end of file diff --git a/scripts/deployment/spark/Dockerfile b/scripts/deployment/spark/Dockerfile new file mode 100644 index 000000000..38026f931 --- /dev/null +++ b/scripts/deployment/spark/Dockerfile @@ -0,0 +1,31 @@ +FROM nvidia/cuda:13.0.0-devel-ubuntu24.04 + +ENV NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute +ENV DEBIAN_FRONTEND=noninteractive + +# System deps +RUN apt-get update && apt-get install -y \ + python3 python3-pip python3-venv \ + build-essential yasm cmake libtool git pkg-config curl \ + libass-dev libfreetype6-dev libvorbis-dev \ + autoconf automake texinfo tmux ffmpeg + +COPY . /workspace/ + +# install_deps.sh copies spark/pyproject.toml to repo root before uv sync +ENV DOCKER_CONTAINER=1 +ENV UV_PROJECT_ENVIRONMENT=/opt/gr00t-venv +RUN cd /workspace && bash scripts/deployment/spark/install_deps.sh + +# Activate the venv by default and expose nvidia pip package libs (cudnn, cudss, cublas) +ENV VIRTUAL_ENV=/opt/gr00t-venv +ENV PATH="$VIRTUAL_ENV/bin:/usr/local/cuda/bin:$PATH" +ENV TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas +ENV CUDA_HOME=/usr/local/cuda-13.0 +ENV CUDA_PATH=/usr/local/cuda-13.0 +ENV CPATH="/usr/local/cuda-13.0/include:${CPATH:-}" +ENV C_INCLUDE_PATH="/usr/local/cuda-13.0/include:${C_INCLUDE_PATH:-}" +ENV CPLUS_INCLUDE_PATH="/usr/local/cuda-13.0/include:${CPLUS_INCLUDE_PATH:-}" +ENV LD_LIBRARY_PATH="$VIRTUAL_ENV/lib/python3.12/site-packages/torch/lib:$VIRTUAL_ENV/lib/python3.12/site-packages/nvidia/cu13/lib:$VIRTUAL_ENV/lib/python3.12/site-packages/nvidia/cudss/lib:$VIRTUAL_ENV/lib/python3.12/site-packages/nvidia/cudnn/lib:${LD_LIBRARY_PATH:-}" + +WORKDIR /workspace/gr00t diff --git a/scripts/deployment/spark/install_deps.sh b/scripts/deployment/spark/install_deps.sh new file mode 100644 index 000000000..c05d8ba23 --- /dev/null +++ b/scripts/deployment/spark/install_deps.sh @@ -0,0 +1,143 @@ +#!/bin/bash +# install_deps.sh — One-time install of GR00T deps on DGX Spark (aarch64, Python 3.12) +# Used by both bare metal and scripts/deployment/spark/Dockerfile. +# After install, use `source scripts/activate_spark.sh` in each new shell. +set -euo pipefail + +# Track /tmp source-build dirs so they get cleaned up even when `set -e` +# aborts the script mid-build (e.g. a failed `pip install`). Without this +# trap, a failed flash-attn / torchcodec build leaves /tmp/flash-attn or +# /tmp/torchcodec behind, and the next run on the same host (CI runner / +# Docker build layer / dev machine) silently reuses the stale clone. +TMP_BUILD_DIRS=() +trap 'for _d in "${TMP_BUILD_DIRS[@]:-}"; do rm -rf "$_d"; done' EXIT + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" + +# Use sudo only when not already root +SUDO="" +if [ "$(id -u)" -ne 0 ]; then + SUDO="sudo" +fi + +# Validate platform +ARCH=$(uname -m) +if [ "$ARCH" != "aarch64" ]; then + echo "ERROR: This script is intended for aarch64 (DGX Spark). Detected: $ARCH" + exit 1 +fi + +PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') +if [ "$PYTHON_VERSION" != "3.12" ]; then + echo "WARNING: Expected Python 3.12 for Spark, detected Python $PYTHON_VERSION" +fi + +# The Spark-specific pyproject.toml and uv.lock are consumed in place from +# $SCRIPT_DIR via `uv sync --project` below — we no longer copy them over +# the repo root, which used to leave the working tree dirty after install. + +# ────────────────────────────────────────────────────────────────────────────── +# NVPL LAPACK/BLAS — required by the jetson torch wheel +# ────────────────────────────────────────────────────────────────────────────── +if ! ldconfig -p | grep -q libnvpl_lapack_lp64_gomp; then + echo "Installing NVPL libs (required by torch on aarch64)..." + # Add NVIDIA CUDA apt repo if not already configured + if ! apt-cache show libnvpl-lapack0 &>/dev/null; then + echo "Adding NVIDIA CUDA apt repository..." + curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/sbsa/cuda-keyring_1.1-1_all.deb \ + -o /tmp/cuda-keyring.deb + $SUDO dpkg -i /tmp/cuda-keyring.deb + rm /tmp/cuda-keyring.deb + $SUDO apt-get update + fi + $SUDO apt-get install -y libnvpl-lapack0 libnvpl-blas0 +else + echo "NVPL libs already installed." +fi + +# ────────────────────────────────────────────────────────────────────────────── +# CUDA dev packages — Spark BSP only ships runtime libs; cmake builds (e.g. +# flash-attn, torchcodec) need the compiler and headers. +# ────────────────────────────────────────────────────────────────────────────── +if ! dpkg -s cuda-nvcc-13-0 &>/dev/null; then + echo "Installing CUDA dev packages (nvcc, cudart-dev, nvrtc-dev)..." + $SUDO apt-get install -y --no-install-recommends \ + cuda-nvcc-13-0 cuda-cudart-dev-13-0 cuda-nvrtc-dev-13-0 +else + echo "CUDA dev packages already installed." +fi + +# ────────────────────────────────────────────────────────────────────────────── +# Python environment +# ────────────────────────────────────────────────────────────────────────────── + +# Install uv if not present +if ! command -v uv &> /dev/null; then + echo "Installing uv..." + curl -LsSf https://astral.sh/uv/install.sh | sh + export PATH="$HOME/.local/bin:$PATH" +fi + +# Install platform-specific deps from the Spark pyproject without mutating +# the repo-root pyproject.toml / uv.lock. See the Orin installer for +# details on UV_PROJECT_ENVIRONMENT + --no-install-project. +# Respect a pre-set UV_PROJECT_ENVIRONMENT from the Dockerfile +# (/opt/gr00t-venv, matched by the VIRTUAL_ENV + PATH ENV lines there); +# fall back to $REPO_ROOT/.venv on bare metal. +export UV_PROJECT_ENVIRONMENT="${UV_PROJECT_ENVIRONMENT:-$REPO_ROOT/.venv}" +echo "Running uv sync with the Spark pyproject at $SCRIPT_DIR (venv: $UV_PROJECT_ENVIRONMENT)..." +uv sync --project "$SCRIPT_DIR" --no-install-project --extra dev + +VENV_DIR="$UV_PROJECT_ENVIRONMENT" +VENV_PYTHON="$VENV_DIR/bin/python" +SITE_PKGS="$VENV_DIR/lib/python${PYTHON_VERSION}/site-packages" + +echo "Installing gr00t in editable mode from the repo root (--no-deps)..." +uv pip install --python "$VENV_PYTHON" --no-deps -e "$REPO_ROOT" + +# PyTorch extension builds need torch and NVIDIA runtime libs on the linker path. +NVIDIA_LIB_DIRS="$(find "${SITE_PKGS}/nvidia" -name "lib" -type d 2>/dev/null | tr '\n' ':')" +export LD_LIBRARY_PATH="${SITE_PKGS}/torch/lib:${NVIDIA_LIB_DIRS}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +export CUDA_HOME=/usr/local/cuda-13.0 +export CUDA_PATH=/usr/local/cuda-13.0 +export CPATH="${CUDA_HOME}/include:${CPATH:-}" +export C_INCLUDE_PATH="${CUDA_HOME}/include:${C_INCLUDE_PATH:-}" +export CPLUS_INCLUDE_PATH="${CUDA_HOME}/include:${CPLUS_INCLUDE_PATH:-}" + +# ────────────────────────────────────────────────────────────────────────────── +# flash-attn — shared build and wheel-cache flow, configured for Spark sm121. +# ────────────────────────────────────────────────────────────────────────────── +source "$SCRIPT_DIR/../build_flash_attn.sh" +build_flash_attn "$SCRIPT_DIR/wheels" spark-cu130-torch2.10 "121" "12.1" + +# ────────────────────────────────────────────────────────────────────────────── +# torchcodec — prebuilt wheel (built against Spark's FFmpeg 6) or source build +# ────────────────────────────────────────────────────────────────────────────── +echo "Installing FFmpeg runtime..." +$SUDO apt-get update -qq +$SUDO apt-get install -y --no-install-recommends ffmpeg + +TORCHCODEC_WHL=$(find "$SCRIPT_DIR/wheels" -name 'torchcodec-*.whl' -print -quit 2>/dev/null || true) +if [ -n "$TORCHCODEC_WHL" ]; then + echo "Installing torchcodec from prebuilt wheel: $TORCHCODEC_WHL" + uv pip install --python "$VENV_PYTHON" --force-reinstall --no-deps "$TORCHCODEC_WHL" +else + echo "No prebuilt torchcodec wheel found — building from source..." + $SUDO apt-get install -y --no-install-recommends \ + libavdevice-dev libavfilter-dev libavformat-dev libavcodec-dev \ + libavutil-dev libswresample-dev libswscale-dev \ + pkg-config pybind11-dev python3-dev + uv pip install --python "$VENV_PYTHON" setuptools + rm -rf /tmp/torchcodec + TMP_BUILD_DIRS+=(/tmp/torchcodec) + git clone --depth 1 --branch v0.10.0 https://github.com/pytorch/torchcodec.git /tmp/torchcodec + cd /tmp/torchcodec + I_CONFIRM_THIS_IS_NOT_A_LICENSE_VIOLATION=1 uv pip install --python "$VENV_PYTHON" . --no-build-isolation + cd - +fi + +echo "" +echo "Install complete! In each new shell, activate with:" +echo " source .venv/bin/activate" +echo " source scripts/activate_spark.sh" diff --git a/scripts/deployment/spark/pyproject.toml b/scripts/deployment/spark/pyproject.toml new file mode 100644 index 000000000..19c560c95 --- /dev/null +++ b/scripts/deployment/spark/pyproject.toml @@ -0,0 +1,84 @@ +# Spark platform pyproject.toml — DGX Spark (aarch64, CUDA 13, Python 3.12) +# This is a self-contained config with no platform markers needed. + +[build-system] +requires = ["setuptools>=67", "wheel", "pip"] +build-backend = "setuptools.build_meta" + +[project] +name = "gr00t" +version = "0.1.0" +requires-python = ">=3.12,<3.13" +dependencies = [ + "albumentations==1.4.18", + "diffusers==0.36.0.dev0", + "dm-tree==0.1.8", + "huggingface-hub[cli]", + "jsonlines==4.0.0", + "lmdb==1.7.5", + "msgpack==1.1.0", + "msgpack-numpy==0.4.8", + "opencv-python-headless>=4.5,<4.13", + "pandas==2.2.3", + "peft==0.17.1", + "termcolor==3.2.0", + "torch==2.10.0", + "triton==3.5.0", + "torchvision==0.25.0", + "transformers==4.57.3", + "tyro==0.9.17", + "click==8.1.8", + "datasets==3.6.0", + "cryptography>=46.0.7", + "einops==0.8.1", + "gitpython==3.1.50", + "gymnasium==1.2.2", + "matplotlib==3.10.1", + "numpy==1.26.4", + "omegaconf==2.3.0", + "scipy==1.15.3", + "wandb==0.23.0", + "pyzmq==27.0.1", + "torchcodec==0.10.0", + "onnx>=1.20.0", + "onnxscript", + "tensorrt>=10.14.1.48.post1", + # Keep these as direct pins: the Spark torch wheel does not bundle these runtime libs, + # and we want them installed even if torch's transitive dependency metadata changes upstream. + # Revisit if the Jetson AI Lab torch packages start vendoring them or declaring them reliably. + "nvidia-cudnn-cu13", + "nvidia-cudss-cu13", +] + +[project.optional-dependencies] +dev = [ + "ruff", + "ipython", + "pytest", + "pytest-timeout", + "build", + "pre-commit", +] + +[tool.setuptools.packages.find] +where = ["."] +include = ["gr00t*"] + +[tool.uv] + +[tool.uv.sources] +torch = [{ index = "jetson-sbsa-cu130" }] +torchvision = [{ index = "jetson-sbsa-cu130" }] +torchcodec = [{ index = "jetson-sbsa-cu130" }] +triton = [{ index = "jetson-sbsa-cu130" }] +diffusers = [{ index = "jetson-sbsa-cu130" }] + +[[tool.uv.index]] +name = "nvidia-pypi" +url = "https://pypi.nvidia.com" +explicit = true + +[[tool.uv.index]] +name = "jetson-sbsa-cu130" +url = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" +explicit = true diff --git a/scripts/deployment/spark/uv.lock b/scripts/deployment/spark/uv.lock new file mode 100644 index 000000000..2087012a0 --- /dev/null +++ b/scripts/deployment/spark/uv.lock @@ -0,0 +1,2187 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "platform_machine == 'aarch64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 's390x' and sys_platform == 'linux'", + "platform_machine == 's390x' and sys_platform == 'linux'", + "platform_machine != 's390x' and sys_platform == 'darwin'", + "platform_machine == 's390x' and sys_platform == 'darwin'", + "platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", +] + +[[package]] +name = "accelerate" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4a/8e/ac2a9566747a93f8be36ee08532eb0160558b07630a081a6056a9f89bf1d/accelerate-1.12.0.tar.gz", hash = "sha256:70988c352feb481887077d2ab845125024b2a137a5090d6d7a32b57d03a45df6", size = 398399, upload-time = "2025-11-21T11:27:46.973Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d2/c581486aa6c4fbd7394c23c47b83fa1a919d34194e16944241daf9e762dd/accelerate-1.12.0-py3-none-any.whl", hash = "sha256:3e2091cd341423207e2f084a6654b1efcd250dc326f2a37d6dde446e07cabb11", size = 380935, upload-time = "2025-11-21T11:27:44.522Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/4a/064321452809dae953c1ed6e017504e72551a26b6f5708a5a80e4bf556ff/aiohttp-3.13.4.tar.gz", hash = "sha256:d97a6d09c66087890c2ab5d49069e1e570583f7ac0314ecf98294c1b6aaebd38", size = 7859748, upload-time = "2026-03-28T17:19:40.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/bd/ede278648914cabbabfdf95e436679b5d4156e417896a9b9f4587169e376/aiohttp-3.13.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ee62d4471ce86b108b19c3364db4b91180d13fe3510144872d6bad5401957360", size = 752158, upload-time = "2026-03-28T17:16:06.901Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/581c053253c07b480b03785196ca5335e3c606a37dc73e95f6527f1591fe/aiohttp-3.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c0fd8f41b54b58636402eb493afd512c23580456f022c1ba2db0f810c959ed0d", size = 501037, upload-time = "2026-03-28T17:16:08.82Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/a5ede193c08f13cc42c0a5b50d1e246ecee9115e4cf6e900d8dbd8fd6acb/aiohttp-3.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4baa48ce49efd82d6b1a0be12d6a36b35e5594d1dd42f8bfba96ea9f8678b88c", size = 501556, upload-time = "2026-03-28T17:16:10.63Z" }, + { url = "https://files.pythonhosted.org/packages/d6/10/88ff67cd48a6ec36335b63a640abe86135791544863e0cfe1f065d6cef7a/aiohttp-3.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d738ebab9f71ee652d9dbd0211057690022201b11197f9a7324fd4dba128aa97", size = 1757314, upload-time = "2026-03-28T17:16:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/8b/15/fdb90a5cf5a1f52845c276e76298c75fbbcc0ac2b4a86551906d54529965/aiohttp-3.13.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0ce692c3468fa831af7dceed52edf51ac348cebfc8d3feb935927b63bd3e8576", size = 1731819, upload-time = "2026-03-28T17:16:14.558Z" }, + { url = "https://files.pythonhosted.org/packages/ec/df/28146785a007f7820416be05d4f28cc207493efd1e8c6c1068e9bdc29198/aiohttp-3.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8e08abcfe752a454d2cb89ff0c08f2d1ecd057ae3e8cc6d84638de853530ebab", size = 1793279, upload-time = "2026-03-28T17:16:16.594Z" }, + { url = "https://files.pythonhosted.org/packages/10/47/689c743abf62ea7a77774d5722f220e2c912a77d65d368b884d9779ef41b/aiohttp-3.13.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5977f701b3fff36367a11087f30ea73c212e686d41cd363c50c022d48b011d8d", size = 1891082, upload-time = "2026-03-28T17:16:18.71Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/f7f4f318c7e58c23b761c9b13b9a3c9b394e0f9d5d76fbc6622fa98509f6/aiohttp-3.13.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54203e10405c06f8b6020bd1e076ae0fe6c194adcee12a5a78af3ffa3c57025e", size = 1773938, upload-time = "2026-03-28T17:16:21.125Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/f207cb3121852c989586a6fc16ff854c4fcc8651b86c5d3bd1fc83057650/aiohttp-3.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:358a6af0145bc4dda037f13167bef3cce54b132087acc4c295c739d05d16b1c3", size = 1579548, upload-time = "2026-03-28T17:16:23.588Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/e1289661a32161e24c1fe479711d783067210d266842523752869cc1d9c2/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:898ea1850656d7d61832ef06aa9846ab3ddb1621b74f46de78fbc5e1a586ba83", size = 1714669, upload-time = "2026-03-28T17:16:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/96/0a/3e86d039438a74a86e6a948a9119b22540bae037d6ba317a042ae3c22711/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7bc30cceb710cf6a44e9617e43eebb6e3e43ad855a34da7b4b6a73537d8a6763", size = 1754175, upload-time = "2026-03-28T17:16:28.18Z" }, + { url = "https://files.pythonhosted.org/packages/f4/30/e717fc5df83133ba467a560b6d8ef20197037b4bb5d7075b90037de1018e/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4a31c0c587a8a038f19a4c7e60654a6c899c9de9174593a13e7cc6e15ff271f9", size = 1762049, upload-time = "2026-03-28T17:16:30.941Z" }, + { url = "https://files.pythonhosted.org/packages/e4/28/8f7a2d4492e336e40005151bdd94baf344880a4707573378579f833a64c1/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2062f675f3fe6e06d6113eb74a157fb9df58953ffed0cdb4182554b116545758", size = 1570861, upload-time = "2026-03-28T17:16:32.953Z" }, + { url = "https://files.pythonhosted.org/packages/78/45/12e1a3d0645968b1c38de4b23fdf270b8637735ea057d4f84482ff918ad9/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d1ba8afb847ff80626d5e408c1fdc99f942acc877d0702fe137015903a220a9", size = 1790003, upload-time = "2026-03-28T17:16:35.468Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/60374e18d590de16dcb39d6ff62f39c096c1b958e6f37727b5870026ea30/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b08149419994cdd4d5eecf7fd4bc5986b5a9380285bcd01ab4c0d6bfca47b79d", size = 1737289, upload-time = "2026-03-28T17:16:38.187Z" }, + { url = "https://files.pythonhosted.org/packages/02/bf/535e58d886cfbc40a8b0013c974afad24ef7632d645bca0b678b70033a60/aiohttp-3.13.4-cp312-cp312-win32.whl", hash = "sha256:fc432f6a2c4f720180959bc19aa37259651c1a4ed8af8afc84dd41c60f15f791", size = 434185, upload-time = "2026-03-28T17:16:40.735Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1a/d92e3325134ebfff6f4069f270d3aac770d63320bd1fcd0eca023e74d9a8/aiohttp-3.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:6148c9ae97a3e8bff9a1fc9c757fa164116f86c100468339730e717590a3fb77", size = 461285, upload-time = "2026-03-28T17:16:42.713Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "albucore" +version = "0.0.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "opencv-python-headless" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/03/81e5b3b6ee7911a70ed19028ccfed90f5cb32fc9fb33af5bc587fc1ab6a1/albucore-0.0.17.tar.gz", hash = "sha256:e9956ac4debc47e804f0677ff4e23939ba322986eac16e801f8ea1c98269db65", size = 12271, upload-time = "2024-09-20T19:36:19.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/20/9f56b72131ea71c9566f0cc303a9e92156767845164c0f4ec10534630991/albucore-0.0.17-py3-none-any.whl", hash = "sha256:751a6d219a0b5217b44168d5fae90c27eadfa5bc381cbb7cc74536e90aeeac5b", size = 10378, upload-time = "2024-09-20T19:36:18.796Z" }, +] + +[[package]] +name = "albumentations" +version = "1.4.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "albucore" }, + { name = "eval-type-backport" }, + { name = "numpy" }, + { name = "opencv-python-headless" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "scikit-image" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/52/cd2399a7037a70dd6410a7c890a1cdfd79563c03c4a7f3311278c9a3b1b0/albumentations-1.4.18.tar.gz", hash = "sha256:701a9405f059f761f00ce00e187954d01276bdb78b33abcf864e79727db3bf1a", size = 207321, upload-time = "2024-10-08T22:32:47.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/2f/468208ac3345b59286f5a73dd6e298c111c8a6a5896f658d221cd55ebf8d/albumentations-1.4.18-py3-none-any.whl", hash = "sha256:57ed0a634de9d3b34d003585aa90e9164e164ccc4ecb797eee8fbad8da1e9eaf", size = 224034, upload-time = "2024-10-08T22:32:45.763Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "build" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/18/94eaffda7b329535d91f00fe605ab1f1e5cd68b2074d03f255c7d250687d/build-1.4.0.tar.gz", hash = "sha256:f1b91b925aa322be454f8330c6fb48b465da993d1e7e7e6fa35027ec49f3c936", size = 50054, upload-time = "2026-01-08T16:41:47.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596", size = 24141, upload-time = "2026-01-08T16:41:46.453Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, +] + +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, +] + +[[package]] +name = "cryptography" +version = "46.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4", size = 7179869, upload-time = "2026-04-08T01:56:17.157Z" }, + { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, + { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, + { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl", hash = "sha256:d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457", size = 3026504, upload-time = "2026-04-08T01:56:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b", size = 3488363, upload-time = "2026-04-08T01:56:41.893Z" }, + { url = "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4", size = 7165618, upload-time = "2026-04-08T01:57:10.645Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, + { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, + { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, + { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl", hash = "sha256:f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246", size = 3013001, upload-time = "2026-04-08T01:57:34.933Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl", hash = "sha256:506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3", size = 3472985, upload-time = "2026-04-08T01:57:36.714Z" }, +] + +[[package]] +name = "cuda-toolkit" +version = "13.2.0" +source = { registry = "https://pypi.nvidia.com/" } +wheels = [ + { url = "https://pypi.nvidia.com/cuda-toolkit/cuda_toolkit-13.2.0-py2.py3-none-any.whl", hash = "sha256:d749077fdf11010881c208978b5fdd3e302290cc2f141ae92ed6e989ea9a65c7" }, +] + +[package.optional-dependencies] +cublas = [ + { name = "nvidia-cublas", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "datasets" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/89/d3d6fef58a488f8569c82fd293ab7cbd4250244d67f425dcae64c63800ea/datasets-3.6.0.tar.gz", hash = "sha256:1b2bf43b19776e2787e181cfd329cb0ca1a358ea014780c3581e0f276375e041", size = 569336, upload-time = "2025-05-07T15:15:02.659Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/34/a08b0ee99715eaba118cbe19a71f7b5e2425c2718ef96007c325944a1152/datasets-3.6.0-py3-none-any.whl", hash = "sha256:25000c4a2c0873a710df127d08a202a06eab7bf42441a6bc278b499c2f72cd1b", size = 491546, upload-time = "2025-05-07T15:14:59.742Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "diffusers" +version = "0.36.0.dev0" +source = { registry = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "importlib-metadata" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, +] +wheels = [ + { url = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+f/c46/66317287eb28a/diffusers-0.36.0.dev0-py3-none-any.whl", hash = "sha256:c4666317287eb28a37ceada2518597875d56a028086407383905f6fa109bb66a" }, +] + +[[package]] +name = "dill" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload-time = "2024-01-27T23:42:16.145Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload-time = "2024-01-27T23:42:14.239Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + +[[package]] +name = "dm-tree" +version = "0.1.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/6d/f1997aac42e0f550c1e952a0b920eaa0bfc4d27d0421499881b934b969fc/dm-tree-0.1.8.tar.gz", hash = "sha256:0fcaabbb14e7980377439e7140bd05552739ca5e515ecb3119f234acee4b9430", size = 35384, upload-time = "2022-12-18T09:46:55.953Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/2c/e33dfc96f974ae3cba82c9836371c93fcb4d59d5a82ebb853861618a0b0b/dm_tree-0.1.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea9e59e0451e7d29aece402d9f908f2e2a80922bcde2ebfd5dcb07750fcbfee8", size = 169495, upload-time = "2024-02-06T09:09:13.276Z" }, + { url = "https://files.pythonhosted.org/packages/17/af/4030827253a5d50eb8da6f7189bc33d3c850c4109cf3414910e9af677cb7/dm_tree-0.1.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:94d3f0826311f45ee19b75f5b48c99466e4218a0489e81c0f0167bda50cacf22", size = 116525, upload-time = "2024-02-06T09:09:15.529Z" }, + { url = "https://files.pythonhosted.org/packages/10/10/5f9eed00b1186921e447960443f03cda6374cba8cd5cf7aff2b42ecb8a0e/dm_tree-0.1.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:435227cf3c5dc63f4de054cf3d00183790bd9ead4c3623138c74dde7f67f521b", size = 111436, upload-time = "2024-02-06T09:09:16.781Z" }, + { url = "https://files.pythonhosted.org/packages/4a/da/3d3d04f7a572f7649f48edc9402ff5836e2f90e18445ffde110fd6142889/dm_tree-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09964470f76a5201aff2e8f9b26842976de7889300676f927930f6285e256760", size = 146828, upload-time = "2024-02-13T21:25:21.639Z" }, + { url = "https://files.pythonhosted.org/packages/c4/12/0a8c2152655ca39c1059c762ea1dc12784166c735126eb0ab929c518ef4e/dm_tree-0.1.8-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75c5d528bb992981c20793b6b453e91560784215dffb8a5440ba999753c14ceb", size = 175054, upload-time = "2024-02-13T21:25:23.532Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/8cbb857612ca69763ee4f4f97c7b91659df1d373d62237cb9c772e55ae97/dm_tree-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a94aba18a35457a1b5cd716fd7b46c5dafdc4cf7869b4bae665b91c4682a8e", size = 152834, upload-time = "2024-02-06T09:09:18.536Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e3/96f5267fe5a47c882dce7f3d06b26ddd756681fc4fbedd55d51b78b08bca/dm_tree-0.1.8-cp312-cp312-win_amd64.whl", hash = "sha256:96a548a406a6fb15fe58f6a30a57ff2f2aafbf25f05afab00c8f5e5977b6c715", size = 101754, upload-time = "2024-02-06T09:09:20.962Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, +] + +[[package]] +name = "einops" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/81/df4fbe24dff8ba3934af99044188e20a98ed441ad17a274539b74e82e126/einops-0.8.1.tar.gz", hash = "sha256:de5d960a7a761225532e0f1959e5315ebeafc0cd43394732f103ca44b9837e84", size = 54805, upload-time = "2025-02-09T03:17:00.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737", size = 64359, upload-time = "2025-02-09T03:17:01.998Z" }, +] + +[[package]] +name = "eval-type-backport" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/a3/cafafb4558fd638aadfe4121dc6cefb8d743368c085acb2f521df0f3d9d7/eval_type_backport-0.3.1.tar.gz", hash = "sha256:57e993f7b5b69d271e37482e62f74e76a0276c82490cf8e4f0dffeb6b332d5ed", size = 9445, upload-time = "2025-12-02T11:51:42.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/22/fdc2e30d43ff853720042fa15baa3e6122722be1a7950a98233ebb55cd71/eval_type_backport-0.3.1-py3-none-any.whl", hash = "sha256:279ab641905e9f11129f56a8a78f493518515b83402b860f6f06dd7c011fdfa8", size = 6063, upload-time = "2025-12-02T11:51:41.665Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "farama-notifications" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", size = 2131, upload-time = "2023-02-27T18:28:41.047Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", size = 2511, upload-time = "2023-02-27T18:28:39.447Z" }, +] + +[[package]] +name = "filelock" +version = "3.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/71/74364ff065ca78914d8bd90b312fe78ddc5e11372d38bc9cb7104f887ce1/filelock-3.21.2.tar.gz", hash = "sha256:cfd218cfccf8b947fce7837da312ec3359d10ef2a47c8602edd59e0bacffb708", size = 31486, upload-time = "2026-02-13T01:27:15.223Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/73/3a18f1e1276810e81477c431009b55eeccebbd7301d28a350b77aacf3c33/filelock-3.21.2-py3-none-any.whl", hash = "sha256:d6cd4dbef3e1bb63bc16500fc5aa100f16e405bbff3fb4231711851be50c1560", size = 21479, upload-time = "2026-02-13T01:27:13.611Z" }, +] + +[[package]] +name = "fonttools" +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "fsspec" +version = "2025.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491, upload-time = "2025-03-07T21:47:56.461Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615, upload-time = "2025-03-07T21:47:54.809Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + +[[package]] +name = "gr00t" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "albumentations" }, + { name = "click" }, + { name = "cryptography" }, + { name = "datasets" }, + { name = "diffusers" }, + { name = "dm-tree" }, + { name = "einops" }, + { name = "gitpython" }, + { name = "gymnasium" }, + { name = "huggingface-hub", extra = ["cli"] }, + { name = "jsonlines" }, + { name = "lmdb" }, + { name = "matplotlib" }, + { name = "msgpack" }, + { name = "msgpack-numpy" }, + { name = "numpy" }, + { name = "nvidia-cudnn-cu13" }, + { name = "nvidia-cudss-cu13" }, + { name = "omegaconf" }, + { name = "onnx" }, + { name = "onnxscript" }, + { name = "opencv-python-headless" }, + { name = "pandas" }, + { name = "peft" }, + { name = "pyzmq" }, + { name = "scipy" }, + { name = "tensorrt" }, + { name = "termcolor" }, + { name = "torch" }, + { name = "torchcodec" }, + { name = "torchvision" }, + { name = "transformers" }, + { name = "triton" }, + { name = "tyro" }, + { name = "wandb" }, +] + +[package.optional-dependencies] +dev = [ + { name = "build" }, + { name = "ipython" }, + { name = "pre-commit" }, + { name = "pytest" }, + { name = "pytest-timeout" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "albumentations", specifier = "==1.4.18" }, + { name = "build", marker = "extra == 'dev'" }, + { name = "click", specifier = "==8.1.8" }, + { name = "cryptography", specifier = ">=46.0.7" }, + { name = "datasets", specifier = "==3.6.0" }, + { name = "diffusers", specifier = "==0.36.0.dev0", index = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" }, + { name = "dm-tree", specifier = "==0.1.8" }, + { name = "einops", specifier = "==0.8.1" }, + { name = "gitpython", specifier = "==3.1.50" }, + { name = "gymnasium", specifier = "==1.2.2" }, + { name = "huggingface-hub", extras = ["cli"] }, + { name = "ipython", marker = "extra == 'dev'" }, + { name = "jsonlines", specifier = "==4.0.0" }, + { name = "lmdb", specifier = "==1.7.5" }, + { name = "matplotlib", specifier = "==3.10.1" }, + { name = "msgpack", specifier = "==1.1.0" }, + { name = "msgpack-numpy", specifier = "==0.4.8" }, + { name = "numpy", specifier = "==1.26.4" }, + { name = "nvidia-cudnn-cu13" }, + { name = "nvidia-cudss-cu13" }, + { name = "omegaconf", specifier = "==2.3.0" }, + { name = "onnx", specifier = ">=1.20.0" }, + { name = "onnxscript" }, + { name = "opencv-python-headless", specifier = ">=4.5,<4.13" }, + { name = "pandas", specifier = "==2.2.3" }, + { name = "peft", specifier = "==0.17.1" }, + { name = "pre-commit", marker = "extra == 'dev'" }, + { name = "pytest", marker = "extra == 'dev'" }, + { name = "pytest-timeout", marker = "extra == 'dev'" }, + { name = "pyzmq", specifier = "==27.0.1" }, + { name = "ruff", marker = "extra == 'dev'" }, + { name = "scipy", specifier = "==1.15.3" }, + { name = "tensorrt", specifier = ">=10.14.1.48.post1" }, + { name = "termcolor", specifier = "==3.2.0" }, + { name = "torch", specifier = "==2.10.0", index = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" }, + { name = "torchcodec", specifier = "==0.10.0", index = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" }, + { name = "torchvision", specifier = "==0.25.0", index = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" }, + { name = "transformers", specifier = "==4.57.3" }, + { name = "triton", specifier = "==3.5.0", index = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" }, + { name = "tyro", specifier = "==0.9.17" }, + { name = "wandb", specifier = "==0.23.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "gymnasium" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cloudpickle" }, + { name = "farama-notifications" }, + { name = "numpy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/1c/d70b2ddd067992fa0332deae08293ef2dc489917ac5342e0e4b8850641f6/gymnasium-1.2.2.tar.gz", hash = "sha256:46d927328f8518bb5a689dbe270d228c1da2b08bcb71ae0152c10aa66f48d530", size = 829250, upload-time = "2025-11-04T15:21:06.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/53/39cd8c2f85e213fce1f32367c4bdbd3402d3bcde7d0826a1172a0f2c5cc0/gymnasium-1.2.2-py3-none-any.whl", hash = "sha256:f04ec362b1fdf73a8b327db5ef89384a3f2ba411e05d3521513414fbbb2199c8", size = 952118, upload-time = "2025-11-04T15:21:03.484Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/6e/0f11bacf08a67f7fb5ee09740f2ca54163863b07b70d579356e9222ce5d8/hf_xet-1.2.0.tar.gz", hash = "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f", size = 506020, upload-time = "2025-10-24T19:04:32.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848", size = 2866099, upload-time = "2025-10-24T19:04:15.366Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4", size = 2722178, upload-time = "2025-10-24T19:04:13.695Z" }, + { url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd", size = 3320214, upload-time = "2025-10-24T19:04:03.596Z" }, + { url = "https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c", size = 3229054, upload-time = "2025-10-24T19:04:01.949Z" }, + { url = "https://files.pythonhosted.org/packages/0b/dd/7ac658d54b9fb7999a0ccb07ad863b413cbaf5cf172f48ebcd9497ec7263/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737", size = 3413812, upload-time = "2025-10-24T19:04:24.585Z" }, + { url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865", size = 3508920, upload-time = "2025-10-24T19:04:26.927Z" }, + { url = "https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69", size = 2905735, upload-time = "2025-10-24T19:04:35.928Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/b7/8cb61d2eece5fb05a83271da168186721c450eb74e3c31f7ef3169fa475b/huggingface_hub-0.36.2.tar.gz", hash = "sha256:1934304d2fb224f8afa3b87007d58501acfda9215b334eed53072dd5e815ff7a", size = 649782, upload-time = "2026-02-06T09:24:13.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" }, +] + +[package.optional-dependencies] +cli = [ + { name = "inquirerpy" }, +] + +[[package]] +name = "identify" +version = "2.6.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/8d/e8b97e6bd3fb6fb271346f7981362f1e04d6a7463abd0de79e1fda17c067/identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980", size = 99360, upload-time = "2026-01-12T18:58:58.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0", size = 99202, upload-time = "2026-01-12T18:58:56.627Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/606be632e37bf8d05b253e8626c2291d74c691ddc7bcdf7d6aaf33b32f6a/imageio-2.37.2.tar.gz", hash = "sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a", size = 389600, upload-time = "2025-11-04T14:29:39.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/fe/301e0936b79bcab4cacc7548bf2853fc28dced0a578bab1f7ef53c9aa75b/imageio-2.37.2-py3-none-any.whl", hash = "sha256:ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b", size = 317646, upload-time = "2025-11-04T14:29:37.948Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "inquirerpy" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pfzy" }, + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/73/7570847b9da026e07053da3bbe2ac7ea6cde6bb2cbd3c7a5a950fa0ae40b/InquirerPy-0.3.4.tar.gz", hash = "sha256:89d2ada0111f337483cb41ae31073108b2ec1e618a49d7110b0d7ade89fc197e", size = 44431, upload-time = "2022-06-27T23:11:20.598Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/ff/3b59672c47c6284e8005b42e84ceba13864aa0f39f067c973d1af02f5d91/InquirerPy-0.3.4-py3-none-any.whl", hash = "sha256:c65fdfbac1fa00e3ee4fb10679f4d3ed7a012abf4833910e63c295827fe2a7d4", size = 67677, upload-time = "2022-06-27T23:11:17.723Z" }, +] + +[[package]] +name = "ipython" +version = "8.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/61/1810830e8b93c72dcd3c0f150c80a00c3deb229562d9423807ec92c3a539/ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39", size = 5513996, upload-time = "2026-01-05T10:59:06.901Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/df/db59624f4c71b39717c423409950ac3f2c8b2ce4b0aac843112c7fb3f721/ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86", size = 831813, upload-time = "2026-01-05T10:59:04.239Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jsonlines" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload-time = "2023-09-01T12:34:44.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload-time = "2023-09-01T12:34:42.563Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, +] + +[[package]] +name = "lazy-loader" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6b/c875b30a1ba490860c93da4cabf479e03f584eba06fe5963f6f6644653d8/lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1", size = 15431, upload-time = "2024-04-05T13:03:12.261Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc", size = 12097, upload-time = "2024-04-05T13:03:10.514Z" }, +] + +[[package]] +name = "lmdb" +version = "1.7.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/a3/3756f2c6adba4a1413dba55e6c81a20b38a868656517308533e33cb59e1c/lmdb-1.7.5.tar.gz", hash = "sha256:f0604751762cb097059d5412444c4057b95f386c7ed958363cf63f453e5108da", size = 883490, upload-time = "2025-10-15T03:39:44.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/b4/8b862c4d7fd6f68cb33e2a919169fda8924121dc5ff61e3cc105304a6dd4/lmdb-1.7.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b48c2359eea876d7b634b49f84019ecc8c1626da97c795fc7b39a793676815df", size = 100910, upload-time = "2025-10-15T03:39:00.727Z" }, + { url = "https://files.pythonhosted.org/packages/27/64/8ab5da48180d5f13a293ea00a9f8758b1bee080e76ea0ab0d6be0d51b55f/lmdb-1.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f84793baeb430ba984eb6c1b4e08c0a508b1c03e79ce79fcda0f29ecc06a95a", size = 99376, upload-time = "2025-10-15T03:39:01.791Z" }, + { url = "https://files.pythonhosted.org/packages/43/e0/51bc942fe5ed3fce69c631b54f52d97785de3d94487376139be6de1e199a/lmdb-1.7.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68cc21314a33faac1b749645a976b7655e7fa7cc104a72365d2429d2db7f6342", size = 298556, upload-time = "2025-10-15T03:39:02.787Z" }, + { url = "https://files.pythonhosted.org/packages/66/c5/19ea75c88b91d12da5c6f4bbe2aca633047b6b270fd613d557583d32cc5c/lmdb-1.7.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2d9b7e102fcfe5e0cfb3acdebd403eb55ccbe5f7202d8f49d60bdafb1546d1e", size = 299449, upload-time = "2025-10-15T03:39:03.903Z" }, + { url = "https://files.pythonhosted.org/packages/1b/74/365194203dbff47d3a1621366d6a1133cdcce261f4ac0e1d0496f01e6ace/lmdb-1.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:69de89cc79e03e191fc6f95797f1bef91b45c415d1ea9d38872b00b2d989a50f", size = 99328, upload-time = "2025-10-15T03:39:04.949Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3a/a441afebff5bd761f7f58d194fed7ac265279964957479a5c8a51c42f9ad/lmdb-1.7.5-cp312-cp312-win_arm64.whl", hash = "sha256:0c880ee4b309e900f2d58a710701f5e6316a351878588c6a95a9c0bcb640680b", size = 94191, upload-time = "2025-10-15T03:39:05.975Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2c/982cb5afed533d0cb8038232b40c19b5b85a2d887dec74dfd39e8351ef4b/lmdb-1.7.5-py3-none-any.whl", hash = "sha256:fc344bb8bc0786c87c4ccb19b31f09a38c08bd159ada6f037d669426fea06f03", size = 148539, upload-time = "2025-10-15T03:39:42.982Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335, upload-time = "2025-02-27T19:19:51.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488, upload-time = "2025-02-27T19:18:51.436Z" }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264, upload-time = "2025-02-27T19:18:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048, upload-time = "2025-02-27T19:18:56.536Z" }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111, upload-time = "2025-02-27T19:18:59.439Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771, upload-time = "2025-02-27T19:19:01.944Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742, upload-time = "2025-02-27T19:19:04.632Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msgpack" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260, upload-time = "2024-09-10T04:25:52.197Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421, upload-time = "2024-09-10T04:25:49.63Z" }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277, upload-time = "2024-09-10T04:24:48.562Z" }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222, upload-time = "2024-09-10T04:25:36.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971, upload-time = "2024-09-10T04:24:58.129Z" }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403, upload-time = "2024-09-10T04:25:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356, upload-time = "2024-09-10T04:25:31.406Z" }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028, upload-time = "2024-09-10T04:25:17.08Z" }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100, upload-time = "2024-09-10T04:25:08.993Z" }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254, upload-time = "2024-09-10T04:25:06.048Z" }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085, upload-time = "2024-09-10T04:25:01.494Z" }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347, upload-time = "2024-09-10T04:25:33.106Z" }, +] + +[[package]] +name = "msgpack-numpy" +version = "0.4.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msgpack" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/94/61e8aee142733ebfdc400a05bdac6e1763c4514bba3b42743d223f388450/msgpack-numpy-0.4.8.tar.gz", hash = "sha256:c667d3180513422f9c7545be5eec5d296dcbb357e06f72ed39cc683797556e69", size = 10923, upload-time = "2022-06-09T03:43:08.739Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/5d/f25ac7d4fb77cbd53ddc6d05d833c6bf52b12770a44fa9a447eed470ca9a/msgpack_numpy-0.4.8-py2.py3-none-any.whl", hash = "sha256:773c19d4dfbae1b3c7b791083e2caf66983bb19b40901646f61d8731554ae3da", size = 6919, upload-time = "2022-06-09T03:43:06.82Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload-time = "2024-01-28T18:52:34.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload-time = "2024-01-28T18:52:26.062Z" }, + { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload-time = "2024-01-28T18:52:28.115Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload-time = "2024-01-28T18:52:29.395Z" }, + { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload-time = "2024-01-28T18:52:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload-time = "2024-01-28T18:52:31.981Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, +] + +[[package]] +name = "nvidia-cublas" +version = "13.3.0.5" +source = { registry = "https://pypi.nvidia.com/" } +wheels = [ + { url = "https://pypi.nvidia.com/nvidia-cublas/nvidia_cublas-13.3.0.5-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:48308e7f44feb337ca24d95efdceeac5703fb5dcf9bfb0c23f1eb48015fdd8a1" }, + { url = "https://pypi.nvidia.com/nvidia-cublas/nvidia_cublas-13.3.0.5-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:366568e2dc59e6fe71ffd179f9f2a38b8b2772aed626320a64008651b1e72974" }, + { url = "https://pypi.nvidia.com/nvidia-cublas/nvidia_cublas-13.3.0.5-py3-none-win_amd64.whl", hash = "sha256:065b944083560334e02299050979b7cfd91ec79e5fc5c23d602f7f35c0d1356c" }, +] + +[[package]] +name = "nvidia-cudnn-cu13" +version = "9.20.0.48" +source = { registry = "https://pypi.nvidia.com/" } +dependencies = [ + { name = "nvidia-cublas" }, +] +wheels = [ + { url = "https://pypi.nvidia.com/nvidia-cudnn-cu13/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1" }, + { url = "https://pypi.nvidia.com/nvidia-cudnn-cu13/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304" }, + { url = "https://pypi.nvidia.com/nvidia-cudnn-cu13/nvidia_cudnn_cu13-9.20.0.48-py3-none-win_amd64.whl", hash = "sha256:af8139732b99c0118be65ea5aac97f0d46018f8c552889e49d2fb0c6261a4a24" }, +] + +[[package]] +name = "nvidia-cudss-cu13" +version = "0.7.1.6" +source = { registry = "https://pypi.nvidia.com/" } +dependencies = [ + { name = "cuda-toolkit", extra = ["cublas"] }, +] +wheels = [ + { url = "https://pypi.nvidia.com/nvidia-cudss-cu13/nvidia_cudss_cu13-0.7.1.6-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:6fbc8cf61f0ec66d2d7bffad63605f914cae032412b8881ccdc7e89f29088f6d" }, + { url = "https://pypi.nvidia.com/nvidia-cudss-cu13/nvidia_cudss_cu13-0.7.1.6-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:ec5d5a53789d282da8bdfac4743e01908589da79844ec9355518465d0615a801" }, + { url = "https://pypi.nvidia.com/nvidia-cudss-cu13/nvidia_cudss_cu13-0.7.1.6-py3-none-win_amd64.whl", hash = "sha256:df502c3efef8dc5c79efc6c821bc974311588db79b525b1218b129389edccd51" }, +] + +[[package]] +name = "omegaconf" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120, upload-time = "2022-12-08T20:59:22.753Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500, upload-time = "2022-12-08T20:59:19.686Z" }, +] + +[[package]] +name = "onnx" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/8a/335c03a8683a88a32f9a6bb98899ea6df241a41df64b37b9696772414794/onnx-1.20.1.tar.gz", hash = "sha256:ded16de1df563d51fbc1ad885f2a426f814039d8b5f4feb77febe09c0295ad67", size = 12048980, upload-time = "2026-01-10T01:40:03.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/4c/4b17e82f91ab9aa07ff595771e935ca73547b035030dc5f5a76e63fbfea9/onnx-1.20.1-cp312-abi3-macosx_12_0_universal2.whl", hash = "sha256:1d923bb4f0ce1b24c6859222a7e6b2f123e7bfe7623683662805f2e7b9e95af2", size = 17903547, upload-time = "2026-01-10T01:39:31.015Z" }, + { url = "https://files.pythonhosted.org/packages/64/5e/1bfa100a9cb3f2d3d5f2f05f52f7e60323b0e20bb0abace1ae64dbc88f25/onnx-1.20.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddc0b7d8b5a94627dc86c533d5e415af94cbfd103019a582669dad1f56d30281", size = 17412021, upload-time = "2026-01-10T01:39:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/d3fec0dcf9a7a99e7368112d9c765154e81da70fcba1e3121131a45c245b/onnx-1.20.1-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9336b6b8e6efcf5c490a845f6afd7e041c89a56199aeda384ed7d58fb953b080", size = 17510450, upload-time = "2026-01-10T01:39:36.589Z" }, + { url = "https://files.pythonhosted.org/packages/74/a7/edce1403e05a46e59b502fae8e3350ceeac5841f8e8f1561e98562ed9b09/onnx-1.20.1-cp312-abi3-win32.whl", hash = "sha256:564c35a94811979808ab5800d9eb4f3f32c12daedba7e33ed0845f7c61ef2431", size = 16238216, upload-time = "2026-01-10T01:39:39.46Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c7/8690c81200ae652ac550c1df52f89d7795e6cc941f3cb38c9ef821419e80/onnx-1.20.1-cp312-abi3-win_amd64.whl", hash = "sha256:9fe7f9a633979d50984b94bda8ceb7807403f59a341d09d19342dc544d0ca1d5", size = 16389207, upload-time = "2026-01-10T01:39:41.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/a0/4fb0e6d36eaf079af366b2c1f68bafe92df6db963e2295da84388af64abc/onnx-1.20.1-cp312-abi3-win_arm64.whl", hash = "sha256:21d747348b1c8207406fa2f3e12b82f53e0d5bb3958bcd0288bd27d3cb6ebb00", size = 16344155, upload-time = "2026-01-10T01:39:45.536Z" }, +] + +[[package]] +name = "onnx-ir" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "sympy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/a5/acc43c8fa6edbc584d127fb6bbd13ae9ebfc01b9675c74e0da2de15fa4a6/onnx_ir-0.2.0.tar.gz", hash = "sha256:8bad3906691987290789b26d05e0dbff467029a0b1e411e12e4cae02e43503e4", size = 141693, upload-time = "2026-02-24T02:31:10.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/df/a99736bcca6b16e36c687ce4996abcf4ce73c514fddd9e730cfcb6a334f2/onnx_ir-0.2.0-py3-none-any.whl", hash = "sha256:eb14d1399c2442bd1ff702719e70074e9cedfa3af5729416a32752c9e0f82591", size = 164100, upload-time = "2026-02-24T02:31:09.454Z" }, +] + +[[package]] +name = "onnxscript" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "onnx-ir" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/2b/538fdeb0e25bed5d7e0f954af5710543e2629499fb74381afc3333f8a8ae/onnxscript-0.6.2.tar.gz", hash = "sha256:abb2e6f464db40c9b8c7fbb3e64cca04cf3f4495e67c4eda5eac17b784191ce3", size = 590865, upload-time = "2026-02-10T22:53:39.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/56/e6b179397497ab93266b6eb00743403a6a699a29063a423c4a14595d3db9/onnxscript-0.6.2-py3-none-any.whl", hash = "sha256:20e3c3fd1da19b3655549d5455a2df719db47374fe430e01e865ae69127c37b9", size = 689064, upload-time = "2026-02-10T22:53:41.663Z" }, +] + +[[package]] +name = "opencv-python-headless" +version = "4.11.0.86" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929, upload-time = "2025-01-16T13:53:40.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460, upload-time = "2025-01-16T13:52:57.015Z" }, + { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330, upload-time = "2025-01-16T13:55:45.731Z" }, + { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060, upload-time = "2025-01-16T13:51:59.625Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856, upload-time = "2025-01-16T13:53:29.654Z" }, + { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425, upload-time = "2025-01-16T13:52:49.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386, upload-time = "2025-01-16T13:52:56.418Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, +] + +[[package]] +name = "parso" +version = "0.8.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, +] + +[[package]] +name = "peft" +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch" }, + { name = "tqdm" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/b8/2e79377efaa1e5f0d70a497db7914ffd355846e760ffa2f7883ab0f600fb/peft-0.17.1.tar.gz", hash = "sha256:e6002b42517976c290b3b8bbb9829a33dd5d470676b2dec7cb4df8501b77eb9f", size = 568192, upload-time = "2025-08-21T09:25:22.703Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fe/a2da1627aa9cb6310b6034598363bd26ac301c4a99d21f415b1b2855891e/peft-0.17.1-py3-none-any.whl", hash = "sha256:3d129d64def3d74779c32a080d2567e5f7b674e77d546e3585138216d903f99e", size = 504896, upload-time = "2025-08-21T09:25:18.974Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pfzy" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/5a/32b50c077c86bfccc7bed4881c5a2b823518f5450a30e639db5d3711952e/pfzy-0.3.4.tar.gz", hash = "sha256:717ea765dd10b63618e7298b2d98efd819e0b30cd5905c9707223dceeb94b3f1", size = 8396, upload-time = "2022-01-28T02:26:17.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/d7/8ff98376b1acc4503253b685ea09981697385ce344d4e3935c2af49e044d/pfzy-0.3.4-py3-none-any.whl", hash = "sha256:5f50d5b2b3207fa72e7ec0ef08372ef652685470974a107d0d4999fc5a903a96", size = 8537, upload-time = "2022-01-28T02:26:16.047Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/25/ccd8e88fcd16a4eb6343a8b4b9635e6f3928a7ebcd82822a14d20e3ca29f/platformdirs-4.7.0.tar.gz", hash = "sha256:fd1a5f8599c85d49b9ac7d6e450bc2f1aaf4a23f1fe86d09952fe20ad365cf36", size = 23118, upload-time = "2026-02-12T22:21:53.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/e3/1eddccb2c39ecfbe09b3add42a04abcc3fa5b468aa4224998ffb8a7e9c8f/platformdirs-4.7.0-py3-none-any.whl", hash = "sha256:1ed8db354e344c5bb6039cd727f096af975194b508e37177719d562b2b540ee6", size = 18983, upload-time = "2026-02-12T22:21:52.237Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" }, + { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" }, + { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pyarrow" +version = "23.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/33/ffd9c3eb087fa41dd79c3cf20c4c0ae3cdb877c4f8e1107a446006344924/pyarrow-23.0.0.tar.gz", hash = "sha256:180e3150e7edfcd182d3d9afba72f7cf19839a497cc76555a8dce998a8f67615", size = 1167185, upload-time = "2026-01-18T16:19:42.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/bd/c861d020831ee57609b73ea721a617985ece817684dc82415b0bc3e03ac3/pyarrow-23.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5961a9f646c232697c24f54d3419e69b4261ba8a8b66b0ac54a1851faffcbab8", size = 34189116, upload-time = "2026-01-18T16:15:28.054Z" }, + { url = "https://files.pythonhosted.org/packages/8c/23/7725ad6cdcbaf6346221391e7b3eecd113684c805b0a95f32014e6fa0736/pyarrow-23.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:632b3e7c3d232f41d64e1a4a043fb82d44f8a349f339a1188c6a0dd9d2d47d8a", size = 35803831, upload-time = "2026-01-18T16:15:33.798Z" }, + { url = "https://files.pythonhosted.org/packages/57/06/684a421543455cdc2944d6a0c2cc3425b028a4c6b90e34b35580c4899743/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:76242c846db1411f1d6c2cc3823be6b86b40567ee24493344f8226ba34a81333", size = 44436452, upload-time = "2026-01-18T16:15:41.598Z" }, + { url = "https://files.pythonhosted.org/packages/c6/6f/8f9eb40c2328d66e8b097777ddcf38494115ff9f1b5bc9754ba46991191e/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b73519f8b52ae28127000986bf228fda781e81d3095cd2d3ece76eb5cf760e1b", size = 47557396, upload-time = "2026-01-18T16:15:51.252Z" }, + { url = "https://files.pythonhosted.org/packages/10/6e/f08075f1472e5159553501fde2cc7bc6700944bdabe49a03f8a035ee6ccd/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:068701f6823449b1b6469120f399a1239766b117d211c5d2519d4ed5861f75de", size = 48147129, upload-time = "2026-01-18T16:16:00.299Z" }, + { url = "https://files.pythonhosted.org/packages/7d/82/d5a680cd507deed62d141cc7f07f7944a6766fc51019f7f118e4d8ad0fb8/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1801ba947015d10e23bca9dd6ef5d0e9064a81569a89b6e9a63b59224fd060df", size = 50596642, upload-time = "2026-01-18T16:16:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/a9/26/4f29c61b3dce9fa7780303b86895ec6a0917c9af927101daaaf118fbe462/pyarrow-23.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:52265266201ec25b6839bf6bd4ea918ca6d50f31d13e1cf200b4261cd11dc25c", size = 27660628, upload-time = "2026-01-18T16:16:15.28Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-timeout" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/5f/557d2032a2f471edbcc227da724c24a1c05887b5cda1e3ae53af98b9e0a5/pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b", size = 281158, upload-time = "2025-08-03T05:05:40.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/9b/c0957041067c7724b310f22c398be46399297c12ed834c3bc42200a2756f/pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd", size = 1305432, upload-time = "2025-08-03T05:03:32.177Z" }, + { url = "https://files.pythonhosted.org/packages/8e/55/bd3a312790858f16b7def3897a0c3eb1804e974711bf7b9dcb5f47e7f82c/pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd", size = 895095, upload-time = "2025-08-03T05:03:33.918Z" }, + { url = "https://files.pythonhosted.org/packages/20/50/fc384631d8282809fb1029a4460d2fe90fa0370a0e866a8318ed75c8d3bb/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a", size = 651826, upload-time = "2025-08-03T05:03:35.818Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0a/2356305c423a975000867de56888b79e44ec2192c690ff93c3109fd78081/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577", size = 839751, upload-time = "2025-08-03T05:03:37.265Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1b/81e95ad256ca7e7ccd47f5294c1c6da6e2b64fbace65b84fe8a41470342e/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e", size = 1641359, upload-time = "2025-08-03T05:03:38.799Z" }, + { url = "https://files.pythonhosted.org/packages/50/63/9f50ec965285f4e92c265c8f18344e46b12803666d8b73b65d254d441435/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb", size = 2020281, upload-time = "2025-08-03T05:03:40.338Z" }, + { url = "https://files.pythonhosted.org/packages/02/4a/19e3398d0dc66ad2b463e4afa1fc541d697d7bc090305f9dfb948d3dfa29/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55", size = 1877112, upload-time = "2025-08-03T05:03:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/bf/42/c562e9151aa90ed1d70aac381ea22a929d6b3a2ce4e1d6e2e135d34fd9c6/pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb", size = 558177, upload-time = "2025-08-03T05:03:43.979Z" }, + { url = "https://files.pythonhosted.org/packages/40/96/5c50a7d2d2b05b19994bf7336b97db254299353dd9b49b565bb71b485f03/pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686", size = 618923, upload-time = "2025-08-03T05:03:45.438Z" }, + { url = "https://files.pythonhosted.org/packages/13/33/1ec89c8f21c89d21a2eaff7def3676e21d8248d2675705e72554fb5a6f3f/pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed", size = 552358, upload-time = "2025-08-03T05:03:46.887Z" }, +] + +[[package]] +name = "regex" +version = "2026.1.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/86/07d5056945f9ec4590b518171c4254a5925832eb727b56d3c38a7476f316/regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5", size = 414811, upload-time = "2026-01-14T23:18:02.775Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/81/10d8cf43c807d0326efe874c1b79f22bfb0fb226027b0b19ebc26d301408/regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1", size = 489398, upload-time = "2026-01-14T23:14:43.741Z" }, + { url = "https://files.pythonhosted.org/packages/90/b0/7c2a74e74ef2a7c32de724658a69a862880e3e4155cba992ba04d1c70400/regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681", size = 291339, upload-time = "2026-01-14T23:14:45.183Z" }, + { url = "https://files.pythonhosted.org/packages/19/4d/16d0773d0c818417f4cc20aa0da90064b966d22cd62a8c46765b5bd2d643/regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f", size = 289003, upload-time = "2026-01-14T23:14:47.25Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e4/1fc4599450c9f0863d9406e944592d968b8d6dfd0d552a7d569e43bceada/regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa", size = 798656, upload-time = "2026-01-14T23:14:48.77Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e6/59650d73a73fa8a60b3a590545bfcf1172b4384a7df2e7fe7b9aab4e2da9/regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804", size = 864252, upload-time = "2026-01-14T23:14:50.528Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ab/1d0f4d50a1638849a97d731364c9a80fa304fec46325e48330c170ee8e80/regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c", size = 912268, upload-time = "2026-01-14T23:14:52.952Z" }, + { url = "https://files.pythonhosted.org/packages/dd/df/0d722c030c82faa1d331d1921ee268a4e8fb55ca8b9042c9341c352f17fa/regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5", size = 803589, upload-time = "2026-01-14T23:14:55.182Z" }, + { url = "https://files.pythonhosted.org/packages/66/23/33289beba7ccb8b805c6610a8913d0131f834928afc555b241caabd422a9/regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3", size = 775700, upload-time = "2026-01-14T23:14:56.707Z" }, + { url = "https://files.pythonhosted.org/packages/e7/65/bf3a42fa6897a0d3afa81acb25c42f4b71c274f698ceabd75523259f6688/regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb", size = 787928, upload-time = "2026-01-14T23:14:58.312Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f5/13bf65864fc314f68cdd6d8ca94adcab064d4d39dbd0b10fef29a9da48fc/regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410", size = 858607, upload-time = "2026-01-14T23:15:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/040e589834d7a439ee43fb0e1e902bc81bd58a5ba81acffe586bb3321d35/regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4", size = 763729, upload-time = "2026-01-14T23:15:02.248Z" }, + { url = "https://files.pythonhosted.org/packages/9b/84/6921e8129687a427edf25a34a5594b588b6d88f491320b9de5b6339a4fcb/regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d", size = 850697, upload-time = "2026-01-14T23:15:03.878Z" }, + { url = "https://files.pythonhosted.org/packages/8a/87/3d06143d4b128f4229158f2de5de6c8f2485170c7221e61bf381313314b2/regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22", size = 789849, upload-time = "2026-01-14T23:15:06.102Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/c50a63842b6bd48850ebc7ab22d46e7a2a32d824ad6c605b218441814639/regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913", size = 266279, upload-time = "2026-01-14T23:15:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/f2/36/39d0b29d087e2b11fd8191e15e81cce1b635fcc845297c67f11d0d19274d/regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a", size = 277166, upload-time = "2026-01-14T23:15:09.257Z" }, + { url = "https://files.pythonhosted.org/packages/28/32/5b8e476a12262748851fa8ab1b0be540360692325975b094e594dfebbb52/regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056", size = 270415, upload-time = "2026-01-14T23:15:10.743Z" }, +] + +[[package]] +name = "requests" +version = "2.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, +] + +[[package]] +name = "rich" +version = "14.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" }, + { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" }, + { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" }, + { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" }, + { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" }, + { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" }, + { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" }, + { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" }, + { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" }, + { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" }, +] + +[[package]] +name = "safetensors" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, +] + +[[package]] +name = "scikit-image" +version = "0.25.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "imageio" }, + { name = "lazy-loader" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "scipy" }, + { name = "tifffile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/a8/3c0f256012b93dd2cb6fda9245e9f4bff7dc0486880b248005f15ea2255e/scikit_image-0.25.2.tar.gz", hash = "sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde", size = 22693594, upload-time = "2025-02-18T18:05:24.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/8c/5df82881284459f6eec796a5ac2a0a304bb3384eec2e73f35cfdfcfbf20c/scikit_image-0.25.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb", size = 13986000, upload-time = "2025-02-18T18:04:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e6/93bebe1abcdce9513ffec01d8af02528b4c41fb3c1e46336d70b9ed4ef0d/scikit_image-0.25.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed", size = 13235893, upload-time = "2025-02-18T18:04:51.049Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/eda616e33f67129e5979a9eb33c710013caa3aa8a921991e6cc0b22cea33/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d", size = 14178389, upload-time = "2025-02-18T18:04:54.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b5/b75527c0f9532dd8a93e8e7cd8e62e547b9f207d4c11e24f0006e8646b36/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824", size = 15003435, upload-time = "2025-02-18T18:04:57.586Z" }, + { url = "https://files.pythonhosted.org/packages/34/e3/49beb08ebccda3c21e871b607c1cb2f258c3fa0d2f609fed0a5ba741b92d/scikit_image-0.25.2-cp312-cp312-win_amd64.whl", hash = "sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2", size = 12899474, upload-time = "2025-02-18T18:05:01.166Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, +] + +[[package]] +name = "sentry-sdk" +version = "2.52.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/eb/1b497650eb564701f9a7b8a95c51b2abe9347ed2c0b290ba78f027ebe4ea/sentry_sdk-2.52.0.tar.gz", hash = "sha256:fa0bec872cfec0302970b2996825723d67390cdd5f0229fb9efed93bd5384899", size = 410273, upload-time = "2026-02-04T15:03:54.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/63/2c6daf59d86b1c30600bff679d039f57fd1932af82c43c0bde1cbc55e8d4/sentry_sdk-2.52.0-py2.py3-none-any.whl", hash = "sha256:931c8f86169fc6f2752cb5c4e6480f0d516112e78750c312e081ababecbaf2ed", size = 435547, upload-time = "2026-02-04T15:03:51.567Z" }, +] + +[[package]] +name = "setuptools" +version = "82.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/f3/748f4d6f65d1756b9ae577f329c951cda23fb900e4de9f70900ced962085/setuptools-82.0.0.tar.gz", hash = "sha256:22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb", size = 1144893, upload-time = "2026-02-08T15:08:40.206Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl", hash = "sha256:70b18734b607bd1da571d097d236cfcfacaf01de45717d59e6e04b96877532e0", size = 1003468, upload-time = "2026-02-08T15:08:38.723Z" }, +] + +[[package]] +name = "shtab" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/7a/7f131b6082d8b592c32e4312d0a6da3d0b28b8f0d305ddd93e49c9d89929/shtab-1.8.0.tar.gz", hash = "sha256:75f16d42178882b7f7126a0c2cb3c848daed2f4f5a276dd1ded75921cc4d073a", size = 46062, upload-time = "2025-11-18T10:57:47.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/e1/202a31727b0d096a04380f78e809074d7a1d0a22d9d5a39fea1d2353fd02/shtab-1.8.0-py3-none-any.whl", hash = "sha256:f0922a82174b4007e06ac0bac4f79abd826c5cca88e201bfd927f889803c571d", size = 14457, upload-time = "2025-11-18T10:57:45.906Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tensorrt" +version = "10.15.1.29" +source = { registry = "https://pypi.nvidia.com/" } +dependencies = [ + { name = "tensorrt-cu13" }, +] +sdist = { url = "https://pypi.nvidia.com/tensorrt/tensorrt-10.15.1.29.tar.gz", hash = "sha256:a78fb34aee9695b81a7485ac0648859b802ff1faaac4bde743d9c51d7493204b" } + +[[package]] +name = "tensorrt-cu13" +version = "10.15.1.29" +source = { registry = "https://pypi.nvidia.com/" } +dependencies = [ + { name = "tensorrt-cu13-bindings" }, + { name = "tensorrt-cu13-libs" }, +] +sdist = { url = "https://pypi.nvidia.com/tensorrt-cu13/tensorrt_cu13-10.15.1.29.tar.gz", hash = "sha256:60edcdf1a68526732ea613c309283af036f418f6ebcbc8e18d24566b74d776e0" } + +[[package]] +name = "tensorrt-cu13-bindings" +version = "10.15.1.29" +source = { registry = "https://pypi.nvidia.com/" } +wheels = [ + { url = "https://pypi.nvidia.com/tensorrt-cu13-bindings/tensorrt_cu13_bindings-10.15.1.29-cp312-none-manylinux_2_28_x86_64.whl", hash = "sha256:7c17a2d83de68bb13531989d5f2edf4c2a7e710e41e8b5652f0d170d2893b1bc" }, + { url = "https://pypi.nvidia.com/tensorrt-cu13-bindings/tensorrt_cu13_bindings-10.15.1.29-cp312-none-manylinux_2_35_aarch64.whl", hash = "sha256:503a623a015cfce5bf00477162be2e872fdf2397acaf840f75c9dd22f41d6672" }, + { url = "https://pypi.nvidia.com/tensorrt-cu13-bindings/tensorrt_cu13_bindings-10.15.1.29-cp312-none-win_amd64.whl", hash = "sha256:7d9b34ac53b480102ce1b55ce6103b961c96997f2254d0c718ea69959b4f2bb4" }, +] + +[[package]] +name = "tensorrt-cu13-libs" +version = "10.15.1.29" +source = { registry = "https://pypi.nvidia.com/" } +wheels = [ + { url = "https://pypi.nvidia.com/tensorrt-cu13-libs/tensorrt_cu13_libs-10.15.1.29-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:0619b60ba97425909c18442eb36cbe7f99b1a7eeb4ebf9c6b278e6e2c5ac6c3b" }, + { url = "https://pypi.nvidia.com/tensorrt-cu13-libs/tensorrt_cu13_libs-10.15.1.29-py2.py3-none-manylinux_2_35_aarch64.whl", hash = "sha256:f2f6fdaba477ef5536e9932d7f0ce2952ab3c87c5d0fbf93f080388390cba1de" }, + { url = "https://pypi.nvidia.com/tensorrt-cu13-libs/tensorrt_cu13_libs-10.15.1.29-py2.py3-none-win_amd64.whl", hash = "sha256:930cf4917b7a3b8174400c1cf9a2d40f81f0c97a844077b18ed308930806373d" }, +] + +[[package]] +name = "termcolor" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/56/ab275c2b56a5e2342568838f0d5e3e66a32354adcc159b495e374cda43f5/termcolor-3.2.0.tar.gz", hash = "sha256:610e6456feec42c4bcd28934a8c87a06c3fa28b01561d46aa09a9881b8622c58", size = 14423, upload-time = "2025-10-25T19:11:42.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/d5/141f53d7c1eb2a80e6d3e9a390228c3222c27705cbe7f048d3623053f3ca/termcolor-3.2.0-py3-none-any.whl", hash = "sha256:a10343879eba4da819353c55cb8049b0933890c2ebf9ad5d3ecd2bb32ea96ea6", size = 7698, upload-time = "2025-10-25T19:11:41.536Z" }, +] + +[[package]] +name = "tifffile" +version = "2025.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/d0/18fed0fc0916578a4463f775b0fbd9c5fed2392152d039df2fb533bfdd5d/tifffile-2025.5.10.tar.gz", hash = "sha256:018335d34283aa3fd8c263bae5c3c2b661ebc45548fde31504016fcae7bf1103", size = 365290, upload-time = "2025-05-10T19:22:34.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/06/bd0a6097da704a7a7c34a94cfd771c3ea3c2f405dd214e790d22c93f6be1/tifffile-2025.5.10-py3-none-any.whl", hash = "sha256:e37147123c0542d67bc37ba5cdd67e12ea6fbe6e86c52bee037a9eb6a064e5ad", size = 226533, upload-time = "2025-05-10T19:22:27.279Z" }, +] + +[[package]] +name = "tokenizers" +version = "0.22.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, + { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, + { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, + { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, +] + +[[package]] +name = "torch" +version = "2.10.0" +source = { registry = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "setuptools" }, + { name = "sympy" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+f/c59/7ddc0c1f8de6c/torch-2.10.0-cp312-cp312-linux_aarch64.whl", hash = "sha256:c597ddc0c1f8de6c54fc7c7c09bfe5f70e04a5024383740e99a02eb13498ced5" }, +] + +[[package]] +name = "torchcodec" +version = "0.10.0" +source = { registry = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" } +wheels = [ + { url = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+f/993/01406faba507d/torchcodec-0.10.0-cp312-cp312-linux_aarch64.whl", hash = "sha256:99301406faba507d2e06995f29ba2d1950086a032829b0c5d953416283882ddc" }, +] + +[[package]] +name = "torchvision" +version = "0.25.0" +source = { registry = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, + { name = "torch" }, +] +wheels = [ + { url = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+f/62e/2fd4aaade43f3/torchvision-0.25.0-cp312-cp312-linux_aarch64.whl", hash = "sha256:62e2fd4aaade43f398d7ab31515b4a05c4cc8428d54ab248caa526c155ffc88e" }, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "transformers" +version = "4.57.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/70/d42a739e8dfde3d92bb2fff5819cbf331fe9657323221e79415cd5eb65ee/transformers-4.57.3.tar.gz", hash = "sha256:df4945029aaddd7c09eec5cad851f30662f8bd1746721b34cc031d70c65afebc", size = 10139680, upload-time = "2025-11-25T15:51:30.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/6b/2f416568b3c4c91c96e5a365d164f8a4a4a88030aa8ab4644181fdadce97/transformers-4.57.3-py3-none-any.whl", hash = "sha256:c77d353a4851b1880191603d36acb313411d3577f6e2897814f333841f7003f4", size = 11993463, upload-time = "2025-11-25T15:51:26.493Z" }, +] + +[[package]] +name = "triton" +version = "3.5.0" +source = { registry = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+simple" } +wheels = [ + { url = "https://pypi.jetson-ai-lab.io/sbsa/cu130/+f/968/29c4f038c9bbd/triton-3.5.0-cp312-cp312-linux_aarch64.whl", hash = "sha256:96829c4f038c9bbd90e240c877c124477625775236b796ba508b8bec9dde2902" }, +] + +[[package]] +name = "typeguard" +version = "4.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203, upload-time = "2025-06-18T09:56:07.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874, upload-time = "2025-06-18T09:56:05.999Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tyro" +version = "0.9.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docstring-parser" }, + { name = "rich" }, + { name = "shtab" }, + { name = "typeguard" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/86/90242f575fa5d50c6d5fae6c47a95cd5b56b17413dc6d8391190aed58ac5/tyro-0.9.17.tar.gz", hash = "sha256:4a43386c6f3c8a06ed40a2f290de22fa3306300c68599ce5d7bd6fd1ad13c35a", size = 262449, upload-time = "2025-03-13T01:39:45.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b1/c0c62adcd5e64244af876a3173f194d02dc1fe830cae28370b6d9e315971/tyro-0.9.17-py3-none-any.whl", hash = "sha256:f601fcd27edc99bc10a03602a47930ce8906ed995179a98b689bc85db38bec40", size = 123658, upload-time = "2025-03-13T01:39:43.912Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.36.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, +] + +[[package]] +name = "wandb" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "gitpython" }, + { name = "packaging" }, + { name = "platformdirs" }, + { name = "protobuf" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sentry-sdk" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/8b/db2d44395c967cd452517311fd6ede5d1e07310769f448358d4874248512/wandb-0.23.0.tar.gz", hash = "sha256:e5f98c61a8acc3ee84583ca78057f64344162ce026b9f71cb06eea44aec27c93", size = 44413921, upload-time = "2025-11-11T21:06:30.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/61/a3220c7fa4cadfb2b2a5c09e3fa401787326584ade86d7c1f58bf1cd43bd/wandb-0.23.0-py3-none-macosx_12_0_arm64.whl", hash = "sha256:b682ec5e38fc97bd2e868ac7615a0ab4fc6a15220ee1159e87270a5ebb7a816d", size = 18992250, upload-time = "2025-11-11T21:06:03.412Z" }, + { url = "https://files.pythonhosted.org/packages/90/16/e69333cf3d11e7847f424afc6c8ae325e1f6061b2e5118d7a17f41b6525d/wandb-0.23.0-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:ec094eb71b778e77db8c188da19e52c4f96cb9d5b4421d7dc05028afc66fd7e7", size = 20045616, upload-time = "2025-11-11T21:06:07.109Z" }, + { url = "https://files.pythonhosted.org/packages/62/79/42dc6c7bb0b425775fe77f1a3f1a22d75d392841a06b43e150a3a7f2553a/wandb-0.23.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e43f1f04b98c34f407dcd2744cec0a590abce39bed14a61358287f817514a7b", size = 18758848, upload-time = "2025-11-11T21:06:09.832Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/d6ddb78334996ccfc1179444bfcfc0f37ffd07ee79bb98940466da6f68f8/wandb-0.23.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5847f98cbb3175caf5291932374410141f5bb3b7c25f9c5e562c1988ce0bf5", size = 20231493, upload-time = "2025-11-11T21:06:12.323Z" }, + { url = "https://files.pythonhosted.org/packages/52/4d/0ad6df0e750c19dabd24d2cecad0938964f69a072f05fbdab7281bec2b64/wandb-0.23.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6151355fd922539926e870be811474238c9614b96541773b990f1ce53368aef6", size = 18793473, upload-time = "2025-11-11T21:06:14.967Z" }, + { url = "https://files.pythonhosted.org/packages/f8/da/c2ba49c5573dff93dafc0acce691bb1c3d57361bf834b2f2c58e6193439b/wandb-0.23.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df62e426e448ebc44269140deb7240df474e743b12d4b1f53b753afde4aa06d4", size = 20332882, upload-time = "2025-11-11T21:06:17.865Z" }, + { url = "https://files.pythonhosted.org/packages/40/65/21bfb10ee5cd93fbcaf794958863c7e05bac4bbeb1cc1b652094aa3743a5/wandb-0.23.0-py3-none-win32.whl", hash = "sha256:6c21d3eadda17aef7df6febdffdddfb0b4835c7754435fc4fe27631724269f5c", size = 19433198, upload-time = "2025-11-11T21:06:21.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/33/cbe79e66c171204e32cf940c7fdfb8b5f7d2af7a00f301c632f3a38aa84b/wandb-0.23.0-py3-none-win_amd64.whl", hash = "sha256:b50635fa0e16e528bde25715bf446e9153368428634ca7a5dbd7a22c8ae4e915", size = 19433201, upload-time = "2025-11-11T21:06:24.607Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/5ecfae12d78ea036a746c071e4c13b54b28d641efbba61d2947c73b3e6f9/wandb-0.23.0-py3-none-win_arm64.whl", hash = "sha256:fa0181b02ce4d1993588f4a728d8b73ae487eb3cb341e6ce01c156be7a98ec72", size = 17678649, upload-time = "2025-11-11T21:06:27.289Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, +] + +[[package]] +name = "xxhash" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744, upload-time = "2025-10-02T14:34:34.622Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035, upload-time = "2025-10-02T14:34:37.354Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, + { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163, upload-time = "2025-10-02T14:34:39.872Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411, upload-time = "2025-10-02T14:34:41.569Z" }, + { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898, upload-time = "2025-10-02T14:34:46.302Z" }, + { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655, upload-time = "2025-10-02T14:34:47.571Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001, upload-time = "2025-10-02T14:34:49.273Z" }, + { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, + { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617, upload-time = "2025-10-02T14:34:51.954Z" }, + { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534, upload-time = "2025-10-02T14:34:53.276Z" }, + { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, +] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, + { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] diff --git a/scripts/deployment/spark/wheels/flash_attn-2.8.3-cp312-cp312-linux_aarch64.whl b/scripts/deployment/spark/wheels/flash_attn-2.8.3-cp312-cp312-linux_aarch64.whl new file mode 100644 index 000000000..95f65f046 --- /dev/null +++ b/scripts/deployment/spark/wheels/flash_attn-2.8.3-cp312-cp312-linux_aarch64.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2777f80d348e213ae6cd65f288485189cb49e1a2ff7bfbceeb47cdef43301e2b +size 65372908 diff --git a/scripts/deployment/spark/wheels/torchcodec-0.10.0a0-cp312-cp312-linux_aarch64.whl b/scripts/deployment/spark/wheels/torchcodec-0.10.0a0-cp312-cp312-linux_aarch64.whl new file mode 100644 index 000000000..24c5bcc23 --- /dev/null +++ b/scripts/deployment/spark/wheels/torchcodec-0.10.0a0-cp312-cp312-linux_aarch64.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dcd2ce933cfdbbeeda0bb4d35cece373035bdf341f0c58c1176c36f71e53954 +size 570558 diff --git a/scripts/deployment/standalone_inference_script.py b/scripts/deployment/standalone_inference_script.py index da5ebbdbe..227d40ea2 100644 --- a/scripts/deployment/standalone_inference_script.py +++ b/scripts/deployment/standalone_inference_script.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + from concurrent.futures import ThreadPoolExecutor from copy import deepcopy from dataclasses import dataclass, field @@ -6,13 +21,18 @@ from pathlib import Path import random import re +import sys import time from typing import Any, Literal import warnings +from _trt_contract import assert_exec_horizon_within_model, resolve_batch_size from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader from gr00t.data.dataset.sharded_single_step_dataset import extract_step_data from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.utils import parse_observation_gr00t +from gr00t.deployment.modes import InferenceMode +from gr00t.eval._horizon_contract import migrate_deprecated_action_horizon_argv from gr00t.policy.gr00t_policy import Gr00tPolicy from gr00t.policy.policy import BasePolicy from matplotlib import pyplot as plt @@ -28,23 +48,33 @@ Combined inference script supporting both PyTorch and TensorRT modes. Example commands: - -# PyTorch mode (default): -python groot/scripts/deployment/standalone_inference_script.py \ - --model_path /path/to/checkpoint \ - --dataset_path /path/to/dataset \ - --embodiment_tag GR1 \ + +# Zero-shot inference with base model on bundled DROID demo data: +python scripts/deployment/standalone_inference_script.py \ + --model-path nvidia/GR00T-N1.7-3B \ + --dataset-path demo_data/droid_sample \ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \ + --traj-ids 1 2 \ + --inference-mode pytorch \ + --execution-horizon 8 + +# Finetuned model (e.g. LIBERO): +python scripts/deployment/standalone_inference_script.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA \ --traj-ids 0 1 2 \ - --inference-mode pytorch + --inference-mode pytorch \ + --execution-horizon 8 # TensorRT mode: -python groot/scripts/deployment/standalone_inference_script.py \ - --model_path /path/to/checkpoint \ - --dataset_path /path/to/dataset \ - --embodiment_tag GR1 \ +python scripts/deployment/standalone_inference_script.py \ + --model-path checkpoints/GR00T-N1.7-LIBERO/libero_10 \ + --dataset-path demo_data/libero_demo \ + --embodiment-tag LIBERO_PANDA \ --traj-ids 0 1 2 \ - --inference-mode tensorrt \ - --trt_engine_path ./groot_n1d6_onnx/dit_model_bf16.trt + --inference-mode trt_full_pipeline \ + --trt-engine-path ./gr00t_trt_deployment/engines """ ############################################################################### @@ -202,7 +232,7 @@ def plot_trajectory_results( traj_id: int, state_keys: list[str], action_keys: list[str], - action_horizon: int, + execution_horizon: int, save_plot_path: str, ) -> None: """ @@ -215,7 +245,7 @@ def plot_trajectory_results( traj_id: Trajectory ID state_keys: List of state modality keys action_keys: List of action modality keys - action_horizon: Action horizon used for inference + execution_horizon: Number of predicted-chunk steps executed per inference save_plot_path: Path to save the plot """ actual_steps = len(gt_action_across_time) @@ -254,7 +284,7 @@ def plot_trajectory_results( ax.plot(pred_action_across_time[:, action_idx], label="pred action") # put a dot every ACTION_HORIZON - for j in range(0, actual_steps, action_horizon): + for j in range(0, actual_steps, execution_horizon): if j == 0: ax.plot( j, @@ -277,26 +307,6 @@ def plot_trajectory_results( plt.close() # Close the figure to free memory -def parse_observation_gr00t( - obs: dict[str, Any], modality_configs: dict[str, Any] -) -> dict[str, Any]: - new_obs = {} - for modality in ["video", "state", "language"]: - new_obs[modality] = {} - for key in modality_configs[modality].modality_keys: - if modality == "language": - parsed_key = key - else: - parsed_key = f"{modality}.{key}" - arr = obs[parsed_key] - # Add batch dimension - if isinstance(arr, str): - new_obs[modality][key] = [[arr]] - else: - new_obs[modality][key] = arr[None, :] - return new_obs - - def parse_action_gr00t(action: dict[str, Any]) -> dict[str, Any]: # Unbatch and add prefix return {f"action.{key}": action[key][0] for key in action} @@ -348,7 +358,7 @@ def run_single_trajectory( traj_id: int, embodiment_tag: EmbodimentTag, steps=300, - action_horizon=16, + execution_horizon=16, skip_timing_steps=1, ): """ @@ -398,7 +408,7 @@ def run_single_trajectory( modality_configs.pop("action") # Inference loop with async prefetching - num_inference_steps = len(range(0, actual_steps, action_horizon)) + num_inference_steps = len(range(0, actual_steps, execution_horizon)) logging.info(f"\nRunning {num_inference_steps} inference steps...") logging.info(f"(Skipping first {skip_timing_steps} step(s) for timing statistics)") logging.info("Using async prefetching: preparing step i+1 while GPU processes step i") @@ -408,7 +418,7 @@ def run_single_trajectory( executor = ThreadPoolExecutor(max_workers=1) # List of step counts to process - step_counts = list(range(0, actual_steps, action_horizon)) + step_counts = list(range(0, actual_steps, execution_horizon)) # Prefetch first observation future_obs = executor.submit( @@ -454,7 +464,7 @@ def run_single_trajectory( # Action processing action_chunk = parse_action_gr00t(_action_chunk) - for j in range(action_horizon): + for j in range(execution_horizon): # NOTE: concat_pred_action = action[f"action.{modality_keys[0]}"][j] # the np.atleast_1d is to ensure the action is a 1D array, handle where single value is returned concat_pred_action = np.concatenate( @@ -506,7 +516,7 @@ def evaluate_predictions( traj, traj_id, actual_steps, - action_horizon, + execution_horizon, save_plot_path=None, ): def extract_state_joints(traj: pd.DataFrame, columns: list[str]): @@ -544,7 +554,7 @@ def extract_state_joints(traj: pd.DataFrame, columns: list[str]): traj_id=traj_id, state_keys=state_keys, action_keys=action_keys, - action_horizon=action_horizon, + execution_horizon=execution_horizon, save_plot_path=save_plot_path or f"/tmp/stand_alone_inference/traj_{traj_id}.jpeg", ) @@ -555,6 +565,9 @@ def extract_state_joints(traj: pd.DataFrame, columns: list[str]): class ArgsConfig: """Configuration for evaluating a policy.""" + model_path: str + """Path to the model checkpoint (required).""" + host: str = "127.0.0.1" """Host to connect to.""" @@ -567,26 +580,21 @@ class ArgsConfig: traj_ids: list[int] = field(default_factory=lambda: [0]) """List of trajectory IDs to evaluate.""" - action_horizon: int = 16 - """Action horizon to evaluate.""" - - video_backend: Literal["decord", "torchvision_av", "torchcodec"] = "torchcodec" - """Video backend to use for various codec options. h264: decord or av: torchvision_av""" + execution_horizon: int = 16 + """How many steps of each predicted action chunk to execute before re-planning + (must be <= the model's predicted chunk length).""" - dataset_path: str = "demo_data/robot_sim.PickNPlace/" + dataset_path: str = "demo_data/droid_sample" """Path to the dataset.""" - embodiment_tag: EmbodimentTag = EmbodimentTag.GR1 + embodiment_tag: EmbodimentTag = EmbodimentTag.OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT """Embodiment tag to use.""" - model_path: str | None = None - """Path to the model checkpoint.""" + inference_mode: Literal["pytorch", "tensorrt", "trt_full_pipeline"] = "pytorch" + """Inference mode: 'pytorch' (default), 'tensorrt' (DiT-only TRT), or 'trt_full_pipeline' (all engines).""" - inference_mode: Literal["pytorch", "tensorrt"] = "pytorch" - """Inference mode: 'pytorch' (default) or 'tensorrt'.""" - - trt_engine_path: str = "./groot_n1d6_onnx/dit_model_bf16.trt" - """Path to TensorRT engine file (.trt). Used only when inference_mode='tensorrt'.""" + trt_engine_path: str = "./gr00t_trt_deployment/engines" + """Path to TensorRT engine file or directory. For 'tensorrt': single .trt file. For 'trt_full_pipeline': engine directory.""" denoising_steps: int = 4 """Number of denoising steps to use.""" @@ -614,7 +622,7 @@ def main(args: ArgsConfig): logging.info(f"Embodiment Tag: {args.embodiment_tag}") logging.info(f"Trajectories: {args.traj_ids}") logging.info(f"Steps per trajectory: {args.steps}") - logging.info(f"Action Horizon: {args.action_horizon}") + logging.info(f"Execution Horizon: {args.execution_horizon}") logging.info(f"Skip Timing Steps: {args.skip_timing_steps}") logging.info(f"Inference Mode: {args.inference_mode}") if args.inference_mode == "tensorrt": @@ -623,12 +631,15 @@ def main(args: ArgsConfig): set_seed(args.seed) logging.info("=" * 80) + if not torch.cuda.is_available(): + logging.error("CUDA is not available. This script requires a GPU. Exiting.") + sys.exit(1) + # Download model checkpoint local_model_path = args.model_path # Extract global_step and checkpoint directory name from checkpoint path global_step = None - assert local_model_path is not None, "Provide valid model_path for inference" if local_model_path: # Search for pattern "checkpoint-{number}" anywhere in the path match = re.search(r"checkpoint-(\d+)", local_model_path) @@ -649,29 +660,40 @@ def main(args: ArgsConfig): logging.info("=" * 80) model_load_start = time.time() - if local_model_path is not None: - policy = Gr00tPolicy( - embodiment_tag=args.embodiment_tag, - model_path=local_model_path, - device="cuda" if torch.cuda.is_available() else "cpu", - ) - - # Apply inference mode: TensorRT or PyTorch - if args.inference_mode == "tensorrt": - logging.info(f"Replacing DiT with TensorRT engine: {args.trt_engine_path}") - replace_dit_with_tensorrt(policy, args.trt_engine_path) - logging.info(" TensorRT mode enabled") - else: - # PyTorch mode with torch.compile - policy.model.action_head.model.forward = torch.compile( - policy.model.action_head.model.forward, mode="max-autotune" - ) - logging.info(" PyTorch mode enabled with torch.compile") - - if torch.cuda.is_available(): - torch.backends.cudnn.benchmark = True + policy = Gr00tPolicy( + embodiment_tag=args.embodiment_tag, + model_path=local_model_path, + device="cuda" if torch.cuda.is_available() else "cpu", + ) + # Apply --denoising-steps: the action head reads num_inference_timesteps at + # sampling time (honored by the PyTorch and TensorRT denoising loops alike). + policy.model.action_head.num_inference_timesteps = args.denoising_steps + logging.info(f"Using {args.denoising_steps} denoising steps") + + # Apply inference mode + if args.inference_mode == "trt_full_pipeline": + logging.info(f"Loading full-pipeline TRT engines from: {args.trt_engine_path}") + from trt_model_forward import setup_tensorrt_engines + + # This script runs one observation at a time (batch=1); fail fast if the + # engine was baked for a different static batch instead of hitting a cryptic + # "Invalid input shape" inside Engine.forward(). + resolve_batch_size(args.trt_engine_path, 1, source="standalone_inference_script") + setup_tensorrt_engines(policy, args.trt_engine_path, mode=InferenceMode.n17_full_pipeline) + logging.info(" TRT full-pipeline mode enabled") + elif args.inference_mode == "tensorrt": + logging.info(f"Replacing DiT with TensorRT engine: {args.trt_engine_path}") + dit_engine_path = args.trt_engine_path + if os.path.isdir(dit_engine_path): + dit_engine_path = os.path.join(dit_engine_path, "dit_bf16.engine") + resolve_batch_size(dit_engine_path, 1, source="standalone_inference_script") + replace_dit_with_tensorrt(policy, dit_engine_path) + logging.info(" TensorRT DiT-only mode enabled") else: - assert 0, "Please provide valid model_path argument for inference" + logging.info(" PyTorch mode enabled") + + if torch.cuda.is_available(): + torch.backends.cudnn.benchmark = True model_load_time = time.time() - model_load_start logging.info(f"Model loading time: {model_load_time:.4f} seconds") @@ -679,6 +701,13 @@ def main(args: ArgsConfig): modality = policy.get_modality_config() logging.info(f"Current modality config: \n{modality}") + model_action_horizon = len(modality["action"].delta_indices) + assert_exec_horizon_within_model( + exec_horizon=args.execution_horizon, + model_action_horizon=model_action_horizon, + source="standalone_inference_script", + ) + # Dataset creation logging.info("\n" + "=" * 80) logging.info("=== Step 2: Creating Dataset Loader ===") @@ -688,8 +717,6 @@ def main(args: ArgsConfig): dataset = LeRobotEpisodeLoader( dataset_path=args.dataset_path, modality_configs=modality, - video_backend=args.video_backend, - video_backend_kwargs=None, ) dataset_load_time = time.time() - dataset_load_start @@ -707,10 +734,13 @@ def main(args: ArgsConfig): all_mae = [] all_timings = [] pred_actions = [] + obs = None for traj_id in args.traj_ids: - if traj_id >= len(dataset): - logging.warning(f"Trajectory ID {traj_id} is out of range. Skipping.") + if traj_id < 0 or traj_id >= len(dataset): + logging.warning( + f"Trajectory ID {traj_id} is out of range. Dataset has {len(dataset)} trajectories (valid IDs: 0-{len(dataset) - 1}). Skipping." + ) continue logging.info(f"Running trajectory: {traj_id}") @@ -728,7 +758,7 @@ def main(args: ArgsConfig): traj_id, args.embodiment_tag, steps=args.steps, - action_horizon=args.action_horizon, + execution_horizon=args.execution_horizon, skip_timing_steps=args.skip_timing_steps, ) pred_actions.append(pred_action_across_time) @@ -741,8 +771,8 @@ def main(args: ArgsConfig): traj, traj_id, actual_steps, - args.action_horizon, - save_plot_path=None, + args.execution_horizon, + save_plot_path=args.save_plot_path, ) logging.info(f"MSE for trajectory {traj_id}: {mse}, MAE: {mae}") @@ -786,24 +816,38 @@ def main(args: ArgsConfig): logging.info( f" Total episode loading: {total_episode_load:.4f}s (avg: {total_episode_load / len(all_timings):.4f}s)" ) - logging.info( - f" Total data preparation: {total_data_prep:.4f}s (avg: {total_data_prep / total_inference_steps:.4f}s per step)" - ) - logging.info( - f" Total inference: {total_inference:.4f}s (avg: {total_inference / total_inference_steps:.4f}s per step)" - ) + if total_inference_steps > 0: + logging.info( + f" Total data preparation: {total_data_prep:.4f}s (avg: {total_data_prep / total_inference_steps:.4f}s per step)" + ) + logging.info( + f" Total inference: {total_inference:.4f}s (avg: {total_inference / total_inference_steps:.4f}s per step)" + ) + else: + logging.info( + f" Total data preparation: {total_data_prep:.4f}s (no timed steps)" + ) + logging.info( + f" Total inference: {total_inference:.4f}s (no timed steps)" + ) logging.info("\nInference Statistics:") logging.info(f" Total inference steps: {total_inference_steps}") - logging.info( - f" Avg inference time per step: {total_inference / total_inference_steps:.4f}s" - ) + if total_inference_steps > 0: + logging.info( + f" Avg inference time per step: {total_inference / total_inference_steps:.4f}s" + ) + all_inf_times = [t for timing in all_timings for t in timing["inference_times"]] + logging.info(f" Min inference time: {min(all_inf_times):.4f}s") + logging.info(f" Max inference time: {max(all_inf_times):.4f}s") + logging.info( + f" P90 inference time: {np.percentile(all_inf_times, 90):.4f}s" + ) - # Collect all inference times for min/max/p90 - all_inf_times = [t for timing in all_timings for t in timing["inference_times"]] - logging.info(f" Min inference time: {min(all_inf_times):.4f}s") - logging.info(f" Max inference time: {max(all_inf_times):.4f}s") - logging.info(f" P90 inference time: {np.percentile(all_inf_times, 90):.4f}s") + if len(pred_actions) == 0: + raise ValueError( + f"No valid trajectories to process. Requested IDs {args.traj_ids} are all out of range (dataset has {len(dataset)} trajectories, valid IDs: 0-{len(dataset) - 1})." + ) logging.info("=" * 80) logging.info("Done") @@ -811,6 +855,8 @@ def main(args: ArgsConfig): if __name__ == "__main__": + if migrate_deprecated_action_horizon_argv(): + logging.warning("--action-horizon is deprecated; use --execution-horizon.") # Parse arguments using tyro config = tyro.cli(ArgsConfig) main(config) diff --git a/scripts/deployment/thor b/scripts/deployment/thor new file mode 120000 index 000000000..734b32a68 --- /dev/null +++ b/scripts/deployment/thor @@ -0,0 +1 @@ +jetson \ No newline at end of file diff --git a/scripts/deployment/trt_model_forward.py b/scripts/deployment/trt_model_forward.py new file mode 100644 index 000000000..5b0906a13 --- /dev/null +++ b/scripts/deployment/trt_model_forward.py @@ -0,0 +1,1000 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +# +# 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. + +"""TensorRT forward functions for GR00T N1.7 inference. + +This module provides TRT-accelerated forward functions that replace the +PyTorch backbone and action head during inference. + +Architecture (n17_full_pipeline mode): + Backbone: ViT (TRT) → embed_tokens + masked_scatter + get_rope_index (PyTorch) + → LLM (TRT, with deepstack injection) + Action Head: VLLN (PyTorch) → State Encoder (TRT) → denoising loop: + [ Action Encoder (TRT) → DiT (TRT) → Action Decoder (TRT) ] + +Architecture (vit_llm_only mode): + Backbone: ViT (TRT) → embed_tokens + masked_scatter + get_rope_index (PyTorch) + → LLM (TRT, with deepstack injection) + Action Head: stays in PyTorch + Use when DiT cannot be exported with dynamic vl_seq_len (e.g. torch 2.10 / sm121). + +Architecture (action_head mode): + Backbone: stays in PyTorch (Qwen3-VL) + Action Head: VLLN (PyTorch) → State Encoder (TRT) → denoising loop: + [ Action Encoder (TRT) → DiT (TRT) → Action Decoder (TRT) ] +""" + +from contextlib import contextmanager +from functools import partial +import logging +import os +import sys + +from gr00t.deployment.modes import InferenceMode +import torch +from transformers.feature_extraction_utils import BatchFeature + + +logger = logging.getLogger(__name__) + + +# Ensure sibling modules are importable (scripts/deployment is not a package) +_deploy_dir = os.path.dirname(os.path.abspath(__file__)) +if _deploy_dir not in sys.path: + sys.path.insert(0, _deploy_dir) +from _trt_contract import ( # noqa: E402 + assert_engine_bundle_present, + assert_engine_matches_policy, + assert_grid_thw_matches, +) +from trt_torch import Engine # noqa: E402 + + +def _assert_supports_trt_padding_strip(attention_mask: torch.Tensor) -> None: + """Hard-fail if the TRT padding-strip path would silently corrupt B>1 batches. + + transformers 4.57+ strips padding tokens before calling ``language_model``. + The TRT forward path replicates that with ``valid_mask = attention_mask[0] == 1`` + so engine inputs match export-time captured shapes. With B=1 (or B>1 where + every sample has the same mask, e.g. tiled benchmarking via + ``verify_n1d7_trt.py --batch_size N``) this is correct. With B>1 *and* + heterogeneous masks (different valid lengths per sample), samples 1..B-1 + would be silently mis-stripped using sample 0's padding template, producing + wrong inputs to the LLM TRT engine — no error, no warning, just degraded + output that's caught only via downstream eval drift. + + Raise rather than warn so the caller can't miss it in the multi-rank log + torrent. To support heterogeneous B>1, switch to the all-batch + common-padding mask ``(attention_mask == 1).all(dim=0)`` (only strips + columns padded across *all* samples) — that is a semantic change requiring + modeling sign-off, so we hard-fail here for now. + + Note on the build-time batch coupling: the ONNX export pipeline + (``scripts/deployment/export_onnx_n1d7.py``) bakes the batch dim as a + static shape — only ``seq_len`` is registered in ``dynamic_axes`` — + so a TRT engine built at ``--batch-size N`` only accepts B=N at + runtime. Lifting heterogeneous B>1 inference therefore requires both + rebuilding the engine at that batch size *and* relaxing this + assertion. Production today is B=1; this check covers the runtime + half of that contract. + """ + if attention_mask.shape[0] <= 1: + return + if not (attention_mask == attention_mask[0:1]).all(): + raise ValueError( + "TRT backbone padding-strip requires B=1 or homogeneous attention " + f"masks across the batch (got B={attention_mask.shape[0]} with " + "heterogeneous masks). attention_mask[0] would silently mis-strip " + "samples 1..B-1 using sample 0's padding template, producing wrong " + "inputs to the LLM TRT engine. Switch to " + "(attention_mask == 1).all(dim=0) to only strip columns padded " + "across all samples — but that is a semantic change requiring " + "modeling sign-off." + ) + + +def _resolve_vit_engine_path(trt_engine_path: str) -> str: + """Locate the ViT engine, tolerating the legacy filename. + + Older builds emitted ``vit_bf16.engine`` even when the source ONNX + was FP32 — a name that obscured the actual engine precision. New + builds emit ``vit.engine`` (precision-neutral; the real dtype lives + in ``export_metadata.json`` and the ONNX tensor types). Existing + engine directories with the legacy name are still accepted with a + warning emitted on each call (no per-process suppression: the + warning content is path-dependent and call sites are few), to + encourage migration to the precision-neutral name. When no engine + is present we return the canonical name so the caller can put it + in any "not found" error. + """ + new = os.path.join(trt_engine_path, "vit.engine") + legacy = os.path.join(trt_engine_path, "vit_bf16.engine") + if os.path.exists(new): + return new + if os.path.exists(legacy): + logger.warning( + f"Loading ViT engine from legacy path {legacy}; new builds " + f"emit vit.engine. Rebuild the pipeline to drop the misleading " + f"precision tag from the filename." + ) + return legacy + return new + + +# ============================================================ +# N1.7 Backbone TRT Forward (ViT TRT + LLM TRT) +# ============================================================ + + +def _qwen3_vit_and_scatter(self, vl_input): + """Shared logic: ViT TRT + embed_tokens + scatter + get_rope_index. + + Returns all inputs needed by either PyTorch LLM or LLM TRT engine. + These ops stay in PyTorch because they involve dynamic Python logic + (get_rope_index, masked_scatter, get_placeholder_mask). + """ + qwen_model = self.model # Qwen3VLForConditionalGeneration + inner_model = qwen_model.model # Qwen3VLModel + + pixel_values = vl_input["pixel_values"] + grid_thw = vl_input["image_grid_thw"] + engine_dtype = torch.bfloat16 + + # The ViT engine baked pos/rotary buffers for the export-time grid; a + # different runtime grid would silently corrupt vision features. + assert_grid_thw_matches( + getattr(self, "_vit_baked_grid_thw", None), grid_thw, source="ViT TRT forward" + ) + + # --- ViT TRT Engine --- + # Detect ViT engine dtype (FP32 for accuracy or BF16 for speed) + vit_dtype = self.vit_engine.dtype_of("pixel_values") + if isinstance(pixel_values, (list, tuple)): + pv = torch.cat(pixel_values, dim=0) + else: + pv = pixel_values + if pv.dtype != vit_dtype: + pv = pv.to(vit_dtype) + + self.vit_engine.set_runtime_tensor_shape("pixel_values", pv.shape) + vit_result = self.vit_engine(pv) + image_embeds = vit_result["image_embeds"] + deepstack_features = vit_result.get("deepstack_features") + + # Unpack deepstack: [num_layers, N, D] → list of [N, D] + deepstack_list = [] + if deepstack_features is not None and deepstack_features.numel() > 1: + deepstack_list = list(deepstack_features.unbind(0)) + + # --- PyTorch: embed_tokens + scatter --- + input_ids = vl_input["input_ids"] + inputs_embeds = self._embedding_layer(input_ids) + + if inputs_embeds.dtype != engine_dtype: + inputs_embeds = inputs_embeds.to(engine_dtype) + if image_embeds.dtype != engine_dtype: + image_embeds = image_embeds.to(engine_dtype) + + image_embeds_cat = torch.cat([image_embeds], dim=0) + image_mask, _ = inner_model.get_placeholder_mask( + input_ids, inputs_embeds=inputs_embeds, image_features=image_embeds_cat + ) + inputs_embeds = inputs_embeds.masked_scatter(image_mask, image_embeds_cat) + + visual_pos_masks = image_mask[..., 0] if image_mask is not None else None + + # Compute 3D position IDs (stays in PyTorch — complex Python logic) + attention_mask = vl_input["attention_mask"] + position_ids, rope_deltas = inner_model.get_rope_index( + input_ids, grid_thw, video_grid_thw=None, attention_mask=attention_mask + ) + inner_model.rope_deltas = rope_deltas + + image_mask_out = input_ids == self._image_token_id + backbone_attention_mask = attention_mask == 1 + + # transformers 4.57+ strips padding tokens before calling language_model internally. + # Apply the same stripping so TRT engine inputs match export-time captured shapes. + _assert_supports_trt_padding_strip(attention_mask) + valid_mask = attention_mask[0] == 1 # [full_seq_len] + if not valid_mask.all(): + inputs_embeds = inputs_embeds[:, valid_mask, :] + attention_mask = attention_mask[:, valid_mask] + position_ids = position_ids[:, :, valid_mask] + if visual_pos_masks is not None: + visual_pos_masks = visual_pos_masks[:, valid_mask] + image_mask_out = image_mask_out[:, valid_mask] + backbone_attention_mask = backbone_attention_mask[:, valid_mask] + + return { + "inputs_embeds": inputs_embeds, + "attention_mask": attention_mask, + "position_ids": position_ids, + "visual_pos_masks": visual_pos_masks, + "deepstack_list": deepstack_list, + "image_mask_out": image_mask_out, + "backbone_attention_mask": backbone_attention_mask, + } + + +def qwen3_backbone_tensorrt_forward(self, vl_input): + """Replace Qwen3Backbone.forward() with ViT TRT + PyTorch LLM. + + ViT is replaced with a TRT engine. The LLM stays in PyTorch. + Used when LLM TRT engine is not available. + + Args: + self: Qwen3Backbone instance (monkey-patched) + vl_input: BatchFeature with keys: input_ids, attention_mask, pixel_values, image_grid_thw + """ + self.set_frozen_modules_to_eval_mode() + + keys_to_use = ["input_ids", "attention_mask", "pixel_values", "image_grid_thw"] + vl_input = {k: vl_input[k] for k in keys_to_use} + + prepared = _qwen3_vit_and_scatter(self, vl_input) + + qwen_model = self.model + inner_model = qwen_model.model + + # LLM forward (PyTorch) + outputs = inner_model.language_model( + input_ids=None, + position_ids=prepared["position_ids"], + attention_mask=prepared["attention_mask"], + inputs_embeds=prepared["inputs_embeds"], + visual_pos_masks=prepared["visual_pos_masks"], + deepstack_visual_embeds=prepared["deepstack_list"] or None, + output_hidden_states=True, + ) + + return BatchFeature( + data={ + "backbone_features": outputs.last_hidden_state, + "backbone_attention_mask": prepared["backbone_attention_mask"], + "image_mask": prepared["image_mask_out"], + } + ) + + +def qwen3_backbone_llm_trt_forward(self, vl_input): + """Replace Qwen3Backbone.forward() with PyTorch ViT + LLM TRT. + + ViT stays in PyTorch. LLM is replaced with a TRT engine. + Used when ViT TRT has accuracy issues but LLM TRT is accurate. + """ + self.set_frozen_modules_to_eval_mode() + + keys_to_use = ["input_ids", "attention_mask", "pixel_values", "image_grid_thw"] + vl_input = {k: vl_input[k] for k in keys_to_use} + + # Run PyTorch ViT + scatter + rope (original backbone logic up to LLM) + qwen_model = self.model + inner_model = qwen_model.model + + # ViT forward (PyTorch — kept for accuracy) + pixel_values = vl_input["pixel_values"] + grid_thw = vl_input["image_grid_thw"] + image_embeds_split, deepstack_image_embeds = inner_model.get_image_features( + pixel_values, grid_thw + ) + # get_image_features returns a tuple of per-image tensors; concat for scatter + image_embeds = torch.cat(list(image_embeds_split), dim=0) + + # Scatter image embeddings into text embeddings + input_ids = vl_input["input_ids"] + inputs_embeds = qwen_model.get_input_embeddings()(input_ids) + image_mask, _ = inner_model.get_placeholder_mask( + input_ids, inputs_embeds=inputs_embeds, image_features=image_embeds + ) + inputs_embeds = inputs_embeds.masked_scatter(image_mask, image_embeds) + + visual_pos_masks = image_mask[..., 0] if image_mask is not None else None + deepstack_list = list(deepstack_image_embeds) if deepstack_image_embeds else [] + + # Compute position IDs + attention_mask = vl_input["attention_mask"] + position_ids, rope_deltas = inner_model.get_rope_index( + input_ids, grid_thw, video_grid_thw=None, attention_mask=attention_mask + ) + inner_model.rope_deltas = rope_deltas + + image_mask_out = input_ids == qwen_model.config.image_token_id + backbone_attention_mask = attention_mask == 1 + + # Strip padding tokens (transformers 4.57+) + _assert_supports_trt_padding_strip(attention_mask) + valid_mask = attention_mask[0] == 1 + if not valid_mask.all(): + inputs_embeds = inputs_embeds[:, valid_mask, :] + attention_mask = attention_mask[:, valid_mask] + position_ids = position_ids[:, :, valid_mask] + if visual_pos_masks is not None: + visual_pos_masks = visual_pos_masks[:, valid_mask] + image_mask_out = image_mask_out[:, valid_mask] + backbone_attention_mask = backbone_attention_mask[:, valid_mask] + + # LLM forward (TRT) + llm_float_dtype = self.llm_engine.dtype_of("inputs_embeds") + + if inputs_embeds.dtype != llm_float_dtype: + inputs_embeds = inputs_embeds.to(llm_float_dtype) + if attention_mask.dtype != torch.int64: + attention_mask = attention_mask.to(torch.int64) + if position_ids.dtype != torch.int64: + position_ids = position_ids.to(torch.int64) + + self.llm_engine.set_runtime_tensor_shape("inputs_embeds", inputs_embeds.shape) + self.llm_engine.set_runtime_tensor_shape("attention_mask", attention_mask.shape) + self.llm_engine.set_runtime_tensor_shape("position_ids", position_ids.shape) + + llm_kwargs = {} + if visual_pos_masks is not None and deepstack_list: + self.llm_engine.set_runtime_tensor_shape("visual_pos_masks", visual_pos_masks.shape) + llm_kwargs["visual_pos_masks"] = visual_pos_masks + for i, ds in enumerate(deepstack_list): + name = f"deepstack_{i}" + if ds.dtype != llm_float_dtype: + ds = ds.to(llm_float_dtype) + self.llm_engine.set_runtime_tensor_shape(name, ds.shape) + llm_kwargs[name] = ds + + backbone_features = self.llm_engine(inputs_embeds, attention_mask, position_ids, **llm_kwargs)[ + "embeddings" + ] + + if backbone_features.dtype != torch.bfloat16: + backbone_features = backbone_features.to(torch.bfloat16) + + return BatchFeature( + data={ + "backbone_features": backbone_features, + "backbone_attention_mask": backbone_attention_mask, + "image_mask": image_mask_out, + } + ) + + +def qwen3_backbone_full_trt_forward(self, vl_input): + """Replace Qwen3Backbone.forward() with ViT TRT + LLM TRT. + + Both ViT and LLM are replaced with TRT engines. + PyTorch ops kept: embed_tokens, masked_scatter, get_rope_index (lightweight). + + Args: + self: Qwen3Backbone instance (monkey-patched) + vl_input: BatchFeature with keys: input_ids, attention_mask, pixel_values, image_grid_thw + """ + self.set_frozen_modules_to_eval_mode() + + keys_to_use = ["input_ids", "attention_mask", "pixel_values", "image_grid_thw"] + vl_input = {k: vl_input[k] for k in keys_to_use} + + prepared = _qwen3_vit_and_scatter(self, vl_input) + + inputs_embeds = prepared["inputs_embeds"] + attention_mask = prepared["attention_mask"] + position_ids = prepared["position_ids"] + + # Detect LLM engine's expected float dtype from its first input binding. + # Handles both BF16 engines (default) and FP32 engines gracefully. + llm_float_dtype = self.llm_engine.dtype_of("inputs_embeds") + + if inputs_embeds.dtype != llm_float_dtype: + inputs_embeds = inputs_embeds.to(llm_float_dtype) + if attention_mask.dtype != torch.int64: + attention_mask = attention_mask.to(torch.int64) + if position_ids.dtype != torch.int64: + position_ids = position_ids.to(torch.int64) + + # Set LLM engine input shapes + self.llm_engine.set_runtime_tensor_shape("inputs_embeds", inputs_embeds.shape) + self.llm_engine.set_runtime_tensor_shape("attention_mask", attention_mask.shape) + self.llm_engine.set_runtime_tensor_shape("position_ids", position_ids.shape) + + llm_kwargs = {} + + # Visual pos masks and deepstack features + visual_pos_masks = prepared["visual_pos_masks"] + deepstack_list = prepared["deepstack_list"] + + if visual_pos_masks is not None and deepstack_list: + self.llm_engine.set_runtime_tensor_shape("visual_pos_masks", visual_pos_masks.shape) + llm_kwargs["visual_pos_masks"] = visual_pos_masks + + for i, ds in enumerate(deepstack_list): + name = f"deepstack_{i}" + if ds.dtype != llm_float_dtype: + ds = ds.to(llm_float_dtype) + self.llm_engine.set_runtime_tensor_shape(name, ds.shape) + llm_kwargs[name] = ds + + backbone_features = self.llm_engine(inputs_embeds, attention_mask, position_ids, **llm_kwargs)[ + "embeddings" + ] + + # Cast LLM output back to BF16 — downstream (vl_self_attention, DiT) expect BF16. + if backbone_features.dtype != torch.bfloat16: + backbone_features = backbone_features.to(torch.bfloat16) + + return BatchFeature( + data={ + "backbone_features": backbone_features, + "backbone_attention_mask": prepared["backbone_attention_mask"], + "image_mask": prepared["image_mask_out"], + } + ) + + +# ============================================================ +# Action Head TRT Forward +# ============================================================ + + +def action_head_tensorrt_forward(self, backbone_output, action_input, options=None): + """Replace ActionHead.get_action() with TRT-accelerated inference. + VLLN (LayerNorm) stays in PyTorch. State Encoder, Action Encoder, + DiT, and Action Decoder are replaced with TRT engines. + + N1.7 change: state is reshaped from [B, state_history_length, max_state_dim] + to [B, 1, state_history_length * max_state_dim] before the state encoder. + + Args: + self: ActionHead instance (monkey-patched) + backbone_output: BatchFeature with backbone_features, backbone_attention_mask, image_mask + action_input: BatchFeature with state, embodiment_id + """ + # --- VLLN (PyTorch) + vl_self_attention (TRT if available, else PyTorch) --- + backbone_features = backbone_output.backbone_features + backbone_features = self.vlln(backbone_features) + if hasattr(self, "vl_sa_engine") and self.vl_sa_engine is not None: + engine_dtype = torch.bfloat16 + if backbone_features.dtype != engine_dtype: + backbone_features = backbone_features.to(engine_dtype) + self.vl_sa_engine.set_runtime_tensor_shape("hidden_states", backbone_features.shape) + backbone_features = self.vl_sa_engine(backbone_features)["output"] + else: + backbone_features = self.vl_self_attention(backbone_features) + vl_embs = backbone_features + + embodiment_id = action_input.embodiment_id + batch_size = vl_embs.shape[0] + device = vl_embs.device + + engine_dtype = torch.bfloat16 + + # Ensure consistent dtypes + if vl_embs.dtype != engine_dtype: + vl_embs = vl_embs.to(engine_dtype) + if action_input.state.dtype != engine_dtype: + action_input.state = action_input.state.to(engine_dtype) + if embodiment_id.dtype != torch.int64: + embodiment_id = embodiment_id.to(torch.int64) + + # --- State history reshape (N1.7) --- + # N1.7: state comes as [B, state_history_length, max_state_dim] + # Flatten to [B, 1, state_history_length * max_state_dim] for the encoder + state = action_input.state + if state.ndim == 3 and state.shape[1] > 1: + state = state.view(state.shape[0], 1, -1) + elif state.ndim == 3 and state.shape[1] == 1: + # Already [B, 1, dim] — state_history_length=1 + pass + else: + # Unexpected shape, pass through + logger.warning(f"Unexpected state shape: {state.shape}") + + # --- State Encoder TRT --- + self.state_encoder_engine.set_runtime_tensor_shape("state", state.shape) + self.state_encoder_engine.set_runtime_tensor_shape("embodiment_id", embodiment_id.shape) + state_features = self.state_encoder_engine(state, embodiment_id)["output"] + + # --- Initialize actions as random noise --- + if hasattr(self, "init_actions"): + actions = self.init_actions.expand((batch_size, -1, -1)) + else: + actions = torch.randn( + size=(batch_size, self.config.action_horizon, self.action_dim), + dtype=engine_dtype, + device=device, + ) + + num_steps = self.num_inference_timesteps + dt = 1.0 / num_steps + + # --- Denoising loop --- + for t in range(num_steps): + t_cont = t / float(num_steps) + t_discretized = int(t_cont * self.num_timestep_buckets) + + timesteps_tensor = torch.full( + size=(batch_size,), fill_value=t_discretized, device=device, dtype=torch.int64 + ) + + # Action Encoder TRT + self.action_encoder_engine.set_runtime_tensor_shape("actions", actions.shape) + self.action_encoder_engine.set_runtime_tensor_shape("timesteps", timesteps_tensor.shape) + self.action_encoder_engine.set_runtime_tensor_shape("embodiment_id", embodiment_id.shape) + action_features = self.action_encoder_engine( + actions.to(engine_dtype), timesteps_tensor, embodiment_id + )["output"] + + # Maybe add position embedding (stays in PyTorch) + if self.config.add_pos_embed: + pos_ids = torch.arange(action_features.shape[1], dtype=torch.long, device=device) + pos_embs = self.position_embedding(pos_ids).unsqueeze(0).to(engine_dtype) + action_features = action_features + pos_embs + + # Concatenate state + action embeddings + sa_embs = torch.cat((state_features, action_features), dim=1).to(engine_dtype) + + # DiT TRT + self.dit_engine.set_runtime_tensor_shape("sa_embs", sa_embs.shape) + self.dit_engine.set_runtime_tensor_shape("vl_embs", vl_embs.shape) + self.dit_engine.set_runtime_tensor_shape("timestep", timesteps_tensor.shape) + + dit_kwargs = {} + if hasattr(backbone_output, "image_mask") and backbone_output.image_mask is not None: + image_mask = backbone_output.image_mask + self.dit_engine.set_runtime_tensor_shape("image_mask", image_mask.shape) + dit_kwargs["image_mask"] = image_mask + + if ( + hasattr(backbone_output, "backbone_attention_mask") + and backbone_output.backbone_attention_mask is not None + ): + bb_mask = backbone_output.backbone_attention_mask + self.dit_engine.set_runtime_tensor_shape("backbone_attention_mask", bb_mask.shape) + dit_kwargs["backbone_attention_mask"] = bb_mask + + model_output = self.dit_engine(sa_embs, vl_embs, timesteps_tensor, **dit_kwargs)["output"] + + # Action Decoder TRT + self.action_decoder_engine.set_runtime_tensor_shape("model_output", model_output.shape) + self.action_decoder_engine.set_runtime_tensor_shape("embodiment_id", embodiment_id.shape) + pred = self.action_decoder_engine(model_output, embodiment_id)["output"] + pred_velocity = pred[:, -self.action_horizon :] + + # Euler integration + actions = actions + dt * pred_velocity + + return BatchFeature(data={"action_pred": actions}) + + +# ============================================================ +# Engine Setup +# ============================================================ + + +# Engines each mode swaps in with no PyTorch fallback: their absence must fail +# fast with a build hint rather than a bare FileNotFoundError from Engine.load. +_ACTION_HEAD_ENGINES = ( + "state_encoder.engine", + "action_encoder.engine", + "dit_bf16.engine", + "action_decoder.engine", +) +_MANDATORY_ENGINES = { + InferenceMode.n17_full_pipeline: _ACTION_HEAD_ENGINES, + InferenceMode.action_head: _ACTION_HEAD_ENGINES, +} + + +def setup_tensorrt_engines(policy, trt_engine_path, mode=InferenceMode.n17_full_pipeline): + """Load TRT engines, delete PyTorch modules, and monkey-patch forward methods. + + Args: + policy: Gr00tPolicy instance + trt_engine_path: Path to directory containing TRT engine files + mode: an :class:`~gr00t.deployment.modes.InferenceMode` (or its string + value) selecting which engine subset to swap in. Invalid values raise. + """ + mode = InferenceMode(mode) + required = _MANDATORY_ENGINES.get(mode) + if required is not None: + assert_engine_bundle_present( + trt_engine_path, + required, + mode=mode.value, + source=f"setup_tensorrt_engines({mode})", + ) + _meta = assert_engine_matches_policy( + policy, trt_engine_path, source=f"setup_tensorrt_engines({mode})" + ) + + # Stash the ViT engine's baked grid_thw so the runtime ViT path can reject a + # mismatched image config. None for older bundles (no recorded grid). + policy.model.backbone._vit_baked_grid_thw = _meta.get("vit_grid_thw") if _meta else None + + _INFERENCE_MODE_DISPATCH[mode](policy, trt_engine_path) + + +def close_tensorrt_engines(policy): + """Release every TRT ``Engine`` attached to ``policy`` (best-effort). + + setup_tensorrt_engines stashes engines as plain attributes on the backbone + and action head (which subset depends on the mode), so walk the model's + submodules and close each. Needed because the sim-eval entrypoint hard-exits + via os._exit, which skips ``Engine.__del__`` and would otherwise leak GPU + memory into the next eval shard. + """ + # The sim wrapper exposes the inner Gr00tPolicy as ``.policy``; a remote + # PolicyClient has no model and no engines to close. + model = getattr(getattr(policy, "policy", policy), "model", None) + if model is None: + return + closed = set() + for module in model.modules(): + # Snapshot the attribute values: close() runs C++ destructors, so avoid + # iterating a live __dict__ view. + for value in list(vars(module).values()): + if isinstance(value, Engine) and id(value) not in closed: + closed.add(id(value)) + try: + value.close() + except Exception as e: + print(f"Failed to close TRT engine: {e}") + + +@contextmanager +def closing_tensorrt_engines(policy): + """``with`` form of :func:`close_tensorrt_engines`, scoped to ``policy``. + + Closes only the engines attached to ``policy`` on block exit (including the + exception path), so it never touches engines owned by another live policy. + """ + try: + yield policy + finally: + close_tensorrt_engines(policy) + + +def _setup_n17_full_pipeline(policy, trt_engine_path): + """Set up TRT engines for N1.7: ViT TRT + LLM TRT + Action Head TRT. + + The Qwen3-VL backbone's vision encoder and text model are both replaced + with TRT engines. PyTorch ops kept: embed_tokens, masked_scatter, + get_rope_index (lightweight, <1ms). + + Falls back to PyTorch LLM if llm_bf16.engine is not found. + """ + backbone = policy.model.backbone + qwen_model = backbone.model # Qwen3VLForConditionalGeneration + action_head = policy.model.action_head + + # --- Backbone setup --- + # Save references needed by the TRT forward + backbone._embedding_layer = qwen_model.model.language_model.get_input_embeddings() + backbone._image_token_id = qwen_model.config.image_token_id + + # Load ViT TRT engine (optional — PyTorch ViT used as fallback for accuracy) + vit_engine_path = _resolve_vit_engine_path(trt_engine_path) + use_vit_trt = os.path.exists(vit_engine_path) + if use_vit_trt: + print(f"Loading ViT engine: {vit_engine_path}") + backbone.vit_engine = Engine(vit_engine_path) + del qwen_model.model.visual + torch.cuda.empty_cache() + print(" Deleted PyTorch ViT (replaced by TRT engine)") + else: + backbone.vit_engine = None + print(f" ViT engine not found at {vit_engine_path}, keeping PyTorch ViT") + + # Load LLM TRT engine (if available) + llm_engine_path = os.path.join(trt_engine_path, "llm_bf16.engine") + use_llm_trt = os.path.exists(llm_engine_path) + + if use_llm_trt: + print(f"Loading LLM engine: {llm_engine_path}") + backbone.llm_engine = Engine(llm_engine_path) + + # Delete PyTorch LLM layers to free GPU memory + # Keep embed_tokens (needed for token embedding before TRT) + # Keep get_rope_index via inner_model (needed for position IDs) + del qwen_model.model.language_model.layers + del qwen_model.model.language_model.norm + torch.cuda.empty_cache() + print(" Deleted PyTorch LLM layers (replaced by TRT engine)") + else: + backbone.llm_engine = None + print(f" LLM engine not found at {llm_engine_path}, using PyTorch LLM") + + # Monkey-patch backbone forward + if use_vit_trt and use_llm_trt: + backbone.forward = partial(qwen3_backbone_full_trt_forward, backbone) + elif use_vit_trt and not use_llm_trt: + backbone.forward = partial(qwen3_backbone_tensorrt_forward, backbone) + elif not use_vit_trt and use_llm_trt: + # PyTorch ViT + LLM TRT (best accuracy when ViT TRT has issues) + backbone.forward = partial(qwen3_backbone_llm_trt_forward, backbone) + else: + print(" No backbone TRT engines loaded, backbone remains in PyTorch") + + # --- Action head setup --- + # Load vl_self_attention TRT engine (if available) + vl_sa_engine_path = os.path.join(trt_engine_path, "vl_self_attention.engine") + if os.path.exists(vl_sa_engine_path): + print(f"Loading VL Self-Attention engine: {vl_sa_engine_path}") + action_head.vl_sa_engine = Engine(vl_sa_engine_path) + # Delete PyTorch module — TRT engine replaces it + if hasattr(action_head, "vl_self_attention"): + del action_head.vl_self_attention + torch.cuda.empty_cache() + print(" Deleted PyTorch vl_self_attention (replaced by TRT engine)") + else: + action_head.vl_sa_engine = None + print(f" VL Self-Attention engine not found at {vl_sa_engine_path}, using PyTorch") + + if hasattr(action_head, "model"): + del action_head.model + if hasattr(action_head, "state_encoder"): + del action_head.state_encoder + if hasattr(action_head, "action_encoder"): + del action_head.action_encoder + if hasattr(action_head, "action_decoder"): + del action_head.action_decoder + torch.cuda.empty_cache() + + assert action_head.action_dim == action_head.config.max_action_dim + + print(f"Loading action head engines from: {trt_engine_path}") + action_head.state_encoder_engine = Engine(os.path.join(trt_engine_path, "state_encoder.engine")) + action_head.action_encoder_engine = Engine( + os.path.join(trt_engine_path, "action_encoder.engine") + ) + action_head.dit_engine = Engine(os.path.join(trt_engine_path, "dit_bf16.engine")) + action_head.action_decoder_engine = Engine( + os.path.join(trt_engine_path, "action_decoder.engine") + ) + + action_head.get_action = partial(action_head_tensorrt_forward, action_head) + + llm_status = "TRT" if use_llm_trt else "PyTorch" + vit_status = "TRT" if backbone.vit_engine else "PyTorch" + print("N1.7 full-pipeline TRT engines loaded.") + print(f" ViT: {vit_status} | LLM: {llm_status} | Action Head: TRT") + + +def _setup_vit_llm_only(policy, trt_engine_path): + """Set up TRT engines for ViT + LLM only; action head stays in PyTorch. + + Use this on platforms where DiT cannot be exported with dynamic vl_seq_len + (e.g. DGX Spark / torch 2.10 dynamo exporter bakes seq_len as static). + The backbone (ViT TRT + LLM TRT) still gets TRT acceleration; the PyTorch + action head receives the LLM embeddings at the actual runtime seq_len + without any shape constraint. + """ + backbone = policy.model.backbone + qwen_model = backbone.model # Qwen3VLForConditionalGeneration + + # Save references needed by the TRT forward + backbone._embedding_layer = qwen_model.model.language_model.get_input_embeddings() + backbone._image_token_id = qwen_model.config.image_token_id + + # Load ViT TRT engine + vit_engine_path = _resolve_vit_engine_path(trt_engine_path) + if not os.path.exists(vit_engine_path): + raise FileNotFoundError( + f"ViT TRT engine not found: {vit_engine_path}\n" + f"Run export_onnx_n1d7.py + build_tensorrt_engine.py first." + ) + print(f"Loading ViT engine: {vit_engine_path}") + backbone.vit_engine = Engine(vit_engine_path) + del qwen_model.model.visual + torch.cuda.empty_cache() + print(" Deleted PyTorch ViT (replaced by TRT engine)") + + # Load LLM TRT engine + llm_engine_path = os.path.join(trt_engine_path, "llm_bf16.engine") + if not os.path.exists(llm_engine_path): + raise FileNotFoundError( + f"LLM TRT engine not found: {llm_engine_path}\n" + f"Run export_onnx_n1d7.py + build_tensorrt_engine.py first." + ) + print(f"Loading LLM engine: {llm_engine_path}") + backbone.llm_engine = Engine(llm_engine_path) + del qwen_model.model.language_model.layers + del qwen_model.model.language_model.norm + torch.cuda.empty_cache() + print(" Deleted PyTorch LLM layers (replaced by TRT engine)") + + # Patch backbone forward to use ViT TRT + LLM TRT + backbone.forward = partial(qwen3_backbone_full_trt_forward, backbone) + + print("vit_llm_only TRT engines loaded.") + print(" ViT: TRT | LLM: TRT | Action Head: PyTorch") + + +def _setup_action_head(policy, trt_engine_path): + """Set up TRT engines for action head only (N1.7 mode). + + Backbone (Qwen3-VL) stays in PyTorch. Only the 4 action head components + (State Encoder, Action Encoder, DiT, Action Decoder) are replaced with + TRT engines. + """ + action_head = policy.model.action_head + + # Delete PyTorch modules that are replaced by TRT + if hasattr(action_head, "model"): + del action_head.model + if hasattr(action_head, "state_encoder"): + del action_head.state_encoder + if hasattr(action_head, "action_encoder"): + del action_head.action_encoder + if hasattr(action_head, "action_decoder"): + del action_head.action_decoder + torch.cuda.empty_cache() + + # Verify action_dim consistency + assert action_head.action_dim == action_head.config.max_action_dim, ( + f"action_dim mismatch: action_head.action_dim={action_head.action_dim} " + f"!= config.max_action_dim={action_head.config.max_action_dim}" + ) + + # Load action head TRT engines + print(f"Loading action head engines from: {trt_engine_path}") + action_head.state_encoder_engine = Engine(os.path.join(trt_engine_path, "state_encoder.engine")) + action_head.action_encoder_engine = Engine( + os.path.join(trt_engine_path, "action_encoder.engine") + ) + action_head.dit_engine = Engine(os.path.join(trt_engine_path, "dit_bf16.engine")) + action_head.action_decoder_engine = Engine( + os.path.join(trt_engine_path, "action_decoder.engine") + ) + + # Monkey-patch: backbone.forward stays original, only action head is replaced + action_head.get_action = partial(action_head_tensorrt_forward, action_head) + + print("Action head TRT engines loaded and forward method patched.") + print(" Backbone remains in PyTorch (Qwen3-VL).") + + +def _setup_dit_only(policy, trt_engine_path): + """Set up TRT engine for DiT-only acceleration (backward compatible). + + Only replaces the DiT model in the action head. The backbone and other + action head components remain in PyTorch. + """ + action_head = policy.model.action_head + + # Delete the PyTorch DiT model + if hasattr(action_head, "model"): + del action_head.model + torch.cuda.empty_cache() + + # Load DiT TRT engine + # Support both naming conventions + dit_path = os.path.join(trt_engine_path, "dit_bf16.engine") + if not os.path.exists(dit_path): + dit_path = os.path.join(trt_engine_path, "dit_model_bf16.engine") + if not os.path.exists(dit_path): + # Try the old naming convention + dit_path = os.path.join(trt_engine_path, "dit_model_bf16.trt") + + print(f"Loading DiT engine: {dit_path}") + action_head.dit_engine = Engine(dit_path) + + # Monkey-patch only the get_action method + # We need a simpler forward that only replaces the DiT call + @torch.no_grad() + def dit_only_get_action_with_features( + backbone_features, + state_features, + embodiment_id, + backbone_output, + action_input=None, + options=None, + ): + """get_action_with_features with DiT replaced by TRT. + + ``action_input``/``options`` are accepted (and unused) so the patched + method matches the ``Gr00tN1d7.get_action_with_features`` contract that + ``get_action`` calls with these keywords; the DiT-only path needs neither. + """ + vl_embs = backbone_features + batch_size = vl_embs.shape[0] + device = vl_embs.device + engine_dtype = torch.bfloat16 + + actions = torch.randn( + size=(batch_size, action_head.config.action_horizon, action_head.action_dim), + dtype=vl_embs.dtype, + device=device, + ) + + dt = 1.0 / action_head.num_inference_timesteps + + for t in range(action_head.num_inference_timesteps): + t_cont = t / float(action_head.num_inference_timesteps) + t_discretized = int(t_cont * action_head.num_timestep_buckets) + + timesteps_tensor = torch.full( + size=(batch_size,), fill_value=t_discretized, device=device + ) + action_features = action_head.action_encoder(actions, timesteps_tensor, embodiment_id) + + if action_head.config.add_pos_embed: + pos_ids = torch.arange(action_features.shape[1], dtype=torch.long, device=device) + pos_embs = action_head.position_embedding(pos_ids).unsqueeze(0) + action_features = action_features + pos_embs + + sa_embs = torch.cat((state_features, action_features), dim=1).to(engine_dtype) + + # Use TRT for DiT + vl_embs_trt = vl_embs.to(engine_dtype) + timesteps_trt = timesteps_tensor.to(torch.int64) + + action_head.dit_engine.set_runtime_tensor_shape("sa_embs", sa_embs.shape) + action_head.dit_engine.set_runtime_tensor_shape("vl_embs", vl_embs_trt.shape) + action_head.dit_engine.set_runtime_tensor_shape("timestep", timesteps_trt.shape) + + dit_kwargs = {} + if hasattr(backbone_output, "image_mask") and backbone_output.image_mask is not None: + image_mask = backbone_output.image_mask + action_head.dit_engine.set_runtime_tensor_shape("image_mask", image_mask.shape) + dit_kwargs["image_mask"] = image_mask + + if ( + hasattr(backbone_output, "backbone_attention_mask") + and backbone_output.backbone_attention_mask is not None + ): + bb_mask = backbone_output.backbone_attention_mask + action_head.dit_engine.set_runtime_tensor_shape( + "backbone_attention_mask", bb_mask.shape + ) + dit_kwargs["backbone_attention_mask"] = bb_mask + + model_output = action_head.dit_engine( + sa_embs, vl_embs_trt, timesteps_trt, **dit_kwargs + )["output"] + + pred = action_head.action_decoder(model_output, embodiment_id) + pred_velocity = pred[:, -action_head.action_horizon :] + actions = actions + dt * pred_velocity + + return BatchFeature( + data={ + "action_pred": actions, + "backbone_features": vl_embs, + "state_features": state_features, + } + ) + + action_head.get_action_with_features = dit_only_get_action_with_features + print("DiT-only TRT engine loaded and forward method patched.") + + +# Maps each InferenceMode to its engine-swap routine. setup_tensorrt_engines +# dispatches through this; a deployment test asserts the keys equal InferenceMode +# exactly, so a new mode can't be added without a matching setup branch. +_INFERENCE_MODE_DISPATCH = { + InferenceMode.n17_full_pipeline: _setup_n17_full_pipeline, + InferenceMode.vit_llm_only: _setup_vit_llm_only, + InferenceMode.action_head: _setup_action_head, + InferenceMode.dit_only: _setup_dit_only, +} diff --git a/scripts/deployment/trt_torch.py b/scripts/deployment/trt_torch.py new file mode 100644 index 000000000..fef48487f --- /dev/null +++ b/scripts/deployment/trt_torch.py @@ -0,0 +1,230 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +# +# 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. + +"""TensorRT Engine wrapper for GR00T inference. + +Loads serialized TRT engines, manages input/output tensor bindings, and +executes inference. Supports dynamic shapes and BF16/FP16/FP32 dtypes. +""" + +import ctypes +import os + +import tensorrt as trt +import torch + + +def torch_type(trt_type): + """Convert TensorRT data type to PyTorch equivalent.""" + mapping = { + trt.float32: torch.float32, + trt.float16: torch.float16, + trt.bfloat16: torch.bfloat16, + trt.int8: torch.int8, + trt.int32: torch.int32, + trt.bool: torch.bool, + trt.uint8: torch.uint8, + trt.int64: torch.int64, + } + if trt_type in mapping: + return mapping[trt_type] + + raise TypeError( + f"Could not resolve TensorRT datatype to an equivalent PyTorch datatype. {trt_type}" + ) + + +class Engine(object): + """TensorRT engine wrapper for loading and executing inference.""" + + def __init__(self, file, plugins=[]): + super().__init__() + + self._closed = False + self.execution_context = None + self.handle = None + + self.logger = trt.Logger(trt.Logger.ERROR) + trt.init_libnvinfer_plugins(self.logger, "") + + self.plugins = [ctypes.CDLL(plugin, ctypes.RTLD_GLOBAL) for plugin in plugins] + self.file = file + self.load(file) + + self.print() + + def close(self): + """Release the execution context, then the engine handle. + + TensorRT requires the context be dropped before the engine. + Idempotent so it composes safely with ``__del__``. + """ + if self._closed: + return + self._closed = True + self.execution_context = None + self.handle = None + + def __del__(self): + # tensorrt / CUDA context may already be gone at shutdown; swallow + # so the traceback doesn't surface as a spurious error on exit. + try: + self.close() + except Exception: + pass + + def print(self): + """Display engine details (inputs/outputs) on rank 0 only.""" + if int(os.getenv("LOCAL_RANK", -1)) not in [0, -1]: + return + + print("============= TRT Engine Detail =============") + print(f"Engine file: {self.file}") + print(f"Inputs: {len(self.in_meta)}") + for ib, item in enumerate(self.in_meta): + tensor_name, shape, dtype = item[:3] + print(f" {ib}. {tensor_name}: {'x'.join(map(str, shape))} [{dtype}]") + + print(f"Outputs: {len(self.out_meta)}") + for ib, item in enumerate(self.out_meta): + tensor_name, shape, dtype = item[:3] + print(f" {ib}. {tensor_name}: {'x'.join(map(str, shape))} [{dtype}]") + print("=============================================") + + def load(self, file): + """Deserialize and load a TensorRT engine from file.""" + runtime = trt.Runtime(self.logger) + + try: + with open(file, "rb") as f: + self.handle = runtime.deserialize_cuda_engine(f.read()) + assert self.handle is not None, ( + f"Failed to deserialize the cuda engine from file: {file}" + ) + + self.execution_context = self.handle.create_execution_context() + self.meta, self.in_meta, self.out_meta = [], [], [] + for tensor_name in self.handle: + shape = self.handle.get_tensor_shape(tensor_name) + dtype = torch_type(self.handle.get_tensor_dtype(tensor_name)) + if self.handle.get_tensor_mode(tensor_name) == trt.TensorIOMode.INPUT: + self.in_meta.append([tensor_name, shape, dtype]) + else: + self.out_meta.append([tensor_name, shape, dtype]) + except BaseException: + # Roll back a half-loaded engine (e.g. create_execution_context + # failed after the handle was set) so it can't leak GPU memory. + self.close() + raise + + def __call__(self, *args, **inputs): + return self.forward(*args, **inputs) + + def dtype_of(self, tensor_name: str) -> torch.dtype: + """Return the expected PyTorch dtype for a named input tensor.""" + for name, _shape, dtype in self.in_meta: + if name == tensor_name: + return dtype + raise KeyError(f"Input tensor '{tensor_name}' not found in engine.") + + def set_runtime_tensor_shape(self, name, shape): + """Set runtime input shape for dynamic dimensions.""" + self.execution_context.set_input_shape(name, shape) + + def forward(self, *args, **kwargs): + """Execute TRT inference with the given input tensors. + + Accepts both positional and keyword arguments. + Returns a dict of output tensors by default, or a list if return_list=True. + """ + return_list = kwargs.pop("return_list", False) + reference_tensors = [] + stream = torch.cuda.current_stream() + + # Process positional arguments + for iarg, x in enumerate(args): + name, shape, dtype = self.in_meta[iarg] + runtime_shape = self.execution_context.get_tensor_shape(name) + assert isinstance(x, torch.Tensor), f"Unsupported tensor type: {type(x)}" + assert runtime_shape == x.shape, f"Invalid input shape: {runtime_shape} != {x.shape}" + assert dtype == x.dtype, ( + f"Invalid tensor dtype, expected dtype is {dtype}, but got {x.dtype}" + ) + assert x.is_cuda, f"Invalid tensor device, expected device is cuda, but got {x.device}" + x = x.cuda().contiguous() + self.execution_context.set_tensor_address(name, x.data_ptr()) + reference_tensors.append(x) + + # Process keyword arguments + for name, shape, dtype in self.in_meta: + if name not in kwargs: + continue + + runtime_shape = self.execution_context.get_tensor_shape(name) + x = kwargs[name] + assert isinstance(x, torch.Tensor), f"Unsupported tensor[{name}] type: {type(x)}" + assert runtime_shape == x.shape, ( + f"Invalid input[{name}] shape: {x.shape}, but the expected shape is: {runtime_shape}" + ) + assert dtype == x.dtype, ( + f"Invalid tensor[{name}] dtype, expected dtype is {dtype}, but got {x.dtype}" + ) + assert x.is_cuda, ( + f"Invalid tensor[{name}] device, expected device is cuda, but got {x.device}" + ) + x = x.cuda().contiguous() + self.execution_context.set_tensor_address(name, x.data_ptr()) + reference_tensors.append(x) + + # Allocate output tensors + for item in self.out_meta: + name = item[0] + runtime_shape = self.execution_context.get_tensor_shape(name) + output_tensor = torch.zeros( + *runtime_shape, dtype=item[2], device=reference_tensors[0].device + ) + self.execution_context.set_tensor_address(name, output_tensor.data_ptr()) + reference_tensors.append(output_tensor) + + # Execute + self.execution_context.execute_async_v3(stream.cuda_stream) + stream.synchronize() + assert len(reference_tensors) == len(self.in_meta) + len(self.out_meta), ( + f"Invalid input tensors. The expected I/O tensors are " + f"{len(self.in_meta) + len(self.out_meta)}, but got {len(reference_tensors)}" + ) + + if return_list: + return [ + reference_tensors[len(self.in_meta) + i] for i, item in enumerate(self.out_meta) + ] + else: + return { + item[0]: reference_tensors[len(self.in_meta) + i] + for i, item in enumerate(self.out_meta) + } diff --git a/scripts/deployment/verify_n1d7_trt.py b/scripts/deployment/verify_n1d7_trt.py new file mode 100644 index 000000000..a0b88a276 --- /dev/null +++ b/scripts/deployment/verify_n1d7_trt.py @@ -0,0 +1,267 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Quick verification: compare PyTorch vs TRT action head outputs for N1.7.""" + +from dataclasses import dataclass +import os +import sys + +import torch +from torch.nn.functional import cosine_similarity +import tyro + + +# Make sibling imports work +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +from _trt_contract import resolve_batch_size +from export_onnx_n1d7 import prepare_observation +from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.deployment.modes import VerifyMode +from gr00t.policy.gr00t_policy import Gr00tPolicy + + +@dataclass +class VerifyConfig: + """Configuration for TRT verification.""" + + model_path: str + """Path to model checkpoint (required).""" + + dataset_path: str = "demo_data/libero_demo" + """Path to dataset.""" + + engine_dir: str = "./gr00t_trt_deployment/engines" + """Directory with TRT engines.""" + + mode: VerifyMode = VerifyMode.action_head + """TRT setup mode. 'dit_only' loads only the DiT engine; 'vit_llm_only' keeps the action head in PyTorch.""" + + embodiment_tag: EmbodimentTag = EmbodimentTag.LIBERO_PANDA + """Embodiment tag to use.""" + + batch_size: int = 1 + """Batch size for TRT inference. If > 1, tiles the observation and takes slice [0] for comparison.""" + + +def _tile_observation(obs, n): + """Tile a single observation dict to batch size n.""" + tiled = {} + for modality, entries in obs.items(): + tiled[modality] = {} + for key, val in entries.items(): + if isinstance(val, list): + # language: [["text"]] -> [["text"]] * n + tiled[modality][key] = val * n + else: + # numpy/tensor: repeat along batch dim 0 + import numpy as np + + if isinstance(val, np.ndarray): + tiled[modality][key] = np.repeat(val, n, axis=0) + else: + tiled[modality][key] = val.repeat(n, *([1] * (val.ndim - 1))) + return tiled + + +def main(args: VerifyConfig | None = None): + if args is None: + args = tyro.cli(VerifyConfig) + + print("=" * 60) + print("N1.7 TRT Verification") + print("=" * 60) + + resolve_batch_size(args.engine_dir, args.batch_size, source="verify_n1d7_trt") + + # Step 1: Load policy and get PyTorch reference output + print("\n[1] Loading policy...") + policy = Gr00tPolicy( + embodiment_tag=args.embodiment_tag, + model_path=args.model_path, + device="cuda", + ) + + print("[2] Loading dataset...") + dataset = LeRobotEpisodeLoader( + dataset_path=args.dataset_path, + modality_configs=policy.get_modality_config(), + ) + + # --- Capture ViT input/output and backbone output from PyTorch --- + pt_backbone_features = None + pt_vit_output = None + pt_vit_input = None + + def _capture_backbone_hook(module, args, output): + nonlocal pt_backbone_features + pt_backbone_features = output["backbone_features"].detach().clone() + return output + + def _capture_vit_hook(module, args, kwargs, output): + nonlocal pt_vit_output, pt_vit_input + # Capture input pixel_values + if args: + pt_vit_input = args[0].detach().clone() + elif "pixel_values" in kwargs: + pt_vit_input = kwargs["pixel_values"].detach().clone() + # Capture output (image_embeds after merger) + if isinstance(output, tuple): + pt_vit_output = output[0].detach().clone() + else: + pt_vit_output = output.detach().clone() + return output + + backbone_hook = policy.model.backbone.register_forward_hook(_capture_backbone_hook) + vit_hook = policy.model.backbone.model.model.visual.register_forward_hook( + _capture_vit_hook, with_kwargs=True + ) + + print("[3] Running PyTorch inference...") + obs = prepare_observation(policy, dataset, traj_idx=0) + torch.manual_seed(42) + with torch.inference_mode(): + result = policy.get_action(obs) + + backbone_hook.remove() + vit_hook.remove() + + # get_action returns (action_dict, info_dict) + action_dict = result[0] if isinstance(result, tuple) else result + print(f" Action keys: {list(action_dict.keys())}") + + # Concatenate all action arrays into a single tensor for comparison + pt_arrays = [] + for k in sorted(action_dict.keys()): + v = action_dict[k] + t = torch.tensor(v) if not isinstance(v, torch.Tensor) else v + pt_arrays.append(t.float().flatten()) + print(f" {k}: shape={v.shape if hasattr(v, 'shape') else len(v)}") + pt_action = torch.cat(pt_arrays) + + # Step 2: Setup TRT engines and run + print("\n[4] Loading TRT engines...") + from trt_model_forward import setup_tensorrt_engines + + setup_tensorrt_engines(policy, args.engine_dir, mode=args.mode) + + # --- Capture backbone output from TRT --- + trt_backbone_features = None + + def _capture_trt_backbone_hook(module, args, output): + nonlocal trt_backbone_features + trt_backbone_features = output["backbone_features"].detach().clone() + return output + + backbone_hook2 = policy.model.backbone.register_forward_hook(_capture_trt_backbone_hook) + + # Run ViT TRT with the same pixel_values captured during PyTorch pass + trt_vit_output = None + if pt_vit_input is not None and getattr(policy.model.backbone, "vit_engine", None) is not None: + vit_dtype = policy.model.backbone.vit_engine.dtype_of("pixel_values") + pv = pt_vit_input.to(vit_dtype).cuda().contiguous() + # For batch_size > 1, tile pixel_values to match engine's expected num_patches + if args.batch_size > 1: + pv = pv.repeat(args.batch_size, 1) + policy.model.backbone.vit_engine.set_runtime_tensor_shape("pixel_values", pv.shape) + vit_result = policy.model.backbone.vit_engine(pv) + # Take first batch's merged patches for comparison + num_merged = ( + pt_vit_output.shape[0] + if pt_vit_output is not None + else vit_result["image_embeds"].shape[0] // args.batch_size + ) + trt_vit_output = vit_result["image_embeds"][:num_merged].detach().clone() + + print("[5] Running TRT inference...") + obs2 = prepare_observation(policy, dataset, traj_idx=0) + if args.batch_size > 1: + print(f" Tiling observation to batch_size={args.batch_size}") + obs2 = _tile_observation(obs2, args.batch_size) + torch.manual_seed(42) + with torch.inference_mode(): + result2 = policy.get_action(obs2) + + backbone_hook2.remove() + + action_dict2 = result2[0] if isinstance(result2, tuple) else result2 + trt_arrays = [] + for k in sorted(action_dict2.keys()): + v = action_dict2[k] + # For batch_size > 1, take slice [0] to compare against single PyTorch output + if args.batch_size > 1 and hasattr(v, "shape") and v.shape[0] == args.batch_size: + v = v[0:1] + t = torch.tensor(v) if not isinstance(v, torch.Tensor) else v + trt_arrays.append(t.float().flatten()) + trt_act = torch.cat(trt_arrays) + + # Step 3a: Compare ViT outputs + if pt_vit_output is not None and trt_vit_output is not None: + vit_pt = pt_vit_output.float().flatten() + vit_trt = trt_vit_output.float().flatten() + vit_cosine = cosine_similarity(vit_pt.unsqueeze(0), vit_trt.unsqueeze(0)).item() + vit_l1 = (vit_pt - vit_trt).abs().mean().item() + vit_linf = (vit_pt - vit_trt).abs().max().item() + print("\n[6a] ViT output comparison (image_embeds):") + print(f" Cosine Similarity: {vit_cosine:.6f}") + print(f" L1 Mean Error: {vit_l1:.6f}") + print(f" L∞ Max Error: {vit_linf:.6f}") + else: + print("\n[6a] ViT comparison skipped (PyTorch ViT was deleted before capture)") + + # Step 3b: Compare backbone outputs (before vl_self_attention) + if pt_backbone_features is not None and trt_backbone_features is not None: + bb_pt = pt_backbone_features.float().flatten() + # For batch_size > 1, take slice [0] to match PyTorch single-batch output + trt_bb = trt_backbone_features[:1] if args.batch_size > 1 else trt_backbone_features + bb_trt = trt_bb.float().flatten() + bb_cosine = cosine_similarity(bb_pt.unsqueeze(0), bb_trt.unsqueeze(0)).item() + bb_l1 = (bb_pt - bb_trt).abs().mean().item() + bb_linf = (bb_pt - bb_trt).abs().max().item() + print("\n[6b] Backbone output comparison (LLM output, before vl_self_attention):") + print(f" Cosine Similarity: {bb_cosine:.6f}") + print(f" L1 Mean Error: {bb_l1:.6f}") + print(f" L∞ Max Error: {bb_linf:.6f}") + + # Step 4: Compare final action outputs + print("\n[6b] Final action output comparison:") + pt_flat = pt_action.float().flatten() + trt_flat = trt_act.float().flatten() + + cosine = cosine_similarity(pt_flat.unsqueeze(0), trt_flat.unsqueeze(0)).item() + l1 = (pt_flat - trt_flat).abs().mean().item() + linf = (pt_flat - trt_flat).abs().max().item() + + print(f"\n Cosine Similarity: {cosine:.6f}") + print(f" L1 Mean Error: {l1:.6f}") + print(f" L∞ Max Error: {linf:.6f}") + + if cosine > 0.999: + print("\n PASS — TRT matches PyTorch") + elif cosine > 0.99: + print("\n WARN — Minor drift detected") + else: + print("\n FAIL — Significant divergence") + + return cosine + + +if __name__ == "__main__": + config = tyro.cli(VerifyConfig) + main(config) diff --git a/scripts/download_droid_sample.py b/scripts/download_droid_sample.py new file mode 100644 index 000000000..3042b9e0e --- /dev/null +++ b/scripts/download_droid_sample.py @@ -0,0 +1,400 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Download a small DROID sample dataset from HuggingFace and convert it to +GR00T LeRobot v2 format suitable for inference with the base model. + +The full DROID dataset (lerobot/droid_1.0.1) is ~358 GB with 95k+ episodes +in LeRobot v3.0 format. This script downloads only the first data/video chunks, +then extracts a handful of episodes into the v2.0 per-episode format. + +Prerequisites: + uv pip install jsonlines # if not already installed + +Usage: + python scripts/download_droid_sample.py + python scripts/download_droid_sample.py --num-episodes 5 --output-dir demo_data/droid_sample + +After running, test with: + uv run python scripts/deployment/standalone_inference_script.py \\ + --model-path nvidia/GR00T-N1.7-3B \\ + --dataset-path demo_data/droid_sample \\ + --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \\ + --traj-ids 0 1 --inference-mode pytorch --action-horizon 8 +""" + +from __future__ import annotations + +import argparse +import json +import logging +from pathlib import Path +import subprocess + +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.state_action.droid_frame import compute_eef_9d +from gr00t.data.stats import generate_rel_stats, generate_stats +import jsonlines +import numpy as np +import pyarrow.parquet as pq + + +logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") +logger = logging.getLogger(__name__) + + +REPO_ID = "lerobot/droid_1.0.1" +DEFAULT_OUTPUT_DIR = "demo_data/droid_sample" +DEFAULT_NUM_EPISODES = 3 + +# The 2 cameras used by the OXE_DROID model config. +# (The dataset also has exterior_2_left, but the model only uses 2 cameras.) +VIDEO_KEYS = [ + "observation.images.exterior_1_left", + "observation.images.wrist_left", +] + + +def download_droid_files(cache_dir: Path) -> None: + """Download minimal files from the DROID v3.0 dataset.""" + from huggingface_hub import hf_hub_download + + logger.info("Downloading DROID v3.0 metadata and first chunks...") + + # Source stats.json is skipped; stats are regenerated from the rebuilt + # 17D data in extract_episodes (source layout differs). + files_to_download = [ + "meta/info.json", + "meta/tasks.parquet", + "meta/episodes/chunk-000/file-000.parquet", + "data/chunk-000/file-000.parquet", + ] + # Download video file-000 for each camera we need + for video_key in VIDEO_KEYS: + files_to_download.append(f"videos/{video_key}/chunk-000/file-000.mp4") + + for fname in files_to_download: + logger.info(f" {fname}...") + hf_hub_download( + repo_id=REPO_ID, + repo_type="dataset", + filename=fname, + local_dir=str(cache_dir), + ) + + +def extract_episodes(cache_dir: Path, output_dir: Path, num_episodes: int) -> None: + """Convert downloaded v3.0 data to GR00T LeRobot v2.0 format.""" + + output_dir.mkdir(parents=True, exist_ok=True) + meta_dir = output_dir / "meta" + meta_dir.mkdir(exist_ok=True) + + # Load source info + with open(cache_dir / "meta" / "info.json") as f: + source_info = json.load(f) + fps = source_info.get("fps", 15) + + # ── Load episodes metadata (v3.0 parquet format) ── + episodes_pq = cache_dir / "meta" / "episodes" / "chunk-000" / "file-000.parquet" + episodes_df = pq.read_table(episodes_pq).to_pandas() + + # Only take episodes from file-000 (the chunk we downloaded) + episodes = [] + for _, row in episodes_df.iterrows(): + if len(episodes) >= num_episodes: + break + # Skip episodes whose data is in a different file + if int(row["data/file_index"]) != 0: + continue + episodes.append(row) + + if not episodes: + raise RuntimeError("No episodes found in first data chunk") + + # ── Load tasks (v3.0: parquet with task text as index, task_index as column) ── + tasks_df = pq.read_table(cache_dir / "meta" / "tasks.parquet").to_pandas() + tasks_df_reset = tasks_df.reset_index() + # columns after reset: ['index' (= task text), 'task_index'] + task_text_col = tasks_df_reset.columns[0] # the task text column + + logger.info(f"Extracting {len(episodes)} episodes (fps={fps})") + + # ── Read the consolidated data parquet ── + data_path = cache_dir / "data" / "chunk-000" / "file-000.parquet" + table = pq.read_table(data_path) + df = table.to_pandas() + + # ── Create per-episode parquet files ── + data_chunk_dir = output_dir / "data" / "chunk-000" + data_chunk_dir.mkdir(parents=True, exist_ok=True) + + episode_records = [] + task_indices_used = set() + + for ep_row in episodes: + ep_idx = int(ep_row["episode_index"]) + ep_df = df[df["episode_index"] == ep_idx].copy() + + if len(ep_df) == 0: + logger.warning(f"Episode {ep_idx} has no data rows, skipping") + continue + + ep_length = len(ep_df) + new_ep_idx = len(episode_records) + + lang = ( + str(ep_df["language_instruction"].iloc[0]) + if "language_instruction" in ep_df.columns + else "" + ) + logger.info(f" Episode {ep_idx} -> {new_ep_idx}: {ep_length} frames, task={lang[:60]!r}") + + if "task_index" in ep_df.columns: + task_indices_used.update(ep_df["task_index"].unique().tolist()) + + ep_df = ep_df.copy() + ep_df["episode_index"] = new_ep_idx + ep_df["index"] = range(len(ep_df)) + + # Compute eef_9d (XYZ + rot6d) from cartesian_position (XYZ + euler) + # for both state and action, as the model expects 17D = eef_9d(9) + gripper(1) + joints(7) + for prefix in ["observation.state", "action"]: + cart_col = f"{prefix}.cartesian_position" + if cart_col in ep_df.columns: + cart = np.stack(ep_df[cart_col].values) # (T, 6) + eef_9d = compute_eef_9d(cart) # (T, 9) + ep_df[f"{prefix}.eef_9d"] = list(eef_9d) + + # Rebuild concatenated observation.state = [eef_9d(9), gripper(1), joint(7)] = 17D + state_parts = [] + for col in [ + "observation.state.eef_9d", + "observation.state.gripper_position", + "observation.state.joint_position", + ]: + if col in ep_df.columns: + vals = ep_df[col].values + arr = np.stack([np.atleast_1d(v) for v in vals]) + state_parts.append(arr) + if state_parts: + new_state = np.concatenate(state_parts, axis=-1) # (T, 17) + ep_df["observation.state"] = list(new_state) + + # Rebuild concatenated action = [eef_9d(9), gripper(1), joint(7)] = 17D + action_parts = [] + for col in ["action.eef_9d", "action.gripper_position", "action.joint_position"]: + if col in ep_df.columns: + vals = ep_df[col].values + arr = np.stack([np.atleast_1d(v) for v in vals]) + action_parts.append(arr) + if action_parts: + new_action = np.concatenate(action_parts, axis=-1) # (T, 17) + ep_df["action"] = list(new_action) + + ep_parquet = data_chunk_dir / f"episode_{new_ep_idx:06d}.parquet" + ep_df.to_parquet(ep_parquet, index=False) + + episode_records.append( + { + "episode_index": new_ep_idx, + "tasks": list(ep_row["tasks"]) if "tasks" in ep_row.index else [], + "length": ep_length, + "_src_row": ep_row, # keep for video timestamp lookup + } + ) + + if not episode_records: + raise RuntimeError("No episodes could be extracted") + + # ── Extract per-episode video segments using timestamps from episodes metadata ── + for video_key in VIDEO_KEYS: + video_chunk_dir = output_dir / "videos" / "chunk-000" / video_key + video_chunk_dir.mkdir(parents=True, exist_ok=True) + + source_video = cache_dir / "videos" / video_key / "chunk-000" / "file-000.mp4" + if not source_video.exists(): + logger.warning(f"Video not found: {source_video}, skipping") + continue + + for rec in episode_records: + new_ep_idx = rec["episode_index"] + ep_row = rec["_src_row"] + + from_ts = float(ep_row[f"videos/{video_key}/from_timestamp"]) + to_ts = float(ep_row[f"videos/{video_key}/to_timestamp"]) + duration = to_ts - from_ts + + out_video = video_chunk_dir / f"episode_{new_ep_idx:06d}.mp4" + + # Try stream copy first (fast), fall back to re-encode for AV1 + cmd = [ + "ffmpeg", + "-y", + "-loglevel", + "error", + "-ss", + f"{from_ts:.6f}", + "-i", + str(source_video), + "-t", + f"{duration:.6f}", + "-c", + "copy", + str(out_video), + ] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + cmd_reencode = [ + "ffmpeg", + "-y", + "-loglevel", + "error", + "-ss", + f"{from_ts:.6f}", + "-i", + str(source_video), + "-t", + f"{duration:.6f}", + "-c:v", + "libx264", + "-crf", + "23", + "-preset", + "fast", + str(out_video), + ] + subprocess.run(cmd_reencode, check=True) + logger.info( + f" {video_key} ep{new_ep_idx}: re-encoded ({rec['length']} frames, {from_ts:.1f}s-{to_ts:.1f}s)" + ) + else: + logger.info( + f" {video_key} ep{new_ep_idx}: copied ({rec['length']} frames, {from_ts:.1f}s-{to_ts:.1f}s)" + ) + + # ── Write meta files ── + + # Clean up internal fields before writing + for rec in episode_records: + del rec["_src_row"] + + # meta/episodes.jsonl + with jsonlines.open(meta_dir / "episodes.jsonl", mode="w") as writer: + for rec in episode_records: + writer.write(rec) + + # meta/tasks.jsonl + with jsonlines.open(meta_dir / "tasks.jsonl", mode="w") as writer: + for _, row in tasks_df_reset.iterrows(): + tidx = int(row["task_index"]) + if tidx in task_indices_used: + writer.write({"task_index": tidx, "task": str(row[task_text_col])}) + + # meta/info.json + info = { + "codebase_version": "v2.1", + "robot_type": "droid", + "total_episodes": len(episode_records), + "total_frames": sum(r["length"] for r in episode_records), + "fps": fps, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "chunks_size": 1000, + "splits": {"train": f"0:{len(episode_records)}"}, + "features": { + "observation.images.exterior_1_left": { + "dtype": "video", + "shape": [180, 320, 3], + }, + "observation.images.wrist_left": { + "dtype": "video", + "shape": [180, 320, 3], + }, + "observation.state": {"dtype": "float32", "shape": [17]}, + "action": {"dtype": "float32", "shape": [17]}, + "task_index": {"dtype": "int64", "shape": [1]}, + }, + } + with open(meta_dir / "info.json", "w") as f: + json.dump(info, f, indent=2) + + # meta/modality.json + modality = { + "state": { + "eef_9d": {"start": 0, "end": 9}, + "gripper_position": {"start": 9, "end": 10}, + "joint_position": {"start": 10, "end": 17}, + }, + "action": { + "eef_9d": {"start": 0, "end": 9}, + "gripper_position": {"start": 9, "end": 10}, + "joint_position": {"start": 10, "end": 17}, + }, + "video": { + "exterior_1_left": {"original_key": "observation.images.exterior_1_left"}, + "wrist_left": {"original_key": "observation.images.wrist_left"}, + }, + "annotation": { + "language.language_instruction": {"original_key": "task_index"}, + }, + } + with open(meta_dir / "modality.json", "w") as f: + json.dump(modality, f, indent=2) + + # Regenerate stats from the rebuilt columns (needs info.json + modality.json). + logger.info(" Generating stats.json and relative_stats.json from rebuilt data...") + generate_stats(output_dir) + generate_rel_stats(output_dir, EmbodimentTag.OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT) + + logger.info(f"\nDataset created at: {output_dir}") + logger.info(f" Episodes: {len(episode_records)}") + logger.info(f" Total frames: {sum(r['length'] for r in episode_records)}") + + +def main(): + parser = argparse.ArgumentParser( + description="Download a small DROID sample dataset for GR00T inference testing.", + ) + parser.add_argument("--output-dir", default=DEFAULT_OUTPUT_DIR) + parser.add_argument("--num-episodes", type=int, default=DEFAULT_NUM_EPISODES) + parser.add_argument("--cache-dir", default=None) + args = parser.parse_args() + + cache_dir = Path(args.cache_dir or "/tmp/droid_download_cache") + output_dir = Path(args.output_dir) + + if output_dir.exists(): + logger.info(f"Output already exists: {output_dir} — delete it to regenerate.") + return + + download_droid_files(cache_dir) + extract_episodes(cache_dir, output_dir, args.num_episodes) + + logger.info("\nTo run inference:") + logger.info( + f" uv run python scripts/deployment/standalone_inference_script.py \\\n" + f" --model-path nvidia/GR00T-N1.7-3B \\\n" + f" --dataset-path {output_dir} \\\n" + f" --embodiment-tag OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT \\\n" + f" --traj-ids 1 2 --inference-mode pytorch --action-horizon 8" + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/download_simplerenv_sample.py b/scripts/download_simplerenv_sample.py new file mode 100644 index 000000000..33a57de3c --- /dev/null +++ b/scripts/download_simplerenv_sample.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Download small SimplerEnv sample datasets from HuggingFace for inference testing. + +Creates two demo datasets under demo_data/: + - simplerenv_fractal_sample (3 episodes from IPEC-COMMUNITY/fractal20220817_data_lerobot) + - simplerenv_bridge_sample (3 episodes from IPEC-COMMUNITY/bridge_orig_lerobot) + +Both source datasets are already in LeRobot v2 format (per-episode parquet + per-episode mp4), +so this script simply downloads the first few episodes and rewrites the meta files. + +Prerequisites: + pip install huggingface_hub jsonlines pyarrow + +Usage: + python scripts/download_simplerenv_sample.py + python scripts/download_simplerenv_sample.py --num-episodes 3 +""" + +from __future__ import annotations + +import argparse +import json +import logging +from pathlib import Path +import shutil + +import jsonlines + + +logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") +logger = logging.getLogger(__name__) + +DEFAULT_NUM_EPISODES = 3 + +DATASETS = { + "fractal": { + "hf_repo": "IPEC-COMMUNITY/fractal20220817_data_lerobot", + "output_dir": "demo_data/simplerenv_fractal_sample", + "robot_type": "google_robot", + "video_keys": ["observation.images.image"], + "modality_source": "examples/SimplerEnv/fractal_modality.json", + "embodiment_tag": "SIMPLER_ENV_GOOGLE", + }, + "bridge": { + "hf_repo": "IPEC-COMMUNITY/bridge_orig_lerobot", + "output_dir": "demo_data/simplerenv_bridge_sample", + "robot_type": "widowx", + # Bridge has 4 cameras, but the model only uses image_0 + "video_keys": ["observation.images.image_0"], + "modality_source": "examples/SimplerEnv/bridge_modality.json", + "embodiment_tag": "SIMPLER_ENV_WIDOWX", + }, +} + + +def download_sample( + dataset_key: str, + num_episodes: int, + repo_root: Path, +) -> None: + """Download a small sample from a SimplerEnv dataset.""" + from huggingface_hub import hf_hub_download + + cfg = DATASETS[dataset_key] + hf_repo = cfg["hf_repo"] + output_dir = repo_root / cfg["output_dir"] + + if output_dir.exists(): + logger.info(f"Output already exists: {output_dir} — delete it to regenerate.") + return + + logger.info(f"Downloading {dataset_key} sample ({num_episodes} episodes) from {hf_repo}") + + cache_dir = Path(f"/tmp/simplerenv_{dataset_key}_cache") + + # Download meta files + for meta_file in [ + "meta/info.json", + "meta/stats.json", + "meta/tasks.jsonl", + "meta/episodes.jsonl", + ]: + logger.info(f" {meta_file}...") + hf_hub_download( + repo_id=hf_repo, + repo_type="dataset", + filename=meta_file, + local_dir=str(cache_dir), + ) + + # Download first N episode data parquets + for ep_idx in range(num_episodes): + fname = f"data/chunk-000/episode_{ep_idx:06d}.parquet" + logger.info(f" {fname}...") + hf_hub_download( + repo_id=hf_repo, + repo_type="dataset", + filename=fname, + local_dir=str(cache_dir), + ) + + # Download first N episode videos for each video key + for video_key in cfg["video_keys"]: + for ep_idx in range(num_episodes): + fname = f"videos/chunk-000/{video_key}/episode_{ep_idx:06d}.mp4" + logger.info(f" {fname}...") + hf_hub_download( + repo_id=hf_repo, + repo_type="dataset", + filename=fname, + local_dir=str(cache_dir), + ) + + # Assemble output dataset + _assemble_sample(cache_dir, output_dir, num_episodes, cfg, repo_root) + + +def _assemble_sample( + cache_dir: Path, + output_dir: Path, + num_episodes: int, + cfg: dict, + repo_root: Path, +) -> None: + """Assemble the downloaded files into a proper LeRobot v2 demo dataset.""" + output_dir.mkdir(parents=True, exist_ok=True) + meta_dir = output_dir / "meta" + meta_dir.mkdir(exist_ok=True) + + # Load source info + with open(cache_dir / "meta" / "info.json") as f: + source_info = json.load(f) + fps = source_info.get("fps", 5) + + # Copy data parquets + data_chunk_dir = output_dir / "data" / "chunk-000" + data_chunk_dir.mkdir(parents=True, exist_ok=True) + import pyarrow.parquet as pq + + total_frames = 0 + for ep_idx in range(num_episodes): + src = cache_dir / "data" / "chunk-000" / f"episode_{ep_idx:06d}.parquet" + dst = data_chunk_dir / f"episode_{ep_idx:06d}.parquet" + shutil.copy2(src, dst) + table = pq.read_table(str(src)) + total_frames += len(table) + logger.info(f" Copied data episode {ep_idx}: {len(table)} frames") + + # Copy video files + for video_key in cfg["video_keys"]: + video_chunk_dir = output_dir / "videos" / "chunk-000" / video_key + video_chunk_dir.mkdir(parents=True, exist_ok=True) + for ep_idx in range(num_episodes): + src = cache_dir / "videos" / "chunk-000" / video_key / f"episode_{ep_idx:06d}.mp4" + dst = video_chunk_dir / f"episode_{ep_idx:06d}.mp4" + shutil.copy2(src, dst) + logger.info(f" Copied video {video_key} episode {ep_idx}") + + # Filter episodes.jsonl to only include our episodes + src_episodes = cache_dir / "meta" / "episodes.jsonl" + with jsonlines.open(meta_dir / "episodes.jsonl", mode="w") as writer: + with jsonlines.open(src_episodes) as reader: + for rec in reader: + if rec["episode_index"] < num_episodes: + writer.write(rec) + + # Collect task indices from parquet data + task_indices_used = set() + for ep_idx in range(num_episodes): + ep_path = data_chunk_dir / f"episode_{ep_idx:06d}.parquet" + df = pq.read_table(str(ep_path)).to_pandas() + if "task_index" in df.columns: + task_indices_used.update(df["task_index"].unique().tolist()) + + # Filter tasks.jsonl to only include tasks referenced by our episodes + src_tasks = cache_dir / "meta" / "tasks.jsonl" + with jsonlines.open(meta_dir / "tasks.jsonl", mode="w") as writer: + with jsonlines.open(src_tasks) as reader: + for rec in reader: + if not task_indices_used or rec.get("task_index") in task_indices_used: + writer.write(rec) + + # Build video feature entries from source info (only for keys we include) + video_features = {} + for video_key in cfg["video_keys"]: + if video_key in source_info.get("features", {}): + video_features[video_key] = source_info["features"][video_key] + else: + video_features[video_key] = {"dtype": "video", "shape": [256, 256, 3]} + + # Build info.json + features = {**video_features} + for key in ["observation.state", "action", "task_index"]: + if key in source_info.get("features", {}): + features[key] = source_info["features"][key] + + info = { + "codebase_version": "v2.1", + "robot_type": cfg["robot_type"], + "total_episodes": num_episodes, + "total_frames": total_frames, + "fps": fps, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "chunks_size": 1000, + "splits": {"train": f"0:{num_episodes}"}, + "features": features, + } + with open(meta_dir / "info.json", "w") as f: + json.dump(info, f, indent=2) + + # Filter stats.json to only keep keys present in info.json features + src_stats = cache_dir / "meta" / "stats.json" + if src_stats.exists(): + with open(src_stats) as f: + full_stats = json.load(f) + filtered_stats = {k: v for k, v in full_stats.items() if k in features} + with open(meta_dir / "stats.json", "w") as f: + json.dump(filtered_stats, f, indent=2) + + # Copy modality.json from the examples directory + modality_src = repo_root / cfg["modality_source"] + shutil.copy2(modality_src, meta_dir / "modality.json") + + logger.info(f"\nDataset created at: {output_dir}") + logger.info(f" Episodes: {num_episodes}, Total frames: {total_frames}, FPS: {fps}") + + +def main(): + parser = argparse.ArgumentParser( + description="Download small SimplerEnv sample datasets for GR00T inference testing.", + ) + parser.add_argument("--num-episodes", type=int, default=DEFAULT_NUM_EPISODES) + parser.add_argument( + "--datasets", + nargs="+", + default=list(DATASETS.keys()), + choices=list(DATASETS.keys()), + ) + args = parser.parse_args() + + repo_root = Path(__file__).resolve().parents[1] + + for dataset_key in args.datasets: + download_sample(dataset_key, args.num_episodes, repo_root) + + logger.info("\nTo run inference:") + for dataset_key in args.datasets: + cfg = DATASETS[dataset_key] + logger.info( + f"\n uv run python scripts/deployment/standalone_inference_script.py \\\n" + f" --model-path nvidia/GR00T-N1.7-3B \\\n" + f" --dataset-path {cfg['output_dir']} \\\n" + f" --embodiment-tag {cfg['embodiment_tag']} \\\n" + f" --traj-ids 0 1 --inference-mode pytorch --action-horizon 8" + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/eval/check_sim_eval_ready.py b/scripts/eval/check_sim_eval_ready.py index 2fcf16ef5..b6d2cb160 100644 --- a/scripts/eval/check_sim_eval_ready.py +++ b/scripts/eval/check_sim_eval_ready.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 ctypes import os from pathlib import Path @@ -150,65 +165,6 @@ def check_egl_installation(): assert _test_egl(), "EGL test failed" -def check_robocasa_environments(): - groot_path = os.path.join(os.path.dirname(__file__), "../..") - python_exec = os.path.join( - os.path.dirname(__file__), "../../gr00t/eval/sim/robocasa/robocasa_uv/.venv/bin/python3" - ) - python_script = ( - "import gymnasium as gym\n" - "import robocasa.utils.gym_utils.gymnasium_groot\n" - "env = gym.make('robocasa_panda_omron/CoffeeSetupMug_PandaOmron_Env', enable_render=True)\n" - "env.reset()\n" - "env.step(env.action_space.sample())\n" - "print('Env OK:', type(env))" - ) - cmd = f'PYTHONPATH={groot_path} {python_exec} -c "{python_script}"' - output = subprocess.check_output(cmd, shell=True, text=True, stderr=subprocess.DEVNULL) - assert "Env OK:" in output, f"Failed to check robocasa environment:\n{cmd}\n{output}" - print("✓ RoboCasa environment is installed") - - -def check_robocasa_gr1_tabletop_tasks_environments(): - groot_path = os.path.join(os.path.dirname(__file__), "../..") - python_exec = os.path.join( - os.path.dirname(__file__), - "../../gr00t/eval/sim/robocasa-gr1-tabletop-tasks/robocasa_uv/.venv/bin/python3", - ) - python_script = ( - "import gymnasium as gym\n" - "import robocasa.utils.gym_utils.gymnasium_groot\n" - "env = gym.make('gr1_unified/PnPCanToDrawerClose_GR1ArmsAndWaistFourierHands_Env', enable_render=True)\n" - "env.reset()\n" - "env.step(env.action_space.sample())\n" - "print('Env OK:', type(env))" - ) - cmd = f'PYTHONPATH={groot_path} {python_exec} -c "{python_script}"' - output = subprocess.check_output(cmd, shell=True, text=True, stderr=subprocess.DEVNULL) - assert "Env OK:" in output, f"Failed to check robocasa environment:\n{cmd}\n{output}" - print("✓ RoboCasa GR1 Tabletop Tasks environment is installed") - - -def check_g1_locomanipulation_environment(): - groot_path = os.path.join(os.path.dirname(__file__), "../..") - python_exec = os.path.join( - os.path.dirname(__file__), - "../../gr00t/eval/sim/GR00T-WholeBodyControl/GR00T-WholeBodyControl_uv/.venv/bin/python3", - ) - python_script = ( - "import gymnasium as gym\n" - "from gr00t_wbc.control.envs.robocasa.sync_env import SyncEnv\n" - "env = gym.make('gr00tlocomanip_g1_sim/LMPnPAppleToPlateDC_G1_gear_wbc', onscreen=False, offscreen=True)\n" - "env.reset()\n" - "env.step(env.action_space.sample())\n" - "print('Env OK:', type(env))" - ) - cmd = f'PYTHONPATH={groot_path} {python_exec} -c "{python_script}"' - output = subprocess.check_output(cmd, shell=True, text=True, stderr=subprocess.DEVNULL) - assert "Env OK:" in output, f"Failed to check G1 LocoManipulation environment:\n{cmd}\n{output}" - print("✓ G1 LocoManipulation environment is installed") - - def check_simpler_env_environments(): groot_path = os.path.join(os.path.dirname(__file__), "../..") python_exec = os.path.join( @@ -258,8 +214,5 @@ def check_libero_environments(): check_uv_installation() check_vulkan_installation() check_egl_installation() - check_robocasa_environments() - check_robocasa_gr1_tabletop_tasks_environments() - check_g1_locomanipulation_environment() check_simpler_env_environments() check_libero_environments() diff --git a/scripts/lerobot_conversion/README.md b/scripts/lerobot_conversion/README.md index 5381113af..6f24e81af 100644 --- a/scripts/lerobot_conversion/README.md +++ b/scripts/lerobot_conversion/README.md @@ -3,7 +3,12 @@ ## Setup ### 1. Create and Activate Virtual Environment + +Run these from the `scripts/lerobot_conversion` directory (it has its own +`pyproject.toml`; installing from the repo root would install the `gr00t` +package instead): ```bash +cd scripts/lerobot_conversion uv venv source .venv/bin/activate uv pip install -e . --verbose diff --git a/scripts/lerobot_conversion/convert_v3_to_v2.py b/scripts/lerobot_conversion/convert_v3_to_v2.py index 46750760c..0d6dc84ef 100644 --- a/scripts/lerobot_conversion/convert_v3_to_v2.py +++ b/scripts/lerobot_conversion/convert_v3_to_v2.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + """Utilities to convert a LeRobot dataset from codebase version v3.0 back to v2.1. Usage examples @@ -31,22 +46,31 @@ if __package__ is None or __package__ == "": sys.path.append(str(Path(__file__).resolve().parents[3])) -from lerobot.datasets.utils import ( - DEFAULT_CHUNK_SIZE, - DEFAULT_DATA_PATH, - DEFAULT_VIDEO_PATH, - EPISODES_DIR, - LEGACY_EPISODES_PATH, - LEGACY_EPISODES_STATS_PATH, - LEGACY_TASKS_PATH, - load_info, - load_tasks, - serialize_dict, - unflatten_dict, - write_info, -) -from lerobot.utils.constants import HF_LEROBOT_HOME -from lerobot.utils.utils import init_logging +try: + from lerobot.datasets.utils import ( + DEFAULT_CHUNK_SIZE, + DEFAULT_DATA_PATH, + DEFAULT_VIDEO_PATH, + EPISODES_DIR, + LEGACY_EPISODES_PATH, + LEGACY_EPISODES_STATS_PATH, + LEGACY_TASKS_PATH, + load_info, + load_tasks, + serialize_dict, + unflatten_dict, + write_info, + ) + from lerobot.utils.constants import HF_LEROBOT_HOME + from lerobot.utils.utils import init_logging +except ModuleNotFoundError as exc: + if exc.name is not None and (exc.name == "lerobot" or exc.name.startswith("lerobot.")): + raise ModuleNotFoundError( + "LeRobot conversion uses its own subproject environment. Run " + "`cd scripts/lerobot_conversion && uv venv && source .venv/bin/activate && " + "uv pip install -e . --verbose`, then execute `python convert_v3_to_v2.py ...`." + ) from None + raise V21 = "v2.1" diff --git a/scripts/lerobot_conversion/pyproject.toml b/scripts/lerobot_conversion/pyproject.toml index 73a5a58ce..11c72c70b 100644 --- a/scripts/lerobot_conversion/pyproject.toml +++ b/scripts/lerobot_conversion/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "lerobot_conversion" version = "0.1.0" -requires-python = ">=3.10" +requires-python = ">=3.10,<3.12" dependencies = [ "huggingface_hub", diff --git a/scripts/patch_triton_cuda13.sh b/scripts/patch_triton_cuda13.sh new file mode 100755 index 000000000..52f2db39a --- /dev/null +++ b/scripts/patch_triton_cuda13.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# Patch Triton 3.3.1 to recognize CUDA major version 13+. +# PyTorch 2.7 pins Triton to 3.3.1, which does not handle CUDA 13.x, +# causing a RuntimeError in ptx_get_version(). This script: +# 1. Patches compiler.py directly (works until uv reinstalls triton). +# 2. Installs a .pth file that monkey-patches triton at Python startup, +# so the fix survives `uv run` reinstalls. +# +# Usage: +# bash scripts/patch_triton_cuda13.sh # auto-detect site-packages +# bash scripts/patch_triton_cuda13.sh /path/to/compiler.py # explicit path + +set -euo pipefail + +if [ $# -ge 1 ]; then + COMPILER_PY="$1" +else + COMPILER_PY="$(python -c "import triton.backends.nvidia.compiler as c; print(c.__file__)")" +fi + +if [ ! -f "$COMPILER_PY" ]; then + echo "ERROR: Cannot find Triton compiler.py at: $COMPILER_PY" >&2 + exit 1 +fi + +# --- Step 1: File-level patch (best-effort, may be overwritten by uv) --- + +if grep -q 'major == 13' "$COMPILER_PY"; then + echo "Triton compiler.py already patched for CUDA 13.x" +else + if ! grep -q 'major == 12' "$COMPILER_PY"; then + echo "ERROR: Cannot find 'major == 12' in $COMPILER_PY — unexpected Triton version?" >&2 + exit 1 + fi + # Insert "if major == 13: return 90 + minor" before the existing "if major == 12:" line. + sed -i '/if major == 12:/i\ if major == 13:' "$COMPILER_PY" + sed -i '/if major == 13:/a\ return 90 + minor' "$COMPILER_PY" + echo "Patched $COMPILER_PY to support CUDA 13.x" +fi + +# --- Step 2: Install .pth startup hook (survives uv reinstalls) --- + +SITE_PACKAGES="$(python -c "import site; print(site.getsitepackages()[0])")" +PTH_FILE="${SITE_PACKAGES}/triton_cuda13_patch.pth" + +cat > "$PTH_FILE" << 'PTHEOF' +import triton_cuda13_patch +PTHEOF + +cat > "${SITE_PACKAGES}/triton_cuda13_patch.py" << 'PYEOF' +"""Monkey-patch Triton to support CUDA 13.x (installed by patch_triton_cuda13.sh).""" +def _apply(): + try: + from triton.backends.nvidia import compiler as _c + _orig = _c.ptx_get_version + def _patched(cuda_version): + major, minor = map(int, cuda_version.split('.')) + if major == 13: + return 90 + minor + return _orig(cuda_version) + _c.ptx_get_version = _patched + except (ImportError, AttributeError): + pass +_apply() +del _apply +PYEOF + +echo "Installed ${PTH_FILE} (runtime monkey-patch, survives uv reinstalls)" diff --git a/scripts/repair_lerobot_metadata.py b/scripts/repair_lerobot_metadata.py new file mode 100644 index 000000000..8b2af0c4e --- /dev/null +++ b/scripts/repair_lerobot_metadata.py @@ -0,0 +1,354 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Repair LeRobot metadata after downloading a partial or imperfect dataset. + +Some Hugging Face dataset snapshots can contain episode metadata for files that +are not present in the remote repo. This script drops those broken episodes from +``meta/episodes.jsonl``, updates summary fields in ``meta/info.json``, and +regenerates stats for changed datasets. +""" + +from __future__ import annotations + +import argparse +from dataclasses import dataclass +import glob +import json +import os +from pathlib import Path +import tempfile +from typing import Any + + +@dataclass(frozen=True) +class RepairResult: + dataset_path: Path + total_episodes: int + kept_episodes: int + dropped_episodes: int + missing_examples: tuple[str, ...] + changed: bool + + +def _read_json(path: Path) -> dict[str, Any]: + with path.open("r", encoding="utf-8") as f: + return json.load(f) + + +def _read_jsonl(path: Path) -> list[dict[str, Any]]: + with path.open("r", encoding="utf-8") as f: + return [json.loads(line) for line in f if line.strip()] + + +def _atomic_write_text(path: Path, text: str) -> None: + tmp: Path | None = None + try: + with tempfile.NamedTemporaryFile( + "w", + dir=path.parent, + prefix=f".{path.name}.", + suffix=".tmp", + delete=False, + encoding="utf-8", + ) as f: + tmp = Path(f.name) + f.write(text) + f.flush() + os.fsync(f.fileno()) + os.replace(tmp, path) + except BaseException: + if tmp is not None: + try: + tmp.unlink() + except OSError: + pass + raise + + +def _write_json(path: Path, payload: dict[str, Any]) -> None: + _atomic_write_text(path, json.dumps(payload, indent=2) + "\n") + + +def _write_jsonl(path: Path, records: list[dict[str, Any]]) -> None: + _atomic_write_text(path, "".join(json.dumps(record) + "\n" for record in records)) + + +def _format_episode_path( + dataset_path: Path, + pattern: str, + *, + chunks_size: int, + episode_index: int, + video_key: str | None = None, + mask_key: str | None = None, +) -> Path: + episode_chunk = episode_index // chunks_size + return dataset_path / pattern.format( + episode_chunk=episode_chunk, + episode_index=episode_index, + video_key=video_key or "", + mask_key=mask_key or "", + ) + + +def _original_keys(modality: dict[str, Any], modality_name: str) -> list[str]: + entries = modality.get(modality_name) or {} + if not isinstance(entries, dict): + return [] + return [ + str(value.get("original_key") or key) + for key, value in entries.items() + if isinstance(value, dict) + ] + + +def _required_episode_files( + dataset_path: Path, + info: dict[str, Any], + modality: dict[str, Any], + episode_index: int, +) -> list[Path]: + chunks_size = int(info["chunks_size"]) + paths = [ + _format_episode_path( + dataset_path, + info["data_path"], + chunks_size=chunks_size, + episode_index=episode_index, + ) + ] + + video_path = info.get("video_path") + if video_path: + paths.extend( + _format_episode_path( + dataset_path, + video_path, + chunks_size=chunks_size, + episode_index=episode_index, + video_key=video_key, + ) + for video_key in _original_keys(modality, "video") + ) + + mask_path = info.get("mask_path") + if mask_path: + paths.extend( + _format_episode_path( + dataset_path, + mask_path, + chunks_size=chunks_size, + episode_index=episode_index, + mask_key=mask_key, + video_key=mask_key, + ) + for mask_key in _original_keys(modality, "mask") + ) + + return paths + + +def _file_index( + dataset_path: Path, roots: tuple[str, ...] = ("data", "videos", "masks") +) -> set[str]: + files: set[str] = set() + for root in roots: + root_path = dataset_path / root + if not root_path.is_dir(): + continue + for path in root_path.rglob("*"): + if path.is_file(): + files.add(path.relative_to(dataset_path).as_posix()) + return files + + +def _missing_required_files( + dataset_path: Path, + info: dict[str, Any], + modality: dict[str, Any], + episode: dict[str, Any], + existing_files: set[str], +) -> list[str]: + episode_index = int(episode["episode_index"]) + missing = [] + for path in _required_episode_files(dataset_path, info, modality, episode_index): + rel = path.relative_to(dataset_path).as_posix() + if rel not in existing_files: + missing.append(rel) + return missing + + +def _update_info( + info: dict[str, Any], episodes: list[dict[str, Any]], modality: dict[str, Any] +) -> dict[str, Any]: + updated = dict(info) + updated["total_episodes"] = len(episodes) + updated["total_frames"] = sum(int(episode.get("length", 0)) for episode in episodes) + if "total_videos" in updated: + updated["total_videos"] = len(episodes) * len(_original_keys(modality, "video")) + if "total_chunks" in updated: + chunks_size = int(updated["chunks_size"]) + updated["total_chunks"] = len( + {int(episode["episode_index"]) // chunks_size for episode in episodes} + ) + if isinstance(updated.get("splits"), dict) and "train" in updated["splits"]: + updated["splits"] = dict(updated["splits"]) + updated["splits"]["train"] = f"0:{len(episodes)}" + return updated + + +def _regenerate_stats(dataset_path: Path, embodiment_tag: str | None) -> None: + from gr00t.data.stats import generate_rel_stats, generate_stats + + stats_path = dataset_path / "meta" / "stats.json" + rel_stats_path = dataset_path / "meta" / "relative_stats.json" + stats_path.unlink(missing_ok=True) + rel_stats_path.unlink(missing_ok=True) + generate_stats(dataset_path) + + if embodiment_tag: + from gr00t.data.embodiment_tags import EmbodimentTag + + generate_rel_stats(dataset_path, EmbodimentTag.resolve(embodiment_tag)) + + +def repair_dataset( + dataset_path: Path, + *, + embodiment_tag: str | None = None, + regenerate_stats: bool = True, + dry_run: bool = False, +) -> RepairResult: + dataset_path = dataset_path.expanduser().resolve() + meta_dir = dataset_path / "meta" + info_path = meta_dir / "info.json" + episodes_path = meta_dir / "episodes.jsonl" + modality_path = meta_dir / "modality.json" + + info = _read_json(info_path) + episodes = _read_jsonl(episodes_path) + modality = _read_json(modality_path) + existing_files = _file_index(dataset_path) + + kept: list[dict[str, Any]] = [] + dropped_episodes: list[dict[str, Any]] = [] + missing_examples: list[str] = [] + for episode in episodes: + missing = _missing_required_files(dataset_path, info, modality, episode, existing_files) + if missing: + dropped_episodes.append(episode) + if len(missing_examples) < 20: + missing_examples.append( + f"episode {episode['episode_index']}: " + ", ".join(missing[:4]) + ) + continue + kept.append(episode) + + dropped = len(episodes) - len(kept) + if dropped == 0: + return RepairResult(dataset_path, len(episodes), len(kept), 0, tuple(), False) + if not kept: + raise RuntimeError( + f"All {len(episodes)} episode(s) in {dataset_path} reference missing files; " + "refusing to write an empty dataset." + ) + + if not dry_run: + updated_info = _update_info(info, kept, modality) + _write_json(info_path, updated_info) + _write_jsonl(episodes_path, kept) + for episode in dropped_episodes: + episode_index = int(episode["episode_index"]) + for path in _required_episode_files(dataset_path, info, modality, episode_index): + path.unlink(missing_ok=True) + if regenerate_stats: + _regenerate_stats(dataset_path, embodiment_tag) + + return RepairResult( + dataset_path, len(episodes), len(kept), dropped, tuple(missing_examples), True + ) + + +def _expand_dataset_args(values: list[str]) -> list[Path]: + paths: list[Path] = [] + for value in values: + for part in value.split(os.pathsep): + part = part.strip() + if not part: + continue + matches = glob.glob(part) + if matches: + paths.extend(Path(match) for match in sorted(matches)) + else: + paths.append(Path(part)) + return paths + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "dataset_paths", + nargs="+", + help="LeRobot dataset path(s). Each arg may also be an os.pathsep-separated list.", + ) + parser.add_argument( + "--embodiment-tag", + default=None, + help="Optional embodiment tag used to regenerate relative stats after repair.", + ) + parser.add_argument( + "--no-regenerate-stats", + action="store_true", + help="Only rewrite metadata; leave stats regeneration to the training pipeline.", + ) + parser.add_argument("--dry-run", action="store_true", help="Report broken episodes only.") + return parser.parse_args() + + +def main() -> None: + args = parse_args() + paths = _expand_dataset_args(args.dataset_paths) + if not paths: + raise SystemExit("No dataset paths provided.") + + had_changes = False + for path in paths: + result = repair_dataset( + path, + embodiment_tag=args.embodiment_tag, + regenerate_stats=not args.no_regenerate_stats, + dry_run=args.dry_run, + ) + had_changes = had_changes or result.changed + if result.changed: + action = "would drop" if args.dry_run else "dropped" + print( + f"{result.dataset_path}: {action} {result.dropped_episodes}/" + f"{result.total_episodes} broken episode(s)" + ) + for missing in result.missing_examples: + print(f" {missing}") + else: + print(f"{result.dataset_path}: metadata already matches available files") + + if args.dry_run and had_changes: + raise SystemExit(1) + + +if __name__ == "__main__": + main() diff --git a/scripts/validate_hf_config_alignment.py b/scripts/validate_hf_config_alignment.py new file mode 100644 index 000000000..bf054d690 --- /dev/null +++ b/scripts/validate_hf_config_alignment.py @@ -0,0 +1,1004 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Validate HuggingFace config alignment against source-of-truth definitions. + +Usage: + # Internal consistency checks only (no HF download required): + uv run python scripts/validate_hf_config_alignment.py + + # Full check with HF configs (requires auth + local dirs): + uv run python scripts/validate_hf_config_alignment.py --hf-config-dir /tmp/hf_configs +""" + +import argparse +import inspect +import json +import math +from pathlib import Path +import re +import sys + + +REPO_ROOT = Path(__file__).resolve().parent.parent + +PASS = "\033[92m✓ PASS\033[0m" +FAIL = "\033[91m✗ FAIL\033[0m" +WARN = "\033[93m⚠ WARN\033[0m" +INFO = "\033[94mℹ INFO\033[0m" +SKIP = "\033[90m⊘ SKIP\033[0m" + +pass_count = 0 +fail_count = 0 +warn_count = 0 +skip_count = 0 + + +def check(condition, msg, *, warn_only=False, skip=False): + global pass_count, fail_count, warn_count, skip_count + if skip: + skip_count += 1 + print(f" {SKIP} {msg}") + return True + if condition: + pass_count += 1 + print(f" {PASS} {msg}") + return True + if warn_only: + warn_count += 1 + print(f" {WARN} {msg}") + return True + fail_count += 1 + print(f" {FAIL} {msg}") + return False + + +def info(msg): + print(f" {INFO} {msg}") + + +# ──────────────────────── Source-of-Truth Loaders ──────────────────────── + + +def load_modality_configs(): + """Load MODALITY_CONFIGS from embodiment_configs.py as serializable dicts.""" + sys.path.insert(0, str(REPO_ROOT)) + from gr00t.configs.data.embodiment_configs import MODALITY_CONFIGS + from gr00t.data.utils import to_json_serializable + + raw = to_json_serializable(MODALITY_CONFIGS) + return raw + + +def load_model_config_defaults(): + """Load Gr00tN1d7Config defaults.""" + sys.path.insert(0, str(REPO_ROOT)) + from gr00t.configs.model.gr00t_n1d7 import Gr00tN1d7Config + + cfg = Gr00tN1d7Config() + return cfg + + +def load_embodiment_tags(): + sys.path.insert(0, str(REPO_ROOT)) + from gr00t.data.embodiment_tags import POSTTRAIN_TAGS, PRETRAIN_TAGS, EmbodimentTag + + return EmbodimentTag, PRETRAIN_TAGS, POSTTRAIN_TAGS + + +def load_projector_index(): + sys.path.insert(0, str(REPO_ROOT)) + from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import EMBODIMENT_TAG_TO_PROJECTOR_INDEX + + return EMBODIMENT_TAG_TO_PROJECTOR_INDEX + + +def load_processor_default_max_action_horizon(): + """Default ``max_action_horizon`` of a directly-constructed Gr00tN1d7Processor.""" + sys.path.insert(0, str(REPO_ROOT)) + from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import Gr00tN1d7Processor + + processor_max = ( + inspect.signature(Gr00tN1d7Processor.__init__).parameters["max_action_horizon"].default + ) + assert processor_max is not inspect.Parameter.empty, ( + "Gr00tN1d7Processor.__init__ max_action_horizon has no default" + ) + return processor_max + + +# ──────────────────────── HF Model Definitions ──────────────────────── + +HF_MODELS = { + "GR00T-N1.7-3B": { + "hf_id": "nvidia/GR00T-N1.7-3B", + "type": "base", + "embodiment_tags": [ + "oxe_droid_relative_eef_relative_joint", + "xdof_relative_eef_relative_joint", + "xdof_relative_eef_relative_joint_subtask", + "real_g1_relative_eef_relative_joints", + "real_r1_pro_sharpa_relative_eef", + "real_r1_pro_sharpa_relative_eef_human", + "real_r1_pro_sharpa_relative_eef_maxinsights", + "real_r1_pro_sharpa_relative_eef_mecka", + ], + "subdir": None, + }, + "GR00T-N1.7-DROID": { + "hf_id": "nvidia/GR00T-N1.7-DROID", + "type": "finetuned", + "embodiment_tags": ["oxe_droid_relative_eef_relative_joint"], + "subdir": None, + }, + "GR00T-N1.7-LIBERO": { + "hf_id": "nvidia/GR00T-N1.7-LIBERO", + "type": "finetuned", + "embodiment_tags": ["libero_sim"], + "subdir": "libero_10", + }, + "SimplerEnv-Fractal": { + "hf_id": "nvidia/GR00T-N1.7-SimplerEnv-Fractal", + "type": "finetuned", + "embodiment_tags": ["simpler_env_google"], + "subdir": None, + }, + "SimplerEnv-Bridge": { + "hf_id": "nvidia/GR00T-N1.7-SimplerEnv-Bridge", + "type": "finetuned", + "embodiment_tags": ["simpler_env_widowx"], + "subdir": None, + }, +} + + +# ──────────────────────── Dimension F & Internal Consistency ──────────────────────── + + +def check_dim_f_internal_consistency(): + """Dimension F — Cross-file consistency (source-of-truth only).""" + print("\n" + "=" * 70) + print("DIMENSION F — Internal Source-of-Truth Consistency") + print("=" * 70) + + modality_configs = load_modality_configs() + model_cfg = load_model_config_defaults() + EmbodimentTag, PRETRAIN_TAGS, _ = load_embodiment_tags() + projector_index = load_projector_index() + + # F3: action horizon ≤ model max + print("\n[F3] Action horizon ≤ model max capacity") + # Two distinct bounds: the processor default must fit every in-tree embodiment (it is + # what validate_action_horizons enforces), while model_cfg.action_horizon is the base + # checkpoint's horizon and so only bounds pretrain tags — posttrain / finetune-only + # tags are trained under their own model config. + processor_max = load_processor_default_max_action_horizon() + pretrain_tag_values = {t.value for t in PRETRAIN_TAGS} + for tag, cfg in modality_configs.items(): + actual_horizon = len(cfg["action"]["delta_indices"]) + check( + actual_horizon <= processor_max, + f" {tag}: actual={actual_horizon} ≤ processor default={processor_max}", + ) + if tag in pretrain_tag_values: + check( + actual_horizon <= model_cfg.action_horizon, + f" {tag}: actual={actual_horizon} ≤ base model action_horizon={model_cfg.action_horizon}", + ) + + # F5: EMBODIMENT_TAG_TO_PROJECTOR_INDEX ↔ EmbodimentTag + print("\n[F5] EMBODIMENT_TAG_TO_PROJECTOR_INDEX ↔ EmbodimentTag enum") + for member in EmbodimentTag: + if member.value in modality_configs: + check( + member.value in projector_index, + f" {member.value} in MODALITY_CONFIGS → has projector index: {projector_index.get(member.value, 'MISSING')}", + ) + + all_tag_values = {m.value for m in EmbodimentTag} + for tag in projector_index: + check( + tag in all_tag_values, + f" projector index key '{tag}' → is valid EmbodimentTag value", + ) + + # F6: naming mismatch awareness + print("\n[F6] Known naming mismatches (informational)") + info(f"Model config: action_horizon={model_cfg.action_horizon}") + info("Processor uses: max_action_horizon (same value, different key name)") + info(f"Model config: use_albumentations_transforms={model_cfg.use_albumentations_transforms}") + info("Processor uses: use_albumentations (same semantics, different key name)") + + +def check_dim_e_documentation(): + """Dimension E — README & Documentation Consistency.""" + print("\n" + "=" * 70) + print("DIMENSION E — README & Documentation Consistency") + print("=" * 70) + + EmbodimentTag, PRETRAIN_TAGS, POSTTRAIN_TAGS = load_embodiment_tags() + modality_configs = load_modality_configs() + + # E1: Checkpoint table in README.md + print("\n[E1] Checkpoint table in README.md") + readme = (REPO_ROOT / "README.md").read_text() + for model_name, model_info in HF_MODELS.items(): + check( + model_info["hf_id"] in readme, + f" {model_info['hf_id']} found in README.md", + ) + + # E2: --embodiment-tag in example commands uses enum NAMES + print("\n[E2] --embodiment-tag uses enum NAMES in example commands") + example_readmes = { + "DROID": REPO_ROOT / "examples/DROID/README.md", + "LIBERO": REPO_ROOT / "examples/LIBERO/README.md", + "SimplerEnv": REPO_ROOT / "examples/SimplerEnv/README.md", + } + tag_name_to_value = {m.name: m.value for m in EmbodimentTag} + + for name, path in example_readmes.items(): + if not path.exists(): + check(False, f" {path} exists", skip=True) + continue + content = path.read_text() + tags_in_commands = re.findall(r"--embodiment-tag\s+(\S+)", content) + for tag in tags_in_commands: + is_enum_name = tag in tag_name_to_value + is_enum_value = tag in {m.value for m in EmbodimentTag} + check( + is_enum_name, + f" {name}: --embodiment-tag {tag} is valid enum NAME" + + (" (used value instead of name)" if is_enum_value and not is_enum_name else ""), + ) + + # E4: DROID modality table + print("\n[E4] DROID modality table matches MODALITY_CONFIGS") + droid_readme = (REPO_ROOT / "examples/DROID/README.md").read_text() + droid_cfg = modality_configs.get("oxe_droid_relative_eef_relative_joint", {}) + if droid_cfg: + for vkey in droid_cfg["video"]["modality_keys"]: + check(vkey in droid_readme, f" Video key '{vkey}' mentioned in DROID README") + for skey in droid_cfg["state"]["modality_keys"]: + check(skey in droid_readme, f" State key '{skey}' mentioned in DROID README") + check( + "17D" in droid_readme or "17d" in droid_readme.lower(), + " 17D dimension mentioned in DROID README", + warn_only=True, + ) + + # E5: Example modality.json files match MODALITY_CONFIGS + print("\n[E5] Example modality.json ↔ MODALITY_CONFIGS key consistency") + modality_json_map = { + "simpler_env_google": REPO_ROOT / "examples/SimplerEnv/fractal_modality.json", + "simpler_env_widowx": REPO_ROOT / "examples/SimplerEnv/bridge_modality.json", + "libero_sim": REPO_ROOT / "examples/LIBERO/modality.json", + } + for tag, json_path in modality_json_map.items(): + if not json_path.exists(): + check(False, f" {json_path} exists", skip=True) + continue + with open(json_path) as f: + mj = json.load(f) + code_cfg = modality_configs.get(tag, {}) + if not code_cfg: + check(False, f" {tag} in MODALITY_CONFIGS") + continue + + mj_state_keys = list(mj.get("state", {}).keys()) + code_state_keys = code_cfg["state"]["modality_keys"] + check( + mj_state_keys == code_state_keys, + f" {tag} state keys: modality.json={mj_state_keys} vs code={code_state_keys}", + ) + + mj_action_keys = list(mj.get("action", {}).keys()) + code_action_keys = code_cfg["action"]["modality_keys"] + check( + mj_action_keys == code_action_keys, + f" {tag} action keys: modality.json={mj_action_keys} vs code={code_action_keys}", + ) + + mj_video_keys = list(mj.get("video", {}).keys()) + code_video_keys = code_cfg["video"]["modality_keys"] + check( + mj_video_keys == code_video_keys, + f" {tag} video keys: modality.json={mj_video_keys} vs code={code_video_keys}", + ) + + # E7: --action-horizon in commands + print("\n[E7] --action-horizon in commands ≤ embodiment actual horizon") + for name, path in example_readmes.items(): + if not path.exists(): + continue + content = path.read_text() + horizons = re.findall(r"--action-horizon\s+(\d+)", content) + for h in horizons: + info(f" {name}: --action-horizon {h} found in commands") + + +def check_dim_f2_modality_json(): + """Dimension F2 — MODALITY_CONFIGS ↔ examples/*/modality.json.""" + print("\n" + "=" * 70) + print("DIMENSION F2 — MODALITY_CONFIGS ↔ modality.json Structural Check") + print("=" * 70) + + modality_configs = load_modality_configs() + modality_json_files = { + "simpler_env_google": REPO_ROOT / "examples/SimplerEnv/fractal_modality.json", + "simpler_env_widowx": REPO_ROOT / "examples/SimplerEnv/bridge_modality.json", + "libero_sim": REPO_ROOT / "examples/LIBERO/modality.json", + } + + for tag, json_path in modality_json_files.items(): + print(f"\n [{tag}]") + if not json_path.exists(): + check(False, f" {json_path.name} exists", skip=True) + continue + with open(json_path) as f: + mj = json.load(f) + + code_cfg = modality_configs[tag] + code_state_count = len(code_cfg["state"]["modality_keys"]) + mj_state_count = len(mj.get("state", {})) + check( + code_state_count == mj_state_count, + f" State key count: code={code_state_count} vs modality.json={mj_state_count}", + ) + + code_action_count = len(code_cfg["action"]["modality_keys"]) + mj_action_count = len(mj.get("action", {})) + check( + code_action_count == mj_action_count, + f" Action key count: code={code_action_count} vs modality.json={mj_action_count}", + ) + + +# ──────────────────────── Dimension J — Enum Serialization ──────────────────────── + + +def check_dim_j_enum_serialization(): + """Dimension J — Verify enum serialization uses names not values.""" + print("\n" + "=" * 70) + print("DIMENSION J — Enum Serialization Format (code-level)") + print("=" * 70) + + modality_configs = load_modality_configs() + valid_rep_names = {"RELATIVE", "ABSOLUTE"} + valid_type_names = {"EEF", "NON_EEF"} + valid_format_names = {"DEFAULT", "XYZ_ROT6D", "ROTATION_6D", "SCALAR"} + + for tag, cfg in modality_configs.items(): + action_configs = cfg.get("action", {}).get("action_configs") + if not action_configs: + continue + print(f"\n [{tag}]") + for i, ac in enumerate(action_configs): + rep = ac.get("rep") + atype = ac.get("type") + afmt = ac.get("format") + check( + rep in valid_rep_names, + f" action_configs[{i}].rep = '{rep}' (valid name: {rep in valid_rep_names})", + ) + check( + atype in valid_type_names, + f" action_configs[{i}].type = '{atype}' (valid name: {atype in valid_type_names})", + ) + if afmt: + check( + afmt in valid_format_names, + f" action_configs[{i}].format = '{afmt}' (valid name: {afmt in valid_format_names})", + ) + + +# ──────────────────────── HF Config Checks (require downloads) ──────────────────────── + + +def load_hf_json(base_dir, model_name, filename, subdir=None): + model_dir = Path(base_dir) / model_name + if subdir: + model_dir = model_dir / subdir + path = model_dir / filename + if not path.exists(): + return None + with open(path) as f: + return json.load(f) + + +def check_dim_a_processor_config(hf_dir, model_name, model_def): + """Dimension A — processor_config.json checks for a single model.""" + print(f"\n--- {model_name} ---") + pc = load_hf_json(hf_dir, model_name, "processor_config.json", model_def.get("subdir")) + if pc is None: + check(False, "processor_config.json found", skip=True) + return + + modality_configs = load_modality_configs() + + # A10: processor_class + check( + pc.get("processor_class") == "Gr00tN1d7Processor", + f"[A10] processor_class = '{pc.get('processor_class')}' (expected 'Gr00tN1d7Processor')", + ) + + pk = pc.get("processor_kwargs", {}) + + # A1: modality_configs top-level keys + hf_modality_keys = list(pk.get("modality_configs", {}).keys()) + for expected_tag in model_def["embodiment_tags"]: + check( + expected_tag in hf_modality_keys, + f"[A1] modality_configs contains '{expected_tag}'", + ) + + # Per-tag modality checks + for tag in model_def["embodiment_tags"]: + hf_mc = pk.get("modality_configs", {}).get(tag) + code_mc = modality_configs.get(tag) + if not hf_mc: + check(False, f"[A1] {tag} present in HF modality_configs") + continue + if not code_mc: + info(f" {tag} not in code MODALITY_CONFIGS (pretrain-only tag, expected)") + continue + + # A2: video.delta_indices + check( + hf_mc["video"]["delta_indices"] == code_mc["video"]["delta_indices"], + f"[A2] {tag} video.delta_indices: HF={hf_mc['video']['delta_indices']} vs code={code_mc['video']['delta_indices']}", + ) + + # A3: video.modality_keys count + hf_vkeys = hf_mc["video"]["modality_keys"] + code_vkeys = code_mc["video"]["modality_keys"] + check( + len(hf_vkeys) == len(code_vkeys), + f"[A3] {tag} video key count: HF={len(hf_vkeys)} ({hf_vkeys}) vs code={len(code_vkeys)} ({code_vkeys})", + ) + + # A4: state.delta_indices + check( + hf_mc["state"]["delta_indices"] == code_mc["state"]["delta_indices"], + f"[A4] {tag} state.delta_indices: HF={hf_mc['state']['delta_indices']} vs code={code_mc['state']['delta_indices']}", + ) + + # A5: state.modality_keys + check( + hf_mc["state"]["modality_keys"] == code_mc["state"]["modality_keys"], + f"[A5] {tag} state.modality_keys match", + ) + + # A6: action.delta_indices + check( + hf_mc["action"]["delta_indices"] == code_mc["action"]["delta_indices"], + f"[A6] {tag} action.delta_indices: HF len={len(hf_mc['action']['delta_indices'])} vs code len={len(code_mc['action']['delta_indices'])}", + ) + + # A7: action.modality_keys + check( + hf_mc["action"]["modality_keys"] == code_mc["action"]["modality_keys"], + f"[A7] {tag} action.modality_keys match", + ) + + # A8: action.action_configs + hf_ac = hf_mc["action"].get("action_configs") + code_ac = code_mc["action"].get("action_configs") + if code_ac: + check( + hf_ac is not None, + f"[A8] {tag} action.action_configs present in HF", + ) + if hf_ac: + check( + len(hf_ac) == len(code_ac), + f"[A8] {tag} action_configs count: HF={len(hf_ac)} vs code={len(code_ac)}", + ) + for i, (h, c) in enumerate(zip(hf_ac, code_ac)): + for field in ("rep", "type", "format"): + check( + h.get(field) == c.get(field), + f"[A8] {tag} action_configs[{i}].{field}: HF={h.get(field)} vs code={c.get(field)}", + ) + + # A9: language.modality_keys + check( + hf_mc["language"]["modality_keys"] == code_mc["language"]["modality_keys"], + f"[A9] {tag} language.modality_keys match", + ) + + # A11-A31: scalar parameters + scalar_checks = { + "max_state_dim": ("A11", None), + "max_action_dim": ("A12", None), + "max_action_horizon": ("A13", None), + "model_name": ("A14", "nvidia/Cosmos-Reason2-2B"), + "model_type": ("A15", "qwen"), + "use_percentiles": ("A16", None), + "apply_sincos_state_encoding": ("A17", None), + "use_relative_action": ("A18", None), + "formalize_language": ("A19", True), + "clip_outliers": ("A20", True), + "use_mean_std": ("A21", False), + "letter_box_transform": ("A22", None), + "exclude_state": ("A23", None), + "state_dropout_prob": ("A24", None), + "image_crop_size": ("A25", None), + "image_target_size": ("A26", None), + "shortest_image_edge": ("A27", 256), + "crop_fraction": ("A28", 0.95), + "use_albumentations": ("A29", None), + "random_rotation_angle": ("A30", None), + "color_jitter_params": ("A31", None), + } + for field, (item_id, expected) in scalar_checks.items(): + actual = pk.get(field) + if expected is not None: + check( + actual == expected, + f"[{item_id}] {field}: HF={actual!r} (expected {expected!r})", + ) + else: + info(f"[{item_id}] {field} = {actual!r}") + + +def check_dim_b_config_json(hf_dir, model_name, model_def): + """Dimension B — config.json checks for a single model.""" + print(f"\n--- {model_name} ---") + cfg = load_hf_json(hf_dir, model_name, "config.json", model_def.get("subdir")) + if cfg is None: + check(False, "config.json found", skip=True) + return + + model_cfg = load_model_config_defaults() + + b_checks = { + "B1": ("model_type", "Gr00tN1d7"), + "B2": ("max_state_dim", None), + "B3": ("max_action_dim", None), + "B4": ("action_horizon", model_cfg.action_horizon), + "B5": ("backbone_embedding_dim", model_cfg.backbone_embedding_dim), + "B6": ("hidden_size", model_cfg.hidden_size), + "B7": ("input_embedding_dim", model_cfg.input_embedding_dim), + "B11": ("num_inference_timesteps", model_cfg.num_inference_timesteps), + "B12": ("max_num_embodiments", model_cfg.max_num_embodiments), + "B13": ("model_name", "nvidia/Cosmos-Reason2-2B"), + "B14": ("select_layer", model_cfg.select_layer), + "B15": ("state_history_length", model_cfg.state_history_length), + "B16": ("noise_beta_alpha", model_cfg.noise_beta_alpha), + "B17": ("noise_beta_beta", model_cfg.noise_beta_beta), + "B18": ("noise_s", model_cfg.noise_s), + "B19": ("num_timestep_buckets", model_cfg.num_timestep_buckets), + "B20": ("add_pos_embed", model_cfg.add_pos_embed), + "B21": ("attn_dropout", model_cfg.attn_dropout), + "B22": ("use_vlln", model_cfg.use_vlln), + "B23": ("max_seq_len", model_cfg.max_seq_len), + "B24": ("use_alternate_vl_dit", model_cfg.use_alternate_vl_dit), + "B25": ("attend_text_every_n_blocks", model_cfg.attend_text_every_n_blocks), + "B27": ("backbone_model_type", model_cfg.backbone_model_type), + "B28": ("reproject_vision", model_cfg.reproject_vision), + "B29": ("use_percentiles", model_cfg.use_percentiles), + "B30": ("use_relative_action", model_cfg.use_relative_action), + } + + for item_id, (field, expected) in b_checks.items(): + actual = cfg.get(field) + if expected is not None: + check( + actual == expected, + f"[{item_id}] {field}: HF={actual!r} (expected {expected!r})", + ) + else: + info(f"[{item_id}] {field} = {actual!r}") + + # B8-B10: diffusion_model_cfg nested + diff_cfg = cfg.get("diffusion_model_cfg", {}) + check( + diff_cfg.get("num_layers") == 16, + f"[B8] diffusion_model_cfg.num_layers: {diff_cfg.get('num_layers')} (expected 16)", + ) + check( + diff_cfg.get("num_attention_heads") == 32, + f"[B9] diffusion_model_cfg.num_attention_heads: {diff_cfg.get('num_attention_heads')} (expected 32)", + ) + check( + diff_cfg.get("attention_head_dim") == 48, + f"[B10] diffusion_model_cfg.attention_head_dim: {diff_cfg.get('attention_head_dim')} (expected 48)", + ) + + # I4: No internal/legacy field names + legacy_fields = ["vlm_model_path", "GrootN1d7"] + for lf in legacy_fields: + check(lf not in cfg, f"[I4] No legacy field '{lf}' in config.json") + + # B26 / I2: torch_dtype + dtype_val = cfg.get("torch_dtype") or cfg.get("model_dtype") + info(f"[B26/I2] torch_dtype/model_dtype = {dtype_val!r}") + + # I1: architectures + archs = cfg.get("architectures") + if archs is not None: + check( + "Gr00tN1d7" in archs, + f"[I1] architectures contains 'Gr00tN1d7': {archs}", + ) + else: + info("[I1] 'architectures' field not present") + + +def check_dim_c_embodiment_id(hf_dir, model_name, model_def): + """Dimension C — embodiment_id.json checks.""" + print(f"\n--- {model_name} ---") + eid = load_hf_json(hf_dir, model_name, "embodiment_id.json", model_def.get("subdir")) + if eid is None: + check(False, "embodiment_id.json found", skip=True) + return + + projector_index = load_projector_index() + + # C1: all entries match code + for tag, idx in eid.items(): + code_idx = projector_index.get(tag) + if code_idx is not None: + check( + idx == code_idx, + f"[C1] {tag}: HF={idx} vs code={code_idx}", + ) + else: + check( + False, f"[C1] {tag} not in code EMBODIMENT_TAG_TO_PROJECTOR_INDEX", warn_only=True + ) + + # C2: pretrain tags present (derived from source of truth) + _, PRETRAIN_TAGS, _ = load_embodiment_tags() + pretrain_tag_values = [t.value for t in PRETRAIN_TAGS] + for pt in pretrain_tag_values: + check( + pt in eid, + f"[C2] Pretrain tag '{pt}' present in embodiment_id.json", + ) + + +def check_dim_d_statistics(hf_dir, model_name, model_def): + """Dimension D — statistics.json checks.""" + print(f"\n--- {model_name} ---") + stats = load_hf_json(hf_dir, model_name, "statistics.json", model_def.get("subdir")) + pc = load_hf_json(hf_dir, model_name, "processor_config.json", model_def.get("subdir")) + if stats is None: + check(False, "statistics.json found", skip=True) + return + + pk = pc.get("processor_kwargs", {}) if pc else {} + use_percentiles = pk.get("use_percentiles", True) + + for tag in model_def["embodiment_tags"]: + tag_stats = stats.get(tag) + check(tag_stats is not None, f"[D1] Top-level key '{tag}' in statistics.json") + if not tag_stats: + continue + + # D2: state/action sub-dicts + check("state" in tag_stats, f"[D2] {tag} has 'state' sub-dict") + check("action" in tag_stats, f"[D2] {tag} has 'action' sub-dict") + + # D3: modality key coverage + hf_mc = pk.get("modality_configs", {}).get(tag, {}) + for modality in ("state", "action"): + if modality not in tag_stats or modality not in hf_mc: + continue + expected_keys = hf_mc[modality].get("modality_keys", []) + actual_keys = list(tag_stats[modality].keys()) + for ek in expected_keys: + check( + ek in actual_keys, + f"[D3] {tag}/{modality}: key '{ek}' in statistics", + ) + + # D4: normalization fields + for modality in ("state", "action"): + if modality not in tag_stats: + continue + for key, key_stats in tag_stats[modality].items(): + check( + "min" in key_stats and "max" in key_stats, + f"[D4] {tag}/{modality}/{key}: has min/max", + ) + if use_percentiles: + has_pct = "q01" in key_stats or "p01" in key_stats + check( + has_pct, + f"[D4] {tag}/{modality}/{key}: has percentile fields (use_percentiles={use_percentiles})", + ) + + # D6: No NaN/Inf + def check_finite(obj, path=""): + if isinstance(obj, dict): + for k, v in obj.items(): + check_finite(v, f"{path}/{k}") + elif isinstance(obj, list): + for i, v in enumerate(obj): + if isinstance(v, (int, float)): + check( + math.isfinite(v), + f"[D6] {path}[{i}] = {v} is finite", + ) + elif isinstance(obj, (int, float)): + check(math.isfinite(obj), f"[D6] {path} = {obj} is finite") + + check_finite(tag_stats, f"{tag}") + + +def check_dim_f1_cross_file(hf_dir, model_name, model_def): + """Dimension F1 — config.json ↔ processor_config.json agreement.""" + print(f"\n--- {model_name} ---") + cfg = load_hf_json(hf_dir, model_name, "config.json", model_def.get("subdir")) + pc = load_hf_json(hf_dir, model_name, "processor_config.json", model_def.get("subdir")) + if cfg is None or pc is None: + check(False, "Both config.json and processor_config.json found", skip=True) + return + + pk = pc.get("processor_kwargs", {}) + + # F1: max_state_dim, max_action_dim, action_horizon + check( + cfg.get("max_state_dim") == pk.get("max_state_dim"), + f"[F1] max_state_dim: config.json={cfg.get('max_state_dim')} vs processor={pk.get('max_state_dim')}", + ) + check( + cfg.get("max_action_dim") == pk.get("max_action_dim"), + f"[F1] max_action_dim: config.json={cfg.get('max_action_dim')} vs processor={pk.get('max_action_dim')}", + ) + check( + cfg.get("action_horizon") == pk.get("max_action_horizon"), + f"[F1] action_horizon={cfg.get('action_horizon')} vs max_action_horizon={pk.get('max_action_horizon')}", + ) + + # F7: use_percentiles, use_relative_action + check( + cfg.get("use_percentiles") == pk.get("use_percentiles"), + f"[F7] use_percentiles: config.json={cfg.get('use_percentiles')} vs processor={pk.get('use_percentiles')}", + ) + check( + cfg.get("use_relative_action") == pk.get("use_relative_action"), + f"[F7] use_relative_action: config.json={cfg.get('use_relative_action')} vs processor={pk.get('use_relative_action')}", + ) + + # B13 cross: model_name + check( + cfg.get("model_name") == pk.get("model_name"), + f"[B13] model_name: config.json={cfg.get('model_name')} vs processor={pk.get('model_name')}", + ) + + +# ──────────────────────── Test Fixture Check ──────────────────────── + + +def check_test_fixture(): + """Check the test fixture processor_config against source of truth.""" + print("\n" + "=" * 70) + print("TEST FIXTURE — tests/fixtures/processor_config/ Check") + print("=" * 70) + + fixture_dir = REPO_ROOT / "tests/fixtures/processor_config" + pc_path = fixture_dir / "processor_config.json" + eid_path = fixture_dir / "embodiment_id.json" + stats_path = fixture_dir / "statistics.json" + + if not pc_path.exists(): + check(False, "Test fixture processor_config.json exists", skip=True) + return + + with open(pc_path) as f: + pc = json.load(f) + if not eid_path.exists(): + check(False, "Test fixture embodiment_id.json exists", skip=True) + return + with open(eid_path) as f: + eid = json.load(f) + if not stats_path.exists(): + check(False, "Test fixture statistics.json exists", skip=True) + return + with open(stats_path) as f: + stats = json.load(f) + + modality_configs = load_modality_configs() + model_cfg = load_model_config_defaults() + projector_index = load_projector_index() + + pk = pc.get("processor_kwargs", {}) + + # processor_class + check( + pc.get("processor_class") == "Gr00tN1d7Processor", + f"processor_class = '{pc.get('processor_class')}'", + ) + + # modality_configs: libero_sim + hf_mc = pk.get("modality_configs", {}).get("libero_sim") + code_mc = modality_configs.get("libero_sim") + check(hf_mc is not None, "modality_configs contains 'libero_sim'") + + if hf_mc and code_mc: + # video delta_indices + check( + hf_mc["video"]["delta_indices"] == code_mc["video"]["delta_indices"], + f"video.delta_indices: fixture={hf_mc['video']['delta_indices']} vs code={code_mc['video']['delta_indices']}", + ) + # video key count + check( + len(hf_mc["video"]["modality_keys"]) == len(code_mc["video"]["modality_keys"]), + f"video key count: fixture={len(hf_mc['video']['modality_keys'])} vs code={len(code_mc['video']['modality_keys'])}", + ) + # state keys + check( + hf_mc["state"]["modality_keys"] == code_mc["state"]["modality_keys"], + "state.modality_keys match", + ) + # action delta_indices + check( + hf_mc["action"]["delta_indices"] == code_mc["action"]["delta_indices"], + f"action.delta_indices: fixture len={len(hf_mc['action']['delta_indices'])} vs code len={len(code_mc['action']['delta_indices'])}", + ) + # action keys + check( + hf_mc["action"]["modality_keys"] == code_mc["action"]["modality_keys"], + "action.modality_keys match", + ) + # language keys + check( + hf_mc["language"]["modality_keys"] == code_mc["language"]["modality_keys"], + "language.modality_keys match", + ) + + # Scalar params — notable mismatches to flag + print("\n Scalar Parameter Comparison (fixture vs model config defaults):") + info( + f"max_state_dim: fixture={pk.get('max_state_dim')} vs model_cfg default={model_cfg.max_state_dim}" + ) + info( + f"max_action_dim: fixture={pk.get('max_action_dim')} vs model_cfg default={model_cfg.max_action_dim}" + ) + info( + f"max_action_horizon: fixture={pk.get('max_action_horizon')} vs model_cfg.action_horizon={model_cfg.action_horizon}" + ) + info( + f"use_percentiles: fixture={pk.get('use_percentiles')} vs model_cfg={model_cfg.use_percentiles}" + ) + info( + f"apply_sincos_state_encoding: fixture={pk.get('apply_sincos_state_encoding')} vs model_cfg={model_cfg.apply_sincos_state_encoding}" + ) + info( + f"use_relative_action: fixture={pk.get('use_relative_action')} vs model_cfg={model_cfg.use_relative_action}" + ) + + # Check missing fields (new fields added to save_pretrained) + expected_fields = [ + "letter_box_transform", + "exclude_state", + "state_dropout_prob", + "use_mean_std", + ] + print("\n New Fields Check (may be missing in older fixtures):") + for field in expected_fields: + present = field in pk + check(present, f"Field '{field}' present in fixture processor_config", warn_only=True) + + # embodiment_id.json + print("\n Embodiment ID Check:") + for tag, idx in eid.items(): + code_idx = projector_index.get(tag) + check( + code_idx is not None and idx == code_idx, + f" {tag}: fixture={idx} vs code={code_idx}", + ) + + # statistics.json structure + print("\n Statistics Structure Check:") + for tag in pk.get("modality_configs", {}).keys(): + check(tag in stats, f" statistics.json has key '{tag}'") + if tag in stats: + check("state" in stats[tag], f" {tag}/state present") + check("action" in stats[tag], f" {tag}/action present") + + +# ──────────────────────── Main ──────────────────────── + + +def main(): + parser = argparse.ArgumentParser(description="Validate HF config alignment") + parser.add_argument( + "--hf-config-dir", + type=str, + default=None, + help="Directory containing downloaded HF configs (subdirs per model)", + ) + args = parser.parse_args() + + print("╔" + "═" * 68 + "╗") + print("║ HuggingFace Config Alignment Validation ║") + print("╚" + "═" * 68 + "╝") + + # Always run: internal consistency checks + check_dim_f_internal_consistency() + check_dim_e_documentation() + check_dim_f2_modality_json() + check_dim_j_enum_serialization() + check_test_fixture() + + # HF config checks (if directory provided) + if args.hf_config_dir: + hf_dir = Path(args.hf_config_dir) + if not hf_dir.exists(): + print(f"\n[ERROR] HF config directory not found: {hf_dir}") + sys.exit(1) + + for model_name, model_def in HF_MODELS.items(): + print("\n" + "=" * 70) + print(f"DIMENSION A — processor_config.json: {model_name}") + print("=" * 70) + check_dim_a_processor_config(hf_dir, model_name, model_def) + + for model_name, model_def in HF_MODELS.items(): + print("\n" + "=" * 70) + print(f"DIMENSION B — config.json: {model_name}") + print("=" * 70) + check_dim_b_config_json(hf_dir, model_name, model_def) + + for model_name, model_def in HF_MODELS.items(): + print("\n" + "=" * 70) + print(f"DIMENSION C — embodiment_id.json: {model_name}") + print("=" * 70) + check_dim_c_embodiment_id(hf_dir, model_name, model_def) + + for model_name, model_def in HF_MODELS.items(): + print("\n" + "=" * 70) + print(f"DIMENSION D — statistics.json: {model_name}") + print("=" * 70) + check_dim_d_statistics(hf_dir, model_name, model_def) + + for model_name, model_def in HF_MODELS.items(): + print("\n" + "=" * 70) + print(f"DIMENSION F1 — Cross-file: {model_name}") + print("=" * 70) + check_dim_f1_cross_file(hf_dir, model_name, model_def) + else: + print("\n" + "=" * 70) + print("HF CONFIG CHECKS SKIPPED — No --hf-config-dir provided") + print("To run full checks, download HF configs first:") + print(" uv run huggingface-cli login") + print(" # Then download configs for each model (see checklist)") + print( + " uv run python scripts/validate_hf_config_alignment.py --hf-config-dir /tmp/hf_configs" + ) + print("=" * 70) + + # Summary + print("\n" + "=" * 70) + print("SUMMARY") + print("=" * 70) + print(f" {PASS}: {pass_count}") + print(f" {FAIL}: {fail_count}") + print(f" {WARN}: {warn_count}") + print(f" {SKIP}: {skip_count}") + total = pass_count + fail_count + if total > 0: + print(f" Pass rate: {pass_count}/{total} ({100 * pass_count / total:.1f}%)") + + if fail_count > 0: + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/scripts/verify_droid_rotation_correction.py b/scripts/verify_droid_rotation_correction.py new file mode 100644 index 000000000..126fd51a5 --- /dev/null +++ b/scripts/verify_droid_rotation_correction.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +""" +Verify that DROID demo data eef_9d uses the correct rotation convention. + +Computes eef_9d from raw cartesian_position two ways (with and without +DROID_EEF_ROTATION_CORRECT) and compares against the pretrained model's +normalization statistics to determine which convention matches. + +Usage: + python scripts/verify_droid_rotation_correction.py + python scripts/verify_droid_rotation_correction.py --dataset-path demo_data/droid_sample +""" + +from __future__ import annotations + +import argparse +import json +import logging +from pathlib import Path + +from gr00t.data.state_action.droid_frame import DROID_EEF_ROTATION_CORRECT +import numpy as np +from scipy.spatial.transform import Rotation + + +logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") +logger = logging.getLogger(__name__) + +EMBODIMENT_TAG = "oxe_droid_relative_eef_relative_joint" + + +def _euler_to_eef_9d(cartesian_position: np.ndarray, *, apply_correction: bool) -> np.ndarray: + """Convert cartesian_position (XYZ + euler) to eef_9d (XYZ + rot6d).""" + cart = np.asarray(cartesian_position, dtype=np.float64) + xyz = cart[..., :3].reshape(-1, 3) + euler = cart[..., 3:].reshape(-1, 3) + rot = Rotation.from_euler("XYZ", euler).as_matrix() + if apply_correction: + rot = rot @ DROID_EEF_ROTATION_CORRECT + rot6d = rot[:, :2, :].reshape(-1, 6) + return np.concatenate([xyz, rot6d], axis=-1).astype(np.float32) + + +def _load_cartesian_positions(dataset_path: str) -> np.ndarray: + """Load observation.state.cartesian_position from all episode parquets.""" + import pandas as pd + + all_cart = [] + for pq in sorted((Path(dataset_path) / "data").rglob("*.parquet")): + df = pd.read_parquet(pq) + if "observation.state.cartesian_position" in df.columns: + all_cart.append(np.stack(df["observation.state.cartesian_position"].values)) + if not all_cart: + raise RuntimeError("No cartesian_position found in any parquet file") + return np.concatenate(all_cart, axis=0) + + +def _download_eef_stats(hf_repo_id: str) -> dict | None: + """Download statistics.json and extract eef_9d stats for DROID.""" + try: + from huggingface_hub import hf_hub_download + + path = hf_hub_download(repo_id=hf_repo_id, filename="statistics.json") + with open(path) as f: + stats = json.load(f) + for tag_key in [EMBODIMENT_TAG, "default"]: + eef = stats.get(tag_key, {}).get("state", {}).get("eef_9d") + if eef: + return eef + except Exception as e: + logger.warning(f"Could not download statistics from {hf_repo_id}: {e}") + return None + + +def _cosine_similarity(a: np.ndarray, b: np.ndarray) -> float: + denom = np.linalg.norm(a) * np.linalg.norm(b) + return float(np.dot(a, b) / denom) if denom > 0 else 0.0 + + +def verify(dataset_path: str, hf_repo_id: str) -> bool: + """Run the verification. Returns True if with_correction is the better match.""" + logger.info(f"Loading cartesian_position from {dataset_path} ...") + cart = _load_cartesian_positions(dataset_path) + logger.info(f"Loaded {len(cart)} timesteps") + + eef_no_corr = _euler_to_eef_9d(cart, apply_correction=False) + eef_with_corr = _euler_to_eef_9d(cart, apply_correction=True) + + rot6d_diff = np.abs(eef_no_corr[:, 3:] - eef_with_corr[:, 3:]) + if rot6d_diff.max() < 1e-6: + logger.error("Correction matrix has no effect — euler angles may be degenerate") + return False + + logger.info(f"\nComparing against model: {hf_repo_id}") + model_stats = _download_eef_stats(hf_repo_id) + if not model_stats: + logger.error(f"No eef_9d stats found for {hf_repo_id} — cannot verify") + return False + + # --- Cosine similarity of rot6d mean --- + model_mean = np.array(model_stats["mean"]) + cos_no = _cosine_similarity( + np.array([np.mean(eef_no_corr[:, i]) for i in range(3, 9)]), model_mean[3:9] + ) + cos_with = _cosine_similarity( + np.array([np.mean(eef_with_corr[:, i]) for i in range(3, 9)]), model_mean[3:9] + ) + + # --- Per-stat RMSE (rot6d dims only) --- + stat_fns = {"mean": np.mean, "std": np.std, "min": np.min, "max": np.max} + rmse_results: dict[str, tuple[float, float]] = {} + for stat_name, fn in stat_fns.items(): + if stat_name not in model_stats: + continue + model_rot = np.array(model_stats[stat_name])[3:9] + vals_no = np.array([fn(eef_no_corr[:, i]) for i in range(3, 9)]) + vals_with = np.array([fn(eef_with_corr[:, i]) for i in range(3, 9)]) + rmse_results[stat_name] = ( + float(np.sqrt(np.mean((vals_no - model_rot) ** 2))), + float(np.sqrt(np.mean((vals_with - model_rot) ** 2))), + ) + + # --- Print results --- + logger.info("") + logger.info(" Cosine similarity of rot6d mean vs pretrained model:") + logger.info(f" no_correction: {cos_no:+.6f}") + logger.info(f" with_correction: {cos_with:+.6f}") + logger.info("") + logger.info(" RMSE of rot6d stats vs pretrained model (lower = better):") + logger.info(f" {'stat':>5} {'no_correction':>15} {'with_correction':>15} {'winner':>15}") + with_wins = 0 + for stat_name, (rmse_no, rmse_with) in rmse_results.items(): + winner = "with_correction" if rmse_with < rmse_no else "no_correction" + if rmse_with < rmse_no: + with_wins += 1 + logger.info(f" {stat_name:>5} {rmse_no:>15.6f} {rmse_with:>15.6f} {winner:>15}") + + passed = cos_with > cos_no and with_wins >= len(rmse_results) // 2 + logger.info("") + if passed: + logger.info(" RESULT: PASS — with_correction matches the pretrained model better") + else: + logger.info(" RESULT: FAIL — no_correction appears closer (unexpected)") + return passed + + +def main(): + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument( + "--dataset-path", default="demo_data/droid_sample", help="Path to DROID demo dataset" + ) + parser.add_argument( + "--hf-repo-id", + default="nvidia/GR00T-N1.7-3B", + help="HuggingFace model repo to compare against", + ) + args = parser.parse_args() + passed = verify(args.dataset_path, args.hf_repo_id) + raise SystemExit(0 if passed else 1) + + +if __name__ == "__main__": + main() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..467079831 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..fabcd578f --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,135 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Shared pytest configuration.""" + +from __future__ import annotations + +import contextlib +import os +from pathlib import Path +import tempfile + +from filelock import FileLock +import pytest + + +def _pin_xdist_worker_to_gpu() -> None: + """Pin each pytest-xdist worker to a single GPU. + + Runs at conftest import time, which is *before* any test module + (and therefore any ``import torch``) executes inside the worker + subprocess. pytest-xdist exposes the worker id as ``PYTEST_XDIST_WORKER`` + (e.g. ``gw0``, ``gw1``). We map ``gwN`` to the Nth GPU visible to the + parent process so each worker sees exactly one GPU and they don't + contend for memory. + + No-op when running outside xdist (single-process pytest). + """ + worker = os.environ.get("PYTEST_XDIST_WORKER") + if not worker or not worker.startswith("gw"): + return + try: + idx = int(worker[2:]) + except ValueError: + return + + visible = os.environ.get("CUDA_VISIBLE_DEVICES", "") + if visible: + gpus = [g for g in visible.split(",") if g.strip()] + if 0 <= idx < len(gpus): + os.environ["CUDA_VISIBLE_DEVICES"] = gpus[idx] + return + os.environ["CUDA_VISIBLE_DEVICES"] = str(idx) + + +_pin_xdist_worker_to_gpu() + + +def _configure_shared_caches() -> None: + """Set shared cache env vars in os.environ once for the whole test session. + + HF cache dirs are content-addressed, so all test groups safely share one + location. UV_PROJECT_ENVIRONMENT forwards the active venv to uv + subprocesses so ``uv run`` uses the same installed packages as the test + runner. Tests that need an isolated venv (e.g. SO100's lerobot_conversion + step) can strip UV_PROJECT_ENVIRONMENT from their local env dict. + """ + from test_support.runtime import build_shared_hf_cache_env, resolve_shared_uv_cache_dir + + # Single shared HF cache for all test groups. + hf_env = build_shared_hf_cache_env("shared") + os.environ.update(hf_env) + + if hf_env: + print( + f"\n[conftest] shared HF cache: {hf_env.get('HF_HOME', 'default')}", + flush=True, + ) + + uv_cache = resolve_shared_uv_cache_dir() + if uv_cache is not None: + os.environ["UV_CACHE_DIR"] = str(uv_cache) + print(f"[conftest] UV_CACHE_DIR={uv_cache}", flush=True) + + # Forward the active venv to uv subprocesses. + if not os.environ.get("UV_PROJECT_ENVIRONMENT"): + venv = os.environ.get("VIRTUAL_ENV", "") + if venv: + os.environ["UV_PROJECT_ENVIRONMENT"] = venv + print(f"[conftest] UV_PROJECT_ENVIRONMENT={venv}", flush=True) + + +def pytest_configure(config) -> None: # noqa: ARG001 + # Set before any test runs so subprocesses launched via run_bash_blocks / + # uv run inherit it — PYTEST_CURRENT_TEST alone can be cleared by uv. + os.environ["GROOT_PATCH_MISTRAL"] = "1" + os.environ["GROOT_HF_LOCAL_FIRST"] = "1" + os.environ.setdefault("GROOT_SKIP_HF_MODEL_WEIGHTS", "1") + _configure_shared_caches() + + +@pytest.fixture +def serialize_subprocess_spawns(): + """Let only one subprocess-spawning test run at a time, host-wide. + + Under ``-n auto`` every core is already claimed by an xdist worker, so a + test that additionally spawns its own torch-importing processes + oversubscribes the box and can blow its wall-clock timeout. A host-wide + lock serializes such tests across workers; they finish in well under a + second when not starved, so the serialization is effectively free. + """ + lock_path = Path(tempfile.gettempdir()) / "gr00t-test-subprocess-spawn.lock" + with FileLock(str(lock_path)): + yield + + +@pytest.fixture(scope="session") +def load_hf_model_weights(): + """Temporarily opt a test into normal Hugging Face checkpoint weight loading.""" + + @contextlib.contextmanager + def _enabled(): + previous = os.environ.get("GROOT_SKIP_HF_MODEL_WEIGHTS") + os.environ["GROOT_SKIP_HF_MODEL_WEIGHTS"] = "0" + try: + yield + finally: + if previous is None: + os.environ.pop("GROOT_SKIP_HF_MODEL_WEIGHTS", None) + else: + os.environ["GROOT_SKIP_HF_MODEL_WEIGHTS"] = previous + + return _enabled diff --git a/tests/examples/__init__.py b/tests/examples/__init__.py new file mode 100644 index 000000000..fb1fa2579 --- /dev/null +++ b/tests/examples/__init__.py @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Shared helpers and example integration tests.""" diff --git a/tests/examples/test_droid.py b/tests/examples/test_droid.py new file mode 100644 index 000000000..6de423f15 --- /dev/null +++ b/tests/examples/test_droid.py @@ -0,0 +1,189 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import ast +import logging +import os +import pathlib +import subprocess + +from gr00t.data.state_action.droid_frame import DROID_EEF_ROTATION_CORRECT +import numpy as np +import pytest +from test_support.readme import extract_code_blocks, find_block, replace_once, run_bash_blocks +from test_support.runtime import ( + assert_port_available, + get_root, + start_server_process, + timed, + wait_for_server_ready, +) + + +logger = logging.getLogger(__name__) + + +REPO_ROOT = get_root() + +TRAINING_STEPS = 2 + +README = REPO_ROOT / "examples/DROID/README.md" + +MODEL_CHECKPOINT = pathlib.Path(f"/tmp/droid_finetune/checkpoint-{TRAINING_STEPS}") + +DEFAULT_SERVER_STARTUP_SECONDS = 900.0 + + +def _vendored_array_literal(source: str, name: str) -> np.ndarray: + """Extract a ``name = np.array(, ...)`` assignment from source text. + + Parses the AST instead of importing the module: ``main_gr00t.py`` requires + the droid robot stack (cv2, the droid repo, ...) that is not installed in CI. + """ + for node in ast.walk(ast.parse(source)): + if isinstance(node, ast.Assign) and any( + isinstance(t, ast.Name) and t.id == name for t in node.targets + ): + call = node.value + if isinstance(call, ast.Call) and call.args: + return np.asarray(ast.literal_eval(call.args[0]), dtype=np.float64) + raise AssertionError(f"{name} np.array assignment not found in source") + + +def test_droid_eef_rotation_correct_mirror_in_sync() -> None: + """The slim DROID example vendors DROID_EEF_ROTATION_CORRECT because it runs + without the gr00t package; enforce that the mirror matches the canonical.""" + example_src = (REPO_ROOT / "examples/DROID/main_gr00t.py").read_text() + vendored = _vendored_array_literal(example_src, "DROID_EEF_ROTATION_CORRECT") + np.testing.assert_array_equal(vendored, DROID_EEF_ROTATION_CORRECT) + + +@pytest.mark.gpu +@pytest.mark.timeout(1800) +@pytest.mark.parametrize( + "occurrence", + [1, 2], + ids=["base", "finetuned"], +) +def test_droid_readme_server_starts(occurrence: int) -> None: + """Verify the DROID inference server starts and accepts connections.""" + + env = {**os.environ} + blocks = extract_code_blocks(README) + + model_server_host = "127.0.0.1" + model_server_port = 5557 + + server_code = find_block( + blocks, "run_gr00t_server.py", language="bash", occurrence=occurrence + ).code + server_code += f" --device cuda:0 --host {model_server_host} --port {model_server_port}" + + assert_port_available(model_server_host, model_server_port) + model_server_proc, server_log = start_server_process(server_code, cwd=REPO_ROOT, env=env) + try: + wait_for_server_ready( + proc=model_server_proc, + host=model_server_host, + port=model_server_port, + timeout_s=float( + os.getenv("DROID_SERVER_STARTUP_SECONDS", str(DEFAULT_SERVER_STARTUP_SECONDS)) + ), + server_log=server_log, + ) + finally: + if model_server_proc.poll() is None: + model_server_proc.terminate() + try: + model_server_proc.wait(timeout=15) + except subprocess.TimeoutExpired: + model_server_proc.kill() + model_server_proc.wait(timeout=15) + + +@pytest.mark.gpu +@pytest.mark.timeout(1800) +def test_droid_finetune_and_finetuned_server() -> None: + """Run a short DROID finetune, then verify server starts with the finetuned checkpoint.""" + + env = {**os.environ} + blocks = extract_code_blocks(README) + + finetune_code = replace_once( + replace_once( + replace_once( + replace_once( + find_block(blocks, "--output-dir /tmp/droid_finetune", language="bash").code, + "NUM_GPUS=8", + "NUM_GPUS=1", + ), + "MAX_STEPS=20000", + f"MAX_STEPS={TRAINING_STEPS}", + ), + "SAVE_STEPS=1000", + f"SAVE_STEPS={TRAINING_STEPS}", + ), + "GLOBAL_BATCH_SIZE=640", + "GLOBAL_BATCH_SIZE=2", + ) + finetune_code = finetune_code.rstrip() + " -- --skip_weight_loading" + run_bash_blocks( + [finetune_code], + cwd=REPO_ROOT, + env={ + **env, + "USE_WANDB": "0", + "DATALOADER_NUM_WORKERS": "0", + "SHARD_SIZE": "64", + "NUM_SHARDS_PER_EPOCH": "1", + }, + ) + assert MODEL_CHECKPOINT.exists(), ( + f"Expected model checkpoint after finetune: {MODEL_CHECKPOINT}" + ) + + model_server_host = "127.0.0.1" + model_server_port = 5558 + + server_code = replace_once( + find_block(blocks, "nvidia/GR00T-N1.7-DROID", language="bash").code, + "nvidia/GR00T-N1.7-DROID", + str(MODEL_CHECKPOINT), + ) + server_code += f" --device cuda:0 --host {model_server_host} --port {model_server_port}" + + assert_port_available(model_server_host, model_server_port) + model_server_proc, server_log = start_server_process(server_code, cwd=REPO_ROOT, env=env) + try: + with timed("finetuned server startup"): + wait_for_server_ready( + proc=model_server_proc, + host=model_server_host, + port=model_server_port, + timeout_s=float( + os.getenv("DROID_SERVER_STARTUP_SECONDS", str(DEFAULT_SERVER_STARTUP_SECONDS)) + ), + server_log=server_log, + ) + finally: + if model_server_proc.poll() is None: + model_server_proc.terminate() + try: + model_server_proc.wait(timeout=15) + except subprocess.TimeoutExpired: + model_server_proc.kill() + model_server_proc.wait(timeout=15) diff --git a/tests/examples/test_libero.py b/tests/examples/test_libero.py new file mode 100644 index 000000000..4ecfb2704 --- /dev/null +++ b/tests/examples/test_libero.py @@ -0,0 +1,425 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import logging +import os +import pathlib +import shutil +import subprocess +import time + +import pytest +from test_support.readme import extract_code_blocks, find_block, replace_once, run_bash_blocks +from test_support.runtime import ( + DEFAULT_SERVER_STARTUP_SECONDS, + TEST_CACHE_PATH, + assert_port_available, + fast_copy_tree, + find_nvidia_egl_vendor_file, + get_root, + run_subprocess_step, + start_server_process, + timed, + wait_for_server_ready, +) + + +logger = logging.getLogger(__name__) + + +REPO_ROOT = get_root() + +TRAINING_STEPS = 2 + +README = REPO_ROOT / "examples/LIBERO/README.md" + +DATASET_REL_PATH = pathlib.Path("examples/LIBERO/libero_spatial_no_noops_1.0.0_lerobot") +DATASET_ROOT = REPO_ROOT / DATASET_REL_PATH +SHARED_DATASETS_ROOT = TEST_CACHE_PATH / "datasets" + +SHARED_DATASET_ROOT = SHARED_DATASETS_ROOT / DATASET_REL_PATH +MODEL_CHECKPOINT = pathlib.Path(f"/tmp/libero_spatial/checkpoint-{TRAINING_STEPS}") + +LIBERO_REPO_PATH = REPO_ROOT / "external_dependencies/LIBERO" +SHARED_LIBERO_REPO = TEST_CACHE_PATH / "repos/LIBERO" + +LIBERO_UV_ENV = REPO_ROOT / "gr00t/eval/sim/LIBERO/libero_uv" +SHARED_LIBERO_VENV = TEST_CACHE_PATH / "repos/LIBERO/venv" + + +def _libero_submodule_initialized() -> bool: + """Return True when the LIBERO submodule is properly git-initialized.""" + return (LIBERO_REPO_PATH / ".git").is_file() + + +def _git_modules_path(submodule_path: pathlib.Path) -> pathlib.Path | None: + """Resolve the .git/modules/ path from a submodule's .git file.""" + git_file = submodule_path / ".git" + if not git_file.is_file(): + return None + content = git_file.read_text().strip() + if not content.startswith("gitdir:"): + return None + rel = content[len("gitdir:") :].strip() + return (submodule_path / rel).resolve() + + +def _copy_tree_with_timing( + src: pathlib.Path, + dst: pathlib.Path, + label: str, + *, + symlinks: bool = False, +) -> None: + """fast_copy_tree(src → dst) wrapped in `timed(...)` plus a files/s summary. + + Delegates the bulk copy to ``fast_copy_tree``, which streams the tree + through a single ``tar`` pipe instead of paying per-file open/stat/read/ + close NFS round-trips. Job 313566325 observed 3.4 files/s with the + previous ``shutil.copytree`` and timed out; the tar-pipe path collapses + those round-trips into one sequential read. + + File counting is done from the destination after the copy: ``os.walk`` + on the local destination is metadata-cheap, while walking ``src`` over + a contended NFS mount could itself add minutes of stat-bound delay + that would muddy the reported throughput. + """ + with timed(label): + t0 = time.perf_counter() + fast_copy_tree(src, dst, symlinks=symlinks) + elapsed = max(time.perf_counter() - t0, 1e-9) + file_count = sum(len(files) for _, _, files in os.walk(dst)) + print( + f"[libero] {label}: {file_count} files, {file_count / elapsed:.1f} files/s", + flush=True, + ) + + +def _prepare_libero_repo(env: dict[str, str]) -> None: + """Populate external_dependencies/LIBERO, reusing shared cache when available. + + The cache stores both the working tree (which includes the .git pointer file) + and the git modules directory, so that after restore git sees a fully + initialized submodule and ``git submodule update --init`` is a fast no-op. + """ + if _libero_submodule_initialized(): + return + + wt_cache = SHARED_LIBERO_REPO / "wt" + modules_cache = SHARED_LIBERO_REPO / "modules" + + wt_hit = (wt_cache / ".git").is_file() + modules_hit = modules_cache.exists() + cache_hit = wt_hit and modules_hit + print( + f"[libero/3a] cache: wt_hit={wt_hit} modules_hit={modules_hit} hit={cache_hit}", + flush=True, + ) + + if cache_hit: + # Fast path: restore working tree and git modules from cache. + _copy_tree_with_timing(wt_cache, LIBERO_REPO_PATH, "step 3a.hit.1: copy wt cache → repo") + modules_path = _git_modules_path(LIBERO_REPO_PATH) + if modules_path is not None: + modules_path.mkdir(parents=True, exist_ok=True) + _copy_tree_with_timing( + modules_cache, + modules_path, + "step 3a.hit.2: copy modules cache → .git/modules", + ) + return + + # Slow path: git submodule init, then populate cache. + with timed("step 3a.miss.1: git submodule update --init"): + run_subprocess_step( + ["git", "submodule", "update", "--init", "external_dependencies/LIBERO"], + step="libero_repo_init", + cwd=REPO_ROOT, + env=env, + log_prefix="libero", + ) + if TEST_CACHE_PATH.exists(): + modules_path = _git_modules_path(LIBERO_REPO_PATH) + wt_cache.mkdir(parents=True, exist_ok=True) + _copy_tree_with_timing(LIBERO_REPO_PATH, wt_cache, "step 3a.miss.2: cache wt → shared") + if modules_path is not None: + modules_cache.mkdir(parents=True, exist_ok=True) + _copy_tree_with_timing( + modules_path, modules_cache, "step 3a.miss.3: cache modules → shared" + ) + + +def _libero_venv_ready(root: pathlib.Path = LIBERO_UV_ENV) -> bool: + """Return True when the libero uv venv looks usable. + + Two subtleties: + 1. Uses pyvenv.cfg rather than bin/python: uv creates bin/python as a + symlink into /root/.local/share/uv/python/..., which is inaccessible to + non-root callers. Path.is_file() returns False for unreadable symlink + targets, so the caching gate would silently never fire. + 2. Checks for libero-*.dist-info rather than a libero/ source dir: libero + is installed with --config-settings editable_mode=compat, which creates + dist-info + a .pth file but no top-level package directory. + """ + sp = root / ".venv/lib/python3.10/site-packages" + libero_ok = (sp / "libero").is_dir() or any(sp.glob("libero-*.dist-info")) + return (root / ".venv/pyvenv.cfg").is_file() and libero_ok + + +def _prepare_libero_venv(setup_block: str, env: dict[str, str]) -> None: + """Set up the libero sim venv, using shared cache when available. + + setup_libero.sh always rm -rf's the venv before reinstalling, so this + function skips it entirely on a cache hit and only re-runs the fast + register_libero_envs() call that writes $HOME/.libero. + """ + venv_python = str(LIBERO_UV_ENV / ".venv/bin/python") + register_cmd = ( + "import os; os.environ.setdefault('MUJOCO_GL','egl');" + "os.environ.setdefault('PYOPENGL_PLATFORM','egl');" + "from gr00t.eval.sim.LIBERO.libero_env import register_libero_envs;" + "register_libero_envs()" + ) + + local_ready = _libero_venv_ready() + shared_ready = _libero_venv_ready(SHARED_LIBERO_VENV) if not local_ready else False + print(f"[libero/3b] readiness: local={local_ready} shared={shared_ready}", flush=True) + + if local_ready: + print("[libero/3b] venv local hit — skipping setup_libero.sh", flush=True) + elif shared_ready: + LIBERO_UV_ENV.parent.mkdir(parents=True, exist_ok=True) + # Wipe any stale local state from a previous run before copying. + if LIBERO_UV_ENV.is_symlink(): + LIBERO_UV_ENV.unlink() + elif LIBERO_UV_ENV.is_dir(): + shutil.rmtree(LIBERO_UV_ENV) + _copy_tree_with_timing( + SHARED_LIBERO_VENV, + LIBERO_UV_ENV, + "step 3b.hit: copy shared venv → local (avoid NFS-bound imports)", + symlinks=True, + ) + else: + print("[libero/3b] venv cache miss — running setup_libero.sh", flush=True) + with timed("step 3b.miss.1: setup_libero.sh (uv install)"): + run_bash_blocks([setup_block], cwd=REPO_ROOT, env=env) + if TEST_CACHE_PATH.exists() and _libero_venv_ready(): + _copy_tree_with_timing( + LIBERO_UV_ENV, + SHARED_LIBERO_VENV, + "step 3b.miss.2: cache venv → shared", + symlinks=True, + ) + return # setup_libero.sh already ran register_libero_envs + + # Fast path: venv came from cache — just re-register envs (~5 s) + import subprocess as _sp + + with timed("step 3b.hit: register_libero_envs subprocess"): + _sp.run([venv_python, "-c", register_cmd], env=env, check=True, input=b"n\n") + + +def _dataset_ready(dataset_root: pathlib.Path) -> bool: + """Return True when the LIBERO dataset looks complete enough to reuse.""" + modality_path = dataset_root / "meta/modality.json" + videos_dir = dataset_root / "videos" + if not modality_path.is_file() or not videos_dir.is_dir(): + return False + return next(videos_dir.rglob("*.mp4"), None) is not None + + +def _point_repo_dataset_to_shared() -> None: + """Point the repo-local dataset path at the shared cached dataset.""" + if DATASET_ROOT.is_symlink(): + if DATASET_ROOT.resolve() == SHARED_DATASET_ROOT.resolve(): + return + DATASET_ROOT.unlink() + elif DATASET_ROOT.exists(): + # Keep an existing real local dataset intact rather than replacing it. + return + + DATASET_ROOT.parent.mkdir(parents=True, exist_ok=True) + DATASET_ROOT.symlink_to(SHARED_DATASET_ROOT, target_is_directory=True) + + +def _prepare_libero_dataset(blocks: list, env: dict[str, str]) -> None: + """Populate the LIBERO spatial dataset once on shared storage and reuse it.""" + if _dataset_ready(DATASET_ROOT): + return + + if _dataset_ready(SHARED_DATASET_ROOT): + _point_repo_dataset_to_shared() + return + + download_code = find_block( + blocks, "libero_spatial_no_noops_1.0.0_lerobot", language="bash" + ).code + if TEST_CACHE_PATH.exists(): + download_code = download_code.replace( + "examples/LIBERO/libero_spatial_no_noops_1.0.0_lerobot/", + f"{SHARED_DATASET_ROOT}/", + ) + + run_bash_blocks([download_code], cwd=REPO_ROOT, env=env) + + if _dataset_ready(SHARED_DATASET_ROOT): + _point_repo_dataset_to_shared() + return + + assert _dataset_ready(DATASET_ROOT), f"Expected LIBERO dataset at {DATASET_ROOT}" + + +@pytest.mark.gpu +@pytest.mark.timeout(1200) +def test_libero_readme_workflow_executes_via_subprocess() -> None: + """Run the LIBERO README finetune (libero_spatial) then server+client eval.""" + + print(f"[egl] NVIDIA EGL vendor file: {find_nvidia_egl_vendor_file()}", flush=True) + + env = {**os.environ, "MUJOCO_GL": "egl", "PYOPENGL_PLATFORM": "egl"} + blocks = extract_code_blocks(README) + + # Step 1: Download + copy modality once, preferring the shared mounted dataset cache. + with timed("step 1: dataset prep"): + _prepare_libero_dataset(blocks, env) + + # Remove any leftover output dir so the trainer starts fresh rather than + # trying to resume from a stale checkpoint (which would fail with --skip_weight_loading + # if a previous run used the real weights and produced a different architecture). + if MODEL_CHECKPOINT.parent.exists(): + shutil.rmtree(MODEL_CHECKPOINT.parent) + + # Step 2: Finetune — inline README values are replaced to keep the run short. + # --skip_weight_loading skips loading the 3B checkpoint weights (saves ~80s); the + # processor/tokenizer is still loaded from the checkpoint so the data pipeline + # is exercised correctly. Weights don't matter for a 2-step smoke test. + finetune_code = replace_once( + replace_once( + replace_once( + replace_once( + find_block(blocks, "--output-dir /tmp/libero_spatial", language="bash").code, + "NUM_GPUS=8", + "NUM_GPUS=1", + ), + "MAX_STEPS=20000", + f"MAX_STEPS={TRAINING_STEPS}", + ), + "SAVE_STEPS=1000", + f"SAVE_STEPS={TRAINING_STEPS}", + ), + "GLOBAL_BATCH_SIZE=640", + "GLOBAL_BATCH_SIZE=2", + ) + # Pass --skip_weight_loading after `--` so finetune.sh routes it to EXTRA_ARGS and on + # to launch_finetune.py (unknown args before `--` cause finetune.sh to exit 1). + finetune_code = finetune_code.rstrip() + " -- --skip_weight_loading" + with timed("step 2: finetune"): + run_bash_blocks( + [finetune_code], + cwd=REPO_ROOT, + env={ + **env, + "USE_WANDB": "0", + "DATALOADER_NUM_WORKERS": "0", + "SHARD_SIZE": "64", + "NUM_SHARDS_PER_EPOCH": "1", + }, + ) + assert MODEL_CHECKPOINT.exists(), ( + f"Expected model checkpoint after finetune: {MODEL_CHECKPOINT}" + ) + + model_server_host = "127.0.0.1" + model_server_port = 5552 + + # Build server and rollout command strings now (checkpoint exists after finetune). + server_code = replace_once( + find_block(blocks, "checkpoints/GR00T-N1.7-LIBERO/libero_10", language="bash").code, + "checkpoints/GR00T-N1.7-LIBERO/libero_10", + str(MODEL_CHECKPOINT), + ) + server_code += f" --device cuda:0 --host {model_server_host} --port {model_server_port}" + + rollout_code = replace_once( + replace_once( + replace_once( + replace_once( + find_block(blocks, "libero_uv/.venv/bin/python", language="bash").code, + "--n-episodes 10", + "--n-episodes 1", + ), + "--policy-client-port 5555", + f"--policy-client-port {model_server_port}", + ), + "--max-episode-steps 720", + "--max-episode-steps 2", + ), + "--n-envs 5", + "--n-envs 1", + ) + + # Steps 3 + 4 overlapped: start the model server immediately after finetune so + # model loading runs in parallel with the libero sim venv setup (which takes + # several minutes on a cache miss). + assert_port_available(model_server_host, model_server_port) + model_server_proc, server_log = start_server_process(server_code, cwd=REPO_ROOT, env=env) + + with timed("step 3a: libero repo prep"): + _prepare_libero_repo(env) + with timed("step 3b: sim venv setup"): + _prepare_libero_venv(find_block(blocks, "setup_libero.sh", language="bash").code, env) + + with timed("step 4: server startup"): + wait_for_server_ready( + proc=model_server_proc, + host=model_server_host, + port=model_server_port, + timeout_s=float( + os.getenv("LIBERO_SERVER_STARTUP_SECONDS", str(DEFAULT_SERVER_STARTUP_SECONDS)) + ), + server_log=server_log, + ) + + try: + with timed("step 5: rollout"): + simulation_result, _ = run_subprocess_step( + ["bash", "-c", rollout_code], + step="libero_rollout", + cwd=REPO_ROOT, + env=env, + log_prefix="libero", + failure_prefix="LIBERO rollout failed", + output_tail_chars=4000, + ) + simulation_output = (simulation_result.stdout or "") + (simulation_result.stderr or "") + assert "results:" in simulation_output, ( + "Simulation output did not include expected 'results:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + assert "success rate:" in simulation_output, ( + "Simulation output did not include expected 'success rate:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + finally: + if model_server_proc.poll() is None: + model_server_proc.terminate() + try: + model_server_proc.wait(timeout=15) + except subprocess.TimeoutExpired: + model_server_proc.kill() + model_server_proc.wait(timeout=15) diff --git a/tests/examples/test_robocasa.py b/tests/examples/test_robocasa.py new file mode 100644 index 000000000..d9ed3c4ba --- /dev/null +++ b/tests/examples/test_robocasa.py @@ -0,0 +1,434 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import logging +import os +import pathlib +import shlex +import shutil +import subprocess + +import pytest +from test_support.readme import extract_code_blocks, find_block, replace_once, run_bash_blocks +from test_support.runtime import ( + DEFAULT_SERVER_STARTUP_SECONDS, + TEST_CACHE_PATH, + assert_port_available, + demo_dataset_tree_ready, + get_root, + resolve_model_checkpoint_path, + run_subprocess_step, + start_server_process, + timed, + wait_for_server_ready, +) + + +REPO_ROOT = get_root() + +LOGGER = logging.getLogger(__name__) + + +README = REPO_ROOT / "examples/robocasa/README.md" +ROBOCASA_CHECKPOINT_PATH = os.environ.get("ROBOCASA_CHECKPOINT_PATH", "") +ROBOCASA_EMBODIMENT_TAG = os.environ.get("ROBOCASA_EMBODIMENT_TAG", "ROBOCASA_PANDA_OMRON") +TRAINING_STEPS = 2 +MODEL_CHECKPOINT = pathlib.Path(f"/tmp/robocasa_finetune/checkpoint-{TRAINING_STEPS}") +_ROBOCASA_DATASET_ENV = "ROBOCASA_DATASET_PATH" +_SHARED_ROBOCASA_DATASET = TEST_CACHE_PATH / "datasets/robocasa" + +ROBOCASA_SUBMODULE_PATH = REPO_ROOT / "external_dependencies/robocasa" +SHARED_ROBOCASA_REPO = TEST_CACHE_PATH / "repos/robocasa" + +ROBOCASA_ASSETS_REPO_DIR = REPO_ROOT / "external_dependencies/robocasa/robocasa/models/assets" +ROBOCASA_ASSETS_SHARED_DIR = TEST_CACHE_PATH / "robocasa-assets" +# Version file written alongside cached assets to detect robocasa submodule updates. +_ASSETS_VERSION_FILE = ROBOCASA_ASSETS_SHARED_DIR / ".robocasa_commit" + + +def _robocasa_submodule_commit() -> str: + """Return the robocasa submodule commit hash recorded in the main repo HEAD. + + Uses ``git ls-tree`` against the main repo so this works even before the + submodule is initialized. + """ + try: + result = subprocess.run( + ["git", "ls-tree", "HEAD", "external_dependencies/robocasa"], + capture_output=True, + text=True, + check=True, + cwd=REPO_ROOT, + ) + # output: "160000 commit \texternal_dependencies/robocasa" + parts = result.stdout.split() + return parts[2] if len(parts) >= 3 else "unknown" + except Exception: + return "unknown" + + +def _shared_asset_dirs() -> list[pathlib.Path]: + """Return all top-level subdirectories in the shared asset cache.""" + if not ROBOCASA_ASSETS_SHARED_DIR.is_dir(): + return [] + return [p for p in ROBOCASA_ASSETS_SHARED_DIR.iterdir() if p.is_dir()] + + +def _shared_assets_ready() -> bool: + """Return True when the shared asset cache is present, non-empty, and matches + the current robocasa submodule commit. + + A stale cache (e.g. from a previous robocasa version that lacked newer + fixture files) is treated as not-ready so the assets are re-downloaded. + """ + if not _ASSETS_VERSION_FILE.is_file(): + return False + if _ASSETS_VERSION_FILE.read_text().strip() != _robocasa_submodule_commit(): + return False + for d in _shared_asset_dirs(): + try: + if next((f for f in d.rglob("*") if f.is_file()), None) is not None: + return True + except OSError: + pass + return False + + +def _assert_required_assets_present() -> None: + """Raise if the repo asset directory is empty.""" + if not ROBOCASA_ASSETS_REPO_DIR.is_dir() or not any(ROBOCASA_ASSETS_REPO_DIR.iterdir()): + raise RuntimeError(f"RoboCasa assets missing at {ROBOCASA_ASSETS_REPO_DIR}") + + +def _point_repo_assets_to_shared() -> None: + """Symlink all shared asset subdirectories into the repo asset path.""" + ROBOCASA_ASSETS_REPO_DIR.mkdir(parents=True, exist_ok=True) + for shared_dir in _shared_asset_dirs(): + repo_dir = ROBOCASA_ASSETS_REPO_DIR / shared_dir.name + if repo_dir.is_symlink(): + if repo_dir.resolve() == shared_dir.resolve(): + continue + repo_dir.unlink() + elif repo_dir.exists(): + shutil.rmtree(repo_dir) + repo_dir.symlink_to(shared_dir, target_is_directory=True) + + +def _move_repo_assets_to_shared() -> None: + """Move all downloaded repo asset subdirectories into the shared cache. + + Also writes a version file recording the current robocasa submodule commit + so that stale caches are detected when the submodule is updated. + """ + ROBOCASA_ASSETS_SHARED_DIR.mkdir(parents=True, exist_ok=True) + if not ROBOCASA_ASSETS_REPO_DIR.is_dir(): + return + for src in ROBOCASA_ASSETS_REPO_DIR.iterdir(): + if not src.is_dir() or src.is_symlink(): + continue + dst = ROBOCASA_ASSETS_SHARED_DIR / src.name + if dst.exists() or dst.is_symlink(): + if dst.is_dir() and not dst.is_symlink(): + shutil.rmtree(dst) + else: + dst.unlink() + # Use cp -r + rm -rf instead of shutil.move: the repo and the shared + # PVC are on different filesystems, so shutil.move falls back to a slow + # Python-level copytree that times out on large asset dirs (e.g. + # generative_textures with thousands of PNGs). + subprocess.run(["cp", "-r", str(src), str(dst)], check=True) + shutil.rmtree(str(src)) + _ASSETS_VERSION_FILE.write_text(_robocasa_submodule_commit()) + + +def _remove_dangling_repo_asset_symlinks() -> None: + """Delete repo asset symlinks that point to missing targets.""" + if not ROBOCASA_ASSETS_REPO_DIR.is_dir(): + return + for repo_dir in ROBOCASA_ASSETS_REPO_DIR.iterdir(): + if repo_dir.is_symlink() and not repo_dir.exists(): + repo_dir.unlink() + + +def _robocasa_submodule_initialized() -> bool: + return (ROBOCASA_SUBMODULE_PATH / ".git").is_file() + + +def _git_modules_path(submodule_path: pathlib.Path) -> pathlib.Path | None: + git_file = submodule_path / ".git" + if not git_file.is_file(): + return None + content = git_file.read_text().strip() + if not content.startswith("gitdir:"): + return None + rel = content[len("gitdir:") :].strip() + return (submodule_path / rel).resolve() + + +def _prepare_robocasa_repo(env: dict[str, str]) -> None: + """Populate external_dependencies/robocasa from shared cache, or init and cache it.""" + if _robocasa_submodule_initialized(): + return + + wt_cache = SHARED_ROBOCASA_REPO / "wt" + modules_cache = SHARED_ROBOCASA_REPO / "modules" + + if (wt_cache / ".git").is_file() and modules_cache.exists(): + print(f"[robocasa] restoring submodule from cache {wt_cache}", flush=True) + shutil.copytree(wt_cache, ROBOCASA_SUBMODULE_PATH, dirs_exist_ok=True) + modules_path = _git_modules_path(ROBOCASA_SUBMODULE_PATH) + if modules_path is not None: + modules_path.mkdir(parents=True, exist_ok=True) + shutil.copytree(modules_cache, modules_path, dirs_exist_ok=True) + return + + # The directory may exist but be uninitialized (no .git file) due to CI + # checkout strategies that populate submodule dirs without git-initializing them. + # Remove it so git submodule update --init can clone cleanly. + if ROBOCASA_SUBMODULE_PATH.exists() and not _robocasa_submodule_initialized(): + shutil.rmtree(ROBOCASA_SUBMODULE_PATH) + + run_subprocess_step( + ["git", "submodule", "update", "--init", "external_dependencies/robocasa"], + step="robocasa_repo_init", + cwd=REPO_ROOT, + env=env, + log_prefix="robocasa", + ) + if TEST_CACHE_PATH.exists(): + modules_path = _git_modules_path(ROBOCASA_SUBMODULE_PATH) + print(f"[robocasa] caching submodule to {wt_cache}", flush=True) + wt_cache.mkdir(parents=True, exist_ok=True) + shutil.copytree(ROBOCASA_SUBMODULE_PATH, wt_cache, dirs_exist_ok=True) + if modules_path is not None: + modules_cache.mkdir(parents=True, exist_ok=True) + shutil.copytree(modules_path, modules_cache, dirs_exist_ok=True) + + +def _build_runtime_env(skip_download_assets: str) -> dict[str, str]: + """Build the runtime environment used by setup, model server, and rollout.""" + return {**os.environ, "SKIP_DOWNLOAD_ASSETS": skip_download_assets, "INSTALL_FLASH_ATTN": "0"} + + +def _resolve_robocasa_dataset() -> pathlib.Path: + """Return the RoboCasa LeRobot dataset used for short finetuning.""" + env_path_str = os.environ.get(_ROBOCASA_DATASET_ENV, "").strip() + if env_path_str: + env_path = pathlib.Path(env_path_str).expanduser().resolve() + assert demo_dataset_tree_ready(env_path), ( + f"{_ROBOCASA_DATASET_ENV} does not point to a complete LeRobot dataset: {env_path}" + ) + return env_path + + if demo_dataset_tree_ready(_SHARED_ROBOCASA_DATASET): + return _SHARED_ROBOCASA_DATASET + + pytest.skip( + "RoboCasa finetune dataset not found. Set " + f"{_ROBOCASA_DATASET_ENV} to a RoboCasa LeRobot dataset from Hugging Face or " + f"populate {_SHARED_ROBOCASA_DATASET}." + ) + + +def _resolve_robocasa_checkpoint(blocks, env: dict[str, str]) -> str: + """Use ROBOCASA_CHECKPOINT_PATH or create a short fine-tuned checkpoint.""" + if ROBOCASA_CHECKPOINT_PATH: + return ROBOCASA_CHECKPOINT_PATH + + dataset_path = _resolve_robocasa_dataset() + with timed("step 1a: base model prep"): + base_model_path = resolve_model_checkpoint_path( + hf_repo_id="nvidia/GR00T-N1.7-3B", + path_override_env="GROOT_MODEL_PATH", + repo_root=REPO_ROOT, + ) + + if MODEL_CHECKPOINT.parent.exists(): + shutil.rmtree(MODEL_CHECKPOINT.parent) + + finetune_code = replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + find_block( + blocks, + "--output-dir /tmp/robocasa_finetune", + language="bash", + ).code, + "NUM_GPUS=8", + "NUM_GPUS=1", + ), + "MAX_STEPS=60000", + f"MAX_STEPS={TRAINING_STEPS}", + ), + "SAVE_STEPS=2000", + f"SAVE_STEPS={TRAINING_STEPS}", + ), + "GLOBAL_BATCH_SIZE=512", + "GLOBAL_BATCH_SIZE=2", + ), + "nvidia/GR00T-N1.7-3B", + str(base_model_path), + ), + '--dataset-path "$DATASET_PATH"', + f"--dataset-path {shlex.quote(str(dataset_path))}", + ), + "--embodiment-tag ROBOCASA_PANDA_OMRON", + f"--embodiment-tag {ROBOCASA_EMBODIMENT_TAG}", + ), + "--output-dir /tmp/robocasa_finetune", + f"--output-dir {MODEL_CHECKPOINT.parent}", + ) + finetune_code = finetune_code.rstrip() + " -- --skip_weight_loading" + with timed("step 1b: finetune"): + run_bash_blocks( + [finetune_code], + cwd=REPO_ROOT, + env={ + **env, + "USE_WANDB": "0", + "DATALOADER_NUM_WORKERS": "0", + "SHARD_SIZE": "64", + "NUM_SHARDS_PER_EPOCH": "1", + }, + ) + assert MODEL_CHECKPOINT.exists(), ( + f"Expected model checkpoint after finetune: {MODEL_CHECKPOINT}" + ) + return str(MODEL_CHECKPOINT) + + +@pytest.mark.gpu +@pytest.mark.timeout(2700) +def test_robocasa_readme_eval_flow() -> None: + """Run the RoboCasa README finetune/server/client eval flow.""" + + # Environment setup: + # 1) If assets already exist on shared PVC, reuse them by symlinking. + # 2) Otherwise run setup with download enabled. + shared_assets_ready = _shared_assets_ready() + if not shared_assets_ready: + _remove_dangling_repo_asset_symlinks() + + skip_download_assets = "1" if shared_assets_ready else "0" + env = _build_runtime_env(skip_download_assets=skip_download_assets) + blocks = extract_code_blocks(README) + + with timed("step 1: checkpoint prep"): + checkpoint_path = _resolve_robocasa_checkpoint(blocks, env) + + with timed("step 2: robocasa repo prep"): + _prepare_robocasa_repo(env) + if shared_assets_ready: + _point_repo_assets_to_shared() + + # Step 2: Setup sim + with timed("step 3: sim venv setup (setup_RoboCasa.sh)"): + run_bash_blocks( + [find_block(blocks, "setup_RoboCasa.sh", language="bash")], + cwd=REPO_ROOT, + env=env, + force_yes=True, + ) + + # When setup performs a fresh download, move those assets into shared PVC + # so subsequent runs can skip download and reuse the cached shared copy. + if not shared_assets_ready: + _move_repo_assets_to_shared() + _point_repo_assets_to_shared() + + _assert_required_assets_present() + + model_server_host = "127.0.0.1" + model_server_port = 5551 + + # Step 4: Server — N1.7 RoboCasa evaluation requires a finetuned checkpoint. + server_code = replace_once( + replace_once( + find_block(blocks, "", language="bash").code, + "", + checkpoint_path, + ), + "--embodiment-tag ROBOCASA_PANDA_OMRON", + f"--embodiment-tag {ROBOCASA_EMBODIMENT_TAG}", + ) + server_code += f" --device cuda:0 --host {model_server_host} --port {model_server_port}" + + # Step 5: Rollout — substitute test-safe values + rollout_code = replace_once( + replace_once( + replace_once( + replace_once( + find_block(blocks, "rollout_policy.py", language="bash").code, + "--n-episodes 10", + "--n-episodes 1", + ), + "--policy-client-port 5555", + f"--policy-client-port {model_server_port}", + ), + "--max-episode-steps 720", + "--max-episode-steps 2", + ), + "--n-envs 5", + "--n-envs 1", + ) + + assert_port_available(model_server_host, model_server_port) + model_server_proc, server_log = start_server_process(server_code, cwd=REPO_ROOT, env=env) + with timed("step 4: server startup"): + wait_for_server_ready( + proc=model_server_proc, + host=model_server_host, + port=model_server_port, + timeout_s=float( + os.getenv("ROBOCASA_SERVER_STARTUP_SECONDS", str(DEFAULT_SERVER_STARTUP_SECONDS)) + ), + server_log=server_log, + ) + + try: + with timed("step 5: rollout"): + simulation_result, _ = run_subprocess_step( + ["bash", "-c", rollout_code], + step="robocasa_rollout", + cwd=REPO_ROOT, + env=env, + log_prefix="robocasa", + failure_prefix="RoboCasa rollout failed", + output_tail_chars=4000, + ) + simulation_output = (simulation_result.stdout or "") + (simulation_result.stderr or "") + assert "results:" in simulation_output, ( + "Simulation output did not include expected 'results:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + assert "success rate:" in simulation_output, ( + "Simulation output did not include expected 'success rate:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + finally: + if model_server_proc.poll() is None: + model_server_proc.terminate() + try: + model_server_proc.wait(timeout=15) + except subprocess.TimeoutExpired: + model_server_proc.kill() + model_server_proc.wait(timeout=15) diff --git a/tests/examples/test_robocasa_gr1_tabletop.py b/tests/examples/test_robocasa_gr1_tabletop.py new file mode 100644 index 000000000..31055deba --- /dev/null +++ b/tests/examples/test_robocasa_gr1_tabletop.py @@ -0,0 +1,418 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import logging +import os +import pathlib +import shutil +import subprocess + +import pytest +from test_support.readme import extract_code_blocks, find_block, replace_once, run_bash_blocks +from test_support.runtime import ( + DEFAULT_SERVER_STARTUP_SECONDS, + TEST_CACHE_PATH, + assert_port_available, + demo_dataset_tree_ready, + get_root, + resolve_model_checkpoint_path, + run_subprocess_step, + start_server_process, + timed, + wait_for_server_ready, +) + + +REPO_ROOT = get_root() + +LOGGER = logging.getLogger(__name__) + + +README = REPO_ROOT / "examples/robocasa-gr1-tabletop-tasks/README.md" +ROBOCASA_GR1_CHECKPOINT_PATH = os.environ.get("ROBOCASA_GR1_CHECKPOINT_PATH", "") +ROBOCASA_GR1_EMBODIMENT_TAG = os.environ.get("ROBOCASA_GR1_EMBODIMENT_TAG", "ROBOCASA_GR1_TABLETOP") +TRAINING_STEPS = 2 +MODEL_CHECKPOINT = pathlib.Path(f"/tmp/gr1_tabletop_finetune/checkpoint-{TRAINING_STEPS}") +_ROBOCASA_GR1_DATASET_ENV = "ROBOCASA_GR1_DATASET_PATH" +_SHARED_ROBOCASA_GR1_DATASET = TEST_CACHE_PATH / "datasets/robocasa-gr1-tabletop-tasks" + +ROBOCASA_SUBMODULE_PATH = REPO_ROOT / "external_dependencies/robocasa-gr1-tabletop-tasks" +SHARED_ROBOCASA_REPO = TEST_CACHE_PATH / "repos/robocasa-gr1-tabletop-tasks" + +ROBOCASA_ASSETS_REPO_DIR = ( + REPO_ROOT / "external_dependencies/robocasa-gr1-tabletop-tasks/robocasa/models/assets" +) +ROBOCASA_ASSETS_SHARED_DIR = TEST_CACHE_PATH / "robocasa-gr1-tabletop-tasks/assets" +# Version file written alongside cached assets to detect submodule updates. +_ASSETS_VERSION_FILE = ROBOCASA_ASSETS_SHARED_DIR / ".robocasa_gr1_commit" + + +def _robocasa_submodule_commit() -> str: + """Return the robocasa-gr1-tabletop-tasks submodule commit hash recorded in HEAD.""" + try: + result = subprocess.run( + ["git", "ls-tree", "HEAD", "external_dependencies/robocasa-gr1-tabletop-tasks"], + capture_output=True, + text=True, + check=True, + cwd=REPO_ROOT, + ) + parts = result.stdout.split() + return parts[2] if len(parts) >= 3 else "unknown" + except Exception: + return "unknown" + + +def _shared_asset_dirs() -> list[pathlib.Path]: + """Return all top-level subdirectories in the shared asset cache.""" + if not ROBOCASA_ASSETS_SHARED_DIR.is_dir(): + return [] + return [p for p in ROBOCASA_ASSETS_SHARED_DIR.iterdir() if p.is_dir()] + + +def _shared_assets_ready() -> bool: + """Return True when the shared asset cache is present, non-empty, and version-matched.""" + if not _ASSETS_VERSION_FILE.is_file(): + return False + if _ASSETS_VERSION_FILE.read_text().strip() != _robocasa_submodule_commit(): + return False + for d in _shared_asset_dirs(): + try: + if next((f for f in d.rglob("*") if f.is_file()), None) is not None: + return True + except OSError: + pass + return False + + +def _assert_required_assets_present() -> None: + """Raise if the repo asset directory is empty.""" + if not ROBOCASA_ASSETS_REPO_DIR.is_dir() or not any(ROBOCASA_ASSETS_REPO_DIR.iterdir()): + raise RuntimeError(f"RoboCasa GR1 assets missing at {ROBOCASA_ASSETS_REPO_DIR}") + + +def _point_repo_assets_to_shared() -> None: + """Symlink all shared asset subdirectories into the repo asset path.""" + ROBOCASA_ASSETS_REPO_DIR.mkdir(parents=True, exist_ok=True) + for shared_dir in _shared_asset_dirs(): + repo_dir = ROBOCASA_ASSETS_REPO_DIR / shared_dir.name + if repo_dir.is_symlink(): + if repo_dir.resolve() == shared_dir.resolve(): + continue + repo_dir.unlink() + elif repo_dir.exists(): + shutil.rmtree(repo_dir) + repo_dir.symlink_to(shared_dir, target_is_directory=True) + + +def _move_repo_assets_to_shared() -> None: + """Move all downloaded repo asset subdirectories into the shared cache.""" + ROBOCASA_ASSETS_SHARED_DIR.mkdir(parents=True, exist_ok=True) + if not ROBOCASA_ASSETS_REPO_DIR.is_dir(): + return + for src in ROBOCASA_ASSETS_REPO_DIR.iterdir(): + if not src.is_dir() or src.is_symlink(): + continue + dst = ROBOCASA_ASSETS_SHARED_DIR / src.name + if dst.exists() or dst.is_symlink(): + if dst.is_dir() and not dst.is_symlink(): + shutil.rmtree(dst) + else: + dst.unlink() + # Use cp -r + rm -rf instead of shutil.move: the repo and the shared + # PVC may be on different filesystems, so shutil.move would fall back + # to a slow Python-level copytree. + subprocess.run(["cp", "-r", str(src), str(dst)], check=True) + shutil.rmtree(str(src)) + _ASSETS_VERSION_FILE.write_text(_robocasa_submodule_commit()) + + +def _remove_dangling_repo_asset_symlinks() -> None: + """Delete repo asset symlinks that point to missing targets.""" + if not ROBOCASA_ASSETS_REPO_DIR.is_dir(): + return + for repo_dir in ROBOCASA_ASSETS_REPO_DIR.iterdir(): + if repo_dir.is_symlink() and not repo_dir.exists(): + repo_dir.unlink() + + +def _robocasa_submodule_initialized() -> bool: + return (ROBOCASA_SUBMODULE_PATH / ".git").is_file() + + +def _git_modules_path(submodule_path: pathlib.Path) -> pathlib.Path | None: + git_file = submodule_path / ".git" + if not git_file.is_file(): + return None + content = git_file.read_text().strip() + if not content.startswith("gitdir:"): + return None + rel = content[len("gitdir:") :].strip() + return (submodule_path / rel).resolve() + + +def _prepare_robocasa_repo(env: dict[str, str]) -> None: + """Populate external_dependencies/robocasa-gr1-tabletop-tasks from cache, or init+cache.""" + if _robocasa_submodule_initialized(): + return + + wt_cache = SHARED_ROBOCASA_REPO / "wt" + modules_cache = SHARED_ROBOCASA_REPO / "modules" + + if (wt_cache / ".git").is_file() and modules_cache.exists(): + print(f"[robocasa-gr1] restoring submodule from cache {wt_cache}", flush=True) + shutil.copytree(wt_cache, ROBOCASA_SUBMODULE_PATH, dirs_exist_ok=True) + modules_path = _git_modules_path(ROBOCASA_SUBMODULE_PATH) + if modules_path is not None: + modules_path.mkdir(parents=True, exist_ok=True) + shutil.copytree(modules_cache, modules_path, dirs_exist_ok=True) + return + + if ROBOCASA_SUBMODULE_PATH.exists() and not _robocasa_submodule_initialized(): + shutil.rmtree(ROBOCASA_SUBMODULE_PATH) + + run_subprocess_step( + [ + "git", + "submodule", + "update", + "--init", + "external_dependencies/robocasa-gr1-tabletop-tasks", + ], + step="robocasa_gr1_repo_init", + cwd=REPO_ROOT, + env=env, + log_prefix="robocasa-gr1", + ) + if TEST_CACHE_PATH.exists(): + modules_path = _git_modules_path(ROBOCASA_SUBMODULE_PATH) + print(f"[robocasa-gr1] caching submodule to {wt_cache}", flush=True) + wt_cache.mkdir(parents=True, exist_ok=True) + shutil.copytree(ROBOCASA_SUBMODULE_PATH, wt_cache, dirs_exist_ok=True) + if modules_path is not None: + modules_cache.mkdir(parents=True, exist_ok=True) + shutil.copytree(modules_path, modules_cache, dirs_exist_ok=True) + + +def _build_runtime_env(skip_download_assets: str) -> dict[str, str]: + """Build the runtime environment used by setup, model server, and rollout.""" + return {**os.environ, "SKIP_DOWNLOAD_ASSETS": skip_download_assets, "INSTALL_FLASH_ATTN": "0"} + + +def _resolve_robocasa_gr1_dataset() -> pathlib.Path: + """Return the RoboCasa GR1 LeRobot dataset used for short finetuning.""" + env_path_str = os.environ.get(_ROBOCASA_GR1_DATASET_ENV, "").strip() + if env_path_str: + env_path = pathlib.Path(env_path_str).expanduser().resolve() + assert demo_dataset_tree_ready(env_path), ( + f"{_ROBOCASA_GR1_DATASET_ENV} does not point to a complete LeRobot dataset: {env_path}" + ) + return env_path + + if demo_dataset_tree_ready(_SHARED_ROBOCASA_GR1_DATASET): + return _SHARED_ROBOCASA_GR1_DATASET + + pytest.skip( + "RoboCasa GR1 finetune dataset not found. Set " + f"{_ROBOCASA_GR1_DATASET_ENV} or populate {_SHARED_ROBOCASA_GR1_DATASET}." + ) + + +def _resolve_robocasa_gr1_checkpoint(blocks, env: dict[str, str]) -> str: + """Use ROBOCASA_GR1_CHECKPOINT_PATH or create a short fine-tuned checkpoint.""" + if ROBOCASA_GR1_CHECKPOINT_PATH: + return ROBOCASA_GR1_CHECKPOINT_PATH + + dataset_path = _resolve_robocasa_gr1_dataset() + with timed("step 1a: base model prep"): + base_model_path = resolve_model_checkpoint_path( + hf_repo_id="nvidia/GR00T-N1.7-3B", + path_override_env="GROOT_MODEL_PATH", + repo_root=REPO_ROOT, + ) + + if MODEL_CHECKPOINT.parent.exists(): + shutil.rmtree(MODEL_CHECKPOINT.parent) + + finetune_code = replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + find_block( + blocks, + "--output-dir /tmp/gr1_tabletop_finetune", + language="bash", + ).code, + "NUM_GPUS=8", + "NUM_GPUS=1", + ), + "MAX_STEPS=60000", + f"MAX_STEPS={TRAINING_STEPS}", + ), + "SAVE_STEPS=2000", + f"SAVE_STEPS={TRAINING_STEPS}", + ), + "GLOBAL_BATCH_SIZE=512", + "GLOBAL_BATCH_SIZE=2", + ), + "nvidia/GR00T-N1.7-3B", + str(base_model_path), + ), + "", + str(dataset_path), + ), + "--embodiment-tag ROBOCASA_GR1_TABLETOP", + f"--embodiment-tag {ROBOCASA_GR1_EMBODIMENT_TAG}", + ), + "--output-dir /tmp/gr1_tabletop_finetune", + f"--output-dir {MODEL_CHECKPOINT.parent}", + ) + finetune_code = finetune_code.rstrip() + " -- --skip_weight_loading" + with timed("step 1b: finetune"): + run_bash_blocks( + [finetune_code], + cwd=REPO_ROOT, + env={ + **env, + "USE_WANDB": "0", + "DATALOADER_NUM_WORKERS": "0", + "SHARD_SIZE": "64", + "NUM_SHARDS_PER_EPOCH": "1", + }, + ) + assert MODEL_CHECKPOINT.exists(), ( + f"Expected model checkpoint after finetune: {MODEL_CHECKPOINT}" + ) + return str(MODEL_CHECKPOINT) + + +@pytest.mark.gpu +@pytest.mark.timeout(2700) +def test_robocasa_gr1_tabletop_readme_eval_flow() -> None: + """Run the RoboCasa GR1 Tabletop README finetune/server/client eval flow.""" + + shared_assets_ready = _shared_assets_ready() + if shared_assets_ready: + _point_repo_assets_to_shared() + else: + _remove_dangling_repo_asset_symlinks() + + skip_download_assets = "1" if shared_assets_ready else "0" + env = _build_runtime_env(skip_download_assets=skip_download_assets) + blocks = extract_code_blocks(README) + + with timed("step 1: checkpoint prep"): + checkpoint_path = _resolve_robocasa_gr1_checkpoint(blocks, env) + + with timed("step 2: robocasa-gr1 repo prep"): + _prepare_robocasa_repo(env) + + with timed("step 3: sim venv setup (setup_RoboCasaGR1TabletopTasks.sh)"): + run_bash_blocks( + [find_block(blocks, "setup_RoboCasaGR1TabletopTasks.sh", language="bash")], + cwd=REPO_ROOT, + env=env, + force_yes=True, + ) + + if not shared_assets_ready: + _move_repo_assets_to_shared() + _point_repo_assets_to_shared() + + _assert_required_assets_present() + + model_server_host = "127.0.0.1" + model_server_port = 5556 + + # Step 4: Server — N1.7 RoboCasa GR1 evaluation requires a finetuned checkpoint. + server_code = replace_once( + replace_once( + find_block(blocks, "", language="bash").code, + "", + checkpoint_path, + ), + "--embodiment-tag ROBOCASA_GR1_TABLETOP", + f"--embodiment-tag {ROBOCASA_GR1_EMBODIMENT_TAG}", + ) + server_code += f" --device cuda:0 --host {model_server_host} --port {model_server_port}" + + # Step 5: Rollout — substitute test-safe values + rollout_code = replace_once( + replace_once( + replace_once( + replace_once( + find_block(blocks, "rollout_policy.py", language="bash").code, + "--n-episodes 10", + "--n-episodes 1", + ), + "--policy-client-port 5555", + f"--policy-client-port {model_server_port}", + ), + "--max-episode-steps 720", + "--max-episode-steps 2", + ), + "--n-envs 5", + "--n-envs 1", + ) + + assert_port_available(model_server_host, model_server_port) + model_server_proc, server_log = start_server_process(server_code, cwd=REPO_ROOT, env=env) + with timed("step 4: server startup"): + wait_for_server_ready( + proc=model_server_proc, + host=model_server_host, + port=model_server_port, + timeout_s=float( + os.getenv( + "ROBOCASA_GR1_SERVER_STARTUP_SECONDS", str(DEFAULT_SERVER_STARTUP_SECONDS) + ) + ), + server_log=server_log, + ) + + try: + with timed("step 5: rollout"): + simulation_result, _ = run_subprocess_step( + ["bash", "-c", rollout_code], + step="robocasa_gr1_rollout", + cwd=REPO_ROOT, + env=env, + log_prefix="robocasa-gr1", + failure_prefix="RoboCasa GR1 Tabletop rollout failed", + output_tail_chars=4000, + ) + simulation_output = (simulation_result.stdout or "") + (simulation_result.stderr or "") + assert "results:" in simulation_output, ( + "Simulation output did not include expected 'results:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + assert "success rate:" in simulation_output, ( + "Simulation output did not include expected 'success rate:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + finally: + if model_server_proc.poll() is None: + model_server_proc.terminate() + try: + model_server_proc.wait(timeout=15) + except subprocess.TimeoutExpired: + model_server_proc.kill() + model_server_proc.wait(timeout=15) diff --git a/tests/examples/test_simplerenv.py b/tests/examples/test_simplerenv.py new file mode 100644 index 000000000..510d62a84 --- /dev/null +++ b/tests/examples/test_simplerenv.py @@ -0,0 +1,169 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import logging +import os +import platform +import subprocess + +import pytest +from test_support.readme import extract_code_blocks, find_block, replace_once, run_bash_blocks +from test_support.runtime import ( + DEFAULT_SERVER_STARTUP_SECONDS, + assert_port_available, + get_root, + has_rt_core_gpu, + run_subprocess_step, + start_server_process, + timed, + wait_for_server_ready, +) + + +logger = logging.getLogger(__name__) + + +REPO_ROOT = get_root() + +README = REPO_ROOT / "examples/SimplerEnv/README.md" + +# sapien==2.2.2 (required by ManiSkill2_real2sim) ships x86_64 wheels only. +pytestmark = pytest.mark.skipif( + platform.machine() != "x86_64", + reason="SimplerEnv depends on sapien which has no aarch64 wheels", +) + + +def _run_simplerenv_eval( + env: dict, + blocks: list, + server_model_key: str, + client_env_name_old: str, + client_env_name_new: str, + server_startup_env_var: str, +) -> None: + """Shared helper: setup sim, start server, run rollout, assert results.""" + # Step 1: Setup sim (shared across both benchmarks) + with timed("step 1: sim venv setup (setup_SimplerEnv.sh)"): + run_bash_blocks( + [find_block(blocks, "setup_SimplerEnv.sh", language="bash")], + cwd=REPO_ROOT, + env=env, + ) + + model_server_host = "127.0.0.1" + model_server_port = 5559 + + # Step 2: Server — inject test-specific flags + server_code = find_block(blocks, server_model_key, language="bash").code + server_code += f" --device cuda:0 --host {model_server_host} --port {model_server_port}" + + # Step 3: Rollout — substitute test-safe values + rollout_code = replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + find_block(blocks, client_env_name_old, language="bash").code, + "--n-episodes 10", + "--n-episodes 1", + ), + "--policy-client-port 5555", + f"--policy-client-port {model_server_port}", + ), + "--max-episode-steps 300", + "--max-episode-steps 2", + ), + "--n-envs 5", + "--n-envs 1", + ), + client_env_name_old, + client_env_name_new, + ) + + assert_port_available(model_server_host, model_server_port) + model_server_proc, server_log = start_server_process(server_code, cwd=REPO_ROOT, env=env) + with timed("step 2: server startup"): + wait_for_server_ready( + proc=model_server_proc, + host=model_server_host, + port=model_server_port, + timeout_s=float(os.getenv(server_startup_env_var, str(DEFAULT_SERVER_STARTUP_SECONDS))), + server_log=server_log, + ) + + try: + if has_rt_core_gpu(): + with timed("step 3: rollout"): + simulation_result, _ = run_subprocess_step( + ["bash", "-c", rollout_code], + step="simplerenv_rollout", + cwd=REPO_ROOT, + env=env, + log_prefix="simplerenv", + failure_prefix="SimplerEnv rollout failed", + output_tail_chars=4000, + ) + simulation_output = (simulation_result.stdout or "") + (simulation_result.stderr or "") + assert "results:" in simulation_output, ( + "Simulation output did not include expected 'results:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + assert "success rate:" in simulation_output, ( + "Simulation output did not include expected 'success rate:' marker.\n" + f"output_tail=\n{simulation_output[-4000:]}" + ) + finally: + if model_server_proc.poll() is None: + model_server_proc.terminate() + try: + model_server_proc.wait(timeout=15) + except subprocess.TimeoutExpired: + model_server_proc.kill() + model_server_proc.wait(timeout=15) + + +@pytest.mark.gpu +@pytest.mark.timeout(900) +def test_simplerenv_fractal_readme_eval_flow() -> None: + """Run the SimplerEnv README server+client eval using the remote fractal (Google robot) checkpoint.""" + env = {**os.environ} + blocks = extract_code_blocks(README) + _run_simplerenv_eval( + env=env, + blocks=blocks, + server_model_key="nvidia/GR00T-N1.7-SimplerEnv-Fractal", + client_env_name_old="simpler_env_google/google_robot_pick_coke_can", + client_env_name_new="simpler_env_google/google_robot_pick_coke_can", + server_startup_env_var="SIMPLERENV_SERVER_STARTUP_SECONDS", + ) + + +@pytest.mark.gpu +@pytest.mark.timeout(900) +def test_simplerenv_bridge_readme_eval_flow() -> None: + """Run the SimplerEnv README server+client eval using the remote bridge (WidowX robot) checkpoint.""" + env = {**os.environ} + blocks = extract_code_blocks(README) + _run_simplerenv_eval( + env=env, + blocks=blocks, + server_model_key="nvidia/GR00T-N1.7-SimplerEnv-Bridge", + client_env_name_old="simpler_env_widowx/widowx_spoon_on_towel", + client_env_name_new="simpler_env_widowx/widowx_spoon_on_towel", + server_startup_env_var="SIMPLERENV_SERVER_STARTUP_SECONDS", + ) diff --git a/tests/examples/test_so100.py b/tests/examples/test_so100.py new file mode 100644 index 000000000..55b8ad4d7 --- /dev/null +++ b/tests/examples/test_so100.py @@ -0,0 +1,178 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import logging +import os +import pathlib +import shutil + +import pytest +from test_support.readme import extract_code_blocks, find_block, replace_once, run_bash_blocks +from test_support.runtime import TEST_CACHE_PATH, get_root, timed + + +logger = logging.getLogger(__name__) + + +REPO_ROOT = get_root() +TRAINING_STEPS = 2 + +README = REPO_ROOT / "examples/SO100/README.md" + +DATASET_ROOT = REPO_ROOT / "examples/SO100/finish_sandwich_lerobot" +DATASET_PATH = DATASET_ROOT / "izuluaga/finish_sandwich" +MODALITY_SRC = REPO_ROOT / "examples/SO100/modality.json" +MODALITY_DST = DATASET_PATH / "meta/modality.json" +MODEL_CHECKPOINT = pathlib.Path(f"/tmp/so100_finetune/checkpoint-{TRAINING_STEPS}") + +SHARED_DATASET_ROOT = TEST_CACHE_PATH / "datasets/so100_finish_sandwich" + + +def _dataset_ready(dataset_root: pathlib.Path) -> bool: + """Return True when the converted SO100 dataset is present and non-empty.""" + inner = dataset_root / "izuluaga/finish_sandwich" + info = inner / "meta/info.json" + videos = inner / "videos" + if not info.is_file() or not videos.is_dir(): + return False + return next(videos.rglob("*.mp4"), None) is not None + + +def _point_to_shared() -> None: + """Symlink DATASET_ROOT → SHARED_DATASET_ROOT.""" + if DATASET_ROOT.is_symlink(): + if DATASET_ROOT.resolve() == SHARED_DATASET_ROOT.resolve(): + return + DATASET_ROOT.unlink() + elif DATASET_ROOT.exists(): + return # real local dataset — don't replace it + DATASET_ROOT.parent.mkdir(parents=True, exist_ok=True) + DATASET_ROOT.symlink_to(SHARED_DATASET_ROOT, target_is_directory=True) + + +def _prepare_so100_dataset(convert_block: str, convert_env: dict) -> None: + """Download + convert the SO100 dataset, preferring shared cache when available.""" + if _dataset_ready(SHARED_DATASET_ROOT): + _point_to_shared() + return + + # Direct convert output to shared storage when the cache mount is present. + convert_code = convert_block + if TEST_CACHE_PATH.exists(): + convert_code = convert_code.replace( + "examples/SO100/finish_sandwich_lerobot", + str(SHARED_DATASET_ROOT), + ) + + run_bash_blocks([convert_code], cwd=REPO_ROOT, env=convert_env) + + if _dataset_ready(SHARED_DATASET_ROOT): + _point_to_shared() + return + + assert _dataset_ready(DATASET_ROOT), f"Expected SO100 dataset at {DATASET_ROOT}" + + +def _cleanup_dataset_path() -> None: + """Remove the dataset directory created by the SO100 workflow.""" + try: + if DATASET_ROOT.is_symlink(): + DATASET_ROOT.unlink() + elif DATASET_ROOT.exists(): + shutil.rmtree(DATASET_ROOT) + except OSError as exc: + print(f"[so100] cleanup_warning path={DATASET_PATH} error={exc}", flush=True) + + +@pytest.mark.gpu +@pytest.mark.timeout(1800) +def test_so100_readme_workflow_executes_via_subprocess() -> None: + """Run the README's bash commands in order, with minor test-only substitutions.""" + + env = {**os.environ, "GIT_LFS_SKIP_SMUDGE": "1"} + print(f"[so100] uv_env={env.get('UV_PROJECT_ENVIRONMENT', '')}", flush=True) + + blocks = extract_code_blocks(README) + + try: + # Step 1: Convert dataset (README: Handling the dataset) + # The lerobot_conversion sub-project has its own dependencies (different + # numpy/pyarrow versions). Remove UV_PROJECT_ENVIRONMENT so uv creates + # an isolated venv for it instead of contaminating the main one. + convert_env = {k: v for k, v in env.items() if k != "UV_PROJECT_ENVIRONMENT"} + with timed("step 1: dataset conversion"): + _prepare_so100_dataset( + find_block(blocks, "convert_v3_to_v2.py", language="bash").code, + convert_env, + ) + + # Step 2: Copy modality.json (README cp command) + MODALITY_DST.parent.mkdir(parents=True, exist_ok=True) + with timed("step 2: modality.json copy"): + run_bash_blocks( + [find_block(blocks, "modality.json", language="bash")], + cwd=REPO_ROOT, + env=env, + ) + assert MODALITY_DST.is_file(), f"Expected modality file after copy: {MODALITY_DST}" + + # Step 3: Finetune (README: Finetuning) — env overrides keep the run short + finetune_code = ( + find_block( + blocks, + "--modality-config-path examples/SO100/so100_config.py", + language="bash", + ).code.rstrip() + + " -- --skip_weight_loading" + ) + with timed("step 3: finetune"): + run_bash_blocks( + [finetune_code], + cwd=REPO_ROOT, + env={ + **env, + "SAVE_STEPS": str(TRAINING_STEPS), + "MAX_STEPS": str(TRAINING_STEPS), + "USE_WANDB": "0", + "DATALOADER_NUM_WORKERS": "0", + "GLOBAL_BATCH_SIZE": "2", + "SHARD_SIZE": "64", + "NUM_SHARDS_PER_EPOCH": "1", + "EPISODE_SAMPLING_RATE": "0.02", + }, + ) + assert MODEL_CHECKPOINT.exists(), ( + f"Expected model checkpoint after finetune: {MODEL_CHECKPOINT}" + ) + + # Step 4: Open-loop eval — replace README defaults with test-specific values + eval_cmd = replace_once( + replace_once( + find_block(blocks, "open_loop_eval.py", language="bash").code, + "/tmp/so100_finetune/checkpoint-10000", + str(MODEL_CHECKPOINT), + ), + "--steps 400", + "--steps 5", + ) + with timed("step 4: open-loop eval"): + run_bash_blocks([eval_cmd], cwd=REPO_ROOT, env=env) + assert pathlib.Path("/tmp/open_loop_eval/traj_0.jpeg").exists(), ( + "Expected eval plot at /tmp/open_loop_eval/traj_0.jpeg" + ) + finally: + _cleanup_dataset_path() diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md new file mode 100644 index 000000000..8a8018faf --- /dev/null +++ b/tests/fixtures/README.md @@ -0,0 +1,17 @@ +# Test Fixtures + +Small, static files committed to the repo so that CI can run tests without +external dependencies (checkpoints, datasets, network access, etc.). + +## Guidelines + +- Keep files small — configs, sample data, mock inputs, etc. are all fine. +- Do **not** commit large binaries (model weights, `.safetensors`, `.bin`). +- Organize by feature or test in descriptive subdirectories. +- Reference in tests via relative path: `Path(__file__).parent... / "fixtures" / "subdir"`. + +## Current fixtures + +| Directory | Used by | Description | +|-----------|---------|-------------| +| `processor_config/` | `tests/gr00t/model/test_gr00t_processor.py`
`tests/gr00t/model/test_variable_image_size.py`
`tests/gr00t/policy/test_gr00t_policy.py`
`tests/gr00t/data/state_action/test_state_action_processor.py` | Minimal `Gr00tN1d7Processor` config (libero_sim only) | diff --git a/tests/fixtures/processor_config/embodiment_id.json b/tests/fixtures/processor_config/embodiment_id.json new file mode 100644 index 000000000..22ea8df85 --- /dev/null +++ b/tests/fixtures/processor_config/embodiment_id.json @@ -0,0 +1,3 @@ +{ + "libero_sim": 2 +} diff --git a/tests/fixtures/processor_config/processor_config.json b/tests/fixtures/processor_config/processor_config.json new file mode 100644 index 000000000..9ecc49fd2 --- /dev/null +++ b/tests/fixtures/processor_config/processor_config.json @@ -0,0 +1,150 @@ +{ + "processor_class": "Gr00tN1d7Processor", + "processor_kwargs": { + "modality_configs": { + "libero_sim": { + "video": { + "delta_indices": [ + 0 + ], + "modality_keys": [ + "observation.images.rgb.head_256_256", + "observation.images.rgb.left_wrist_256_256" + ], + "sin_cos_embedding_keys": null, + "mean_std_embedding_keys": null, + "action_configs": null + }, + "state": { + "delta_indices": [ + 0 + ], + "modality_keys": [ + "x", + "y", + "z", + "roll", + "pitch", + "yaw", + "gripper" + ], + "sin_cos_embedding_keys": null, + "mean_std_embedding_keys": null, + "action_configs": null + }, + "action": { + "delta_indices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ], + "modality_keys": [ + "x", + "y", + "z", + "roll", + "pitch", + "yaw", + "gripper" + ], + "sin_cos_embedding_keys": null, + "mean_std_embedding_keys": null, + "action_configs": [ + { + "rep": "ABSOLUTE", + "type": "NON_EEF", + "format": "DEFAULT", + "state_key": null + }, + { + "rep": "ABSOLUTE", + "type": "NON_EEF", + "format": "DEFAULT", + "state_key": null + }, + { + "rep": "ABSOLUTE", + "type": "NON_EEF", + "format": "DEFAULT", + "state_key": null + }, + { + "rep": "ABSOLUTE", + "type": "NON_EEF", + "format": "DEFAULT", + "state_key": null + }, + { + "rep": "ABSOLUTE", + "type": "NON_EEF", + "format": "DEFAULT", + "state_key": null + }, + { + "rep": "ABSOLUTE", + "type": "NON_EEF", + "format": "DEFAULT", + "state_key": null + }, + { + "rep": "ABSOLUTE", + "type": "NON_EEF", + "format": "DEFAULT", + "state_key": null + } + ] + }, + "language": { + "delta_indices": [ + 0 + ], + "modality_keys": [ + "annotation.human.action.task_description" + ], + "sin_cos_embedding_keys": null, + "mean_std_embedding_keys": null, + "action_configs": null + } + } + }, + "image_crop_size": null, + "image_target_size": null, + "use_albumentations": true, + "random_rotation_angle": null, + "color_jitter_params": { + "brightness": 0.3, + "contrast": 0.4, + "saturation": 0.5, + "hue": 0.08 + }, + "shortest_image_edge": 256, + "crop_fraction": 0.95, + "letter_box_transform": false, + "model_name": "nvidia/Cosmos-Reason2-2B", + "model_type": "qwen", + "formalize_language": true, + "max_state_dim": 128, + "max_action_dim": 128, + "max_action_horizon": 50, + "use_percentiles": false, + "use_mean_std": false, + "clip_outliers": true, + "apply_sincos_state_encoding": true, + "use_relative_action": true, + "exclude_state": false, + "state_dropout_prob": 0.0 + } +} \ No newline at end of file diff --git a/tests/fixtures/processor_config/statistics.json b/tests/fixtures/processor_config/statistics.json new file mode 100644 index 000000000..49cecc010 --- /dev/null +++ b/tests/fixtures/processor_config/statistics.json @@ -0,0 +1,295 @@ +{ + "libero_sim": { + "state": { + "x": { + "min": [ + -0.4828203022480011 + ], + "max": [ + 0.21031762659549713 + ], + "mean": [ + -0.04190658777952194 + ], + "std": [ + 0.10743364691734314 + ], + "q01": [ + -0.3899900782108307 + ], + "q99": [ + 0.1530261474847791 + ] + }, + "y": { + "min": [ + -0.3255046010017395 + ], + "max": [ + 0.39128610491752625 + ], + "mean": [ + 0.03539430722594261 + ], + "std": [ + 0.14424669742584229 + ], + "q01": [ + -0.2838300323486328 + ], + "q99": [ + 0.32915401458740223 + ] + }, + "z": { + "min": [ + 0.445506751537323 + ], + "max": [ + 1.3332009315490723 + ], + "mean": [ + 0.8257141709327698 + ], + "std": [ + 0.2572328448295593 + ], + "q01": [ + 0.44795057058334353 + ], + "q99": [ + 1.2546923208236693 + ] + }, + "roll": { + "min": [ + 1.1321442127227783 + ], + "max": [ + 3.6714255809783936 + ], + "mean": [ + 2.908308267593384 + ], + "std": [ + 0.3441362977027893 + ], + "q01": [ + 1.8810229921340942 + ], + "q99": [ + 3.303542451858519 + ] + }, + "pitch": { + "min": [ + -3.641430377960205 + ], + "max": [ + 3.560650587081909 + ], + "mean": [ + -0.5562185049057007 + ], + "std": [ + 1.234421730041504 + ], + "q01": [ + -2.886677579879761 + ], + "q99": [ + 2.7496529006957933 + ] + }, + "yaw": { + "min": [ + -1.842738389968872 + ], + "max": [ + 1.386339545249939 + ], + "mean": [ + -0.16649018228054047 + ], + "std": [ + 0.3579835891723633 + ], + "q01": [ + -1.1599004411697387 + ], + "q99": [ + 0.6893712210655194 + ] + }, + "gripper": { + "min": [ + -0.0010040868073701859, + -0.04111652821302414 + ], + "max": [ + 0.04160946607589722, + 0.0013633022317662835 + ], + "mean": [ + 0.028316624462604523, + -0.028561657294631004 + ], + "std": [ + 0.013308707624673843, + 0.013174631632864475 + ], + "q01": [ + 0.002066459748893976, + -0.04001387819647789 + ], + "q99": [ + 0.040048558115959164, + -0.0017598449345678235 + ] + } + }, + "action": { + "x": { + "min": [ + -0.9375 + ], + "max": [ + 0.9375 + ], + "mean": [ + 0.01820324920117855 + ], + "std": [ + 0.2825464606285095 + ], + "q01": [ + -0.6348214149475098 + ], + "q99": [ + 0.7714285850524902 + ] + }, + "y": { + "min": [ + -0.9375 + ], + "max": [ + 0.9375 + ], + "mean": [ + 0.05858374014496803 + ], + "std": [ + 0.35904666781425476 + ], + "q01": [ + -0.7741071581840515 + ], + "q99": [ + 0.8464285731315613 + ] + }, + "z": { + "min": [ + -0.9375 + ], + "max": [ + 0.9375 + ], + "mean": [ + -0.05592384561896324 + ], + "std": [ + 0.3673802614212036 + ], + "q01": [ + -0.7633928656578064 + ], + "q99": [ + 0.9375 + ] + }, + "roll": { + "min": [ + -0.23642857372760773 + ], + "max": [ + 0.30000001192092896 + ], + "mean": [ + 0.004626928828656673 + ], + "std": [ + 0.03770702704787254 + ], + "q01": [ + -0.09749999642372131 + ], + "q99": [ + 0.13928571343421936 + ] + }, + "pitch": { + "min": [ + -0.3053571283817291 + ], + "max": [ + 0.29357144236564636 + ], + "mean": [ + 0.00289608770981431 + ], + "std": [ + 0.05429719388484955 + ], + "q01": [ + -0.14819999992847435 + ], + "q99": [ + 0.15964286029338837 + ] + }, + "yaw": { + "min": [ + -0.3675000071525574 + ], + "max": [ + 0.375 + ], + "mean": [ + -0.007673131301999092 + ], + "std": [ + 0.08725254982709885 + ], + "q01": [ + -0.2742857038974762 + ], + "q99": [ + 0.3246428668498993 + ] + }, + "gripper": { + "min": [ + 0.0 + ], + "max": [ + 1.0 + ], + "mean": [ + 0.5457824468612671 + ], + "std": [ + 0.49815231561660767 + ], + "q01": [ + 0.0 + ], + "q99": [ + 1.0 + ] + } + }, + "relative_action": {} + } +} \ No newline at end of file diff --git a/tests/getting_started/test_data_config_md.py b/tests/getting_started/test_data_config_md.py new file mode 100644 index 000000000..d53106bca --- /dev/null +++ b/tests/getting_started/test_data_config_md.py @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import os +import sys + +import pytest +from test_support.readme import extract_code_blocks, find_block +from test_support.runtime import get_root, run_subprocess_step + + +REPO_ROOT = get_root() +DATA_CONFIG_README = REPO_ROOT / "getting_started" / "data_config.md" + +_IMPORTS = ( + "from gr00t.data.types import ModalityConfig, ActionConfig, ActionFormat, ActionRepresentation, ActionType\n" + "from gr00t.data.embodiment_tags import EmbodimentTag\n" + "from gr00t.configs.data.embodiment_configs import MODALITY_CONFIGS, register_modality_config\n" + "MODALITY_CONFIGS.pop(EmbodimentTag.NEW_EMBODIMENT.value, None)\n" +) +_REGISTER = "register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)\n" + + +@pytest.mark.serial +def test_complete_so100_config() -> None: + """The complete SO-100 config example in data_config.md executes without error.""" + blocks = extract_code_blocks(DATA_CONFIG_README) + so100 = find_block(blocks, "so100_config = {", language="python", occurrence=2) + code = _IMPORTS + "\n" + so100.code + "\n" + _REGISTER + env = {**os.environ} + # Inherit the parent venv; `uv run` here would rebuild gr00t every call. + run_subprocess_step( + [sys.executable, "-c", code], + step="so100_config", + cwd=REPO_ROOT, + env=env, + ) diff --git a/tests/getting_started/test_finetune_new_embodiment_md.py b/tests/getting_started/test_finetune_new_embodiment_md.py new file mode 100644 index 000000000..955cb0cc6 --- /dev/null +++ b/tests/getting_started/test_finetune_new_embodiment_md.py @@ -0,0 +1,109 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import os +import sys + +import pytest +from test_support.readme import extract_code_blocks, find_block, replace_once, run_bash_blocks +from test_support.runtime import get_root, run_subprocess_step + + +REPO_ROOT = get_root() +FINETUNE_README = REPO_ROOT / "getting_started" / "finetune_new_embodiment.md" + +_TRAINING_STEPS = 2 +_CHECKPOINT = f"/tmp/so100/checkpoint-{_TRAINING_STEPS}" + + +# --------------------------------------------------------------------------- +# Step 2: modality configuration + registration +# --------------------------------------------------------------------------- + + +@pytest.mark.serial +def test_modality_config_block() -> None: + """The SO-100 modality config block in finetune_new_embodiment.md executes without error.""" + blocks = extract_code_blocks(FINETUNE_README) + config_block = find_block(blocks, "register_modality_config", language="python") + env = {**os.environ} + # Inherit the parent venv; `uv run` here would rebuild gr00t every call. + run_subprocess_step( + [sys.executable, "-c", config_block.code], + step="modality_config_block", + cwd=REPO_ROOT, + env=env, + ) + + +# --------------------------------------------------------------------------- +# Steps 3 + 4: fine-tune then open-loop eval +# --------------------------------------------------------------------------- + + +@pytest.mark.gpu +@pytest.mark.timeout(1800) +def test_open_loop_eval() -> None: + """Run Step 3 (finetune) then Step 4 (open-loop eval) from finetune_new_embodiment.md.""" + blocks = extract_code_blocks(FINETUNE_README) + env = {**os.environ} + + # Step 3: finetune with minimal steps to produce a NEW_EMBODIMENT checkpoint. + finetune_cmd = replace_once( + replace_once( + replace_once( + replace_once( + replace_once( + find_block(blocks, "--base-model-path", language="bash").code, + "--save-steps 2000", + f"--save-steps {_TRAINING_STEPS}", + ), + "--max-steps 2000", + f"--max-steps {_TRAINING_STEPS}", + ), + "--use-wandb", + "--no-use-wandb", + ), + "--global-batch-size 32", + "--global-batch-size 2", + ), + "--dataloader-num-workers 4", + "--dataloader-num-workers 0", + ) + finetune_cmd = finetune_cmd.rstrip() + " --skip-weight-loading" + run_bash_blocks( + [finetune_cmd], + cwd=REPO_ROOT, + env={ + **env, + "DATALOADER_NUM_WORKERS": "0", + "SHARD_SIZE": "64", + "NUM_SHARDS_PER_EPOCH": "1", + }, + ) + + # Step 4: open-loop eval against the freshly produced checkpoint. + eval_cmd = replace_once( + replace_once( + find_block(blocks, "open_loop_eval.py", language="bash").code, + "/tmp/so100/checkpoint-2000", + _CHECKPOINT, + ), + "--steps 400", + "--steps 5", + ) + run_bash_blocks([eval_cmd], cwd=REPO_ROOT, env=env) diff --git a/tests/getting_started/test_policy_md.py b/tests/getting_started/test_policy_md.py new file mode 100644 index 000000000..eb9c84ad2 --- /dev/null +++ b/tests/getting_started/test_policy_md.py @@ -0,0 +1,245 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import pathlib + +import numpy as np +import pytest +from test_support.readme import extract_code_blocks, find_block, run_readme_python_blocks +from test_support.runtime import get_root +import torch +from transformers import AutoConfig, AutoModel, PretrainedConfig, PreTrainedModel + + +pytestmark = pytest.mark.serial + + +REPO_ROOT = get_root() +POLICY_README = REPO_ROOT / "getting_started" / "policy.md" + + +# --------------------------------------------------------------------------- +# TinyGr00t — minimal HuggingFace-compatible model registered once per session +# --------------------------------------------------------------------------- + + +class TinyGr00tConfig(PretrainedConfig): + model_type = "TinyGr00t" + + def __init__(self, action_horizon: int = 16, max_action_dim: int = 128, **kwargs): + super().__init__(**kwargs) + self.action_horizon = action_horizon + self.max_action_dim = max_action_dim + + +class TinyGr00tModel(PreTrainedModel): + """Minimal stand-in for Gr00tN1d6: accepts any kwargs, returns zero action_pred.""" + + config_class = TinyGr00tConfig + + def __init__(self, config: TinyGr00tConfig): + super().__init__(config) + self._dummy = torch.nn.Linear(1, 1) + + def get_action(self, **kwargs) -> dict: + batch_size = 1 + for v in kwargs.values(): + if isinstance(v, torch.Tensor) and v.ndim >= 1: + batch_size = v.shape[0] + break + return { + "action_pred": torch.zeros( + batch_size, + self.config.action_horizon, + self.config.max_action_dim, + device=self._dummy.weight.device, + dtype=self._dummy.weight.dtype, + ) + } + + +AutoConfig.register("TinyGr00t", TinyGr00tConfig) +AutoModel.register(TinyGr00tConfig, TinyGr00tModel) + + +@pytest.fixture(scope="session") +def tiny_checkpoint(tmp_path_factory: pytest.TempPathFactory) -> pathlib.Path: + """Save a TinyGr00t checkpoint to a temp directory and return its path.""" + ckpt_dir = tmp_path_factory.mktemp("tiny_gr00t") + model = TinyGr00tModel(TinyGr00tConfig(action_horizon=16, max_action_dim=128)) + model.save_pretrained(ckpt_dir) + return ckpt_dir + + +# --------------------------------------------------------------------------- +# MockProcessor — processor stand-in for policy.md inference tests +# --------------------------------------------------------------------------- + +_POLICY_MD_ACTION_HORIZON = 16 +_POLICY_MD_ACTION_DIM = 7 + + +def _make_policy_md_modality_configs() -> dict: + from gr00t.data.embodiment_tags import EmbodimentTag + from gr00t.data.types import ModalityConfig + + tag = EmbodimentTag.NEW_EMBODIMENT.value + return { + tag: { + "video": ModalityConfig(delta_indices=[0], modality_keys=["wrist_cam"]), + "state": ModalityConfig(delta_indices=[0], modality_keys=["joints"]), + "action": ModalityConfig( + delta_indices=list(range(_POLICY_MD_ACTION_HORIZON)), + modality_keys=["joints"], + ), + "language": ModalityConfig(delta_indices=[0], modality_keys=["task"]), + } + } + + +class MockProcessor: + def eval(self) -> None: + pass + + def get_modality_configs(self) -> dict: + return _make_policy_md_modality_configs() + + def __call__(self, messages) -> dict: + return {} + + @property + def collator(self): + def _collate(inputs: list) -> dict: + return {} + + return _collate + + def decode_action(self, action_array, embodiment_tag, batched_states) -> dict: + return { + "joints": action_array[:, :_POLICY_MD_ACTION_HORIZON, :_POLICY_MD_ACTION_DIM].astype( + np.float32 + ) + } + + +@pytest.fixture +def mock_processor() -> MockProcessor: + """Return a MockProcessor instance for policy.md tests.""" + return MockProcessor() + + +# --------------------------------------------------------------------------- +# Tiny model smoke tests +# --------------------------------------------------------------------------- + + +def test_automodel_loads_tiny_checkpoint(tiny_checkpoint: pathlib.Path) -> None: + """AutoModel.from_pretrained round-trips the tiny checkpoint.""" + model = AutoModel.from_pretrained(tiny_checkpoint) + assert isinstance(model, TinyGr00tModel) + + +def test_get_action_returns_correct_shape(tiny_checkpoint: pathlib.Path) -> None: + """get_action returns action_pred with shape (B, action_horizon, max_action_dim).""" + model = AutoModel.from_pretrained(tiny_checkpoint) + result = model.get_action() + assert "action_pred" in result + assert result["action_pred"].shape == (1, 16, 128) + + +def test_get_action_respects_batch_size(tiny_checkpoint: pathlib.Path) -> None: + """get_action infers batch size from the first tensor kwarg.""" + model = AutoModel.from_pretrained(tiny_checkpoint) + result = model.get_action(state=torch.zeros(4, 10)) + assert result["action_pred"].shape[0] == 4 + + +# --------------------------------------------------------------------------- +# Policy.md integration test — extracts blocks from the README directly +# --------------------------------------------------------------------------- + + +def test_policy_md_steps( + monkeypatch: pytest.MonkeyPatch, + tiny_checkpoint: pathlib.Path, + mock_processor: MockProcessor, +) -> None: + """Run every named step from policy.md using extracted README code blocks.""" + import gr00t.policy.gr00t_policy as _policy_module + + loaded_model = AutoModel.from_pretrained(tiny_checkpoint) + + class _FakeAutoModel: + @staticmethod + def from_pretrained(path, **_): + return loaded_model + + class _FakeAutoProcessor: + @staticmethod + def from_pretrained(path): + return mock_processor + + monkeypatch.setattr(_policy_module, "AutoModel", _FakeAutoModel) + monkeypatch.setattr(_policy_module, "AutoProcessor", _FakeAutoProcessor) + + blocks = extract_code_blocks(POLICY_README) + + # --- Loading the Policy --- + loading_code = ( + find_block(blocks, "Gr00tPolicy(", language="python") + .code.replace('"/path/to/your/checkpoint"', f'r"{tiny_checkpoint}"') + .replace('"cuda:0"', '"cpu"') + ) + + # --- Querying Modality Configurations --- + modality_code = find_block(blocks, "policy.get_modality_config()", language="python").code + + # Injected preamble: resolve undefined dimension variables used by the + # batched-inference block. + dims_preamble = ( + "import numpy as np\n" + "T_video = video_horizon\n" + "T_state = state_horizon\n" + "H, W = 224, 224\n" + "D_state = 7\n" + ) + + # --- Batched Inference --- + batched_inference_code = find_block(blocks, "wrist_cam", language="python").code.replace( + "batch_size = 4", "batch_size = 1" + ) + + # --- Running Inference — action access --- + inference_code = find_block(blocks, "arm_action", language="python").code.replace( + '"action_name"', "action_keys[0]" + ) + + # --- Resetting the Policy --- + reset_code = find_block(blocks, "policy.reset()", language="python").code + + run_readme_python_blocks( + [ + loading_code, + modality_code, + dims_preamble, + batched_inference_code, + inference_code, + reset_code, + ], + readme_path=POLICY_README, + repo_root=REPO_ROOT, + ) diff --git a/tests/getting_started/test_real_world_deployment_md.py b/tests/getting_started/test_real_world_deployment_md.py new file mode 100644 index 000000000..369c31444 --- /dev/null +++ b/tests/getting_started/test_real_world_deployment_md.py @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +from test_support.readme import extract_code_blocks, find_block, run_readme_python_blocks +from test_support.runtime import get_root + + +REPO_ROOT = get_root() +REAL_WORLD_README = REPO_ROOT / "getting_started" / "real_world_deployment.md" + + +def test_quantitative_metrics() -> None: + """Run all three quantitative diagnostic metrics from real_world_deployment.md.""" + blocks = extract_code_blocks(REAL_WORLD_README) + + intra_accel = find_block(blocks, "def metric_intra_accel", language="python") + boundary_jump = find_block(blocks, "def metric_boundary_jump", language="python") + momentum_shift = find_block(blocks, "def metric_momentum_shift", language="python") + + run_readme_python_blocks( + [ + "import numpy as np", + intra_accel, + boundary_jump, + momentum_shift, + # exercise each function with compatible dummy data + "chunks = np.random.randn(3, 5, 4)", + "assert isinstance(metric_intra_accel(chunks), float)", + "assert isinstance(metric_boundary_jump(chunks), float)", + "assert isinstance(metric_momentum_shift(chunks, execute_steps=3), float)", + ], + readme_path=REAL_WORLD_README, + repo_root=REPO_ROOT, + ) diff --git a/tests/gr00t/configs/test_base_config_safe_yaml.py b/tests/gr00t/configs/test_base_config_safe_yaml.py new file mode 100644 index 000000000..18ccae225 --- /dev/null +++ b/tests/gr00t/configs/test_base_config_safe_yaml.py @@ -0,0 +1,191 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only regression tests for the safe-YAML contract on +:class:`gr00t.configs.base_config.Config`: the save side must emit +plain-dict YAML (no ``!!python/`` tags) and the load sides +(``Config.load`` / ``Config.from_pretrained``) must refuse to +instantiate any Python object from a maliciously crafted config.""" + +from __future__ import annotations + +import pytest + + +def _import_config(): + """Lazy import — ``Config`` pulls heavy deps that the CPU-only test + venv may lack at collection time. Skip if unimportable.""" + try: + from gr00t.configs.base_config import Config, get_default_config + except Exception as e: # pragma: no cover - skip path + pytest.skip(f"gr00t.configs.base_config not importable in this env: {e}") + return Config, get_default_config + + +# --------------------------------------------------------------------------- +# Security: the !!python/object tag must never instantiate +# --------------------------------------------------------------------------- + + +def test_save_does_not_emit_python_object_tags(tmp_path): + """Save() output must be plain-dict YAML — no ``!!python/`` tag + anywhere, so the file cannot reopen the construct-from-disk path.""" + Config, get_default_config = _import_config() + cfg = get_default_config() + + out = tmp_path / "config.yaml" + cfg.save(out) + text = out.read_text() + + assert "!!python/" not in text, ( + "Config.save() must not emit !!python/ tags — those re-open the RCE " + "path the safe loader is meant to close. Found python tags in:\n" + f"{text[:500]}" + ) + + +def test_load_rejects_malicious_python_object_tag(tmp_path, monkeypatch): + """``!!python/object/apply:os.system`` must surface a ``ValueError`` + with a migration hint and execute no side effect — proven by the + untouched canary file.""" + Config, _ = _import_config() + canary = tmp_path / "canary.txt" + assert not canary.exists() + + # PyYAML RCE template equivalent to ``os.system(f"touch {canary}")``. + malicious = tmp_path / "malicious.yaml" + malicious.write_text(f"!!python/object/apply:os.system\n- 'touch {canary}'\n") + + with pytest.raises(ValueError) as excinfo: + Config().load(malicious) + + assert not canary.exists(), ( + "Loading the malicious YAML must not have executed the os.system " + "payload — that would mean the safe loader is not in effect." + ) + msg = str(excinfo.value) + assert "rejected unsafe legacy config YAML" in msg or "python/object" in msg.lower(), ( + "Migration error should clearly signal that the legacy unsafe YAML " + f"format was rejected. Got: {msg!r}" + ) + + +def test_from_pretrained_rejects_malicious_python_object_tag(tmp_path): + """The class-level loader shares the same safe-loader contract — pin + the RCE rejection here so a future refactor cannot diverge the two + code paths.""" + Config, _ = _import_config() + canary = tmp_path / "canary_classmethod.txt" + malicious = tmp_path / "malicious.yaml" + malicious.write_text(f"!!python/object/apply:os.system\n- 'touch {canary}'\n") + with pytest.raises(ValueError): + Config.from_pretrained(malicious) + assert not canary.exists() + + +def test_load_rejects_non_mapping_top_level(tmp_path): + """``Config.save()`` always emits a top-level mapping; a YAML that + decodes to e.g. a list must fail loud rather than silently produce + an inert Config.""" + Config, _ = _import_config() + odd = tmp_path / "odd.yaml" + odd.write_text("- a\n- b\n- c\n") + with pytest.raises(ValueError, match="Expected a YAML mapping"): + Config().load(odd) + + +# --------------------------------------------------------------------------- +# Round-trip — save → load reconstructs equivalent dict-form fields +# --------------------------------------------------------------------------- + + +def test_safe_dump_yaml_can_be_loaded_back(tmp_path): + """``save()`` output must be safe-loadable and reconstruct the + top-level dataclasses that :meth:`Config.load_dict` knows how to + rebuild (``model`` / ``data`` / ``training``). Nested dict-typed + fields (e.g. ``data.modality_configs``) come back as raw dicts + under ``yaml.safe_load`` — that's the deliberate type-erasure cost + of dropping ``!!python/object``; recovering nested dataclass types + would belong to a separate load_dict enhancement.""" + Config, get_default_config = _import_config() + from dataclasses import asdict + + cfg = get_default_config() + out = tmp_path / "config.yaml" + cfg.save(out) + + # Round-trip succeeds: no RepresenterError on enums (save side), + # no ConstructorError on safe_load (load side). + loaded = Config().load(out) + + assert type(loaded.training) is type(cfg.training) + assert type(loaded.data) is type(cfg.data) + assert asdict(loaded.training) == asdict(cfg.training) + assert loaded.data.datasets == cfg.data.datasets + + +def test_save_serialises_enum_action_configs(tmp_path): + """``ActionConfig`` carries ``ActionRepresentation`` / ``ActionType`` / + ``ActionFormat`` enum fields and is reachable from the default + ``MODALITY_CONFIGS``. ``yaml.safe_dump`` refuses raw ``Enum`` + instances, so ``Config.save()`` must lower them to ``.value`` + strings via ``_build_safe_tree`` before dumping — otherwise the + pre-fix production save path (``experiment.py``) regresses to a + ``RepresenterError`` at training start.""" + Config, get_default_config = _import_config() + cfg = get_default_config() + out = tmp_path / "config.yaml" + cfg.save(out) + text = out.read_text() + + assert "!!python" not in text + # No enum repr leaks (e.g. ``ActionRepresentation.RELATIVE``); only + # the bare ``.value`` strings should appear. + assert "ActionRepresentation" not in text + assert "ActionFormat" not in text + assert "ActionType" not in text + # At least one known enum value from the default MODALITY_CONFIGS + # made it to disk as a plain string. + assert "relative" in text + + +def test_save_creates_parent_directory(tmp_path): + """Nested target directories must still be created — pin + ``mkdir(parents=True)`` so the safe-yaml refactor cannot drop it.""" + Config, get_default_config = _import_config() + cfg = get_default_config() + nested = tmp_path / "a" / "b" / "c" / "config.yaml" + cfg.save(nested) + assert nested.exists() + + +# --------------------------------------------------------------------------- +# Belt-and-suspenders: canary file must never appear during teardown. +# --------------------------------------------------------------------------- + + +@pytest.fixture(autouse=True) +def _no_stray_canary(tmp_path): + """Teardown safety net: if any security test accidentally executed + its YAML payload, the canary file would exist under ``tmp_path``. + Assert per-test rather than per-process (a stray ``/tmp/canary.txt`` + from an unrelated CI workload would otherwise cause spurious + failures with a misleading regression message).""" + yield + for canary_name in ("canary.txt", "canary_classmethod.txt"): + assert not (tmp_path / canary_name).exists(), ( + f"{canary_name} must not exist — its presence proves a malicious " + "YAML payload executed and the RCE fix regressed." + ) diff --git a/tests/gr00t/configs/test_batch_size_invariant.py b/tests/gr00t/configs/test_batch_size_invariant.py new file mode 100644 index 000000000..fbdb024da --- /dev/null +++ b/tests/gr00t/configs/test_batch_size_invariant.py @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""``accumulated_batch_size`` must equal what HuggingFace ``Trainer`` consumes +per optimizer step (``per_device × num_gpus × gradient_accumulation_steps``).""" + +from __future__ import annotations + +import warnings + +from gr00t.configs.training.training_config import TrainingConfig +import pytest + + +@pytest.mark.parametrize( + "kwargs, per_device, num_gpus, grad_accum", + [ + pytest.param( + dict(global_batch_size=1024, num_gpus=8, gradient_accumulation_steps=4), + 128, + 8, + 4, + id="global_path", + ), + pytest.param( + dict(per_gpu_batch_size=32, num_gpus=8, gradient_accumulation_steps=4), + 32, + 8, + 4, + id="per_gpu_path_regression_pin", + ), + ], +) +def test_training_config_accumulated_mirrors_hf(kwargs, per_device, num_gpus, grad_accum): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + cfg = TrainingConfig(**kwargs) + assert cfg.accumulated_batch_size == per_device * num_gpus * grad_accum diff --git a/tests/gr00t/data/state_action/test_eef_action_format.py b/tests/gr00t/data/state_action/test_eef_action_format.py new file mode 100644 index 000000000..282c38844 --- /dev/null +++ b/tests/gr00t/data/state_action/test_eef_action_format.py @@ -0,0 +1,203 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Tests for EEF (End Effector) action format support. + +Covers: +- EndEffectorPose.from_action_format() for all ActionFormat variants +- EndEffectorActionChunk.from_array() for all ActionFormat variants +- Absolute -> relative -> absolute roundtrip consistency +""" + +from gr00t.data.state_action.action_chunking import EndEffectorActionChunk +from gr00t.data.state_action.pose import EndEffectorPose +from gr00t.data.types import ActionFormat +import numpy as np +import pytest +from scipy.spatial.transform import Rotation + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _random_pose() -> EndEffectorPose: + """Create a random EndEffectorPose with valid rotation.""" + translation = np.random.randn(3) + rotation = Rotation.random() + return EndEffectorPose( + translation=translation, + rotation=rotation.as_quat(), + rotation_type="quat", + rotation_order="xyzw", + ) + + +# --------------------------------------------------------------------------- +# TestEndEffectorPoseFromActionFormat +# --------------------------------------------------------------------------- + + +class TestEndEffectorPoseFromActionFormat: + """Test EndEffectorPose.from_action_format() for all three ActionFormat variants.""" + + def test_xyz_rot6d(self): + original = _random_pose() + flat = original.xyz_rot6d # shape (9,) + reconstructed = EndEffectorPose.from_action_format(flat, ActionFormat.XYZ_ROT6D) + + np.testing.assert_allclose(reconstructed.translation, original.translation, atol=1e-6) + np.testing.assert_allclose( + reconstructed.rotation_matrix, original.rotation_matrix, atol=1e-6 + ) + + def test_xyz_rotvec(self): + original = _random_pose() + flat = original.xyz_rotvec # shape (6,) + reconstructed = EndEffectorPose.from_action_format(flat, ActionFormat.XYZ_ROTVEC) + + np.testing.assert_allclose(reconstructed.translation, original.translation, atol=1e-6) + np.testing.assert_allclose( + reconstructed.rotation_matrix, original.rotation_matrix, atol=1e-6 + ) + + def test_default_homogeneous(self): + original = _random_pose() + flat = original.homogeneous.flatten() # shape (16,) + reconstructed = EndEffectorPose.from_action_format(flat, ActionFormat.DEFAULT) + + np.testing.assert_allclose(reconstructed.translation, original.translation, atol=1e-6) + np.testing.assert_allclose( + reconstructed.rotation_matrix, original.rotation_matrix, atol=1e-6 + ) + + def test_invalid_format_raises(self): + with pytest.raises(ValueError, match="Unsupported ActionFormat"): + EndEffectorPose.from_action_format(np.zeros(9), "not_a_format") + + +# --------------------------------------------------------------------------- +# TestEndEffectorActionChunkFromArray +# --------------------------------------------------------------------------- + + +class TestEndEffectorActionChunkFromArray: + """Test EndEffectorActionChunk.from_array() for all three ActionFormat variants.""" + + @pytest.mark.parametrize( + "action_format, dim", + [ + (ActionFormat.XYZ_ROT6D, 9), + (ActionFormat.XYZ_ROTVEC, 6), + ], + ) + def test_from_array_creates_correct_length(self, action_format, dim): + n_poses = 5 + poses = [_random_pose() for _ in range(n_poses)] + chunk = EndEffectorActionChunk(poses) + array = chunk.to(action_format) # shape (n_poses, dim) + + assert array.shape == (n_poses, dim) + + reconstructed = EndEffectorActionChunk.from_array(array, action_format) + assert len(reconstructed) == n_poses + + def test_from_array_default_format(self): + n_poses = 3 + poses = [_random_pose() for _ in range(n_poses)] + chunk = EndEffectorActionChunk(poses) + array = chunk.to(ActionFormat.DEFAULT) # shape (n_poses, 4, 4) + + # Flatten each 4x4 matrix for from_array (expects 2-D input) + flat_array = array.reshape(n_poses, 16) + reconstructed = EndEffectorActionChunk.from_array(flat_array, ActionFormat.DEFAULT) + assert len(reconstructed) == n_poses + + @pytest.mark.parametrize( + "action_format, dim", + [ + (ActionFormat.XYZ_ROT6D, 9), + (ActionFormat.XYZ_ROTVEC, 6), + ], + ) + def test_from_array_roundtrip(self, action_format, dim): + """to() -> from_array() -> to() should reproduce the same array.""" + poses = [_random_pose() for _ in range(4)] + original_array = EndEffectorActionChunk(poses).to(action_format) + + reconstructed_array = EndEffectorActionChunk.from_array(original_array, action_format).to( + action_format + ) + + np.testing.assert_allclose(reconstructed_array, original_array, atol=1e-5) + + +# --------------------------------------------------------------------------- +# TestEefRoundtrip +# --------------------------------------------------------------------------- + + +class TestEefRoundtrip: + """Absolute -> relative -> absolute roundtrip tests for EEF actions.""" + + @pytest.mark.parametrize( + "action_format", + [ActionFormat.XYZ_ROT6D, ActionFormat.XYZ_ROTVEC], + ) + def test_absolute_relative_absolute_roundtrip(self, action_format): + """Convert to relative and back; the result should match the original.""" + reference = _random_pose() + absolute_poses = [_random_pose() for _ in range(5)] + absolute_chunk = EndEffectorActionChunk(absolute_poses) + + # absolute -> relative + relative_chunk = absolute_chunk.relative_chunking(reference_frame=reference) + + # relative -> absolute + recovered_chunk = relative_chunk.to_absolute_chunking(reference_frame=reference) + + # Compare in the chosen action_format representation + original_array = absolute_chunk.to(action_format) + recovered_array = recovered_chunk.to(action_format) + + np.testing.assert_allclose(recovered_array, original_array, atol=1e-5) + + @pytest.mark.parametrize( + "action_format", + [ActionFormat.XYZ_ROT6D, ActionFormat.XYZ_ROTVEC], + ) + def test_roundtrip_via_flat_arrays(self, action_format): + """Full pipeline: array -> from_array -> relative -> to -> from_array -> absolute -> to.""" + reference = _random_pose() + absolute_poses = [_random_pose() for _ in range(4)] + original_array = EndEffectorActionChunk(absolute_poses).to(action_format) + ref_flat = ( + reference.xyz_rot6d if action_format == ActionFormat.XYZ_ROT6D else reference.xyz_rotvec + ) + + # Reconstruct from flat arrays, compute relative, serialize + abs_chunk = EndEffectorActionChunk.from_array(original_array, action_format) + ref_pose = EndEffectorPose.from_action_format(ref_flat, action_format) + rel_chunk = abs_chunk.relative_chunking(reference_frame=ref_pose) + rel_array = rel_chunk.to(action_format) + + # Reconstruct relative from flat, convert back to absolute, serialize + rel_chunk2 = EndEffectorActionChunk.from_array(rel_array, action_format) + ref_pose2 = EndEffectorPose.from_action_format(ref_flat, action_format) + recovered_chunk = rel_chunk2.to_absolute_chunking(reference_frame=ref_pose2) + recovered_array = recovered_chunk.to(action_format) + + np.testing.assert_allclose(recovered_array, original_array, atol=1e-5) diff --git a/tests/gr00t/data/state_action/test_state_action_processor.py b/tests/gr00t/data/state_action/test_state_action_processor.py new file mode 100644 index 000000000..8b64ef2f9 --- /dev/null +++ b/tests/gr00t/data/state_action/test_state_action_processor.py @@ -0,0 +1,289 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test StateActionProcessor: normalization, denormalization, sin/cos encoding. + +Uses the same modality configs and statistics from the test fixtures directory +(libero_sim embodiment). +""" + +import json +from pathlib import Path + +from gr00t.data.state_action.state_action_processor import StateActionProcessor +import numpy as np +import pytest + + +FIXTURE_DIR = Path(__file__).parent.parent.parent.parent / "fixtures" / "processor_config" +EMBODIMENT = "libero_sim" + + +def _load_fixture_configs(): + """Load modality configs and statistics from test fixtures.""" + with open(FIXTURE_DIR / "processor_config.json") as f: + proc_config = json.load(f) + modality_configs = proc_config["processor_kwargs"]["modality_configs"] + + with open(FIXTURE_DIR / "statistics.json") as f: + statistics = json.load(f) + return modality_configs, statistics + + +@pytest.fixture +def fixture_data(): + modality_configs, statistics = _load_fixture_configs() + state_keys = modality_configs[EMBODIMENT]["state"]["modality_keys"] + action_keys = modality_configs[EMBODIMENT]["action"]["modality_keys"] + proc = StateActionProcessor( + modality_configs=modality_configs, + statistics=statistics, + use_percentiles=False, + clip_outliers=True, + ) + return proc, state_keys, action_keys, statistics + + +@pytest.fixture +def processor(fixture_data): + return fixture_data[0] + + +@pytest.fixture +def modality_keys(fixture_data): + return fixture_data[1], fixture_data[2] + + +@pytest.fixture +def statistics(fixture_data): + return fixture_data[3] + + +def _get_dim_from_stats(statistics, embodiment, modality, key): + """Get the dimension of a key from its statistics (length of min array).""" + return len(statistics[embodiment][modality][key]["min"]) + + +def _random_state(state_keys, statistics): + """Create random state dict with dimensions matching statistics.""" + return { + k: np.random.randn(1, _get_dim_from_stats(statistics, EMBODIMENT, "state", k)).astype( + np.float32 + ) + for k in state_keys + } + + +def _random_action(action_keys, statistics, horizon=16): + """Create random action dict with dimensions matching statistics.""" + return { + k: np.random.randn( + horizon, _get_dim_from_stats(statistics, EMBODIMENT, "action", k) + ).astype(np.float32) + for k in action_keys + } + + +class TestStateNormalization: + """Test state normalization and denormalization roundtrip.""" + + def test_apply_state_returns_all_keys(self, processor, modality_keys, statistics): + state_keys, _ = modality_keys + raw = _random_state(state_keys, statistics) + result = processor.apply_state(raw, EMBODIMENT) + assert set(result.keys()) == set(state_keys) + + def test_normalized_state_within_bounds(self, processor, modality_keys, statistics): + state_keys, _ = modality_keys + raw = _random_state(state_keys, statistics) + result = processor.apply_state(raw, EMBODIMENT) + for key, val in result.items(): + assert val.min() >= -1.0, f"{key}: value {val.min()} < -1" + assert val.max() <= 1.0, f"{key}: value {val.max()} > 1" + + def test_state_roundtrip(self, processor, modality_keys, statistics): + """Normalize then denormalize should recover original values.""" + state_keys, _ = modality_keys + raw = _random_state(state_keys, statistics) + # Keep values within normalization range to avoid clipping + for k in raw: + stats = statistics[EMBODIMENT]["state"][k] + low = np.array(stats["min"]) + high = np.array(stats["max"]) + raw[k] = low + (high - low) * np.random.rand(*raw[k].shape).astype(np.float32) + normalized = processor.apply_state(raw, EMBODIMENT) + recovered = processor.unapply_state(normalized, EMBODIMENT) + for key in state_keys: + np.testing.assert_allclose( + recovered[key], raw[key], atol=1e-4, err_msg=f"Roundtrip failed for {key}" + ) + + def test_missing_key_raises(self, processor): + with pytest.raises(KeyError, match="not found in state dict"): + processor.apply_state({"nonexistent": np.zeros(1)}, EMBODIMENT) + + +class TestActionNormalization: + """Test action normalization and denormalization.""" + + def test_apply_action_returns_all_keys(self, processor, modality_keys, statistics): + _, action_keys = modality_keys + raw = _random_action(action_keys, statistics) + result = processor.apply_action(raw, EMBODIMENT) + assert set(result.keys()) == set(action_keys) + + def test_normalized_action_clipped(self, processor, modality_keys, statistics): + _, action_keys = modality_keys + raw = _random_action(action_keys, statistics) + result = processor.apply_action(raw, EMBODIMENT) + for key, val in result.items(): + assert val.min() >= -1.0, f"{key}: action value {val.min()} < -1" + assert val.max() <= 1.0, f"{key}: action value {val.max()} > 1" + + def test_action_roundtrip(self, processor, modality_keys, statistics): + _, action_keys = modality_keys + # Use values within the normalization range to avoid clipping + raw = _random_action(action_keys, statistics) + # Scale down to stay within range for perfect roundtrip + for k in raw: + stats = statistics[EMBODIMENT]["action"][k] + low = np.array(stats["min"]) + high = np.array(stats["max"]) + raw[k] = low + (high - low) * np.random.rand(*raw[k].shape).astype(np.float32) + normalized = processor.apply_action(raw, EMBODIMENT) + recovered = processor.unapply_action(normalized, EMBODIMENT) + for key in action_keys: + np.testing.assert_allclose( + recovered[key], raw[key], atol=1e-4, err_msg=f"Action roundtrip failed for {key}" + ) + + +class TestApplyConvenience: + """Test the combined apply/unapply convenience methods.""" + + def test_apply_returns_tuple(self, processor, modality_keys, statistics): + state_keys, action_keys = modality_keys + raw_state = _random_state(state_keys, statistics) + raw_action = _random_action(action_keys, statistics) + result = processor.apply(raw_state, raw_action, EMBODIMENT) + assert isinstance(result, tuple) + assert len(result) == 2 + + def test_full_roundtrip(self, processor, modality_keys, statistics): + state_keys, action_keys = modality_keys + raw_state = _random_state(state_keys, statistics) + raw_action = _random_action(action_keys, statistics) + # Keep values within normalization range for exact roundtrip + for k in raw_state: + stats = statistics[EMBODIMENT]["state"][k] + low = np.array(stats["min"]) + high = np.array(stats["max"]) + raw_state[k] = low + (high - low) * np.random.rand(*raw_state[k].shape).astype( + np.float32 + ) + for k in raw_action: + stats = statistics[EMBODIMENT]["action"][k] + low = np.array(stats["min"]) + high = np.array(stats["max"]) + raw_action[k] = low + (high - low) * np.random.rand(*raw_action[k].shape).astype( + np.float32 + ) + norm_state, norm_action = processor.apply(raw_state, raw_action, EMBODIMENT) + rec_state, rec_action = processor.unapply(norm_state, norm_action, EMBODIMENT) + for key in state_keys: + np.testing.assert_allclose(rec_state[key], raw_state[key], atol=1e-4) + for key in action_keys: + np.testing.assert_allclose(rec_action[key], raw_action[key], atol=1e-4) + + +class TestSinCosEncoding: + """Test sin/cos state encoding mode.""" + + def test_sincos_doubles_dimension(self, modality_keys, statistics): + state_keys, _ = modality_keys + modality_configs, statistics_local = _load_fixture_configs() + modality_configs[EMBODIMENT]["state"]["sin_cos_embedding_keys"] = state_keys + proc = StateActionProcessor( + modality_configs=modality_configs, + statistics=statistics_local, + apply_sincos_state_encoding=True, + ) + raw = _random_state(state_keys, statistics) + result = proc.apply_state(raw, EMBODIMENT) + for key in state_keys: + assert result[key].shape[-1] == raw[key].shape[-1] * 2, ( + f"{key}: sin/cos should double dimension" + ) + + +class TestStatistics: + """Test statistics management.""" + + def test_set_statistics(self): + modality_configs, statistics = _load_fixture_configs() + proc = StateActionProcessor(modality_configs=modality_configs) + # No statistics yet — normalization params empty + assert len(proc.norm_params) == 0 + proc.set_statistics(statistics) + assert EMBODIMENT in proc.norm_params + + def test_set_statistics_no_override(self, caplog): + modality_configs, statistics = _load_fixture_configs() + proc = StateActionProcessor(modality_configs=modality_configs, statistics=statistics) + original_min = proc.norm_params[EMBODIMENT]["state"]["x"]["min"].copy() + # Modify statistics + modified = json.loads(json.dumps(statistics)) + modified[EMBODIMENT]["state"]["x"]["min"] = [999.0] + with caplog.at_level("WARNING"): + proc.set_statistics(modified, override=False) + # Should NOT have changed + np.testing.assert_array_equal( + proc.norm_params[EMBODIMENT]["state"]["x"]["min"], original_min + ) + # Discarded merge must surface as a WARNING (not a print) so callers + # running with override_pretraining_statistics=False on a mixture + # dataset see it in their training logs instead of in stdout. + assert any( + r.levelname == "WARNING" and "DISCARDED" in r.message and EMBODIMENT in r.message + for r in caplog.records + ), f"expected a WARNING about discarded statistics; got: {caplog.records}" + + def test_set_statistics_override(self, caplog): + modality_configs, statistics = _load_fixture_configs() + proc = StateActionProcessor(modality_configs=modality_configs, statistics=statistics) + modified = json.loads(json.dumps(statistics)) + modified[EMBODIMENT]["state"]["x"]["min"] = [999.0] + with caplog.at_level("WARNING"): + proc.set_statistics(modified, override=True) + assert proc.norm_params[EMBODIMENT]["state"]["x"]["min"][0] == pytest.approx(999.0) + # No DISCARDED warning when the caller explicitly asked for override. + assert not any("DISCARDED" in r.message for r in caplog.records) + + +class TestTrainEvalMode: + """Test train/eval mode switching.""" + + def test_default_is_train(self, processor): + assert processor.training is True + + def test_eval(self, processor): + processor.eval() + assert processor.training is False + + def test_train(self, processor): + processor.eval() + processor.train() + assert processor.training is True diff --git a/tests/gr00t/data/test_data_preparation.py b/tests/gr00t/data/test_data_preparation.py new file mode 100644 index 000000000..9764b6722 --- /dev/null +++ b/tests/gr00t/data/test_data_preparation.py @@ -0,0 +1,156 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Validate that bundled demo datasets conform to the GR00T LeRobot format +described in getting_started/data_preparation.md. + +Checks: + - Required directory structure (meta/, data/chunk-*, videos/chunk-*) + - Required meta files (info.json, episodes.jsonl, tasks.jsonl, modality.json) + - modality.json schema (state/action keys with start/end, video keys) + - Parquet files exist and contain expected columns + - Video files exist as .mp4 +""" + +from __future__ import annotations + +import json +import pathlib + +import pytest + + +ROOT = pathlib.Path(__file__).resolve().parents[3] +DEMO_DATA_DIR = ROOT / "demo_data" + +# All bundled demo datasets to validate. +DEMO_DATASETS = [ + p for p in DEMO_DATA_DIR.iterdir() if p.is_dir() and (p / "meta" / "modality.json").exists() +] + + +@pytest.fixture(params=[str(d.relative_to(ROOT)) for d in DEMO_DATASETS]) +def dataset_path(request): + return ROOT / request.param + + +class TestDatasetStructure: + """Validate the directory structure required by data_preparation.md.""" + + def test_meta_dir_exists(self, dataset_path): + assert (dataset_path / "meta").is_dir(), f"Missing meta/ in {dataset_path}" + + def test_data_dir_exists(self, dataset_path): + assert (dataset_path / "data").is_dir(), f"Missing data/ in {dataset_path}" + + def test_videos_dir_exists(self, dataset_path): + assert (dataset_path / "videos").is_dir(), f"Missing videos/ in {dataset_path}" + + def test_required_meta_files(self, dataset_path): + meta = dataset_path / "meta" + for filename in ["info.json", "episodes.jsonl", "tasks.jsonl", "modality.json"]: + assert (meta / filename).is_file(), f"Missing {filename} in {meta}" + + def test_data_has_parquet_files(self, dataset_path): + parquets = list((dataset_path / "data").rglob("*.parquet")) + assert parquets, f"No .parquet files found in {dataset_path / 'data'}" + + def test_videos_has_mp4_files(self, dataset_path): + mp4s = list((dataset_path / "videos").rglob("*.mp4")) + assert mp4s, f"No .mp4 files found in {dataset_path / 'videos'}" + + +class TestModalityJson: + """Validate modality.json schema per data_preparation.md.""" + + def test_modality_json_is_valid_json(self, dataset_path): + modality_path = dataset_path / "meta" / "modality.json" + with open(modality_path) as f: + data = json.load(f) + assert isinstance(data, dict) + + def test_modality_has_state_and_action(self, dataset_path): + with open(dataset_path / "meta" / "modality.json") as f: + data = json.load(f) + assert "state" in data, "modality.json missing 'state' key" + assert "action" in data, "modality.json missing 'action' key" + + def test_state_keys_have_start_end(self, dataset_path): + with open(dataset_path / "meta" / "modality.json") as f: + data = json.load(f) + for key, spec in data["state"].items(): + assert "start" in spec, f"state.{key} missing 'start'" + assert "end" in spec, f"state.{key} missing 'end'" + assert isinstance(spec["start"], int), f"state.{key}.start must be int" + assert isinstance(spec["end"], int), f"state.{key}.end must be int" + assert spec["end"] > spec["start"], ( + f"state.{key}: end ({spec['end']}) must be > start ({spec['start']})" + ) + + def test_action_keys_have_start_end(self, dataset_path): + with open(dataset_path / "meta" / "modality.json") as f: + data = json.load(f) + for key, spec in data["action"].items(): + assert "start" in spec, f"action.{key} missing 'start'" + assert "end" in spec, f"action.{key} missing 'end'" + assert isinstance(spec["start"], int), f"action.{key}.start must be int" + assert isinstance(spec["end"], int), f"action.{key}.end must be int" + assert spec["end"] > spec["start"], ( + f"action.{key}: end ({spec['end']}) must be > start ({spec['start']})" + ) + + def test_video_keys_have_original_key(self, dataset_path): + with open(dataset_path / "meta" / "modality.json") as f: + data = json.load(f) + assert "video" in data, ( + f"{dataset_path}: modality.json must define a 'video' section per data_preparation.md" + ) + for key, spec in data["video"].items(): + assert "original_key" in spec, f"video.{key} missing 'original_key'" + + +class TestEpisodesJsonl: + """Validate episodes.jsonl format.""" + + def test_episodes_are_valid_jsonl(self, dataset_path): + episodes_path = dataset_path / "meta" / "episodes.jsonl" + episodes = [] + with open(episodes_path) as f: + for line in f: + line = line.strip() + if line: + episodes.append(json.loads(line)) + assert len(episodes) > 0, "episodes.jsonl is empty" + for ep in episodes: + assert "episode_index" in ep, f"Episode missing 'episode_index': {ep}" + assert "length" in ep, f"Episode missing 'length': {ep}" + + +class TestTasksJsonl: + """Validate tasks.jsonl format.""" + + def test_tasks_are_valid_jsonl(self, dataset_path): + tasks_path = dataset_path / "meta" / "tasks.jsonl" + tasks = [] + with open(tasks_path) as f: + for line in f: + line = line.strip() + if line: + tasks.append(json.loads(line)) + assert len(tasks) > 0, "tasks.jsonl is empty" + for task in tasks: + assert "task_index" in task, f"Task missing 'task_index': {task}" + assert "task" in task, f"Task missing 'task': {task}" diff --git a/tests/gr00t/data/test_dataset_factory.py b/tests/gr00t/data/test_dataset_factory.py new file mode 100644 index 000000000..75edc8384 --- /dev/null +++ b/tests/gr00t/data/test_dataset_factory.py @@ -0,0 +1,126 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test DatasetFactory: dataset construction and statistics generation. + +DatasetFactory.build() depends heavily on Config, distributed utilities, and +real LeRobot datasets. We test the parts that can be isolated: +- merge_statistics (already tested in test_sharded_datasets.py) +- Factory instantiation with mock config +- Build pipeline with mocked dependencies +""" + +from unittest.mock import MagicMock, patch + +import numpy as np +import pytest + + +def _make_mock_config(): + """Create a minimal mock training Config.""" + config = MagicMock() + config.training.eval_strategy = "no" + config.data.mode = "single_turn" + config.data.shard_size = 128 + config.data.episode_sampling_rate = 0.5 + config.data.seed = 42 + config.data.allow_padding = False + config.data.num_shards_per_epoch = 100 + config.data.override_pretraining_statistics = False + + # Single dataset spec + dataset_spec = MagicMock() + dataset_spec.dataset_paths = ["/fake/dataset_path"] + dataset_spec.embodiment_tag = "new_embodiment" + dataset_spec.mix_ratio = 1.0 + config.data.datasets = [dataset_spec] + + config.data.modality_configs = { + "new_embodiment": { + "video": MagicMock(delta_indices=[0], modality_keys=["cam"]), + "state": MagicMock(delta_indices=[0], modality_keys=["x"]), + "action": MagicMock(delta_indices=list(range(4)), modality_keys=["x"]), + "language": MagicMock(delta_indices=[0], modality_keys=["task"]), + } + } + return config + + +class TestDatasetFactory: + """Test factory construction.""" + + def test_init(self): + from gr00t.data.dataset.factory import DatasetFactory + + config = _make_mock_config() + factory = DatasetFactory(config) + assert factory.config is config + + def test_build_creates_mixture_dataset(self): + from gr00t.data.dataset.factory import DatasetFactory + + config = _make_mock_config() + factory = DatasetFactory(config) + mock_processor = MagicMock() + mock_processor.set_statistics = MagicMock() + + mock_dataset = MagicMock() + mock_dataset.__len__ = MagicMock(return_value=10) + mock_dataset.shard_lengths = np.full(10, 100) + mock_dataset.get_shard_length = MagicMock(return_value=100) + mock_dataset.embodiment_tag = type("ET", (), {"value": "new_embodiment"})() + mock_dataset.get_dataset_statistics.return_value = { + "state": { + "x": { + "min": [0.0], + "max": [1.0], + "mean": [0.5], + "std": [0.2], + "q01": [0.05], + "q99": [0.95], + } + }, + "action": { + "x": { + "min": [-1.0], + "max": [1.0], + "mean": [0.0], + "std": [0.3], + "q01": [-0.9], + "q99": [0.9], + } + }, + } + + with ( + patch("gr00t.data.dataset.factory.generate_stats"), + patch("gr00t.data.dataset.factory.generate_rel_stats"), + patch("gr00t.data.dataset.factory.ShardedSingleStepDataset", return_value=mock_dataset), + patch("torch.distributed.is_initialized", return_value=False), + ): + train_ds, eval_ds = factory.build(mock_processor) + + assert train_ds is not None + assert eval_ds is None + + def test_build_rejects_eval_strategy(self): + from gr00t.data.dataset.factory import DatasetFactory + + config = _make_mock_config() + config.training.eval_strategy = "steps" + factory = DatasetFactory(config) + with pytest.raises(AssertionError, match="does not support evaluation"): + factory.build(MagicMock()) diff --git a/tests/gr00t/data/test_demo_dataset_stats.py b/tests/gr00t/data/test_demo_dataset_stats.py new file mode 100644 index 000000000..3350ff7aa --- /dev/null +++ b/tests/gr00t/data/test_demo_dataset_stats.py @@ -0,0 +1,90 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Guard that bundled demo ``stats.json`` dims match ``info.json`` shapes. + +A mismatch means committed stats were produced for a different layout and +silently break normalization for consumers that read stats without regenerating. +""" + +import json +from pathlib import Path + +import numpy as np +import pytest + + +REPO_ROOT = Path(__file__).resolve().parents[3] +DEMO_DATA_ROOT = REPO_ROOT / "demo_data" + + +def _demo_datasets_with_stats() -> list[Path]: + if not DEMO_DATA_ROOT.is_dir(): + return [] + return sorted(p.parent.parent for p in DEMO_DATA_ROOT.glob("*/meta/stats.json")) + + +def _load_json(path: Path): + """Load JSON, returning None for missing / Git-LFS-pointer / unreadable files.""" + try: + if not path.exists() or path.stat().st_size == 0: + return None + return json.loads(path.read_text()) + except (json.JSONDecodeError, OSError, UnicodeDecodeError): + return None + + +def test_demo_data_present_for_guard(): + """Fail if demo_data exists but ships no stats (else the parametrize is a + silent zero-case pass); skip when demo_data is absent entirely.""" + if not DEMO_DATA_ROOT.is_dir(): + pytest.skip("demo_data/ not present on this runner") + assert _demo_datasets_with_stats(), ( + f"{DEMO_DATA_ROOT} exists but no dataset has meta/stats.json to guard" + ) + + +@pytest.mark.parametrize("dataset_dir", _demo_datasets_with_stats(), ids=lambda p: p.name) +def test_demo_dataset_stats_match_info_shapes(dataset_dir: Path): + """Every float feature's stats dim must equal its declared ``info.json`` shape.""" + info = _load_json(dataset_dir / "meta" / "info.json") + stats = _load_json(dataset_dir / "meta" / "stats.json") + if info is None or stats is None: + pytest.skip(f"{dataset_dir.name}: meta not materialised (Git LFS pointer?)") + + features = info.get("features", {}) + checked = 0 + for name, meta in features.items(): + if name not in stats or not isinstance(stats[name], dict): + continue + if "float" not in str(meta.get("dtype", "")): + continue + shape = meta.get("shape") + if not shape: + continue + expected_dim = int(shape[-1]) + for stat_key in ("min", "max", "mean", "std"): + if stat_key not in stats[name]: + continue + got_dim = int(np.asarray(stats[name][stat_key]).shape[-1]) + assert got_dim == expected_dim, ( + f"{dataset_dir.name}: stats['{name}']['{stat_key}'] has dim " + f"{got_dim} but info.json declares shape {shape} (dim {expected_dim}). " + f"Regenerate with gr00t/data/stats.py." + ) + checked += 1 + + if checked == 0: + pytest.skip(f"{dataset_dir.name}: no float features with shapes to check") diff --git a/tests/gr00t/data/test_embodiment_tags.py b/tests/gr00t/data/test_embodiment_tags.py new file mode 100644 index 000000000..bb4c78495 --- /dev/null +++ b/tests/gr00t/data/test_embodiment_tags.py @@ -0,0 +1,262 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Tests for EmbodimentTag enum consistency with N1.7 checkpoint. + +Ensures that: +- All pretrain/posttrain tags have matching entries in the N1.7 + EMBODIMENT_TAG_TO_PROJECTOR_INDEX. +- Removed N1.6 tags are no longer in the enum or configs. +- resolve() error messages categorize tags by usage (base model vs finetuned). +- reverse_lookup() maps tag values back to enum names. +- Tag category sets (PRETRAIN_TAGS, POSTTRAIN_TAGS, FINETUNE_ONLY_TAGS) are + exhaustive and non-overlapping. +""" + +from gr00t.configs.data.embodiment_configs import MODALITY_CONFIGS +from gr00t.data.embodiment_tags import ( + FINETUNE_ONLY_TAGS, + POSTTRAIN_TAGS, + PRETRAIN_TAGS, + EmbodimentTag, +) +from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import EMBODIMENT_TAG_TO_PROJECTOR_INDEX +import pytest + + +class TestEmbodimentTagResolve: + """Verify that EmbodimentTag.resolve() works case-insensitively.""" + + @pytest.mark.parametrize( + "input_str, expected", + [ + # By enum name (various cases) + ("xdof", EmbodimentTag.XDOF), + ("XDOF", EmbodimentTag.XDOF), + ("new_embodiment", EmbodimentTag.NEW_EMBODIMENT), + ("NEW_EMBODIMENT", EmbodimentTag.NEW_EMBODIMENT), + ("robocasa_panda_omron", EmbodimentTag.ROBOCASA_PANDA_OMRON), + ("ROBOCASA_PANDA_OMRON", EmbodimentTag.ROBOCASA_PANDA_OMRON), + ("robocasa_gr1_tabletop", EmbodimentTag.ROBOCASA_GR1_TABLETOP), + ("ROBOCASA_GR1_TABLETOP", EmbodimentTag.ROBOCASA_GR1_TABLETOP), + ("unitree_g1", EmbodimentTag.UNITREE_G1), + ("real_g1", EmbodimentTag.REAL_G1), + # By enum value (various cases) + ("libero_sim", EmbodimentTag.LIBERO_PANDA), + ( + "oxe_droid_relative_eef_relative_joint", + EmbodimentTag.OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT, + ), + ( + "xdof_relative_eef_relative_joint", + EmbodimentTag.XDOF, + ), + ( + "real_g1_relative_eef_relative_joints", + EmbodimentTag.REAL_G1, + ), + # Passthrough of existing enum + (EmbodimentTag.XDOF, EmbodimentTag.XDOF), + # Whitespace tolerance + (" xdof ", EmbodimentTag.XDOF), + ], + ) + def test_resolve_known_tags(self, input_str, expected): + assert EmbodimentTag.resolve(input_str) == expected + + def test_resolve_unknown_raises(self): + with pytest.raises(ValueError, match="Unknown embodiment tag"): + EmbodimentTag.resolve("nonexistent_robot") + + def test_resolve_error_lists_known_tags(self): + with pytest.raises(ValueError, match="XDOF") as exc_info: + EmbodimentTag.resolve("foo") + msg = str(exc_info.value) + for tag in EmbodimentTag: + assert tag.name in msg + + def test_resolve_error_categorizes_tags(self): + """Error message should separate base-model, posttrain, and finetuning tags.""" + with pytest.raises(ValueError) as exc_info: + EmbodimentTag.resolve("fake_tag") + msg = str(exc_info.value) + assert "Base model tags" in msg + assert "Posttrain tags" in msg + assert "Finetuning-only tags" in msg + + +class TestReverseLookup: + """Verify reverse_lookup maps tag values back to enum names.""" + + def test_known_value(self): + assert EmbodimentTag.reverse_lookup("xdof_relative_eef_relative_joint") == "XDOF" + assert EmbodimentTag.reverse_lookup("libero_sim") == "LIBERO_PANDA" + + def test_unknown_value_returns_as_is(self): + assert EmbodimentTag.reverse_lookup("some_internal_tag") == "some_internal_tag" + + +class TestTagCategories: + """Verify PRETRAIN_TAGS, POSTTRAIN_TAGS, and FINETUNE_ONLY_TAGS are correct.""" + + def test_categories_are_exhaustive(self): + """Every enum member must be in exactly one category.""" + all_categorized = PRETRAIN_TAGS | POSTTRAIN_TAGS | FINETUNE_ONLY_TAGS + for tag in EmbodimentTag: + assert tag in all_categorized, ( + f"EmbodimentTag.{tag.name} is not in any category " + f"(PRETRAIN_TAGS, POSTTRAIN_TAGS, or FINETUNE_ONLY_TAGS)" + ) + + def test_categories_are_non_overlapping(self): + """No tag should appear in more than one category.""" + assert not (PRETRAIN_TAGS & POSTTRAIN_TAGS), ( + f"Overlap pretrain/posttrain: {PRETRAIN_TAGS & POSTTRAIN_TAGS}" + ) + assert not (PRETRAIN_TAGS & FINETUNE_ONLY_TAGS), ( + f"Overlap pretrain/finetune: {PRETRAIN_TAGS & FINETUNE_ONLY_TAGS}" + ) + assert not (POSTTRAIN_TAGS & FINETUNE_ONLY_TAGS), ( + f"Overlap posttrain/finetune: {POSTTRAIN_TAGS & FINETUNE_ONLY_TAGS}" + ) + + def test_new_embodiment_is_finetune_only(self): + assert EmbodimentTag.NEW_EMBODIMENT in FINETUNE_ONLY_TAGS + assert EmbodimentTag.ROBOCASA_PANDA_OMRON in FINETUNE_ONLY_TAGS + assert EmbodimentTag.ROBOCASA_GR1_TABLETOP in FINETUNE_ONLY_TAGS + + def test_pretrain_tags_match_base_model(self): + """Pretrain tags should match what's in the base model checkpoint.""" + expected_values = { + "oxe_droid_relative_eef_relative_joint", + "xdof_relative_eef_relative_joint", + "xdof_relative_eef_relative_joint_subtask", + "real_g1_relative_eef_relative_joints", + "real_r1_pro_sharpa_relative_eef", + "real_r1_pro_sharpa_relative_eef_human", + "real_r1_pro_sharpa_relative_eef_maxinsights", + "real_r1_pro_sharpa_relative_eef_mecka", + } + actual_values = {tag.value for tag in PRETRAIN_TAGS} + assert actual_values == expected_values, ( + f"PRETRAIN_TAGS values don't match base model.\n" + f" Missing: {expected_values - actual_values}\n" + f" Extra: {actual_values - expected_values}" + ) + + +class TestRemovedN16Tags: + """Verify that deprecated N1.6-only tags are fully removed.""" + + @pytest.mark.parametrize("tag_name", ["OXE_GOOGLE", "OXE_WIDOWX", "GR1"]) + def test_removed_from_enum(self, tag_name): + assert not hasattr(EmbodimentTag, tag_name), ( + f"EmbodimentTag.{tag_name} should be removed (not in N1.7 checkpoint)" + ) + + @pytest.mark.parametrize("tag_value", ["oxe_google", "oxe_widowx", "gr1_unified"]) + def test_removed_from_modality_configs(self, tag_value): + assert tag_value not in MODALITY_CONFIGS, ( + f"MODALITY_CONFIGS['{tag_value}'] should be removed (not in N1.7 checkpoint)" + ) + + @pytest.mark.parametrize("tag_value", ["oxe_google", "oxe_widowx", "gr1_unified"]) + def test_removed_from_projector_index(self, tag_value): + assert tag_value not in EMBODIMENT_TAG_TO_PROJECTOR_INDEX, ( + f"EMBODIMENT_TAG_TO_PROJECTOR_INDEX['{tag_value}'] should be removed" + ) + + +class TestEmbodimentTagConsistency: + """Verify that all EmbodimentTag enum values have matching configs.""" + + def test_all_tags_in_projector_index(self): + """Every tag must have a projector index mapping.""" + for tag in EmbodimentTag: + assert tag.value in EMBODIMENT_TAG_TO_PROJECTOR_INDEX, ( + f"EmbodimentTag.{tag.name} ('{tag.value}') missing from " + f"EMBODIMENT_TAG_TO_PROJECTOR_INDEX" + ) + + def test_no_extra_projector_entries(self): + """EMBODIMENT_TAG_TO_PROJECTOR_INDEX should not have orphan keys.""" + all_tag_values = {tag.value for tag in EmbodimentTag} + for key in EMBODIMENT_TAG_TO_PROJECTOR_INDEX: + assert key in all_tag_values, ( + f"EMBODIMENT_TAG_TO_PROJECTOR_INDEX has orphan key '{key}' " + f"with no matching EmbodimentTag" + ) + + def test_no_extra_modality_config_entries(self): + """MODALITY_CONFIGS should not have orphan keys without a matching EmbodimentTag.""" + all_tag_values = {tag.value for tag in EmbodimentTag} + for key in MODALITY_CONFIGS: + assert key in all_tag_values, ( + f"MODALITY_CONFIGS has orphan key '{key}' with no matching EmbodimentTag" + ) + + def test_posttrain_tags_with_builtin_configs_in_modality_configs(self): + """Posttrain tags that need built-in modality configs should have them.""" + # These posttrain tags get configs from their finetuned checkpoint, + # not from MODALITY_CONFIGS. + checkpoint_config_tags = { + EmbodimentTag.SIMPLER_ENV_GOOGLE, + EmbodimentTag.SIMPLER_ENV_WIDOWX, + EmbodimentTag.OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT, + } + for tag in POSTTRAIN_TAGS: + if tag in checkpoint_config_tags: + continue + assert tag.value in MODALITY_CONFIGS, ( + f"EmbodimentTag.{tag.name} ('{tag.value}') is a posttrain tag " + f"but missing from MODALITY_CONFIGS" + ) + + def test_robocasa_gr1_tabletop_modality_config(self): + config = MODALITY_CONFIGS[EmbodimentTag.ROBOCASA_GR1_TABLETOP.value] + assert config["video"].modality_keys == ["ego_view_bg_crop_pad_res256_freq20"] + assert config["state"].modality_keys == [ + "left_arm", + "right_arm", + "left_hand", + "right_hand", + "waist", + ] + assert config["action"].delta_indices == list(range(8)) + assert config["language"].modality_keys == ["task"] + + def test_robocasa_panda_omron_modality_config(self): + config = MODALITY_CONFIGS[EmbodimentTag.ROBOCASA_PANDA_OMRON.value] + assert config["video"].modality_keys == [ + "res256_image_side_0", + "res256_image_side_1", + "res256_image_wrist_0", + ] + assert config["state"].modality_keys == [ + "gripper_qpos", + "base_position", + "base_rotation", + "end_effector_position_relative", + "end_effector_rotation_relative", + "gripper_qvel", + "end_effector_position_absolute", + "end_effector_rotation_absolute", + "joint_position", + "joint_position_cos", + "joint_position_sin", + "joint_velocity", + ] + assert config["action"].delta_indices == list(range(8)) + assert config["language"].modality_keys == ["annotation.human.action.task_description"] diff --git a/tests/gr00t/data/test_generate_stats_cache_fingerprint.py b/tests/gr00t/data/test_generate_stats_cache_fingerprint.py new file mode 100644 index 000000000..4637096ec --- /dev/null +++ b/tests/gr00t/data/test_generate_stats_cache_fingerprint.py @@ -0,0 +1,386 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only tests for the per-feature schema-fingerprint cache in ``generate_stats``. + +Without the fingerprint guard, an existing ``meta/stats.json`` was reused as +long as every float feature name was still present, even after the underlying +``info.json`` schema (``dtype`` / ``shape``) had changed -- silently degrading +normalization at training/eval time. The fingerprint hashes the per-feature +schema so any drift invalidates just that feature's cached entry. +""" + +import json + +from gr00t.data.stats import ( + LE_ROBOT_STATS_FILENAME, + STATS_FINGERPRINTS_KEY, + _compute_stats_fingerprint, + _stale_features, + check_stats_validity, + generate_stats, +) +import pytest + + +_STATE_META = {"dtype": "float32", "shape": [17]} +_ACTION_META = {"dtype": "float32", "shape": [17]} +_TIMESTAMP_META = {"dtype": "float32", "shape": [1]} +_TASK_META = {"dtype": "int64", "shape": [1]} + + +def _info_json(features: dict) -> dict: + return { + "codebase_version": "v2.1", + "robot_type": "test", + "total_episodes": 1, + "total_frames": 0, + "fps": 15, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "chunks_size": 1000, + "splits": {"train": "0:1"}, + "features": features, + } + + +def _write_meta(dataset_path, features: dict, stats: dict | None = None) -> None: + meta = dataset_path / "meta" + meta.mkdir(parents=True, exist_ok=True) + (meta / "info.json").write_text(json.dumps(_info_json(features))) + if stats is not None: + (meta / "stats.json").write_text(json.dumps(stats)) + + +def _stub_stat_dict(dim: int = 17) -> dict[str, list[float]]: + return { + "mean": [0.0] * dim, + "std": [1.0] * dim, + "min": [-1.0] * dim, + "max": [1.0] * dim, + "q01": [-0.99] * dim, + "q99": [0.99] * dim, + } + + +@pytest.fixture +def dataset(tmp_path): + return tmp_path + + +@pytest.fixture +def lowdim_features(): + return { + "observation.state": _STATE_META, + "action": _ACTION_META, + "timestamp": _TIMESTAMP_META, + } + + +@pytest.fixture +def mock_calculate(monkeypatch): + """Replace the heavy parquet-driven computation with a counter-stub. + + Returns a list of (features-arg) calls so tests can assert exactly which + features were recomputed on each ``generate_stats`` invocation. + """ + calls: list[list[str]] = [] + + def fake(parquet_paths, features=None): + calls.append(list(features) if features is not None else []) + return {f: _stub_stat_dict() for f in (features or [])} + + monkeypatch.setattr("gr00t.data.stats.calculate_dataset_statistics", fake) + return calls + + +# --------------------------------------------------------------------------- +# _compute_stats_fingerprint -- pure helper, no I/O +# --------------------------------------------------------------------------- + + +class TestStatsFingerprintHelper: + def test_deterministic(self): + a = _compute_stats_fingerprint("action", _ACTION_META) + b = _compute_stats_fingerprint("action", _ACTION_META) + assert a == b + + def test_format_prefix(self): + fp = _compute_stats_fingerprint("action", _ACTION_META) + assert fp.startswith("sha256:") and len(fp) == len("sha256:") + 64 + + def test_distinct_per_feature(self): + a = _compute_stats_fingerprint("action", _ACTION_META) + b = _compute_stats_fingerprint("observation.state", _STATE_META) + assert a != b + + def test_changes_with_dtype(self): + baseline = _compute_stats_fingerprint("action", {"dtype": "float32", "shape": [17]}) + widened = _compute_stats_fingerprint("action", {"dtype": "float64", "shape": [17]}) + assert baseline != widened + + def test_changes_with_shape(self): + baseline = _compute_stats_fingerprint("action", {"dtype": "float32", "shape": [17]}) + grown = _compute_stats_fingerprint("action", {"dtype": "float32", "shape": [21]}) + assert baseline != grown + + +# --------------------------------------------------------------------------- +# _stale_features -- targeted behaviour with hand-shaped stats payloads +# --------------------------------------------------------------------------- + + +class TestStaleFeatures: + def test_none_stats_returns_full_list(self, lowdim_features): + stale = _stale_features(None, lowdim_features, list(lowdim_features)) + assert stale == list(lowdim_features) + + def test_empty_stats_returns_full_list(self, lowdim_features): + assert _stale_features({}, lowdim_features, list(lowdim_features)) == list(lowdim_features) + + def test_full_match_returns_empty(self, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + assert _stale_features(stats, lowdim_features, list(lowdim_features)) == [] + + def test_mismatched_fingerprint_marks_only_that_feature_stale(self, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + stats[STATS_FINGERPRINTS_KEY]["action"] = "sha256:" + "0" * 64 + assert _stale_features(stats, lowdim_features, list(lowdim_features)) == ["action"] + + def test_missing_fingerprint_marks_feature_stale(self, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + del stats[STATS_FINGERPRINTS_KEY]["timestamp"] + assert _stale_features(stats, lowdim_features, list(lowdim_features)) == ["timestamp"] + + def test_missing_stat_field_marks_feature_stale(self, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + del stats["action"]["q01"] + assert _stale_features(stats, lowdim_features, list(lowdim_features)) == ["action"] + + def test_legacy_file_without_fingerprints_marks_all_stale(self, lowdim_features): + legacy = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + assert _stale_features(legacy, lowdim_features, list(lowdim_features)) == list( + lowdim_features + ) + + +# --------------------------------------------------------------------------- +# check_stats_validity -- end-to-end disk read with info.json reconciliation +# --------------------------------------------------------------------------- + + +class TestCheckStatsValidity: + def test_returns_false_when_stats_missing(self, dataset, lowdim_features): + _write_meta(dataset, lowdim_features) + assert not check_stats_validity(dataset, list(lowdim_features)) + + def test_returns_false_when_info_missing(self, dataset, lowdim_features): + # Synthesize a fingerprint-complete stats.json but omit info.json -- without + # info.json we cannot recompute the expected fingerprint and must not + # trust the cache. + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + (dataset / "meta").mkdir(parents=True) + (dataset / "meta" / "stats.json").write_text(json.dumps(stats)) + assert not check_stats_validity(dataset, list(lowdim_features)) + + def test_returns_true_on_full_match(self, dataset, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + _write_meta(dataset, lowdim_features, stats) + assert check_stats_validity(dataset, list(lowdim_features)) + + def test_returns_false_when_dtype_drifts(self, dataset, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + # info.json now reports float64 for `action`; cached fingerprint was float32. + drifted_features = {**lowdim_features, "action": {"dtype": "float64", "shape": [17]}} + _write_meta(dataset, drifted_features, stats) + assert not check_stats_validity(dataset, list(drifted_features)) + + def test_returns_false_when_shape_drifts(self, dataset, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + drifted_features = {**lowdim_features, "action": {"dtype": "float32", "shape": [21]}} + _write_meta(dataset, drifted_features, stats) + assert not check_stats_validity(dataset, list(drifted_features)) + + def test_returns_false_when_feature_absent_from_info(self, dataset, lowdim_features): + stats = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + stats[STATS_FINGERPRINTS_KEY] = { + f: _compute_stats_fingerprint(f, meta) for f, meta in lowdim_features.items() + } + _write_meta(dataset, lowdim_features, stats) + # Caller asks about a feature that does not exist in info.json. + assert not check_stats_validity(dataset, ["never_seen_feature"]) + + +# --------------------------------------------------------------------------- +# generate_stats -- end-to-end caching with mocked compute +# --------------------------------------------------------------------------- + + +class TestGenerateStatsCache: + def test_first_run_computes_and_persists_fingerprints( + self, dataset, lowdim_features, mock_calculate + ): + _write_meta(dataset, lowdim_features) + generate_stats(dataset) + + assert sorted(mock_calculate[-1]) == sorted(lowdim_features) + payload = json.loads((dataset / LE_ROBOT_STATS_FILENAME).read_text()) + assert STATS_FINGERPRINTS_KEY in payload + for f, meta in lowdim_features.items(): + assert f in payload + assert payload[STATS_FINGERPRINTS_KEY][f] == _compute_stats_fingerprint(f, meta) + + def test_second_run_is_full_cache_hit(self, dataset, lowdim_features, mock_calculate): + _write_meta(dataset, lowdim_features) + generate_stats(dataset) + mock_calculate.clear() + + generate_stats(dataset) + + assert mock_calculate == [], "fresh fingerprints must produce zero recompute" + + def test_dtype_change_recomputes_only_that_feature( + self, dataset, lowdim_features, mock_calculate + ): + _write_meta(dataset, lowdim_features) + generate_stats(dataset) + mock_calculate.clear() + + # info.json now reports float64 for `action`; cached fingerprint was float32. + drifted = {**lowdim_features, "action": {"dtype": "float64", "shape": [17]}} + (dataset / "meta" / "info.json").write_text(json.dumps(_info_json(drifted))) + + generate_stats(dataset) + + assert mock_calculate == [["action"]], ( + f"only `action` should recompute on dtype change; got {mock_calculate}" + ) + payload = json.loads((dataset / LE_ROBOT_STATS_FILENAME).read_text()) + assert payload[STATS_FINGERPRINTS_KEY]["action"] == _compute_stats_fingerprint( + "action", drifted["action"] + ) + + def test_new_feature_in_info_recomputes_only_that_feature( + self, dataset, lowdim_features, mock_calculate + ): + _write_meta(dataset, lowdim_features) + generate_stats(dataset) + mock_calculate.clear() + + added = {**lowdim_features, "extra": {"dtype": "float32", "shape": [3]}} + (dataset / "meta" / "info.json").write_text(json.dumps(_info_json(added))) + + generate_stats(dataset) + + assert mock_calculate == [["extra"]] + payload = json.loads((dataset / LE_ROBOT_STATS_FILENAME).read_text()) + assert "extra" in payload + assert "extra" in payload[STATS_FINGERPRINTS_KEY] + + def test_legacy_stats_without_fingerprints_recomputes_all( + self, dataset, lowdim_features, mock_calculate + ): + legacy = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + _write_meta(dataset, lowdim_features, legacy) + + generate_stats(dataset) + + assert sorted(mock_calculate[-1]) == sorted(lowdim_features) + payload = json.loads((dataset / LE_ROBOT_STATS_FILENAME).read_text()) + for f in lowdim_features: + assert f in payload[STATS_FINGERPRINTS_KEY] + + def test_partial_cache_only_recomputes_stale(self, dataset, lowdim_features, mock_calculate): + partial = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + partial[STATS_FINGERPRINTS_KEY] = { + "observation.state": _compute_stats_fingerprint( + "observation.state", lowdim_features["observation.state"] + ), + "timestamp": _compute_stats_fingerprint("timestamp", lowdim_features["timestamp"]), + } + _write_meta(dataset, lowdim_features, partial) + + generate_stats(dataset) + + assert mock_calculate == [["action"]], ( + f"only `action` (no fingerprint) should be recomputed; got {mock_calculate}" + ) + + def test_feature_removed_from_info_drops_phantom_entries( + self, dataset, lowdim_features, mock_calculate + ): + """A feature dropped from ``info.json`` (e.g. sensor / DOF removed + in an upstream dataset rev) must not survive on disk as a + phantom stat dict or fingerprint — under feature churn on shared + NFS that grows ``stats.json`` indefinitely and leaves it + inconsistent with ``info.json``.""" + _write_meta(dataset, lowdim_features) + generate_stats(dataset) + mock_calculate.clear() + + shrunk = {k: v for k, v in lowdim_features.items() if k != "action"} + (dataset / "meta" / "info.json").write_text(json.dumps(_info_json(shrunk))) + + generate_stats(dataset) + + assert mock_calculate == [], "no recompute needed when only removals happened" + payload = json.loads((dataset / LE_ROBOT_STATS_FILENAME).read_text()) + assert "action" not in payload, "stat dict for removed feature must be dropped" + assert "action" not in payload[STATS_FINGERPRINTS_KEY], ( + "fingerprint for removed feature must be dropped" + ) + for f in shrunk: + assert f in payload + assert f in payload[STATS_FINGERPRINTS_KEY] + + def test_corrupt_fingerprint_dict_is_self_healed( + self, dataset, lowdim_features, mock_calculate + ): + # ``__fingerprints__`` is a top-level reserved key; if a bug or external + # writer ever sets it to something non-dict (e.g. a list), generate_stats + # must recover rather than crash. + broken = {f: _stub_stat_dict(meta["shape"][0]) for f, meta in lowdim_features.items()} + broken[STATS_FINGERPRINTS_KEY] = ["not", "a", "dict"] + _write_meta(dataset, lowdim_features, broken) + + generate_stats(dataset) + + payload = json.loads((dataset / LE_ROBOT_STATS_FILENAME).read_text()) + assert isinstance(payload[STATS_FINGERPRINTS_KEY], dict) + for f in lowdim_features: + assert f in payload[STATS_FINGERPRINTS_KEY] diff --git a/tests/gr00t/data/test_sharded_datasets.py b/tests/gr00t/data/test_sharded_datasets.py new file mode 100644 index 000000000..bc88d6023 --- /dev/null +++ b/tests/gr00t/data/test_sharded_datasets.py @@ -0,0 +1,573 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test ShardedSingleStepDataset and ShardedMixtureDataset. + +ShardedSingleStepDataset requires a real LeRobot-format dataset on disk, +so we mock the episode loader to test sharding logic in isolation. +ShardedMixtureDataset tests use lightweight mock ShardedDataset instances. +""" + +from unittest.mock import MagicMock, patch + +from gr00t.data.dataset.sharded_mixture_dataset import ( + ShardedMixtureDataset, + _get_default_pg_tensor_device, + merge_statistics, +) +from gr00t.data.interfaces import ShardedDataset +import numpy as np +import pytest +import torch + + +# --------------------------------------------------------------------------- +# Mock helpers +# --------------------------------------------------------------------------- + + +class MockShardedDataset(ShardedDataset): + """Minimal ShardedDataset for testing mixture logic.""" + + def __init__(self, dataset_path, num_shards=5, shard_length=100, embodiment_tag="robot_a"): + super().__init__(dataset_path) + self.num_shards = num_shards + self._shard_length = shard_length + self.embodiment_tag = type("ET", (), {"value": embodiment_tag})() + self.shard_lengths = np.full(num_shards, shard_length) + self._statistics = { + "state": { + "x": { + "min": [0.0], + "max": [1.0], + "mean": [0.5], + "std": [0.2], + "q01": [0.05], + "q99": [0.95], + }, + }, + "action": { + "x": { + "min": [-1.0], + "max": [1.0], + "mean": [0.0], + "std": [0.3], + "q01": [-0.9], + "q99": [0.9], + }, + }, + } + + def __len__(self): + return self.num_shards + + def get_shard_length(self, idx): + return self._shard_length + + def get_shard(self, idx): + return [{"dummy": i} for i in range(self._shard_length)] + + def get_dataset_statistics(self): + return self._statistics + + +# --------------------------------------------------------------------------- +# merge_statistics tests +# --------------------------------------------------------------------------- + + +class TestMergeStatistics: + """Test weighted statistics merging used by ShardedMixtureDataset.""" + + def test_single_dataset_passthrough(self): + stats = [ + { + "x": { + "min": [0.0], + "max": [1.0], + "mean": [0.5], + "std": [0.2], + "q01": [0.1], + "q99": [0.9], + } + } + ] + merged = merge_statistics(stats, [1.0]) + assert "x" in merged + np.testing.assert_allclose(merged["x"]["mean"], [0.5]) + np.testing.assert_allclose(merged["x"]["min"], [0.0]) + np.testing.assert_allclose(merged["x"]["max"], [1.0]) + + def test_two_datasets_weighted_mean(self): + stats = [ + { + "x": { + "min": [0.0], + "max": [1.0], + "mean": [0.0], + "std": [0.1], + "q01": [0.0], + "q99": [1.0], + } + }, + { + "x": { + "min": [0.0], + "max": [2.0], + "mean": [1.0], + "std": [0.1], + "q01": [0.0], + "q99": [2.0], + } + }, + ] + merged = merge_statistics(stats, [0.5, 0.5]) + np.testing.assert_allclose(merged["x"]["mean"], [0.5]) + np.testing.assert_allclose(merged["x"]["max"], [2.0]) # global max + + def test_weights_are_normalized(self): + stats = [ + { + "x": { + "min": [0.0], + "max": [1.0], + "mean": [0.0], + "std": [0.1], + "q01": [0.0], + "q99": [1.0], + } + }, + { + "x": { + "min": [0.0], + "max": [2.0], + "mean": [2.0], + "std": [0.1], + "q01": [0.0], + "q99": [2.0], + } + }, + ] + merged = merge_statistics(stats, [3.0, 1.0]) + # weighted mean = (0*0.75 + 2*0.25) = 0.5 + np.testing.assert_allclose(merged["x"]["mean"], [0.5]) + + def test_sidecar_metadata_is_skipped(self): + """merge_statistics treats only entries that look like stats dicts (i.e. + carry a 'mean' field) as action keys. Any sibling metadata producers + co-locate at the top level — regardless of naming convention — must be + ignored, not merged.""" + action_entry = { + "min": [0.0], + "max": [1.0], + "mean": [0.5], + "std": [0.2], + "q01": [0.05], + "q99": [0.95], + } + stats = [ + { + "x": action_entry, + # Real-world example: cache fingerprints written by generate_rel_stats (!313). + "__fingerprints__": {"x": "sha256:deadbeef"}, + # Hypothetical future sidecars without dunder convention — the + # structural duck-typing in merge_statistics doesn't care. + "_provenance": {"source": "manual"}, + "schema_version": "1.0", + "row_count": 1234, + } + ] + merged = merge_statistics(stats, [1.0]) + assert set(merged.keys()) == {"x"} + np.testing.assert_allclose(merged["x"]["mean"], [0.5]) + + def test_skips_fingerprints_only_input_does_not_raise(self): + """A relative_stats.json with only a ``__fingerprints__`` key (no real + entries) must merge to an empty dict instead of ``KeyError``. + + Reproduces the failure shape captured in jobs/311959243: + ``per_dataset_stats = [{'__fingerprints__': {}}]`` — building + ShardedMixtureDataset on a LIBERO_PANDA embodiment (no relative-action + keys) wrote ``{"__fingerprints__": {}}`` to ``relative_stats.json``, the + loader exposed it as the ``relative_action`` stats dict, and + ``merge_statistics`` crashed before any training step could run. + """ + stats = [{"__fingerprints__": {}}] + merged = merge_statistics(stats, [1.0], is_relative_stats=True) + assert merged == {} + + +# --------------------------------------------------------------------------- +# ShardedMixtureDataset tests +# --------------------------------------------------------------------------- + + +class TestShardedMixtureDataset: + """Test mixture dataset sampling and iteration.""" + + def _make_mixture(self, num_datasets=2, training=True, num_shards_per_epoch=10): + datasets = [ + MockShardedDataset(f"/fake/path_{i}", num_shards=5, shard_length=100) + for i in range(num_datasets) + ] + weights = [1.0 / num_datasets] * num_datasets + processor = MagicMock() + processor.set_statistics = MagicMock() + with patch("torch.distributed.is_initialized", return_value=False): + return ShardedMixtureDataset( + datasets=datasets, + weights=weights, + processor=processor, + seed=42, + training=training, + num_shards_per_epoch=num_shards_per_epoch, + ) + + def test_length_equals_schedule(self): + mixture = self._make_mixture() + assert len(mixture.shard_sampling_schedule) > 0 + + def test_eval_mode_visits_all_shards(self): + mixture = self._make_mixture(training=False) + schedule = mixture.shard_sampling_schedule + # In eval mode, should visit every shard exactly once + total_shards = sum(len(d) for d in mixture.datasets) + assert len(schedule) == total_shards + + def test_get_dataset_statistics(self): + mixture = self._make_mixture() + stats = mixture.get_dataset_statistics() + assert isinstance(stats, dict) + + def test_processor_receives_statistics(self): + datasets = [MockShardedDataset("/fake/path_0")] + processor = MagicMock() + processor.set_statistics = MagicMock() + with patch("torch.distributed.is_initialized", return_value=False): + ShardedMixtureDataset( + datasets=datasets, + weights=[1.0], + processor=processor, + seed=42, + ) + processor.set_statistics.assert_called_once() + + # ----------------------------------------------------------------------- + # Distributed seeding invariant: rank-symmetric seed enforcement + # ----------------------------------------------------------------------- + # + # ShardedMixtureDataset's shard partitioning works only when every rank + # generates the same shard_sampling_schedule and slices into it + # disjointly. A rank-asymmetric seed silently breaks this (see the class + # docstring's "Distributed seeding invariant" section). The + # _assert_seed_rank_symmetric guard turns that silent failure into a + # fail-fast at __init__ / reset_seed time. + # + # These tests use unittest.mock to stand in for the torch.distributed + # collective so we can simulate a multi-rank environment without spawning + # real processes. + + @staticmethod + def _make_fake_all_gather(per_rank_seeds): + """Build a fake ``dist.all_gather`` that fills the output list with + ``per_rank_seeds`` cast to ``int64`` tensors.""" + + def _fake(out_list, _in_tensor, group=None): + assert len(out_list) == len(per_rank_seeds), "world_size mismatch in test setup" + for slot, seed in zip(out_list, per_rank_seeds): + slot.copy_(torch.tensor([seed], dtype=torch.long)) + + return _fake + + def _make_mixture_dist(self, world_size, this_rank_seed, per_rank_seeds): + """Construct a ShardedMixtureDataset under a faked distributed env + where ``dist.all_gather`` returns ``per_rank_seeds``.""" + datasets = [MockShardedDataset("/fake/path_0")] + processor = MagicMock() + processor.set_statistics = MagicMock() + with ( + patch("torch.distributed.is_initialized", return_value=True), + patch("torch.distributed.get_world_size", return_value=world_size), + patch("torch.distributed.get_rank", return_value=0), + patch( + "torch.distributed.all_gather", + side_effect=self._make_fake_all_gather(per_rank_seeds), + ), + ): + return ShardedMixtureDataset( + datasets=datasets, + weights=[1.0], + processor=processor, + seed=this_rank_seed, + ) + + def test_seed_collective_uses_cpu_for_cpu_backend(self): + with patch("torch.distributed.get_backend", return_value="gloo"): + assert _get_default_pg_tensor_device() == torch.device("cpu") + + def test_seed_collective_uses_current_cuda_device_for_nccl_backend(self): + with ( + patch("torch.distributed.get_backend", return_value="nccl"), + patch("torch.cuda.is_available", return_value=True), + patch("torch.cuda.current_device", return_value=3), + ): + assert _get_default_pg_tensor_device() == torch.device("cuda", 3) + + def test_seed_collective_raises_for_nccl_without_cuda(self): + with ( + patch("torch.distributed.get_backend", return_value="nccl"), + patch("torch.cuda.is_available", return_value=False), + ): + with pytest.raises(RuntimeError, match="requires CUDA tensors"): + _get_default_pg_tensor_device() + + def test_init_passes_when_seeds_match_across_ranks(self): + # All ranks pass the same seed: __init__ must succeed. + mixture = self._make_mixture_dist(world_size=2, this_rank_seed=42, per_rank_seeds=[42, 42]) + assert mixture.seed == 42 + + def test_init_raises_on_seed_mismatch_across_ranks(self): + # rank 0 has seed=42, rank 1 has seed=43 → must fail loudly with a + # message pointing at the docstring section. + with pytest.raises(ValueError, match="seed must be identical on every rank"): + self._make_mixture_dist(world_size=2, this_rank_seed=42, per_rank_seeds=[42, 43]) + + def test_init_raises_on_plus_rank_pattern(self): + # The classic "drive-by fix" pattern: caller did `seed = base + rank` + # so each rank passes a different value. The error message should + # surface all observed seeds. + with pytest.raises(ValueError, match=r"\[42, 43, 44, 45\]"): + self._make_mixture_dist( + world_size=4, + this_rank_seed=42, + per_rank_seeds=[42, 43, 44, 45], + ) + + def test_reset_seed_raises_on_mismatch_across_ranks(self): + # Resume path: reset_seed must enforce the same invariant. We first + # construct a single-rank mixture (fast, no collective), then flip + # world_size and patch dist for the reset_seed call. + mixture = self._make_mixture() + mixture.world_size = 2 + with ( + patch("torch.distributed.is_initialized", return_value=True), + patch( + "torch.distributed.all_gather", + side_effect=self._make_fake_all_gather([100, 101]), + ), + ): + with pytest.raises(ValueError, match="seed must be identical on every rank"): + mixture.reset_seed(100) + + def test_assert_is_noop_in_single_rank(self): + # The hot path: not distributed at all. Must not call all_gather. + with ( + patch("torch.distributed.is_initialized", return_value=False), + patch("torch.distributed.all_gather") as mock_all_gather, + ): + self._make_mixture() # no exception + mock_all_gather.assert_not_called() + + def test_assert_is_noop_when_world_size_one(self): + # Distributed but world_size == 1 (degenerate single-process dist + # init). Still no collective. + datasets = [MockShardedDataset("/fake/path_0")] + processor = MagicMock() + processor.set_statistics = MagicMock() + with ( + patch("torch.distributed.is_initialized", return_value=True), + patch("torch.distributed.get_world_size", return_value=1), + patch("torch.distributed.get_rank", return_value=0), + patch("torch.distributed.all_gather") as mock_all_gather, + ): + ShardedMixtureDataset( + datasets=datasets, + weights=[1.0], + processor=processor, + seed=42, + ) + mock_all_gather.assert_not_called() + + +# --------------------------------------------------------------------------- +# ShardedSingleStepDataset tests (with mocked episode loader) +# --------------------------------------------------------------------------- + + +class TestShardedSingleStepDataset: + """Test sharding logic with mocked episode loader.""" + + def test_shard_creation(self): + from gr00t.data.embodiment_tags import EmbodimentTag + from gr00t.data.types import ModalityConfig + + modality_configs = { + "video": ModalityConfig(delta_indices=[0], modality_keys=["cam"]), + "state": ModalityConfig(delta_indices=[0], modality_keys=["x"]), + "action": ModalityConfig(delta_indices=list(range(4)), modality_keys=["x"]), + "language": ModalityConfig(delta_indices=[0], modality_keys=["task"]), + } + + with patch( + "gr00t.data.dataset.sharded_single_step_dataset.LeRobotEpisodeLoader" + ) as MockLoader: + mock_loader = MagicMock() + # 3 episodes, 50 steps each + mock_loader.episode_lengths = [50, 50, 50] + mock_loader.get_episode_length = lambda idx: 50 + MockLoader.return_value = mock_loader + + from gr00t.data.dataset.sharded_single_step_dataset import ShardedSingleStepDataset + + dataset = ShardedSingleStepDataset( + dataset_path="/fake/dataset", + embodiment_tag=EmbodimentTag.NEW_EMBODIMENT, + modality_configs=modality_configs, + shard_size=64, + episode_sampling_rate=0.5, + seed=42, + ) + + assert len(dataset) > 0 + assert all(length > 0 for length in dataset.shard_lengths) + + def test_effective_episode_length(self): + from gr00t.data.embodiment_tags import EmbodimentTag + from gr00t.data.types import ModalityConfig + + modality_configs = { + "video": ModalityConfig(delta_indices=[0], modality_keys=["cam"]), + "state": ModalityConfig(delta_indices=[0], modality_keys=["x"]), + "action": ModalityConfig(delta_indices=list(range(8)), modality_keys=["x"]), + "language": ModalityConfig(delta_indices=[0], modality_keys=["task"]), + } + + with patch( + "gr00t.data.dataset.sharded_single_step_dataset.LeRobotEpisodeLoader" + ) as MockLoader: + mock_loader = MagicMock() + mock_loader.episode_lengths = [50] + mock_loader.get_episode_length = lambda idx: 50 + MockLoader.return_value = mock_loader + + from gr00t.data.dataset.sharded_single_step_dataset import ShardedSingleStepDataset + + dataset = ShardedSingleStepDataset( + dataset_path="/fake/dataset", + embodiment_tag=EmbodimentTag.NEW_EMBODIMENT, + modality_configs=modality_configs, + shard_size=1024, + episode_sampling_rate=1.0, + ) + + # effective = 50 - 8 + 1 = 43 + assert dataset.get_effective_episode_length(0) == 43 + + def test_shard_creation_no_empty_shards_edge_case(self): + """Test that all shards are non-empty even with few episodes and large shard_size. + + This test verifies the fix for GitHub #654 where the assertion + "All shards must have length greater than 0" could fail when: + - Small number of episodes + - Large shard_size relative to total steps + - High action_horizon reducing effective episode lengths + """ + from gr00t.data.embodiment_tags import EmbodimentTag + from gr00t.data.types import ModalityConfig + + modality_configs = { + "video": ModalityConfig(delta_indices=[0], modality_keys=["cam"]), + "state": ModalityConfig(delta_indices=[0], modality_keys=["x"]), + "action": ModalityConfig(delta_indices=list(range(4)), modality_keys=["x"]), + "language": ModalityConfig(delta_indices=[0], modality_keys=["task"]), + } + + # Test case 1: Very few episodes (2) with large shard_size + with patch( + "gr00t.data.dataset.sharded_single_step_dataset.LeRobotEpisodeLoader" + ) as MockLoader: + mock_loader = MagicMock() + # 2 episodes, 50 steps each = 100 total steps + # With shard_size=1024, ceil(100/1024) = 1, so num_shards = min(1, 2) = 1 + mock_loader.episode_lengths = [50, 50] + mock_loader.get_episode_length = lambda idx: 50 + MockLoader.return_value = mock_loader + + from gr00t.data.dataset.sharded_single_step_dataset import ShardedSingleStepDataset + + dataset = ShardedSingleStepDataset( + dataset_path="/fake/dataset", + embodiment_tag=EmbodimentTag.NEW_EMBODIMENT, + modality_configs=modality_configs, + shard_size=1024, + episode_sampling_rate=0.5, # Creates 2 splits per episode = 4 splits total + seed=42, + ) + + assert len(dataset) > 0 + assert all(length > 0 for length in dataset.shard_lengths), ( + "All shards must have length > 0" + ) + + # Test case 2: Single episode with action_horizon reducing effective length + with patch( + "gr00t.data.dataset.sharded_single_step_dataset.LeRobotEpisodeLoader" + ) as MockLoader: + mock_loader = MagicMock() + # 1 episode, 20 steps, action_horizon=8 -> effective = 20 - 8 + 1 = 13 steps + mock_loader.episode_lengths = [20] + mock_loader.get_episode_length = lambda idx: 20 + MockLoader.return_value = mock_loader + + dataset = ShardedSingleStepDataset( + dataset_path="/fake/dataset", + embodiment_tag=EmbodimentTag.NEW_EMBODIMENT, + modality_configs=modality_configs, + shard_size=10, # Small shard_size + episode_sampling_rate=1.0, # 1 split per episode + seed=42, + ) + + assert len(dataset) > 0 + assert all(length > 0 for length in dataset.shard_lengths), ( + "All shards must have length > 0" + ) + + # Test case 3: Many episodes but small shard_size creating more shards than episodes + with patch( + "gr00t.data.dataset.sharded_single_step_dataset.LeRobotEpisodeLoader" + ) as MockLoader: + mock_loader = MagicMock() + # 5 episodes, 100 steps each = 500 total steps + # With shard_size=50, ceil(500/50) = 10, but only 5 episodes + # num_shards = min(10, num_splits) should handle this + mock_loader.episode_lengths = [100, 100, 100, 100, 100] + mock_loader.get_episode_length = lambda idx: 100 + MockLoader.return_value = mock_loader + + dataset = ShardedSingleStepDataset( + dataset_path="/fake/dataset", + embodiment_tag=EmbodimentTag.NEW_EMBODIMENT, + modality_configs=modality_configs, + shard_size=50, + episode_sampling_rate=0.5, # 2 splits per episode = 10 splits + seed=42, + ) + + assert len(dataset) > 0 + assert all(length > 0 for length in dataset.shard_lengths), ( + "All shards must have length > 0" + ) diff --git a/tests/gr00t/data/test_stats_cache_fingerprint.py b/tests/gr00t/data/test_stats_cache_fingerprint.py new file mode 100644 index 000000000..a68a29ebb --- /dev/null +++ b/tests/gr00t/data/test_stats_cache_fingerprint.py @@ -0,0 +1,264 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only tests for the schema-fingerprint cache in ``generate_rel_stats``. + +Without the fingerprint guard, an existing ``meta/relative_stats.json`` was +reused whenever a per-embodiment ``action_key`` name matched, regardless of +whether the inputs that drive the computation (``delta_indices``, ``format``, +``state_key``, ...) had since changed — silently corrupting normalization at +training time. +""" + +from dataclasses import replace +import json +from unittest.mock import patch + +from gr00t.configs.data.embodiment_configs import MODALITY_CONFIGS +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.stats import ( + LE_ROBOT_REL_STATS_FILENAME, + STATS_FINGERPRINTS_KEY, + _compute_relative_action_fingerprint, + generate_rel_stats, +) +from gr00t.data.types import ActionFormat +import numpy as np +import pytest + + +# Real registered embodiment with two RELATIVE action keys (eef_9d, joint_position) +# and one ABSOLUTE (gripper_position) — exercises the cache path without +# needing parquet data once calculate_stats_for_key is mocked. +EMBODIMENT = EmbodimentTag.OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT +RELATIVE_KEYS = ("eef_9d", "joint_position") + + +def _stub_stats(): + """Synthetic stats payload shaped like calculate_stats_for_key's return.""" + return { + "max": np.ones(9, dtype=np.float32), + "min": -np.ones(9, dtype=np.float32), + "q01": -np.ones(9, dtype=np.float32) * 0.99, + "q99": np.ones(9, dtype=np.float32) * 0.99, + "mean": np.zeros(9, dtype=np.float32), + "std": np.ones(9, dtype=np.float32), + } + + +@pytest.fixture +def dataset_dir(tmp_path): + (tmp_path / "meta").mkdir() + return tmp_path + + +@pytest.fixture +def mock_calculate(monkeypatch): + """Replace the heavy parquet-driven computation with a counter-stub.""" + calls = [] + + def fake(dataset_path, embodiment_tag, group_key, max_episodes=-1): + calls.append((str(dataset_path), embodiment_tag.value, group_key)) + return _stub_stats() + + monkeypatch.setattr("gr00t.data.stats.calculate_stats_for_key", fake) + return calls + + +# --------------------------------------------------------------------------- +# _compute_relative_action_fingerprint — pure helper, no I/O +# --------------------------------------------------------------------------- + + +class TestFingerprintHelper: + def test_deterministic(self): + a = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + b = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + assert a == b + + def test_format_prefix(self): + fp = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + assert fp.startswith("sha256:") and len(fp) == len("sha256:") + 64 + + def test_distinct_per_action_key(self): + a = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + b = _compute_relative_action_fingerprint(EMBODIMENT, "joint_position") + assert a != b + + @pytest.mark.parametrize( + "mutator", + [ + pytest.param( + lambda cfg: replace(cfg, format=ActionFormat.XYZ_ROTVEC), + id="format-change", + ), + pytest.param( + lambda cfg: replace(cfg, state_key="other_state_key"), + id="state-key-change", + ), + ], + ) + def test_changes_when_action_config_changes(self, mutator): + """Mutating fields the loader actually reads must invalidate the cache.""" + cfgs = MODALITY_CONFIGS[EMBODIMENT.value] + action_modality = cfgs["action"] + idx = action_modality.modality_keys.index("eef_9d") + original_action_config = action_modality.action_configs[idx] + + baseline = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + + new_configs = list(action_modality.action_configs) + new_configs[idx] = mutator(original_action_config) + with patch.dict( + MODALITY_CONFIGS[EMBODIMENT.value]["action"].__dict__, + {"action_configs": new_configs}, + ): + mutated = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + + assert mutated != baseline + + def test_changes_when_delta_indices_change(self): + baseline = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + action_modality = MODALITY_CONFIGS[EMBODIMENT.value]["action"] + with patch.dict( + action_modality.__dict__, + {"delta_indices": [0, 1, 2]}, + ): + mutated = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + assert mutated != baseline + + +# --------------------------------------------------------------------------- +# generate_rel_stats — cache hit / miss / mixed via mocked calculate_stats_for_key +# --------------------------------------------------------------------------- + + +class TestGenerateRelStatsCache: + def test_first_run_computes_and_persists_fingerprints(self, dataset_dir, mock_calculate): + generate_rel_stats(dataset_dir, EMBODIMENT) + + assert sorted(c[2] for c in mock_calculate) == sorted(RELATIVE_KEYS) + + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME) as f: + payload = json.load(f) + assert STATS_FINGERPRINTS_KEY in payload + for key in RELATIVE_KEYS: + assert key in payload + assert key in payload[STATS_FINGERPRINTS_KEY] + assert payload[STATS_FINGERPRINTS_KEY][key].startswith("sha256:") + + def test_second_run_is_full_cache_hit(self, dataset_dir, mock_calculate): + generate_rel_stats(dataset_dir, EMBODIMENT) + mock_calculate.clear() + + generate_rel_stats(dataset_dir, EMBODIMENT) + + assert mock_calculate == [], "fresh fingerprints must produce zero recompute" + + def test_legacy_file_without_fingerprints_is_regenerated(self, dataset_dir, mock_calculate): + """Pre-existing relative_stats.json from before this fix must be recomputed.""" + legacy_payload = {key: {"_legacy": True} for key in RELATIVE_KEYS} + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME, "w") as f: + json.dump(legacy_payload, f) + + generate_rel_stats(dataset_dir, EMBODIMENT) + + assert sorted(c[2] for c in mock_calculate) == sorted(RELATIVE_KEYS) + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME) as f: + payload = json.load(f) + for key in RELATIVE_KEYS: + assert "_legacy" not in payload[key] + assert payload[STATS_FINGERPRINTS_KEY][key].startswith("sha256:") + + def test_stale_fingerprint_triggers_regenerate(self, dataset_dir, mock_calculate): + generate_rel_stats(dataset_dir, EMBODIMENT) + + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME) as f: + payload = json.load(f) + payload[STATS_FINGERPRINTS_KEY]["eef_9d"] = "sha256:" + "0" * 64 + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME, "w") as f: + json.dump(payload, f) + + mock_calculate.clear() + generate_rel_stats(dataset_dir, EMBODIMENT) + + recomputed = [c[2] for c in mock_calculate] + assert recomputed == ["eef_9d"], f"only the stale key should regenerate; got {recomputed}" + + def test_modality_config_change_invalidates_cache(self, dataset_dir, mock_calculate): + """The whole point of the fingerprint: silently changed config must not get a stale cache hit.""" + generate_rel_stats(dataset_dir, EMBODIMENT) + mock_calculate.clear() + + action_modality = MODALITY_CONFIGS[EMBODIMENT.value]["action"] + idx = action_modality.modality_keys.index("eef_9d") + new_configs = list(action_modality.action_configs) + new_configs[idx] = replace(new_configs[idx], format=ActionFormat.XYZ_ROTVEC) + with patch.dict(action_modality.__dict__, {"action_configs": new_configs}): + generate_rel_stats(dataset_dir, EMBODIMENT) + + recomputed = [c[2] for c in mock_calculate] + assert "eef_9d" in recomputed, "format change must trigger eef_9d regeneration" + assert "joint_position" not in recomputed, ( + "joint_position config did not change; must not be regenerated" + ) + + def test_partial_cache_only_recomputes_missing(self, dataset_dir, mock_calculate): + """Pre-fill cache for one key only; the other should be the only one computed.""" + eef_fp = _compute_relative_action_fingerprint(EMBODIMENT, "eef_9d") + prefilled = { + "eef_9d": {k: v.tolist() for k, v in _stub_stats().items()}, + STATS_FINGERPRINTS_KEY: {"eef_9d": eef_fp}, + } + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME, "w") as f: + json.dump(prefilled, f) + + generate_rel_stats(dataset_dir, EMBODIMENT) + + assert [c[2] for c in mock_calculate] == ["joint_position"] + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME) as f: + payload = json.load(f) + for key in RELATIVE_KEYS: + assert key in payload + assert key in payload[STATS_FINGERPRINTS_KEY] + + +# --------------------------------------------------------------------------- +# Backward compat — downstream consumers must not see __fingerprints__ as data +# --------------------------------------------------------------------------- + + +def test_fingerprints_key_does_not_collide_with_action_keys(): + """Reserved sentinel must not match any registered action key string anywhere.""" + for tag, cfg in MODALITY_CONFIGS.items(): + action = cfg.get("action") + if action is None or action.action_configs is None: + continue + assert STATS_FINGERPRINTS_KEY not in action.modality_keys, ( + f"reserved sentinel {STATS_FINGERPRINTS_KEY!r} collides with an " + f"action key in embodiment {tag!r}" + ) + + +def test_per_action_key_payload_unchanged_shape(dataset_dir, mock_calculate): + """The per-action_key dict written to disk must contain only the stat fields, + not the fingerprint — downstream loader iterates ``stats[key].keys()`` + expecting ``{mean, std, min, max, q01, q99}``. + """ + generate_rel_stats(dataset_dir, EMBODIMENT) + with open(dataset_dir / LE_ROBOT_REL_STATS_FILENAME) as f: + payload = json.load(f) + for key in RELATIVE_KEYS: + assert set(payload[key].keys()) == {"mean", "std", "min", "max", "q01", "q99"} diff --git a/tests/gr00t/data/test_stats_corrupt_cache.py b/tests/gr00t/data/test_stats_corrupt_cache.py new file mode 100644 index 000000000..576245a7d --- /dev/null +++ b/tests/gr00t/data/test_stats_corrupt_cache.py @@ -0,0 +1,132 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Regression tests for the corrupt-stats-cache trap. + +Background: a 0-byte ``meta/relative_stats.json`` (left behind by a previous +writer that was killed mid-flush — ENOSPC, SIGKILL, runner reboot) used to +poison every subsequent caller of ``generate_rel_stats`` with a +``json.JSONDecodeError``. Observed taking down 6 of 8 retried test.unit.gpu +jobs after a /shared NFS ENOSPC event (jobs 312671660-312671673). + +These CPU-only tests pin the contract that ``_load_stats_cache`` and +``_dump_stats_cache_atomic`` together survive any unreadable-cache scenario +without raising and without writing a partially-truncated file the next +caller will trip over. +""" + +import json +from pathlib import Path + +from gr00t.data.stats import _dump_stats_cache_atomic, _load_stats_cache +import pytest + + +class TestLoadStatsCacheTreatsUnreadableAsMissing: + """``_load_stats_cache`` must return ``{}`` for every unreadable state.""" + + def test_missing_file_returns_empty(self, tmp_path: Path) -> None: + assert _load_stats_cache(tmp_path / "absent.json") == {} + + def test_zero_byte_file_returns_empty(self, tmp_path: Path) -> None: + """The exact failure shape from job 312671660: ENOSPC truncated the file.""" + p = tmp_path / "stats.json" + p.touch() + assert p.stat().st_size == 0 + assert _load_stats_cache(p) == {} + + def test_truncated_json_returns_empty(self, tmp_path: Path) -> None: + """Writer killed after the opening ``{`` made it to disk.""" + p = tmp_path / "stats.json" + p.write_text('{"action.foo": {"mea') + assert _load_stats_cache(p) == {} + + def test_garbage_returns_empty(self, tmp_path: Path) -> None: + """Any non-JSON content (e.g. a stray binary blob) falls back to regenerate.""" + p = tmp_path / "stats.json" + p.write_bytes(b"\x00\x01\x02not json") + assert _load_stats_cache(p) == {} + + def test_valid_json_returns_parsed_dict(self, tmp_path: Path) -> None: + """The fast path must still load real caches verbatim.""" + p = tmp_path / "stats.json" + payload = {"action.right_arm": {"mean": [1.0, 2.0], "std": [0.5, 0.5]}} + p.write_text(json.dumps(payload)) + assert _load_stats_cache(p) == payload + + +class TestDumpStatsCacheAtomic: + """``_dump_stats_cache_atomic`` must leave the destination either fully + written or untouched — never half-written.""" + + def test_writes_payload_and_removes_tmp(self, tmp_path: Path) -> None: + """Happy path: tmp sibling must not survive a successful write.""" + p = tmp_path / "stats.json" + payload = {"action.x": {"mean": [1.0]}} + _dump_stats_cache_atomic(p, payload) + + assert json.loads(p.read_text()) == payload + assert not list(tmp_path.glob("*.tmp")), "tmp sibling must not be left behind" + + def test_overwrites_existing_file(self, tmp_path: Path) -> None: + """Subsequent calls replace the previous content atomically.""" + p = tmp_path / "stats.json" + p.write_text('{"old": true}') + _dump_stats_cache_atomic(p, {"new": True}) + assert json.loads(p.read_text()) == {"new": True} + + def test_serializer_failure_preserves_original_and_cleans_tmp(self, tmp_path: Path) -> None: + """If json.dump raises (e.g. non-serializable value), the destination + must still hold the old content and the tmp sibling must be unlinked. + + This is the contract that prevents a SIGKILL-during-write from + creating the very 0-byte file this MR exists to defang. + """ + p = tmp_path / "stats.json" + p.write_text('{"sentinel": "preserved"}') + + with pytest.raises(TypeError): + # ``set`` is not JSON-serializable → json.dump raises mid-write. + _dump_stats_cache_atomic(p, {"bad": {1, 2, 3}}) + + assert json.loads(p.read_text()) == {"sentinel": "preserved"}, ( + "atomic-write contract violated: destination was modified despite " + "the writer raising before completion" + ) + assert not list(tmp_path.glob("*.tmp")), ( + "tmp sibling must be cleaned up after a write failure to avoid " + "littering meta/ with abandoned shards" + ) + + +class TestRoundtripSurvivesCorruption: + """End-to-end: a corrupt cache from the previous run must not block the + next writer from producing a valid one.""" + + def test_load_then_dump_replaces_corrupt_file(self, tmp_path: Path) -> None: + """Mirrors the production sequence in ``generate_rel_stats``: + read existing cache (possibly corrupt) → fill in missing keys → + write atomically. The new file must be a valid JSON dict, not an + accidental concatenation of the old garbage and the new payload. + """ + p = tmp_path / "stats.json" + p.write_bytes(b"") # 0-byte corruption, the smoking-gun failure mode. + + stats = _load_stats_cache(p) + assert stats == {} + stats["action.regenerated"] = {"mean": [42.0]} + _dump_stats_cache_atomic(p, stats) + + assert json.loads(p.read_text()) == {"action.regenerated": {"mean": [42.0]}} diff --git a/tests/gr00t/data/test_stats_embodiment_guard.py b/tests/gr00t/data/test_stats_embodiment_guard.py new file mode 100644 index 000000000..1b0702c3b --- /dev/null +++ b/tests/gr00t/data/test_stats_embodiment_guard.py @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 gr00t.data.stats as stats +from gr00t.data.types import EmbodimentTag +import pytest + + +def test_custom_embodiment_without_config_raises_actionable(monkeypatch): + # Guard runs before generate_stats, so no dataset is touched. + monkeypatch.setattr(stats, "generate_stats", lambda *a, **k: None) + monkeypatch.setattr(stats, "generate_rel_stats", lambda *a, **k: None) + + with pytest.raises(ValueError) as exc: + stats.main(dataset_path="/tmp/does-not-exist", embodiment_tag=EmbodimentTag.NEW_EMBODIMENT) + + msg = str(exc.value) + assert "--modality-config-path" in msg + assert "new_embodiment" in msg + + +def test_builtin_embodiment_passes_guard(monkeypatch): + called = [] + monkeypatch.setattr(stats, "generate_stats", lambda *a, **k: called.append("stats")) + monkeypatch.setattr(stats, "generate_rel_stats", lambda *a, **k: called.append("rel")) + + stats.main( + dataset_path="/tmp/whatever", + embodiment_tag=EmbodimentTag.OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT, + ) + + assert called == ["stats", "rel"] diff --git a/tests/gr00t/data/test_stats_pipeline.py b/tests/gr00t/data/test_stats_pipeline.py new file mode 100644 index 000000000..a998f1292 --- /dev/null +++ b/tests/gr00t/data/test_stats_pipeline.py @@ -0,0 +1,249 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test generate_stats() and generate_rel_stats() using the bundled demo dataset. + +These top-down tests exercise deep call chains through: +- stats.py (calculate_dataset_statistics, check_stats_validity, RelativeActionLoader) +- lerobot_episode_loader.py (parquet + video data loading) +- pose.py (EndEffectorPose, JointPose) +- action_chunking.py (relative_chunking) +- utils.py (to_json_serializable) + +Dataset path: ``resolve_libero_demo_dataset_path`` (shared drive, env override, or Git LFS). +""" + +import functools +import json +from pathlib import Path +import shutil + +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.stats import ( + calculate_dataset_statistics, + check_stats_validity, + generate_rel_stats, + generate_stats, +) +import numpy as np +import pyarrow.parquet as pq +import pytest +from test_support.runtime import get_root, resolve_libero_demo_dataset_path + + +ROOT = get_root() +EMBODIMENT = EmbodimentTag("libero_sim") + + +def _parquet_readable(path: Path) -> bool: + """Return True if *path* is a real parquet file (not a Git LFS pointer stub).""" + try: + pq.read_schema(path) + return True + except Exception: + return False + + +@functools.lru_cache(maxsize=1) +def _libero_demo_dataset() -> Path: + return resolve_libero_demo_dataset_path(ROOT) + + +def _dataset_usable() -> bool: + """Check that the demo dataset exists and its parquet files are readable.""" + try: + ds = _libero_demo_dataset() + except (AssertionError, FileNotFoundError): + return False + parquets = sorted(ds.glob("data/*/*.parquet")) + return len(parquets) > 0 and _parquet_readable(parquets[0]) + + +# Skip when the libero_demo dataset is not available (e.g. shallow clone without +# Git LFS, or CI runner without the shared drive mount). The tests run in full +# CI (where LFS data is present) and on any dev machine after `git lfs pull`. +requires_libero_demo = pytest.mark.skipif( + not _dataset_usable(), + reason="libero_demo dataset not available or parquet files are Git LFS stubs", +) + + +@pytest.fixture +def tmp_dataset(tmp_path): + """Copy the demo dataset to a temp directory so we can modify stats files.""" + dest = tmp_path / "libero_demo" + shutil.copytree(_libero_demo_dataset(), dest) + (dest / "meta" / "stats.json").unlink(missing_ok=True) + (dest / "meta" / "relative_stats.json").unlink(missing_ok=True) + return dest + + +@pytest.fixture +def demo_parquet_paths(): + """Sorted parquet episode files from the bundled libero demo dataset.""" + paths = sorted(_libero_demo_dataset().glob("data/*/*.parquet")) + assert len(paths) > 0, "No parquet files found in demo dataset" + return paths + + +@requires_libero_demo +class TestCalculateDatasetStatistics: + """Test the low-level statistics computation on parquet data.""" + + def test_returns_all_requested_features(self, demo_parquet_paths): + features = ["observation.state", "action"] + stats = calculate_dataset_statistics(demo_parquet_paths, features=features) + assert set(stats.keys()) == set(features) + + def test_stat_keys_present(self, demo_parquet_paths): + stats = calculate_dataset_statistics(demo_parquet_paths, features=["observation.state"]) + for stat_name in ("mean", "std", "min", "max", "q01", "q99"): + assert stat_name in stats["observation.state"] + assert len(stats["observation.state"][stat_name]) > 0 + + def test_values_are_finite(self, demo_parquet_paths): + stats = calculate_dataset_statistics(demo_parquet_paths, features=["observation.state"]) + for stat_name in ("mean", "std", "min", "max", "q01", "q99"): + values = np.array(stats["observation.state"][stat_name]) + assert np.all(np.isfinite(values)), f"{stat_name} contains non-finite values" + + def test_mathematical_invariants(self, demo_parquet_paths): + """Verify invariants that must hold for any valid dataset statistics. + + These catch computational bugs (e.g. wrong axis, wrong quantile order) + that structural or finiteness checks would miss. + """ + stats = calculate_dataset_statistics( + demo_parquet_paths, features=["observation.state", "action"] + ) + for feature in ("observation.state", "action"): + s = {k: np.array(v) for k, v in stats[feature].items()} + assert np.all(s["std"] >= 0), f"{feature}: std has negative values" + assert np.all(s["min"] <= s["mean"]), f"{feature}: min > mean" + assert np.all(s["mean"] <= s["max"]), f"{feature}: mean > max" + assert np.all(s["min"] <= s["q01"]), f"{feature}: min > q01" + assert np.all(s["q01"] <= s["q99"]), f"{feature}: q01 > q99" + assert np.all(s["q99"] <= s["max"]), f"{feature}: q99 > max" + dims = {k: len(v) for k, v in s.items()} + assert len(set(dims.values())) == 1, ( + f"{feature}: inconsistent dimensions across stats: {dims}" + ) + + def test_auto_discovers_all_columns(self, demo_parquet_paths): + stats = calculate_dataset_statistics(demo_parquet_paths, features=None) + expected_columns = {"observation.state", "action", "timestamp"} + assert expected_columns.issubset(set(stats.keys())), ( + f"Expected at least {expected_columns}, got {set(stats.keys())}" + ) + + +class TestCheckStatsValidity: + """Test the stats file validity checker.""" + + @requires_libero_demo + def test_valid_existing_stats(self): + assert check_stats_validity(_libero_demo_dataset(), ["observation.state", "action"]) + + @requires_libero_demo + def test_missing_feature_returns_false(self): + assert not check_stats_validity(_libero_demo_dataset(), ["nonexistent_feature_xyz"]) + + def test_missing_file_returns_false(self, tmp_path): + assert not check_stats_validity(tmp_path, ["anything"]) + + @requires_libero_demo + def test_partial_features_returns_false(self): + assert not check_stats_validity( + _libero_demo_dataset(), ["observation.state", "no_such_key"] + ) + + +@requires_libero_demo +class TestGenerateStats: + """Test end-to-end stats generation from demo dataset.""" + + def test_creates_stats_file(self, tmp_dataset): + stats_path = tmp_dataset / "meta" / "stats.json" + assert not stats_path.exists() + generate_stats(tmp_dataset) + assert stats_path.exists() + + def test_generated_stats_are_mathematically_correct(self, tmp_dataset): + """Verify generated stats match independent computation from raw parquet data.""" + import pandas as pd + + generate_stats(tmp_dataset) + with open(tmp_dataset / "meta" / "stats.json") as f: + generated = json.load(f) + + assert "observation.state" in generated + assert "action" in generated + + parquet_paths = sorted(tmp_dataset.glob("data/*/*.parquet")) + raw = pd.concat([pd.read_parquet(p) for p in parquet_paths], axis=0) + + for feature in ("observation.state", "action"): + data = np.vstack([np.asarray(x, dtype=np.float32) for x in raw[feature]]) + expected = { + "mean": np.mean(data, axis=0), + "std": np.std(data, axis=0), + "min": np.min(data, axis=0), + "max": np.max(data, axis=0), + "q01": np.quantile(data, 0.01, axis=0), + "q99": np.quantile(data, 0.99, axis=0), + } + for stat_name, expected_vals in expected.items(): + assert stat_name in generated[feature], ( + f"Missing {stat_name} in generated stats for {feature}" + ) + gen_vals = np.array(generated[feature][stat_name]) + np.testing.assert_allclose( + gen_vals, + expected_vals, + rtol=1e-5, + err_msg=f"{feature}.{stat_name} incorrect", + ) + + def test_skips_when_stats_already_valid(self, tmp_dataset): + generate_stats(tmp_dataset) + stats_path = tmp_dataset / "meta" / "stats.json" + mtime_before = stats_path.stat().st_mtime_ns + generate_stats(tmp_dataset) + mtime_after = stats_path.stat().st_mtime_ns + assert mtime_before == mtime_after, "stats.json should not be rewritten" + + +@requires_libero_demo +class TestGenerateRelStats: + """Test relative stats generation. + + libero_sim uses ABSOLUTE actions (action_configs=None), so generate_rel_stats + should return early at the `if action_config.action_configs is None: return` + guard without writing any file. We verify this early-return contract explicitly. + """ + + def test_early_return_and_idempotent_for_absolute_actions(self, tmp_dataset): + """libero_sim has only ABSOLUTE actions — no relative_stats.json should be created. + + Calls generate_rel_stats twice to also verify idempotency. + """ + rel_stats_path = tmp_dataset / "meta" / "relative_stats.json" + generate_rel_stats(tmp_dataset, EMBODIMENT) + assert not rel_stats_path.exists(), ( + "relative_stats.json should NOT be created for embodiments with only ABSOLUTE actions" + ) + generate_rel_stats(tmp_dataset, EMBODIMENT) + assert not rel_stats_path.exists(), "Idempotency broken on second call" diff --git a/tests/gr00t/eval/sim/test_env_utils.py b/tests/gr00t/eval/sim/test_env_utils.py new file mode 100644 index 000000000..ece31449d --- /dev/null +++ b/tests/gr00t/eval/sim/test_env_utils.py @@ -0,0 +1,218 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Regression tests for env_name → EmbodimentTag mapping. + +Covers all 10 supported sim benchmarks, including fixes for: +- GitHub Issue #479: LIBERO, SimplerEnv Google, SimplerEnv WidowX +""" + +from __future__ import annotations + +import ast +from pathlib import Path +import re + +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.eval.sim.env_utils import ENV_PREFIX_TO_EMBODIMENT_TAG, get_embodiment_tag_from_env_name +import pytest + + +class TestEnvPrefixMapping: + """Verify ENV_PREFIX_TO_EMBODIMENT_TAG covers all known benchmarks.""" + + def test_all_known_prefixes_present(self): + # NOTE: this is an author-vs-author reminder (hand-written set vs the + # map), not the closure guard — it only catches an *accidental* edit to + # the map. The author-vs-truth closure check (every actually-registered + # prefix resolves) lives in TestRegisteredPrefixClosure below. + expected_prefixes = { + "gr00tlocomanip_g1", + "gr00tlocomanip_g1_sim", + "gr00tlocomanip_g1_new", + "gr1_unified", + "robocasa365_panda_omron", + "robocasa_panda_omron", + "simpler_env_google", + "simpler_env_widowx", + "libero_sim", + } + assert set(ENV_PREFIX_TO_EMBODIMENT_TAG.keys()) == expected_prefixes + + def test_related_prefixes_map_to_same_tag(self): + """Prefixes that share a common root must map to the same EmbodimentTag. + + Guards against accidentally assigning a conflicting tag when adding + a new variant of an existing benchmark (e.g. gr00tlocomanip_g1_v2). + """ + for prefix, tag in ENV_PREFIX_TO_EMBODIMENT_TAG.items(): + for other_prefix, other_tag in ENV_PREFIX_TO_EMBODIMENT_TAG.items(): + if prefix != other_prefix and other_prefix.startswith(prefix): + assert tag == other_tag, ( + f"Conflicting tags: '{prefix}' -> {tag}, " + f"'{other_prefix}' -> {other_tag}. " + f"Related prefixes must map to the same EmbodimentTag." + ) + + +class TestGetEmbodimentTagFromEnvName: + """Test get_embodiment_tag_from_env_name() for all supported benchmarks.""" + + # --- Benchmarks that already worked (via explicit checks or fallback) --- + + @pytest.mark.parametrize( + "env_name", + [ + "gr00tlocomanip_g1/LMBottlePnP", + "gr00tlocomanip_g1_sim/LMBottlePnP", + "gr00tlocomanip_g1_new/LMBottlePnP", + ], + ) + def test_locomanip_g1(self, env_name): + assert get_embodiment_tag_from_env_name(env_name) == EmbodimentTag.UNITREE_G1 + + # --- Issue #479 fixes: these were broken before --- + + def test_simpler_env_google(self): + tag = get_embodiment_tag_from_env_name("simpler_env_google/google_robot_pick_coke_can") + assert tag == EmbodimentTag.SIMPLER_ENV_GOOGLE + + def test_simpler_env_widowx(self): + tag = get_embodiment_tag_from_env_name("simpler_env_widowx/widowx_spoon_on_towel") + assert tag == EmbodimentTag.SIMPLER_ENV_WIDOWX + + def test_libero_panda(self): + tag = get_embodiment_tag_from_env_name("libero_sim/KITCHEN_SCENE3_pick_up_the_black_bowl") + assert tag == EmbodimentTag.LIBERO_PANDA + + def test_gr1_unified_maps_to_robocasa_gr1_tabletop(self): + env_name = "gr1_unified/PnPBottleToCabinetClose_GR1ArmsAndWaistFourierHands_Env" + assert get_embodiment_tag_from_env_name(env_name) == EmbodimentTag.ROBOCASA_GR1_TABLETOP + + def test_robocasa_panda_omron_maps_to_dedicated_tag(self): + env_name = "robocasa_panda_omron/OpenDrawer_PandaOmron_Env" + assert get_embodiment_tag_from_env_name(env_name) == EmbodimentTag.ROBOCASA_PANDA_OMRON + + def test_robocasa365_panda_omron_maps_to_dedicated_tag(self): + env_name = "robocasa365_panda_omron/CloseFridge_PandaOmron_Env" + assert get_embodiment_tag_from_env_name(env_name) == EmbodimentTag.ROBOCASA_PANDA_OMRON + + # --- Edge cases --- + + def test_unknown_env_raises_value_error(self): + with pytest.raises(ValueError): + get_embodiment_tag_from_env_name("totally_unknown_env/some_task") + + def test_empty_string_raises_value_error(self): + with pytest.raises(ValueError): + get_embodiment_tag_from_env_name("") + + def test_multi_slash_uses_first_segment(self): + """Only the first segment before '/' is used as the prefix.""" + tag = get_embodiment_tag_from_env_name("simpler_env_google/task/subtask") + assert tag == EmbodimentTag.SIMPLER_ENV_GOOGLE + + +class TestRegisteredPrefixClosure: + """Author-vs-truth closure check for the env-prefix -> EmbodimentTag mapping. + + Binds the mapping to the *real* gym registration sites (the ground truth) + instead of a hand-written prefix list: it scans ``gr00t/eval/sim/**/*.py`` + for ``register(id="/...")`` call sites and asserts that every + statically-registered prefix resolves via + :func:`get_embodiment_tag_from_env_name` without raising. + + This catches the common cross-layer categorical drift: a new benchmark adds + ``register(id="newbench/...")`` but nobody adds the matching + ``ENV_PREFIX_TO_EMBODIMENT_TAG`` entry, which would otherwise only surface + as a ``ValueError`` deep in an eval run. + + Coverage note: prefixes registered in *external* dependencies (e.g. the + ``gr00tlocomanip_*`` envs live outside this repo) or built fully + dynamically are invisible to a static scan; those remain covered by the + actionable fail-fast in ``get_embodiment_tag_from_env_name`` and the + eval-time integration path. + + Implementation note: the scan walks the parsed AST rather than matching raw + source text, so prefixes mentioned only in comments or docstrings are never + picked up — the binding has to be a real ``id=`` keyword argument or an + ``id``/``id_name`` assignment to count. + """ + + # The static leading text of a literal must start with a gym-style prefix. + _PREFIX_RE = re.compile(r"^([a-z][a-z0-9_]*)/") + + @classmethod + def _prefix_from_node(cls, node: ast.AST) -> str | None: + """Extract the leading ``/`` from a str or f-string AST node. + + Returns ``None`` for non-string nodes or f-strings whose text starts + with an interpolation (no statically knowable prefix). + """ + if isinstance(node, ast.Constant) and isinstance(node.value, str): + literal = node.value + elif isinstance(node, ast.JoinedStr) and node.values: + first = node.values[0] + if not (isinstance(first, ast.Constant) and isinstance(first.value, str)): + return None + literal = first.value + else: + return None + match = cls._PREFIX_RE.match(literal) + return match.group(1) if match else None + + def _registered_prefixes(self) -> set[str]: + sim_dir = Path(__file__).resolve().parents[4] / "gr00t" / "eval" / "sim" + assert sim_dir.is_dir(), f"sim source dir not found: {sim_dir}" + prefixes: set[str] = set() + for py in sim_dir.rglob("*.py"): + tree = ast.parse(py.read_text(), filename=str(py)) + for node in ast.walk(tree): + # register(id="/...") / register(id=f"/...") + if isinstance(node, ast.Call): + candidates = [kw.value for kw in node.keywords if kw.arg == "id"] + # id_name = f"/..." (later passed as register(id=id_name)) + elif isinstance(node, ast.Assign): + candidates = ( + [node.value] + if any( + isinstance(t, ast.Name) and t.id in {"id", "id_name"} + for t in node.targets + ) + else [] + ) + else: + continue + for value in candidates: + prefix = self._prefix_from_node(value) + if prefix: + prefixes.add(prefix) + return prefixes + + def test_every_registered_prefix_resolves(self): + prefixes = self._registered_prefixes() + # Guard against a vacuous pass if the scan ever stops finding call sites. + assert prefixes, "found no register(id=...) prefixes to check; the scan likely broke" + unresolved = [] + for prefix in sorted(prefixes): + try: + get_embodiment_tag_from_env_name(f"{prefix}/__closure_probe__") + except ValueError: + unresolved.append(prefix) + assert not unresolved, ( + "These env-prefixes are registered via register(id=...) but resolve to no " + f"EmbodimentTag: {unresolved}. Add them to ENV_PREFIX_TO_EMBODIMENT_TAG in " + "gr00t/eval/sim/env_utils.py." + ) diff --git a/tests/gr00t/eval/sim/test_robocasa365_gymnasium_groot.py b/tests/gr00t/eval/sim/test_robocasa365_gymnasium_groot.py new file mode 100644 index 000000000..fb94bdc66 --- /dev/null +++ b/tests/gr00t/eval/sim/test_robocasa365_gymnasium_groot.py @@ -0,0 +1,96 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import importlib +import sys +import types + +import numpy as np + + +def _install_robocasa365_import_stubs(monkeypatch): + robocasa = types.ModuleType("robocasa") + robocasa_utils = types.ModuleType("robocasa.utils") + robocasa_env_utils = types.ModuleType("robocasa.utils.env_utils") + robocasa_env_utils.create_env = lambda **kwargs: None + + mujoco = types.ModuleType("mujoco") + mujoco.mjtJoint = types.SimpleNamespace(mjJNT_FREE=0, mjJNT_BALL=1) + + robosuite = types.ModuleType("robosuite") + robosuite_controllers = types.ModuleType("robosuite.controllers") + robosuite_composite = types.ModuleType("robosuite.controllers.composite") + robosuite_composite_controller = types.ModuleType( + "robosuite.controllers.composite.composite_controller" + ) + robosuite_composite_controller.HybridMobileBase = type("HybridMobileBase", (), {}) + robosuite_environments = types.ModuleType("robosuite.environments") + robosuite_base = types.ModuleType("robosuite.environments.base") + robosuite_base.REGISTERED_ENVS = [] + + for name, module in { + "robocasa": robocasa, + "robocasa.utils": robocasa_utils, + "robocasa.utils.env_utils": robocasa_env_utils, + "mujoco": mujoco, + "robosuite": robosuite, + "robosuite.controllers": robosuite_controllers, + "robosuite.controllers.composite": robosuite_composite, + "robosuite.controllers.composite.composite_controller": robosuite_composite_controller, + "robosuite.environments": robosuite_environments, + "robosuite.environments.base": robosuite_base, + }.items(): + monkeypatch.setitem(sys.modules, name, module) + + +def test_robocasa365_observation_keys_match_embodiment_config(monkeypatch): + _install_robocasa365_import_stubs(monkeypatch) + module = importlib.import_module("gr00t.eval.sim.robocasa365.gymnasium_groot") + + env = module.GrootRoboCasa365Env.__new__(module.GrootRoboCasa365Env) + env.env = types.SimpleNamespace(robots=[], get_ep_meta=lambda: {"lang": "open the fridge"}) + env.enable_render = True + env.camera_names = module.CAMERA_NAMES + env.render_obs_key = "robot0_agentview_left_image" + env.render_cache = None + + raw_obs = { + "robot0_gripper_qpos": np.zeros(1, dtype=np.float32), + "robot0_base_pos": np.zeros(3, dtype=np.float32), + "robot0_base_quat": np.zeros(4, dtype=np.float32), + "robot0_base_to_eef_pos": np.zeros(3, dtype=np.float32), + "robot0_base_to_eef_quat": np.zeros(4, dtype=np.float32), + "robot0_gripper_qvel": np.zeros(1, dtype=np.float32), + "robot0_eef_pos": np.zeros(3, dtype=np.float32), + "robot0_eef_quat": np.zeros(4, dtype=np.float32), + "robot0_joint_pos": np.zeros(7, dtype=np.float32), + "robot0_joint_pos_cos": np.zeros(7, dtype=np.float32), + "robot0_joint_pos_sin": np.zeros(7, dtype=np.float32), + "robot0_joint_vel": np.zeros(7, dtype=np.float32), + "robot0_agentview_left_image": np.zeros((256, 256, 3), dtype=np.uint8), + "robot0_agentview_right_image": np.zeros((256, 256, 3), dtype=np.uint8), + "robot0_eye_in_hand_image": np.zeros((256, 256, 3), dtype=np.uint8), + } + + obs = env._get_groot_observation(raw_obs) + + assert set(module.VIDEO_OBSERVATION_KEYS).issubset(obs) + assert set(module.ROBOCASA_PANDA_VIDEO_OBSERVATION_KEYS).issubset(obs) + assert obs["video.robot0_agentview_left"].shape == (256, 256, 3) + assert obs["video.res256_image_side_0"].shape == (256, 256, 3) + assert obs["annotation.human.task_description"] == "open the fridge" + assert obs["annotation.human.action.task_description"] == "open the fridge" diff --git a/tests/gr00t/eval/sim/test_simpler_env_success.py b/tests/gr00t/eval/sim/test_simpler_env_success.py new file mode 100644 index 000000000..fb57e98d9 --- /dev/null +++ b/tests/gr00t/eval/sim/test_simpler_env_success.py @@ -0,0 +1,154 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""SimplerEnv success signal must come from the task predicate, not termination. + +The step wrappers previously set ``info["success"] = done``. Under +``terminate_on_success`` the multistep wrapper both terminates on and counts +``info["success"]``, so conflating it with the raw termination flag miscounts +episodes (a timeout/other termination reads as a success, and a success that has +not yet terminated reads as a failure). These CPU-only tests drive ``step`` with a +fake inner env and assert the two signals are decoupled. Heavy sim deps are stubbed +so the test runs without cv2 / simpler_env / transforms3d installed. +""" + +from __future__ import annotations + +import importlib +import sys +import types + +import numpy as np +import pytest + + +_ACTION_KEYS = ( + "action.x", + "action.y", + "action.z", + "action.roll", + "action.pitch", + "action.yaw", + "action.gripper", +) + + +def _install_simpler_env_import_stubs(monkeypatch): + """Register lightweight stand-ins for the module's heavy sim imports.""" + cv2 = types.ModuleType("cv2") + cv2.resize = lambda img, size: img + + gymnasium = types.ModuleType("gymnasium") + gymnasium.Env = type("Env", (), {}) + gymnasium.spaces = types.SimpleNamespace(Box=object, Dict=object, Text=object) + gym_envs = types.ModuleType("gymnasium.envs") + gym_registration = types.ModuleType("gymnasium.envs.registration") + gym_registration.register = lambda **kwargs: None + + simpler_env = types.ModuleType("simpler_env") + simpler_env.make = lambda name: None + se_utils = types.ModuleType("simpler_env.utils") + se_env = types.ModuleType("simpler_env.utils.env") + se_obs = types.ModuleType("simpler_env.utils.env.observation_utils") + se_obs.get_image_from_maniskill2_obs_dict = lambda env, obs: np.zeros((4, 4, 3), np.uint8) + + transforms3d = types.ModuleType("transforms3d") + t3d_euler = types.ModuleType("transforms3d.euler") + t3d_quaternions = types.ModuleType("transforms3d.quaternions") + transforms3d.euler = t3d_euler + transforms3d.quaternions = t3d_quaternions + + for name, module in { + "cv2": cv2, + "gymnasium": gymnasium, + "gymnasium.envs": gym_envs, + "gymnasium.envs.registration": gym_registration, + "simpler_env": simpler_env, + "simpler_env.utils": se_utils, + "simpler_env.utils.env": se_env, + "simpler_env.utils.env.observation_utils": se_obs, + "transforms3d": transforms3d, + "transforms3d.euler": t3d_euler, + "transforms3d.quaternions": t3d_quaternions, + }.items(): + monkeypatch.setitem(sys.modules, name, module) + + +class _FakeInner: + """Minimal inner env returning a controlled (done, info["success"]) pair.""" + + def __init__(self, done: bool, success: bool): + self._done = done + self._success = success + + def step(self, action_vector): + info = {"success": self._success, "elapsed_steps": 1} + return {"agent": {"eef_pos": np.zeros(8)}}, 0.0, self._done, False, info + + +def _make_env(cls, inner): + env = cls.__new__(cls) + env.env = inner + env.image_size = (256, 256) + # Bypass the heavy image/proprio processing; step only needs the info flag. + env._process_observation = lambda obs: {} + # Gripper state used by GoogleFractalEnv._postprocess_gripper (harmless for WidowX). + env.previous_gripper_action = None + env.sticky_action_is_on = False + env.sticky_gripper_action = 0.0 + env.gripper_action_repeat = 0 + env.sticky_gripper_num_repeat = 15 + return env + + +def _action(): + return {key: np.zeros(1, dtype=np.float32) for key in _ACTION_KEYS} + + +@pytest.mark.parametrize("env_cls_name", ["GoogleFractalEnv", "WidowXBridgeEnv"]) +@pytest.mark.parametrize( + "done, success", + [ + (True, False), # termination without task success (e.g. timeout) -> not success + (False, True), # task solved before termination -> success + (True, True), + (False, False), + ], +) +def test_step_success_from_predicate_not_termination(monkeypatch, env_cls_name, done, success): + _install_simpler_env_import_stubs(monkeypatch) + module = importlib.import_module("gr00t.eval.sim.SimplerEnv.simpler_env") + env = _make_env(getattr(module, env_cls_name), _FakeInner(done, success)) + + _obs, _reward, ret_done, _truncated, info = env.step(_action()) + + assert ret_done == done, "termination flag must be passed through unchanged" + assert info["success"] is success, "success must reflect the task predicate, not done" + + +@pytest.mark.parametrize("env_cls_name", ["GoogleFractalEnv", "WidowXBridgeEnv"]) +def test_step_success_defaults_false_when_predicate_absent(monkeypatch, env_cls_name): + _install_simpler_env_import_stubs(monkeypatch) + module = importlib.import_module("gr00t.eval.sim.SimplerEnv.simpler_env") + + class _NoSuccessInner(_FakeInner): + def step(self, action_vector): + return {"agent": {"eef_pos": np.zeros(8)}}, 0.0, True, False, {"elapsed_steps": 1} + + env = _make_env(getattr(module, env_cls_name), _NoSuccessInner(True, False)) + + _obs, _reward, _done, _truncated, info = env.step(_action()) + + assert info["success"] is False, "missing predicate must default to failure, not done" diff --git a/tests/gr00t/eval/sim/test_video_recording_wrapper.py b/tests/gr00t/eval/sim/test_video_recording_wrapper.py new file mode 100644 index 000000000..9809ad2c7 --- /dev/null +++ b/tests/gr00t/eval/sim/test_video_recording_wrapper.py @@ -0,0 +1,148 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from collections import OrderedDict +import io +import shutil + +from gr00t.eval.sim.wrapper.video_recording_wrapper import VideoRecordingWrapper +import gymnasium as gym +import numpy as np +import pytest + + +def _frame(value: int) -> np.ndarray: + return np.full((2, 2, 3), value, dtype=np.uint8) + + +class DummyEnv(gym.Env): + def reset(self, **kwargs): + return {}, {} + + def step(self, action): + return {}, 0.0, False, False, {} + + +def _make_wrapper(record_video_keys=None) -> VideoRecordingWrapper: + return VideoRecordingWrapper( + DummyEnv(), + video_dir=None, + record_video_keys=record_video_keys, + ) + + +def test_video_recording_wrapper_uses_explicit_video_keys_in_order(): + obs = OrderedDict( + [ + ("video.res512_image_side_0", _frame(1)), + ("video.res256_image_side_0", _frame(2)), + ("video.res512_image_side_1", _frame(3)), + ("video.res256_image_side_1", _frame(4)), + ("video.res512_image_wrist_0", _frame(5)), + ("video.res256_image_wrist_0", _frame(6)), + ] + ) + wrapper = _make_wrapper( + ( + "video.res256_image_side_0", + "video.res256_image_side_1", + "video.res256_image_wrist_0", + ) + ) + + selected = wrapper._get_video_frames(obs) + + assert [frame[0, 0, 0] for frame in selected] == [2, 4, 6] + + +def test_video_recording_wrapper_falls_back_to_all_video_keys(): + obs = OrderedDict( + [ + ("video.image", _frame(1)), + ("video.wrist_image", _frame(2)), + ("state.joint_position", np.zeros(7, dtype=np.float32)), + ] + ) + wrapper = _make_wrapper() + + selected = wrapper._get_video_frames(obs) + + assert [frame[0, 0, 0] for frame in selected] == [1, 2] + + +def test_video_recording_wrapper_reports_missing_explicit_video_keys(): + obs = OrderedDict( + [ + ("video.res256_image_side_0", _frame(1)), + ] + ) + wrapper = _make_wrapper(("video.res256_image_side_0", "video.res256_image_wrist_0")) + + try: + wrapper._get_video_frames(obs) + except KeyError as exc: + assert "video.res256_image_wrist_0" in str(exc) + else: + raise AssertionError("Expected KeyError for missing explicit video key") + + +def test_video_recording_wrapper_configures_ffmpeg_h264_quality_options(monkeypatch, tmp_path): + class FakeProcess: + def __init__(self): + self.stdin = io.BytesIO() + self.stderr = io.BytesIO() + + def wait(self): + return 0 + + popen_calls = [] + process = FakeProcess() + monkeypatch.setattr( + "gr00t.eval.sim.wrapper.video_recording_wrapper.subprocess.Popen", + lambda cmd, **kwargs: popen_calls.append((cmd, kwargs)) or process, + ) + + wrapper = VideoRecordingWrapper(DummyEnv(), video_dir=None, fps=5, codec="h264") + wrapper.file_path = tmp_path / "recording.mp4" + wrapper._write_video_frame(_frame(0)) + + cmd, kwargs = popen_calls[0] + assert kwargs["stdin"] == -1 + assert kwargs["stderr"] == -1 + assert cmd[:2] == ["ffmpeg", "-y"] + assert cmd[cmd.index("-vcodec") + 1] == "rawvideo" + assert cmd[cmd.index("-s") + 1] == "2x2" + assert cmd[cmd.index("-r") + 1] == "5" + assert cmd[cmd.index("-an") + 2] == "libx264" + assert cmd[cmd.index("-crf") + 1] == "18" + assert cmd[cmd.index("-profile:v") + 1] == "high" + assert cmd[cmd.index("-pix_fmt", cmd.index("-i")) + 1] == "yuv420p" + assert process.stdin.getvalue() == _frame(0).tobytes() + + +def test_video_recording_wrapper_writes_mp4_with_ffmpeg(tmp_path): + if shutil.which("ffmpeg") is None: + pytest.skip("ffmpeg is not installed") + + wrapper = VideoRecordingWrapper(DummyEnv(), video_dir=None, fps=5) + video_path = tmp_path / "recording.mp4" + + wrapper.file_path = video_path + wrapper._write_video_frame(_frame(0)) + wrapper._write_video_frame(_frame(255)) + wrapper._close_video_writer() + + assert video_path.exists() + assert video_path.stat().st_size > 0 diff --git a/tests/gr00t/eval/sim/wrapper/test_multistep_aggregate.py b/tests/gr00t/eval/sim/wrapper/test_multistep_aggregate.py new file mode 100644 index 000000000..0b7209276 --- /dev/null +++ b/tests/gr00t/eval/sim/wrapper/test_multistep_aggregate.py @@ -0,0 +1,197 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Pin :class:`AggregateMethod` and the +``MultiStepWrapper(reward_agg_method=...)`` constructor's fail-fast +validation: every allowed method round-trips, and any unknown method +raises ``ValueError`` at the constructor boundary (not deep inside the +first ``step()``) with both the bad input and the allowed set named. +""" + +from __future__ import annotations + +from gr00t.eval._horizon_contract import PolicyHorizonSpec +import numpy as np +import pytest + + +def _import_module(): + """``multistep_wrapper`` imports ``gymnasium``; skip cleanly if it + is not installed in this venv.""" + try: + from gr00t.eval.sim.wrapper import multistep_wrapper + except (ImportError, OSError) as e: + pytest.skip(f"multistep_wrapper not importable in this env: {e}") + return multistep_wrapper + + +# --------------------------------------------------------------------------- +# AggregateMethod Enum + aggregate() per-method correctness +# --------------------------------------------------------------------------- + + +def test_aggregate_method_enum_members_match_supported_values(): + """``AggregateMethod`` is a string Enum exposing exactly the + implemented reductions, so the code references typed members rather + than magic strings.""" + from enum import Enum + + mod = _import_module() + assert issubclass(mod.AggregateMethod, Enum) + assert {m.value for m in mod.AggregateMethod} == {"max", "min", "mean", "sum"} + # str-backed members stay interchangeable with their raw strings. + assert mod.AggregateMethod.MAX == "max" + + +@pytest.mark.parametrize( + "method, data, expected", + [ + ("max", [1.0, 2.0, 3.0], 3.0), + ("min", [1.0, 2.0, 3.0], 1.0), + ("mean", [1.0, 2.0, 3.0], 2.0), + ("sum", [1.0, 2.0, 3.0], 6.0), + ], +) +def test_aggregate_returns_expected_value_for_each_allowed_method(method, data, expected): + """Each method in ``AggregateMethod`` produces the documented + reduction, whether passed as the raw string or the Enum member.""" + mod = _import_module() + result = mod.aggregate(np.asarray(data), method=method) + assert result == pytest.approx(expected) + # Passing the typed Enum member yields the same result. + enum_result = mod.aggregate(np.asarray(data), method=mod.AggregateMethod(method)) + assert enum_result == pytest.approx(expected) + + +def test_aggregate_raises_value_error_with_helpful_message_on_unknown_method(): + """``aggregate``'s catch-all raises ``ValueError`` naming the bad + method and the allowed set.""" + mod = _import_module() + with pytest.raises(ValueError) as excinfo: + mod.aggregate(np.asarray([1.0]), method="median") + msg = str(excinfo.value) + assert "median" in msg + assert "max" in msg, "error message must enumerate the allowed set" + + +# --------------------------------------------------------------------------- +# MultiStepWrapper.__init__ fail-fast on reward_agg_method +# --------------------------------------------------------------------------- + + +def _build_dummy_env_kwargs(mod): + """Minimum kwargs to construct ``MultiStepWrapper``. + + The rejection test raises before wrapper setup; the acceptance test + uses the stub env's minimal action/observation spaces to complete + construction. + """ + import gymnasium as gym # type: ignore[import-not-found] + + class _StubEnv(gym.Env): + action_space = gym.spaces.Box(low=-1.0, high=1.0, shape=(1,), dtype=np.float32) + observation_space = gym.spaces.Dict() + + env = _StubEnv() + # Horizon parameters now come from a policy-resolved contract; a + # vision-only, single-step contract is the minimal stand-in. + contract = PolicyHorizonSpec( + n_action_steps=1, + action_horizon=1, + video_delta_indices=(0,), + state_delta_indices=None, + ) + return dict( + env=env, + contract=contract, + max_episode_steps=10, + ) + + +def test_multistep_wrapper_init_rejects_unknown_reward_agg_method(): + """Bad ``reward_agg_method`` raises at construction time, not on + the first ``step()``, and the error names the allowed set.""" + mod = _import_module() + try: + kwargs = _build_dummy_env_kwargs(mod) + except (ImportError, OSError) as e: + pytest.skip(f"gymnasium not importable: {e}") + + with pytest.raises(ValueError) as excinfo: + mod.MultiStepWrapper(reward_agg_method="median", **kwargs) + msg = str(excinfo.value) + assert "median" in msg + assert "max" in msg, "error message must enumerate the allowed set" + + +@pytest.mark.parametrize("method", ["max", "min", "mean", "sum"]) +def test_multistep_wrapper_init_accepts_each_allowed_method(method): + """Every value in ``AggregateMethod`` constructs cleanly.""" + mod = _import_module() + try: + kwargs = _build_dummy_env_kwargs(mod) + except (ImportError, OSError) as e: + pytest.skip(f"gymnasium not importable: {e}") + + wrapper = mod.MultiStepWrapper(reward_agg_method=method, **kwargs) + assert wrapper.reward_agg_method == method + + +# --------------------------------------------------------------------------- +# MultiStepWrapper.step() reports inner env-steps via info["n_env_steps"] +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize("done_after, expected", [(None, 5), (2, 2)]) +def test_step_reports_inner_env_step_count(done_after, expected): + """``step()`` reports the inner env-steps actually taken in + ``info["n_env_steps"]``: the full chunk, or fewer when ``done`` fires + mid-chunk.""" + mod = _import_module() + try: + import gymnasium as gym # type: ignore[import-not-found] + except Exception as e: + pytest.skip(f"gymnasium not importable: {e}") + + class _StubEnv(gym.Env): + action_space = gym.spaces.Box(-1.0, 1.0, (1,), np.float32) + observation_space = gym.spaces.Dict() + _t = 0 + + def reset(self, *, seed=None, options=None): + self._t = 0 + return {}, {} + + def step(self, action): + self._t += 1 + return {}, 1.0, done_after is not None and self._t >= done_after, False, {} + + # Horizon parameters now come from a policy-resolved contract (post-#25/#26/#34); + # a vision-only 5-step contract mirrors _build_dummy_env_kwargs above. n_env_steps + # is independent of the horizon shape, so a single-frame video window suffices. + contract = PolicyHorizonSpec( + n_action_steps=5, + action_horizon=5, + video_delta_indices=(0,), + state_delta_indices=None, + ) + wrapper = mod.MultiStepWrapper( + env=_StubEnv(), + contract=contract, + max_episode_steps=100, + ) + wrapper.reset() + _, _, _, _, info = wrapper.step({"action": np.zeros((5, 1), np.float32)}) + assert info["n_env_steps"] == expected diff --git a/tests/gr00t/eval/sim/wrapper/test_video_recorder_cleanup.py b/tests/gr00t/eval/sim/wrapper/test_video_recorder_cleanup.py new file mode 100644 index 000000000..39e967360 --- /dev/null +++ b/tests/gr00t/eval/sim/wrapper/test_video_recorder_cleanup.py @@ -0,0 +1,103 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Pin the ffmpeg recorder lifecycle: ``close()`` reaps the encoder child +and the inner env, a wedged encoder is killed within the grace window +(never blocks the caller forever), and a non-zero exit still surfaces. + +These tests drive a *real* child ``subprocess`` (a tiny ``python -c`` stand-in +for ffmpeg) rather than a stub, so they exercise the actual +``Popen.communicate()`` semantics — in particular that the cleanup path must +not close stdin before ``communicate()`` flushes it (a stub that never touches +stdin would hide that bug). +""" + +from __future__ import annotations + +import subprocess +import sys + +import pytest + + +def _import_module(): + """The wrapper imports ``gymnasium``/``cv2``; skip cleanly if absent.""" + try: + from gr00t.eval.sim.wrapper import video_recording_wrapper as mod + except (ImportError, OSError) as e: + pytest.skip(f"video_recording_wrapper not importable in this env: {e}") + return mod + + +# Child processes standing in for ffmpeg, all reading stdin like ffmpeg does: +_DRAIN_STDIN = [sys.executable, "-c", "import sys; sys.stdin.buffer.read()"] # exit 0 on EOF +_DRAIN_THEN_FAIL = [sys.executable, "-c", "import sys; sys.stdin.buffer.read(); sys.exit(3)"] +_IGNORE_EOF_SLEEP = [sys.executable, "-c", "import time; time.sleep(30)"] # never exits on EOF + + +def _make_wrapper(mod, cmd): + # gym.Wrapper.__init__ asserts the wrapped env is a real gymnasium.Env, so + # the inner env must subclass it; we still want a trivial close()-tracking + # stand-in. Build it off the wrapper module's own gym to stay skip-safe. + class _FakeEnv(mod.gym.Env): + def __init__(self): + self.closed = False + + def close(self): + self.closed = True + + wrapper = mod.VideoRecordingWrapper(_FakeEnv(), video_dir=None) + wrapper.video_process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stderr=subprocess.PIPE) + return wrapper + + +def test_close_reaps_recorder_and_inner_env(): + mod = _import_module() + wrapper = _make_wrapper(mod, _DRAIN_STDIN) + proc = wrapper.video_process + + wrapper.close() + + assert proc.poll() == 0 # child saw EOF and exited cleanly + assert wrapper.video_process is None + assert wrapper.env.closed is True + + +def test_close_surfaces_nonzero_ffmpeg_exit(): + mod = _import_module() + wrapper = _make_wrapper(mod, _DRAIN_THEN_FAIL) + proc = wrapper.video_process + + with pytest.raises(RuntimeError, match="ffmpeg video recording failed"): + wrapper.close() + + assert proc.poll() == 3 + assert wrapper.video_process is None + assert wrapper.env.closed is True + + +def test_close_kills_wedged_recorder_within_grace(monkeypatch): + mod = _import_module() + monkeypatch.setattr(mod, "_FFMPEG_CLOSE_GRACE_SECONDS", 0.5) + wrapper = _make_wrapper(mod, _IGNORE_EOF_SLEEP) + proc = wrapper.video_process + + with pytest.raises(RuntimeError, match="did not exit"): + wrapper.close() + + assert proc.poll() is not None # was killed and reaped, not left running + # finally-block teardown still ran: child handle dropped, inner env closed. + assert wrapper.video_process is None + assert wrapper.env.closed is True diff --git a/tests/gr00t/eval/test_horizon_contract.py b/tests/gr00t/eval/test_horizon_contract.py new file mode 100644 index 000000000..61497fab4 --- /dev/null +++ b/tests/gr00t/eval/test_horizon_contract.py @@ -0,0 +1,163 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only tests for the policy-resolved horizon contract. + +These are dependency-free: they exercise ``PolicyHorizonSpec`` against a tiny +fake modality config, with no gym / torch / model import. +""" + +from dataclasses import dataclass + +from gr00t.eval._horizon_contract import PolicyHorizonSpec, migrate_deprecated_action_horizon_argv +import numpy as np +import pytest + + +@dataclass +class _FakeModalityConfig: + delta_indices: list + + +class _FakePolicy: + def __init__(self, modality_config): + self._mc = modality_config + + def get_modality_config(self): + return self._mc + + +def _mc(action_n=16, video=(0,), state=(0,)): + cfg = { + "action": _FakeModalityConfig(delta_indices=list(range(action_n))), + "video": _FakeModalityConfig(delta_indices=list(video)), + } + if state is not None: + cfg["state"] = _FakeModalityConfig(delta_indices=list(state)) + return cfg + + +def test_full_chunk_default(): + c = PolicyHorizonSpec.from_modality_config(_mc(action_n=16)) + assert c.action_horizon == 16 + assert c.n_action_steps == 16 # full chunk when not overridden + assert c.video_delta_indices == (0,) + assert c.state_delta_indices == (0,) + + +def test_short_open_loop_is_declarable(): + # LIBERO 8/16: deliberate receding-horizon tuning is explicit + valid. + c = PolicyHorizonSpec.from_modality_config(_mc(action_n=16), n_action_steps=8) + assert c.n_action_steps == 8 + assert c.action_horizon == 16 + + +def test_short_open_loop_equal_to_horizon(): + c = PolicyHorizonSpec.from_modality_config(_mc(action_n=40), n_action_steps=40) + assert c.n_action_steps == 40 + + +def test_n_action_steps_greater_than_horizon_raises(): + with pytest.raises(ValueError, match="IndexError"): + PolicyHorizonSpec.from_modality_config(_mc(action_n=16), n_action_steps=17) + + +def test_n_action_steps_below_one_raises(): + with pytest.raises(ValueError, match="execute nothing"): + PolicyHorizonSpec.from_modality_config(_mc(action_n=16), n_action_steps=0) + + +def test_non_contiguous_action_delta_raises(): + cfg = { + "action": _FakeModalityConfig(delta_indices=[0, 4, 8, 12]), + "video": _FakeModalityConfig(delta_indices=[0]), + "state": _FakeModalityConfig(delta_indices=[0]), + } + with pytest.raises(ValueError, match="contiguous"): + PolicyHorizonSpec.from_modality_config(cfg) + + +def test_video_state_sourced_from_policy(): + # DROID-like: video delta is [-15, 0], not the wrapper's old [0] default. + c = PolicyHorizonSpec.from_modality_config(_mc(action_n=40, video=(-15, 0), state=(0,))) + assert c.video_delta_indices == (-15, 0) + assert c.state_delta_indices == (0,) + # ndarray views match what MultiStepWrapper consumes. + np.testing.assert_array_equal(c.video_delta_indices_array, np.array([-15, 0])) + np.testing.assert_array_equal(c.state_delta_indices_array, np.array([0])) + + +def test_vision_only_policy_has_no_state(): + c = PolicyHorizonSpec.from_modality_config(_mc(action_n=8, state=None)) + assert c.state_delta_indices is None + assert c.state_delta_indices_array is None + + +def test_missing_action_raises(): + with pytest.raises(ValueError, match="no 'action' entry"): + PolicyHorizonSpec.from_modality_config({"video": _FakeModalityConfig(delta_indices=[0])}) + + +def test_empty_action_raises(): + with pytest.raises(ValueError, match="empty action"): + PolicyHorizonSpec.from_modality_config( + { + "action": _FakeModalityConfig(delta_indices=[]), + "video": _FakeModalityConfig(delta_indices=[0]), + } + ) + + +def test_from_policy_delegates(): + policy = _FakePolicy(_mc(action_n=16)) + c = PolicyHorizonSpec.from_policy(policy, n_action_steps=8) + assert c.n_action_steps == 8 + assert c.action_horizon == 16 + + +def test_contract_is_picklable(): + import pickle + + c = PolicyHorizonSpec.from_modality_config(_mc(action_n=16), n_action_steps=8) + assert pickle.loads(pickle.dumps(c)) == c + + +def test_numpy_delta_indices_accepted(): + cfg = { + "action": _FakeModalityConfig(delta_indices=np.arange(16)), + "video": _FakeModalityConfig(delta_indices=np.array([-15, 0])), + "state": _FakeModalityConfig(delta_indices=np.array([0])), + } + c = PolicyHorizonSpec.from_modality_config(cfg) + assert c.action_horizon == 16 + assert c.video_delta_indices == (-15, 0) + assert all(isinstance(v, int) for v in c.video_delta_indices) + + +@pytest.mark.parametrize( + "argv, expected, rewritten", + [ + (["prog", "--action-horizon", "8"], ["prog", "--execution-horizon", "8"], True), + (["prog", "--action_horizon", "8"], ["prog", "--execution-horizon", "8"], True), + (["prog", "--action-horizon=8"], ["prog", "--execution-horizon=8"], True), + (["prog", "--action_horizon=8"], ["prog", "--execution-horizon=8"], True), + (["prog", "--execution-horizon", "8"], ["prog", "--execution-horizon", "8"], False), + (["prog", "--steps", "200"], ["prog", "--steps", "200"], False), + ], +) +def test_migrate_deprecated_action_horizon_argv(argv, expected, rewritten): + got = migrate_deprecated_action_horizon_argv(argv) + assert argv == expected + assert got is rewritten diff --git a/tests/gr00t/eval/test_robocasa365_rollout_policy.py b/tests/gr00t/eval/test_robocasa365_rollout_policy.py new file mode 100644 index 000000000..1e255dcb7 --- /dev/null +++ b/tests/gr00t/eval/test_robocasa365_rollout_policy.py @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import sys +import types + +from gr00t.eval import rollout_policy + + +def test_robocasa365_env_fn_passes_split_to_gym_make(monkeypatch): + fake_robocasa365 = types.ModuleType("gr00t.eval.sim.robocasa365.gymnasium_groot") + monkeypatch.setitem( + sys.modules, + "gr00t.eval.sim.robocasa365.gymnasium_groot", + fake_robocasa365, + ) + + calls = [] + + def fake_make(*args, **kwargs): + calls.append((args, kwargs)) + return object() + + monkeypatch.setattr(rollout_policy.gym, "make", fake_make) + + env_fn = rollout_policy.get_robocasa_env_fn( + "robocasa365_panda_omron/CloseFridge_PandaOmron_Env", + robocasa_split="pretrain", + ) + env_fn() + + assert calls == [ + ( + ("robocasa365_panda_omron/CloseFridge_PandaOmron_Env",), + {"enable_render": True, "split": "pretrain"}, + ) + ] + + +def test_robocasa365_record_video_keys_match_observation_keys(): + assert rollout_policy.ROBOCASA365_PANDA_RECORD_VIDEO_KEYS == ( + "video.robot0_agentview_left", + "video.robot0_agentview_right", + "video.robot0_eye_in_hand", + ) diff --git a/tests/gr00t/eval/test_rollout_episode_length.py b/tests/gr00t/eval/test_rollout_episode_length.py new file mode 100644 index 000000000..02e557cfe --- /dev/null +++ b/tests/gr00t/eval/test_rollout_episode_length.py @@ -0,0 +1,82 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Regression tests for episode-length accounting in policy rollouts. + +The sim rollout runs under gymnasium 0.29.1 (inline autoreset), whose vector +env relocates a terminating step's info into ``final_info`` while the top-level +info describes the freshly reset env. Reading ``n_env_steps`` only from the +top-level info therefore undercounts the terminal macro-step to 0 env-steps, +collapsing ``episode_length`` to 0 and tripping the zero-length-episode +invariant. These tests pin the version-agnostic accounting helper. +""" + +from gr00t.eval.rollout_policy import _macro_step_env_steps +import numpy as np +import pytest + + +def test_counts_top_level_n_env_steps(): + """gymnasium >=1.0 keeps the (terminal) step's info at the top level.""" + env_infos = {"n_env_steps": np.array([3])} + assert _macro_step_env_steps(env_infos, 0) == 3 + + +def test_counts_n_env_steps_relocated_into_final_info(): + """gymnasium 0.29.1 inline autoreset moves the terminal info into + final_info; the top-level info reflects the reset env and lacks + n_env_steps. The terminal macro-step must still be counted (>0).""" + env_infos = { + # Top-level mirrors the freshly reset env -> no usable n_env_steps. + "_final_info": np.array([True]), + "final_info": np.array([{"n_env_steps": 2, "success": [False]}], dtype=object), + } + assert _macro_step_env_steps(env_infos, 0) == 2 + + +def test_final_info_takes_precedence_over_masked_top_level(): + """When both are present, final_info (the real terminal step) wins.""" + env_infos = { + "n_env_steps": np.array([0]), + "final_info": np.array([{"n_env_steps": 2}], dtype=object), + } + assert _macro_step_env_steps(env_infos, 0) == 2 + + +def test_missing_n_env_steps_returns_zero(): + """Steps that carry no env-step count contribute nothing (e.g. a pure + autoreset placeholder), but must not raise.""" + assert _macro_step_env_steps({}, 0) == 0 + assert _macro_step_env_steps({"final_info": np.array([None], dtype=object)}, 0) == 0 + + +@pytest.mark.parametrize("env_idx, expected", [(0, 4), (1, 0)]) +def test_none_top_level_element_counts_as_zero(env_idx, expected): + """A present n_env_steps key with a None entry counts as 0 env-steps, + while a sibling env's real count is still read.""" + env_infos = {"n_env_steps": np.array([4, None], dtype=object)} + assert _macro_step_env_steps(env_infos, env_idx) == expected + + +@pytest.mark.parametrize("env_idx", [0, 1]) +def test_per_env_indexing_multi_env(env_idx): + """In a multi-env batch, one env may terminate (final_info) while another + keeps running (top-level), and each must read its own count.""" + env_infos = { + "n_env_steps": np.ma.array([5, 7], mask=[True, False]), + "final_info": np.array([{"n_env_steps": 4}, None], dtype=object), + } + expected = {0: 4, 1: 7} + assert _macro_step_env_steps(env_infos, env_idx) == expected[env_idx] diff --git a/tests/gr00t/eval/test_rollout_max_episode_steps.py b/tests/gr00t/eval/test_rollout_max_episode_steps.py new file mode 100644 index 000000000..4315c3215 --- /dev/null +++ b/tests/gr00t/eval/test_rollout_max_episode_steps.py @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Pin the per-episode step budget used by ``rollout_policy``. + +``VideoConfig``, ``MultiStepConfig`` and the ``RolloutConfig`` CLI all default +the same ``max_episode_steps`` knob; they used to carry independent literals +(504 on the CLI, 720 on the wrappers) so the default env (LIBERO) was evaluated +with a different cap depending on the entry point. They now share one module +constant, which must also match the canonical LIBERO cap in +``_sim_eval_defaults``. Parsed via AST so the check stays torch-free. +""" + +from __future__ import annotations + +import ast +from pathlib import Path + +import pytest + + +_ROLLOUT_POLICY = Path(__file__).resolve().parents[3] / "gr00t" / "eval" / "rollout_policy.py" +_CONST_NAME = "DEFAULT_MAX_EPISODE_STEPS" +_DATACLASSES = ("VideoConfig", "MultiStepConfig", "RolloutConfig") + + +def _module() -> ast.Module: + return ast.parse(_ROLLOUT_POLICY.read_text()) + + +def _module_constant(tree: ast.Module, name: str) -> int: + for node in tree.body: + if isinstance(node, ast.Assign): + targets = [t.id for t in node.targets if isinstance(t, ast.Name)] + if name in targets and isinstance(node.value, ast.Constant): + return node.value.value + raise AssertionError(f"module-level constant {name!r} not found in rollout_policy.py") + + +def _class_field(tree: ast.Module, class_name: str, field_name: str) -> ast.AST: + for node in tree.body: + if isinstance(node, ast.ClassDef) and node.name == class_name: + for stmt in node.body: + if ( + isinstance(stmt, ast.AnnAssign) + and isinstance(stmt.target, ast.Name) + and stmt.target.id == field_name + ): + return stmt.value + raise AssertionError(f"{class_name}.{field_name} not found in rollout_policy.py") + + +def _string_default(tree: ast.Module, class_name: str, field_name: str) -> str: + value = _class_field(tree, class_name, field_name) + assert isinstance(value, ast.Constant) and isinstance(value.value, str) + return value.value + + +def test_all_defaults_reference_the_single_constant(): + tree = _module() + _module_constant(tree, _CONST_NAME) # must exist + for class_name in _DATACLASSES: + value = _class_field(tree, class_name, "max_episode_steps") + assert isinstance(value, ast.Name) and value.id == _CONST_NAME, ( + f"{class_name}.max_episode_steps default should be {_CONST_NAME}, " + "not an independent literal" + ) + + +def test_constant_matches_canonical_libero_cap(): + # The canonical table lives under ``ci/`` (stripped from the OSS mirror and + # absent in torch-free/OSS environments), so guard this cross-check while the + # pure-AST test above still runs anywhere. + sim_eval_defaults = pytest.importorskip("ci.metrics.utils._sim_eval_defaults") + tree = _module() + constant = _module_constant(tree, _CONST_NAME) + # RolloutConfig's default env is a LIBERO task, so its cap must match the + # canonical LIBERO backend default rather than drifting from it. + assert _string_default(tree, "RolloutConfig", "env_name").startswith("libero") + assert constant == sim_eval_defaults.SIM_EVAL_DEFAULTS["libero"].max_episode_steps diff --git a/tests/gr00t/eval/test_server_modality_json.py b/tests/gr00t/eval/test_server_modality_json.py new file mode 100644 index 000000000..5b1c73250 --- /dev/null +++ b/tests/gr00t/eval/test_server_modality_json.py @@ -0,0 +1,46 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 json + +from gr00t.data.types import ModalityConfig +from gr00t.eval.run_gr00t_server import _load_json_modality_configs +import pytest + + +def test_dataset_layout_json_raises_actionable(tmp_path): + # A dataset's meta/modality.json (start/end layout), not ModalityConfig fields. + p = tmp_path / "modality.json" + p.write_text(json.dumps({"state": {"single_arm": {"start": 0, "end": 5}}})) + + with pytest.raises(ValueError) as exc: + _load_json_modality_configs(p) + + msg = str(exc.value) + assert "ModalityConfig" in msg + assert ".py" in msg + + +def test_valid_modality_config_json_loads(tmp_path): + payload = {"action": {"delta_indices": [0, 1], "modality_keys": ["x"]}} + p = tmp_path / "mc.json" + p.write_text(json.dumps(payload)) + + configs = _load_json_modality_configs(p) + + assert set(configs) == set(payload) + assert isinstance(configs["action"], ModalityConfig) + assert configs["action"].delta_indices == payload["action"]["delta_indices"] + assert configs["action"].modality_keys == payload["action"]["modality_keys"] diff --git a/tests/gr00t/eval/test_so100_action_steps.py b/tests/gr00t/eval/test_so100_action_steps.py new file mode 100644 index 000000000..abfdf7f92 --- /dev/null +++ b/tests/gr00t/eval/test_so100_action_steps.py @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""SO100 real-robot eval must not silently execute fewer action steps than the +configured ``action_horizon``. ``_select_action_steps`` returns the requested +window when the policy supplies enough steps and raises otherwise. +""" + +from __future__ import annotations + +import pytest + + +eval_so100 = pytest.importorskip("gr00t.eval.real_robot.SO100.eval_so100") +_select_action_steps = eval_so100._select_action_steps + + +def _chunk(n: int) -> list: + return [{"step": i} for i in range(n)] + + +def test_returns_requested_window_when_chunk_is_long_enough(): + actions = _chunk(40) + selected = _select_action_steps(actions, 8) + assert selected == actions[:8] + + +def test_returns_full_chunk_when_horizon_equals_length(): + actions = _chunk(8) + assert _select_action_steps(actions, 8) == actions + + +def test_raises_when_horizon_exceeds_chunk(): + actions = _chunk(4) + with pytest.raises(ValueError) as excinfo: + _select_action_steps(actions, 8) + message = str(excinfo.value) + assert "action_horizon=8" in message + assert "chunk length 4" in message diff --git a/tests/gr00t/experiment/_run_best_metric_fsdp_save.py b/tests/gr00t/experiment/_run_best_metric_fsdp_save.py new file mode 100644 index 000000000..3617ff99d --- /dev/null +++ b/tests/gr00t/experiment/_run_best_metric_fsdp_save.py @@ -0,0 +1,235 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""torchrun entry point for the multi-GPU FSDP best-metric-save weight-parity test. + +Reproduces the failure that motivated the sharded-aware save rewrite: under a +parameter-sharded backend each rank holds only ``1/world_size`` of every parameter, +so the old ``model.save_pretrained`` on rank-0 wrote that rank's shard with the rest +of the model left at near-zero placeholders. The corruption was silent — shapes +matched, the load path succeeded — and only surfaced at deploy time. + +PyTorch FSDP is used as the sharded backend rather than DeepSpeed ZeRO-3 because the +two share the *exact same* callback path (`_broadcast_save_decision` → `dist.barrier` +→ `Trainer.save_model`; the gather is internal to `save_model`), and FSDP is part of +core torch whereas the DeepSpeed wheel is published only for x86_64 Linux +(`pyproject.toml`) and is therefore absent on the arm64 multi-GPU CI runner. + +This harness deliberately does **not** go through ``experiment.run``: the sharded +training dataset hard-asserts ``eval_strategy == "no"`` (see +``gr00t/data/dataset/factory.py``), so ``on_evaluate`` can never fire on that path. +Instead we wrap a tiny model in a real HF ``Trainer`` + FSDP full-shard, run a single +no-op optimizer step (``learning_rate=0`` keeps the weights bit-stable so the saved +checkpoint can be compared against a pre-shard reference snapshot), then drive the +callback's ``on_evaluate`` exactly as the eval loop would — with ``metrics`` populated +on rank-0 only, the worst case for the cross-rank broadcast. + +Parity contract checked on rank-0: + * every saved parameter matches the pre-shard reference (generous tolerance — the + point is to catch zeroed-out shards, where buggy values differ from the + unit-normal reference by ~1.0, not to police fp32-vs-bf16 rounding); + * no saved parameter tensor is entirely zero. + +Exits non-zero with a diagnostic on any mismatch so the spawning pytest can surface it. +""" + +from __future__ import annotations + +import argparse +from pathlib import Path + +import torch +from torch import nn +import torch.distributed as dist + + +_DIM = 256 +_N_LAYERS = 5 +_SEED = 1234 + + +class _TinyModel(nn.Module): + """A few stacked Linear layers — large enough that FSDP shards parameters + across ranks, small enough to train in milliseconds.""" + + def __init__(self, dim: int = _DIM, n_layers: int = _N_LAYERS): + super().__init__() + self.layers = nn.ModuleList(nn.Linear(dim, dim) for _ in range(n_layers)) + self.head = nn.Linear(dim, dim) + + def forward(self, x, labels=None): + h = x + for layer in self.layers: + h = torch.relu(layer(h)) + h = self.head(h) + loss = ((h - labels) ** 2).mean() if labels is not None else h.sum() + return {"loss": loss, "logits": h} + + +class _RandomDataset(torch.utils.data.Dataset): + def __init__(self, n: int = 16, dim: int = _DIM, seed: int = 0): + g = torch.Generator().manual_seed(seed) + self.x = torch.randn(n, dim, generator=g) + self.y = torch.randn(n, dim, generator=g) + + def __len__(self) -> int: + return len(self.x) + + def __getitem__(self, i): + return {"x": self.x[i], "labels": self.y[i]} + + +def _collate(batch): + return { + "x": torch.stack([b["x"] for b in batch]), + "labels": torch.stack([b["labels"] for b in batch]), + } + + +def _parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("--output-dir", required=True, type=Path) + return parser.parse_args() + + +def _load_state_dict(checkpoint_dir: Path) -> dict[str, torch.Tensor]: + """Load a saved checkpoint, tolerating either safetensors or torch.bin layout.""" + safetensor_files = sorted(checkpoint_dir.glob("*.safetensors")) + if safetensor_files: + from safetensors.torch import load_file + + merged: dict[str, torch.Tensor] = {} + for f in safetensor_files: + merged.update(load_file(str(f))) + return merged + + bin_files = sorted(checkpoint_dir.glob("pytorch_model*.bin")) + if bin_files: + merged = {} + for f in bin_files: + merged.update(torch.load(str(f), map_location="cpu")) + return merged + + raise FileNotFoundError( + f"No weight files (*.safetensors / pytorch_model*.bin) in {checkpoint_dir}" + ) + + +def _verify_parity(best_dir: Path, reference: dict[str, torch.Tensor]) -> None: + """Rank-0 check: saved weights equal the pre-shard reference and are non-zero.""" + saved = _load_state_dict(best_dir) + + missing = set(reference) - set(saved) + if missing: + raise AssertionError( + f"Saved checkpoint is missing {len(missing)} params, e.g. {sorted(missing)[:3]}" + ) + + for name, ref_tensor in reference.items(): + got = saved[name].detach().to(torch.float32).cpu() + ref = ref_tensor.detach().to(torch.float32).cpu() + if got.shape != ref.shape: + raise AssertionError(f"Shape mismatch for {name}: saved {got.shape} vs ref {ref.shape}") + # Generous tolerance: zeroed shards (the bug) differ from the unit-normal + # reference by ~1.0, far above this; legitimate fp32/bf16 rounding does not. + if not torch.allclose(got, ref, atol=1e-2, rtol=1e-2): + max_abs = (got - ref).abs().max().item() + raise AssertionError( + f"Weight mismatch for {name}: max|saved-ref|={max_abs:.4f}. " + "A non-rank-0 shard was likely written un-consolidated (the original bug)." + ) + if torch.count_nonzero(got) == 0: + raise AssertionError( + f"Saved parameter {name} is entirely zero — un-consolidated shard." + ) + + +def main() -> None: + args = _parse_args() + + from gr00t.experiment.utils import BestMetricCheckpointCallback + from transformers import Trainer, TrainingArguments + + # Identical init on every rank so the pre-shard snapshot is a valid cross-rank + # reference for the consolidated save. + torch.manual_seed(_SEED) + model = _TinyModel() + reference = {k: v.detach().cpu().clone() for k, v in model.state_dict().items()} + + training_args = TrainingArguments( + output_dir=str(args.output_dir), + per_device_train_batch_size=2, + max_steps=1, + learning_rate=0.0, + weight_decay=0.0, + logging_steps=1, + save_strategy="no", + eval_strategy="no", + report_to=[], + bf16=False, + fp16=False, + remove_unused_columns=False, + fsdp="full_shard auto_wrap", + fsdp_config={ + "min_num_params": 100, + "state_dict_type": "FULL_STATE_DICT", + "use_orig_params": True, + }, + ) + + trainer = Trainer( + model=model, + args=training_args, + train_dataset=_RandomDataset(seed=_SEED), + data_collator=_collate, + ) + + # Initializes FSDP and shards parameters; lr=0 keeps weights bit-stable. + trainer.train() + + callback = BestMetricCheckpointCallback( + metric_name="eval_loss", + trainer=trainer, + greater_is_better=False, + ) + + # Worst case for the broadcast: only rank-0 has the metrics dict. + metrics = {"eval_loss": 0.123} if trainer.state.is_world_process_zero else None + callback.on_evaluate( + args=trainer.args, + state=trainer.state, + control=trainer.control, + metrics=metrics, + model=trainer.model, + ) + + if trainer.state.is_world_process_zero: + best_dirs = list(Path(args.output_dir).glob("checkpoint-*-best-eval_loss_*")) + if len(best_dirs) != 1: + raise AssertionError(f"Expected exactly one best checkpoint dir, found: {best_dirs}") + _verify_parity(best_dirs[0], reference) + print(f"[rank0] weight parity verified for {best_dirs[0].name}", flush=True) + + dist.barrier() + dist.destroy_process_group() + + +if __name__ == "__main__": + try: + main() + except Exception as exc: # surface the diagnostic through the non-zero exit + rank = dist.get_rank() if dist.is_initialized() else "?" + print(f"[rank{rank}] FAILED: {exc}", flush=True) + raise SystemExit(1) from exc diff --git a/tests/gr00t/experiment/_run_distributed_experiment.py b/tests/gr00t/experiment/_run_distributed_experiment.py new file mode 100644 index 000000000..162bcbadf --- /dev/null +++ b/tests/gr00t/experiment/_run_distributed_experiment.py @@ -0,0 +1,140 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""torchrun entry point used by the multi-GPU experiment pytest.""" + +from __future__ import annotations + +import argparse +import json +import os +from pathlib import Path + +import torch +import torch.distributed as dist + + +EMBODIMENT_TAG = "libero_sim" + + +def _parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("--model-path", required=True) + parser.add_argument("--dataset-path", required=True, type=Path) + parser.add_argument("--output-dir", required=True, type=Path) + parser.add_argument("--num-gpus", required=True, type=int) + return parser.parse_args() + + +def _build_config(args: argparse.Namespace): + from gr00t.configs.base_config import get_default_config + + config = get_default_config().load_dict( + { + "data": { + "download_cache": False, + "datasets": [ + { + "dataset_paths": [str(args.dataset_path)], + "mix_ratio": 1.0, + "embodiment_tag": EMBODIMENT_TAG, + } + ], + "shard_size": 64, + "num_shards_per_epoch": args.num_gpus, + "multiprocessing_context": "fork", + }, + } + ) + + config.model.model_name = "nvidia/Cosmos-Reason2-2B" + config.model.backbone_trainable_params_fp32 = True + config.model.use_relative_action = True + config.model.load_bf16 = False + config.model.reproject_vision = False + config.model.tune_llm = False + config.model.tune_visual = False + config.model.tune_projector = True + config.model.tune_diffusion_model = True + + config.training.start_from_checkpoint = str(args.model_path) + config.training.skip_weight_loading = True + config.training.output_dir = str(args.output_dir) + config.training.max_steps = 1 + config.training.save_steps = 1 + config.training.save_total_limit = 1 + config.training.global_batch_size = args.num_gpus + config.training.num_gpus = args.num_gpus + config.training.dataloader_num_workers = 0 + config.training.use_wandb = False + config.training.optim = "adamw_torch" + config.training.bf16 = True + config.training.tf32 = True + config.training.fp16 = False + config.training.gradient_checkpointing = False + config.training.use_ddp = True + config.training.eval_strategy = "no" + config.training.save_only_model = True + + return config + + +def _write_rank_metadata(output_dir: Path) -> None: + rank = dist.get_rank() + local_rank = int(os.environ["LOCAL_RANK"]) + world_size = dist.get_world_size() + + rank_dir = output_dir / "distributed_rank_metadata" + rank_dir.mkdir(parents=True, exist_ok=True) + payload = { + "rank": rank, + "local_rank": local_rank, + "world_size": world_size, + "current_cuda_device": torch.cuda.current_device(), + "visible_cuda_device_count": torch.cuda.device_count(), + "cuda_visible_devices": os.environ.get("CUDA_VISIBLE_DEVICES", ""), + } + (rank_dir / f"rank_{rank}.json").write_text(json.dumps(payload, indent=2)) + + +def main() -> None: + args = _parse_args() + + visible_cuda_device_count = torch.cuda.device_count() + if visible_cuda_device_count != args.num_gpus: + raise RuntimeError( + f"Expected {args.num_gpus} visible CUDA devices, got {visible_cuda_device_count}" + ) + + from gr00t.experiment.experiment import run + + run(_build_config(args)) + + tensor = torch.tensor( + [dist.get_rank() + 1], + device=f"cuda:{torch.cuda.current_device()}", + ) + dist.all_reduce(tensor) + expected = dist.get_world_size() * (dist.get_world_size() + 1) // 2 + if tensor.item() != expected: + raise RuntimeError(f"Unexpected all_reduce result: {tensor.item()} != {expected}") + + _write_rank_metadata(args.output_dir) + dist.barrier() + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/tests/gr00t/experiment/test_best_metric_callback_save.py b/tests/gr00t/experiment/test_best_metric_callback_save.py new file mode 100644 index 000000000..e2ebe1787 --- /dev/null +++ b/tests/gr00t/experiment/test_best_metric_callback_save.py @@ -0,0 +1,451 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Regression tests for `BestMetricCheckpointCallback`. + +Three layers, cheapest first: + +* **Algorithm (single-rank, mocked Trainer, CPU):** improvement detection, + directory bookkeeping, ``exp_cfg_dir`` copy, previous-best replacement. +* **Distributed decision (multi-rank gloo, CPU):** ``_broadcast_save_decision`` + routes rank-0's verdict to every rank, and the full callback drives every rank + into ``Trainer.save_model`` (so a real ZeRO-3 gather would not deadlock). +* **Sharded save parity (multi-GPU NCCL, ``@pytest.mark.multigpu``):** a real FSDP + full-shard run proves the saved checkpoint holds consolidated full weights rather + than a single rank's shard — the exact corruption that motivated this fix. FSDP + stands in for DeepSpeed ZeRO-3 (identical callback path; DeepSpeed wheels are + x86_64-only and absent on the arm64 multi-GPU runner). The heavy lifting lives in + ``_run_best_metric_fsdp_save.py`` (torchrun entry). +""" + +from __future__ import annotations + +from contextlib import closing +from dataclasses import dataclass +import os +from pathlib import Path +import signal +import socket +import subprocess +import sys +from unittest.mock import MagicMock + +from gr00t.experiment.utils import BestMetricCheckpointCallback, _broadcast_save_decision +import pytest +import torch +import torch.distributed as dist +import torch.multiprocessing as mp + + +# --------------------------------------------------------------------------- +# Lightweight stand-ins for HF dataclasses. We stick to attribute access only; +# the callback never calls methods on these objects. +# --------------------------------------------------------------------------- + + +@dataclass +class _FakeArgs: + output_dir: str + + +@dataclass +class _FakeState: + is_world_process_zero: bool = True + global_step: int = 100 + + +@dataclass +class _FakeControl: + pass + + +def _make_callback( + *, + tmp_path: Path, + greater_is_better: bool = True, + exp_cfg_dir: Path | None = None, +) -> tuple[BestMetricCheckpointCallback, MagicMock]: + """Build a callback wired to a fresh MagicMock Trainer. + + Returns the ``(callback, trainer)`` pair so tests can assert on + ``trainer.save_model`` call counts and arguments without spinning up + a real HF ``Trainer``. + """ + trainer = MagicMock(name="Trainer") + cb = BestMetricCheckpointCallback( + metric_name="eval_accuracy", + trainer=trainer, + greater_is_better=greater_is_better, + exp_cfg_dir=exp_cfg_dir, + ) + return cb, trainer + + +def _invoke( + cb: BestMetricCheckpointCallback, + *, + tmp_path: Path, + metrics: dict | None, + is_rank0: bool = True, + global_step: int = 100, +) -> None: + """Drive ``cb.on_evaluate`` with minimal fake HF args/state/control. + + Lets each algorithm-layer test exercise the callback at a single + eval step without instantiating real HF dataclasses. + """ + cb.on_evaluate( + args=_FakeArgs(output_dir=str(tmp_path)), + state=_FakeState(is_world_process_zero=is_rank0, global_step=global_step), + control=_FakeControl(), + metrics=metrics, + model=MagicMock(name="model"), + ) + + +# --------------------------------------------------------------------------- +# Algorithm layer — single-rank, mocked trainer +# --------------------------------------------------------------------------- + + +def test_does_not_save_when_metrics_is_none(tmp_path): + cb, trainer = _make_callback(tmp_path=tmp_path) + _invoke(cb, tmp_path=tmp_path, metrics=None) + trainer.save_model.assert_not_called() + assert cb._best_checkpoint_dir is None + assert cb.best_metric == -float("inf") + + +def test_does_not_save_when_metric_name_missing(tmp_path): + cb, trainer = _make_callback(tmp_path=tmp_path) + _invoke(cb, tmp_path=tmp_path, metrics={"other_metric": 0.9}) + trainer.save_model.assert_not_called() + assert cb.best_metric == -float("inf") + + +def test_does_not_save_when_metric_does_not_improve(tmp_path): + cb, trainer = _make_callback(tmp_path=tmp_path) + cb.best_metric = 0.95 + _invoke(cb, tmp_path=tmp_path, metrics={"eval_accuracy": 0.80}) + trainer.save_model.assert_not_called() + assert cb.best_metric == 0.95 + + +def test_saves_when_metric_improves_greater_is_better(tmp_path): + cb, trainer = _make_callback(tmp_path=tmp_path) + _invoke(cb, tmp_path=tmp_path, metrics={"eval_accuracy": 0.85}, global_step=42) + + expected_dir = tmp_path / "checkpoint-42-best-eval_accuracy_0.85" + trainer.save_model.assert_called_once_with(str(expected_dir)) + assert expected_dir.is_dir(), "rank-0 should have mkdir'd the output dir" + assert cb.best_metric == pytest.approx(0.85) + assert cb._best_checkpoint_dir == str(expected_dir) + + +def test_saves_when_metric_improves_lower_is_better(tmp_path): + cb, trainer = _make_callback(tmp_path=tmp_path, greater_is_better=False) + _invoke(cb, tmp_path=tmp_path, metrics={"eval_accuracy": 0.20}, global_step=42) + + expected_dir = tmp_path / "checkpoint-42-best-eval_accuracy_0.2" + trainer.save_model.assert_called_once_with(str(expected_dir)) + assert cb.best_metric == pytest.approx(0.20) + + +def test_copies_exp_cfg_dir_on_save(tmp_path): + exp_cfg = tmp_path / "experiment_cfg" + exp_cfg.mkdir() + (exp_cfg / "conf.yaml").write_text("dummy: 1\n") + cb, _ = _make_callback(tmp_path=tmp_path / "out", exp_cfg_dir=exp_cfg) + out_dir = tmp_path / "out" + out_dir.mkdir() + + cb.on_evaluate( + args=_FakeArgs(output_dir=str(out_dir)), + state=_FakeState(global_step=10), + control=_FakeControl(), + metrics={"eval_accuracy": 0.5}, + model=MagicMock(), + ) + + copied = out_dir / "checkpoint-10-best-eval_accuracy_0.5" / "experiment_cfg" / "conf.yaml" + assert copied.is_file(), "exp_cfg_dir should be copied into the best-checkpoint dir" + + +def test_no_copy_when_exp_cfg_dir_does_not_exist(tmp_path): + """If exp_cfg_dir is configured but absent on disk, the save still + proceeds and the missing directory is simply not copied — same + behavior as before this refactor.""" + cb, trainer = _make_callback(tmp_path=tmp_path, exp_cfg_dir=tmp_path / "missing") + _invoke(cb, tmp_path=tmp_path, metrics={"eval_accuracy": 0.5}) + trainer.save_model.assert_called_once() + assert not (tmp_path / "checkpoint-100-best-eval_accuracy_0.5" / "missing").exists() + + +def test_previous_best_dir_is_replaced_on_each_improvement(tmp_path): + cb, trainer = _make_callback(tmp_path=tmp_path) + + _invoke(cb, tmp_path=tmp_path, metrics={"eval_accuracy": 0.6}, global_step=10) + first_dir = tmp_path / "checkpoint-10-best-eval_accuracy_0.6" + assert first_dir.is_dir() + assert cb._best_checkpoint_dir == str(first_dir) + + _invoke(cb, tmp_path=tmp_path, metrics={"eval_accuracy": 0.8}, global_step=20) + second_dir = tmp_path / "checkpoint-20-best-eval_accuracy_0.8" + assert second_dir.is_dir() + assert not first_dir.exists(), "previous best-checkpoint dir should be removed" + assert cb._best_checkpoint_dir == str(second_dir) + assert trainer.save_model.call_count == 2 + + +def test_first_improvement_does_not_rmtree_anything(tmp_path): + """The rmtree branch must short-circuit on the very first save (when + ``_best_checkpoint_dir`` is still None) instead of crashing on + ``Path(None)``.""" + cb, trainer = _make_callback(tmp_path=tmp_path) + _invoke(cb, tmp_path=tmp_path, metrics={"eval_accuracy": 0.5}) + trainer.save_model.assert_called_once() + assert cb._best_checkpoint_dir is not None + + +# --------------------------------------------------------------------------- +# Distributed-decision layer — multi-rank with gloo +# --------------------------------------------------------------------------- + + +def _free_port() -> int: + """Return an unused TCP port suitable for ``init_method='tcp://...'``. + + Binds to port 0, reads back the OS-assigned port, then releases the + socket — the standard "let the kernel pick" idiom. There is an + unavoidable race between release and the next bind, but for spawn- + style multiprocess tests this is the conventional approach. + """ + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.bind(("", 0)) + return s.getsockname()[1] + + +def _run_gloo_workers(worker, *worker_args, world_size: int = 2) -> dict: + """Spawn ``world_size`` gloo ranks running ``worker`` and return their results. + + Centralizes the per-test boilerplate (free port, ``mp.Manager`` dict, + ``mp.spawn``) so each multi-rank test only supplies its worker and the + worker-specific arguments. ``worker`` is invoked as + ``worker(rank, world_size, init_method, *worker_args, return_dict)`` and is + expected to write its observable outcome into ``return_dict[rank]``. + """ + init_method = f"tcp://127.0.0.1:{_free_port()}" + manager = mp.Manager() + results = manager.dict() + mp.spawn( + worker, + args=(world_size, init_method, *worker_args, results), + nprocs=world_size, + join=True, + ) + return results + + +def _broadcast_worker(rank, world_size, init_method, save_flag, metric_value, return_dict): + """Per-rank worker for the ``_broadcast_save_decision`` gloo test. + + Rank-0 contributes the true ``(save_flag, metric_value)``; every + other rank passes placeholder zeros. After the broadcast each rank + writes its observed pair into ``return_dict[rank]`` so the parent + test can assert all ranks landed on rank-0's truth. + """ + dist.init_process_group( + backend="gloo", init_method=init_method, rank=rank, world_size=world_size + ) + try: + my_flag = save_flag if rank == 0 else 0 + my_value = metric_value if rank == 0 else 0.0 + out_flag, out_value = _broadcast_save_decision(my_flag, my_value) + return_dict[rank] = (out_flag, out_value) + finally: + dist.destroy_process_group() + + +@pytest.mark.serial +@pytest.mark.parametrize( + ("save_flag", "metric_value"), + [ + (1, 0.42), # rank-0 says "save with metric 0.42" + (0, 0.0), # rank-0 says "skip this round" + ], +) +def test_broadcast_save_decision_routes_rank0_truth_to_all_ranks(save_flag, metric_value): + results = _run_gloo_workers(_broadcast_worker, save_flag, metric_value) + assert set(results.keys()) == {0, 1} + for rank in (0, 1): + out_flag, out_value = results[rank] + assert out_flag == save_flag, f"rank {rank} got flag {out_flag}, expected {save_flag}" + assert out_value == pytest.approx(metric_value), ( + f"rank {rank} got value {out_value}, expected {metric_value}" + ) + + +def _callback_collective_worker( + rank, world_size, init_method, tmp_dir, rank0_has_metrics, return_dict +): + """End-to-end: every rank constructs the callback, on_evaluate is called + with `metrics=None` everywhere except rank-0 (mirroring the HF behavior + we're trying to be robust against), and we record whether each rank's + `trainer.save_model` was invoked. The contract: every rank must hit + save_model, otherwise rank-0 would deadlock in a real ZeRO-3 gather. + """ + dist.init_process_group( + backend="gloo", init_method=init_method, rank=rank, world_size=world_size + ) + try: + trainer = MagicMock(name=f"Trainer-rank{rank}") + cb = BestMetricCheckpointCallback( + metric_name="eval_accuracy", + trainer=trainer, + greater_is_better=True, + exp_cfg_dir=None, + ) + # Rank-0 alone owns the metrics dict (worst case for the broadcast). + metrics = {"eval_accuracy": 0.7} if (rank == 0 and rank0_has_metrics) else None + cb.on_evaluate( + args=_FakeArgs(output_dir=str(tmp_dir)), + state=_FakeState(is_world_process_zero=(rank == 0), global_step=7), + control=_FakeControl(), + metrics=metrics, + model=MagicMock(), + ) + return_dict[rank] = trainer.save_model.call_count + finally: + dist.destroy_process_group() + + +@pytest.mark.serial +def test_collective_save_runs_on_every_rank_when_rank0_decides_to_save(tmp_path): + """The whole point of the broadcast: non-rank-0 ranks must still call + `trainer.save_model` so the gather collective completes. Without the + broadcast, rank-1 would early-return on `metrics is None` and rank-0 + would hang inside the gather.""" + results = _run_gloo_workers(_callback_collective_worker, str(tmp_path), True) + assert results[0] == 1, "rank-0 should have called save_model exactly once" + assert results[1] == 1, ( + "rank-1 should also have called save_model — otherwise a real " + "ZeRO-3 gather would deadlock here" + ) + + +@pytest.mark.serial +def test_no_collective_when_rank0_decides_to_skip(tmp_path): + """Symmetry: when rank-0 sees no improvement, no rank should hit + save_model. (Skipping the collective is fine because no rank entered it.)""" + results = _run_gloo_workers(_callback_collective_worker, str(tmp_path), False) + assert results[0] == 0 + assert results[1] == 0 + + +# --------------------------------------------------------------------------- +# Pre-test environment guards +# --------------------------------------------------------------------------- + + +@pytest.fixture(autouse=True) +def _ensure_no_dist_state(): + """Tests may leave a dangling process group on failure paths; isolate.""" + if dist.is_available() and dist.is_initialized(): + dist.destroy_process_group() + # Multiprocessing spawn requires a known start method on Linux. + os.environ.setdefault("MASTER_ADDR", "127.0.0.1") + yield + if dist.is_available() and dist.is_initialized(): + dist.destroy_process_group() + + +# --------------------------------------------------------------------------- +# Sharded-save parity layer — real FSDP full-shard across every visible GPU +# --------------------------------------------------------------------------- + + +@pytest.fixture(scope="session") +def _visible_multigpu_count() -> int: + if not torch.cuda.is_available(): + pytest.skip("CUDA is not available") + num_gpus = torch.cuda.device_count() + if num_gpus < 2: + pytest.skip(f"Need at least 2 visible GPUs for the FSDP parity test, got {num_gpus}") + return num_gpus + + +@pytest.mark.gpu +@pytest.mark.multigpu +@pytest.mark.timeout(900, func_only=True) +def test_best_metric_fsdp_save_matches_full_weights(tmp_path, _visible_multigpu_count): + """The best-metric checkpoint saved under a real sharded backend must hold + consolidated full weights, not rank-0's shard. + + Spawns ``_run_best_metric_fsdp_save.py`` under torchrun with one rank per + visible GPU. That script wraps a tiny model in a real HF ``Trainer`` + FSDP + full-shard, fires the callback's ``on_evaluate`` with metrics on rank-0 only, + then asserts (on rank-0) that every saved parameter matches a pre-shard + reference snapshot and that no tensor is zeroed. Pre-fix, the non-rank-0 shards + would have been written un-consolidated and this would fail. FSDP stands in for + DeepSpeed ZeRO-3 here — same callback path, but DeepSpeed wheels are x86_64-only + and absent on the arm64 multi-GPU runner. + """ + from test_support.runtime import get_root + + num_gpus = _visible_multigpu_count + repo_root = get_root() + runner = Path(__file__).with_name("_run_best_metric_fsdp_save.py") + output_dir = tmp_path / "fsdp_best_metric_output" + + cmd = [ + sys.executable, + "-m", + "torch.distributed.run", + "--standalone", + "--max-restarts=0", + f"--nproc_per_node={num_gpus}", + str(runner), + "--output-dir", + str(output_dir), + ] + env = os.environ.copy() + env["PYTHONUNBUFFERED"] = "1" + env.setdefault("OMP_NUM_THREADS", "1") + env.setdefault("TORCH_NCCL_ASYNC_ERROR_HANDLING", "1") + # Some GB200 CI nodes report disabled P2P between NVLINK-connected GPUs. + env.setdefault("NCCL_IGNORE_DISABLED_P2P", "1") + + proc = subprocess.Popen( + cmd, + cwd=repo_root, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + start_new_session=True, + ) + try: + stdout, _ = proc.communicate(timeout=840) + except subprocess.TimeoutExpired: + os.killpg(proc.pid, signal.SIGKILL) + stdout, _ = proc.communicate() + pytest.fail(f"FSDP best-metric save run timed out\n\n{stdout}") + + if proc.returncode != 0: + pytest.fail(f"FSDP best-metric save run failed (exit {proc.returncode})\n\n{stdout}") + + assert "weight parity verified" in stdout, ( + f"runner did not report a successful parity check\n\n{stdout}" + ) diff --git a/tests/gr00t/experiment/test_distributed_init.py b/tests/gr00t/experiment/test_distributed_init.py new file mode 100644 index 000000000..9d2d9de65 --- /dev/null +++ b/tests/gr00t/experiment/test_distributed_init.py @@ -0,0 +1,90 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only regression pin for ``_init_distributed_process_group``. + +The load-bearing invariant: under ``torchrun`` (``WORLD_SIZE > 1``) every +rank must call ``torch.cuda.set_device(LOCAL_RANK)`` first and *then* +``torch.distributed.init_process_group(backend="nccl", +device_id=torch.device("cuda:LOCAL_RANK"))``. If that ordering breaks or +``device_id=`` is dropped, NCCL defers communicator construction to the +first collective and guesses the device, which on restricted K8s GPU pods +surfaces as an opaque ``ncclUnhandledCudaError``. PyTorch >=2.4 documents +``device_id=`` as the recommended pattern. + +This test patches out ``torch.distributed`` / ``torch.cuda`` so it runs on +every CPU CI shard without standing up a real process group. +""" + +from __future__ import annotations + +from unittest.mock import MagicMock, patch + +from gr00t.experiment.experiment import _init_distributed_process_group +import torch + + +def test_torchrun_path_binds_device_id_and_orders_set_device_first(monkeypatch): + """Under ``torchrun`` (``WORLD_SIZE>1``): ``set_device(LOCAL_RANK)`` must + run before ``init_process_group(backend="nccl", device_id=cuda:LOCAL_RANK)``. + + Both the ``device_id=`` kwarg and the call ordering matter; this fails + with a precise message instead of waiting for a multi-GPU CI flake. + """ + monkeypatch.setenv("WORLD_SIZE", "4") + monkeypatch.setenv("LOCAL_RANK", "2") + + # ``manager.attach_mock`` is the canonical way to record call ordering + # across two independent ``patch()`` targets; without it each mock tracks + # only its own calls and cross-mock ordering is invisible. + manager = MagicMock() + init_pg = MagicMock() + set_device = MagicMock() + manager.attach_mock(init_pg, "init_process_group") + manager.attach_mock(set_device, "set_device") + + with ( + patch("torch.distributed.is_initialized", return_value=False), + patch("torch.distributed.get_rank", return_value=2), + patch("torch.distributed.init_process_group", new=init_pg), + patch("torch.cuda.set_device", new=set_device), + ): + rank = _init_distributed_process_group() + + assert rank == 2 + + set_device.assert_called_once_with(2) + init_pg.assert_called_once() + init_kwargs = init_pg.call_args.kwargs + assert init_kwargs.get("backend") == "nccl", ( + f"init_process_group must pin backend=nccl, got kwargs={init_kwargs}" + ) + device_id = init_kwargs.get("device_id") + assert device_id is not None, ( + "init_process_group must pass device_id= so NCCL binds the rank to its GPU " + "at communicator construction (see module docstring)." + ) + assert device_id == torch.device("cuda:2"), ( + f"device_id must be cuda:LOCAL_RANK (cuda:2 here), got {device_id!r}" + ) + + # Ordering pin: set_device(LOCAL_RANK) must precede init_process_group. + # Without it NCCL has no current-device hint and can still race even when + # device_id= is passed. + call_order = [name for (name, _, _) in manager.mock_calls] + assert call_order == ["set_device", "init_process_group"], ( + f"torch.cuda.set_device must be called BEFORE dist.init_process_group; " + f"got call order: {call_order}" + ) diff --git a/tests/gr00t/experiment/test_experiment_run.py b/tests/gr00t/experiment/test_experiment_run.py new file mode 100644 index 000000000..e72dd0f7b --- /dev/null +++ b/tests/gr00t/experiment/test_experiment_run.py @@ -0,0 +1,282 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +GPU integration test for experiment.run() with a single GPU and max_steps=1. + +This is the highest fan-out test in the project — a single call to run() +exercises almost the entire training stack: + experiment.run() + → Config.validate() + → MODEL_REGISTRY → Gr00tN1d7Pipeline.setup() + → DatasetFactory (generate_stats, generate_rel_stats, ShardedSingleStepDataset) + → Gr00tN1d7Processor (from_pretrained, set_statistics, save_pretrained) + → Gr00tN1d7 model (from_pretrained with checkpoint) + → TrainingArguments + Gr00tTrainer + → trainer.train(max_steps=1) + → trainer.save_model() + +Covers modules at 0% coverage: experiment.py, trainer.py, model_pipeline.py, +and heavily exercises sharded_*.py, factory.py, processing_gr00t_n1d7.py. + +Requires GPU and HF_TOKEN (for gated metadata download), but not model weights. +``tests/conftest.py`` sets ``GROOT_SKIP_HF_MODEL_WEIGHTS=1`` and these tests set +``skip_weight_loading`` so the pipeline exercises model construction, training, +and checkpoint saving without reading multi-GB safetensor shards. + +Training data is the LIBERO ``libero_demo`` bundle: see ``resolve_libero_demo_dataset_path`` +(``LIBERO_DEMO_DATASET_PATH``, in-repo ``demo_data/libero_demo`` with Git LFS, or +``TEST_CACHE_PATH/datasets/libero_demo``). +""" + +import json +import os +from pathlib import Path +import signal +import subprocess +import sys + +import numpy as np +import pytest +from test_support.runtime import get_root, resolve_libero_demo_dataset_path +import torch + + +REPO_ROOT = get_root() +EMBODIMENT_TAG = "libero_sim" +MODEL_REPO_ID = "nvidia/GR00T-N1.7-3B" + + +@pytest.fixture(scope="session") +def _visible_multigpu_count() -> int: + if not torch.cuda.is_available(): + pytest.skip("CUDA is not available") + + num_gpus = torch.cuda.device_count() + if num_gpus < 2: + pytest.skip(f"Need at least 2 visible GPUs for multigpu test, got {num_gpus}") + return num_gpus + + +@pytest.mark.gpu +@pytest.mark.timeout(600, func_only=True) +def test_experiment_run_single_gpu(tmp_path, monkeypatch): + """Run experiment.run() for 1 training step on a single GPU. + + This verifies that the entire training pipeline — config validation, data + loading, model initialization, one forward+backward pass, and checkpoint + saving — completes without errors. + """ + model_path = MODEL_REPO_ID + dataset_path = resolve_libero_demo_dataset_path(REPO_ROOT) + + # Ensure single GPU, no distributed (monkeypatch restores env after the test) + monkeypatch.delenv("WORLD_SIZE", raising=False) + monkeypatch.delenv("LOCAL_RANK", raising=False) + monkeypatch.delenv("RANK", raising=False) + monkeypatch.setenv("CUDA_VISIBLE_DEVICES", "0") + + from gr00t.configs.base_config import get_default_config + from gr00t.experiment.experiment import run + + output_dir = tmp_path / "experiment_output" + + config = get_default_config().load_dict( + { + "data": { + "download_cache": False, + "datasets": [ + { + "dataset_paths": [str(dataset_path)], + "mix_ratio": 1.0, + "embodiment_tag": EMBODIMENT_TAG, + } + ], + "shard_size": 64, + "num_shards_per_epoch": 1, + "multiprocessing_context": "fork", + }, + } + ) + + config.model.model_name = "nvidia/Cosmos-Reason2-2B" + config.model.backbone_trainable_params_fp32 = True + config.model.use_relative_action = True + config.model.load_bf16 = False + config.model.reproject_vision = False + config.model.tune_llm = False + config.model.tune_visual = False + config.model.tune_projector = True + config.model.tune_diffusion_model = True + + config.training.start_from_checkpoint = str(model_path) + config.training.skip_weight_loading = True + config.training.output_dir = str(output_dir) + config.training.max_steps = 1 + config.training.save_steps = 1 + config.training.global_batch_size = 2 + config.training.num_gpus = 1 + config.training.dataloader_num_workers = 0 + config.training.use_wandb = False + config.training.optim = "adamw_torch" + config.training.bf16 = True + config.training.tf32 = True + config.training.fp16 = False + config.training.gradient_checkpointing = False + config.training.use_ddp = False + config.training.eval_strategy = "no" + + run(config) + + assert output_dir.exists(), "Output directory was not created" + checkpoint_dirs = list(output_dir.glob("checkpoint-*")) + assert len(checkpoint_dirs) >= 1, ( + f"Expected at least one checkpoint, found: {list(output_dir.iterdir())}" + ) + + ckpt = checkpoint_dirs[0] + model_files = list(ckpt.glob("*.safetensors")) + list(ckpt.glob("*.bin")) + assert len(model_files) >= 1, ( + f"Checkpoint {ckpt.name} contains no model weight files: {list(ckpt.iterdir())}" + ) + for mf in model_files: + assert mf.stat().st_size > 0, f"Model file {mf.name} is empty" + + experiment_cfg = output_dir / "experiment_cfg" + assert experiment_cfg.is_dir(), "experiment_cfg directory missing" + config_yaml = experiment_cfg / "config.yaml" + assert config_yaml.exists(), "config.yaml not saved" + config_text = config_yaml.read_text() + assert "max_steps: 1" in config_text, "Saved config.yaml missing expected max_steps setting" + assert EMBODIMENT_TAG in config_text, ( + f"Saved config.yaml missing embodiment_tag '{EMBODIMENT_TAG}'" + ) + + processor_dir = output_dir / "processor" + assert processor_dir.is_dir(), "processor directory missing" + processor_cfg = processor_dir / "processor_config.json" + assert processor_cfg.exists(), "processor_config.json not saved" + + processor_data = json.loads(processor_cfg.read_text()) + assert "processor_class" in processor_data, ( + "processor_config.json missing 'processor_class' field" + ) + + # Verify training actually ran: trainer_state.json records the training progress + trainer_state_path = ckpt / "trainer_state.json" + assert trainer_state_path.exists(), ( + f"trainer_state.json missing from {ckpt.name} — training may not have run" + ) + trainer_state = json.loads(trainer_state_path.read_text()) + assert trainer_state.get("global_step", 0) >= 1, ( + f"global_step is {trainer_state.get('global_step')}, expected >= 1" + ) + log_history = trainer_state.get("log_history", []) + loss_entries = [e for e in log_history if "loss" in e] + if loss_entries: + last_loss = loss_entries[-1]["loss"] + assert np.isfinite(last_loss), f"Training loss is not finite: {last_loss}" + + torch.cuda.synchronize() + torch.cuda.empty_cache() + + +@pytest.mark.gpu +@pytest.mark.multigpu +@pytest.mark.timeout(1800, func_only=True) +def test_experiment_run_all_visible_gpus(tmp_path, _visible_multigpu_count): + """Run experiment.run() under torchrun with one rank per visible GPU.""" + num_gpus = _visible_multigpu_count + model_path = MODEL_REPO_ID + dataset_path = resolve_libero_demo_dataset_path(REPO_ROOT) + output_dir = tmp_path / "distributed_experiment_output" + runner = Path(__file__).with_name("_run_distributed_experiment.py") + + cmd = [ + sys.executable, + "-m", + "torch.distributed.run", + "--standalone", + "--max-restarts=0", + f"--nproc_per_node={num_gpus}", + str(runner), + "--model-path", + str(model_path), + "--dataset-path", + str(dataset_path), + "--output-dir", + str(output_dir), + "--num-gpus", + str(num_gpus), + ] + env = os.environ.copy() + env["PYTHONUNBUFFERED"] = "1" + env.setdefault("OMP_NUM_THREADS", "1") + env.setdefault("TORCH_NCCL_ASYNC_ERROR_HANDLING", "1") + # Some GB200 CI nodes report disabled P2P between NVLINK-connected GPUs. + # NCCL treats that as fatal unless this override is present. + env.setdefault("NCCL_IGNORE_DISABLED_P2P", "1") + # Surface the selected transport, peer-access topology, and underlying CUDA + # error on the next flake instead of one opaque ``ncclUnhandledCudaError``. + env.setdefault("NCCL_DEBUG", "WARN") + + proc = subprocess.Popen( + cmd, + cwd=REPO_ROOT, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + start_new_session=True, + ) + try: + stdout, _ = proc.communicate(timeout=1500) + except subprocess.TimeoutExpired: + os.killpg(proc.pid, signal.SIGKILL) + stdout, _ = proc.communicate() + pytest.fail(f"Distributed experiment run timed out\n\n{stdout}") + + if proc.returncode != 0: + pytest.fail( + f"Distributed experiment run failed with exit code {proc.returncode}\n\n{stdout}" + ) + + rank_dir = output_dir / "distributed_rank_metadata" + rank_files = sorted(rank_dir.glob("rank_*.json")) + assert len(rank_files) == num_gpus, ( + f"Expected metadata from {num_gpus} ranks, found {len(rank_files)}: {rank_files}" + ) + + ranks = [] + local_ranks = [] + for rank_file in rank_files: + payload = json.loads(rank_file.read_text()) + ranks.append(payload["rank"]) + local_ranks.append(payload["local_rank"]) + assert payload["world_size"] == num_gpus + assert payload["visible_cuda_device_count"] == num_gpus + assert payload["current_cuda_device"] == payload["local_rank"], ( + f"rank {payload['rank']} expected to be bound to cuda:{payload['local_rank']} " + f"but current_cuda_device is cuda:{payload['current_cuda_device']}; " + "experiment.run() likely stopped calling torch.cuda.set_device(local_rank) " + "before init_process_group, which silently puts every rank on cuda:0 and " + "leads to NCCL 'invalid device ordinal' on strict-NCCL GPU topologies" + ) + + assert sorted(ranks) == list(range(num_gpus)) + assert sorted(local_ranks) == list(range(num_gpus)) + + checkpoint_dirs = list(output_dir.glob("checkpoint-*")) + assert checkpoint_dirs, f"No distributed checkpoint was saved under {output_dir}" diff --git a/tests/gr00t/experiment/test_resume_compatibility.py b/tests/gr00t/experiment/test_resume_compatibility.py new file mode 100644 index 000000000..2de9af985 --- /dev/null +++ b/tests/gr00t/experiment/test_resume_compatibility.py @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU regression test for the ``save_only_model`` × ``resume_from_checkpoint`` guard. + +The guard lives in stdlib-only ``gr00t.configs.training.training_config`` so +this test runs without torch / transformers / wandb. +""" + +from gr00t.configs.training.training_config import TrainingConfig, check_resume_compatibility +import pytest + + +def test_raises_on_save_only_model_and_resume(): + training = TrainingConfig(save_only_model=True, resume_from_checkpoint=True) + with pytest.raises(ValueError, match="save_only_model=True is incompatible"): + check_resume_compatibility(training) + + +@pytest.mark.parametrize( + ("save_only_model", "resume_from_checkpoint"), + [ + (False, False), + (True, False), + (False, True), + ], +) +def test_compatible_combinations_pass(save_only_model, resume_from_checkpoint): + training = TrainingConfig( + save_only_model=save_only_model, + resume_from_checkpoint=resume_from_checkpoint, + ) + check_resume_compatibility(training) + + +def test_default_config_is_compatible(): + """Default TrainingConfig must not trigger the conflict (would break every fresh run).""" + check_resume_compatibility(TrainingConfig()) diff --git a/tests/gr00t/experiment/test_trainer_resume_strictness.py b/tests/gr00t/experiment/test_trainer_resume_strictness.py new file mode 100644 index 000000000..80fba3d26 --- /dev/null +++ b/tests/gr00t/experiment/test_trainer_resume_strictness.py @@ -0,0 +1,116 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU regression test pinning ``Gr00tTrainer.train()`` resume-error semantics. + +Before this MR, ``Gr00tTrainer.train()`` swallowed HF's ``ValueError("No valid +checkpoint found ...")`` and downgraded it to a single ``logging.warning``, +silently falling back to fresh training. That silencer is what hid the +``resume_from_checkpoint=True`` hardcoding (see the silent-corruption fix in +this same MR) for ~6 months: fresh runs printed one easy-to-miss WARNING and +otherwise looked normal. + +This test ensures the strict-raise behavior never regresses: an explicit +``resume_from_checkpoint=True`` against a directory with no ``checkpoint-*`` +must hard-fail. +""" + +from pathlib import Path + +from gr00t.experiment.trainer import Gr00tTrainer +import pytest +import torch +from torch import nn +from torch.utils.data import Dataset +from transformers import TrainingArguments + + +pytestmark = pytest.mark.serial + + +class _TinyModel(nn.Module): + def __init__(self): + super().__init__() + self.fc = nn.Linear(4, 4) + + def forward(self, x, labels=None): + out = self.fc(x) + loss = ((out - labels) ** 2).mean() if labels is not None else None + return {"loss": loss, "logits": out} + + +class _TinyDataset(Dataset): + def __init__(self, n: int = 4): + torch.manual_seed(0) + self.x = torch.randn(n, 4) + self.y = torch.randn(n, 4) + + def __len__(self) -> int: + return len(self.x) + + def __getitem__(self, i: int) -> dict: + return {"x": self.x[i], "labels": self.y[i]} + + +def _collate(batch): + return { + "x": torch.stack([r["x"] for r in batch]), + "labels": torch.stack([r["labels"] for r in batch]), + } + + +def _make_trainer(output_dir: Path) -> Gr00tTrainer: + args = TrainingArguments( + output_dir=str(output_dir), + max_steps=1, + per_device_train_batch_size=2, + save_strategy="no", + report_to="none", + seed=0, + dataloader_num_workers=0, + remove_unused_columns=False, + ) + return Gr00tTrainer( + model=_TinyModel(), + args=args, + train_dataset=_TinyDataset(), + data_collator=_collate, + ) + + +def test_raises_when_resume_true_but_no_checkpoint(tmp_path): + """``resume_from_checkpoint=True`` + empty output_dir must hard-fail. + + A silent fallback here is what allowed the hardcoded ``True`` in + ``experiment.run()`` to go unnoticed for months: fresh runs trained + successfully and only emitted one easily-missed WARNING. The override now + propagates HF's ``ValueError`` instead of swallowing it. + """ + trainer = _make_trainer(tmp_path) + with pytest.raises(ValueError, match="No valid checkpoint found"): + trainer.train(resume_from_checkpoint=True) + + +def test_raises_when_resume_true_and_only_non_checkpoint_subdirs(tmp_path): + """Sibling directories like ``processor/`` / ``experiment_cfg/`` written + by ``experiment.run()`` before ``trainer.train()`` must not be mistaken + for resumable checkpoints. + """ + (tmp_path / "processor").mkdir() + (tmp_path / "experiment_cfg").mkdir() + (tmp_path / "wandb_config.json").write_text("{}") + trainer = _make_trainer(tmp_path) + with pytest.raises(ValueError, match="No valid checkpoint found"): + trainer.train(resume_from_checkpoint=True) diff --git a/tests/gr00t/experiment/test_warn_configs.py b/tests/gr00t/experiment/test_warn_configs.py new file mode 100644 index 000000000..2bc51f589 --- /dev/null +++ b/tests/gr00t/experiment/test_warn_configs.py @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only guards for the training-config invariants in ``experiment``: + +* ``num_gpus`` must equal the launcher ``WORLD_SIZE`` (otherwise per-device + batch math and the real data-parallel size disagree). +* ``warmup_steps`` is actually forwarded to HF ``TrainingArguments`` so its + documented "overrides warmup_ratio" contract holds. +""" + +from __future__ import annotations + +import ast +from pathlib import Path + +import pytest + + +EXPERIMENT_SRC = Path(__file__).resolve().parents[3] / "gr00t" / "experiment" / "experiment.py" + + +@pytest.mark.parametrize( + "world_size_env, num_gpus, expect_error", + [ + (None, 8, False), # no launcher → single process, unchecked + ("8", 8, False), # torchrun matches config + ("8", 1, True), # 8-rank launch, num_gpus=1 → 8x effective batch + ("4", 8, True), # config over-counts ranks + ], +) +def test_num_gpus_must_match_world_size(monkeypatch, world_size_env, num_gpus, expect_error): + from gr00t.experiment.experiment import _assert_num_gpus_matches_world_size + + if world_size_env is None: + monkeypatch.delenv("WORLD_SIZE", raising=False) + else: + monkeypatch.setenv("WORLD_SIZE", world_size_env) + + if expect_error: + with pytest.raises(ValueError, match="WORLD_SIZE"): + _assert_num_gpus_matches_world_size(num_gpus) + else: + _assert_num_gpus_matches_world_size(num_gpus) + + +def _training_arguments_keywords() -> set[str]: + """Keyword names passed to the ``TrainingArguments(...)`` call in ``run``.""" + tree = ast.parse(EXPERIMENT_SRC.read_text()) + for node in ast.walk(tree): + if ( + isinstance(node, ast.Call) + and isinstance(node.func, ast.Name) + and node.func.id == "TrainingArguments" + ): + return {kw.arg for kw in node.keywords if kw.arg is not None} + raise AssertionError("TrainingArguments(...) call not found in experiment.py") + + +def test_warmup_steps_is_forwarded_to_training_arguments(): + # warn_configs warns that warmup_steps "will override warmup_ratio"; that is + # only true if the field actually reaches the trainer. + keywords = _training_arguments_keywords() + assert "warmup_steps" in keywords + assert "warmup_ratio" in keywords diff --git a/tests/gr00t/model/test_action_head.py b/tests/gr00t/model/test_action_head.py new file mode 100644 index 000000000..a3cf9aa8c --- /dev/null +++ b/tests/gr00t/model/test_action_head.py @@ -0,0 +1,263 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test Gr00tN1d7ActionHead: flow matching forward, get_action, feature encoding. + +These tests instantiate the action head directly (no backbone required) +and feed it synthetic backbone output tensors. +""" + +import math + +from gr00t.configs.model.gr00t_n1d7 import Gr00tN1d7Config +from gr00t.model.gr00t_n1d7.gr00t_n1d7 import Gr00tN1d7ActionHead +import pytest +import torch +from transformers.feature_extraction_utils import BatchFeature + + +def _small_config(**overrides) -> Gr00tN1d7Config: + defaults = dict( + backbone_embedding_dim=64, + hidden_size=64, + input_embedding_dim=64, + max_state_dim=7, + max_action_dim=7, + action_horizon=4, + state_history_length=1, + num_inference_timesteps=2, + max_num_embodiments=4, + add_pos_embed=True, + use_vlln=True, + max_seq_len=32, + use_alternate_vl_dit=False, + attend_text_every_n_blocks=2, + tune_projector=True, + tune_diffusion_model=True, + tune_vlln=True, + state_dropout_prob=0.0, + noise_beta_alpha=1.5, + noise_beta_beta=1.0, + noise_s=0.999, + num_timestep_buckets=1000, + attn_dropout=0.0, + diffusion_model_cfg={ + "positional_embeddings": None, + "num_layers": 2, + "num_attention_heads": 2, + "attention_head_dim": 32, + "norm_type": "ada_norm", + "dropout": 0.0, + "final_dropout": False, + "output_dim": 64, + "interleave_self_attention": True, + }, + ) + defaults.update(overrides) + return Gr00tN1d7Config(**defaults) + + +@pytest.fixture +def action_head(): + config = _small_config() + head = Gr00tN1d7ActionHead(config) + head.eval() + return head, config + + +def _make_backbone_output(config, batch_size=2, seq_len=8): + return BatchFeature( + data={ + "backbone_features": torch.randn(batch_size, seq_len, config.backbone_embedding_dim), + "backbone_attention_mask": torch.ones(batch_size, seq_len, dtype=torch.long), + "image_mask": torch.ones(batch_size, seq_len, dtype=torch.bool), + } + ) + + +def _make_action_input(config, batch_size=2): + return BatchFeature( + data={ + "state": torch.randn(batch_size, config.state_history_length, config.max_state_dim), + "action": torch.randn(batch_size, config.action_horizon, config.max_action_dim), + "embodiment_id": torch.zeros(batch_size, dtype=torch.long), + "action_mask": torch.ones(batch_size, config.action_horizon, config.max_action_dim), + } + ) + + +class TestActionHeadForward: + """Test training forward pass.""" + + def test_forward_returns_loss(self, action_head): + head, config = action_head + head.train() + out = head.forward(_make_backbone_output(config), _make_action_input(config)) + assert "loss" in out + assert out["loss"].dim() == 0 + assert torch.isfinite(out["loss"]) + + def test_forward_loss_shape(self, action_head): + head, config = action_head + head.train() + out = head.forward(_make_backbone_output(config), _make_action_input(config)) + assert out["action_loss"].shape == (2, config.action_horizon, config.max_action_dim) + + def test_forward_with_state_dropout(self): + config = _small_config(state_dropout_prob=0.5) + head = Gr00tN1d7ActionHead(config) + head.train() + out = head.forward(_make_backbone_output(config), _make_action_input(config)) + assert torch.isfinite(out["loss"]) + + +class TestActionHeadGetAction: + """Test inference (denoising loop).""" + + def test_get_action_output_shape(self, action_head): + head, config = action_head + action_input = _make_action_input(config) + del action_input["action"] # get_action doesn't need ground-truth action + out = head.get_action(_make_backbone_output(config), action_input) + assert "action_pred" in out + assert out["action_pred"].shape == (2, config.action_horizon, config.max_action_dim) + + def test_get_action_no_grad(self, action_head): + head, config = action_head + action_input = _make_action_input(config) + del action_input["action"] + out = head.get_action(_make_backbone_output(config), action_input) + assert not out["action_pred"].requires_grad + + def test_get_action_single_sample(self, action_head): + head, config = action_head + action_input = _make_action_input(config, batch_size=1) + del action_input["action"] + out = head.get_action( + _make_backbone_output(config, batch_size=1), + action_input, + ) + assert out["action_pred"].shape[0] == 1 + + +class TestActionHeadEncodeFeatures: + """Test feature encoding helper.""" + + def test_encode_features_shapes(self, action_head): + head, config = action_head + result = head._encode_features( + _make_backbone_output(config), + _make_action_input(config), + ) + assert result["backbone_features"].shape == (2, 8, config.backbone_embedding_dim) + assert result["state_features"].shape == (2, 1, config.input_embedding_dim) + + +def _beta_time_moments(alpha: float, beta: float, noise_s: float) -> tuple[float, float]: + """Closed-form mean/variance of sample_time's output, derived from config. + + sample_time draws ``b ~ Beta(alpha, beta)`` and returns ``s = (1 - b) * noise_s``. + The moments are re-derived here from the config values (not hand-picked + constants and not a fingerprint of whatever the code currently emits), so + the assertions are an independent oracle for the sampler rather than an + author-vs-author restatement. + """ + mean_b = alpha / (alpha + beta) + var_b = (alpha * beta) / ((alpha + beta) ** 2 * (alpha + beta + 1.0)) + mean_s = (1.0 - mean_b) * noise_s + var_s = (noise_s**2) * var_b + return mean_s, var_s + + +class TestActionHeadTimeSamplingMetaSafe: + """Oracle tests for sample_time under meta / no_init_weights construction. + + Regression guard: when the action head is built while the default device is + meta (as happens inside a nested from_pretrained), sample_time must still + produce a valid, correctly-distributed noise schedule on the requested + device — not a crash or uninitialized values from a meta-backed Beta. + """ + + @pytest.mark.parametrize( + "alpha,beta,noise_s", + [(1.5, 1.0, 0.999), (2.0, 3.0, 0.95)], + ) + def test_sample_time_under_meta_construction(self, alpha, beta, noise_s): + config = _small_config(noise_beta_alpha=alpha, noise_beta_beta=beta, noise_s=noise_s) + # Reproduce the production failure condition: the whole action head is + # instantiated while the default device is meta. + with torch.device("meta"): + head = Gr00tN1d7ActionHead(config) + + torch.manual_seed(0) + n = 200_000 + sample = head.sample_time(n, device="cpu", dtype=torch.float32) + + # Requested device/dtype honored even though the module was built on meta. + assert sample.device.type == "cpu" + assert sample.dtype == torch.float32 + # No uninitialized / nan / inf leakage from a meta-backed distribution. + assert torch.isfinite(sample).all() + # Transformed-Beta support: s = (1 - b) * noise_s with b in [0, 1]. + assert (sample >= 0).all() + assert (sample <= noise_s + 1e-6).all() + + # Distribution matches Beta(alpha, beta) transformed; RHS from config. + mean_s, var_s = _beta_time_moments(alpha, beta, noise_s) + assert math.isclose(sample.mean().item(), mean_s, abs_tol=5e-3) + assert math.isclose(sample.var(unbiased=False).item(), var_s, rel_tol=0.1) + + def test_sample_time_construction_device_invariant(self): + """Construction device must not change the sampled noise stream.""" + config = _small_config() + head_real = Gr00tN1d7ActionHead(config) + with torch.device("meta"): + head_meta = Gr00tN1d7ActionHead(config) + + n = 200_000 + torch.manual_seed(1234) + s_real = head_real.sample_time(n, device="cpu", dtype=torch.float32) + torch.manual_seed(1234) + s_meta = head_meta.sample_time(n, device="cpu", dtype=torch.float32) + + # Same seed + config-derived sampler ⇒ byte-identical stream regardless + # of whether the head was constructed on a real device or on meta. + assert torch.equal(s_real, s_meta) + + +class TestActionHeadTrainableParams: + """Test parameter freezing.""" + + def test_all_trainable_by_default(self, action_head): + head, _ = action_head + head.set_trainable_parameters(True, True, True) + assert all(p.requires_grad for p in head.parameters()) + + def test_freeze_projector(self): + config = _small_config() + head = Gr00tN1d7ActionHead(config) + head.set_trainable_parameters(False, True, True) + for p in head.state_encoder.parameters(): + assert not p.requires_grad + for p in head.action_encoder.parameters(): + assert not p.requires_grad + + def test_freeze_diffusion(self): + config = _small_config() + head = Gr00tN1d7ActionHead(config) + head.set_trainable_parameters(True, False, True) + for p in head.model.parameters(): + assert not p.requires_grad diff --git a/tests/gr00t/model/test_action_horizon_validation.py b/tests/gr00t/model/test_action_horizon_validation.py new file mode 100644 index 000000000..c36f25cfe --- /dev/null +++ b/tests/gr00t/model/test_action_horizon_validation.py @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""``validate_action_horizons`` must reject an embodiment whose action horizon +exceeds the model's ``max_action_horizon`` at processor construction, rather than +letting it surface deep in the first forward. +""" + +from __future__ import annotations + +from types import SimpleNamespace + +import pytest + + +processing = pytest.importorskip("gr00t.model.gr00t_n1d7.processing_gr00t_n1d7") +validate_action_horizons = processing.validate_action_horizons + + +def _action(horizon: int) -> dict: + return {"action": SimpleNamespace(delta_indices=list(range(horizon)))} + + +def test_passes_when_all_horizons_fit(): + configs = {"emb_a": _action(40), "emb_b": _action(8)} + validate_action_horizons(configs, max_action_horizon=40) + + +def test_raises_when_horizon_exceeds_max(): + configs = {"g1": _action(50)} + with pytest.raises(ValueError) as excinfo: + validate_action_horizons(configs, max_action_horizon=40) + message = str(excinfo.value) + assert "g1=50" in message + assert ">= 50" in message + + +def test_reports_the_largest_required_horizon(): + configs = {"g1": _action(50), "big": _action(64), "small": _action(8)} + with pytest.raises(ValueError) as excinfo: + validate_action_horizons(configs, max_action_horizon=40) + assert ">= 64" in str(excinfo.value) + + +def test_ignores_embodiments_without_an_action_config(): + configs = {"vlm_only": {"video": SimpleNamespace(delta_indices=[0])}} + validate_action_horizons(configs, max_action_horizon=40) diff --git a/tests/gr00t/model/test_gated_backbone_error.py b/tests/gr00t/model/test_gated_backbone_error.py new file mode 100644 index 000000000..cb75cba91 --- /dev/null +++ b/tests/gr00t/model/test_gated_backbone_error.py @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Tests for gated-backbone error detection in qwen3_backbone.""" + +from gr00t.model.modules.qwen3_backbone import _GATED_BACKBONE_HINT, _is_gated_repo_error +import pytest + + +@pytest.mark.parametrize( + "exc", + [ + OSError( + "You are trying to access a gated repo. Make sure to have access to it at " + "https://huggingface.co/nvidia/Cosmos-Reason2-2B. 401 Client Error." + ), + Exception("Access to model nvidia/Cosmos-Reason2-2B is restricted."), + RuntimeError("Cannot access gated repo for url ..."), + ], +) +def test_detects_gated_errors(exc): + assert _is_gated_repo_error(exc) is True + + +def test_detects_actual_gated_repo_error_instance(): + GatedRepoError = pytest.importorskip("huggingface_hub.errors").GatedRepoError + # Detected via isinstance even when the message carries no gated markers. + assert _is_gated_repo_error(GatedRepoError("403")) is True + + +def test_detects_gated_repo_error_wrapped_as_cause(): + GatedRepoError = pytest.importorskip("huggingface_hub.errors").GatedRepoError + try: + try: + raise GatedRepoError("403") + except GatedRepoError as inner: + raise OSError("Could not load the model") from inner + except OSError as exc: + # Outer message has no markers; detection must follow __cause__. + assert _is_gated_repo_error(exc) is True + + +@pytest.mark.parametrize( + "exc", + [ + ValueError("some unrelated configuration error"), + FileNotFoundError("config.json not found"), + RuntimeError("CUDA out of memory"), + ], +) +def test_ignores_unrelated_errors(exc): + assert _is_gated_repo_error(exc) is False + + +def test_hint_mentions_repo_and_auth(): + msg = _GATED_BACKBONE_HINT.format(model_name="nvidia/Cosmos-Reason2-2B") + assert "nvidia/Cosmos-Reason2-2B" in msg + assert "hf auth login" in msg diff --git a/tests/gr00t/model/test_gr00t_processor.py b/tests/gr00t/model/test_gr00t_processor.py new file mode 100644 index 000000000..590b0ea46 --- /dev/null +++ b/tests/gr00t/model/test_gr00t_processor.py @@ -0,0 +1,271 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test Gr00tN1d7Processor: state/action processing, VLM input generation, decode_action. + +Uses the fixture configs in tests/fixtures/processor_config/ with a mocked VLM +processor (no model download needed). +""" + +import json +from pathlib import Path +import tempfile +from unittest.mock import MagicMock, patch + +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.data.types import MessageType, VLAStepData +import numpy as np +from PIL import Image +import pytest + + +FIXTURE_DIR = Path(__file__).parent.parent.parent / "fixtures" / "processor_config" +EMBODIMENT = "libero_sim" + + +@pytest.fixture +def processor(): + from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import Gr00tN1d7Processor + + mock_vlm = MagicMock() + mock_vlm.apply_chat_template.return_value = "mock text" + mock_vlm.tokenizer.padding_side = "left" + + with patch( + "gr00t.model.gr00t_n1d7.processing_gr00t_n1d7.build_processor", + return_value=mock_vlm, + ): + proc = Gr00tN1d7Processor.from_pretrained(FIXTURE_DIR) + proc.eval() + return proc + + +@pytest.fixture +def proc_config(): + with open(FIXTURE_DIR / "processor_config.json") as f: + return json.load(f)["processor_kwargs"] + + +def test_from_pretrained_passes_hub_kwargs_to_cached_file(tmp_path): + """Repo-id processor loads must honor the HF local/cache kwargs from conftest.""" + from gr00t.model.gr00t_n1d7 import processing_gr00t_n1d7 as processor_module + + mock_vlm = MagicMock() + mock_vlm.apply_chat_template.return_value = "mock text" + mock_vlm.tokenizer.padding_side = "left" + calls = [] + + def fake_cached_file(path_or_repo_id, filename, **kwargs): + calls.append( + { + "path_or_repo_id": path_or_repo_id, + "filename": filename, + "kwargs": kwargs, + } + ) + return str(FIXTURE_DIR / filename) + + with ( + patch.object(processor_module, "cached_file", side_effect=fake_cached_file), + patch.object(processor_module, "build_processor", return_value=mock_vlm), + ): + processor_module.Gr00tN1d7Processor.from_pretrained( + "nvidia/GR00T-N1.7-3B", + cache_dir=tmp_path, + local_files_only=True, + revision="abc123", + token="hf_fake", + ) + + assert [call["filename"] for call in calls] == [ + "processor_config.json", + "statistics.json", + "embodiment_id.json", + ] + for call in calls: + assert call["path_or_repo_id"] == Path("nvidia/GR00T-N1.7-3B") + assert call["kwargs"] == { + "cache_dir": tmp_path, + "local_files_only": True, + "revision": "abc123", + "token": "hf_fake", + } + + +def _make_step_data(proc_config) -> VLAStepData: + """Create synthetic VLAStepData matching the fixture config.""" + import json as _json + + mc = proc_config["modality_configs"][EMBODIMENT] + state_keys = mc["state"]["modality_keys"] + action_keys = mc["action"]["modality_keys"] + video_keys = mc["video"]["modality_keys"] + action_horizon = len(mc["action"]["delta_indices"]) + + # Load statistics to get correct dimensions per key + with open(FIXTURE_DIR / "statistics.json") as f: + statistics = _json.load(f) + + images = {k: [np.random.randint(0, 255, (256, 256, 3), dtype=np.uint8)] for k in video_keys} + states = { + k: np.random.randn(1, len(statistics[EMBODIMENT]["state"][k]["min"])).astype(np.float32) + for k in state_keys + } + actions = { + k: np.random.randn(action_horizon, len(statistics[EMBODIMENT]["action"][k]["min"])).astype( + np.float32 + ) + for k in action_keys + } + + return VLAStepData( + images=images, + states=states, + actions=actions, + text="pick up the apple", + embodiment=EmbodimentTag(EMBODIMENT), + ) + + +class TestProcessorCall: + """Test __call__ with VLAStepData messages.""" + + def test_call_returns_expected_keys(self, processor, proc_config): + step_data = _make_step_data(proc_config) + messages = [{"type": MessageType.EPISODE_STEP.value, "content": step_data}] + result = processor(messages) + assert "state" in result + assert "action" in result + assert "embodiment_id" in result + assert "action_mask" in result + + def test_state_padded_to_max_dim(self, processor, proc_config): + step_data = _make_step_data(proc_config) + messages = [{"type": MessageType.EPISODE_STEP.value, "content": step_data}] + result = processor(messages) + state = result["state"] + max_dim = proc_config["max_state_dim"] + assert state.shape[-1] == max_dim, f"Expected state dim {max_dim}, got {state.shape[-1]}" + + def test_action_padded_to_max_dim(self, processor, proc_config): + step_data = _make_step_data(proc_config) + messages = [{"type": MessageType.EPISODE_STEP.value, "content": step_data}] + result = processor(messages) + action = result["action"] + max_dim = proc_config["max_action_dim"] + assert action.shape[-1] == max_dim, f"Expected action dim {max_dim}, got {action.shape[-1]}" + + def test_action_mask_matches_action(self, processor, proc_config): + step_data = _make_step_data(proc_config) + messages = [{"type": MessageType.EPISODE_STEP.value, "content": step_data}] + result = processor(messages) + assert result["action_mask"].shape == result["action"].shape + + def test_embodiment_id_is_integer(self, processor, proc_config): + step_data = _make_step_data(proc_config) + messages = [{"type": MessageType.EPISODE_STEP.value, "content": step_data}] + result = processor(messages) + assert isinstance(result["embodiment_id"], (int, np.integer)) + + +class TestProcessorVLMInputs: + """Test VLM input generation.""" + + def test_get_vlm_inputs(self, processor): + image_keys = processor.modality_configs[EMBODIMENT]["video"].modality_keys + mock_images = { + k: [Image.fromarray(np.random.randint(0, 255, (256, 256, 3), dtype=np.uint8))] + for k in image_keys + } + vlm_inputs = processor._get_vlm_inputs( + image_keys=image_keys, + images=mock_images, + image_transform=processor.eval_image_transform, + language="pick up the apple", + masks=None, + ) + assert "vlm_content" in vlm_inputs + + +class TestProcessorDecodeAction: + """Test action denormalization.""" + + def test_decode_action_returns_all_keys(self, processor, proc_config): + mc = proc_config["modality_configs"][EMBODIMENT] + action_keys = mc["action"]["modality_keys"] + # Load statistics so decode_action can denormalize + with open(FIXTURE_DIR / "statistics.json") as f: + stats = json.load(f) + processor.set_statistics(stats) + + action_dim = processor.state_action_processor.get_action_dim(EMBODIMENT) + action_horizon = len(mc["action"]["delta_indices"]) + dummy_action = np.random.randn(action_horizon, action_dim).astype(np.float32) + result = processor.decode_action(dummy_action, EmbodimentTag(EMBODIMENT)) + assert set(result.keys()) == set(action_keys) + + +class TestProcessorStatistics: + """Test statistics management.""" + + def test_set_statistics(self, processor): + with open(FIXTURE_DIR / "statistics.json") as f: + stats = json.load(f) + processor.set_statistics(stats) + assert EMBODIMENT in processor.statistics + + def test_train_eval_mode(self, processor): + processor.train() + assert processor.training is True + assert processor.state_action_processor.training is True + processor.eval() + assert processor.training is False + assert processor.state_action_processor.training is False + + +class TestFixtureCompleteness: + """Guard against fixture drift: the fixture must contain every field that save_pretrained writes.""" + + def test_fixture_keys_match_save_pretrained_roundtrip(self, processor): + """Load the fixture, save to a temp dir, and verify the keys are identical. + + If this test fails, a field was added to save_pretrained() (or __init__) + without updating the test fixture JSON. Fix by running save_pretrained() + on a default-constructed processor and copying the output back into + tests/fixtures/processor_config/processor_config.json. + """ + with open(FIXTURE_DIR / "processor_config.json") as f: + fixture_kwargs = json.load(f)["processor_kwargs"] + + with tempfile.TemporaryDirectory() as tmp: + processor.save_pretrained(tmp) + with open(Path(tmp) / "processor_config.json") as f: + saved_kwargs = json.load(f)["processor_kwargs"] + + fixture_keys = set(fixture_kwargs.keys()) + saved_keys = set(saved_kwargs.keys()) + + missing = saved_keys - fixture_keys + extra = fixture_keys - saved_keys + + assert not missing, ( + f"Fixture is missing fields that save_pretrained() writes: {missing}. " + f"Update tests/fixtures/processor_config/processor_config.json." + ) + assert not extra, ( + f"Fixture has fields that save_pretrained() no longer writes: {extra}. " + f"Remove them from tests/fixtures/processor_config/processor_config.json." + ) diff --git a/tests/gr00t/model/test_model_forward.py b/tests/gr00t/model/test_model_forward.py new file mode 100644 index 000000000..1593e9217 --- /dev/null +++ b/tests/gr00t/model/test_model_forward.py @@ -0,0 +1,222 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test Gr00tN1d7 model forward pass and action generation with dummy data. + +These tests construct a minimal Gr00tN1d7 model (with mocked backbone) and +verify that forward() computes a scalar loss and get_action() produces +action predictions of the expected shape. +""" + +from unittest.mock import MagicMock, patch + +from gr00t.configs.model.gr00t_n1d7 import Gr00tN1d7Config +import pytest +import torch +from transformers.feature_extraction_utils import BatchFeature + + +def _make_small_config(**overrides) -> Gr00tN1d7Config: + """Return a minimal config for fast instantiation.""" + defaults = dict( + model_name="nvidia/Cosmos-Reason2-2B", + backbone_model_type="qwen", + backbone_embedding_dim=64, + hidden_size=64, + input_embedding_dim=64, + max_state_dim=7, + max_action_dim=7, + action_horizon=4, + state_history_length=1, + num_inference_timesteps=2, + max_num_embodiments=4, + add_pos_embed=True, + use_vlln=True, + max_seq_len=32, + use_alternate_vl_dit=False, + select_layer=1, + reproject_vision=False, + use_flash_attention=False, + load_bf16=False, + tune_top_llm_layers=0, + backbone_trainable_params_fp32=False, + tune_llm=False, + tune_visual=False, + tune_projector=True, + tune_diffusion_model=True, + tune_vlln=True, + state_dropout_prob=0.0, + diffusion_model_cfg={ + "positional_embeddings": None, + "num_layers": 2, + "num_attention_heads": 2, + "attention_head_dim": 32, + "norm_type": "ada_norm", + "dropout": 0.0, + "final_dropout": False, + "output_dim": 64, + "interleave_self_attention": True, + }, + ) + defaults.update(overrides) + return Gr00tN1d7Config(**defaults) + + +def _make_mock_backbone(config, seq_len=8): + """Return a mock backbone that produces correctly-shaped outputs.""" + backbone = MagicMock() + + def fake_forward(vl_input): + B = 1 + # Try to infer batch size from input + for v in vl_input.values(): + if isinstance(v, torch.Tensor) and v.dim() >= 2: + B = v.shape[0] + break + device = next( + (v.device for v in vl_input.values() if isinstance(v, torch.Tensor)), + torch.device("cpu"), + ) + dtype = next( + ( + v.dtype + for v in vl_input.values() + if isinstance(v, torch.Tensor) and v.is_floating_point() + ), + torch.float32, + ) + return BatchFeature( + data={ + "backbone_features": torch.randn( + B, seq_len, config.backbone_embedding_dim, device=device, dtype=dtype + ), + "backbone_attention_mask": torch.ones(B, seq_len, device=device, dtype=torch.long), + "image_mask": torch.ones(B, seq_len, device=device, dtype=torch.bool), + } + ) + + backbone.side_effect = fake_forward + backbone.prepare_input = lambda x: BatchFeature(data=x) + return backbone + + +@pytest.fixture +def small_model(): + """Build a Gr00tN1d7 with mocked backbone (no GPU/download required).""" + config = _make_small_config() + + with patch("gr00t.model.gr00t_n1d7.gr00t_n1d7.get_backbone_cls") as mock_get_cls: + mock_get_cls.return_value = lambda **kwargs: _make_mock_backbone(config) + with patch("gr00t.model.gr00t_n1d7.processing_gr00t_n1d7.build_processor"): + from gr00t.model.gr00t_n1d7.gr00t_n1d7 import Gr00tN1d7 + + model = Gr00tN1d7(config) + + model.eval() + return model, config + + +def _make_dummy_inputs(config, batch_size=2): + """Create dummy input tensors matching the model's expected format.""" + return { + "state": torch.randn(batch_size, config.state_history_length, config.max_state_dim), + "action": torch.randn(batch_size, config.action_horizon, config.max_action_dim), + "embodiment_id": torch.zeros(batch_size, dtype=torch.long), + "action_mask": torch.ones(batch_size, config.action_horizon, config.max_action_dim), + } + + +class TestGr00tN1d7Forward: + """Test model forward pass produces valid loss.""" + + def test_forward_returns_loss(self, small_model): + model, config = small_model + inputs = _make_dummy_inputs(config) + output = model.forward(inputs) + assert "loss" in output + assert output["loss"].dim() == 0, "loss should be scalar" + assert torch.isfinite(output["loss"]), "loss should be finite" + + def test_forward_returns_action_loss_and_mask(self, small_model): + model, config = small_model + inputs = _make_dummy_inputs(config) + output = model.forward(inputs) + assert "action_loss" in output + assert "action_mask" in output + assert output["action_loss"].shape == (2, config.action_horizon, config.max_action_dim) + + def test_forward_loss_requires_grad(self, small_model): + model, config = small_model + model.train() + inputs = _make_dummy_inputs(config) + output = model.forward(inputs) + assert output["loss"].requires_grad + + def test_forward_different_batch_sizes(self, small_model): + model, config = small_model + for bs in [1, 4]: + inputs = _make_dummy_inputs(config, batch_size=bs) + output = model.forward(inputs) + assert output["loss"].dim() == 0 + + +class TestGr00tN1d7GetAction: + """Test model action generation.""" + + def test_get_action_shape(self, small_model): + model, config = small_model + inputs = _make_dummy_inputs(config, batch_size=1) + del inputs["action"] # get_action uses diffusion denoising, not ground-truth + output = model.get_action(inputs) + assert "action_pred" in output + assert output["action_pred"].shape == (1, config.action_horizon, config.max_action_dim) + + def test_get_action_no_grad(self, small_model): + model, config = small_model + inputs = _make_dummy_inputs(config, batch_size=1) + del inputs["action"] + output = model.get_action(inputs) + assert not output["action_pred"].requires_grad + + +class TestGr00tN1d7Config: + """Test config creation and serialization.""" + + def test_default_config(self): + config = Gr00tN1d7Config() + assert config.model_type == "Gr00tN1d7" + assert config.max_state_dim == 132 + assert config.action_horizon == 40 + + def test_custom_config(self): + config = Gr00tN1d7Config(max_state_dim=10, action_horizon=8) + assert config.max_state_dim == 10 + assert config.action_horizon == 8 + + def test_to_filtered_dict(self): + config = Gr00tN1d7Config() + d = config.to_filtered_dict(exclude_augment=True) + assert "random_rotation_angle" not in d + assert "hidden_size" in d + + def test_to_filtered_json(self): + config = Gr00tN1d7Config() + j = config.to_filtered_json() + assert isinstance(j, str) + import json + + parsed = json.loads(j) + assert parsed["model_type"] == "Gr00tN1d7" diff --git a/tests/gr00t/model/test_qwen3_rope.py b/tests/gr00t/model/test_qwen3_rope.py new file mode 100644 index 000000000..4eb28866a --- /dev/null +++ b/tests/gr00t/model/test_qwen3_rope.py @@ -0,0 +1,388 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only oracle tests for Qwen3-VL RoPE ``inv_freq`` determinism. + +Qwen3-VL registers its vision and text RoPE ``inv_freq`` with +``persistent=False``, so the buffers are not restored from a checkpoint and can +be left uninitialized when the model is loaded under a ``meta`` / no-init +context (the silent backend-divergence bug). ``Qwen3Backbone`` repairs them once +at load time by re-deriving the analytic frequencies via each module's own +constructor. + +These tests verify that repair against an *independent* closed-form oracle (the +RoPE math written out here, not re-using transformers' helper), assert the +repair actually fires when the buffer is corrupt, and assert idempotence when it +is already correct. The oracle is carried all the way to the **cos/sin** the +attention kernels consume (including interleaved mRoPE and the configured +``rope_type`` branch), not just ``inv_freq`` -- a backend-vs-backend fingerprint +agrees on a common-mode error in that shared assembly, an absolute oracle does +not. No checkpoint download or GPU is required. +""" + +import types + +import pytest +import torch + + +qwen3_vl = pytest.importorskip("transformers.models.qwen3_vl.modeling_qwen3_vl") +from gr00t.model.modules.qwen3_backbone import ( # noqa: E402 + Qwen3Backbone, + _assign_inv_freq, + recompute_text_rotary_inv_freq, + recompute_vision_rotary_inv_freq, +) +from transformers.models.qwen3_vl.configuration_qwen3_vl import ( # noqa: E402 + Qwen3VLTextConfig, + Qwen3VLVisionConfig, +) + + +Qwen3VLVisionRotaryEmbedding = qwen3_vl.Qwen3VLVisionRotaryEmbedding +Qwen3VLTextRotaryEmbedding = qwen3_vl.Qwen3VLTextRotaryEmbedding + +# Qwen3VLVisionRotaryEmbedding hardcodes theta=10000.0 in its constructor. +_VISION_THETA = 10000.0 + + +def _vision_config() -> Qwen3VLVisionConfig: + return Qwen3VLVisionConfig(hidden_size=32, num_heads=4) + + +def _text_config(rope_scaling: dict | None = None, head_dim: int = 8) -> Qwen3VLTextConfig: + return Qwen3VLTextConfig( + hidden_size=16, + num_attention_heads=2, + num_key_value_heads=2, + head_dim=head_dim, + rope_theta=10000.0, + rope_scaling=rope_scaling or {"rope_type": "default", "mrope_section": [2, 1, 1]}, + max_position_embeddings=64, + ) + + +def _vision_head_dim_half(cfg: Qwen3VLVisionConfig) -> int: + return (cfg.hidden_size // cfg.num_heads) // 2 + + +def _oracle_inv_freq(dim: int, base: float) -> torch.Tensor: + """Independent closed-form RoPE inverse frequencies (external-truth oracle). + + ``inv_freq[i] = 1 / base ** ((2 * i) / dim)`` for ``i in [0, dim/2)``. This is + written out by hand so it does not share code with the production path. + """ + exponents = torch.arange(0, dim, 2, dtype=torch.float32) / dim + return 1.0 / (base**exponents) + + +def _corrupt(rotary: torch.nn.Module, name: str = "inv_freq") -> None: + """Simulate an uninitialized non-persistent buffer (NaN garbage).""" + current = getattr(rotary, name) + setattr(rotary, name, torch.full_like(current, float("nan"))) + + +def _oracle_text_cos_sin( + inv_freq: torch.Tensor, + position_ids: torch.Tensor, + mrope_section: list[int], + attention_scaling: float = 1.0, +) -> tuple[torch.Tensor, torch.Tensor]: + """Independent closed-form mRoPE cos/sin (external-truth oracle). + + Re-derives Qwen3-VL's interleaved-mRoPE cos/sin from ``position_ids`` and a + closed-form ``inv_freq`` without calling the production forward or + ``apply_interleaved_mrope``: per-section frequencies are the outer product + ``position * inv_freq``; the merged track starts as the T section and the H + (offset 1) and W (offset 2) sections overwrite every third channel up to + ``mrope_section[axis] * 3``. A drift in the reset frequencies, the section + interleave, or the channel layout that all three backends share would change + these values, which a backend-vs-backend fingerprint cannot see. + + ``position_ids`` is ``(3, seq)`` (T/H/W); the return is ``(seq, 2 * half)``. + """ + half = inv_freq.shape[0] + pos = position_ids.to(torch.float32) + freqs = pos[:, :, None] * inv_freq[None, None, :] # (3, seq, half) + merged = freqs[0].clone() # T section + for axis, offset in ((1, 1), (2, 2)): # H then W + upper = min(mrope_section[axis] * 3, half) + cols = list(range(offset, upper, 3)) + if cols: + merged[:, cols] = freqs[axis][:, cols] + emb = torch.cat([merged, merged], dim=-1) + return emb.cos() * attention_scaling, emb.sin() * attention_scaling + + +def _oracle_vision_cos_sin( + inv_freq: torch.Tensor, seqlen: int +) -> tuple[torch.Tensor, torch.Tensor]: + """Independent closed-form vision RoPE cos/sin for positions ``0..seqlen-1``. + + Mirrors the vision tower contract: ``freqs = outer(arange(seqlen), inv_freq)`` + then ``emb = cat(freqs, freqs); (emb.cos(), emb.sin())``. + """ + seq = torch.arange(seqlen, dtype=torch.float32) + freqs = torch.outer(seq, inv_freq) + emb = torch.cat([freqs, freqs], dim=-1) + return emb.cos(), emb.sin() + + +def _corrupted_backbone(vis_cfg: Qwen3VLVisionConfig, txt_cfg: Qwen3VLTextConfig): + """Build a Qwen3Backbone shell whose vision+text RoPE buffers are corrupt. + + Wires real Qwen3-VL rotary modules under the attribute layout + ``_reset_rotary_inv_freq`` expects, with both ``inv_freq`` buffers NaN-filled + so a successful reset is observable. No checkpoint / GPU is loaded. + """ + backbone = Qwen3Backbone.__new__(Qwen3Backbone) + torch.nn.Module.__init__(backbone) + + dim = _vision_head_dim_half(vis_cfg) + vision_rotary = Qwen3VLVisionRotaryEmbedding(dim) + text_rotary = Qwen3VLTextRotaryEmbedding(config=txt_cfg) + _corrupt(vision_rotary) + _corrupt(text_rotary) + + visual = torch.nn.Module() + visual.rotary_pos_emb = vision_rotary + language_model = torch.nn.Module() + language_model.rotary_emb = text_rotary + + model = torch.nn.Module() + model.visual = visual + model.language_model = language_model + model.config = types.SimpleNamespace(vision_config=vis_cfg) + backbone.model = model + return backbone + + +class TestVisionRotaryInvFreq: + def test_matches_closed_form_oracle_after_repair(self): + cfg = _vision_config() + dim = _vision_head_dim_half(cfg) + rotary = Qwen3VLVisionRotaryEmbedding(dim) + _corrupt(rotary) + + new = recompute_vision_rotary_inv_freq(rotary, dim, torch.device("cpu")) + fired = _assign_inv_freq(rotary, "inv_freq", new, persistent=False) + + assert fired, "corrupt vision inv_freq must be repaired, not silently skipped" + assert rotary.inv_freq.dtype == torch.float32 + assert torch.isfinite(rotary.inv_freq).all() + assert torch.equal(rotary.inv_freq, _oracle_inv_freq(dim, _VISION_THETA)) + + def test_repaired_after_meta_construction(self): + cfg = _vision_config() + dim = _vision_head_dim_half(cfg) + with torch.device("meta"): + rotary = Qwen3VLVisionRotaryEmbedding(dim) + assert rotary.inv_freq.device.type == "meta" + + new = recompute_vision_rotary_inv_freq(rotary, dim, torch.device("cpu")) + + assert new.device.type == "cpu" + assert torch.isfinite(new).all() + assert torch.equal(new, _oracle_inv_freq(dim, _VISION_THETA)) + + def test_repair_is_idempotent(self): + cfg = _vision_config() + dim = _vision_head_dim_half(cfg) + rotary = Qwen3VLVisionRotaryEmbedding(dim) + _corrupt(rotary) + + _assign_inv_freq( + rotary, + "inv_freq", + recompute_vision_rotary_inv_freq(rotary, dim, torch.device("cpu")), + persistent=False, + ) + fired_again = _assign_inv_freq( + rotary, + "inv_freq", + recompute_vision_rotary_inv_freq(rotary, dim, torch.device("cpu")), + persistent=False, + ) + + assert fired_again is False, "second repair on a correct buffer must be a no-op" + + +class TestTextRotaryInvFreq: + def test_matches_closed_form_oracle_after_repair(self): + cfg = _text_config() + rotary = Qwen3VLTextRotaryEmbedding(config=cfg) + _corrupt(rotary) + + inv_freq, scaling = recompute_text_rotary_inv_freq(rotary, cfg, torch.device("cpu")) + fired = _assign_inv_freq(rotary, "inv_freq", inv_freq, persistent=False) + + assert fired, "corrupt text inv_freq must be repaired, not silently skipped" + assert rotary.inv_freq.dtype == torch.float32 + assert torch.isfinite(rotary.inv_freq).all() + assert torch.equal(rotary.inv_freq, _oracle_inv_freq(cfg.head_dim, cfg.rope_theta)) + assert scaling == pytest.approx(1.0) + + def test_repaired_after_meta_construction(self): + cfg = _text_config() + with torch.device("meta"): + rotary = Qwen3VLTextRotaryEmbedding(config=cfg) + assert rotary.inv_freq.device.type == "meta" + + inv_freq, _scaling = recompute_text_rotary_inv_freq(rotary, cfg, torch.device("cpu")) + + assert inv_freq.device.type == "cpu" + assert torch.isfinite(inv_freq).all() + assert torch.equal(inv_freq, _oracle_inv_freq(cfg.head_dim, cfg.rope_theta)) + + +class TestBackboneRotaryReset: + """Exercise the backbone wiring end-to-end without loading a checkpoint.""" + + def _fake_backbone(self): + vis_cfg = _vision_config() + txt_cfg = _text_config() + dim = _vision_head_dim_half(vis_cfg) + backbone = _corrupted_backbone(vis_cfg, txt_cfg) + vision_rotary = backbone.model.visual.rotary_pos_emb + text_rotary = backbone.model.language_model.rotary_emb + return backbone, vision_rotary, text_rotary, vis_cfg, txt_cfg, dim + + def test_reset_repairs_both_paths(self): + backbone, vision_rotary, text_rotary, vis_cfg, txt_cfg, dim = self._fake_backbone() + + backbone._reset_rotary_inv_freq() + + assert torch.equal(vision_rotary.inv_freq, _oracle_inv_freq(dim, _VISION_THETA)) + assert torch.equal( + text_rotary.inv_freq, _oracle_inv_freq(txt_cfg.head_dim, txt_cfg.rope_theta) + ) + # original_inv_freq (used by dynamic-RoPE updates) must track inv_freq. + assert torch.equal(text_rotary.original_inv_freq, text_rotary.inv_freq) + + def test_reset_raises_when_vision_layout_missing(self): + # No visual/language rotary at all: the reset must fail the load, not leave + # the non-persistent inv_freq uninitialized and silently corrupt inference. + backbone = Qwen3Backbone.__new__(Qwen3Backbone) + torch.nn.Module.__init__(backbone) + model = torch.nn.Module() + model.config = types.SimpleNamespace() + backbone.model = model + + with pytest.raises(RuntimeError, match="vision RoPE inv_freq"): + backbone._reset_rotary_inv_freq() + + def test_reset_raises_when_text_layout_missing(self): + # Valid vision rotary but no language model: the vision branch succeeds and + # the text branch must still fail closed. + vis_cfg = _vision_config() + backbone = Qwen3Backbone.__new__(Qwen3Backbone) + torch.nn.Module.__init__(backbone) + visual = torch.nn.Module() + visual.rotary_pos_emb = Qwen3VLVisionRotaryEmbedding(_vision_head_dim_half(vis_cfg)) + model = torch.nn.Module() + model.visual = visual + model.config = types.SimpleNamespace(vision_config=vis_cfg) + backbone.model = model + + with pytest.raises(RuntimeError, match="text RoPE inv_freq"): + backbone._reset_rotary_inv_freq() + + +class TestTextRotaryCosSinOracle: + """Pin the *cos/sin* the attention kernels consume, not just ``inv_freq``. + + The inv_freq tests stop one layer above the value attention actually uses; + the interleaved-mRoPE assembly (``inv_freq`` -> per-section freqs -> channel + interleave -> cos/sin) sits between them and is shared by every backend, so a + backend-vs-backend fingerprint is blind to a common-mode error there. These + drive the reset module's own ``forward`` and compare against an independent + closed-form oracle, across several ``mrope_section`` layouts and with a + distinct position per T/H/W section so the interleave is observable. + """ + + @pytest.mark.parametrize("mrope_section", [[4, 2, 2], [2, 4, 2], [2, 2, 4], [8, 0, 0]]) + def test_cos_sin_matches_closed_form_oracle(self, mrope_section): + head_dim = 16 # half = 8: large enough for section layouts to differ + cfg = _text_config( + rope_scaling={"rope_type": "default", "mrope_section": mrope_section}, + head_dim=head_dim, + ) + backbone = _corrupted_backbone(_vision_config(), cfg) + backbone._reset_rotary_inv_freq() + rotary = backbone.model.language_model.rotary_emb + + seq = 6 + # Distinct positions per section; identical sections would mask interleave. + position_ids = torch.stack( + [torch.arange(seq), torch.arange(seq) + 17, torch.arange(seq) + 41] + )[:, None, :] # (3, bs=1, seq) + cos, sin = rotary.forward(torch.zeros(1, seq, 1), position_ids) + + inv_freq = _oracle_inv_freq(head_dim, cfg.rope_theta) + exp_cos, exp_sin = _oracle_text_cos_sin(inv_freq, position_ids[:, 0, :], mrope_section) + + assert cos.shape == (1, seq, head_dim) + assert torch.allclose(cos[0], exp_cos, atol=1e-6, rtol=0) + assert torch.allclose(sin[0], exp_sin, atol=1e-6, rtol=0) + + +class TestTextRopeTypeBranches: + """The recompute must honor ``rope_scaling.rope_type``, not assume default. + + Each branch is checked against a closed form re-derived from the documented + rope-init math (default: base inv_freq; linear: base / factor; dynamic: base + inv_freq at construction-time seq_len), so a future change that silently + routes every config through the default initializer is caught. + """ + + @pytest.mark.parametrize( + "rope_scaling, freq_divisor", + [ + ({"rope_type": "default", "mrope_section": [2, 1, 1]}, 1.0), + ({"rope_type": "linear", "factor": 4.0, "mrope_section": [2, 1, 1]}, 4.0), + ({"rope_type": "dynamic", "factor": 4.0, "mrope_section": [2, 1, 1]}, 1.0), + ], + ) + def test_recompute_honors_rope_type(self, rope_scaling, freq_divisor): + cfg = _text_config(rope_scaling=rope_scaling) + rotary = Qwen3VLTextRotaryEmbedding(config=cfg) + _corrupt(rotary) + + inv_freq, scaling = recompute_text_rotary_inv_freq(rotary, cfg, torch.device("cpu")) + expected = _oracle_inv_freq(cfg.head_dim, cfg.rope_theta) / freq_divisor + + assert torch.equal(inv_freq, expected) + assert scaling == pytest.approx(1.0) + + +class TestVisionRotaryCosSin: + """Reach the vision cos/sin contract, not just ``inv_freq``.""" + + def test_cos_sin_matches_closed_form_oracle(self): + vis_cfg = _vision_config() + backbone = _corrupted_backbone(vis_cfg, _text_config()) + backbone._reset_rotary_inv_freq() + rotary = backbone.model.visual.rotary_pos_emb + + seqlen = 7 + freqs = rotary.forward(seqlen) + emb = torch.cat([freqs, freqs], dim=-1) + cos, sin = emb.cos(), emb.sin() + + inv_freq = _oracle_inv_freq(_vision_head_dim_half(vis_cfg), _VISION_THETA) + exp_cos, exp_sin = _oracle_vision_cos_sin(inv_freq, seqlen) + + assert torch.allclose(cos, exp_cos, atol=1e-6, rtol=0) + assert torch.allclose(sin, exp_sin, atol=1e-6, rtol=0) diff --git a/tests/gr00t/model/test_variable_image_size.py b/tests/gr00t/model/test_variable_image_size.py new file mode 100644 index 000000000..17c04ee24 --- /dev/null +++ b/tests/gr00t/model/test_variable_image_size.py @@ -0,0 +1,325 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Test N1.7 image transform sizing behavior across torchvision and albumentations paths.""" + +from pathlib import Path + +from gr00t.model.gr00t_n1d7.image_augmentations import ( + apply_with_replay, + build_image_transformations, + build_image_transformations_albumentations, +) +import numpy as np +from PIL import Image +import pytest +import torch + + +FIXTURE_DIR = Path(__file__).parent.parent.parent / "fixtures" / "processor_config" + + +# ---- Transform-level tests ---- + + +class TestTorchvisionTransforms: + """Test that torchvision eval transform produces consistent sizes.""" + + def setup_method(self): + self.image_target_size = [256, 256] + self.image_crop_size = [224, 224] + self.train_transform, self.eval_transform = build_image_transformations( + image_target_size=self.image_target_size, + image_crop_size=self.image_crop_size, + random_rotation_angle=None, + color_jitter_params=None, + ) + + def test_letterbox_transform_is_disabled_by_default(self): + transform_names = [ + type(transform).__name__ + for transform in [*self.train_transform.transforms, *self.eval_transform.transforms] + ] + assert "LetterBoxTransform" not in transform_names + + def test_letterbox_transform_can_be_enabled(self): + train_transform, eval_transform = build_image_transformations( + image_target_size=self.image_target_size, + image_crop_size=self.image_crop_size, + random_rotation_angle=None, + color_jitter_params=None, + letter_box_transform=True, + ) + transform_names = [ + type(transform).__name__ + for transform in [*train_transform.transforms, *eval_transform.transforms] + ] + assert "LetterBoxTransform" in transform_names + + def test_same_size_images(self): + img1 = Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + img2 = Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + out1 = self.eval_transform(img1) + out2 = self.eval_transform(img2) + assert out1.shape == out2.shape, f"Shape mismatch: {out1.shape} vs {out2.shape}" + torch.stack([out1, out2]) # should not raise + + def test_variable_size_images(self): + img_4_3 = Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + img_16_9 = Image.fromarray(np.random.randint(0, 255, (360, 640, 3), dtype=np.uint8)) + out_4_3 = self.eval_transform(img_4_3) + out_16_9 = self.eval_transform(img_16_9) + assert out_4_3.shape == out_16_9.shape, ( + f"Shape mismatch for different aspect ratios: {out_4_3.shape} vs {out_16_9.shape}" + ) + torch.stack([out_4_3, out_16_9]) # should not raise + + def test_square_and_wide_images(self): + img_square = Image.fromarray(np.random.randint(0, 255, (480, 480, 3), dtype=np.uint8)) + img_wide = Image.fromarray(np.random.randint(0, 255, (240, 640, 3), dtype=np.uint8)) + out_sq = self.eval_transform(img_square) + out_wide = self.eval_transform(img_wide) + assert out_sq.shape == out_wide.shape, f"Shape mismatch: {out_sq.shape} vs {out_wide.shape}" + torch.stack([out_sq, out_wide]) # should not raise + + +class TestAlbumentationsTransforms: + """Test that albumentations preserves aspect ratio without letterboxing.""" + + def setup_method(self): + self.train_transform, self.eval_transform = build_image_transformations_albumentations( + image_target_size=None, + image_crop_size=None, + random_rotation_angle=None, + color_jitter_params=None, + shortest_image_edge=256, + crop_fraction=0.95, + ) + + def _apply(self, pil_img): + result = self.eval_transform(image=np.array(pil_img)) + return torch.from_numpy(result["image"]).permute(2, 0, 1) + + def test_letterbox_pad_is_not_in_transform_pipeline(self): + transform_names = [ + type(transform).__name__ + for transform in [*self.train_transform.transforms, *self.eval_transform.transforms] + ] + assert "LetterBoxPad" not in transform_names + + def test_letterbox_pad_can_be_enabled(self): + train_transform, eval_transform = build_image_transformations_albumentations( + image_target_size=None, + image_crop_size=None, + random_rotation_angle=None, + color_jitter_params=None, + shortest_image_edge=256, + crop_fraction=0.95, + letter_box_transform=True, + ) + transform_names = [ + type(transform).__name__ + for transform in [*train_transform.transforms, *eval_transform.transforms] + ] + assert "LetterBoxPad" in transform_names + # LetterBoxPad must run before resizing so padding is computed on the original aspect. + assert type(train_transform.transforms[0]).__name__ == "LetterBoxPad" + assert type(eval_transform.transforms[0]).__name__ == "LetterBoxPad" + + def test_letterbox_pad_makes_mixed_aspect_images_stackable(self): + _, eval_transform = build_image_transformations_albumentations( + image_target_size=None, + image_crop_size=None, + random_rotation_angle=None, + color_jitter_params=None, + shortest_image_edge=256, + crop_fraction=0.95, + letter_box_transform=True, + ) + + def apply(pil_img): + result = eval_transform(image=np.array(pil_img)) + return torch.from_numpy(result["image"]).permute(2, 0, 1) + + img_square = Image.fromarray(np.random.randint(0, 255, (480, 480, 3), dtype=np.uint8)) + img_wide = Image.fromarray(np.random.randint(0, 255, (240, 640, 3), dtype=np.uint8)) + out_sq = apply(img_square) + out_wide = apply(img_wide) + assert out_sq.shape == out_wide.shape, f"Shape mismatch: {out_sq.shape} vs {out_wide.shape}" + torch.stack([out_sq, out_wide]) # should not raise + + def test_letterbox_pad_train_replay_handles_mixed_aspect_views(self): + # ReplayCompose replays the first view's params onto later views; padding must still be + # computed per-view so mixed-aspect views remain stackable on the train path. + train_transform, _ = build_image_transformations_albumentations( + image_target_size=None, + image_crop_size=None, + random_rotation_angle=None, + color_jitter_params=None, + shortest_image_edge=256, + crop_fraction=0.95, + letter_box_transform=True, + ) + img_square = Image.fromarray(np.random.randint(0, 255, (480, 480, 3), dtype=np.uint8)) + img_wide = Image.fromarray(np.random.randint(0, 255, (240, 640, 3), dtype=np.uint8)) + transformed, _ = apply_with_replay(train_transform, [img_square, img_wide]) + torch.stack(transformed) # should not raise + + def test_uses_gear_groot_aspect_preserving_pipeline(self): + train_names = [type(transform).__name__ for transform in self.train_transform.transforms] + eval_names = [type(transform).__name__ for transform in self.eval_transform.transforms] + assert train_names[:3] == [ + "SmallestMaxSize", + "FractionalRandomCrop", + "SmallestMaxSize", + ] + assert eval_names == [ + "SmallestMaxSize", + "FractionalCenterCrop", + "SmallestMaxSize", + ] + + def test_train_replay_with_same_aspect_variable_size_images(self): + img_4_3 = Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + img_4_3_small = Image.fromarray(np.random.randint(0, 255, (240, 320, 3), dtype=np.uint8)) + transformed, _ = apply_with_replay(self.train_transform, [img_4_3, img_4_3_small]) + torch.stack(transformed) + + def test_same_size_images(self): + img1 = Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + img2 = Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + out1 = self._apply(img1) + out2 = self._apply(img2) + assert out1.shape == out2.shape, f"Shape mismatch: {out1.shape} vs {out2.shape}" + torch.stack([out1, out2]) + + def test_same_aspect_variable_size_images(self): + img_4_3 = Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + img_4_3_small = Image.fromarray(np.random.randint(0, 255, (240, 320, 3), dtype=np.uint8)) + out_4_3 = self._apply(img_4_3) + out_4_3_small = self._apply(img_4_3_small) + assert out_4_3.shape == out_4_3_small.shape, ( + f"Shape mismatch for same aspect ratios: {out_4_3.shape} vs {out_4_3_small.shape}" + ) + torch.stack([out_4_3, out_4_3_small]) + + def test_mixed_aspect_images_preserve_different_shapes(self): + img_square = Image.fromarray(np.random.randint(0, 255, (480, 480, 3), dtype=np.uint8)) + img_wide = Image.fromarray(np.random.randint(0, 255, (240, 640, 3), dtype=np.uint8)) + out_sq = self._apply(img_square) + out_wide = self._apply(img_wide) + assert out_sq.shape != out_wide.shape + + +# ---- Processor-level tests (using fixture config, no checkpoint needed) ---- + + +@pytest.fixture +def processor(): + from unittest.mock import MagicMock, patch + + from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import Gr00tN1d7Processor + + mock_vlm = MagicMock() + mock_vlm.apply_chat_template.return_value = "mock text" + mock_vlm.tokenizer.padding_side = "left" + + with patch( + "gr00t.model.gr00t_n1d7.processing_gr00t_n1d7.build_processor", + return_value=mock_vlm, + ): + proc = Gr00tN1d7Processor.from_pretrained(FIXTURE_DIR) + proc.eval() + return proc + + +class TestProcessorVariableImageSize: + """Test full _get_vlm_inputs path with variable image sizes.""" + + def test_variable_size_vlm_inputs(self, processor): + """Test _get_vlm_inputs with same-aspect variable-size images across views.""" + embodiment_tag = "libero_sim" + image_keys = processor.modality_configs[embodiment_tag]["video"].modality_keys + + # Albumentations preserves aspect ratio, so views in one sample must share aspect ratio + # before the processor stacks them. + mock_images = {} + for i, key in enumerate(image_keys): + if i % 2 == 0: + mock_images[key] = [ + Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + ] + else: + mock_images[key] = [ + Image.fromarray(np.random.randint(0, 255, (240, 320, 3), dtype=np.uint8)) + ] + + vlm_inputs = processor._get_vlm_inputs( + image_keys=image_keys, + images=mock_images, + image_transform=processor.eval_image_transform, + language="pick up the object", + masks=None, + ) + + assert "vlm_content" in vlm_inputs + assert len(vlm_inputs["vlm_content"]["images"]) == len(image_keys) + + def test_mixed_aspect_vlm_inputs_raise(self, processor): + """Albumentations preserves aspect ratio, so mixed-aspect views are not stackable.""" + embodiment_tag = "libero_sim" + image_keys = processor.modality_configs[embodiment_tag]["video"].modality_keys + + mock_images = {} + for i, key in enumerate(image_keys): + if i % 2 == 0: + mock_images[key] = [ + Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + ] + else: + mock_images[key] = [ + Image.fromarray(np.random.randint(0, 255, (360, 640, 3), dtype=np.uint8)) + ] + + with pytest.raises(RuntimeError, match="stack expects each tensor to be equal size"): + processor._get_vlm_inputs( + image_keys=image_keys, + images=mock_images, + image_transform=processor.eval_image_transform, + language="pick up the object", + masks=None, + ) + + def test_same_size_vlm_inputs(self, processor): + """Test _get_vlm_inputs with same size images (regression test).""" + embodiment_tag = "libero_sim" + image_keys = processor.modality_configs[embodiment_tag]["video"].modality_keys + + mock_images = {} + for key in image_keys: + mock_images[key] = [ + Image.fromarray(np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)) + ] + + vlm_inputs = processor._get_vlm_inputs( + image_keys=image_keys, + images=mock_images, + image_transform=processor.eval_image_transform, + language="pick up the object", + masks=None, + ) + + assert "vlm_content" in vlm_inputs + assert len(vlm_inputs["vlm_content"]["images"]) == len(image_keys) diff --git a/tests/gr00t/model/test_vlm_image_input_parity.py b/tests/gr00t/model/test_vlm_image_input_parity.py new file mode 100644 index 000000000..7ac011d6d --- /dev/null +++ b/tests/gr00t/model/test_vlm_image_input_parity.py @@ -0,0 +1,115 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Bitwise parity of the inference image path after removing the PIL round-trip. + +``_apply_vlm_processing`` used to convert every CHW frame to PIL before handing +it to the Qwen3VL processor; it now passes CHW uint8 tensors directly. These +tests assert the final model inputs are bitwise identical to a verbatim +reimplementation of the old PIL path, on the real checkpoint processor. +""" + +import numpy as np +from PIL import Image +import pytest +import torch + + +pytestmark = pytest.mark.serial + +INSTRUCTION = "pick up the black bowl and place it on the plate" + + +@pytest.fixture(scope="module") +def vlm_processor(load_hf_model_weights): + """Real Qwen3VL processor; skips when the gated repo is unreachable. + + Only processor configs/tokenizer files are fetched (no model weights). + Uses the ``load_hf_model_weights`` opt-in: the suite-wide + ``GROOT_SKIP_HF_MODEL_WEIGHTS=1`` harness would otherwise stub the load and + make the parity assertions vacuous. + """ + from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import build_processor + + try: + with load_hf_model_weights(): + return build_processor("nvidia/Cosmos-Reason2-2B", {"trust_remote_code": True}) + except Exception as exc: # pragma: no cover - environment dependent + pytest.skip(f"Cosmos-Reason2-2B processor unavailable (gated/offline?): {exc}") + + +def _reference_pil_outputs(processor, frames_chw: np.ndarray, language: str): + """Verbatim reimplementation of the pre-change path: CHW -> PIL -> processor.""" + pil_images = [Image.fromarray(np.transpose(v, (1, 2, 0))) for v in frames_chw] + conversation = [ + { + "role": "user", + "content": [ + *[{"type": "image", "image": img} for img in pil_images], + {"type": "text", "text": language}, + ], + } + ] + text = processor.apply_chat_template(conversation, tokenize=False, add_generation_prompt=True) + return processor(text=[text], images=pil_images, return_tensors="pt", padding=True) + + +def _direct_outputs(processor, frames_chw: np.ndarray, language: str): + """The new path: CHW uint8 tensors handed to the processor directly.""" + frames = [torch.as_tensor(v) for v in frames_chw] + conversation = [ + { + "role": "user", + "content": [ + *[{"type": "image", "image": img} for img in frames], + {"type": "text", "text": language}, + ], + } + ] + text = processor.apply_chat_template(conversation, tokenize=False, add_generation_prompt=True) + return processor(text=[text], images=frames, return_tensors="pt", padding=True) + + +@pytest.mark.parametrize( + "height,width", + [ + (256, 256), # matches patch grid: smart-resize is a no-op + (240, 320), # non-square: real smart-resize happens + (243, 243), # not a patch multiple: smart-resize rounds + ], +) +@pytest.mark.parametrize("num_frames", [2, 6]) # 1 and 3 cameras x 2 temporal frames +def test_direct_tensor_input_is_bitwise_identical_to_pil(vlm_processor, height, width, num_frames): + rng = np.random.default_rng(1234) + frames = rng.integers(0, 256, size=(num_frames, 3, height, width), dtype=np.uint8) + + reference = _reference_pil_outputs(vlm_processor, frames, INSTRUCTION) + direct = _direct_outputs(vlm_processor, frames, INSTRUCTION) + + assert set(reference.keys()) == set(direct.keys()) + for key in reference.keys(): + assert torch.equal(reference[key], direct[key]), f"mismatch in {key}" + + +def test_processor_output_through_gr00t_pipeline_shape(vlm_processor): + """The tensors handed over by _apply_vlm_processing (post-change) are CHW + uint8 — the exact type proven bitwise-equal above.""" + from gr00t.model.gr00t_n1d7.processing_gr00t_n1d7 import Gr00tN1d7Processor # noqa: F401 + + rng = np.random.default_rng(0) + frames = torch.as_tensor(rng.integers(0, 256, size=(2, 3, 256, 256), dtype=np.uint8)) + out = _direct_outputs(vlm_processor, frames.numpy(), INSTRUCTION) + assert out["pixel_values"].dtype == torch.float32 + assert out["image_grid_thw"].shape[0] == 2 diff --git a/tests/gr00t/policy/conftest.py b/tests/gr00t/policy/conftest.py new file mode 100644 index 000000000..7d2494e79 --- /dev/null +++ b/tests/gr00t/policy/conftest.py @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Local pytest hooks for GPU policy tests.""" + +from __future__ import annotations + +import pytest + + +_TEST_FILE = "test_gr00t_policy_gpu.py" +_WARMUP_NODEID_SUFFIX = f"{_TEST_FILE}::test_warmup_model_load" +_INFERENCE_NODEID_FRAGMENT = f"{_TEST_FILE}::TestGr00tPolicyGPU::" + + +@pytest.hookimpl(trylast=True) +def pytest_collection_modifyitems(config, items): # noqa: ARG001 + """Run ``test_warmup_model_load`` before any inference test that shares its fixture. + + The module-scoped ``policy`` fixture is initialized on first request, so a + cold checkpoint read falls under whatever test triggers the fixture first. + Hoisting the warmup test guarantees the load happens under its 900s budget + even when collection order is changed by plugins like ``pytest-randomly``. + """ + warmup_idx = next( + (i for i, it in enumerate(items) if it.nodeid.endswith(_WARMUP_NODEID_SUFFIX)), + None, + ) + if warmup_idx is None: + return + + first_inference_idx = next( + (i for i, it in enumerate(items) if _INFERENCE_NODEID_FRAGMENT in it.nodeid), + None, + ) + if first_inference_idx is not None and warmup_idx > first_inference_idx: + items.insert(first_inference_idx, items.pop(warmup_idx)) diff --git a/tests/gr00t/policy/test_gr00t_policy.py b/tests/gr00t/policy/test_gr00t_policy.py new file mode 100644 index 000000000..54de946f8 --- /dev/null +++ b/tests/gr00t/policy/test_gr00t_policy.py @@ -0,0 +1,215 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test Gr00tPolicy: observation validation and inference pipeline. + +Uses mocked model and processor to avoid downloading checkpoints. +""" + +from pathlib import Path +from unittest.mock import MagicMock, patch + +from gr00t.data.types import ModalityConfig +import numpy as np +import pytest +import torch +from transformers.feature_extraction_utils import BatchFeature + + +FIXTURE_DIR = Path(__file__).parent.parent.parent / "fixtures" / "processor_config" +EMBODIMENT = "libero_sim" + +VIDEO_KEYS = ["observation.images.rgb.head_256_256", "observation.images.rgb.left_wrist_256_256"] +STATE_KEYS = ["x", "y", "z", "roll", "pitch", "yaw", "gripper"] +ACTION_KEYS = ["x", "y", "z", "roll", "pitch", "yaw", "gripper"] +LANGUAGE_KEY = "annotation.human.action.task_description" + + +def _build_modality_configs(): + return { + EMBODIMENT: { + "video": ModalityConfig(delta_indices=[0], modality_keys=VIDEO_KEYS), + "state": ModalityConfig(delta_indices=[0], modality_keys=STATE_KEYS), + "action": ModalityConfig(delta_indices=list(range(16)), modality_keys=ACTION_KEYS), + "language": ModalityConfig(delta_indices=[0], modality_keys=[LANGUAGE_KEY]), + } + } + + +@pytest.fixture +def policy(): + mock_model = MagicMock() + mock_model.eval = MagicMock() + mock_model.to = MagicMock(return_value=mock_model) + mock_model.device = torch.device("cpu") + mock_model.dtype = torch.bfloat16 + + mock_model.get_action = MagicMock( + return_value=BatchFeature(data={"action_pred": torch.randn(1, 16, 7)}) + ) + + mock_processor = MagicMock() + mock_processor.modality_configs = _build_modality_configs() + mock_processor.get_modality_configs.return_value = _build_modality_configs() + mock_processor.state_action_processor = MagicMock() + mock_processor.action_dim = {EMBODIMENT: 7} + mock_processor.max_action_dim = 128 + mock_processor.max_action_horizon = 50 + mock_processor.eval = MagicMock() + mock_processor.training = False + mock_processor.collator = MagicMock() + + def fake_process_observation(observation, embodiment_tag): + return BatchFeature( + data={ + "state": torch.randn(1, 1, 128), + "action_mask": torch.ones(1, 16, 128), + "embodiment_id": torch.zeros(1, dtype=torch.long), + "input_ids": torch.ones(1, 10, dtype=torch.long), + "attention_mask": torch.ones(1, 10, dtype=torch.long), + "pixel_values": torch.randn(1, 3, 256, 256), + "image_grid_thw": torch.tensor([[1, 16, 16]]), + } + ) + + mock_processor.process_observation = MagicMock(side_effect=fake_process_observation) + + def fake_decode_action(action, embodiment_tag, state=None): + return {k: np.zeros((1, 16, 1), dtype=np.float32) for k in ACTION_KEYS} + + mock_processor.decode_action = MagicMock(side_effect=fake_decode_action) + + # Patch both AutoModel and AutoProcessor, and also the processor_config.json check + with ( + patch("gr00t.policy.gr00t_policy.AutoModel") as MockAutoModel, + patch("gr00t.policy.gr00t_policy.AutoProcessor") as MockAutoProcessor, + patch("pathlib.Path.is_dir", return_value=False), + patch("pathlib.Path.exists", return_value=True), + ): + MockAutoModel.from_pretrained.return_value = mock_model + MockAutoProcessor.from_pretrained.return_value = mock_processor + + from gr00t.policy.gr00t_policy import Gr00tPolicy + + p = Gr00tPolicy( + embodiment_tag=EMBODIMENT, + model_path="/fake/path", + device="cpu", + ) + return p + + +def _make_observation(batch_size=1): + return { + "video": { + k: np.random.randint(0, 255, (batch_size, 1, 256, 256, 3), dtype=np.uint8) + for k in VIDEO_KEYS + }, + "state": { + k: np.random.randn(batch_size, 1, 1).astype(np.float32) + for k in STATE_KEYS[:-1] # all except gripper + } + | {"gripper": np.random.randn(batch_size, 1, 2).astype(np.float32)}, + "language": { + LANGUAGE_KEY: [["pick up the apple"]] * batch_size, + }, + } + + +class TestGr00tPolicyInit: + def test_policy_has_model_and_processor(self, policy): + assert policy.model is not None + assert policy.processor is not None + + def test_policy_embodiment_tag(self, policy): + assert policy.embodiment_tag is not None + + +class TestGr00tPolicyCheckObservation: + def test_valid_observation_passes(self, policy): + obs = _make_observation() + policy.check_observation(obs) + + def test_missing_video_key_raises(self, policy): + obs = _make_observation() + del obs["video"][VIDEO_KEYS[0]] + with pytest.raises(AssertionError): + policy.check_observation(obs) + + def test_wrong_video_dtype_raises(self, policy): + obs = _make_observation() + obs["video"][VIDEO_KEYS[0]] = obs["video"][VIDEO_KEYS[0]].astype(np.float32) + with pytest.raises(AssertionError): + policy.check_observation(obs) + + +class TestGr00tPolicyGetAction: + def test_get_action_returns_tuple(self, policy): + obs = _make_observation() + result = policy.get_action(obs) + assert isinstance(result, tuple) + assert len(result) == 2 + + def test_get_action_returns_dict(self, policy): + obs = _make_observation() + action, info = policy.get_action(obs) + assert isinstance(action, dict) + assert isinstance(info, dict) + + +class _NumpyLanguageSimPolicy: + def __init__(self): + self.modality_configs = { + "video": ModalityConfig(delta_indices=[0], modality_keys=["camera"]), + "state": ModalityConfig( + delta_indices=[0], + modality_keys=["state"], + ), + "action": ModalityConfig(delta_indices=[0], modality_keys=["action"]), + "language": ModalityConfig( + delta_indices=[0], + modality_keys=["annotation.human.action.task_description"], + ), + } + self.last_observation = None + + def get_modality_config(self): + return self.modality_configs + + def get_action(self, observation, options=None): + self.last_observation = observation + return {"action": np.zeros((1, 1, 2), dtype=np.float32)}, {} + + def reset(self, options=None): + return {} + + +def test_sim_policy_wrapper_accepts_numpy_language_batches(): + from gr00t.policy.gr00t_policy import Gr00tSimPolicyWrapper + + policy = _NumpyLanguageSimPolicy() + wrapper = Gr00tSimPolicyWrapper(policy) + observation = { + "video.camera": np.zeros((1, 1, 256, 256, 3), dtype=np.uint8), + "state.state": np.zeros((1, 1, 3), dtype=np.float32), + "annotation.human.action.task_description": np.array(["follow the instruction"]), + } + + action, info = wrapper.get_action(observation) + + assert policy.last_observation["language"][LANGUAGE_KEY] == [["follow the instruction"]] + assert "action.action" in action + assert info == {} diff --git a/tests/gr00t/policy/test_gr00t_policy_gpu.py b/tests/gr00t/policy/test_gr00t_policy_gpu.py new file mode 100644 index 000000000..6f0660db0 --- /dev/null +++ b/tests/gr00t/policy/test_gr00t_policy_gpu.py @@ -0,0 +1,180 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +GPU integration test for Gr00tPolicy._get_action() with the real model architecture. + +This top-down test exercises the full inference pipeline: + Gr00tPolicy._get_action() + → processor.__call__() (VLM tokenization + state/action normalization) + → model.get_action() (backbone forward + DiT diffusion denoising) + → processor.decode_action() (denormalization + action decoding) + +Covers modules with 0% or low coverage that cannot be tested on CPU: + - gr00t_n1d7.py (model forward) + - qwen3_backbone.py (VLM backbone) + - dit.py / alternate_vl_dit.py (transformer) + - embodiment_conditioned_mlp.py (action head) + +Requires GPU and HF_TOKEN (for gated metadata download), but not model weights. +``tests/conftest.py`` sets ``GROOT_SKIP_HF_MODEL_WEIGHTS=1`` so +``from_pretrained`` constructs the architecture from config without reading +multi-GB safetensor shards. + +``test_warmup_model_load`` owns the model-load cost under a wide timeout so +a slow checkpoint read does not consume the per-test budget of every +inference test in the class. +""" + +import time + +import numpy as np +import pytest +import torch + + +EMBODIMENT_TAG = "OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT" +MODEL_REPO_ID = "nvidia/GR00T-N1.7-3B" + + +def _build_observation(policy, batch_size=1, seed=42): + """Build a synthetic observation that matches the policy's modality config. + + Uses a fixed seed so that failures are reproducible. + """ + rng = np.random.RandomState(seed) + mc = policy.modality_configs + + video_horizon = len(mc["video"].delta_indices) + state_horizon = len(mc["state"].delta_indices) + + obs = {"video": {}, "state": {}, "language": {}} + + for k in mc["video"].modality_keys: + obs["video"][k] = rng.randint( + 0, 255, (batch_size, video_horizon, 256, 256, 3), dtype=np.uint8 + ) + + embodiment_val = policy.embodiment_tag.value + norm_params = policy.processor.state_action_processor.norm_params[embodiment_val]["state"] + for k in mc["state"].modality_keys: + dim = int(norm_params[k]["dim"]) + obs["state"][k] = rng.randn(batch_size, state_horizon, dim).astype(np.float32) + + language_key = mc["language"].modality_keys[0] + obs["language"][language_key] = [["pick up the red cube"]] * batch_size + + return obs + + +@pytest.fixture(scope="module") +def policy(request): + """Shared Gr00tPolicy on ``cuda:0`` reused across all tests in this module.""" + if not request.node.nodeid.endswith("::test_warmup_model_load"): + print( + f"[gpu_policy] WARNING: model load triggered by {request.node.nodeid!r}, " + "not test_warmup_model_load. Include test_warmup_model_load in the " + "selection when debugging model construction failures.", + flush=True, + ) + + from gr00t.policy.gr00t_policy import Gr00tPolicy + + t0 = time.perf_counter() + p = Gr00tPolicy( + embodiment_tag=EMBODIMENT_TAG, + model_path=MODEL_REPO_ID, + device="cuda:0", + ) + # This CI test skips trained weights, so the model can emit dummy rot6d + # action components that are finite but not valid rotations. Keep the + # architecture path covered without converting relative EEF actions back + # into absolute poses. + p.processor.state_action_processor.use_relative_action = False + print(f"[gpu_policy] Gr00tPolicy load took {time.perf_counter() - t0:.1f}s", flush=True) + return p + + +@pytest.mark.gpu +@pytest.mark.timeout(900) +def test_warmup_model_load(policy): + """Load the policy under a wide timeout and assert it is on GPU.""" + assert policy.model is not None + assert policy.processor is not None + device = next(policy.model.parameters()).device + assert device.type == "cuda" + + +@pytest.mark.gpu +@pytest.mark.timeout(120) +class TestGr00tPolicyGPU: + """End-to-end GPU inference through Gr00tPolicy.""" + + def test_get_action_keys_match_config(self, policy): + obs = _build_observation(policy, batch_size=1) + action, _ = policy.get_action(obs) + expected_keys = set(policy.modality_configs["action"].modality_keys) + assert set(action.keys()) == expected_keys + + def test_get_action_shapes(self, policy): + obs = _build_observation(policy, batch_size=1) + action, _ = policy.get_action(obs) + action_horizon = len(policy.modality_configs["action"].delta_indices) + for key, arr in action.items(): + assert arr.dtype == np.float32, f"{key} dtype mismatch" + assert arr.ndim == 3, f"{key} should be (B, T, D), got ndim={arr.ndim}" + assert arr.shape[0] == 1, f"{key} batch size mismatch" + assert arr.shape[1] == action_horizon, f"{key} horizon mismatch" + + def test_get_action_values_finite_and_bounded(self, policy): + """Action values should be finite and within a reasonable magnitude.""" + obs = _build_observation(policy, batch_size=1) + action, _ = policy.get_action(obs) + for key, arr in action.items(): + assert np.all(np.isfinite(arr)), f"{key} contains NaN or Inf" + assert np.all(np.abs(arr) < 1e4), ( + f"{key} has values with |v| >= 1e4: max_abs={np.max(np.abs(arr)):.2f}. " + "This suggests the model output or denormalization is broken." + ) + + def test_get_action_batch(self, policy): + obs = _build_observation(policy, batch_size=2) + action, _ = policy.get_action(obs) + for key, arr in action.items(): + assert arr.shape[0] == 2, f"{key}: expected batch=2, got {arr.shape[0]}" + + def test_get_action_deterministic(self, policy): + """Same input + same torch seed must produce the same output.""" + obs1 = _build_observation(policy, batch_size=1, seed=99) + obs2 = _build_observation(policy, batch_size=1, seed=99) + torch.manual_seed(0) + action1, _ = policy.get_action(obs1) + torch.manual_seed(0) + action2, _ = policy.get_action(obs2) + for key in action1: + np.testing.assert_array_equal( + action1[key], + action2[key], + err_msg=f"{key}: same input + same seed produced different outputs — " + "model may have uncontrolled stochasticity beyond the diffusion noise", + ) + + def test_get_action_accepts_different_inputs(self, policy): + """Different synthetic observations should both complete without numeric failures.""" + for seed in (0, 12345): + obs = _build_observation(policy, batch_size=1, seed=seed) + action, _ = policy.get_action(obs) + for key, arr in action.items(): + assert np.all(np.isfinite(arr)), f"{key} contains NaN or Inf" diff --git a/tests/gr00t/policy/test_policy_service.py b/tests/gr00t/policy/test_policy_service.py new file mode 100644 index 000000000..a176808d1 --- /dev/null +++ b/tests/gr00t/policy/test_policy_service.py @@ -0,0 +1,425 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Test PolicyServer and PolicyClient ZMQ communication. + +Uses a mock policy to avoid loading real model weights. The server is +started in a background thread and the client connects on localhost. +""" + +import threading +import time + +from gr00t.data.types import ModalityConfig +from gr00t.policy.server_client import MsgSerializer, PolicyClient, PolicyServer +import msgpack +import numpy as np +import pytest +import zmq + + +class MockPolicy: + """Minimal mock that satisfies BasePolicy interface without ABC enforcement.""" + + def __init__(self): + self.strict = False + self._reset_count = 0 + + def get_action(self, observation, options=None): + # Echo back a dummy action dict derived from observation keys + action = {"joint_pos": np.zeros(7, dtype=np.float32)} + info = {"mock": True} + return action, info + + def reset(self, options=None): + self._reset_count += 1 + return {"reset_count": self._reset_count} + + def get_modality_config(self): + return { + "state": ModalityConfig( + delta_indices=[0], + modality_keys=["joint_pos"], + ) + } + + def check_observation(self, observation): + pass + + def check_action(self, action): + pass + + +def _find_free_port(): + import socket + + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("127.0.0.1", 0)) + return s.getsockname()[1] + + +@pytest.fixture +def server_client(): + """Start a PolicyServer on a random port and yield a connected client. + + Cleanup is delegated to ``PolicyServer.close()`` / ``PolicyClient.close()`` + via context managers, which release the bound port and zmq fds even when + the test body raises. + """ + port = _find_free_port() + policy = MockPolicy() + with PolicyServer(policy, host="127.0.0.1", port=port) as server: + thread = threading.Thread(target=server.run, daemon=True) + thread.start() + time.sleep(0.3) # give ZMQ socket time to bind + + with PolicyClient(host="127.0.0.1", port=port, timeout_ms=5000) as client: + try: + yield client, server, policy + finally: + try: + client.kill_server() + except Exception: + server.running = False + thread.join(timeout=2) + + +@pytest.mark.timeout(30) +class TestPolicyServerClient: + """Test ZMQ roundtrip communication.""" + + def test_ping(self, server_client): + client, _, _ = server_client + assert client.ping() is True + + def test_get_action_roundtrip(self, server_client): + client, _, _ = server_client + obs = {"state": {"joint_pos": np.zeros(7, dtype=np.float32)}} + result = client.call_endpoint("get_action", {"observation": obs}) + action, info = result + assert "joint_pos" in action + np.testing.assert_array_equal(action["joint_pos"], np.zeros(7, dtype=np.float32)) + + def test_reset(self, server_client): + client, _, policy = server_client + result = client.call_endpoint("reset", {"options": None}) + assert result["reset_count"] == 1 + result = client.call_endpoint("reset", {"options": None}) + assert result["reset_count"] == 2 + + def test_get_modality_config(self, server_client): + client, _, _ = server_client + config = client.get_modality_config() + assert "state" in config + assert isinstance(config["state"], ModalityConfig) + assert config["state"].modality_keys == ["joint_pos"] + + def test_kill_server(self): + """Test that kill_server stops the server loop.""" + port = _find_free_port() + policy = MockPolicy() + with PolicyServer(policy, host="127.0.0.1", port=port) as server: + thread = threading.Thread(target=server.run, daemon=True) + thread.start() + time.sleep(0.3) + + with PolicyClient(host="127.0.0.1", port=port, timeout_ms=5000) as client: + assert client.ping() + client.kill_server() + thread.join(timeout=3) + assert not thread.is_alive(), "Server thread should have stopped" + + def test_unknown_endpoint_returns_error(self, server_client): + client, _, _ = server_client + with pytest.raises(RuntimeError, match="Unknown endpoint"): + client.call_endpoint("nonexistent_endpoint", requires_input=False) + + +@pytest.mark.timeout(30) +class TestPolicyServerAuth: + """Test API token authentication.""" + + def test_valid_token(self): + port = _find_free_port() + token = "test-secret-123" + with PolicyServer(MockPolicy(), host="127.0.0.1", port=port, api_token=token) as server: + thread = threading.Thread(target=server.run, daemon=True) + thread.start() + time.sleep(0.3) + + with PolicyClient( + host="127.0.0.1", port=port, timeout_ms=5000, api_token=token + ) as client: + assert client.ping() + client.kill_server() + thread.join(timeout=3) + + def test_invalid_token(self): + port = _find_free_port() + with PolicyServer(MockPolicy(), host="127.0.0.1", port=port, api_token="correct") as server: + thread = threading.Thread(target=server.run, daemon=True) + thread.start() + time.sleep(0.3) + + with PolicyClient( + host="127.0.0.1", port=port, timeout_ms=5000, api_token="wrong" + ) as client: + with pytest.raises(RuntimeError, match="Unauthorized"): + client.call_endpoint("ping", requires_input=False) + + with PolicyClient( + host="127.0.0.1", port=port, timeout_ms=5000, api_token="correct" + ) as valid_client: + valid_client.kill_server() + thread.join(timeout=3) + + +class TestMsgSerializer: + """Test msgpack serialization helpers.""" + + def test_roundtrip_dict(self): + data = {"key": "value", "number": 42} + assert MsgSerializer.from_bytes(MsgSerializer.to_bytes(data)) == data + + def test_roundtrip_numpy(self): + arr = np.array([1.0, 2.0, 3.0], dtype=np.float32) + result = MsgSerializer.from_bytes(MsgSerializer.to_bytes(arr)) + np.testing.assert_array_equal(result, arr) + + def test_encode_numpy_payload_is_legacy_msgpack_numpy_compatible(self): + import msgpack_numpy as mnp + + arr = np.array([1.0, 2.0, 3.0], dtype=np.float32) + result = mnp.unpackb(MsgSerializer.to_bytes(arr), raw=False) + np.testing.assert_array_equal(result, arr) + + def test_decode_npy_numpy_payload(self): + import io + + arr = np.array([1.0, 2.0, 3.0], dtype=np.float32) + payload = io.BytesIO() + np.save(payload, arr, allow_pickle=False) + + result = MsgSerializer.from_bytes( + msgpack.packb({"__ndarray_class__": True, "as_npy": payload.getvalue()}) + ) + + np.testing.assert_array_equal(result, arr) + + def test_roundtrip_modality_config(self): + config = ModalityConfig(delta_indices=[0, 1], modality_keys=["x", "y"]) + result = MsgSerializer.from_bytes(MsgSerializer.to_bytes(config)) + assert isinstance(result, ModalityConfig) + assert result.modality_keys == ["x", "y"] + + def test_encode_modality_config_uses_legacy_marker(self): + config = ModalityConfig(delta_indices=[0, 1], modality_keys=["x", "y"]) + payload = msgpack.unpackb(MsgSerializer.to_bytes(config), raw=False) + assert payload["__ModalityConfig__"] is True + assert "__ModalityConfig_class__" not in payload + assert payload["as_json"]["modality_keys"] == ["x", "y"] + + def test_decode_modality_config_class_marker(self): + config = ModalityConfig(delta_indices=[0, 1], modality_keys=["x", "y"]) + payload = { + "__ModalityConfig_class__": True, + "as_json": '{"delta_indices": [0, 1], "modality_keys": ["x", "y"]}', + } + result = MsgSerializer.from_bytes(msgpack.packb(payload)) + assert isinstance(result, ModalityConfig) + assert result.modality_keys == config.modality_keys + + def test_encode_rejects_object_dtype_ndarray(self): + # Object-dtype ndarrays would be pickled by msgpack_numpy. The + # pre-MR-307 implementation used np.save(..., allow_pickle=False) + # which raised. Restore that safety contract on encode. + arr = np.array([{"any": "object"}, [1, 2, 3]], dtype=object) + with pytest.raises(TypeError, match="object-dtype"): + MsgSerializer.to_bytes(arr) + + def test_decode_rejects_object_dtype_ndarray_bin_keys(self): + # Forge a wire payload that claims object-dtype with msgpack-bin + # (bytes) keys — the shape msgpack_numpy itself emits. We must + # reject it before mnp.decode would call pickle.loads. + import msgpack_numpy as mnp + + forged = mnp.packb( + {b"nd": True, b"kind": b"O", b"type": "|O", b"shape": (1,), b"data": b""} + ) + with pytest.raises(ValueError, match="object-dtype"): + MsgSerializer.from_bytes(forged) + + def test_decode_rejects_object_dtype_ndarray_str_keys(self): + # Defense-in-depth: enforce the allow_pickle=False contract even + # for str-keyed forged payloads. msgpack_numpy 0.4.8 happens not + # to pickle-decode this shape (it only matches bytes keys), but + # MsgSerializer must not depend on mnp's internal key conventions. + import msgpack_numpy as mnp + + forged = mnp.packb({"nd": True, "kind": "O", "type": "|O", "shape": (1,), "data": b""}) + with pytest.raises(ValueError, match="object-dtype"): + MsgSerializer.from_bytes(forged) + + def test_decode_rejects_object_dtype_ndarray_int_nd(self): + # Defense-in-depth: a forged payload that uses msgpack int 1 in + # place of bool True for ``nd`` (different msgpack type codes, + # both Python-truthy) must still be rejected. mnp 0.4.8's own + # check is ``is True`` so this variant doesn't currently reach + # pickle.loads inside mnp.decode either, but the MsgSerializer + # contract is "any payload claiming nd + kind=O is refused" + # regardless of mnp's identity-check semantics. + import msgpack_numpy as mnp + + forged = mnp.packb({b"nd": 1, b"kind": b"O", b"type": "|O", b"shape": (1,), b"data": b""}) + with pytest.raises(ValueError, match="object-dtype"): + MsgSerializer.from_bytes(forged) + + def test_decode_raises_on_marker_without_payload(self): + # A truncated / malformed message that carries the marker but no + # 'as_json' field used to fall through to a plain dict — silent + # corruption. Now it must raise. + import msgpack_numpy as mnp + + malformed = mnp.packb({"__ModalityConfig__": True}) + with pytest.raises(ValueError, match="Malformed ModalityConfig payload"): + MsgSerializer.from_bytes(malformed) + + +def _can_bind(host: str, port: int) -> bool: + """Return True iff a fresh ZMQ REP socket can bind to ``tcp://host:port``. + + Used to assert that ``PolicyServer.close()`` actually released the OS port + rather than just clearing internal state. + """ + ctx = zmq.Context() + try: + sock = ctx.socket(zmq.REP) + try: + sock.bind(f"tcp://{host}:{port}") + except zmq.error.ZMQError: + return False + finally: + sock.close(linger=0) + finally: + ctx.term() + return True + + +class TestPolicyServerLifecycle: + """Pin that ``PolicyServer.close()`` / ``__exit__`` actually release the OS port.""" + + def test_close_releases_bound_port(self): + port = _find_free_port() + server = PolicyServer(MockPolicy(), host="127.0.0.1", port=port) + try: + assert not _can_bind("127.0.0.1", port), "port must be held while server is alive" + finally: + server.close() + assert _can_bind("127.0.0.1", port), "port must be reusable after close()" + + def test_close_is_idempotent(self): + port = _find_free_port() + server = PolicyServer(MockPolicy(), host="127.0.0.1", port=port) + server.close() + server.close() + server.close() + assert _can_bind("127.0.0.1", port) + + def test_context_manager_releases_port_on_exit(self): + port = _find_free_port() + with PolicyServer(MockPolicy(), host="127.0.0.1", port=port): + assert not _can_bind("127.0.0.1", port) + assert _can_bind("127.0.0.1", port) + + def test_context_manager_releases_port_when_body_raises(self): + port = _find_free_port() + with pytest.raises(RuntimeError, match="boom"): + with PolicyServer(MockPolicy(), host="127.0.0.1", port=port): + raise RuntimeError("boom") + assert _can_bind("127.0.0.1", port) + + @pytest.mark.timeout(10) + def test_start_server_releases_port_after_run_returns(self): + """``start_server`` is the documented one-shot entry point. Without the + context-manager wrap its bound port leaks until interpreter exit, so a + second invocation in the same process hits ``Address already in use``. + """ + port = _find_free_port() + thread = threading.Thread( + target=PolicyServer.start_server, + kwargs={"policy": MockPolicy(), "port": port, "host": "127.0.0.1"}, + daemon=True, + ) + thread.start() + time.sleep(0.3) # let the bind settle + + with PolicyClient(host="127.0.0.1", port=port, timeout_ms=5000) as client: + client.kill_server() + thread.join(timeout=3) + assert not thread.is_alive(), "start_server thread must exit after kill_server()" + assert _can_bind("127.0.0.1", port), "start_server must release the port on exit" + + +class TestPolicyClientLifecycle: + """Pin that ``PolicyClient.__del__`` survives interpreter-shutdown attribute teardown.""" + + def test_close_is_idempotent(self): + client = PolicyClient(host="127.0.0.1", port=_find_free_port(), timeout_ms=100) + client.close() + client.close() + client.close() + assert client.socket.closed + + def test_context_manager_closes_client(self): + with PolicyClient(host="127.0.0.1", port=_find_free_port(), timeout_ms=100) as client: + assert not client.socket.closed + assert client.socket.closed + + def test_del_does_not_raise_when_socket_attribute_missing(self): + """Simulate interpreter teardown clearing ``self.socket`` before ``__del__``. + + Closes the socket explicitly first so ``context.term()`` does not depend + on GC timing (CPython refcount vs PyPy / Jython tracing GC) to release + the socket before the term() call inside ``close()``. + """ + client = PolicyClient(host="127.0.0.1", port=_find_free_port(), timeout_ms=100) + client.socket.close(linger=0) + del client.socket + client.__del__() # must not raise + + def test_del_does_not_raise_when_context_attribute_missing(self): + """Simulate interpreter teardown clearing ``self.context`` before ``__del__``.""" + client = PolicyClient(host="127.0.0.1", port=_find_free_port(), timeout_ms=100) + client.socket.close(linger=0) # close socket while we still have it + del client.context + client.__del__() # must not raise + + def test_del_does_not_raise_on_partially_initialized_client(self): + """``__init__`` raising mid-way still triggers ``__del__`` via GC; the + partially-constructed instance must not crash on cleanup.""" + captured: dict[str, PolicyClient] = {} + + class _FailingClient(PolicyClient): + def _init_socket(self) -> None: + # Capture self before the raise so the test owns the partially- + # constructed instance regardless of GC timing on this interpreter. + captured["instance"] = self + raise RuntimeError("simulated init failure") + + with pytest.raises(RuntimeError, match="simulated init failure"): + _FailingClient(host="127.0.0.1", port=_find_free_port(), timeout_ms=100) + + captured["instance"].__del__() # must not raise diff --git a/tests/gr00t/test_hf_local_first.py b/tests/gr00t/test_hf_local_first.py new file mode 100644 index 000000000..2c5cbe82f --- /dev/null +++ b/tests/gr00t/test_hf_local_first.py @@ -0,0 +1,241 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Unit tests for the HF local-first cache probe in :mod:`gr00t`. + +Regression coverage for CI Job 308778931, where the previous probe +(``snapshot_download(local_files_only=True)``) returned 71/71 false misses +across a 1.5h job because ``transformers.from_pretrained`` does not always +populate the ``refs/main`` snapshot metadata that ``snapshot_download`` +requires. The new strategy uses ``from_pretrained(local_files_only=True)`` +itself as the cache probe — exactly the same logic the downloader uses — +so a hit/miss is consistent with what the underlying loader sees. +""" + +from __future__ import annotations + +from gr00t import _hf_local_first_call +import pytest +from transformers import PretrainedConfig + + +class _FakeKlass: + """Sentinel class used as the first argument to a from_pretrained-shaped fn.""" + + +class _FakeConfig(PretrainedConfig): + model_type = "groot_fake" + + def __init__(self, width: int = 1, **kwargs): + super().__init__(**kwargs) + self.width = width + + +class _FakeModel: + config_class = _FakeConfig + + def __init__(self, config, *, extra=None): + self.config = config + self.extra = extra + self.eval_called = False + + def eval(self): + self.eval_called = True + return self + + def to(self, **kwargs): + self.to_kwargs = kwargs + return self + + +def _make_orig(side_effect_by_local_files_only=None, default_return="ok"): + """Build a fake ``orig_func`` recording each call. + + ``side_effect_by_local_files_only`` maps the value of the + ``local_files_only`` kwarg (True/False/None) to either a return value or + an Exception instance to raise. Anything not in the map returns + ``default_return``. + """ + side_effect_by_local_files_only = side_effect_by_local_files_only or {} + calls = [] + + def fake(klass, name, *args, **kwargs): + calls.append({"klass": klass, "name": name, "args": args, "kwargs": dict(kwargs)}) + local_only = kwargs.get("local_files_only", None) + outcome = side_effect_by_local_files_only.get(local_only, default_return) + if isinstance(outcome, BaseException): + raise outcome + return outcome + + fake.calls = calls + return fake + + +class TestLocalFilesystemPath: + """When ``pretrained_model_name_or_path`` is an existing directory, no + cache probing is needed — pass through to ``orig_func`` unchanged.""" + + def test_calls_orig_once_with_unchanged_kwargs(self, tmp_path): + orig = _make_orig() + result = _hf_local_first_call(orig, _FakeKlass, str(tmp_path), trust_remote_code=True) + assert result == "ok" + assert len(orig.calls) == 1 + call = orig.calls[0] + assert call["name"] == str(tmp_path) + assert call["kwargs"] == {"trust_remote_code": True} + + +class TestExplicitOfflineRequest: + """If the caller already passed ``local_files_only=True``, honor it: do + not retry on failure (caller has explicitly forbidden network).""" + + def test_passes_through_on_success(self): + orig = _make_orig(default_return="cached") + result = _hf_local_first_call( + orig, _FakeKlass, "nvidia/Cosmos-Reason2-2B", local_files_only=True + ) + assert result == "cached" + assert len(orig.calls) == 1 + assert orig.calls[0]["kwargs"]["local_files_only"] is True + + def test_propagates_failure_without_retry(self): + orig = _make_orig( + side_effect_by_local_files_only={True: OSError("not in cache")}, + ) + with pytest.raises(OSError): + _hf_local_first_call( + orig, _FakeKlass, "nvidia/Cosmos-Reason2-2B", local_files_only=True + ) + assert len(orig.calls) == 1, "must not retry when caller demanded offline" + + +class TestSkipModelWeights: + """The test-only weight-skip path builds model architecture from config + without invoking the original checkpoint loader.""" + + def test_returns_architecture_only_model_and_loading_info(self, monkeypatch, tmp_path, capsys): + monkeypatch.setenv("GROOT_SKIP_HF_MODEL_WEIGHTS", "1") + _FakeConfig(width=7).save_pretrained(tmp_path) + orig = _make_orig() + + model, loading_info = _hf_local_first_call( + orig, + _FakeModel, + tmp_path, + extra="kept", + output_loading_info=True, + trust_remote_code=True, + local_files_only=True, + skip_model_weights=True, + ) + + assert len(orig.calls) == 0, "weight-skip path must not resolve checkpoint files" + assert isinstance(model, _FakeModel) + assert model.config.width == 7 + assert model.extra == "kept" + assert model.eval_called is True + assert loading_info == { + "missing_keys": [], + "unexpected_keys": [], + "mismatched_keys": [], + "error_msgs": [], + } + assert "[groot/hf] skip model weights:" in capsys.readouterr().out + + def test_uses_regular_local_first_when_env_disabled(self, monkeypatch): + monkeypatch.setenv("GROOT_SKIP_HF_MODEL_WEIGHTS", "0") + orig = _make_orig(side_effect_by_local_files_only={True: "from-cache"}) + + result = _hf_local_first_call( + orig, + _FakeModel, + "repo/x", + skip_model_weights=True, + ) + + assert result == "from-cache" + assert len(orig.calls) == 1 + + def test_fixture_temporarily_enables_weight_loading(self, load_hf_model_weights): + orig = _make_orig(side_effect_by_local_files_only={True: "from-cache"}) + + with load_hf_model_weights(): + result = _hf_local_first_call( + orig, + _FakeModel, + "repo/x", + skip_model_weights=True, + ) + + assert result == "from-cache" + assert len(orig.calls) == 1 + + +class TestRepoIdCacheHit: + """The common warm-cache case: probing with ``local_files_only=True`` + succeeds, so we never go to the network.""" + + def test_calls_orig_once_with_local_files_only_true(self, capsys): + orig = _make_orig(side_effect_by_local_files_only={True: "from-cache"}) + result = _hf_local_first_call(orig, _FakeKlass, "nvidia/Cosmos-Reason2-2B") + assert result == "from-cache" + assert len(orig.calls) == 1 + assert orig.calls[0]["kwargs"]["local_files_only"] is True + out = capsys.readouterr().out + assert "[groot/hf] cache hit:" in out + assert "[groot/hf] cache miss" not in out + + def test_preserves_other_kwargs_on_probe(self): + orig = _make_orig(side_effect_by_local_files_only={True: "from-cache"}) + _hf_local_first_call(orig, _FakeKlass, "repo/x", trust_remote_code=True, revision="abc") + kwargs = orig.calls[0]["kwargs"] + assert kwargs["trust_remote_code"] is True + assert kwargs["revision"] == "abc" + assert kwargs["local_files_only"] is True + + +class TestRepoIdCacheMissFallthrough: + """Cold-cache case: probe raises, fall through to a normal call that the + HF Hub will service via download.""" + + def test_falls_through_to_normal_call_on_probe_failure(self, capsys): + orig = _make_orig( + side_effect_by_local_files_only={ + True: OSError("LocalEntryNotFoundError"), + None: "downloaded", + } + ) + result = _hf_local_first_call(orig, _FakeKlass, "nvidia/Cosmos-Reason2-2B") + assert result == "downloaded" + assert len(orig.calls) == 2, ( + "expected one probe call and one download call, got " + f"{[c['kwargs'] for c in orig.calls]}" + ) + assert orig.calls[0]["kwargs"]["local_files_only"] is True + assert "local_files_only" not in orig.calls[1]["kwargs"] + out = capsys.readouterr().out + assert "[groot/hf] cache miss (will download):" in out + assert "[groot/hf] cache hit" not in out + + def test_propagates_failure_from_download_call(self): + boom = RuntimeError("network down") + orig = _make_orig( + side_effect_by_local_files_only={ + True: OSError("not cached"), + None: boom, + } + ) + with pytest.raises(RuntimeError, match="network down"): + _hf_local_first_call(orig, _FakeKlass, "repo/x") diff --git a/tests/gr00t/test_no_weight_load.py b/tests/gr00t/test_no_weight_load.py new file mode 100644 index 000000000..7bd83d089 --- /dev/null +++ b/tests/gr00t/test_no_weight_load.py @@ -0,0 +1,67 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Unit tests for the no-weight load harness buffer handling. + +``_zero_no_weight_model_parameters`` zeros uninitialized params/persistent +buffers under the ``GROOT_SKIP_HF_MODEL_WEIGHTS`` path, but must NOT zero +non-persistent derived buffers (e.g. RoPE ``inv_freq``), which the module +recomputes analytically in ``__init__`` and which are not in ``state_dict``. +Zeroing them would collapse RoPE to cos≡1/sin≡0. +""" + +from gr00t import _zero_no_weight_model_parameters +import torch + + +class _TinyRotary(torch.nn.Module): + def __init__(self): + super().__init__() + self.weight = torch.nn.Parameter(torch.ones(4)) + self.register_buffer("persistent_buf", torch.ones(4), persistent=True) + # analytic, derived, not in state_dict — must survive the harness + self.register_buffer("inv_freq", torch.tensor([1.0, 0.5, 0.25, 0.125]), persistent=False) + + +class _Nested(torch.nn.Module): + def __init__(self): + super().__init__() + self.rotary = _TinyRotary() + self.lin = torch.nn.Linear(4, 4) + + +def test_zeros_params_and_persistent_buffers(): + m = _TinyRotary() + _zero_no_weight_model_parameters(m) + assert torch.all(m.weight == 0), "parameters should be zeroed" + assert torch.all(m.persistent_buf == 0), "persistent buffers should be zeroed" + + +def test_preserves_non_persistent_buffers(): + m = _TinyRotary() + expected = m.inv_freq.clone() + _zero_no_weight_model_parameters(m) + assert torch.equal(m.inv_freq, expected), "non-persistent inv_freq must be preserved (analytic)" + assert bool((m.inv_freq != 0).any()), "inv_freq must not be zeroed (RoPE would degenerate)" + + +def test_preserves_non_persistent_in_nested_modules(): + m = _Nested() + expected = m.rotary.inv_freq.clone() + _zero_no_weight_model_parameters(m) + assert torch.equal(m.rotary.inv_freq, expected), ( + "nested non-persistent buffer must be preserved" + ) + assert torch.all(m.lin.weight == 0), "nested params should still be zeroed" diff --git a/tests/gr00t/utils/test_dataset_video_backend.py b/tests/gr00t/utils/test_dataset_video_backend.py new file mode 100644 index 000000000..0d6e6bf76 --- /dev/null +++ b/tests/gr00t/utils/test_dataset_video_backend.py @@ -0,0 +1,357 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Video Backend Codec Validation Tests + +Verifies that the torchcodec video backend decodes non-identical frames across +a representative set of robotics datasets. On failure, the original video and a +re-encoded debug copy are written to ``debug_video_decoding//`` +for offline inspection. + +Datasets are resolved in order: shared drive, in-repo path, then downloaded +from HuggingFace Hub using ``hf_hub_download`` (avoids full repo enumeration). +""" + +from __future__ import annotations + +import copy +from dataclasses import dataclass +from pathlib import Path +import shutil + +import cv2 +from gr00t.configs.data.embodiment_configs import MODALITY_CONFIGS +from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader +from gr00t.data.types import ModalityConfig +from gr00t.utils import video_utils +import huggingface_hub +import numpy as np +import pytest +from test_support.runtime import TEST_CACHE_PATH, get_root, resolve_demo_dataset + + +REPO_ROOT = get_root() + + +@dataclass(frozen=True) +class DatasetCatalogEntry: + """Catalog entry describing a robotics dataset and how to obtain it. + + Datasets are resolved in order: shared drive path, in-repo path, then + downloaded from HuggingFace Hub if neither exists locally. The + hf_files field pins the download to a single representative video + to avoid fetching the full dataset during CI. + """ + + name: str + rel_path: str + hf_repo_id: str | None = None + hf_files: tuple[str, ...] | None = None + + _VIDEO_SUFFIXES = (".mp4", ".avi", ".mov", ".mkv", ".webm") + + @staticmethod + def _scan_videos(directory: Path) -> list[Path]: + """Return all video files under directory, sorted by path.""" + return sorted( + p + for p in directory.rglob("*") + if p.is_file() and p.suffix.lower() in DatasetCatalogEntry._VIDEO_SUFFIXES + ) + + def list_videos(self) -> list[Path]: + """Resolve the local dataset directory and return all video files within it.""" + return self._scan_videos(self.get_local_directory()) + + def download(self, dest: Path) -> None: + """Download the dataset from HuggingFace Hub into dest. + + Uses hf_hub_download for each file in hf_files to avoid enumerating + the entire repo index, which can be very slow for large datasets. + Does nothing if hf_repo_id or hf_files is not set. + """ + if self.hf_repo_id is None or not self.hf_files: + return + dest.mkdir(parents=True, exist_ok=True) + for file_path in self.hf_files: + huggingface_hub.hf_hub_download( + repo_id=self.hf_repo_id, + repo_type="dataset", + filename=file_path, + local_dir=str(dest), + ) + + def get_local_directory(self) -> Path: + """Return the local directory containing this dataset's videos. + + Checks the shared drive path then the in-repo path. If neither exists, + downloads the dataset via HuggingFace Hub. Raises FileNotFoundError if + no videos are found after downloading. + """ + shared_path = SHARED_DATASETS_ROOT / self.rel_path + repo_path = REPO_ROOT / self.rel_path + + for candidate in (shared_path, repo_path): + if candidate.exists() and self._scan_videos(candidate): + return candidate + + self.download(shared_path) + + if shared_path.exists() and self._scan_videos(shared_path): + return shared_path + + raise FileNotFoundError( + f"Failed to find or download dataset videos for entry {self.name}. " + f"Checked shared path: {shared_path} and repo path: {repo_path}" + ) + + +SHARED_DATASETS_ROOT = TEST_CACHE_PATH / "datasets" + + +DATASET_CATALOG: tuple[DatasetCatalogEntry, ...] = ( + DatasetCatalogEntry( + "so100_finish_sandwich", + "examples/SO100/finish_sandwich_lerobot", + hf_repo_id="izuluaga/finish_sandwich", + hf_files=("videos/observation.images.front/chunk-000/file-000.mp4",), + ), + DatasetCatalogEntry( + "libero_10_lerobot", + "examples/LIBERO/libero_10_no_noops_1.0.0_lerobot", + hf_repo_id="IPEC-COMMUNITY/libero_10_no_noops_1.0.0_lerobot", + hf_files=("videos/chunk-000/observation.images.image/episode_000000.mp4",), + ), + DatasetCatalogEntry( + "libero_goal_lerobot", + "examples/LIBERO/libero_goal_no_noops_1.0.0_lerobot", + hf_repo_id="IPEC-COMMUNITY/libero_goal_no_noops_1.0.0_lerobot", + hf_files=("videos/chunk-000/observation.images.image/episode_000000.mp4",), + ), + DatasetCatalogEntry( + "libero_object_lerobot", + "examples/LIBERO/libero_object_no_noops_1.0.0_lerobot", + hf_repo_id="IPEC-COMMUNITY/libero_object_no_noops_1.0.0_lerobot", + hf_files=("videos/chunk-000/observation.images.image/episode_000000.mp4",), + ), + DatasetCatalogEntry( + "libero_spatial_lerobot", + "examples/LIBERO/libero_spatial_no_noops_1.0.0_lerobot", + hf_repo_id="IPEC-COMMUNITY/libero_spatial_no_noops_1.0.0_lerobot", + hf_files=("videos/chunk-000/observation.images.image/episode_000000.mp4",), + ), + DatasetCatalogEntry( + "simplerenv_bridge_lerobot", + "examples/SimplerEnv/bridge_orig_lerobot", + hf_repo_id="IPEC-COMMUNITY/bridge_orig_lerobot", + hf_files=("videos/chunk-000/observation.images.image_0/episode_000000.mp4",), + ), + DatasetCatalogEntry( + "simplerenv_fractal_lerobot", + "examples/SimplerEnv/fractal20220817_data_lerobot", + hf_repo_id="IPEC-COMMUNITY/fractal20220817_data_lerobot", + hf_files=("videos/chunk-000/observation.images.image/episode_000000.mp4",), + ), +) + + +SO100_MODALITY_CONFIG = { + "video": ModalityConfig(delta_indices=[0], modality_keys=["front", "wrist"]), + "state": ModalityConfig(delta_indices=[0], modality_keys=["single_arm", "gripper"]), + "action": ModalityConfig( + delta_indices=list(range(16)), modality_keys=["single_arm", "gripper"] + ), + "language": ModalityConfig( + delta_indices=[0], + modality_keys=["annotation.human.task_description"], + ), +} + + +SO101_MASK_MODALITY_CONFIG = { + **SO100_MODALITY_CONFIG, + "mask": ModalityConfig(delta_indices=[0], modality_keys=["front", "wrist"]), +} + + +@dataclass(frozen=True) +class ReadmeDemoDatasetEntry: + """Concrete README training dataset that ships under demo_data/.""" + + name: str + dataset_name: str + modality_configs: dict[str, ModalityConfig] + env_var: str | None = None + + @property + def video_keys(self) -> list[str]: + return self.modality_configs["video"].modality_keys + + @property + def mask_keys(self) -> list[str]: + mask_config = self.modality_configs.get("mask") + return [] if mask_config is None else mask_config.modality_keys + + +README_DEMO_DATASET_CATALOG: tuple[ReadmeDemoDatasetEntry, ...] = ( + ReadmeDemoDatasetEntry( + name="readme_droid_sample", + dataset_name="droid_sample", + modality_configs=MODALITY_CONFIGS["oxe_droid_relative_eef_relative_joint"], + env_var="DROID_DEMO_DATASET_PATH", + ), + ReadmeDemoDatasetEntry( + name="readme_libero_demo", + dataset_name="libero_demo", + modality_configs=MODALITY_CONFIGS["libero_sim"], + env_var="LIBERO_DEMO_DATASET_PATH", + ), + ReadmeDemoDatasetEntry( + name="readme_simplerenv_bridge_sample", + dataset_name="simplerenv_bridge_sample", + modality_configs=MODALITY_CONFIGS["simpler_env_widowx"], + ), + ReadmeDemoDatasetEntry( + name="readme_simplerenv_fractal_sample", + dataset_name="simplerenv_fractal_sample", + modality_configs=MODALITY_CONFIGS["simpler_env_google"], + ), + ReadmeDemoDatasetEntry( + name="readme_cube_to_bowl_5", + dataset_name="cube_to_bowl_5", + modality_configs=SO100_MODALITY_CONFIG, + ), + ReadmeDemoDatasetEntry( + name="readme_cube_to_bowl_5_with_mask", + dataset_name="cube_to_bowl_5_with_mask", + modality_configs=SO101_MASK_MODALITY_CONFIG, + ), +) + + +@pytest.fixture(scope="module") +def video_decoder_cls(): + try: + return video_utils._get_video_decoder_cls() + except ImportError as exc: + pytest.skip(str(exc)) + + +@pytest.mark.edge_device +@pytest.mark.parametrize("entry", DATASET_CATALOG, ids=lambda e: e.name) +def test_dataset_backend_policy_on_sample_video( + entry: DatasetCatalogEntry, video_decoder_cls +) -> None: + """Verify that torchcodec decodes non-identical frames for each dataset video.""" + video_paths = entry.list_videos() + assert len(video_paths) > 0, ( + f"No videos found for dataset entry {entry.name} in {entry.get_local_directory()}" + ) + + for video_path in video_paths: + video_path_str = str(video_path) + + decoder = video_decoder_cls(video_path_str) + nb_frames = len(decoder) + fps = float(decoder.metadata.average_fps or 1.0) + + if nb_frames < 10: + raise ValueError(f"Video has too few frames: {video_path_str}") + + nb_frames = min(nb_frames, 60) + + frames = video_utils.get_frames_by_indices( + video_path=video_path_str, + indices=list(range(nb_frames)), + decoder_kwargs={}, + ) + assert len(frames) == nb_frames + all_identical = all((frames[i] == frames[0]).all() for i in range(1, nb_frames)) + if all_identical: + debug_dir = REPO_ROOT / "debug_video_decoding" / entry.name + debug_dir.mkdir(parents=True, exist_ok=True) + + shutil.copy(video_path, debug_dir / video_path.name) + + h, w = frames[0].shape[:2] + out = cv2.VideoWriter( + str(debug_dir / f"decoded_{video_path.stem}.mp4"), + cv2.VideoWriter_fourcc(*"mp4v"), + fps, + (w, h), + ) + for frame in frames: + out.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) + out.release() + + pytest.fail( + f"All {nb_frames} decoded frames are identical in {video_path_str}. " + f"Original video and decoded frames saved to {debug_dir}" + ) + + +@pytest.mark.edge_device +@pytest.mark.parametrize("entry", README_DEMO_DATASET_CATALOG, ids=lambda e: e.name) +def test_readme_demo_training_dataset_loads_frames_with_torchcodec( + entry: ReadmeDemoDatasetEntry, + video_decoder_cls, +) -> None: + """Load concrete README demo training datasets through the real episode loader.""" + assert video_decoder_cls is not None + + dataset_path = resolve_demo_dataset( + dataset_name=entry.dataset_name, + path_override_env=entry.env_var, + repo_root=REPO_ROOT, + ) + loader = LeRobotEpisodeLoader( + dataset_path=dataset_path, + modality_configs=copy.deepcopy(entry.modality_configs), + decoder_kwargs={}, + ) + assert len(loader) > 0, f"{entry.name} has no episodes: {dataset_path}" + + episode = loader[0] + assert len(episode) > 0, f"{entry.name} episode 0 loaded no rows: {dataset_path}" + + for video_key in entry.video_keys: + column = f"video.{video_key}" + assert column in episode.columns, ( + f"{entry.name} did not load expected video column {column}. " + f"Available columns: {list(episode.columns)}" + ) + frame = episode[column].iloc[0] + assert isinstance(frame, np.ndarray), ( + f"{entry.name} {column} loaded {type(frame).__name__}, expected np.ndarray" + ) + assert frame.ndim == 3 and frame.shape[-1] == 3, ( + f"{entry.name} {column} loaded frame with unexpected shape {frame.shape}" + ) + assert frame.dtype == np.uint8, ( + f"{entry.name} {column} loaded frame with unexpected dtype {frame.dtype}" + ) + + for mask_key in entry.mask_keys: + column = f"mask.{mask_key}" + assert column in episode.columns, ( + f"{entry.name} did not load expected mask column {column}. " + f"Available columns: {list(episode.columns)}" + ) + mask = episode[column].iloc[0] + assert isinstance(mask, np.ndarray), ( + f"{entry.name} {column} loaded {type(mask).__name__}, expected np.ndarray" + ) + assert mask.ndim >= 2, f"{entry.name} {column} loaded mask shape {mask.shape}" diff --git a/tests/gr00t/utils/test_determinism.py b/tests/gr00t/utils/test_determinism.py new file mode 100644 index 000000000..d168fb299 --- /dev/null +++ b/tests/gr00t/utils/test_determinism.py @@ -0,0 +1,87 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Regression tests for :mod:`gr00t.utils.determinism`. + +Covers the four contracts future refactors must preserve: + +1. Opt-in: no arg and no ``GR00T_EVAL_SEED`` => no-op, no global flags flipped. +2. Seeding actually makes Python / NumPy / torch CPU RNGs reproducible. +3. ``GR00T_EVAL_SEED=N`` is equivalent to ``seed_everything(N)``. +4. A malformed ``GR00T_EVAL_SEED`` raises instead of being silently ignored. +""" + +from __future__ import annotations + +import random + +from gr00t.utils.determinism import EVAL_SEED_ENV_VAR, get_eval_seed, seed_everything +import numpy as np +import pytest +import torch + + +@pytest.fixture(autouse=True) +def _restore_deterministic_algorithms(monkeypatch): + """Undo the one piece of global state that can break unrelated tests. + + ``use_deterministic_algorithms(True)`` makes legitimately-nondeterministic + ops in later tests raise; cudnn flags and CUBLAS env var are harmless to + leak. We also ensure the env var is not inherited from the outer shell. + """ + monkeypatch.delenv(EVAL_SEED_ENV_VAR, raising=False) + saved = torch.are_deterministic_algorithms_enabled() + try: + yield + finally: + torch.use_deterministic_algorithms(saved, warn_only=True) + + +def _sample(): + return (random.random(), float(np.random.rand()), torch.rand(4).tolist()) + + +def test_noop_when_unset(): + before = torch.are_deterministic_algorithms_enabled() + assert seed_everything() is None + assert torch.are_deterministic_algorithms_enabled() == before + + +def test_seed_is_reproducible(): + seed_everything(42) + first = _sample() + seed_everything(42) + assert _sample() == first + + +def test_env_var_fallback_matches_explicit_arg(monkeypatch): + monkeypatch.setenv(EVAL_SEED_ENV_VAR, "42") + assert seed_everything() == 42 + via_env = _sample() + assert seed_everything(42) == 42 + assert _sample() == via_env + + +def test_invalid_env_var_raises(monkeypatch): + monkeypatch.setenv(EVAL_SEED_ENV_VAR, "not-an-int") + with pytest.raises(ValueError, match=EVAL_SEED_ENV_VAR): + get_eval_seed() + + +def test_cudnn_flags_flipped_when_seeded(): + seed_everything(0) + assert torch.backends.cudnn.deterministic is True + assert torch.backends.cudnn.benchmark is False + assert torch.are_deterministic_algorithms_enabled() is True diff --git a/tests/gr00t/utils/test_initial_actions_safety.py b/tests/gr00t/utils/test_initial_actions_safety.py new file mode 100644 index 000000000..069630505 --- /dev/null +++ b/tests/gr00t/utils/test_initial_actions_safety.py @@ -0,0 +1,157 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only regression tests for the pickle-free +:func:`gr00t.utils.initial_actions.save_initial_actions` / +:func:`gr00t.utils.initial_actions.load_initial_actions` round-trip: +structured nested dicts must go through the flat keyed-npz layout +(``allow_pickle=False``-compatible), and any file written by the +legacy pickle-based path must be rejected with a migration error.""" + +from __future__ import annotations + +from gr00t.utils.initial_actions import ( + INITIAL_ACTIONS_FILENAME, + load_initial_actions, + save_initial_actions, +) +import numpy as np +import pytest + + +def _sample_payload() -> list[dict[str, dict[str, np.ndarray]]]: + """Return a representative initial-actions structure: 2 datasets, several + trajectories each, multiple action keys per trajectory.""" + return [ + { + "traj_0": { + "left_hand": np.array([[0.1, 0.2, 0.3]], dtype=np.float32), + "right_hand": np.array([[0.4, 0.5, 0.6]], dtype=np.float32), + }, + "traj_1": { + "left_hand": np.array([[1.0, 1.1, 1.2]], dtype=np.float32), + }, + }, + { + "traj_a": { + "base": np.array([[7.0, 8.0]], dtype=np.float64), + }, + }, + ] + + +def test_roundtrip_preserves_structure_and_values(tmp_path): + payload = _sample_payload() + path = tmp_path / INITIAL_ACTIONS_FILENAME + + save_initial_actions(payload, path) + loaded = load_initial_actions(path) + + assert len(loaded) == len(payload) + for original_ds, loaded_ds in zip(payload, loaded): + assert set(loaded_ds.keys()) == set(original_ds.keys()) + for traj_name, action_dict in original_ds.items(): + assert set(loaded_ds[traj_name].keys()) == set(action_dict.keys()) + for action_key, expected in action_dict.items(): + np.testing.assert_array_equal(loaded_ds[traj_name][action_key], expected) + assert loaded_ds[traj_name][action_key].dtype == expected.dtype + + +def test_roundtrip_handles_empty_dataset_list(tmp_path): + """Empty input must round-trip to an empty list — no IndexError, no + silent ``None``.""" + path = tmp_path / INITIAL_ACTIONS_FILENAME + save_initial_actions([], path) + assert load_initial_actions(path) == [] + + +def test_roundtrip_handles_dataset_with_no_trajectories(tmp_path): + """A dataset with zero trajectories must still survive the roundtrip + so the per-dataset ordering is preserved across calls.""" + payload = [{}, {"traj_only_in_ds1": {"k": np.array([1.0])}}] + path = tmp_path / INITIAL_ACTIONS_FILENAME + save_initial_actions(payload, path) + loaded = load_initial_actions(path) + assert len(loaded) == 2 + assert loaded[0] == {} + assert "traj_only_in_ds1" in loaded[1] + + +# --------------------------------------------------------------------------- +# Security regressions (pre-fix bug surface) +# --------------------------------------------------------------------------- + + +def test_save_rejects_separator_in_trajectory_name(tmp_path): + """``::`` is a structural separator — a trajectory name containing + it would silently mis-group on decode, so refuse at save time.""" + payload = [{"traj::with::sep": {"key": np.array([1.0])}}] + path = tmp_path / INITIAL_ACTIONS_FILENAME + with pytest.raises(ValueError, match="must not contain '::'"): + save_initial_actions(payload, path) + + +def test_save_rejects_separator_in_action_key(tmp_path): + payload = [{"traj": {"action::key": np.array([1.0])}}] + path = tmp_path / INITIAL_ACTIONS_FILENAME + with pytest.raises(ValueError, match="must not contain '::'"): + save_initial_actions(payload, path) + + +def test_load_rejects_legacy_pickle_format(tmp_path): + """Legacy files written via ``np.savez(path, list_of_dicts)`` forced + numpy to pickle the list into ``arr_0``. Loading them today must + raise a clear migration error — silently re-enabling + ``allow_pickle=True`` is the exact RCE path.""" + legacy_path = tmp_path / INITIAL_ACTIONS_FILENAME + legacy_payload = _sample_payload() + # Mirror the pre-fix code: single positional arg → numpy pickles into arr_0. + np.savez(str(legacy_path), legacy_payload) + + with pytest.raises(ValueError) as excinfo: + load_initial_actions(legacy_path) + + msg = str(excinfo.value) + # numpy may surface either the pickle-rejection branch or the missing- + # __schema__ branch depending on how it encoded the legacy payload; + # accept either since both are valid migration errors. + assert "save_initial_actions" in msg or "pickle" in msg.lower() + + +def test_load_rejects_npz_missing_schema_marker(tmp_path): + """An npz without the ``__schema__`` marker is either a legacy + pickle file (after numpy fell back) or an unrelated file sharing + the extension; either way it must not silently load.""" + path = tmp_path / INITIAL_ACTIONS_FILENAME + np.savez(str(path), foo=np.array([1, 2, 3]), bar=np.array([4.0, 5.0])) + + with pytest.raises(ValueError, match="__schema__"): + load_initial_actions(path) + + +def test_load_rejects_unrecognised_format_marker(tmp_path): + """A file with ``__schema__`` but mismatched ``format`` must also + fail closed — covers the case where another component writes a + JSON schema array under the same key.""" + import json + + path = tmp_path / INITIAL_ACTIONS_FILENAME + schema = {"format": "some.other.tool", "version": 1} + np.savez( + str(path), + __schema__=np.frombuffer(json.dumps(schema).encode("utf-8"), dtype=np.uint8), + ) + with pytest.raises(ValueError, match="unrecognised schema"): + load_initial_actions(path) diff --git a/tests/gr00t/utils/test_run_or_wait_on_rank0.py b/tests/gr00t/utils/test_run_or_wait_on_rank0.py new file mode 100644 index 000000000..e744924c8 --- /dev/null +++ b/tests/gr00t/utils/test_run_or_wait_on_rank0.py @@ -0,0 +1,365 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only regression tests for `gr00t.utils.dist_utils.run_or_wait_on_rank0`. + +These pin the behavioural contract that motivates the helper: + + - When rank-0 raises inside the ``with`` block, *every* rank must raise + (so the failure surfaces synchronously instead of stalling at the next + NCCL collective for 30 minutes). + - When the helper is used outside a torch.distributed process group, it + must degenerate to a plain context manager that runs once and yields + ``True``. + - When all ranks succeed, no spurious exception is raised. + - The body actually runs only on rank-0. + +We use the gloo backend over file:// init so the tests run on CPU-only CI +without needing GPU / NCCL. A wall-clock timeout on each subprocess pins +the "no hang" guarantee — if a rank ever stalls in dist.barrier instead +of raising, the test fails on timeout rather than passing silently. +""" + +from __future__ import annotations + +import os +from pathlib import Path +import tempfile + +import pytest +import torch +import torch.distributed as dist +import torch.multiprocessing as mp + + +WORLD_SIZE = 3 +# Generous headroom so this stays robust under parallel CI (pytest-xdist -n auto): +# each test spawns WORLD_SIZE torch-importing subprocesses, which contend for +# cores when every xdist worker is busy. Non-hang paths complete in well under +# 1s and a real barrier hang would block far longer, so a larger budget still +# reliably catches the regression this guards. +WORKER_TIMEOUT_S = 120 + + +def _setup_pg(rank: int, world_size: int, init_file: str) -> None: + # One intra-op thread per child: WORLD_SIZE gloo workers each defaulting to + # a full-core pool oversubscribes an xdist-saturated CI box (the 120s-timeout + # flake). OMP_NUM_THREADS is set pre-spawn in _spawn for the OpenMP side. + torch.set_num_threads(1) + os.environ.setdefault("MASTER_ADDR", "127.0.0.1") + os.environ.setdefault("MASTER_PORT", "0") + dist.init_process_group( + backend="gloo", + init_method=f"file://{init_file}", + rank=rank, + world_size=world_size, + ) + + +def _teardown_pg() -> None: + if dist.is_initialized(): + dist.destroy_process_group() + + +def _all_rank_succeed_worker(rank: int, world_size: int, init_file: str, scratch_dir: str) -> None: + from gr00t.utils.dist_utils import run_or_wait_on_rank0 + + _setup_pg(rank, world_size, init_file) + try: + with run_or_wait_on_rank0() as is_rank0: + if is_rank0: + Path(scratch_dir, "rank0_was_here").write_text("ok") + # Sentinel: every rank that *exits cleanly* writes its rank file. + # If a rank raised inside the helper or hung at the barrier, this + # never lands on disk and the parent assertion catches it. + Path(scratch_dir, f"rank_{rank}_done").write_text("ok") + finally: + _teardown_pg() + + +def _rank0_raises_worker(rank: int, world_size: int, init_file: str, scratch_dir: str) -> None: + from gr00t.utils.dist_utils import run_or_wait_on_rank0 + + _setup_pg(rank, world_size, init_file) + try: + try: + with run_or_wait_on_rank0(label="unit-test-label") as is_rank0: + if is_rank0: + raise ValueError(f"boom-from-rank-{rank}") + except Exception as exc: + Path(scratch_dir, f"rank_{rank}_exc.txt").write_text(f"{type(exc).__name__}: {exc}") + return + # No exception observed: that's a contract violation. + Path(scratch_dir, f"rank_{rank}_no_exc").write_text("contract-violation") + finally: + _teardown_pg() + + +def _wandb_init_failure_worker( + rank: int, world_size: int, init_file: str, scratch_dir: str +) -> None: + """Mimic the production call shape at ``experiment.py``: + + .. code-block:: python + + if config.training.use_wandb: + with run_or_wait_on_rank0(label="wandb.init") as is_rank0: + if is_rank0: + wandb.init(...) # raises on auth/network failure + + The body re-raises a ``RuntimeError`` standing in for + ``wandb.errors.AuthenticationError`` / ``CommError`` so the test does + not require wandb. The contract is identical: a rank-0 raise must + propagate to every rank instead of letting non-rank-0 ranks advance + to the next NCCL collective and hang. + """ + from gr00t.utils.dist_utils import run_or_wait_on_rank0 + + _setup_pg(rank, world_size, init_file) + try: + try: + with run_or_wait_on_rank0(label="wandb.init") as is_rank0: + if is_rank0: + raise RuntimeError("simulated wandb auth failure") + except Exception as exc: + Path(scratch_dir, f"rank_{rank}_exc.txt").write_text(f"{type(exc).__name__}: {exc}") + return + Path(scratch_dir, f"rank_{rank}_no_exc").write_text("contract-violation") + finally: + _teardown_pg() + + +def _spawn(target, scratch_dir: str) -> None: + """Spawn `WORLD_SIZE` workers with a temp file:// rendezvous. + + `mp.spawn(join=True)` blocks until every child exits. Hang protection + comes from `@pytest.mark.timeout(WORKER_TIMEOUT_S)` on each test: if a + worker stalls in `dist.barrier`, pytest interrupts the whole test on + its wall-clock budget rather than wedging the CI run. + """ + # Children are fresh 'spawn' interpreters that re-import torch; pin their + # OpenMP pools to one thread before creation so they inherit it pre-import. + os.environ.setdefault("OMP_NUM_THREADS", "1") + init_file = os.path.join(scratch_dir, "init") + mp.spawn( + target, + args=(WORLD_SIZE, init_file, scratch_dir), + nprocs=WORLD_SIZE, + join=True, + ) + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_run_or_wait_on_rank0_no_dist_runs_body_once_and_yields_true(): + """Helper degenerates cleanly outside a process group.""" + from gr00t.utils.dist_utils import run_or_wait_on_rank0 + + runs: list[bool] = [] + with run_or_wait_on_rank0() as is_rank0: + runs.append(is_rank0) + + assert runs == [True], "Body must run exactly once with is_rank0=True when not distributed" + + +def test_run_or_wait_on_rank0_no_dist_propagates_local_error(): + """Outside distributed, exceptions still propagate (no silent swallow).""" + from gr00t.utils.dist_utils import run_or_wait_on_rank0 + + with pytest.raises(RuntimeError, match="local-only"): + with run_or_wait_on_rank0() as is_rank0: + assert is_rank0 + raise RuntimeError("local-only") + + +def test_run_on_rank0_no_dist_calls_fn_and_returns_result(): + """``run_on_rank0`` degenerates to a plain call returning the fn result.""" + from gr00t.utils.dist_utils import run_on_rank0 + + calls: list[tuple] = [] + + def fn(a, b, c=0): + calls.append((a, b, c)) + return a + b + c + + assert run_on_rank0(fn, 1, 2, c=3) == 6 + assert calls == [(1, 2, 3)], "fn must be invoked exactly once with the forwarded args" + + +def test_run_on_rank0_no_dist_propagates_local_error(): + """Outside distributed, a fn raise still propagates (no silent swallow).""" + from gr00t.utils.dist_utils import run_on_rank0 + + def boom(): + raise RuntimeError("local-only") + + with pytest.raises(RuntimeError, match="local-only"): + run_on_rank0(boom) + + +@pytest.mark.serial +@pytest.mark.timeout(WORKER_TIMEOUT_S) +def test_run_or_wait_on_rank0_runs_body_only_on_rank0_when_all_succeed( + serialize_subprocess_spawns, +): + """Body runs on rank-0; all ranks exit cleanly.""" + with tempfile.TemporaryDirectory() as scratch_dir: + _spawn(_all_rank_succeed_worker, scratch_dir) + + scratch = Path(scratch_dir) + assert (scratch / "rank0_was_here").exists(), ( + "Rank-0 body should have executed and written the sentinel" + ) + for rank in range(WORLD_SIZE): + assert (scratch / f"rank_{rank}_done").exists(), ( + f"Rank {rank} did not exit cleanly through run_or_wait_on_rank0()" + ) + + +@pytest.mark.serial +@pytest.mark.timeout(WORKER_TIMEOUT_S) +def test_run_or_wait_on_rank0_propagates_rank0_error_to_all_ranks( + serialize_subprocess_spawns, +): + """Contract: rank-0 raise → every rank raises; no rank hangs at barrier. + + This is the load-bearing assertion. Without run_or_wait_on_rank0(), the same + pattern (`if get_rank() == 0:` + raise) hangs non-rank-0 ranks at the + next NCCL collective for the default 30-min timeout. Here we assert + every rank observes an exception inside the wall-clock budget. + """ + with tempfile.TemporaryDirectory() as scratch_dir: + _spawn(_rank0_raises_worker, scratch_dir) + + scratch = Path(scratch_dir) + for rank in range(WORLD_SIZE): + exc_file = scratch / f"rank_{rank}_exc.txt" + no_exc_file = scratch / f"rank_{rank}_no_exc" + assert not no_exc_file.exists(), ( + f"Rank {rank} did not raise — contract violation; without " + "broadcasting, this rank would have hung at the next " + "NCCL collective." + ) + assert exc_file.exists(), f"Rank {rank} did not write its exception sentinel" + payload = exc_file.read_text() + if rank == 0: + # rank-0 should re-raise the *original* exception type. + assert "ValueError" in payload, ( + f"Rank-0 should re-raise the underlying ValueError, got: {payload}" + ) + else: + # Other ranks raise a synthesized RuntimeError pointing at + # rank-0's traceback. The label and rank-0's exception + # summary must round-trip through broadcast_object_list so + # log scrapers can name the failing call site without + # cross-referencing rank-0's separate traceback. + assert "RuntimeError" in payload, ( + f"Non-rank-0 should raise RuntimeError after status broadcast, got: {payload}" + ) + assert "unit-test-label" in payload, ( + f"Non-rank-0 RuntimeError must include the label arg, got: {payload}" + ) + assert "ValueError" in payload and "boom-from-rank-0" in payload, ( + f"Non-rank-0 RuntimeError must echo rank-0's : , got: {payload}" + ) + + +# --------------------------------------------------------------------------- +# Sanity: the spawn machinery itself doesn't deadlock when nothing raises. +# --------------------------------------------------------------------------- + + +def _smoke_worker(rank: int, world_size: int, init_file: str, scratch_dir: str) -> None: + _setup_pg(rank, world_size, init_file) + try: + # Cross-rank reduction sanity check, independent of run_or_wait_on_rank0. + t = torch.tensor([float(rank)]) + dist.all_reduce(t, op=dist.ReduceOp.SUM) + Path(scratch_dir, f"smoke_rank_{rank}_sum").write_text(str(t.item())) + finally: + _teardown_pg() + + +@pytest.mark.serial +@pytest.mark.timeout(WORKER_TIMEOUT_S) +def test_wandb_init_failure_propagates_to_all_ranks(serialize_subprocess_spawns): + """Regression for the ``wandb.init`` call site in ``experiment.run``. + + Pre-fix: ``wandb.init`` was guarded only by ``if global_rank == 0:`` + with no exception broadcast. A rank-0 ``AuthenticationError`` / + ``CommError`` left non-rank-0 ranks oblivious; they advanced to the + next NCCL collective in ``pipeline.setup()`` / ``Trainer.train`` and + stalled there until NCCL's default 30-min timeout fired. + + Post-fix: the call sits inside ``run_or_wait_on_rank0(label="wandb.init")``, + so rank-0 failures fail-fast cluster-wide with a label-bearing + ``RuntimeError`` on the other ranks. + """ + with tempfile.TemporaryDirectory() as scratch_dir: + _spawn(_wandb_init_failure_worker, scratch_dir) + + scratch = Path(scratch_dir) + for rank in range(WORLD_SIZE): + no_exc_file = scratch / f"rank_{rank}_no_exc" + exc_file = scratch / f"rank_{rank}_exc.txt" + assert not no_exc_file.exists(), ( + f"Rank {rank} did not raise on simulated wandb.init failure — " + "without run_or_wait_on_rank0, this rank would have hung at the next " + "NCCL collective." + ) + assert exc_file.exists(), f"Rank {rank} did not write its exception sentinel" + payload = exc_file.read_text() + if rank == 0: + assert "RuntimeError" in payload and "wandb auth failure" in payload, ( + f"Rank-0 should re-raise the underlying wandb error, got: {payload}" + ) + else: + assert "RuntimeError" in payload and "wandb.init" in payload, ( + f"Non-rank-0 RuntimeError must name the wandb.init label, got: {payload}" + ) + + +def test_experiment_run_wraps_wandb_init_in_run_or_wait_on_rank0(): + """Source-level pin: ``experiment.run`` must keep ``wandb.init`` inside + ``run_or_wait_on_rank0``. A future refactor that moves the call back outside the + helper would silently re-introduce the NCCL-hang regression — pure + behavioural tests cannot catch that without spinning up a real wandb + backend, so we pin the textual structure of the call site instead. + + Read the source file directly rather than importing the module so this + test runs even in CPU-only venvs that do not install ``wandb``. + """ + src_path = Path(__file__).resolve().parents[3] / "gr00t" / "experiment" / "experiment.py" + src = src_path.read_text(encoding="utf-8") + assert 'run_or_wait_on_rank0(label="wandb.init")' in src, ( + "experiment.run must wrap wandb.init in run_or_wait_on_rank0(label='wandb.init'); " + "the wrap was removed or its label changed, which silently re-opens the " + "rank-0-raise → NCCL-hang regression." + ) + + +@pytest.mark.serial +@pytest.mark.timeout(WORKER_TIMEOUT_S) +def test_gloo_pg_smoke(serialize_subprocess_spawns): + """Sanity-check the gloo file:// rendezvous works on this CI host.""" + with tempfile.TemporaryDirectory() as scratch_dir: + _spawn(_smoke_worker, scratch_dir) + expected_sum = sum(range(WORLD_SIZE)) + for rank in range(WORLD_SIZE): + payload = Path(scratch_dir, f"smoke_rank_{rank}_sum").read_text() + assert float(payload) == float(expected_sum) diff --git a/tests/gr00t/utils/test_torchcodec_import.py b/tests/gr00t/utils/test_torchcodec_import.py new file mode 100644 index 000000000..f8b2e42ad --- /dev/null +++ b/tests/gr00t/utils/test_torchcodec_import.py @@ -0,0 +1,25 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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 pytest + + +@pytest.mark.gpu +@pytest.mark.timeout(60) +def test_torchcodec_importable() -> None: + """Smoke test that torchcodec is importable in the CI environment.""" + import torchcodec + + assert torchcodec is not None diff --git a/tests/gr00t/utils/test_video_backend.py b/tests/gr00t/utils/test_video_backend.py new file mode 100644 index 000000000..f38cc4ea8 --- /dev/null +++ b/tests/gr00t/utils/test_video_backend.py @@ -0,0 +1,161 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Tests for the torchcodec video backend.""" + +import builtins +import os +from pathlib import Path +import subprocess +import sys +import textwrap + +import numpy as np +import pytest + + +REPO_ROOT = Path(__file__).resolve().parents[3] +SAMPLE_VIDEO = ( + REPO_ROOT + / "demo_data" + / "cube_to_bowl_5" + / "videos" + / "chunk-000" + / "observation.images.front" + / "episode_000000.mp4" +) + + +@pytest.mark.serial +class TestImportSafety: + """Importing video utilities must not import or load torchcodec.""" + + def test_torchcodec_not_imported_at_module_level(self, serialize_subprocess_spawns): + code = textwrap.dedent("""\ + import sys + sys.modules.pop("torchcodec", None) + sys.modules.pop("torchcodec.decoders", None) + import gr00t.utils.video_utils + assert "torchcodec" not in sys.modules + assert "torchcodec.decoders" not in sys.modules + print("PASS") + """) + # Pin the child's torch/OpenMP pool to one thread so it doesn't + # oversubscribe an xdist-saturated CI box (the 120s-timeout flake). + env = os.environ.copy() + env.setdefault("OMP_NUM_THREADS", "1") + result = subprocess.run( + [sys.executable, "-c", code], + capture_output=True, + text=True, + env=env, + # Headroom for parallel CI (pytest-xdist -n auto): this child imports + # gr00t (torch et al.), which is slow when every worker is busy. + timeout=120, + ) + assert result.returncode == 0, ( + f"Subprocess failed:\nstdout: {result.stdout}\nstderr: {result.stderr}" + ) + assert "PASS" in result.stdout + + +@pytest.fixture(scope="module") +def sample_video_path() -> Path: + if not SAMPLE_VIDEO.exists(): + pytest.skip(f"sample video fixture not found at {SAMPLE_VIDEO}") + pytest.importorskip("torchcodec") + return SAMPLE_VIDEO + + +@pytest.mark.serial +class TestTorchcodecRoundtrip: + """Decode the sample fixture end-to-end through the public helpers.""" + + def test_get_frames_by_indices_returns_nhwc_uint8(self, sample_video_path: Path): + from gr00t.utils.video_utils import get_frames_by_indices + + frames = get_frames_by_indices(str(sample_video_path), [0, 5, 10]) + assert frames.shape == (3, 480, 640, 3) + assert frames.dtype == np.uint8 + assert not np.array_equal(frames[0], frames[1]) + + def test_get_frames_by_timestamps_returns_distinct_frames(self, sample_video_path: Path): + from gr00t.utils.video_utils import get_frames_by_timestamps + from torchcodec.decoders import VideoDecoder + + fps = float(VideoDecoder(str(sample_video_path)).metadata.average_fps) + # Timestamps at evenly-spaced frame boundaries — exercises the rounding + # path in get_frames_by_timestamps that corrects float-precision drift. + timestamps = [i / fps for i in (0, 5, 10)] + + frames = get_frames_by_timestamps(str(sample_video_path), timestamps) + assert frames.shape == (3, 480, 640, 3) + assert frames.dtype == np.uint8 + assert not np.array_equal(frames[0], frames[1]) + assert not np.array_equal(frames[1], frames[2]) + + def test_get_frames_by_timestamps_rejects_off_grid(self, sample_video_path: Path): + from gr00t.utils.video_utils import get_frames_by_timestamps + from torchcodec.decoders import VideoDecoder + + fps = float(VideoDecoder(str(sample_video_path)).metadata.average_fps) + # Explicitly off-grid (~50% between frames) — should fail the 1% + # tolerance check rather than silently snap to the wrong frame. + off_grid = [0.0, 1.0 / fps + 0.5 / fps] + with pytest.raises(ValueError, match="invalid timestamps"): + get_frames_by_timestamps(str(sample_video_path), off_grid) + + def test_get_all_frames_returns_full_sequence(self, sample_video_path: Path): + from gr00t.utils.video_utils import get_all_frames + from torchcodec.decoders import VideoDecoder + + expected_n = len(VideoDecoder(str(sample_video_path))) + frames, pts = get_all_frames(str(sample_video_path)) + assert frames.shape == (expected_n, 480, 640, 3) + assert pts.shape == (expected_n,) + # Timestamps must be strictly monotonic. + assert np.all(np.diff(pts) > 0) + + +class TestTorchcodecMissing: + """When torchcodec is absent, helpers must raise ImportError with an install hint.""" + + def test_build_decoder_raises_import_error(self, monkeypatch: pytest.MonkeyPatch): + import gr00t.utils.video_utils as vu + + def raise_missing(): + raise ImportError("torchcodec is required for video decoding.") + + monkeypatch.setattr(vu, "_get_video_decoder_cls", raise_missing) + with pytest.raises(ImportError, match="torchcodec is required"): + vu.get_frames_by_indices("dummy.mp4", [0]) + + def test_runtime_import_failure_is_wrapped(self, monkeypatch: pytest.MonkeyPatch): + import gr00t.utils.video_utils as vu + + real_import = builtins.__import__ + + def fail_torchcodec_import(name, *args, **kwargs): + if name == "torchcodec.decoders": + raise RuntimeError("failed to load FFmpeg") + return real_import(name, *args, **kwargs) + + monkeypatch.setattr(builtins, "__import__", fail_torchcodec_import) + # A native-load failure means torchcodec *is* installed, so the wrapped + # hint points at the FFmpeg-version mismatch (not "install torchcodec"), + # and the original error is preserved as the cause. + with pytest.raises(ImportError, match="native library could not be loaded") as exc_info: + vu._get_video_decoder_cls() + assert isinstance(exc_info.value.__cause__, RuntimeError) diff --git a/tests/gr00t/utils/test_video_decoder_error.py b/tests/gr00t/utils/test_video_decoder_error.py new file mode 100644 index 000000000..3cef8a32a --- /dev/null +++ b/tests/gr00t/utils/test_video_decoder_error.py @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Tests for torchcodec import-failure diagnostics in gr00t.utils.video_utils.""" + +from gr00t.utils.video_utils import _decoder_import_error + + +def test_ffmpeg_mismatch_message_is_actionable(): + """A native-load failure (RuntimeError) should be reported as an FFmpeg issue.""" + exc = RuntimeError( + "Could not load libtorchcodec. Likely causes: FFmpeg is not properly " + "installed. We support versions 4, 5, 6 and 7." + ) + err = _decoder_import_error(exc) + assert isinstance(err, ImportError) + msg = str(err) + assert "FFmpeg" in msg + assert "FFmpeg 8" in msg + # The original error is surfaced so the cause is not lost. + assert "Could not load libtorchcodec" in msg + + +def test_oserror_is_treated_as_load_failure(): + err = _decoder_import_error(OSError("libavutil.so.60: cannot open shared object file")) + assert isinstance(err, ImportError) + assert "FFmpeg" in str(err) + + +def test_missing_package_message_points_to_install(): + """A plain ImportError means torchcodec is not installed.""" + err = _decoder_import_error(ImportError("No module named 'torchcodec'")) + assert isinstance(err, ImportError) + # Pin the install branch via text unique to _TORCHCODEC_INSTALL_HINT; "install" + # alone also appears in the FFmpeg hint ("is installed", "conda install"). + assert "uv pip install torchcodec" in str(err) + assert "native library" not in str(err) diff --git a/tests/scripts/deployment/test_build_tensorrt_engine.py b/tests/scripts/deployment/test_build_tensorrt_engine.py new file mode 100644 index 000000000..2c9536916 --- /dev/null +++ b/tests/scripts/deployment/test_build_tensorrt_engine.py @@ -0,0 +1,417 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only regression tests for build_tensorrt_engine.build_full_pipeline. + +The full TRT build path is exercised by tests/scripts/deployment/test_trt_pipeline.py +under @pytest.mark.gpu. These tests cover the orchestration layer only: shape +inference, engine compilation, and the tensorrt / onnx imports themselves are +stubbed so the assertions run on any CPU host. + +Keep the stubs and the build_tensorrt_engine import inside the +build_full_pipeline fixture. Installing them at module top-level replaces +sys.modules["onnx"] for every pytest-xdist worker that collects this file, +including GPU workers, where the empty stub then crashes torch.onnx.export +inside the unrelated test_trt_full_pipeline. +""" + +from __future__ import annotations + +import os +import sys +import types +from unittest.mock import patch + +import pytest + + +_PIPELINE_ONNX_FILES = [ + # The full_pipeline exporter writes vit_fp32.onnx (ViT is FP32 for accuracy); + # build_full_pipeline prefers it over vit_bf16.onnx when both exist. Mirror + # that here so the per-component precision override is exercised. + "vit_fp32.onnx", + "llm_bf16.onnx", + "vl_self_attention.onnx", + "state_encoder.onnx", + "action_encoder.onnx", + "dit_bf16.onnx", + "action_decoder.onnx", +] + + +@pytest.fixture +def build_full_pipeline(monkeypatch): + """Yield build_full_pipeline with tensorrt/onnx stubbed in sys.modules. + + Every side effect goes through monkeypatch so it is reverted at teardown + and never leaks across tests collected by the same pytest-xdist worker. + """ + if "tensorrt" not in sys.modules: + trt_stub = types.ModuleType("tensorrt") + trt_stub.Logger = types.SimpleNamespace(WARNING=0, ERROR=1, INFO=2, VERBOSE=3) + monkeypatch.setitem(sys.modules, "tensorrt", trt_stub) + if "onnx" not in sys.modules: + monkeypatch.setitem(sys.modules, "onnx", types.ModuleType("onnx")) + + # scripts/deployment/ is not a package; mirror the pattern used by + # test_trt_pipeline.py so build_tensorrt_engine is importable. + deploy_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../scripts/deployment") + ) + monkeypatch.syspath_prepend(deploy_dir) + + from build_tensorrt_engine import build_full_pipeline as fn + + yield fn + + +def _seed_dummy_onnx_dir(onnx_dir): + """Touch every ONNX file build_full_pipeline iterates over.""" + onnx_dir.mkdir(parents=True, exist_ok=True) + for fname in _PIPELINE_ONNX_FILES: + (onnx_dir / fname).touch() + + +def _fake_build_engine_success(onnx_path, engine_path, **kwargs): + with open(engine_path, "wb"): + pass + + +def test_build_full_pipeline_raises_when_any_engine_fails(tmp_path, build_full_pipeline): + """Regression: a single sub-engine failure must not silently exit 0. + + Before the fix, build_full_pipeline caught all build_engine exceptions, logged + them into a results list, and returned without raising. main() therefore + exited 0 even though the engine directory was incomplete, and downstream + verify/benchmark steps were the first to notice. + """ + onnx_dir = tmp_path / "onnx" + engine_dir = tmp_path / "engines" + _seed_dummy_onnx_dir(onnx_dir) + + def fake_build_engine(onnx_path, engine_path, **kwargs): + if "llm" in os.path.basename(onnx_path): + raise RuntimeError("simulated TRT failure") + _fake_build_engine_success(onnx_path, engine_path) + + with ( + patch("build_tensorrt_engine.derive_shapes_with_hint", return_value=({}, {}, {})), + patch("build_tensorrt_engine.build_engine", side_effect=fake_build_engine), + pytest.raises(RuntimeError, match=r"1/\d+ engine\(s\) failed"), + ): + build_full_pipeline( + onnx_dir=str(onnx_dir), + engine_dir=str(engine_dir), + precision="bf16", + allow_default_hints=True, # orchestration test; metadata contract covered separately + ) + + +def test_build_full_pipeline_returns_normally_when_all_engines_build(tmp_path, build_full_pipeline): + """Happy path: every engine builds → no exception.""" + onnx_dir = tmp_path / "onnx" + engine_dir = tmp_path / "engines" + _seed_dummy_onnx_dir(onnx_dir) + + with ( + patch("build_tensorrt_engine.derive_shapes_with_hint", return_value=({}, {}, {})), + patch("build_tensorrt_engine.build_engine", side_effect=_fake_build_engine_success), + ): + build_full_pipeline( + onnx_dir=str(onnx_dir), + engine_dir=str(engine_dir), + precision="bf16", + allow_default_hints=True, # orchestration test; metadata contract covered separately + ) + + +def test_build_full_pipeline_raises_when_all_onnx_inputs_missing(tmp_path, build_full_pipeline): + """Empty ONNX dir must raise instead of producing zero engines and exiting 0.""" + onnx_dir = tmp_path / "onnx_missing" + onnx_dir.mkdir() + engine_dir = tmp_path / "engines" + + with ( + patch("build_tensorrt_engine.derive_shapes_with_hint", return_value=({}, {}, {})), + patch("build_tensorrt_engine.build_engine", side_effect=_fake_build_engine_success), + pytest.raises( + RuntimeError, + match=rf"{len(_PIPELINE_ONNX_FILES)}/{len(_PIPELINE_ONNX_FILES)} component\(s\) had no ONNX input", + ), + ): + build_full_pipeline( + onnx_dir=str(onnx_dir), + engine_dir=str(engine_dir), + precision="bf16", + allow_default_hints=True, # orchestration test; metadata contract covered separately + ) + + assert not engine_dir.exists() or not list(engine_dir.iterdir()) + + +def test_build_full_pipeline_raises_when_some_onnx_inputs_missing(tmp_path, build_full_pipeline): + """Partially-populated ONNX dir must raise; "full pipeline" means full.""" + onnx_dir = tmp_path / "onnx_partial" + onnx_dir.mkdir() + seeded = _PIPELINE_ONNX_FILES[:5] + missing = _PIPELINE_ONNX_FILES[5:] + for fname in seeded: + (onnx_dir / fname).touch() + engine_dir = tmp_path / "engines" + + with ( + patch("build_tensorrt_engine.derive_shapes_with_hint", return_value=({}, {}, {})), + patch("build_tensorrt_engine.build_engine", side_effect=_fake_build_engine_success), + pytest.raises( + RuntimeError, + match=rf"{len(missing)}/{len(_PIPELINE_ONNX_FILES)} component\(s\) had no ONNX input", + ), + ): + build_full_pipeline( + onnx_dir=str(onnx_dir), + engine_dir=str(engine_dir), + precision="bf16", + allow_default_hints=True, # orchestration test; metadata contract covered separately + ) + + +def test_build_full_pipeline_error_mentions_both_skips_and_failures(tmp_path, build_full_pipeline): + """When components both skip AND fail, the exception message lists both reasons.""" + onnx_dir = tmp_path / "onnx" + onnx_dir.mkdir() + skipped_file = "llm_bf16.onnx" + failing_file = "dit_bf16.onnx" + for fname in _PIPELINE_ONNX_FILES: + if fname == skipped_file: + continue + (onnx_dir / fname).touch() + engine_dir = tmp_path / "engines" + + def fake_build(onnx_path, engine_path, **kwargs): + if os.path.basename(onnx_path) == failing_file: + raise RuntimeError("simulated TRT failure") + _fake_build_engine_success(onnx_path, engine_path) + + with ( + patch("build_tensorrt_engine.derive_shapes_with_hint", return_value=({}, {}, {})), + patch("build_tensorrt_engine.build_engine", side_effect=fake_build), + ): + with pytest.raises(RuntimeError) as exc_info: + build_full_pipeline( + onnx_dir=str(onnx_dir), + engine_dir=str(engine_dir), + precision="bf16", + allow_default_hints=True, # orchestration test; metadata contract covered separately + ) + + message = str(exc_info.value) + assert "engine(s) failed" in message, message + assert "had no ONNX input" in message, message + + +# --------------------------------------------------------------------------- +# STRONGLY_TYPED precision sanity check +# --------------------------------------------------------------------------- +# +# Under STRONGLY_TYPED (TRT 10+), precision is read from the ONNX tensor +# types and --precision builder flags are ignored. These tests verify that +# _check_strongly_typed_precision_match fails fast when --precision cannot be +# honored by the network instead of silently building a mismatched engine. + + +@pytest.fixture +def check_precision_match(build_full_pipeline): # noqa: ARG001 — share stub setup + """Return the _check_strongly_typed_precision_match helper from the module.""" + from build_tensorrt_engine import _check_strongly_typed_precision_match + + return _check_strongly_typed_precision_match + + +def test_strongly_typed_precision_match_passes_for_pure_match(check_precision_match): + """bf16 request against a pure-BF16 network is fine.""" + check_precision_match({"BF16"}, "bf16") + + +def test_strongly_typed_precision_match_passes_for_mixed_network(check_precision_match): + """The real exporter produces a mixed graph (ViT FP32, rest BF16); bf16 still matches.""" + check_precision_match({"BF16", "FLOAT"}, "bf16") + + +@pytest.mark.parametrize( + ("network_dtypes", "requested"), + [ + ({"BF16"}, "fp16"), + ({"BF16", "FLOAT"}, "fp16"), + ({"FLOAT"}, "bf16"), + ({"BF16"}, "fp8"), + # fp32 against the real-pipeline mixed graph (ViT FP32, rest BF16): + # FLOAT is present so the basic "expected dtype must be in network" + # check passes, but STRONGLY_TYPED won't promote BF16 to FLOAT, so + # the engine would silently mix precisions. The fp32 branch in + # _check_strongly_typed_precision_match catches this explicitly. + ({"BF16", "FLOAT"}, "fp32"), + ({"HALF", "FLOAT"}, "fp32"), + ({"FP8", "FLOAT"}, "fp32"), + ], +) +def test_strongly_typed_precision_match_raises_on_mismatch( + check_precision_match, network_dtypes, requested +): + """A --precision the STRONGLY_TYPED network cannot honor must raise, not pass silently.""" + with pytest.raises(ValueError, match="cannot be honored"): + check_precision_match(network_dtypes, requested) + + +def test_strongly_typed_precision_match_rejects_unknown_token(check_precision_match): + """A typo like --precision=int8 should fail loudly, not be treated as 'no match'.""" + with pytest.raises(ValueError, match="Unknown precision"): + check_precision_match({"BF16"}, "int8") + + +# --------------------------------------------------------------------------- +# Per-component precision override +# --------------------------------------------------------------------------- +# +# build_full_pipeline must mirror the export's mixed-precision layout +# (ViT FP32, every other component BF16) instead of forwarding the +# pipeline-wide --precision to all engines. Without this, building the +# ViT engine from vit_fp32.onnx with --precision=bf16 trips the +# STRONGLY_TYPED sanity check above and the whole pipeline fails. + + +@pytest.fixture +def precision_from_onnx_path(build_full_pipeline): # noqa: ARG001 — share stub setup + """Return the _precision_from_onnx_path helper from the module.""" + from build_tensorrt_engine import _precision_from_onnx_path + + return _precision_from_onnx_path + + +@pytest.mark.parametrize( + ("path", "expected"), + [ + ("/some/dir/vit_fp32.onnx", "fp32"), + ("vit_bf16.onnx", "bf16"), + ("dit_bf16.onnx", "bf16"), + ("llm_bf16.onnx", "bf16"), + ("model_fp16.onnx", "fp16"), + ("model_fp8.onnx", "fp8"), + ], +) +def test_precision_from_onnx_path_reads_filename_suffix(precision_from_onnx_path, path, expected): + """Recognized suffix overrides the pipeline default.""" + assert precision_from_onnx_path(path, default="bf16") == expected + + +@pytest.mark.parametrize( + "path", + [ + "state_encoder.onnx", + "action_encoder.onnx", + "vl_self_attention.onnx", + "action_decoder.onnx", + "/abs/path/with_no_precision_suffix.onnx", + ], +) +def test_precision_from_onnx_path_falls_back_to_default(precision_from_onnx_path, path): + """No recognized suffix → return the pipeline default unchanged.""" + assert precision_from_onnx_path(path, default="bf16") == "bf16" + assert precision_from_onnx_path(path, default="fp32") == "fp32" + + +def test_build_full_pipeline_passes_per_component_precision(tmp_path, build_full_pipeline): + """ViT is built FP32, every other component inherits the pipeline default. + + The real exporter writes vit_fp32.onnx (FLOAT IO), so the ViT engine must + be built with precision=fp32 to satisfy the STRONGLY_TYPED sanity check, + while every other component uses the pipeline-wide default (bf16). + """ + onnx_dir = tmp_path / "onnx" + engine_dir = tmp_path / "engines" + _seed_dummy_onnx_dir(onnx_dir) + + seen_precisions: dict[str, str] = {} + + def fake_build_engine(onnx_path, engine_path, precision, **kwargs): + seen_precisions[os.path.basename(onnx_path)] = precision + _fake_build_engine_success(onnx_path, engine_path) + + with ( + patch("build_tensorrt_engine.derive_shapes_with_hint", return_value=({}, {}, {})), + patch("build_tensorrt_engine.build_engine", side_effect=fake_build_engine), + ): + build_full_pipeline( + onnx_dir=str(onnx_dir), + engine_dir=str(engine_dir), + precision="bf16", + allow_default_hints=True, # orchestration test; metadata contract covered separately + ) + + assert seen_precisions["vit_fp32.onnx"] == "fp32", ( + f"ViT must be built as fp32 to match its STRONGLY_TYPED FLOAT IO " + f"(saw precision={seen_precisions['vit_fp32.onnx']!r})" + ) + for fname in ( + "llm_bf16.onnx", + "dit_bf16.onnx", + "vl_self_attention.onnx", + "state_encoder.onnx", + "action_encoder.onnx", + "action_decoder.onnx", + ): + assert seen_precisions[fname] == "bf16", ( + f"{fname} should inherit the pipeline default precision=bf16 " + f"(saw {seen_precisions[fname]!r})" + ) + + +def test_build_full_pipeline_falls_back_to_vit_bf16_when_fp32_missing( + tmp_path, build_full_pipeline +): + """If only vit_bf16.onnx is on disk, ViT picks up the pipeline default (bf16).""" + onnx_dir = tmp_path / "onnx" + engine_dir = tmp_path / "engines" + onnx_dir.mkdir(parents=True) + # No vit_fp32.onnx — exercise the build_full_pipeline fallback branch. + fallback_files = [ + "vit_bf16.onnx", + "llm_bf16.onnx", + "vl_self_attention.onnx", + "state_encoder.onnx", + "action_encoder.onnx", + "dit_bf16.onnx", + "action_decoder.onnx", + ] + for fname in fallback_files: + (onnx_dir / fname).touch() + + seen_precisions: dict[str, str] = {} + + def fake_build_engine(onnx_path, engine_path, precision, **kwargs): + seen_precisions[os.path.basename(onnx_path)] = precision + _fake_build_engine_success(onnx_path, engine_path) + + with ( + patch("build_tensorrt_engine.derive_shapes_with_hint", return_value=({}, {}, {})), + patch("build_tensorrt_engine.build_engine", side_effect=fake_build_engine), + ): + build_full_pipeline( + onnx_dir=str(onnx_dir), + engine_dir=str(engine_dir), + precision="bf16", + allow_default_hints=True, # orchestration test; metadata contract covered separately + ) + + assert seen_precisions["vit_bf16.onnx"] == "bf16" diff --git a/tests/scripts/deployment/test_dit_only_forward_signature.py b/tests/scripts/deployment/test_dit_only_forward_signature.py new file mode 100644 index 000000000..19cc07559 --- /dev/null +++ b/tests/scripts/deployment/test_dit_only_forward_signature.py @@ -0,0 +1,74 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Pin the ``--export-mode dit_only`` forward-method signature contract. + +The TRT ``dit_only`` setup monkey-patches ``action_head.get_action_with_features``. +``Gr00tN1d7.get_action`` invokes that method with the *full* keyword set +(``action_input`` / ``options`` included); a drift where the patch drops those +keywords compiles fine but explodes at verify/inference time with a +``TypeError: ... got an unexpected keyword argument 'action_input'`` — the only +legacy TRT mode. This test reproduces the contract without a GPU or TRT engine +by stubbing ``Engine``, so the signature can't silently drift again. +""" + +from __future__ import annotations + +import inspect +import os +import sys +import types + +import pytest + + +DEPLOY_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../scripts/deployment")) +if DEPLOY_DIR not in sys.path: + sys.path.insert(0, DEPLOY_DIR) + +# Keywords Gr00tN1d7.get_action() forwards to get_action_with_features(). +GET_ACTION_WITH_FEATURES_KWARGS = ( + "backbone_features", + "state_features", + "embodiment_id", + "backbone_output", + "action_input", + "options", +) + + +@pytest.fixture(scope="module") +def trt_model_forward(): + try: + import trt_model_forward as mod # noqa: E402 + except (ImportError, OSError) as e: # torch/tensorrt or native CUDA libs absent on CPU CI + pytest.skip(f"trt_model_forward not importable in this env: {e}") + return mod + + +def test_dit_only_patch_binds_get_action_caller_kwargs(trt_model_forward, monkeypatch): + """``_setup_dit_only`` must install a forward that binds every keyword + ``get_action`` passes — otherwise verify/inference crashes.""" + monkeypatch.setattr(trt_model_forward, "Engine", lambda *a, **k: object()) + monkeypatch.setattr(trt_model_forward.torch.cuda, "empty_cache", lambda: None) + + action_head = types.SimpleNamespace(model=object()) + policy = types.SimpleNamespace(model=types.SimpleNamespace(action_head=action_head)) + + trt_model_forward._setup_dit_only(policy, "/tmp/does-not-exist") + + sig = inspect.signature(action_head.get_action_with_features) + # Raises TypeError on the pre-fix 4-arg signature; binds cleanly once fixed. + sig.bind(**{name: None for name in GET_ACTION_WITH_FEATURES_KWARGS}) diff --git a/tests/scripts/deployment/test_export_onnx_legacy_exporter.py b/tests/scripts/deployment/test_export_onnx_legacy_exporter.py new file mode 100644 index 000000000..0adc0032a --- /dev/null +++ b/tests/scripts/deployment/test_export_onnx_legacy_exporter.py @@ -0,0 +1,90 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only checks for the N1.7 TRT deployment scripts.""" + +from __future__ import annotations + +import ast +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[3] +EXPORT_SCRIPT = ROOT / "scripts" / "deployment" / "export_onnx_n1d7.py" +BUILD_PIPELINE_SCRIPT = ROOT / "scripts" / "deployment" / "build_trt_pipeline.py" +MODES_SCRIPT = ROOT / "gr00t" / "deployment" / "modes.py" + + +def _is_torch_onnx_export(call: ast.Call) -> bool: + func = call.func + return ( + isinstance(func, ast.Attribute) + and func.attr == "export" + and isinstance(func.value, ast.Attribute) + and func.value.attr == "onnx" + and isinstance(func.value.value, ast.Name) + and func.value.value.id == "torch" + ) + + +def test_all_onnx_exports_use_legacy_exporter_explicitly() -> None: + """N1.7 TRT export relies on dynamic_axes; keep legacy export explicit.""" + + tree = ast.parse(EXPORT_SCRIPT.read_text()) + missing = [] + + for node in ast.walk(tree): + if not isinstance(node, ast.Call) or not _is_torch_onnx_export(node): + continue + dynamo_kw = next((kw for kw in node.keywords if kw.arg == "dynamo"), None) + has_legacy_exporter = ( + dynamo_kw is not None + and isinstance(dynamo_kw.value, ast.Constant) + and dynamo_kw.value.value is False + ) + if not has_legacy_exporter: + missing.append(node.lineno) + + assert not missing, f"torch.onnx.export calls must pass dynamo=False: lines {missing}" + + +def test_dit_only_pipeline_uses_dit_only_verifier() -> None: + """A single DiT engine cannot be verified through the four-engine action-head path.""" + + from gr00t.deployment.modes import PIPELINE_STAGE_MODES, ExportMode, VerifyMode + + # build_trt_pipeline imports this table as _MODE_MAP from the SoT module. + _build, verify_mode, _bench = PIPELINE_STAGE_MODES[ExportMode.dit_only] + assert verify_mode == VerifyMode.dit_only + + +def test_verify_mode_accepts_dit_only_mode() -> None: + """The unified pipeline can route dit_only export into verify_n1d7_trt.py.""" + + tree = ast.parse(MODES_SCRIPT.read_text()) + verify_modes = set() + + for node in ast.walk(tree): + if not isinstance(node, ast.ClassDef) or node.name != "VerifyMode": + continue + for stmt in node.body: + if ( + isinstance(stmt, ast.Assign) + and len(stmt.targets) == 1 + and isinstance(stmt.targets[0], ast.Name) + ): + verify_modes.add(stmt.targets[0].id) + + assert "dit_only" in verify_modes diff --git a/tests/scripts/deployment/test_export_vit_rotary.py b/tests/scripts/deployment/test_export_vit_rotary.py new file mode 100644 index 000000000..54d77d95c --- /dev/null +++ b/tests/scripts/deployment/test_export_vit_rotary.py @@ -0,0 +1,135 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only oracle tests for the ViT ONNX export rotary path. + +Covers two silent-failure risks in ``scripts/deployment/export_onnx_n1d7.py`` +whose only existing coverage is a backend-vs-backend cosine fingerprint (blind to +common-mode error): + +- ``_apply_rotary_real`` re-implements the vision rotary application with + real-valued ops. An independent closed-form (complex-arithmetic) oracle pins it, + so a rotate-half / sign / precision drift is caught. +- The exporter freezes ``rot_pos_emb``-derived cos/sin built from a non-persistent + ``inv_freq`` buffer. ``_assert_vision_rotary_matches_analytic`` must abort the + export when that buffer drifts from the analytic value. + +No checkpoint download or GPU is required. +""" + +from __future__ import annotations + +import os +import sys + +import pytest +import torch + + +DEPLOY_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../scripts/deployment")) +if DEPLOY_DIR not in sys.path: + sys.path.insert(0, DEPLOY_DIR) + +export = pytest.importorskip("export_onnx_n1d7") +qwen3_vl = pytest.importorskip("transformers.models.qwen3_vl.modeling_qwen3_vl") +qwen3_vl_config = pytest.importorskip("transformers.models.qwen3_vl.configuration_qwen3_vl") + + +Qwen3VLVisionConfig = qwen3_vl_config.Qwen3VLVisionConfig +Qwen3VLVisionRotaryEmbedding = qwen3_vl.Qwen3VLVisionRotaryEmbedding + + +# --- _apply_rotary_real closed-form parity -------------------------------- + + +def _complex_oracle_apply_rotary( + x: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor +) -> torch.Tensor: + """Independent rotary application via complex multiplication (float64). + + The production path is ``out = x * cos + rotate_half(x) * sin`` with + ``rotate_half(x) = [-x2, x1]``. For the vision embeddings (``emb = + cat(freqs, freqs)``, so the two cos/sin halves are equal) that is exactly the + complex product ``(x1 + i x2) * (cos + i sin)`` re-split into ``[real, imag]`` + -- a genuinely different implementation, so a shared bug cannot hide. + """ + half = x.shape[-1] // 2 + x1 = x[..., :half].double() + x2 = x[..., half:].double() + c = cos[..., :half].double().unsqueeze(1) + s = sin[..., :half].double().unsqueeze(1) + z = torch.complex(x1, x2) * torch.complex(c, s) + return torch.cat([z.real, z.imag], dim=-1) + + +def test_apply_rotary_real_matches_complex_oracle(): + torch.manual_seed(0) + seq, heads, half = 7, 3, 4 + x = torch.randn(seq, heads, 2 * half) + freqs = torch.randn(seq, half) + emb = torch.cat([freqs, freqs], dim=-1) # how the exporter builds cos/sin + cos, sin = emb.cos(), emb.sin() + + got = export._apply_rotary_real(x, cos, sin).double() + expected = _complex_oracle_apply_rotary(x, cos, sin) + + assert got.shape == x.shape + # _apply_rotary_real computes in float32 (to match the exported path), while the + # oracle is float64, so tolerate float32-level rounding rather than exact equality. + assert torch.allclose(got, expected, atol=1e-5, rtol=1e-5) + + +def test_apply_rotary_real_identity_at_zero_angle(): + # cos=1, sin=0 (freqs=0) must be a no-op, whatever the rotate_half layout is. + x = torch.randn(5, 2, 8) + cos = torch.ones(5, 8) + sin = torch.zeros(5, 8) + assert torch.allclose(export._apply_rotary_real(x, cos, sin), x, atol=1e-6) + + +# --- export-time rotary analytic oracle ----------------------------------- + + +def _vision_config() -> Qwen3VLVisionConfig: + return Qwen3VLVisionConfig(hidden_size=32, num_heads=4) # head_dim = 8 + + +def _fake_vision(dim: int) -> torch.nn.Module: + vision = torch.nn.Module() + vision.rotary_pos_emb = Qwen3VLVisionRotaryEmbedding(dim) + return vision + + +def test_rotary_oracle_passes_for_correct_inv_freq(): + cfg = _vision_config() + dim = (cfg.hidden_size // cfg.num_heads) // 2 + vision = _fake_vision(dim) # fresh module -> analytic inv_freq + export._assert_vision_rotary_matches_analytic(vision, cfg) # must not raise + + +def test_rotary_oracle_raises_on_corrupt_inv_freq(): + cfg = _vision_config() + dim = (cfg.hidden_size // cfg.num_heads) // 2 + vision = _fake_vision(dim) + rotary = vision.rotary_pos_emb + rotary.inv_freq = rotary.inv_freq + 1.0 # drift from the analytic value + with pytest.raises(RuntimeError, match="diverges from the analytic oracle"): + export._assert_vision_rotary_matches_analytic(vision, cfg) + + +def test_rotary_oracle_raises_when_layout_missing(): + vision = torch.nn.Module() # no rotary_pos_emb attribute at all + with pytest.raises(RuntimeError, match="not found"): + export._assert_vision_rotary_matches_analytic(vision, _vision_config()) diff --git a/tests/scripts/deployment/test_install_deps_cleanup_trap.py b/tests/scripts/deployment/test_install_deps_cleanup_trap.py new file mode 100644 index 000000000..86fac1750 --- /dev/null +++ b/tests/scripts/deployment/test_install_deps_cleanup_trap.py @@ -0,0 +1,139 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Regression tests for deployment installer /tmp source-build cleanup traps. + +The Spark and Jetson install_deps.sh scripts source-build under /tmp. +Before this guard, a failure in `pip install` left +/tmp/flash-attn or /tmp/torchcodec behind because `set -e` aborted the +script before the explicit cleanup ran. The next install on the same +host (CI runner / Docker build cache / dev machine) would then silently +reuse the stale clone. + +These tests extract the exact trap prelude from the real installer +scripts and replay it inside a controlled subprocess, asserting that +registered build dirs are removed on both successful exit AND on +forced mid-build failure. +""" + +from __future__ import annotations + +from pathlib import Path +import re +import subprocess + +import pytest + + +REPO_ROOT = Path(__file__).resolve().parents[3] +INSTALLER_SCRIPTS = { + "spark": REPO_ROOT / "scripts/deployment/spark/install_deps.sh", + "jetson": REPO_ROOT / "scripts/deployment/jetson/install_deps.sh", +} + + +def _extract_trap_prelude(script_path: Path) -> str: + """Pull the trap-cleanup prelude bytes verbatim from the real installer. + + Anchors on the substring between `set -euo pipefail` and the first + `SCRIPT_DIR=` line. + """ + text = script_path.read_text() + match = re.search(r"(set -euo pipefail.*?)^SCRIPT_DIR=", text, re.DOTALL | re.MULTILINE) + assert match is not None, f"Expected the standard prelude in {script_path}" + return match.group(1) + + +def _run_with_prelude(prelude: str, body: str, tmp_path: Path) -> subprocess.CompletedProcess: + """Run `prelude + body` under bash and capture the result. + + The prelude registers the trap; the body is the test-specific scenario + (success / failure / multiple dirs). The body is responsible for + appending any dirs it cares about to TMP_BUILD_DIRS. + """ + script = tmp_path / "harness.sh" + script.write_text("#!/bin/bash\n" + prelude + "\n" + body + "\n") + script.chmod(0o755) + return subprocess.run(["bash", str(script)], capture_output=True, text=True, timeout=30) + + +@pytest.mark.parametrize("name", list(INSTALLER_SCRIPTS)) +def test_trap_cleans_tmp_dir_on_success(name: str, tmp_path: Path) -> None: + """Healthy path: build dir is registered, work succeeds, trap removes it.""" + prelude = _extract_trap_prelude(INSTALLER_SCRIPTS[name]) + build_dir = tmp_path / "stale-build" + body = f""" +mkdir -p "{build_dir}" +TMP_BUILD_DIRS+=("{build_dir}") +echo "build complete" +""" + result = _run_with_prelude(prelude, body, tmp_path) + assert result.returncode == 0, result.stderr + assert not build_dir.exists(), ( + f"Build dir {build_dir} survived a successful run — trap did not fire" + ) + + +@pytest.mark.parametrize("name", list(INSTALLER_SCRIPTS)) +def test_trap_cleans_tmp_dir_on_set_e_abort(name: str, tmp_path: Path) -> None: + """The bug this MR fixes: `set -e` aborts mid-build, dir must still be cleaned.""" + prelude = _extract_trap_prelude(INSTALLER_SCRIPTS[name]) + build_dir = tmp_path / "failed-build" + body = f""" +mkdir -p "{build_dir}" +TMP_BUILD_DIRS+=("{build_dir}") +false # simulate `pip install` blowing up under `set -e` +echo "this line never runs" +""" + result = _run_with_prelude(prelude, body, tmp_path) + assert result.returncode != 0, "Harness should have aborted on `false`" + assert not build_dir.exists(), ( + f"Build dir {build_dir} survived a failed run — exactly the leak this MR fixes" + ) + + +@pytest.mark.parametrize("name", list(INSTALLER_SCRIPTS)) +def test_trap_handles_empty_array(name: str, tmp_path: Path) -> None: + """Trap fires at script exit even when no dirs were ever registered. + + Guards against an early-exit path (e.g. arch validation, prebuilt wheel + branch) leaving TMP_BUILD_DIRS empty. The trap must not crash on an + unset/empty array under `set -u`. + """ + prelude = _extract_trap_prelude(INSTALLER_SCRIPTS[name]) + body = 'echo "early exit, never appended"' + result = _run_with_prelude(prelude, body, tmp_path) + assert result.returncode == 0, ( + f"Empty-array exit crashed under `set -u`:\nstdout={result.stdout}\nstderr={result.stderr}" + ) + + +def test_trap_cleans_multiple_dirs_on_failure(tmp_path: Path) -> None: + """Spark builds two /tmp dirs (flash-attn + torchcodec); both must clean.""" + prelude = _extract_trap_prelude(INSTALLER_SCRIPTS["spark"]) + dir_a = tmp_path / "flash-attn" + dir_b = tmp_path / "torchcodec" + body = f""" +mkdir -p "{dir_a}" +TMP_BUILD_DIRS+=("{dir_a}") +echo "flash-attn build done" +mkdir -p "{dir_b}" +TMP_BUILD_DIRS+=("{dir_b}") +false # second build fails; first build dir must still get cleaned +""" + result = _run_with_prelude(prelude, body, tmp_path) + assert result.returncode != 0 + assert not dir_a.exists(), f"{dir_a} leaked when later step failed" + assert not dir_b.exists(), f"{dir_b} leaked when its own step failed" diff --git a/tests/scripts/deployment/test_pipeline_modes_consistency.py b/tests/scripts/deployment/test_pipeline_modes_consistency.py new file mode 100644 index 000000000..3b1f4ccf1 --- /dev/null +++ b/tests/scripts/deployment/test_pipeline_modes_consistency.py @@ -0,0 +1,113 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Pin the structural mode-flag SOT in :mod:`gr00t.deployment.modes`. + +Every deployment CLI mode field must *be* its SOT enum (not a re-inlined +``Literal`` or ad-hoc enum). With each CLI importing its enum, cross-file drift +is no longer expressible; this test guards against a future regression that +re-inlines the choices. +""" + +from __future__ import annotations + +import os +import sys +from typing import get_type_hints + +from gr00t.deployment.modes import ( + BenchmarkMode, + BuildEngineMode, + ExportMode, + InferenceMode, + VerifyMode, +) +import pytest + + +@pytest.fixture(scope="module") +def deploy_imports(): + """Make ``scripts/deployment`` importable; the directory is not a + package and relies on runtime ``sys.path`` insertion.""" + deploy_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../scripts/deployment") + ) + if deploy_dir not in sys.path: + sys.path.insert(0, deploy_dir) + + return deploy_dir + + +# --------------------------------------------------------------------------- +# Each CLI field must *be* its SOT enum (no re-inlined Literal / ad-hoc enum) +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + "module_name, cls_name, field_name, mode_enum", + [ + ("export_onnx_n1d7", "ExportConfig", "export_mode", ExportMode), + ("build_trt_pipeline", "PipelineConfig", "export_mode", ExportMode), + ("verify_n1d7_trt", "VerifyConfig", "mode", VerifyMode), + ("benchmark_inference", "BenchmarkConfig", "trt_mode", BenchmarkMode), + ("build_tensorrt_engine", "BuildConfig", "mode", BuildEngineMode), + ], +) +def test_cli_mode_field_is_sot_enum(deploy_imports, module_name, cls_name, field_name, mode_enum): + """A CLI whose mode field is not its SOT enum has reverted to an ad-hoc + ``Literal``/enum — re-import the enum instead.""" + try: + mod = __import__(module_name) + except (ImportError, OSError) as e: # torch/tensorrt or native CUDA libs absent on CPU CI + pytest.skip(f"{module_name} not importable in this env: {e}") + cfg_cls = getattr(mod, cls_name, None) + if cfg_cls is None: + pytest.skip(f"{module_name} has no attribute {cls_name!r}") + + resolved = get_type_hints(cfg_cls)[field_name] + assert resolved is mode_enum, ( + f"{module_name}.{cls_name}.{field_name} is annotated {resolved!r}, not the SOT enum " + f"{mode_enum.__name__}. Import the enum from gr00t.deployment.modes instead of " + "re-declaring a Literal or ad-hoc enum." + ) + + +def test_rollout_trt_mode_is_inference_mode(): + """The sim-eval ``--trt-mode`` feeds ``setup_tensorrt_engines``, so it must be + the shared ``InferenceMode`` SOT rather than a re-declared local enum.""" + try: + from gr00t.eval import rollout_policy + except (ImportError, OSError) as e: # gymnasium / torch / sim deps absent on CPU CI + pytest.skip(f"rollout_policy not importable in this env: {e}") + + resolved = get_type_hints(rollout_policy.RolloutConfig)["trt_mode"] + assert resolved is InferenceMode, ( + f"rollout_policy.RolloutConfig.trt_mode is annotated {resolved!r}, not InferenceMode. " + "Import it from gr00t.deployment.modes instead of re-declaring a local enum." + ) + + +def test_setup_tensorrt_engines_dispatch_matches_inference_mode(deploy_imports): + """``setup_tensorrt_engines`` must dispatch on exactly the ``InferenceMode`` + members — neither an unhandled mode nor an orphaned setup branch.""" + try: + mod = __import__("trt_model_forward") + except (ImportError, OSError) as e: # torch / tensorrt absent on CPU CI + pytest.skip(f"trt_model_forward not importable in this env: {e}") + + assert set(mod._INFERENCE_MODE_DISPATCH) == set(InferenceMode), ( + "trt_model_forward._INFERENCE_MODE_DISPATCH and InferenceMode have drifted; " + "every mode needs a setup branch and vice-versa." + ) diff --git a/tests/scripts/deployment/test_resolve_vit_engine_path.py b/tests/scripts/deployment/test_resolve_vit_engine_path.py new file mode 100644 index 000000000..b957f7e45 --- /dev/null +++ b/tests/scripts/deployment/test_resolve_vit_engine_path.py @@ -0,0 +1,114 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Regression tests for ``_resolve_vit_engine_path``. + +Older builds named the ViT engine ``vit_bf16.engine`` regardless of +the source ONNX dtype — misleading whenever the FP32 ONNX path was +taken. New builds emit ``vit.engine``; the resolver bridges both names +during the rollout so existing engine directories keep working. +""" + +from __future__ import annotations + +import logging +import os +from pathlib import Path +import sys +import types + +import pytest + + +DEPLOY_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../scripts/deployment")) + + +@pytest.fixture +def resolve_vit_engine_path(monkeypatch): + """Yield ``_resolve_vit_engine_path`` with heavy deps stubbed in ``sys.modules``. + + Every side effect goes through ``monkeypatch`` so it is reverted at + teardown and never leaks across tests collected by the same pytest-xdist + worker. Installing these stubs at module top-level (the previous form of + this file) replaces ``sys.modules['trt_torch'].Engine`` with ``object``; + if the same worker later runs ``test_trt_full_pipeline``, ``Engine(path)`` + raises ``TypeError: object() takes no arguments``. The same lesson is + spelled out in ``tests/scripts/deployment/test_build_tensorrt_engine.py``. + + Forcing a fresh import of ``trt_model_forward`` is part of the contract: + if a prior test imported it against the real ``trt_torch``, the cached + module would still hold the real ``Engine`` symbol; if a prior test left + it cached against a stub, the cached module would still hold ``object``. + Re-importing under our currently-installed stub keeps the binding honest. + """ + if "torch" not in sys.modules: + torch_stub = types.ModuleType("torch") + # ``trt_model_forward`` annotates helpers with ``torch.Tensor``; + # the annotation is evaluated at import time, so the stub has to + # expose *something* at that name even when we never call into it. + torch_stub.Tensor = type("Tensor", (), {}) + monkeypatch.setitem(sys.modules, "torch", torch_stub) + if "transformers" not in sys.modules: + monkeypatch.setitem(sys.modules, "transformers", types.ModuleType("transformers")) + feat = types.ModuleType("transformers.feature_extraction_utils") + feat.BatchFeature = object + monkeypatch.setitem(sys.modules, "transformers.feature_extraction_utils", feat) + if "trt_torch" not in sys.modules: + trt_torch_stub = types.ModuleType("trt_torch") + trt_torch_stub.Engine = object + monkeypatch.setitem(sys.modules, "trt_torch", trt_torch_stub) + + monkeypatch.syspath_prepend(DEPLOY_DIR) + monkeypatch.delitem(sys.modules, "trt_model_forward", raising=False) + + from trt_model_forward import _resolve_vit_engine_path as fn + + yield fn + + +def test_prefers_new_name_when_present(tmp_path: Path, resolve_vit_engine_path) -> None: + """If both files exist, the precision-neutral name wins.""" + (tmp_path / "vit.engine").write_bytes(b"new") + (tmp_path / "vit_bf16.engine").write_bytes(b"legacy") + assert resolve_vit_engine_path(str(tmp_path)) == str(tmp_path / "vit.engine") + + +def test_falls_back_to_legacy_with_warning(tmp_path: Path, caplog, resolve_vit_engine_path) -> None: + """Existing engine dirs built before this MR still load, with a nudge to rebuild.""" + (tmp_path / "vit_bf16.engine").write_bytes(b"legacy") + + with caplog.at_level(logging.WARNING): + path = resolve_vit_engine_path(str(tmp_path)) + + assert path == str(tmp_path / "vit_bf16.engine") + assert any( + "legacy" in rec.message and "rebuild" in rec.message.lower() for rec in caplog.records + ), "Expected a warning prompting a rebuild; got: " + repr( + [rec.message for rec in caplog.records] + ) + + +def test_returns_canonical_path_when_neither_exists( + tmp_path: Path, resolve_vit_engine_path +) -> None: + """No engine yet → return the new-style name so any 'not found' error is canonical.""" + assert resolve_vit_engine_path(str(tmp_path)) == str(tmp_path / "vit.engine") + + +@pytest.mark.parametrize("present", ["vit.engine", "vit_bf16.engine"]) +def test_returns_existing_file_path(present: str, tmp_path: Path, resolve_vit_engine_path) -> None: + """Either filename, alone, returns its own path.""" + (tmp_path / present).write_bytes(b"x") + assert resolve_vit_engine_path(str(tmp_path)) == str(tmp_path / present) diff --git a/tests/scripts/deployment/test_standalone_inference.py b/tests/scripts/deployment/test_standalone_inference.py new file mode 100644 index 000000000..22f562485 --- /dev/null +++ b/tests/scripts/deployment/test_standalone_inference.py @@ -0,0 +1,299 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +Standalone inference smoke tests. + +Loads Gr00tPolicy and LeRobotEpisodeLoader once per embodiment variant (module-scoped +fixture), then calls the internal Python functions directly — no subprocess overhead. + +Variants exercised: LIBERO, DROID, SimplerEnv-Fractal, SimplerEnv-Bridge. + +Environment variables (optional, per-embodiment): + INFERENCE_TEST_LIBERO_MODEL_PATH – LIBERO checkpoint path override + INFERENCE_TEST_LIBERO_DATASET_PATH – LIBERO dataset path override + INFERENCE_TEST_DROID_MODEL_PATH – DROID checkpoint path override + INFERENCE_TEST_DROID_DATASET_PATH – DROID dataset path override + INFERENCE_TEST_SIMPLERENV_FRACTAL_MODEL_PATH – SimplerEnv-Fractal model override + INFERENCE_TEST_SIMPLERENV_FRACTAL_DATASET_PATH – SimplerEnv-Fractal dataset override + INFERENCE_TEST_SIMPLERENV_BRIDGE_MODEL_PATH – SimplerEnv-Bridge model override + INFERENCE_TEST_SIMPLERENV_BRIDGE_DATASET_PATH – SimplerEnv-Bridge dataset override +""" + +from __future__ import annotations + +from dataclasses import dataclass +import os +import subprocess +import sys + +from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader +from gr00t.data.embodiment_tags import EmbodimentTag +from gr00t.eval.open_loop_eval import evaluate_single_trajectory +from gr00t.policy.gr00t_policy import Gr00tPolicy +import pytest +from test_support.runtime import get_root, resolve_demo_dataset, resolve_model_checkpoint_path +import torch + + +ROOT = get_root() + +# scripts/deployment/ is not a Python package; add it to sys.path so we can +# import standalone_inference_script directly. +_DEPLOY_DIR = str(ROOT / "scripts" / "deployment") +if _DEPLOY_DIR not in sys.path: + sys.path.insert(0, _DEPLOY_DIR) + +from standalone_inference_script import run_single_trajectory # noqa: E402 + + +@dataclass(frozen=True) +class InferenceVariant: + """Configuration for one embodiment variant of the inference smoke tests.""" + + id: str + embodiment_tag: str + hf_repo_id: str + hf_subdir: str | None + dataset_name: str + model_env_var: str = "" + dataset_env_var: str = "" + + def __str__(self) -> str: + return self.id + + +LIBERO = InferenceVariant( + id="libero", + embodiment_tag="LIBERO_PANDA", + hf_repo_id="nvidia/GR00T-N1.7-LIBERO", + hf_subdir="libero_10", + dataset_name="libero_demo", + model_env_var="INFERENCE_TEST_LIBERO_MODEL_PATH", + dataset_env_var="INFERENCE_TEST_LIBERO_DATASET_PATH", +) + +DROID = InferenceVariant( + id="droid", + embodiment_tag="OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT", + hf_repo_id="nvidia/GR00T-N1.7-DROID", + hf_subdir=None, + dataset_name="droid_sample", + model_env_var="INFERENCE_TEST_DROID_MODEL_PATH", + dataset_env_var="INFERENCE_TEST_DROID_DATASET_PATH", +) + +SIMPLERENV_FRACTAL = InferenceVariant( + id="simplerenv_fractal", + embodiment_tag="SIMPLER_ENV_GOOGLE", + hf_repo_id="nvidia/GR00T-N1.7-SimplerEnv-Fractal", + hf_subdir=None, + dataset_name="simplerenv_fractal_sample", + model_env_var="INFERENCE_TEST_SIMPLERENV_FRACTAL_MODEL_PATH", + dataset_env_var="INFERENCE_TEST_SIMPLERENV_FRACTAL_DATASET_PATH", +) + +SIMPLERENV_BRIDGE = InferenceVariant( + id="simplerenv_bridge", + embodiment_tag="SIMPLER_ENV_WIDOWX", + hf_repo_id="nvidia/GR00T-N1.7-SimplerEnv-Bridge", + hf_subdir=None, + dataset_name="simplerenv_bridge_sample", + model_env_var="INFERENCE_TEST_SIMPLERENV_BRIDGE_MODEL_PATH", + dataset_env_var="INFERENCE_TEST_SIMPLERENV_BRIDGE_DATASET_PATH", +) + +VARIANTS = [LIBERO, DROID, SIMPLERENV_FRACTAL, SIMPLERENV_BRIDGE] + +DEVICE_BASE_MODEL_REPO = "nvidia/GR00T-N1.7-3B" +DEVICE_DROID_DATASET_NAME = "droid_sample" +DEVICE_DROID_EMBODIMENT_TAG = "OXE_DROID_RELATIVE_EEF_RELATIVE_JOINT" + + +def _model_path(variant: InferenceVariant) -> str: + return str( + resolve_model_checkpoint_path( + hf_repo_id=variant.hf_repo_id, + hf_subdir=variant.hf_subdir, + path_override_env=variant.model_env_var, + repo_root=ROOT, + ) + ) + + +def _dataset_path(variant: InferenceVariant) -> str: + return str( + resolve_demo_dataset( + dataset_name=variant.dataset_name, + path_override_env=variant.dataset_env_var, + repo_root=ROOT, + ) + ) + + +def _assert_real_demo_file(dataset_path) -> None: + demo_check_file = dataset_path / "data" / "chunk-000" / "episode_000000.parquet" + assert demo_check_file.is_file(), f"Demo dataset parquet not found: {demo_check_file}" + assert b"git-lfs" not in demo_check_file.read_bytes()[:50], ( + f"Demo data file is a Git LFS pointer, not real data: {demo_check_file}" + ) + + +@dataclass +class LoadedVariant: + """Holds the pre-loaded policy and dataset loader for one variant.""" + + variant: InferenceVariant + policy: Gr00tPolicy + loader: LeRobotEpisodeLoader + embodiment_tag: EmbodimentTag + model_path: str + dataset_path: str + + +@pytest.fixture(scope="module", params=VARIANTS, ids=str) +def loaded_variant(request, load_hf_model_weights): + """Load Gr00tPolicy + LeRobotEpisodeLoader once per variant for the whole module.""" + variant: InferenceVariant = request.param + model_path = _model_path(variant) + dataset_path = _dataset_path(variant) + embodiment_tag = EmbodimentTag.resolve(variant.embodiment_tag) + device = "cuda" if torch.cuda.is_available() else "cpu" + + with load_hf_model_weights(): + policy = Gr00tPolicy( + embodiment_tag=embodiment_tag, + model_path=model_path, + device=device, + ) + + modality = policy.get_modality_config() + + loader = LeRobotEpisodeLoader( + dataset_path=dataset_path, + modality_configs=modality, + ) + + yield LoadedVariant( + variant=variant, + policy=policy, + loader=loader, + embodiment_tag=embodiment_tag, + model_path=model_path, + dataset_path=dataset_path, + ) + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +@pytest.mark.gpu +@pytest.mark.timeout(600) +def test_standalone_inference_pytorch(loaded_variant: LoadedVariant) -> None: + """Run standalone inference in PyTorch mode for a few steps on trajectory 0.""" + v = loaded_variant + run_single_trajectory( + policy=v.policy, + loader=v.loader, + traj_id=0, + embodiment_tag=v.embodiment_tag, + steps=20, + execution_horizon=8, + ) + + +@pytest.mark.edge_device +@pytest.mark.timeout(1800) +def test_device_standalone_inference_script_pytorch() -> None: + """Mirror the original device.test job with the base 3B model and DROID demo data.""" + assert torch.cuda.is_available(), "CUDA not available" + + model_path = resolve_model_checkpoint_path( + hf_repo_id=DEVICE_BASE_MODEL_REPO, + path_override_env="INFERENCE_TEST_DEVICE_MODEL_PATH", + repo_root=ROOT, + ) + dataset_path = resolve_demo_dataset( + dataset_name=DEVICE_DROID_DATASET_NAME, + path_override_env="INFERENCE_TEST_DEVICE_DATASET_PATH", + global_env_var="DROID_DEMO_DATASET_PATH", + repo_root=ROOT, + ) + _assert_real_demo_file(dataset_path) + + env = os.environ.copy() + env["GROOT_SKIP_HF_MODEL_WEIGHTS"] = "0" + + cmd = [ + sys.executable, + str(ROOT / "scripts" / "deployment" / "standalone_inference_script.py"), + "--model-path", + str(model_path), + "--dataset-path", + str(dataset_path), + "--embodiment-tag", + DEVICE_DROID_EMBODIMENT_TAG, + "--traj-ids", + "0", + "--execution-horizon", + "8", + "--inference-mode", + "pytorch", + ] + result = subprocess.run( + cmd, + cwd=str(ROOT), + env=env, + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + timeout=1800, + check=False, + ) + assert result.returncode == 0, ( + "Device standalone inference script failed.\n" + f"Command: {' '.join(cmd)}\n" + f"Output tail:\n{result.stdout[-12000:]}" + ) + + +@pytest.mark.gpu +@pytest.mark.edge_device +@pytest.mark.timeout(600) +def test_standalone_inference_invalid_traj_id(loaded_variant: LoadedVariant) -> None: + """Out-of-range traj_id should raise an index error, not UnboundLocalError.""" + v = loaded_variant + n = len(v.loader) + assert n < 999, f"Expected dataset to have fewer than 999 trajectories, got {n}" + with pytest.raises((IndexError, KeyError)): + v.loader[999] + + +@pytest.mark.gpu +@pytest.mark.edge_device +@pytest.mark.timeout(600) +def test_open_loop_eval_with_checkpoint(loaded_variant: LoadedVariant) -> None: + """Run evaluate_single_trajectory from open_loop_eval directly.""" + v = loaded_variant + evaluate_single_trajectory( + policy=v.policy, + loader=v.loader, + traj_id=0, + embodiment_tag=v.embodiment_tag, + steps=5, + execution_horizon=8, + ) diff --git a/tests/scripts/deployment/test_trt_contract.py b/tests/scripts/deployment/test_trt_contract.py new file mode 100644 index 000000000..55334b5bd --- /dev/null +++ b/tests/scripts/deployment/test_trt_contract.py @@ -0,0 +1,306 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only tests for the export/TRT single-source contract helpers. + +``_trt_contract`` has no heavy deps (json / os / logging only), so we import +it directly after putting ``scripts/deployment`` on ``sys.path``. +""" + +from __future__ import annotations + +import json +import os +import sys +import types + +import pytest + + +DEPLOY_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../scripts/deployment")) +if DEPLOY_DIR not in sys.path: + sys.path.insert(0, DEPLOY_DIR) + +import _trt_contract as tc # noqa: E402 + + +def _write_metadata(d, **kwargs): + meta = {"action_horizon": 16, "sa_seq_len": 17, "batch_size": 1} + meta.update(kwargs) + with open(os.path.join(d, "export_metadata.json"), "w") as f: + json.dump(meta, f) + return meta + + +def _fake_policy(action_horizon): + cfg = types.SimpleNamespace(action_horizon=action_horizon) + action_head = types.SimpleNamespace(config=cfg, action_horizon=action_horizon) + model = types.SimpleNamespace(action_head=action_head) + return types.SimpleNamespace(model=model) + + +# --- load_export_metadata ------------------------------------------------- + + +def test_load_metadata_from_engine_dir(tmp_path): + _write_metadata(tmp_path) + meta = tc.load_export_metadata(str(tmp_path)) + assert meta["action_horizon"] == 16 + + +def test_load_metadata_from_engine_file(tmp_path): + _write_metadata(tmp_path) + meta = tc.load_export_metadata(str(tmp_path / "dit_bf16.engine")) + assert meta["batch_size"] == 1 + + +def test_load_metadata_from_sibling_onnx_dir(tmp_path): + onnx = tmp_path / "onnx" + engines = tmp_path / "engines" + onnx.mkdir() + engines.mkdir() + _write_metadata(onnx) + meta = tc.load_export_metadata(str(engines)) + assert meta["action_horizon"] == 16 + + +def test_load_metadata_absent_returns_none(tmp_path): + assert tc.load_export_metadata(str(tmp_path)) is None + + +# --- validate_export_metadata --------------------------------------------- + + +def _valid_metadata(): + return { + "schema_version": tc.EXPORT_METADATA_SCHEMA_VERSION, + "sa_seq_len": 17, + "vl_seq_len": 280, + "llm_seq_len": 280, + "num_patches": 256, + "num_merged_patches": 64, + "num_vis_tokens": 64, + "action_horizon": 16, + "batch_size": 1, + "precision": "bf16", + } + + +def test_validate_export_metadata_ok(): + tc.validate_export_metadata(_valid_metadata()) + + +def test_validate_export_metadata_wrong_version_raises(): + meta = _valid_metadata() + meta["schema_version"] = tc.EXPORT_METADATA_SCHEMA_VERSION + 1 + with pytest.raises(ValueError, match="schema_version"): + tc.validate_export_metadata(meta) + + +def test_validate_export_metadata_missing_version_raises(): + meta = _valid_metadata() + del meta["schema_version"] + with pytest.raises(ValueError, match="schema_version"): + tc.validate_export_metadata(meta) + + +@pytest.mark.parametrize( + "key", [k for k in tc.REQUIRED_EXPORT_METADATA_KEYS if k != "schema_version"] +) +def test_validate_export_metadata_missing_key_raises(key): + meta = _valid_metadata() + del meta[key] + with pytest.raises(ValueError, match="missing required key"): + tc.validate_export_metadata(meta) + + +# --- assert_engine_matches_policy ----------------------------------------- + + +def test_engine_matches_policy_ok(tmp_path): + _write_metadata(tmp_path, action_horizon=16, sa_seq_len=17) + out = tc.assert_engine_matches_policy(_fake_policy(16), str(tmp_path)) + assert out["action_horizon"] == 16 + + +def test_engine_action_horizon_mismatch_raises(tmp_path): + _write_metadata(tmp_path, action_horizon=16, sa_seq_len=17) + with pytest.raises(ValueError, match="disagree on chunk size"): + tc.assert_engine_matches_policy(_fake_policy(40), str(tmp_path)) + + +def test_engine_corrupt_sa_seq_len_raises(tmp_path): + _write_metadata(tmp_path, action_horizon=16, sa_seq_len=99) + with pytest.raises(ValueError, match="corrupt"): + tc.assert_engine_matches_policy(_fake_policy(16), str(tmp_path)) + + +def test_engine_missing_metadata_warns_returns_none(tmp_path, caplog): + with caplog.at_level("WARNING"): + out = tc.assert_engine_matches_policy(_fake_policy(16), str(tmp_path)) + assert out is None + assert any("no export_metadata.json" in r.getMessage() for r in caplog.records) + + +def test_corrupt_metadata_treated_as_absent(tmp_path): + (tmp_path / "export_metadata.json").write_text("{ not valid json ") + # Corrupt file must not crash; load returns None, validation degrades. + assert tc.load_export_metadata(str(tmp_path)) is None + assert tc.assert_engine_matches_policy(_fake_policy(16), str(tmp_path)) is None + + +def test_action_horizon_mismatch_message_without_sa_seq_len(tmp_path): + # Metadata has action_horizon but no sa_seq_len: the error must not print + # the "sa_seq_len=None" placeholder. + with open(tmp_path / "export_metadata.json", "w") as f: + json.dump({"action_horizon": 16, "batch_size": 1}, f) + with pytest.raises(ValueError) as exc: + tc.assert_engine_matches_policy(_fake_policy(40), str(tmp_path)) + assert "sa_seq_len=None" not in str(exc.value) + + +# --- assert_engine_bundle_present ----------------------------------------- + + +_FULL_PIPELINE_REQUIRED = ( + "state_encoder.engine", + "action_encoder.engine", + "dit_bf16.engine", + "action_decoder.engine", +) + + +def test_bundle_present_ok(tmp_path): + for name in _FULL_PIPELINE_REQUIRED: + (tmp_path / name).write_bytes(b"stub") + # All required engines present -> no raise. + tc.assert_engine_bundle_present( + str(tmp_path), _FULL_PIPELINE_REQUIRED, mode="n17_full_pipeline" + ) + + +def test_bundle_missing_dir_raises_with_build_hint(tmp_path): + missing_dir = tmp_path / "gr00t_trt_deployment" / "engines" + with pytest.raises(FileNotFoundError) as exc: + tc.assert_engine_bundle_present( + str(missing_dir), _FULL_PIPELINE_REQUIRED, mode="n17_full_pipeline" + ) + msg = str(exc.value) + assert "n17_full_pipeline" in msg + assert "build_trt_pipeline.py" in msg # actionable build hint, not a bare error + + +def test_bundle_missing_one_file_names_it(tmp_path): + for name in _FULL_PIPELINE_REQUIRED: + if name != "dit_bf16.engine": + (tmp_path / name).write_bytes(b"stub") + with pytest.raises(FileNotFoundError) as exc: + tc.assert_engine_bundle_present( + str(tmp_path), _FULL_PIPELINE_REQUIRED, mode="n17_full_pipeline" + ) + msg = str(exc.value) + assert "dit_bf16.engine" in msg + assert "state_encoder.engine" not in msg # only the missing file is listed + + +# --- resolve_batch_size ---------------------------------------------------- + + +def test_resolve_batch_size_default_from_metadata(tmp_path): + _write_metadata(tmp_path, batch_size=4) + assert tc.resolve_batch_size(str(tmp_path)) == 4 + + +def test_resolve_batch_size_matching_request(tmp_path): + _write_metadata(tmp_path, batch_size=2) + assert tc.resolve_batch_size(str(tmp_path), 2) == 2 + + +def test_resolve_batch_size_mismatch_raises(tmp_path): + _write_metadata(tmp_path, batch_size=1) + with pytest.raises(ValueError, match="built .*for batch_size=1"): + tc.resolve_batch_size(str(tmp_path), 4) + + +def test_resolve_batch_size_no_metadata_defaults_to_one(tmp_path): + assert tc.resolve_batch_size(str(tmp_path)) == 1 + # A request with no metadata is accepted (nothing to validate against). + assert tc.resolve_batch_size(str(tmp_path), 8) == 8 + + +# --- assert_grid_thw_matches ---------------------------------------------- + + +def test_grid_thw_matches_ok(): + tc.assert_grid_thw_matches([[1, 16, 16]], [[1, 16, 16]]) + + +def test_grid_thw_none_baked_skips(): + # Older bundle without a recorded grid: degrade to a no-op, do not raise. + tc.assert_grid_thw_matches(None, [[1, 8, 8]]) + + +def test_grid_thw_different_layout_same_count_raises(): + # Same patch count (16*16 == 8*32) but a different layout: the static + # pixel_values shape would NOT catch this; the grid check must. + with pytest.raises(ValueError, match="image_grid_thw"): + tc.assert_grid_thw_matches([[1, 16, 16]], [[1, 8, 32]]) + + +def test_grid_thw_more_views_same_layout_ok(): + # Batch scaling tiles the same per-view grid: more views of an already-baked + # layout are fine (the static pixel_values shape enforces the count). This is + # the test_trt_full_pipeline[batch=2] path: baked 2 views, runtime 4 views. + tc.assert_grid_thw_matches([[1, 16, 16], [1, 16, 16]], [[1, 16, 16]] * 4) + + +def test_grid_thw_extra_view_unbaked_layout_raises(): + # An extra view whose layout was never baked still gets wrong embeddings. + with pytest.raises(ValueError, match="ViT TRT"): + tc.assert_grid_thw_matches([[1, 16, 16]], [[1, 16, 16], [1, 8, 32]]) + + +def test_grid_thw_accepts_tensor_like(): + class _FakeTensor: + def __init__(self, data): + self._data = data + + def detach(self): + return self + + def cpu(self): + return self + + def tolist(self): + return self._data + + tc.assert_grid_thw_matches([[1, 16, 16]], _FakeTensor([[1, 16, 16]])) + with pytest.raises(ValueError): + tc.assert_grid_thw_matches([[1, 16, 16]], _FakeTensor([[2, 16, 16]])) + + +# --- assert_exec_horizon_within_model ------------------------------------- + + +@pytest.mark.parametrize( + "exec_h,model_h,ok", + [(16, 16, True), (8, 16, True), (1, 40, True), (17, 16, False), (0, 16, False)], +) +def test_assert_exec_horizon_within_model(exec_h, model_h, ok): + if ok: + tc.assert_exec_horizon_within_model(exec_horizon=exec_h, model_action_horizon=model_h) + else: + with pytest.raises(ValueError, match="execution-horizon"): + tc.assert_exec_horizon_within_model(exec_horizon=exec_h, model_action_horizon=model_h) diff --git a/tests/scripts/deployment/test_trt_pipeline.py b/tests/scripts/deployment/test_trt_pipeline.py new file mode 100644 index 000000000..7e88a183a --- /dev/null +++ b/tests/scripts/deployment/test_trt_pipeline.py @@ -0,0 +1,197 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +""" +End-to-end test for the unified TRT deployment pipeline (build_trt_pipeline.py). + +Runs the full export → build → verify flow in-process and asserts that the final +cosine similarity between PyTorch and TRT outputs is >= COSINE_THRESHOLD (0.99). + +To keep CI fast the test loads the real checkpoint but immediately truncates the DiT +action head to _TRUNCATED_DIT_BLOCKS transformer blocks. Export, TRT build, and +verify all see the same truncated model, so the cosine comparison remains meaningful. + +Environment variables (all optional): + TRT_TEST_MODEL_PATH – path to a finetuned checkpoint + (default: shared cache + HF download of libero_10) + TRT_TEST_DATASET_PATH – path to a LeRobot dataset + (default: :func:`resolve_libero_demo_dataset_path`) + TRT_TEST_EMBODIMENT – embodiment tag + (default: LIBERO_PANDA) +""" + +from __future__ import annotations + +import contextlib +import gc +import logging +import os +import subprocess +import sys +from unittest.mock import patch + + +# scripts/deployment/ is not a package; add it to sys.path so its modules are importable. +# build_trt_pipeline.py does the same for its own sibling imports when it runs. +_DEPLOY_DIR = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../scripts/deployment") +) +if _DEPLOY_DIR not in sys.path: + sys.path.insert(0, _DEPLOY_DIR) + +from build_trt_pipeline import ( # noqa: E402 + PipelineConfig, + _resolve_embodiment, + _run_build, + _run_export, + _run_verify, +) +import pytest # noqa: E402 +import tensorrt as trt # noqa: E402 +from test_support.runtime import ( # noqa: E402 + get_root, + resolve_libero_demo_dataset_path, + resolve_libero_n17_libero10_checkpoint_path, +) +import torch # noqa: E402 + + +logger = logging.getLogger(__name__) + + +ROOT = get_root() +DEFAULT_EMBODIMENT = os.getenv("TRT_TEST_EMBODIMENT", "LIBERO_PANDA") + +COSINE_THRESHOLD = 0.99 + +# Keep only this many DiT transformer blocks so that ONNX export and TRT build +# finish quickly. Both PyTorch and TRT see the identical truncated graph, so the +# cosine comparison remains a valid accuracy check. +_TRUNCATED_DIT_BLOCKS = 2 + + +@contextlib.contextmanager +def _truncated_policy(): + """Patch Gr00tPolicy to drop DiT blocks down to _TRUNCATED_DIT_BLOCKS after init.""" + from gr00t.policy.gr00t_policy import Gr00tPolicy + + _real_init = Gr00tPolicy.__init__ + + def _fast_init(self, *args, **kwargs): + _real_init(self, *args, **kwargs) + blocks = self.model.action_head.model.transformer_blocks + if len(blocks) > _TRUNCATED_DIT_BLOCKS: + self.model.action_head.model.transformer_blocks = blocks[:_TRUNCATED_DIT_BLOCKS] + + with patch.object(Gr00tPolicy, "__init__", _fast_init): + yield + + +@pytest.fixture +def _release_cuda_memory(): + yield + gc.collect() + if torch.cuda.is_available(): + torch.cuda.synchronize() + torch.cuda.empty_cache() + + +@pytest.mark.gpu +@pytest.mark.edge_device +@pytest.mark.timeout(1200) +@pytest.mark.parametrize("batch_size", [1, 2]) +def test_trt_full_pipeline( + batch_size: int, tmp_path, load_hf_model_weights, _release_cuda_memory +) -> None: + """Export ONNX, build TRT engines, and verify cosine similarity >= threshold.""" + + model_path = str( + resolve_libero_n17_libero10_checkpoint_path(ROOT, path_override_env="TRT_TEST_MODEL_PATH") + ) + dataset_path = str( + resolve_libero_demo_dataset_path(ROOT, path_override_env="TRT_TEST_DATASET_PATH") + ) + + cfg = PipelineConfig( + model_path=model_path, + dataset_path=dataset_path, + embodiment_tag=DEFAULT_EMBODIMENT, + output_dir=str(tmp_path), + export_mode="full_pipeline", + batch_size=batch_size, + steps="export,build,verify", + ) + + onnx_dir = str(tmp_path / "onnx") + engine_dir = str(tmp_path / "engines") + embodiment_tag = _resolve_embodiment(cfg.model_path, cfg.embodiment_tag) + + with ( + load_hf_model_weights(), + open(tmp_path / "pipeline.log", "w") as log_fp, + _truncated_policy(), + ): + _run_export(cfg, onnx_dir, embodiment_tag, log_fp) + _run_build(cfg, onnx_dir, engine_dir, log_fp, trt_severity=trt.Logger.WARNING) + cosine = _run_verify(cfg, engine_dir, embodiment_tag, log_fp) + + logger.info("final cosine similarity (bs=%d): %.6f", batch_size, cosine) + assert cosine >= COSINE_THRESHOLD, ( + f"TRT vs PyTorch cosine similarity {cosine:.6f} (batch_size={batch_size}) " + f"is below threshold {COSINE_THRESHOLD}. " + "This indicates a significant accuracy regression in the ONNX export or TRT engine build." + ) + + +# --------------------------------------------------------------------------- +# __main__ entrypoint tests +# +# These tests exercise the script's CLI surface (tyro argument registration, +# argument parsing, and error handling) by invoking it via subprocess — the +# same way a user or deployment script would call it. They are CPU-only and +# complete in under a second. +# --------------------------------------------------------------------------- + +_PIPELINE_SCRIPT = os.path.join(_DEPLOY_DIR, "build_trt_pipeline.py") + + +@pytest.mark.serial +def test_build_trt_pipeline_help() -> None: + """--help exits 0 and surfaces the expected CLI options.""" + result = subprocess.run( + [sys.executable, _PIPELINE_SCRIPT, "--help"], + capture_output=True, + text=True, + ) + assert result.returncode == 0, f"--help exited {result.returncode}:\n{result.stderr}" + for flag in ["--model-path", "--dataset-path", "--steps", "--export-mode", "--batch-size"]: + assert flag in result.stdout, f"Expected '{flag}' in --help output:\n{result.stdout}" + + +@pytest.mark.serial +def test_build_trt_pipeline_missing_model_path() -> None: + """Invoking the script without --model-path exits non-zero with a clear error.""" + result = subprocess.run( + [sys.executable, _PIPELINE_SCRIPT], + capture_output=True, + text=True, + ) + assert result.returncode != 0, "Expected non-zero exit when --model-path is omitted" + combined = result.stdout + result.stderr + # main() raises ValueError("Please provide --model-path") when model_path is empty; + # the traceback appears on stderr. + assert "Please provide --model-path" in combined, ( + f"Expected error 'Please provide --model-path' in output:\n{combined}" + ) diff --git a/tests/scripts/deployment/test_trt_pipeline_modes.py b/tests/scripts/deployment/test_trt_pipeline_modes.py new file mode 100644 index 000000000..43c62454e --- /dev/null +++ b/tests/scripts/deployment/test_trt_pipeline_modes.py @@ -0,0 +1,151 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Cross-stage invariant for the TRT export-mode fan-out (CPU-only). + +``build_trt_pipeline._MODE_MAP`` routes one ``export_mode`` selector to a +``(build, verify, benchmark)`` tuple. Each stage produces/consumes a *set* of +engines, but nothing else binds those sets — a valid-but-wrong row (e.g. a +build mode that requires ONNX the export never wrote, or a verify mode that +loads engines the build never produced) is only discovered when the row is run. + +These tests bind the rows statically: + +* every component a build produces is sourced from the shared + ``FULL_PIPELINE_COMPONENTS`` / ``EXPORT_MODE_COMPONENTS`` tables, and +* the verify and benchmark consumers' required engine sets are the documented + contract from ``trt_model_forward.setup_tensorrt_engines`` (the ``_setup_*`` + loaders), which both stages share. + +A future row that pairs a producer with a consumer (verify or benchmark) +needing more than it produces fails here instead of at deploy time. +""" + +from __future__ import annotations + +from gr00t.deployment.modes import ( + EXPORT_MODE_COMPONENTS, + FULL_PIPELINE_COMPONENTS, + PIPELINE_STAGE_MODES as _MODE_MAP, + ExportMode, +) +import pytest + + +_ENGINE_OF = {c.name: c.engine for c in FULL_PIPELINE_COMPONENTS} +_FULL = EXPORT_MODE_COMPONENTS[ExportMode.full_pipeline] + +# Engines each *setup mode* REQUIRES (non-fallback). Verify and benchmark use +# the same mode strings, both resolved by the trt_model_forward.py setup loaders +# (``_setup_dit_only`` / ``_setup_action_head`` / ``_setup_n17_full_pipeline``), +# so one table backs both stages. Engines that fall back to PyTorch when absent +# (LLM / VL-SA in n17_full_pipeline) are NOT required. Keep in sync if a +# ``_setup_*`` loader changes which engines it hard-requires. +SETUP_REQUIRED_ENGINES: dict[str, frozenset[str]] = { + "dit_only": frozenset({"dit_bf16.engine"}), + "action_head": frozenset( + { + "state_encoder.engine", + "action_encoder.engine", + "dit_bf16.engine", + "action_decoder.engine", + } + ), + "n17_full_pipeline": frozenset( + { + "vit.engine", + "state_encoder.engine", + "action_encoder.engine", + "dit_bf16.engine", + "action_decoder.engine", + } + ), +} + + +def _engines_built_for(export_mode: str, build_mode: str) -> frozenset[str]: + """Engines the build stage produces for a ``_MODE_MAP`` row. + + Mirrors ``build_trt_pipeline._run_build``: the ``single`` builder emits just + the DiT engine; the ``full_pipeline`` builder emits one engine per component + that ``export_mode`` wrote ONNX for (``EXPORT_MODE_COMPONENTS``). + """ + if build_mode == "single": + return frozenset({_ENGINE_OF["DiT"]}) + produced = EXPORT_MODE_COMPONENTS[ExportMode(export_mode)] + return frozenset(_ENGINE_OF[name] for name in produced) + + +def _required_for(mode: str) -> frozenset[str]: + assert mode in SETUP_REQUIRED_ENGINES, ( + f"setup mode {mode!r} is routed by _MODE_MAP but has no documented " + "required-engine set in this test." + ) + return SETUP_REQUIRED_ENGINES[mode] + + +@pytest.mark.parametrize("export_mode", sorted(_MODE_MAP)) +def test_build_produces_every_engine_verify_requires(export_mode): + build_mode, verify_mode, _bench = _MODE_MAP[export_mode] + built = _engines_built_for(export_mode, build_mode) + missing = _required_for(verify_mode) - built + assert not missing, ( + f"export_mode={export_mode!r}: build ({build_mode}) produces {sorted(built)}, " + f"but verify ({verify_mode}) requires {sorted(missing)} it never builds." + ) + + +@pytest.mark.parametrize("export_mode", sorted(_MODE_MAP)) +def test_build_produces_every_engine_benchmark_requires(export_mode): + # Same fan-out hazard on the third map: benchmark loads engines via the same + # setup_tensorrt_engines loaders, so a row whose benchmark mode needs an + # engine the build never produced must also fail here, not at deploy time. + build_mode, _verify, bench_mode = _MODE_MAP[export_mode] + built = _engines_built_for(export_mode, build_mode) + missing = _required_for(bench_mode) - built + assert not missing, ( + f"export_mode={export_mode!r}: build ({build_mode}) produces {sorted(built)}, " + f"but benchmark ({bench_mode}) requires {sorted(missing)} it never builds." + ) + + +@pytest.mark.parametrize("export_mode", sorted(_MODE_MAP)) +def test_export_mode_component_names_are_valid(export_mode): + valid = {c.name for c in FULL_PIPELINE_COMPONENTS} + unknown = set(EXPORT_MODE_COMPONENTS[ExportMode(export_mode)]) - valid + assert not unknown, f"{export_mode}: unknown component names {sorted(unknown)}" + + +def test_action_head_build_excludes_pytorch_only_components(): + # The regression guard for B-2026-06-29-003: action_head keeps ViT/LLM/VL-SA + # in PyTorch, so the build must NOT require their ONNX. + produced = EXPORT_MODE_COMPONENTS[ExportMode.action_head] + for name in ("ViT", "LLM", "VL Self-Attention"): + assert name not in produced + assert produced == frozenset({"State Encoder", "Action Encoder", "DiT", "Action Decoder"}) + + +def test_setup_modes_have_known_required_sets(): + # Every verify AND benchmark mode referenced by _MODE_MAP must have a + # documented required set above — otherwise a new row escapes the invariant. + for _build, verify_mode, bench_mode in _MODE_MAP.values(): + assert verify_mode in SETUP_REQUIRED_ENGINES, ( + f"verify mode {verify_mode!r} is routed by _MODE_MAP but has no " + "documented required-engine set in this test." + ) + assert bench_mode in SETUP_REQUIRED_ENGINES, ( + f"benchmark mode {bench_mode!r} is routed by _MODE_MAP but has no " + "documented required-engine set in this test." + ) diff --git a/tests/scripts/deployment/test_trt_torch_engine_lifecycle.py b/tests/scripts/deployment/test_trt_torch_engine_lifecycle.py new file mode 100644 index 000000000..56ccb3b79 --- /dev/null +++ b/tests/scripts/deployment/test_trt_torch_engine_lifecycle.py @@ -0,0 +1,179 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only lifecycle tests for ``scripts.deployment.trt_torch.Engine``. + +Pins the regression that ``__init__`` no longer registers an ``atexit`` +callback, plus the ``close()`` / ``__enter__`` / ``__exit__`` / ``__del__`` +contracts the fix introduces. ``tensorrt`` is stubbed in ``sys.modules`` +so the tests run on any host without a GPU. +""" + +from __future__ import annotations + +import atexit +import os +import sys +import types +from unittest import mock + +import pytest + + +def _make_trt_stub() -> types.ModuleType: + """Minimal ``tensorrt`` stub sufficient for ``Engine.__init__`` and + ``Engine.load`` to run on CPU.""" + trt_stub = types.ModuleType("tensorrt") + + class _Logger: + ERROR = 1 + + def __init__(self, level=ERROR): + self.level = level + + trt_stub.Logger = _Logger + + def _init_plugins(_logger, _ns): + return None + + trt_stub.init_libnvinfer_plugins = _init_plugins + + class _IOMode: + INPUT = 0 + OUTPUT = 1 + + trt_stub.TensorIOMode = _IOMode + + for name in ("float32", "float16", "bfloat16", "int8", "int32", "bool", "uint8", "int64"): + setattr(trt_stub, name, name) + + class _Handle: + def __init__(self): + self._tensors = [] + + def __iter__(self): + return iter(self._tensors) + + def create_execution_context(self): + return mock.MagicMock(name="execution_context") + + class _Runtime: + def __init__(self, _logger): + self._logger = _logger + + def deserialize_cuda_engine(self, _blob): + return _Handle() + + trt_stub.Runtime = _Runtime + return trt_stub + + +@pytest.fixture +def engine_module(monkeypatch, tmp_path): + """Yield ``(Engine, engine_file_path)`` with ``tensorrt`` stubbed.""" + monkeypatch.setitem(sys.modules, "tensorrt", _make_trt_stub()) + + deploy_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../scripts/deployment") + ) + monkeypatch.syspath_prepend(deploy_dir) + monkeypatch.delitem(sys.modules, "trt_torch", raising=False) + + from trt_torch import Engine + + engine_file = tmp_path / "fake.engine" + engine_file.write_bytes(b"not-a-real-engine") + + yield Engine, str(engine_file) + + +def test_init_does_not_register_atexit_callback(engine_module): + """Regression: pre-fix ``__init__`` registered an ``atexit`` callback + that segfaulted at shutdown and pinned the engine alive for the life + of the process. It must stay gone.""" + Engine, engine_file = engine_module + + with mock.patch.object(atexit, "register") as fake_register: + eng = Engine(engine_file) + + fake_register.assert_not_called() + eng.close() + + +def test_close_clears_context_and_handle(engine_module): + """After ``close()`` both attributes are ``None`` (state check; the + source enforces context-before-handle ordering by line order).""" + Engine, engine_file = engine_module + eng = Engine(engine_file) + assert eng.execution_context is not None + assert eng.handle is not None + + eng.close() + + assert eng.execution_context is None + assert eng.handle is None + assert eng._closed is True + + +def test_close_is_idempotent(engine_module): + """Repeat ``close()`` calls must be a noop so ``__del__`` can layer on + top of explicit ``with``-block teardown safely.""" + Engine, engine_file = engine_module + eng = Engine(engine_file) + eng.close() + eng.close() + assert eng._closed is True + + +def test_del_does_not_raise_after_normal_close(engine_module): + """After explicit ``close()`` the destructor must be a clean noop.""" + Engine, engine_file = engine_module + eng = Engine(engine_file) + eng.close() + eng.__del__() + + +def test_del_swallows_errors_from_close(engine_module): + """The defensive ``__del__`` shim must not propagate errors raised by + ``close()`` — that path covers interpreter shutdown when the + ``tensorrt`` module is already gone.""" + Engine, engine_file = engine_module + eng = Engine(engine_file) + with mock.patch.object(type(eng), "close", side_effect=RuntimeError("shutdown")): + eng.__del__() + + +def test_del_does_not_raise_on_partially_initialized_engine(engine_module): + """If ``__init__`` raises before ``load()`` completes, the destructor + still runs. The pre-init of ``_closed`` / ``execution_context`` / + ``handle`` keeps it safe.""" + Engine, engine_file = engine_module + + captured: list = [] + real_load = Engine.load + + def boom(self, file): + captured.append(self) + raise RuntimeError("simulated load failure") + + Engine.load = boom + try: + with pytest.raises(RuntimeError, match="simulated load failure"): + Engine(engine_file) + finally: + Engine.load = real_load + + assert captured + captured[0].__del__() diff --git a/tests/scripts/deployment/test_video_backend_consistency.py b/tests/scripts/deployment/test_video_backend_consistency.py new file mode 100644 index 000000000..23cd8212a --- /dev/null +++ b/tests/scripts/deployment/test_video_backend_consistency.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Pin that deployment/runtime APIs do not expose video backend selectors. + +GR00T uses torchcodec as the only video decoder. User-facing CLIs and +public helper APIs must not grow a ``--video-backend`` flag or dataclass +field. +""" + +from __future__ import annotations + +import inspect +import os +import sys +from typing import get_type_hints + +import pytest + + +@pytest.fixture(scope="module") +def deploy_imports(): + """Make ``scripts/deployment`` importable. The directory is not a + package; it relies on ``sys.path`` insertion at runtime, so we mirror + that here so the CLI configs can be imported.""" + deploy_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../scripts/deployment") + ) + if deploy_dir not in sys.path: + sys.path.insert(0, deploy_dir) + return deploy_dir + + +# --------------------------------------------------------------------------- +# CLI sites: none may expose a video backend selector +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + "module_name, cls_name", + [ + ("export_onnx_n1d7", "ExportConfig"), + ("build_trt_pipeline", "PipelineConfig"), + ("standalone_inference_script", "ArgsConfig"), + ], +) +def test_cli_config_has_no_video_backend_field(deploy_imports, module_name, cls_name): + """Deployment CLIs should not expose a one-choice ``--video-backend`` flag.""" + try: + mod = __import__(module_name) + except (ImportError, OSError) as e: + pytest.skip(f"{module_name} not importable in this env: {e}") + cfg_cls = getattr(mod, cls_name, None) + if cfg_cls is None: + pytest.skip(f"{module_name} has no attribute {cls_name!r}") + + hints = get_type_hints(cfg_cls) + assert "video_backend" not in hints, ( + f"{module_name}.{cls_name} exposes video_backend; remove the CLI selector " + "and use torchcodec internally." + ) + + +def test_video_utils_public_api_has_no_video_backend_parameter(): + """Frame-loading helpers should not expose a one-choice backend selector.""" + try: + from gr00t.utils import video_utils + except (ImportError, OSError) as e: + pytest.skip(f"video_utils not importable in this env: {e}") + + for func_name in ( + "get_frames_by_indices", + "get_frames_by_timestamps", + "get_all_frames", + ): + signature = inspect.signature(getattr(video_utils, func_name)) + assert "video_backend" not in signature.parameters + + +def test_dataset_public_apis_have_no_video_backend_parameter(): + from gr00t.data.dataset.lerobot_episode_loader import LeRobotEpisodeLoader + from gr00t.data.dataset.sharded_single_step_dataset import ShardedSingleStepDataset + + for cls in (LeRobotEpisodeLoader, ShardedSingleStepDataset): + signature = inspect.signature(cls) + assert "video_backend" not in signature.parameters diff --git a/tests/scripts/test_repair_lerobot_metadata.py b/tests/scripts/test_repair_lerobot_metadata.py new file mode 100644 index 000000000..09630b02c --- /dev/null +++ b/tests/scripts/test_repair_lerobot_metadata.py @@ -0,0 +1,139 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +from __future__ import annotations + +import json +from pathlib import Path + +from scripts.repair_lerobot_metadata import repair_dataset + + +def _write_json(path: Path, payload: dict) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8") + + +def _write_jsonl(path: Path, records: list[dict]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("".join(json.dumps(record) + "\n" for record in records), encoding="utf-8") + + +def _touch(path: Path) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(b"x") + + +def _make_dataset(root: Path) -> Path: + dataset = root / "dataset" + _write_json( + dataset / "meta/info.json", + { + "codebase_version": "v2.1", + "robot_type": "test", + "total_episodes": 3, + "total_frames": 60, + "total_videos": 6, + "total_chunks": 1, + "chunks_size": 1000, + "fps": 20, + "splits": {"train": "0:3"}, + "data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet", + "video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4", + "features": { + "observation.state": {"dtype": "float32"}, + "action": {"dtype": "float32"}, + }, + }, + ) + _write_json( + dataset / "meta/modality.json", + { + "state": {}, + "action": {}, + "video": { + "front": {"original_key": "observation.images.front"}, + "wrist": {"original_key": "observation.images.wrist"}, + }, + }, + ) + _write_jsonl( + dataset / "meta/episodes.jsonl", + [ + {"episode_index": 0, "tasks": ["ok"], "length": 10}, + {"episode_index": 1, "tasks": ["missing"], "length": 20}, + {"episode_index": 2, "tasks": ["ok"], "length": 30}, + ], + ) + _write_jsonl(dataset / "meta/tasks.jsonl", [{"task_index": 0, "task": "ok"}]) + _write_json(dataset / "meta/stats.json", {"observation.state": {"mean": [0.0]}}) + + for episode_index in (0, 2): + _touch(dataset / f"data/chunk-000/episode_{episode_index:06d}.parquet") + _touch( + dataset / f"videos/chunk-000/observation.images.front/episode_{episode_index:06d}.mp4" + ) + _touch( + dataset / f"videos/chunk-000/observation.images.wrist/episode_{episode_index:06d}.mp4" + ) + _touch(dataset / "data/chunk-000/episode_000001.parquet") + return dataset + + +def _read_jsonl(path: Path) -> list[dict]: + return [json.loads(line) for line in path.read_text(encoding="utf-8").splitlines()] + + +def test_repair_dataset_drops_episodes_with_missing_required_files(tmp_path: Path) -> None: + dataset = _make_dataset(tmp_path) + + result = repair_dataset(dataset, regenerate_stats=False) + + assert result.changed + assert result.dropped_episodes == 1 + assert "episode 1" in result.missing_examples[0] + episodes = _read_jsonl(dataset / "meta/episodes.jsonl") + assert [episode["episode_index"] for episode in episodes] == [0, 2] + info = json.loads((dataset / "meta/info.json").read_text(encoding="utf-8")) + assert info["total_episodes"] == 2 + assert info["total_frames"] == 40 + assert info["total_videos"] == 4 + assert info["total_chunks"] == 1 + assert info["splits"]["train"] == "0:2" + assert not (dataset / "data/chunk-000/episode_000001.parquet").exists() + + +def test_repair_dataset_dry_run_does_not_rewrite_metadata(tmp_path: Path) -> None: + dataset = _make_dataset(tmp_path) + before = (dataset / "meta/episodes.jsonl").read_text(encoding="utf-8") + + result = repair_dataset(dataset, regenerate_stats=False, dry_run=True) + + assert result.changed + assert result.dropped_episodes == 1 + assert (dataset / "meta/episodes.jsonl").read_text(encoding="utf-8") == before + + +def test_repair_dataset_noops_when_metadata_matches_files(tmp_path: Path) -> None: + dataset = _make_dataset(tmp_path) + _touch(dataset / "data/chunk-000/episode_000001.parquet") + _touch(dataset / "videos/chunk-000/observation.images.front/episode_000001.mp4") + _touch(dataset / "videos/chunk-000/observation.images.wrist/episode_000001.mp4") + + result = repair_dataset(dataset, regenerate_stats=False) + + assert not result.changed + assert result.dropped_episodes == 0 + assert len(_read_jsonl(dataset / "meta/episodes.jsonl")) == 3 diff --git a/tests/test_support/__init__.py b/tests/test_support/__init__.py new file mode 100644 index 000000000..084a97b0c --- /dev/null +++ b/tests/test_support/__init__.py @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Shared support helpers for tests.""" diff --git a/tests/test_support/compass.py b/tests/test_support/compass.py new file mode 100644 index 000000000..3e7a9fa1f --- /dev/null +++ b/tests/test_support/compass.py @@ -0,0 +1,254 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Setup helpers for COMPASS, IsaacLab, and X-Mobility.""" + +from __future__ import annotations + +import os +import pathlib + +from test_support.runtime import TEST_CACHE_PATH, get_root, hf_hub_download_cmd, run_subprocess_step + + +_REPO_ROOT = get_root() + +# COMPASS repo — cloned directly into shared storage (not a git submodule). +_COMPASS_GIT_URL = "https://github.com/NVlabs/COMPASS.git" +SHARED_COMPASS_REPO = TEST_CACHE_PATH / "repos/COMPASS" + +# IsaacLab repo + installation — cloned and installed into shared storage. +_ISAACLAB_GIT_URL = "https://github.com/isaac-sim/IsaacLab.git" +_ISAACLAB_PIP_INDEX = "https://pypi.nvidia.com" +_ISAACLAB_TORCH_INDEX = "https://download.pytorch.org/whl/cu128" +SHARED_ISAACLAB_REPO = TEST_CACHE_PATH / "repos/IsaacLab" + +# Dedicated venv for the IsaacLab/Isaac Sim Python environment. +# Must live on local disk (/tmp) rather than the shared NFS drive because the +# aarch64 torch wheel (~2.8 GB) fails with Errno 2 (ENOENT) when pip tries to +# move extracted .so files across filesystem boundaries. +ISAACLAB_VENV = pathlib.Path("/tmp/isaaclab_venv") + +# X-Mobility: wheel ships inside the COMPASS repo; checkpoint from HuggingFace. +_X_MOBILITY_WHL = "x_mobility/x_mobility-0.1.0-py3-none-any.whl" +_X_MOBILITY_HF_REPO = "nvidia/X-Mobility" +_X_MOBILITY_HF_FILE = "x_mobility-nav2-semantic_action_path.ckpt" +SHARED_X_MOBILITY_CKPT = TEST_CACHE_PATH / f"models/x_mobility/{_X_MOBILITY_HF_FILE}" + + +def isaaclab_env(env: dict[str, str], extra: dict[str, str] | None = None) -> dict[str, str]: + """Return a clean env for running isaaclab.sh commands. + + Strips VIRTUAL_ENV, UV_PROJECT_ENVIRONMENT, and the workspace venv bin + directory from PATH so isaaclab.sh -p uses its own Isaac Sim Python rather + than the workspace venv (which lacks pip). + """ + venv = env.get("UV_PROJECT_ENVIRONMENT") or env.get("VIRTUAL_ENV") or "" + result = {} + for k, v in env.items(): + if k in ("VIRTUAL_ENV", "UV_PROJECT_ENVIRONMENT"): + continue + if k == "PATH" and venv: + venv_bin = str(pathlib.Path(venv) / "bin") + # Remove ":" and any leading/trailing colons. + v = v.replace(f"{venv_bin}:", "").replace(f":{venv_bin}", "").replace(venv_bin, "") + result[k] = v + result["TERM"] = "xterm-256color" + if extra: + result.update(extra) + return result + + +def prepare_isaaclab(env: dict[str, str]) -> pathlib.Path: + """Return the IsaacLab repo path, cloning and installing into shared storage if needed. + + Priority: + 1. ISAACLAB_PATH env var (user-supplied, assumed already installed) + 2. Shared cache hit — repo + install already done + 3. Clone from GitHub and run ``./isaaclab.sh --install`` + """ + env_path_str = os.environ.get("ISAACLAB_PATH", "") + if env_path_str: + env_path = pathlib.Path(env_path_str) + if (env_path / "isaaclab.sh").is_file(): + return env_path + + # Require both the repo AND the Isaac Sim installation (_isaac_sim/python.sh) + # to exist before treating the cache as ready. The repo may be cloned but + # the install step may have failed, leaving isaaclab.sh present but the + # Isaac Sim Python environment absent. + if (SHARED_ISAACLAB_REPO / "_isaac_sim" / "python.sh").is_file(): + return SHARED_ISAACLAB_REPO + + SHARED_ISAACLAB_REPO.parent.mkdir(parents=True, exist_ok=True) + if not SHARED_ISAACLAB_REPO.exists(): + run_subprocess_step( + ["git", "clone", _ISAACLAB_GIT_URL, str(SHARED_ISAACLAB_REPO)], + step="isaaclab_clone", + cwd=_REPO_ROOT, + env=env, + log_prefix="compass", + ) + # isaaclab.sh --install requires an active Python env to install Isaac Sim + # into. The venv must live on LOCAL disk, not on the shared NFS drive: + # the aarch64 torch wheel bundles libcublas.so.12 (~2.8 GB) and NFS + # filesystems fail with Errno 2 (ENOENT) when pip tries to move the + # extracted .so files from the temp staging area to the venv site-packages. + # Isaac Sim 5.x Kit extensions are built for cp311 only; a Python 3.10 venv + # causes "platform incompatible" failures when resolving omni.* dependencies. + # Use `uv venv --python 3.11` with UV_PYTHON_DOWNLOADS=automatic so uv + # downloads Python 3.11 if it is not already installed on the runner. + run_subprocess_step( + ["uv", "venv", "--python", "3.11", "--seed", str(ISAACLAB_VENV)], + step="isaaclab_venv_create", + cwd=SHARED_ISAACLAB_REPO, + env={**env, "UV_PYTHON_DOWNLOADS": "automatic"}, + log_prefix="compass", + ) + + # Pre-install torch/torchvision via uv pip so isaaclab.sh sees them already + # satisfied and skips its own download step. Use uv pip rather than plain pip + # so the install benefits from uv's wheel cache on the shared drive. + # Clear PIP_CONSTRAINT so the NVIDIA-custom torch build constraint in GB200 + # containers doesn't block IsaacLab's torch version. + _venv_env = {**env, "PIP_CONSTRAINT": ""} + _pip = str(ISAACLAB_VENV / "bin" / "pip") + _venv_python = str(ISAACLAB_VENV / "bin" / "python") + # Use uv pip for the torch pre-install so it benefits from uv's wheel cache. + # uv also handles the aarch64 wheel name-casing correctly, so the separate + # pip-upgrade step that was needed to fix old pip's resolution bug is gone. + run_subprocess_step( + [ + "uv", + "pip", + "install", + "--python", + _venv_python, + "torch==2.7.0", + "torchvision==0.22.0", + "--index-url", + _ISAACLAB_TORCH_INDEX, + "--extra-index-url", + _ISAACLAB_PIP_INDEX, + ], + step="isaaclab_torch_preinstall", + cwd=SHARED_ISAACLAB_REPO, + env={**_venv_env, "UV_PYTHON_DOWNLOADS": "automatic"}, + log_prefix="compass", + stream_output=True, + ) + + # isaacsim-rl creates the _isaac_sim symlink inside the IsaacLab repo. + # setup_vscode.py (called by isaaclab.sh --install) requires that symlink; + # without it the install fails with "Could not find the isaac-sim directory". + # ACCEPT_EULA=Y suppresses the interactive NVIDIA Omniverse EULA prompt that + # the isaacsim-rl post-install script would otherwise block waiting for input. + run_subprocess_step( + [_pip, "install", "isaacsim-rl", "--extra-index-url", _ISAACLAB_PIP_INDEX], + step="isaaclab_isaacsim_install", + cwd=SHARED_ISAACLAB_REPO, + env={**_venv_env, "ACCEPT_EULA": "Y"}, + log_prefix="compass", + stream_output=True, + ) + + run_subprocess_step( + [str(SHARED_ISAACLAB_REPO / "isaaclab.sh"), "--install"], + step="isaaclab_install", + cwd=SHARED_ISAACLAB_REPO, + env=isaaclab_env( + env, + { + "VIRTUAL_ENV": str(ISAACLAB_VENV), + "PATH": f"{ISAACLAB_VENV / 'bin'}:{env.get('PATH', os.environ.get('PATH', ''))}", + "PIP_EXTRA_INDEX_URL": _ISAACLAB_PIP_INDEX, + # GB200 containers carry a system pip constraint that pins torch to + # an NVIDIA-custom build. Clear it so IsaacLab can install its own + # torch version into the dedicated venv. + "PIP_CONSTRAINT": "", + # Auto-accept the NVIDIA Omniverse EULA without interactive prompt. + "ACCEPT_EULA": "Y", + }, + ), + log_prefix="compass", + stream_output=True, + ) + return SHARED_ISAACLAB_REPO + + +def prepare_compass_repo(env: dict[str, str]) -> pathlib.Path: + """Return the COMPASS repo path, cloning into shared storage if needed. + + Priority: + 1. COMPASS_REPO_PATH env var (user-supplied) + 2. Shared cache hit — reuse without re-cloning + 3. Clone from GitHub into shared storage + """ + env_path_str = os.environ.get("COMPASS_REPO_PATH", "") + if env_path_str: + env_path = pathlib.Path(env_path_str) + if (env_path / "run.py").is_file(): + return env_path + + if (SHARED_COMPASS_REPO / "run.py").is_file(): + return SHARED_COMPASS_REPO + + SHARED_COMPASS_REPO.parent.mkdir(parents=True, exist_ok=True) + run_subprocess_step( + ["git", "clone", _COMPASS_GIT_URL, str(SHARED_COMPASS_REPO)], + step="compass_repo_clone", + cwd=_REPO_ROOT, + env=env, + log_prefix="compass", + ) + return SHARED_COMPASS_REPO + + +def prepare_x_mobility( + compass_repo: pathlib.Path, + env: dict[str, str], +) -> pathlib.Path: + """Install the X-Mobility wheel and return the cached checkpoint path. + + The wheel ships inside the COMPASS repo and is installed into the IsaacLab + Python environment. The checkpoint is downloaded from HuggingFace once and + cached in shared storage. + """ + # isaaclab.sh -p requires _isaac_sim/python.sh which only exists in the full + # Isaac Sim desktop install, not the pip-based isaacsim-rl package. Install + # X-Mobility directly into ISAACLAB_VENV (where isaacsim-rl lives) instead. + _pip = str(ISAACLAB_VENV / "bin" / "pip") + run_subprocess_step( + [_pip, "install", "--verbose", str(compass_repo / _X_MOBILITY_WHL)], + step="x_mobility_install", + cwd=compass_repo, + env={**env, "PIP_CONSTRAINT": ""}, + log_prefix="compass", + stream_output=True, + ) + + if not SHARED_X_MOBILITY_CKPT.is_file(): + SHARED_X_MOBILITY_CKPT.parent.mkdir(parents=True, exist_ok=True) + run_subprocess_step( + hf_hub_download_cmd( + _X_MOBILITY_HF_REPO, _X_MOBILITY_HF_FILE, str(SHARED_X_MOBILITY_CKPT.parent) + ), + step="x_mobility_ckpt_download", + cwd=_REPO_ROOT, + env=env, + log_prefix="compass", + ) + + return SHARED_X_MOBILITY_CKPT diff --git a/tests/test_support/readme.py b/tests/test_support/readme.py new file mode 100644 index 000000000..af05fb516 --- /dev/null +++ b/tests/test_support/readme.py @@ -0,0 +1,175 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""README code block helpers for tests.""" + +from __future__ import annotations + +from dataclasses import dataclass +import pathlib +import re + + +@dataclass +class CodeBlock: + language: str + code: str + heading: str + line_number: int + + +def extract_code_blocks(readme_path: pathlib.Path) -> list[CodeBlock]: + """Extract all fenced code blocks from a markdown file with context.""" + text = readme_path.read_text(encoding="utf-8") + lines = text.splitlines() + blocks: list[CodeBlock] = [] + current_heading = "" + i = 0 + while i < len(lines): + line = lines[i] + heading_match = re.match(r"^#{1,6}\s+(.*)", line) + if heading_match: + current_heading = heading_match.group(1).strip() + fence_match = re.match(r"^```(\w*)", line) + if fence_match: + lang = fence_match.group(1) + start_line = i + 1 + code_lines: list[str] = [] + i += 1 + while i < len(lines) and not lines[i].startswith("```"): + code_lines.append(lines[i]) + i += 1 + blocks.append( + CodeBlock( + language=lang, + code="\n".join(code_lines), + heading=current_heading, + line_number=start_line, + ) + ) + i += 1 + return blocks + + +def normalize_ws(text: str) -> str: + """Normalize whitespace for robust command matching.""" + return " ".join(text.replace("\\\n", " ").replace("\\", " ").split()) + + +def assert_snippets_in_readme(readme_path: pathlib.Path, snippets: list[tuple[str, str]]) -> None: + """Assert that each (name, snippet) appears in the README (whitespace-normalised).""" + readme_text = readme_path.read_text(encoding="utf-8") + normalized = normalize_ws(readme_text) + missing = [name for name, snippet in snippets if normalize_ws(snippet) not in normalized] + assert not missing, ( + f"README drift detected in {readme_path.name} for sections: " + f"{', '.join(missing)}. Update tests or README to keep them aligned." + ) + + +def find_block( + blocks: list[CodeBlock], + keyword: str, + *, + language: str | None = None, + occurrence: int = 1, +) -> CodeBlock: + """Return the Nth block (1-based) whose code contains keyword.""" + count = 0 + for block in blocks: + if language is not None and block.language != language: + continue + if keyword in block.code: + count += 1 + if count == occurrence: + return block + raise ValueError( + f"No block containing {keyword!r} found (language={language!r}, occurrence={occurrence})" + ) + + +def replace_once(text: str, old: str, new: str) -> str: + """Replace ``old`` with ``new`` in ``text``, asserting exactly one occurrence.""" + assert text.count(old) == 1, f"Expected exactly one occurrence of {old!r}" + return text.replace(old, new) + + +def run_bash_blocks( + blocks: list[CodeBlock | str], + *, + cwd: pathlib.Path | None = None, + env: dict | None = None, + force_yes: bool = False, +) -> None: + """Run bash/sh code blocks extracted from a README via subprocess. + + If ``force_yes`` is True, ``apt-get`` commands are automatically given + the ``-y`` flag so they do not prompt for confirmation. + """ + import re + import subprocess + + for block in blocks: + if isinstance(block, str): + code = block + elif block.language in ("bash", "sh"): + code = block.code + else: + continue + if force_yes: + # Strip `sudo` from apt/apt-get lines (CI often runs as root). + code = re.sub(r"\bsudo\s+(apt(?:-get)?)\b", r"\1", code) + # Insert -y after `apt`/`apt-get ` when not already present. + code = re.sub(r"\bapt(-get)?(\s+\S+)(?!\s+-y)", r"apt\1\2 -y", code) + print(f"[readme] running bash block:\n{code}\n", flush=True) + result = subprocess.run( + ["bash", "-c", code], cwd=cwd, env=env, capture_output=True, text=True + ) + if result.stdout: + print(result.stdout, end="", flush=True) + if result.stderr: + print(result.stderr, end="", flush=True) + if result.returncode != 0: + output = (result.stdout or "") + (result.stderr or "") + raise AssertionError( + f"bash block failed (returncode={result.returncode})\noutput:\n{output}" + ) + + +def run_readme_python_blocks( + blocks: list[CodeBlock | str], + readme_path: pathlib.Path, + repo_root: pathlib.Path, +) -> None: + """Combine blocks (CodeBlock or raw string) and execute as a single Python script.""" + parts = [b if isinstance(b, str) else b.code for b in blocks] + combined = CodeBlock(language="python", code="\n".join(parts), heading="", line_number=0) + run_python_blocks([combined], readme_path=readme_path, repo_root=repo_root) + + +def run_python_blocks( + blocks: list[CodeBlock], + *, + readme_path: pathlib.Path, + repo_root: pathlib.Path, +) -> None: + """Execute Python code blocks extracted from a README.""" + for block in [b for b in blocks if b.language == "python"]: + globs: dict = { + "_REPO_ROOT": repo_root, + "_README_DIR": readme_path.parent, + } + filename = f"<{readme_path.name}:{block.line_number}>" + exec(compile(block.code, filename, "exec"), globs) # noqa: S102 diff --git a/tests/test_support/runtime.py b/tests/test_support/runtime.py new file mode 100644 index 000000000..7059dcee5 --- /dev/null +++ b/tests/test_support/runtime.py @@ -0,0 +1,777 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Shared subprocess/runtime helpers for tests.""" + +from __future__ import annotations + +import contextlib +import json +import os +import pathlib +import re +import shutil +import socket +import subprocess +import tempfile +import time + + +DEFAULT_SERVER_STARTUP_SECONDS = 600.0 + + +def _default_cache_path() -> pathlib.Path: + """Return the cache root directory.""" + if "TEST_CACHE_PATH" in os.environ: + return pathlib.Path(os.environ["TEST_CACHE_PATH"]) + + local_fallback = pathlib.Path.home() / ".cache" / "g00t" + local_fallback.mkdir(parents=True, exist_ok=True) + return local_fallback + + +TEST_CACHE_PATH = _default_cache_path() + + +def get_root() -> pathlib.Path: + """Return the root directory of the repository.""" + return pathlib.Path(__file__).resolve().parents[2] + + +def fast_copy_tree( + src: pathlib.Path, + dst: pathlib.Path, + *, + symlinks: bool = False, +) -> None: + """Recursively copy *src* → *dst*, optimised for slow-NFS sources. + + Many-small-files trees over a contended NFS mount stall + ``shutil.copytree`` badly: each file pays an open + stat + read + + close NFS round-trip, so metadata-bound trees (e.g. a Python venv + with pandas/sympy/torch test fixtures, ~50k tiny files) collapse + from thousands of files/s on a healthy mount to single-digit + files/s on a contended one. Job 313566325 observed 3.4 files/s, + blowing the 1200 s ``pytest-timeout`` on a single venv copy that + finishes in <60 s on a quiet runner. + + This helper streams the tree through a single ``tar`` pipe — one + sequential read on the source side, one sequential write on the + destination, no per-file network round-trips. Falls back to + ``shutil.copytree(dirs_exist_ok=True)`` when ``tar`` is missing + (e.g. some minimal containers) so the helper is always usable. + + Args: + src: source directory (must exist). + dst: destination directory (created when absent; existing + entries are merged, matching + ``shutil.copytree(dirs_exist_ok=True)``). + symlinks: when ``False`` (default) symlinks are dereferenced + and real bytes are copied — load-bearing for ``/shared`` + sources, where preserving symlinks would route runtime + reads back over NFS and defeat the purpose of staging. + When ``True`` symlinks are preserved verbatim (used for + ``libero_uv`` venvs whose internal ``bin/python`` symlink + points outside the tree and must stay a symlink). + """ + src = pathlib.Path(src) + dst = pathlib.Path(dst) + if not src.is_dir(): + raise NotADirectoryError(f"fast_copy_tree source is not a directory: {src}") + dst.mkdir(parents=True, exist_ok=True) + + tar_bin = shutil.which("tar") + if tar_bin is None: + shutil.copytree(src, dst, dirs_exist_ok=True, symlinks=symlinks) + return + + # ``tar -h`` (--dereference) follows symlinks at archive-creation + # time, matching ``shutil.copytree(symlinks=False)``. + create_flags = "-cpf" if symlinks else "-chpf" + src_cmd = [tar_bin, "-C", str(src), create_flags, "-", "."] + dst_cmd = [tar_bin, "-C", str(dst), "-xpf", "-"] + + src_proc = subprocess.Popen(src_cmd, stdout=subprocess.PIPE) + try: + try: + dst_proc = subprocess.Popen(dst_cmd, stdin=src_proc.stdout) + except BaseException: + # dst_proc never started, so nobody will drain src_proc's stdout. + # Reap src_proc explicitly to avoid leaving a zombie. + src_proc.kill() + src_proc.wait() + raise + finally: + # Close our copy of the pipe so dst_proc gets SIGPIPE if it dies + # before src_proc finishes writing — otherwise we'd deadlock. + if src_proc.stdout is not None: + src_proc.stdout.close() + + dst_rc = dst_proc.wait() + src_rc = src_proc.wait() + if src_rc != 0 or dst_rc != 0: + raise subprocess.CalledProcessError( + dst_rc or src_rc, + f"tar-pipe {src} → {dst} (src_rc={src_rc} dst_rc={dst_rc})", + ) + + +def checkpoint_tree_ready(path: pathlib.Path) -> bool: + """Return True if *path* looks like a HuggingFace ``transformers`` checkpoint dir.""" + if not (path / "config.json").is_file(): + return False + index_file = path / "model.safetensors.index.json" + if not index_file.is_file(): + return True + shards = set(json.loads(index_file.read_text()).get("weight_map", {}).values()) + return all((path / shard).is_file() for shard in shards) + + +# Backward-compatible alias used by other test files. +libero_checkpoint_tree_ready = checkpoint_tree_ready + + +def demo_dataset_tree_ready(path: pathlib.Path) -> bool: + """Return True if *path* looks like a bundled LeRobot demo dataset. + + Checks for ``meta/modality.json``, at least one ``.parquet`` under ``data/``, + and at least one ``.mp4`` under ``videos/``. + """ + if not (path / "meta" / "modality.json").is_file(): + return False + data_dir = path / "data" + if not data_dir.is_dir() or not any(data_dir.rglob("*.parquet")): + return False + videos_dir = path / "videos" + if not videos_dir.is_dir() or not any(videos_dir.rglob("*.mp4")): + return False + return True + + +# Backward-compatible alias used by other test files. +libero_demo_tree_ready = demo_dataset_tree_ready + + +# --------------------------------------------------------------------------- +# Generic model checkpoint resolver +# --------------------------------------------------------------------------- + + +def resolve_model_checkpoint_path( + *, + hf_repo_id: str, + hf_subdir: str | None = None, + path_override_env: str | None = None, + repo_root: pathlib.Path | None = None, +) -> pathlib.Path: + """Resolve a GR00T model checkpoint, downloading from HuggingFace if needed. + + Resolution order: + + 1. Environment variable *path_override_env* (must be a complete checkpoint). + 2. ``/checkpoints//``. + 3. Git worktree toplevel + same relative ``checkpoints/...`` path. + 4. ``TEST_CACHE_PATH/models//``, downloading from + HuggingFace when missing (requires ``HF_TOKEN``). + + Args: + hf_repo_id: HuggingFace repo id, e.g. ``"nvidia/GR00T-N1.7-LIBERO"``. + hf_subdir: Optional subdirectory within the repo (e.g. ``"libero_10"``). + path_override_env: Name of an env var that, when set, overrides all other + resolution. + repo_root: Repository root (auto-detected if ``None``). + """ + root = repo_root if repo_root is not None else get_root() + model_name = hf_repo_id.split("/")[-1] + rel_path = f"checkpoints/{model_name}/{hf_subdir}" if hf_subdir else f"checkpoints/{model_name}" + + if path_override_env: + override = os.environ.get(path_override_env, "").strip() + if override: + p = pathlib.Path(override).expanduser().resolve() + assert checkpoint_tree_ready(p), ( + f"{path_override_env} does not point to a complete checkpoint directory: {p}" + ) + return p + + local = root / rel_path + if checkpoint_tree_ready(local): + return local + + try: + toplevel = subprocess.check_output( + ["git", "rev-parse", "--show-toplevel"], + cwd=str(root), + text=True, + timeout=30, + ).strip() + git_cp = pathlib.Path(toplevel) / rel_path + if checkpoint_tree_ready(git_cp): + return git_cp + except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired): + pass + + shared_root = TEST_CACHE_PATH / "models" / model_name + shared = shared_root / hf_subdir if hf_subdir else shared_root + if checkpoint_tree_ready(shared): + return shared + + allow = [f"{hf_subdir}/*"] if hf_subdir else None + token = os.environ.get("HF_TOKEN", "") + assert token, "HF_TOKEN is required to download gated models. Set via: export HF_TOKEN=hf_..." + + from huggingface_hub import snapshot_download + + snapshot_download( + repo_id=hf_repo_id, + local_dir=str(shared_root), + token=token, + **({"allow_patterns": allow} if allow else {}), + ) + assert checkpoint_tree_ready(shared), ( + f"Checkpoint at {shared} is incomplete after resolve/download " + "(check HF_TOKEN, network, and Hugging Face repo layout)." + ) + return shared + + +# --------------------------------------------------------------------------- +# Generic demo dataset resolver +# --------------------------------------------------------------------------- + + +def resolve_demo_dataset( + *, + dataset_name: str, + path_override_env: str | None = None, + global_env_var: str | None = None, + hf_download_env_var: str | None = None, + repo_root: pathlib.Path | None = None, +) -> pathlib.Path: + """Resolve a bundled LeRobot demo dataset by *dataset_name*. + + Resolution order (first match wins): + + 1. *path_override_env* environment variable (per-test override). + 2. *global_env_var* environment variable (CI / local override). + 3. ``/demo_data/`` — normal clone with Git LFS. + 4. ``TEST_CACHE_PATH/datasets/`` — shared PVC / local cache. + 5. If *hf_download_env_var* is set in the environment, download from HuggingFace + into the shared path (requires ``HF_TOKEN``). + + Args: + dataset_name: Directory name under ``demo_data/`` (e.g. ``"libero_demo"`` + or ``"droid_sample"``). + path_override_env: Name of an env var for per-test path override. + global_env_var: Name of an env var for a global path override + (e.g. ``"LIBERO_DEMO_DATASET_PATH"``). + hf_download_env_var: Name of an env var whose value is a HuggingFace + *dataset* repo id; when set, the dataset is downloaded into shared + storage. + repo_root: Repository root (auto-detected if ``None``). + """ + root = repo_root if repo_root is not None else get_root() + + if path_override_env: + alt = os.environ.get(path_override_env, "").strip() + if alt: + resolved = pathlib.Path(alt).expanduser().resolve() + assert demo_dataset_tree_ready(resolved), ( + f"{path_override_env} does not point to a complete demo dataset: {resolved}" + ) + return resolved + + if global_env_var: + env_path = os.environ.get(global_env_var, "").strip() + if env_path: + resolved = pathlib.Path(env_path).expanduser().resolve() + assert demo_dataset_tree_ready(resolved), ( + f"{global_env_var} does not point to a complete demo dataset tree: {resolved}" + ) + return resolved + + in_repo = root / "demo_data" / dataset_name + if demo_dataset_tree_ready(in_repo): + return in_repo + + shared = TEST_CACHE_PATH / "datasets" / dataset_name + if demo_dataset_tree_ready(shared): + return shared + + if hf_download_env_var: + hf_dataset = os.environ.get(hf_download_env_var, "").strip() + if hf_dataset: + token = os.environ.get("HF_TOKEN", "") + assert token, ( + f"HF_TOKEN is required to download {hf_download_env_var} into shared storage" + ) + shared.parent.mkdir(parents=True, exist_ok=True) + from huggingface_hub import snapshot_download + + snapshot_download( + repo_id=hf_dataset, + repo_type="dataset", + local_dir=str(shared), + token=token, + ) + assert demo_dataset_tree_ready(shared), ( + f"Downloaded HuggingFace dataset into {shared} but it does not match " + "expected LeRobot demo dataset layout" + ) + return shared + + raise AssertionError( + f"{dataset_name} dataset not found. " + f"It ships in-repo under demo_data/{dataset_name} (requires Git LFS). " + f"Alternatives: set {global_env_var or path_override_env or 'a path env var'} " + f"to an existing checkout; populate {shared} on the shared drive " + "(CI_SHARED_DRIVE_PATH / ~/.cache/g00t)." + ) + + +# --------------------------------------------------------------------------- +# LIBERO-specific convenience wrappers (backward compatibility) +# --------------------------------------------------------------------------- + +_LIBERO_N17_LIBERO_REPO = "nvidia/GR00T-N1.7-LIBERO" +_LIBERO_N17_LIBERO_SUBDIR = "libero_10" + + +def resolve_libero_n17_libero10_checkpoint_path( + repo_root: pathlib.Path | None = None, + *, + path_override_env: str, +) -> pathlib.Path: + """Resolve the LIBERO-finetuned GR00T-N1.7 checkpoint (``libero_10`` subfolder). + + Thin wrapper around :func:`resolve_model_checkpoint_path` kept for backward + compatibility with existing callers. + """ + return resolve_model_checkpoint_path( + hf_repo_id=_LIBERO_N17_LIBERO_REPO, + hf_subdir=_LIBERO_N17_LIBERO_SUBDIR, + path_override_env=path_override_env, + repo_root=repo_root, + ) + + +def resolve_libero_demo_dataset_path( + repo_root: pathlib.Path | None = None, + *, + path_override_env: str | None = None, +) -> pathlib.Path: + """Return the path to the LIBERO ``libero_demo`` dataset. + + Thin wrapper around :func:`resolve_demo_dataset` kept for backward + compatibility with existing callers. + """ + return resolve_demo_dataset( + dataset_name="libero_demo", + path_override_env=path_override_env, + global_env_var="LIBERO_DEMO_DATASET_PATH", + hf_download_env_var="GR00T_LIBERO_DEMO_HF_DATASET", + repo_root=repo_root, + ) + + +_DROID_N17_REPO = "nvidia/GR00T-N1.7-DROID" + + +def resolve_droid_n17_checkpoint_path( + repo_root: pathlib.Path | None = None, + *, + path_override_env: str, +) -> pathlib.Path: + """Resolve the DROID-finetuned GR00T-N1.7 checkpoint. + + Resolution order: + + 1. Environment variable named by *path_override_env* (must be a complete checkpoint). + 2. ``/checkpoints/GR00T-N1.7-DROID``. + 3. Git worktree toplevel + same relative ``checkpoints/...`` path. + 4. ``TEST_CACHE_PATH/models/GR00T-N1.7-DROID``, downloading + from Hugging Face when missing (requires ``HF_TOKEN``). + + Raises: + AssertionError: if overrides are incomplete or download leaves a broken tree. + """ + root = repo_root if repo_root is not None else get_root() + + override = os.environ.get(path_override_env, "").strip() + if override: + p = pathlib.Path(override).expanduser().resolve() + assert libero_checkpoint_tree_ready(p), ( + f"{path_override_env} does not point to a complete checkpoint directory: {p}" + ) + return p + + local = root / "checkpoints/GR00T-N1.7-DROID" + if libero_checkpoint_tree_ready(local): + return local + + try: + toplevel = subprocess.check_output( + ["git", "rev-parse", "--show-toplevel"], + cwd=str(root), + text=True, + timeout=30, + ).strip() + git_cp = pathlib.Path(toplevel) / "checkpoints/GR00T-N1.7-DROID" + if libero_checkpoint_tree_ready(git_cp): + return git_cp + except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired): + pass + + return resolve_model_checkpoint_path( + hf_repo_id=_DROID_N17_REPO, + path_override_env=path_override_env, + repo_root=repo_root, + ) + + +def resolve_droid_demo_dataset_path( + repo_root: pathlib.Path | None = None, + *, + path_override_env: str | None = None, +) -> pathlib.Path: + """Return the path to the DROID ``droid_sample`` dataset (small LeRobot bundle). + + This is the 3-episode DROID demo described in the README under + ``demo_data/droid_sample`` (Git LFS in the Isaac-GR00T repo). + + Resolution order (first match wins): + + 0. If *path_override_env* is set and that variable is non-empty in the + environment, its path is used (must satisfy :func:`libero_demo_tree_ready`). + 1. ``DROID_DEMO_DATASET_PATH`` — explicit directory (CI or local override). + 2. ``/demo_data/droid_sample`` — normal clone with Git LFS. + 3. ``TEST_CACHE_PATH/datasets/droid_sample`` — shared PVC / local cache. + + Raises: + AssertionError: if no usable tree is found. + """ + root = repo_root if repo_root is not None else get_root() + + if path_override_env: + alt = os.environ.get(path_override_env, "").strip() + if alt: + resolved = pathlib.Path(alt).expanduser().resolve() + assert libero_demo_tree_ready(resolved), ( + f"{path_override_env} does not point to a complete droid_sample-style dataset: " + f"{resolved}" + ) + return resolved + + env_path = os.environ.get("DROID_DEMO_DATASET_PATH", "").strip() + if env_path: + resolved = pathlib.Path(env_path).expanduser().resolve() + assert libero_demo_tree_ready(resolved), ( + f"DROID_DEMO_DATASET_PATH does not point to a complete droid_sample tree: {resolved}" + ) + return resolved + + in_repo = root / "demo_data" / "droid_sample" + if libero_demo_tree_ready(in_repo): + return in_repo + + shared = TEST_CACHE_PATH / "datasets" / "droid_sample" + if libero_demo_tree_ready(shared): + return shared + + raise AssertionError( + "droid_sample dataset not found. It ships in-repo under demo_data/droid_sample " + "(requires Git LFS). Alternatives: set DROID_DEMO_DATASET_PATH to an existing checkout; " + f"populate {shared} on the shared drive (CI_SHARED_DRIVE_PATH / ~/.cache/g00t)." + ) + + +EGL_VENDOR_DIRS = [ + pathlib.Path("/usr/share/glvnd/egl_vendor.d"), + pathlib.Path("/etc/glvnd/egl_vendor.d"), + pathlib.Path("/usr/local/share/glvnd/egl_vendor.d"), +] + + +def hf_hub_download_cmd(repo_id: str, filename: str, local_dir: str) -> list[str]: + """Build a ``uv run python -c`` command that downloads a file from HuggingFace. + + Reads HF_TOKEN from the environment and passes it explicitly so gated repos + work without requiring ``huggingface-cli login``. Raises AssertionError if + HF_TOKEN is not set. + """ + token = os.environ.get("HF_TOKEN", "") + assert token, ( + "HF_TOKEN environment variable is not set. " + "A HuggingFace token with access to gated repos is required. " + "Set it via: export HF_TOKEN=hf_..." + ) + return [ + "uv", + "run", + "python", + "-c", + f"from huggingface_hub import hf_hub_download; " + f"hf_hub_download(repo_id={repo_id!r}, filename={filename!r}, " + f"local_dir={local_dir!r}, token={token!r})", + ] + + +# GPU names that contain these tokens are known to have RT cores. +# Compute-only data-center GPUs (A100, H100, H200, B200, V100, etc.) do not. +_RT_CORE_GPU_PATTERNS = ( + r"\brtx\b", # RTX 20xx/30xx/40xx/50xx, Quadro RTX, RTX Ax000 + r"\bl40s?\b", # L40 / L40S + r"\bl4\b", # L4 +) + + +def has_rt_core_gpu() -> bool: + """Return True if any available GPU has RT cores (required for Vulkan ray tracing). + + Checks ``nvidia-smi`` GPU names against known RT-capable product lines. + Returns False if nvidia-smi is unavailable or no matching GPU is found. + """ + try: + result = subprocess.run( + ["nvidia-smi", "--query-gpu=name", "--format=csv,noheader"], + capture_output=True, + text=True, + timeout=10, + ) + if result.returncode != 0: + return False + for name in result.stdout.strip().splitlines(): + if any(re.search(pat, name.strip().lower()) for pat in _RT_CORE_GPU_PATTERNS): + return True + except Exception: + pass + return False + + +def find_nvidia_egl_vendor_file() -> pathlib.Path: + """Return the first NVIDIA EGL vendor JSON file found, or raise FileNotFoundError.""" + for vendor_dir in EGL_VENDOR_DIRS: + for candidate in vendor_dir.glob("*nvidia*.json") if vendor_dir.is_dir() else []: + return candidate + searched = ", ".join(str(d) for d in EGL_VENDOR_DIRS) + raise FileNotFoundError( + f"NVIDIA EGL vendor file not found (searched: {searched}). " + "robosuite requires EGL_PLATFORM_DEVICE_EXT which is only provided by the " + "NVIDIA EGL implementation. Install the NVIDIA GL/EGL packages or run on a " + "host with the full NVIDIA driver stack." + ) + + +def resolve_shared_uv_cache_dir() -> pathlib.Path | None: + """Return a writable uv cache path, or None. + + Only redirects the uv cache when TEST_CACHE_PATH is set — on dev + machines uv's default cache (~/.cache/uv) is already local and fast, so + there is no benefit to overriding it. + """ + if "TEST_CACHE_PATH" not in os.environ: + return None + cache_dir = TEST_CACHE_PATH / "uv-cache" + try: + cache_dir.mkdir(parents=True, exist_ok=True) + return cache_dir + except OSError: + print( + f"[cache] warning: uv cache unavailable at {cache_dir}; " + "falling back to uv default cache dir" + ) + return None + + +def build_shared_hf_cache_env(cache_key: str) -> dict[str, str]: + """Build HF cache environment variables for a cache key.""" + hf_cache_dir = TEST_CACHE_PATH / f"hf-cache/{cache_key}" + try: + hub_cache_dir = hf_cache_dir / "hub" + transformers_cache_dir = hf_cache_dir / "transformers" + datasets_cache_dir = hf_cache_dir / "datasets" + hub_cache_dir.mkdir(parents=True, exist_ok=True) + transformers_cache_dir.mkdir(parents=True, exist_ok=True) + datasets_cache_dir.mkdir(parents=True, exist_ok=True) + except OSError: + print( + f"[cache] warning: Hugging Face cache unavailable at {hf_cache_dir}; " + "falling back to defaults" + ) + return {} + + return { + "HF_HOME": str(hf_cache_dir), + "HF_HUB_CACHE": str(hub_cache_dir), + "HUGGINGFACE_HUB_CACHE": str(hub_cache_dir), + "TRANSFORMERS_CACHE": str(transformers_cache_dir), + "HF_DATASETS_CACHE": str(datasets_cache_dir), + } + + +def assert_port_available(host: str, port: int) -> None: + """Raise AssertionError if the port is already bound. + + Call this before starting a model server subprocess to catch port conflicts + early (e.g. a leftover process from a previous test run or two tests + inadvertently assigned the same port). + """ + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + try: + s.bind((host, port)) + except OSError as exc: + raise AssertionError( + f"Port {port} on {host} is already in use. " + "Each test file uses a unique port — check for a conflicting " + "process or a previous test run that did not shut down cleanly." + ) from exc + + +def start_server_process( + server_code: str, + *, + cwd: pathlib.Path, + env: dict[str, str], +) -> tuple[subprocess.Popen, pathlib.Path]: + """Start a model server subprocess with stderr captured to a temp file. + + Returns the Popen object and the path to the stderr log file. On failure + the caller should read and print the log so CI output includes the error. + """ + stderr_log = pathlib.Path(tempfile.mktemp(prefix="server_stderr_", suffix=".log")) + stderr_fh = open(stderr_log, "w") # noqa: SIM115 + proc = subprocess.Popen( + ["bash", "-c", server_code], + cwd=cwd, + env=env, + stdout=stderr_fh, + stderr=stderr_fh, + ) + return proc, stderr_log + + +def _dump_server_log(log_path: pathlib.Path, tail_chars: int = 8000) -> str: + """Read the tail of a server log file and return it as a string.""" + try: + text = log_path.read_text() + return text[-tail_chars:] if len(text) > tail_chars else text + except OSError: + return "" + + +def wait_for_server_ready( + proc: subprocess.Popen, + host: str, + port: int, + timeout_s: float, + server_log: pathlib.Path | None = None, +) -> None: + """Wait until the server accepts TCP connections, or raise if it dies/times out.""" + deadline = time.monotonic() + timeout_s + while True: + if proc.poll() is not None: + log_info = "" + if server_log is not None: + log_info = f"\nServer output:\n{_dump_server_log(server_log)}" + raise AssertionError( + f"Model server failed to start.\nreturncode={proc.returncode}{log_info}" + ) + try: + with socket.create_connection((host, port), timeout=1.0): + elapsed = time.monotonic() - deadline + timeout_s + print(f"Model server ready after {elapsed:.1f}s.") + return + except OSError: + if time.monotonic() >= deadline: + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=15) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait(timeout=15) + log_info = "" + if server_log is not None: + log_info = f"\nServer output:\n{_dump_server_log(server_log)}" + raise AssertionError( + "Model server did not become ready before timeout.\n" + f"timeout_seconds={timeout_s}\n" + f"Set the corresponding env var to override.{log_info}" + ) + time.sleep(0.5) + + +def run_subprocess_step( + cmd: list[str], + *, + step: str, + cwd: pathlib.Path, + env: dict[str, str], + timeout_s: int | float | None = None, + stream_output: bool = False, + log_prefix: str = "examples", + failure_prefix: str = "Subprocess step failed", + output_tail_chars: int = 8000, +) -> tuple[subprocess.CompletedProcess, float]: + """Run a subprocess step with consistent timing/logging/failure formatting.""" + print(f"[{log_prefix}] step={step} command={' '.join(cmd)}", flush=True) + start = time.perf_counter() + run_kwargs = { + "cwd": cwd, + "env": env, + "check": False, + } + if timeout_s is not None: + run_kwargs["timeout"] = timeout_s + if not stream_output: + run_kwargs["capture_output"] = True + run_kwargs["text"] = True + result = subprocess.run(cmd, **run_kwargs) + elapsed_s = time.perf_counter() - start + print(f"[{log_prefix}] step={step} elapsed_s={elapsed_s:.2f}", flush=True) + + if result.returncode != 0: + if stream_output: + output_info = "See streamed test logs above for subprocess output." + else: + output = (result.stdout or "") + (result.stderr or "") + output_info = f"output_tail=\n{output[-output_tail_chars:]}" + raise AssertionError( + f"{failure_prefix}: {step}\n" + f"elapsed_s={elapsed_s:.2f}\n" + f"returncode={result.returncode}\n" + f"command={' '.join(cmd)}\n" + f"{output_info}" + ) + return result, elapsed_s + + +@contextlib.contextmanager +def timed(label: str): + """Context manager that prints the wall-clock duration of a labelled phase. + + Usage:: + + with timed("model load"): + model = load_model(...) + """ + print(f"[timing] {label} — starting", flush=True) + t0 = time.perf_counter() + try: + yield + finally: + elapsed = time.perf_counter() - t0 + print(f"[timing] {label} — done in {elapsed:.1f}s", flush=True) diff --git a/tests/test_support/sync.py b/tests/test_support/sync.py new file mode 100644 index 000000000..1e45329c0 --- /dev/null +++ b/tests/test_support/sync.py @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Sync test helpers.""" + +from __future__ import annotations + +import importlib +from pathlib import Path +import sys +from types import ModuleType + + +def load_sync_module(module_name: str): + """Import a sync module with lightweight `git` stubs for unit tests.""" + repo_root = Path(__file__).resolve().parents[2] + if str(repo_root) not in sys.path: + sys.path.insert(0, str(repo_root)) + + git_module = sys.modules.get("git") + if git_module is None: + git_module = ModuleType("git") + sys.modules["git"] = git_module + git_module.Repo = object + git_module.__path__ = [] + + if "git.exc" not in sys.modules: + git_exc = ModuleType("git.exc") + git_exc.GitCommandError = RuntimeError + sys.modules["git.exc"] = git_exc + + return importlib.import_module(module_name) diff --git a/tests/test_support/test_fast_copy_tree.py b/tests/test_support/test_fast_copy_tree.py new file mode 100644 index 000000000..763370972 --- /dev/null +++ b/tests/test_support/test_fast_copy_tree.py @@ -0,0 +1,201 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Unit tests for ``fast_copy_tree``. + +The helper is exercised against ``tmp_path`` so the tests are hermetic +and don't depend on a real ``/shared`` NFS mount. Each test pins one +behavioural property: bulk parity with ``shutil.copytree``, symlink +dereference vs preserve, dirs-exist merging, ``tar``-missing fallback, +and the not-a-directory contract. +""" + +from __future__ import annotations + +import pathlib +import shutil + +import pytest +from test_support import runtime + + +def _materialise_tree(root: pathlib.Path) -> dict[str, bytes]: + """Create a small mixed tree under *root*; return path → content map.""" + files: dict[str, bytes] = { + "top.txt": b"hello\n", + "pkg/__init__.py": b"", + "pkg/sub/data.bin": b"\x00\x01\x02" * 100, + "pkg/sub/empty": b"", + } + for rel, content in files.items(): + path = root / rel + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(content) + return files + + +def _read_tree(root: pathlib.Path) -> dict[str, bytes]: + """Return path → content map of all regular files under *root*.""" + out: dict[str, bytes] = {} + for path in sorted(root.rglob("*")): + if path.is_file() and not path.is_symlink(): + out[str(path.relative_to(root))] = path.read_bytes() + return out + + +def test_copies_files_and_subdirs(tmp_path): + """Round-trip: bytes and tree shape match the source after copy.""" + src = tmp_path / "src" + expected = _materialise_tree(src) + dst = tmp_path / "dst" + + runtime.fast_copy_tree(src, dst) + + assert _read_tree(dst) == expected + + +def test_dereferences_symlinks_by_default(tmp_path): + """``symlinks=False`` (default) must copy real bytes, not symlinks. + + Load-bearing for staged ``/shared`` trees: leaving a symlink in the + staged copy would route subsequent reads back over NFS and defeat + the purpose of staging. + """ + src = tmp_path / "src" + src.mkdir() + target = src / "real.bin" + target.write_bytes(b"payload") + (src / "link.bin").symlink_to(target) + dst = tmp_path / "dst" + + runtime.fast_copy_tree(src, dst) + + copied_link = dst / "link.bin" + assert copied_link.exists() + assert not copied_link.is_symlink() + assert copied_link.read_bytes() == b"payload" + + +def test_preserves_symlinks_when_requested(tmp_path): + """``symlinks=True`` must keep symlinks verbatim (libero venv pattern).""" + src = tmp_path / "src" + src.mkdir() + target = src / "real.bin" + target.write_bytes(b"payload") + (src / "link.bin").symlink_to(target) + dst = tmp_path / "dst" + + runtime.fast_copy_tree(src, dst, symlinks=True) + + copied_link = dst / "link.bin" + assert copied_link.is_symlink() + + +def test_merges_into_existing_destination(tmp_path): + """Existing dst entries are preserved; same-name entries overwritten. + + Matches ``shutil.copytree(dirs_exist_ok=True)`` semantics so the new + helper is a drop-in replacement for the prior call sites. + """ + src = tmp_path / "src" + src.mkdir() + (src / "shared.txt").write_bytes(b"new") + (src / "src_only.txt").write_bytes(b"src") + + dst = tmp_path / "dst" + dst.mkdir() + (dst / "shared.txt").write_bytes(b"old") + (dst / "dst_only.txt").write_bytes(b"dst") + + runtime.fast_copy_tree(src, dst) + + assert (dst / "shared.txt").read_bytes() == b"new" + assert (dst / "src_only.txt").read_bytes() == b"src" + assert (dst / "dst_only.txt").read_bytes() == b"dst" + + +def test_falls_back_to_copytree_when_tar_missing(monkeypatch, tmp_path): + """When ``tar`` is unavailable we fall back to ``shutil.copytree``. + + Asserted via a monkeypatched ``shutil.which`` so the test is + hermetic regardless of host PATH. + """ + src = tmp_path / "src" + expected = _materialise_tree(src) + dst = tmp_path / "dst" + + monkeypatch.setattr(runtime.shutil, "which", lambda _: None) + + called: list[tuple[str, str]] = [] + real_copytree = shutil.copytree + + def _spy_copytree(s, d, *args, **kwargs): + # Only the top-level call records — copytree() recurses into + # itself for subdirs, so filter to the call we initiated. + if str(s) == str(src): + called.append((str(s), str(d))) + return real_copytree(s, d, *args, **kwargs) + + monkeypatch.setattr(runtime.shutil, "copytree", _spy_copytree) + + runtime.fast_copy_tree(src, dst) + + assert called == [(str(src), str(dst))] + assert _read_tree(dst) == expected + + +def test_rejects_non_directory_source(tmp_path): + """Helper rejects file/non-existent sources up-front rather than mid-pipe. + + Prevents the more confusing failure mode where ``tar`` would error + deep inside the pipe and we'd surface a generic non-zero rc. + """ + not_a_dir = tmp_path / "not_a_dir.txt" + not_a_dir.write_bytes(b"") + with pytest.raises(NotADirectoryError): + runtime.fast_copy_tree(not_a_dir, tmp_path / "dst") + + +def test_reaps_src_proc_when_dst_popen_fails(monkeypatch, tmp_path): + """If the second Popen raises, src_proc must not be left as a zombie. + + Pre-fix, the only cleanup was closing the pipe fd; src_proc kept + running with no reader and was never `wait()`-ed. Under repeated + failures (CI memory pressure) this accumulated zombies. + """ + src = tmp_path / "src" + _materialise_tree(src) + dst = tmp_path / "dst" + + real_popen = runtime.subprocess.Popen + started: list[runtime.subprocess.Popen] = [] + call_count = {"n": 0} + + def _failing_popen(cmd, *args, **kwargs): + call_count["n"] += 1 + if call_count["n"] == 1: + proc = real_popen(cmd, *args, **kwargs) + started.append(proc) + return proc + raise OSError("simulated dst Popen failure") + + monkeypatch.setattr(runtime.subprocess, "Popen", _failing_popen) + + with pytest.raises(OSError, match="simulated dst Popen failure"): + runtime.fast_copy_tree(src, dst) + + assert len(started) == 1 + src_proc = started[0] + assert src_proc.returncode is not None, "src_proc was not reaped after dst Popen failure" diff --git a/tests/tools/test_manifest_alignment.py b/tests/tools/test_manifest_alignment.py new file mode 100644 index 000000000..4906bda8c --- /dev/null +++ b/tests/tools/test_manifest_alignment.py @@ -0,0 +1,242 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""CPU-only tests for ``tools/check_manifest_alignment.py``. + +The tests have two roles: a detector self-check against synthetic +manifests (so a future change to the rules cannot regress the contract +silently), and a live-manifest gate that runs the detector against the +four real ``pyproject.toml`` files and fails CI on any unannotated +drift — closing the loop that would otherwise only surface as a Jetson +install error. +""" + +from __future__ import annotations + +from pathlib import Path +import sys + +from packaging.specifiers import SpecifierSet +from packaging.version import Version +import pytest + + +REPO_ROOT = Path(__file__).resolve().parents[2] +TOOLS_DIR = REPO_ROOT / "tools" + + +@pytest.fixture(scope="module") +def check_module(): + """Import ``tools/check_manifest_alignment``. ``tools/`` is not a + package, so add it to ``sys.path`` before importing.""" + tools_str = str(TOOLS_DIR) + if tools_str not in sys.path: + sys.path.insert(0, tools_str) + import check_manifest_alignment as mod # type: ignore[import-not-found] + + return mod + + +# --------------------------------------------------------------------------- +# Live manifest gate +# --------------------------------------------------------------------------- + + +def test_live_manifests_have_no_unannotated_drift(check_module): + """Fail CI if any non-HW-tied dependency drifts across the four + manifests without an entry in ``tools/manifest_alignment.toml``. + Resolve by aligning the pin or by recording the intentional + divergence with a reason.""" + parsed = { + name: check_module.parse_manifest(path) for name, path in check_module.MANIFESTS.items() + } + allowlist = check_module.load_allowlist() + drifts = check_module.detect_drifts(parsed) + unannotated = [d for d in drifts if d.package not in allowlist] + + if unannotated: + report = "\n".join(f" - {d.package} ({d.kind}): {d.detail}" for d in unannotated) + pytest.fail( + f"{len(unannotated)} unannotated manifest drift(s) found:\n{report}\n" + "Fix by aligning the pins across all four pyproject.toml files " + "or by recording the intentional divergence in " + "tools/manifest_alignment.toml with a reason." + ) + + +def test_live_manifests_carry_the_b_027_pins(check_module): + """Pin the specific bugs this MR closes: every Jetson manifest + declares ``huggingface-hub`` / ``jsonlines`` / ``opencv-python-headless``, + and main declares ``onnxscript``. A future refactor that drops one + of these fails this test instead of breaking a Jetson install.""" + parsed = { + name: check_module.parse_manifest(path) for name, path in check_module.MANIFESTS.items() + } + + for jetson in ("orin", "spark", "thor"): + for pkg in ("huggingface-hub", "jsonlines", "opencv-python-headless"): + assert pkg in parsed[jetson], ( + f"{jetson}/pyproject.toml must declare {pkg!r} (regression for " + "the silent-missing-pin family this MR closes)." + ) + + assert "onnxscript" in parsed["main"], ( + "main pyproject.toml must declare onnxscript (regression for the " + "ONNX-export pipeline pin family this MR closes)." + ) + + +def test_live_main_cryptography_is_at_least_44(check_module): + """Pin the security-fix half of the bundle: main ``cryptography`` + must reject the CVE-affected 42.x / 43.x series (CVE-2024-26130 et + al.). Any spec that admits a version below 44 fails this test — + upgrades to 44+/45+/46+/… all pass.""" + parsed = check_module.parse_manifest(check_module.MANIFESTS["main"]) + pins = parsed.get("cryptography", []) + assert pins, "main pyproject.toml must declare cryptography" + spec_strs = [pin.spec for pin in pins] + assert all(spec_strs), ( + f"main cryptography must carry a version spec, not a loose pin. Got: {spec_strs}" + ) + pre44_probes = [Version("42.0.8"), Version("43.0.0"), Version("43.99.99")] + for spec_str in spec_strs: + spec = SpecifierSet(spec_str) + admitted = [str(v) for v in pre44_probes if spec.contains(v)] + assert not admitted, ( + f"main cryptography spec {spec_str!r} admits CVE-affected " + f"version(s) {admitted}; expected lower bound >= 44.0.0." + ) + + +# --------------------------------------------------------------------------- +# Detector self-check (synthetic manifests) +# --------------------------------------------------------------------------- + + +def test_canonical_lowercases_and_collapses_separators(check_module): + """PEP 503 normalisation: surface variants of the same name must + compare equal.""" + canon = check_module._canonical + assert canon("Huggingface-Hub") == "huggingface-hub" + assert canon("hugging_face.hub") == "hugging-face-hub" + assert canon("HUGGINGFACE_HUB") == "huggingface-hub" + + +@pytest.mark.parametrize( + "name, expected", + [ + ("torch", True), + ("torchvision", True), + ("torchcodec", True), + ("triton", True), + ("flash-attn", True), + ("deepspeed", True), + ("tensorrt", True), + ("tensorrt-cu12", True), + ("tensorrt-cu13", True), + ("nvidia-cudnn-cu13", True), + ("nvidia-cudss-cu13", True), + # NON-HW packages — must NOT be auto-skipped. + ("transformers", False), + ("cryptography", False), + ("opencv-python-headless", False), + ("huggingface-hub", False), + ("diffusers", False), + ("onnxscript", False), + ], +) +def test_hw_tied_pattern_classification(check_module, name, expected): + """Pin each known HW vs non-HW name explicitly so a typo in the + auto-skip pattern cannot silently mute drift detection for a real + package family.""" + assert check_module._is_hw_tied(name) is expected, ( + f"{name!r} HW-tied classification mismatch: expected {expected}" + ) + + +def test_parse_dep_extracts_name_extras_spec_and_marker(check_module): + """Cover every PEP 508 surface the real manifests use: extras, + version specs, and environment markers.""" + pin = check_module._parse_dep("huggingface-hub[cli]") + assert pin is not None + assert pin.name == "huggingface-hub" + assert pin.spec == "" + assert pin.marker is None + + pin = check_module._parse_dep("torchcodec==0.4.0; platform_machine == 'x86_64'") + assert pin is not None + assert pin.name == "torchcodec" + assert pin.spec == "==0.4.0" + assert pin.marker == "platform_machine == 'x86_64'" + + pin = check_module._parse_dep("opencv-python-headless>=4.5,<4.13") + assert pin is not None + assert pin.name == "opencv-python-headless" + assert pin.spec == ">=4.5,<4.13" + + +def test_detect_drifts_flags_presence_and_version_drift(check_module): + """End-to-end on a synthetic 3-manifest input covering presence + drift, version drift, an auto-skipped HW-tied package, and a fully + aligned package.""" + parse = check_module._parse_dep + manifests = { + "main": { + "transformers": [parse("transformers==4.57.3")], + "torch": [parse("torch==2.7.1")], + "huggingface-hub": [parse("huggingface-hub[cli]")], + "numpy": [parse("numpy==1.26.4")], + }, + "jetson_a": { + "transformers": [parse("transformers==4.57.6")], + "torch": [parse("torch==2.10.0")], # HW-tied, divergent — must be skipped + "numpy": [parse("numpy==1.26.4")], + }, + "jetson_b": { + "transformers": [parse("transformers==4.57.3")], + "torch": [parse("torch==2.10.0")], + "huggingface-hub": [parse("huggingface-hub[cli]")], + "numpy": [parse("numpy==1.26.4")], + }, + } + drifts = check_module.detect_drifts(manifests) + by_pkg = {d.package: d for d in drifts} + + assert "torch" not in by_pkg, "HW-tied package must be auto-skipped" + assert "numpy" not in by_pkg, "fully aligned package must not appear" + assert "transformers" in by_pkg + assert by_pkg["transformers"].kind == "version" + assert "huggingface-hub" in by_pkg + assert by_pkg["huggingface-hub"].kind == "presence" + assert "missing from [jetson_a]" in by_pkg["huggingface-hub"].detail + + +def test_load_allowlist_round_trips_reason(check_module, tmp_path): + """Allowlist names must be PEP 503-normalised so + ``[allowed_drifts.dm_tree]`` matches a manifest's ``dm-tree`` + entry.""" + allow_file = tmp_path / "allow.toml" + allow_file.write_text( + '[allowed_drifts.dm_tree]\nreason = "loose on main, pinned on jetson"\n', + encoding="utf-8", + ) + allowlist = check_module.load_allowlist(allow_file) + assert allowlist == {"dm-tree": "loose on main, pinned on jetson"} + + +def test_load_allowlist_missing_file_returns_empty(check_module, tmp_path): + """A missing allowlist file must not crash the script — the check + still works on a fresh checkout.""" + assert check_module.load_allowlist(tmp_path / "absent.toml") == {} diff --git a/tools/check_manifest_alignment.py b/tools/check_manifest_alignment.py new file mode 100644 index 000000000..0f8f2cc1f --- /dev/null +++ b/tools/check_manifest_alignment.py @@ -0,0 +1,328 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. + +"""Cross-platform ``pyproject.toml`` manifest alignment check. + +The repo ships four platform manifests (dGPU, Orin, Spark, Thor). They +are not a ``uv`` workspace, so PEP 621 has no native way to share pins +across them and a missed mirror only surfaces at install time on the +unsynced platform. This script is the CI lint that catches the gap. + +It walks the four manifests, normalises the ``[project.dependencies]`` +lists, and flags two classes of cross-manifest drift: + + * **presence** — a package present in some manifests but absent from + others. + * **version** — same package, different version constraints. + +CUDA / wheel-index-tied dependencies (``torch``, ``torchvision``, +``triton``, ``flash-attn``, ``torchcodec``, ``tensorrt-*``, +``deepspeed``, ``nvidia-*``) are intentionally divergent per platform +and are auto-skipped by name pattern. Other intentional drifts are +documented in ``tools/manifest_alignment.toml``. + +Usage:: + + python tools/check_manifest_alignment.py # lint + python tools/check_manifest_alignment.py --report # also print allow-listed drifts + +Exit code 0 if no unannotated drift, 1 otherwise. +""" + +from __future__ import annotations + +import argparse +from collections import defaultdict +from collections.abc import Iterable +from dataclasses import dataclass +from pathlib import Path +import re +import sys +from typing import cast + + +try: + # Python 3.11+ + import tomllib as _toml +except ModuleNotFoundError: # pragma: no cover — supports running under 3.10 + import tomli as _toml # type: ignore[import-not-found, no-redef] + + +REPO_ROOT = Path(__file__).resolve().parents[1] + +MANIFESTS: dict[str, Path] = { + "main": REPO_ROOT / "pyproject.toml", + "orin": REPO_ROOT / "scripts" / "deployment" / "orin" / "pyproject.toml", + "spark": REPO_ROOT / "scripts" / "deployment" / "spark" / "pyproject.toml", + "thor": REPO_ROOT / "scripts" / "deployment" / "thor" / "pyproject.toml", +} + +# CUDA / wheel-index-tied packages — intentionally divergent per platform. +# Matched by exact name OR prefix (the `*` suffix marks a prefix rule). +_HW_TIED_PATTERNS: tuple[str, ...] = ( + "torch", + "torchvision", + "torchcodec", + "triton", + "flash-attn", + "deepspeed", + "tensorrt*", + "nvidia-*", +) + +ALLOWLIST_PATH = REPO_ROOT / "tools" / "manifest_alignment.toml" + + +# --------------------------------------------------------------------------- +# Parsing +# --------------------------------------------------------------------------- + + +# Split a PEP 508 dependency line into name / extras / spec / marker. +# Extras are dropped for the comparison axis; the raw spec is kept so +# the report can quote the exact line a reviewer needs to edit. +_REQ_SPLIT_RE = re.compile( + r"""^ + (?P[A-Za-z0-9._-]+) # canonical project name + (?P\[[^\]]+\])? # optional extras + \s* + (?P[^;]*) # version specifier(s); may be empty + (;\s*(?P.+))? # optional environment marker + $""", + re.VERBOSE, +) + + +@dataclass(frozen=True) +class Pin: + """One dependency from a manifest's ``[project.dependencies]``. + ``marker`` is preserved so platform-conditional pins on the same + package do not falsely diff.""" + + name: str # canonical PEP 503 name (lowercased, dashes) + spec: str # version specifier + marker: str | None + raw: str # original PEP 508 line, surfaced in reports + + +def _canonical(name: str) -> str: + """Apply PEP 503 name normalisation: lowercase + collapse separators.""" + return re.sub(r"[-_.]+", "-", name).lower() + + +def _is_hw_tied(name: str) -> bool: + """True for CUDA / wheel-index-tied packages that are auto-skipped + (intentionally divergent per platform; no allowlist entry needed).""" + name_lc = name.lower() + for pat in _HW_TIED_PATTERNS: + if pat.endswith("*"): + if name_lc.startswith(pat[:-1]): + return True + elif name_lc == pat: + return True + return False + + +def _parse_dep(raw: str) -> Pin | None: + """Parse a PEP 508 dependency string; return ``None`` on a malformed + or empty entry.""" + raw = raw.strip() + if not raw: + return None + m = _REQ_SPLIT_RE.match(raw) + if not m: + return None + name = _canonical(m.group("name")) + spec = (m.group("spec") or "").strip() + marker = m.group("marker") + return Pin(name=name, spec=spec, marker=marker.strip() if marker else None, raw=raw) + + +def parse_manifest(path: Path) -> dict[str, list[Pin]]: + """``{canonical_name: [Pin, ...]}`` for one manifest. The list is + per-name because PEP 508 lets the same package appear multiple + times under different environment markers (e.g. main's + ``torchcodec`` split on ``platform_machine``).""" + data = _toml.loads(path.read_text(encoding="utf-8")) + deps_raw = cast(list[str], data.get("project", {}).get("dependencies", []) or []) + out: dict[str, list[Pin]] = defaultdict(list) + for raw in deps_raw: + pin = _parse_dep(raw) + if pin is None: + continue + out[pin.name].append(pin) + return dict(out) + + +def load_allowlist(path: Path = ALLOWLIST_PATH) -> dict[str, str]: + """``{canonical_package_name: reason}`` for documented intentional + drifts. A missing file yields an empty allow-list.""" + if not path.exists(): + return {} + data = _toml.loads(path.read_text(encoding="utf-8")) + out: dict[str, str] = {} + for name, body in data.get("allowed_drifts", {}).items(): + reason = body.get("reason", "") + out[_canonical(name)] = reason + return out + + +# --------------------------------------------------------------------------- +# Diff +# --------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class Drift: + """One cross-manifest discrepancy on a dependency.""" + + package: str + kind: str # "presence" | "version" + detail: str + + +def detect_drifts( + manifests: dict[str, dict[str, list[Pin]]], +) -> list[Drift]: + """Emit one ``Drift`` per cross-manifest discrepancy: ``presence`` + when a package is missing from at least one manifest but present in + another, ``version`` when the spec set differs (markers are + preserved so platform-conditional pins do not falsely diff).""" + all_names: set[str] = set() + for pins in manifests.values(): + all_names.update(pins.keys()) + + drifts: list[Drift] = [] + + for name in sorted(all_names): + if _is_hw_tied(name): + continue + + # Bucket by which manifest declares the name. + present: dict[str, list[Pin]] = { + mname: pins[name] for mname, pins in manifests.items() if name in pins + } + missing: list[str] = [mname for mname in manifests if mname not in present] + + if missing and present: + present_str = ", ".join(sorted(present.keys())) + missing_str = ", ".join(sorted(missing)) + drifts.append( + Drift( + package=name, + kind="presence", + detail=(f"present in [{present_str}], missing from [{missing_str}]"), + ) + ) + continue + + if missing: + # Absent everywhere — not a drift, just unused. + continue + + # Present in all manifests — compare (spec, marker) signatures; + # more than one distinct signature is a version drift. + sig_per_manifest: dict[str, tuple[tuple[str, str | None], ...]] = {} + for mname, pin_list in present.items(): + sig_per_manifest[mname] = tuple(sorted((pin.spec, pin.marker) for pin in pin_list)) + + unique_sigs = set(sig_per_manifest.values()) + if len(unique_sigs) > 1: + rows = [] + for mname in sorted(sig_per_manifest): + spec_strs = [ + f"{pin.spec or '(unpinned)'}" + (f" ; {pin.marker}" if pin.marker else "") + for pin in present[mname] + ] + rows.append(f"{mname}={' / '.join(spec_strs)}") + drifts.append( + Drift( + package=name, + kind="version", + detail="; ".join(rows), + ) + ) + + return drifts + + +# --------------------------------------------------------------------------- +# Reporting +# --------------------------------------------------------------------------- + + +def _format_drifts(drifts: Iterable[Drift], allowlist: dict[str, str]) -> str: + lines = [] + for d in drifts: + marker = "ALLOWED" if d.package in allowlist else "DRIFT " + reason = f" — allowlisted: {allowlist[d.package]}" if d.package in allowlist else "" + lines.append(f" [{marker}] {d.package} ({d.kind}): {d.detail}{reason}") + return "\n".join(lines) + + +def main(argv: list[str] | None = None) -> int: + p = argparse.ArgumentParser(description=__doc__) + p.add_argument( + "--report", + action="store_true", + help="also print allow-listed (annotated) drifts", + ) + args = p.parse_args(argv) + + for name, path in MANIFESTS.items(): + if not path.exists(): + print(f"FATAL: {name} manifest missing at {path}", file=sys.stderr) + return 2 + + parsed: dict[str, dict[str, list[Pin]]] = { + name: parse_manifest(path) for name, path in MANIFESTS.items() + } + allowlist = load_allowlist() + + drifts = detect_drifts(parsed) + unannotated = [d for d in drifts if d.package not in allowlist] + annotated = [d for d in drifts if d.package in allowlist] + + if args.report and annotated: + print(f"Allow-listed drifts ({len(annotated)}):") + print(_format_drifts(annotated, allowlist)) + print() + + if not unannotated: + print( + f"OK: {len(drifts)} drift(s) total, all allow-listed in " + f"{ALLOWLIST_PATH.relative_to(REPO_ROOT)}." + ) + return 0 + + print( + f"FAIL: {len(unannotated)} unannotated drift(s) across {len(MANIFESTS)} manifests:", + file=sys.stderr, + ) + print(_format_drifts(unannotated, allowlist), file=sys.stderr) + print( + "\nResolve each drift by either:\n" + " (a) aligning the pin / adding the missing dep across all manifests, or\n" + f" (b) recording an intentional divergence in {ALLOWLIST_PATH.relative_to(REPO_ROOT)} " + "with a reason.", + file=sys.stderr, + ) + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/manifest_alignment.toml b/tools/manifest_alignment.toml new file mode 100644 index 000000000..d4c9ecd3b --- /dev/null +++ b/tools/manifest_alignment.toml @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Allow-list for `tools/check_manifest_alignment.py`. Each entry +# documents an intentional drift on a non-HW package that the check +# tolerates. CUDA / wheel-index-tied packages are auto-skipped by name +# pattern in the script and do NOT need an entry here. + +# `diffusers` versions are pinned to the available platform wheel stacks. +# Main, Orin, and Thor use PyPI stable 0.35.1; Spark uses the Jetson AI Lab +# sbsa/cu130 dev pin. This is effectively HW-forced but doesn't match +# the auto-skip pattern (the package name has no CUDA / nvidia prefix). +[allowed_drifts.diffusers] +reason = "Spark is HW-forced via jetson-sbsa-cu130; main/Orin/Thor use PyPI stable" + +# `transformers==4.57.3` (main, spark) vs `==4.57.6` (orin, thor) is a +# patch-level sync lag, not a HW constraint. Aligning requires owner +# sign-off + Jetson CI to confirm tokenizer / processor behaviour does +# not regress at 4.57.6 on x86 dGPU. Tracked separately; the check +# tolerates the divergence until aligned. +[allowed_drifts.transformers] +reason = "patch sync lag pending owner alignment to a single version" + +# `dm-tree` is loose (`dm-tree`) on main but pinned exactly +# (`==0.1.8`) on the three Jetson manifests because the Jetson AI Lab +# indices serve a single curated wheel. Low-priority drift; documented +# until owner decides whether to pin main. +[allowed_drifts.dm-tree] +reason = "loose on main, exact ==0.1.8 on Jetson — pending owner alignment" diff --git a/uv.lock b/uv.lock new file mode 100644 index 000000000..1b5f43d54 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2740 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine == 'aarch64' and sys_platform == 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'darwin'", + "platform_machine == 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'darwin'", + "platform_machine != 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux'", +] +required-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine == 'aarch64' and sys_platform == 'linux'", +] + +[[package]] +name = "absl-py" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/c7/8de93764ad66968d19329a7e0c147a2bb3c7054c554d4a119111b8f9440f/absl_py-2.4.0.tar.gz", hash = "sha256:8c6af82722b35cf71e0f4d1d47dcaebfff286e27110a99fc359349b247dfb5d4", size = 116543, upload-time = "2026-01-28T10:17:05.322Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl", hash = "sha256:88476fd881ca8aab94ffa78b7b6c632a782ab3ba1cd19c9bd423abc4fb4cd28d", size = 135750, upload-time = "2026-01-28T10:17:04.19Z" }, +] + +[[package]] +name = "accelerate" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch", version = "2.9.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/14/787e5498cd062640f0f3d92ef4ae4063174f76f9afd29d13fc52a319daae/accelerate-1.13.0.tar.gz", hash = "sha256:d631b4e0f5b3de4aff2d7e9e6857d164810dfc3237d54d017f075122d057b236", size = 402835, upload-time = "2026-03-04T19:34:12.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl", hash = "sha256:cf1a3efb96c18f7b152eb0fa7490f3710b19c3f395699358f08decca2b8b62e0", size = 383744, upload-time = "2026-03-04T19:34:10.313Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "typing-extensions" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/ab/93ce242f899b68c51b0578c027aafa791ab3614cb9345fa5d37b5f5c8e3e/aiohttp-3.14.0.tar.gz", hash = "sha256:2882de819734c715fd1b9c11c97e09fa020d14438203d1d354d8ed1702791c9b", size = 7940674, upload-time = "2026-06-01T19:41:02.763Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/97/2b6889bfb6b6847520d50d95eb8c4307a45e28aaca39faf4a9454b3d1b2f/aiohttp-3.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b29518c9c2ec7e373e68259206a137c7f4f5439c58baaec4b5ab3ab799850a4e", size = 750194, upload-time = "2026-06-01T19:37:48.164Z" }, + { url = "https://files.pythonhosted.org/packages/21/e2/62634b7fff918ed98c3c6b2f0e70d520f7f28846cb412d451b04354c6459/aiohttp-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dbec68ce61b64cb73cab4d33df9433427b1713c8bcccb181dce695c1b6f8e87c", size = 506966, upload-time = "2026-06-01T19:37:50.014Z" }, + { url = "https://files.pythonhosted.org/packages/dd/fb/5ce075150828c797a5106f1c2fb26034e709d4289b9d2bf8b07f1e59fac6/aiohttp-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cdf534aa455593e589302990c5097aa5c92c06c4262a20da22934f9186a5fff", size = 507527, upload-time = "2026-06-01T19:37:51.96Z" }, + { url = "https://files.pythonhosted.org/packages/01/d5/405a0ae4e6b081754a3609c1c97c63a950e000a2def16046f1e736933a0e/aiohttp-3.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb6c657104393b5fbff01a5f59b2023db74058a8077d94475d6c25d03882a108", size = 1762420, upload-time = "2026-06-01T19:37:53.839Z" }, + { url = "https://files.pythonhosted.org/packages/ae/1d/e05a7c896b15a6bc6fb8fc5319eb437861c2c49c34559ef928add6590315/aiohttp-3.14.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:46fbbec4e4fab7428d4396a3823f9320e4560aa3113b89eeebce712c27c9ed5a", size = 1733672, upload-time = "2026-06-01T19:37:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/cc/22/a72f7c459e195fa41bf4f7abd1f925b91fe91f8097e51c654229ba144a33/aiohttp-3.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c2c7e05dd5335b298085abf45ddf98673934c3ee1c083d0b9ea13d4186ad500", size = 1805064, upload-time = "2026-06-01T19:37:57.931Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/e85bdaba0be59ca4838005ebfef4048fcdd5f35a02b07057a9a123394440/aiohttp-3.14.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3c7139100fbaae76515b73051d8f0aa3a3ff02e415eec8a8eee8e2223d9ba955", size = 1902125, upload-time = "2026-06-01T19:38:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/19/d8/51de5c6b971c27bb1ef620293b8d1ca611ec78736b34b3f6ccf68e4c8785/aiohttp-3.14.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78d6f9286a629ce52728430afe18f8ed2b6c39a1fddb3802d7244b9983910ad2", size = 1783112, upload-time = "2026-06-01T19:38:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b4402bfde77e43dfb1b6ccff83c7b7ab63ed06b50c4754f0c5423fb374fe/aiohttp-3.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3c3e12cdaeb92d7dcf13db00e9f6b1956b910e47256e696df1cfa946d02159", size = 1586356, upload-time = "2026-06-01T19:38:04.637Z" }, + { url = "https://files.pythonhosted.org/packages/bc/05/750a3265ca4dc54a460bd0cb1121a8f2ce9171fce4a135fb47ea7fd594d2/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4d6a998191f5ebe3b8c28463ff72bc030250008b3193c402464efadd08b5ca02", size = 1723119, upload-time = "2026-06-01T19:38:06.713Z" }, + { url = "https://files.pythonhosted.org/packages/37/01/8c0812c50b3b1b1c37b323bf170d6be8847a8f234060485b7d1e71953f60/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0fc2b75ae8d169d853be2862d960be8550da6c5c65711d5476407eb3fdb006bd", size = 1757216, upload-time = "2026-06-01T19:38:08.736Z" }, + { url = "https://files.pythonhosted.org/packages/47/2a/50fb98028a26887cbe48dcc1df92a90825615bc73b5584301304090cded8/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:16eee56bcc72d04600bc56c1759982c2385ec0b41d3fd3521f836bf64a0957ef", size = 1770500, upload-time = "2026-06-01T19:38:11.111Z" }, + { url = "https://files.pythonhosted.org/packages/bd/32/0ffd598a2fa2b9a423daf242e700cfdabda35d6e602394ad9ae58972c1c7/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5a2e7ca615c3ddc15b82687e05a624e5f5cba3f1d6c20cb81172d70ea498451e", size = 1576224, upload-time = "2026-06-01T19:38:13.391Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f9/b9fc381dd9b66afb33f2634c40e229d106467be0afcabe79648631ab6712/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0b7b8bbbec3ce9467ee0ebe334622fd90624f593edd3136c567811453fc4fae", size = 1794252, upload-time = "2026-06-01T19:38:15.498Z" }, + { url = "https://files.pythonhosted.org/packages/a8/fb/05d9214c975f23225a8cd5c439325e338c7c377b315480ef3871db51f54e/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ba10966d4f03dd96a14365be4b8e37c327c76f11c3ca867116966cdd9f98066", size = 1760193, upload-time = "2026-06-01T19:38:17.624Z" }, + { url = "https://files.pythonhosted.org/packages/d9/4b/02992fc4fb9e1b6673ee3f888a8e587a6447afda1f6f4aca776c148c2876/aiohttp-3.14.0-cp312-cp312-win32.whl", hash = "sha256:101df7779c80c0636014a6b2c6642acd3efb5b355d48347c9d7dfb720aee9430", size = 448650, upload-time = "2026-06-01T19:38:19.545Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/246532214c3abda518477cbaaf16d420295ad8effa5233844cbb38f299ab/aiohttp-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:b0a5747586d4467efd1f932710b269131c9717a872dce082cd92a00c1c13123a", size = 476145, upload-time = "2026-06-01T19:38:21.505Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c3/63f8c20090048915711598b0adf475b149216d736157961de06480a45b15/aiohttp-3.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:5f1c5be60add78fabb4aacd13c5a348ae79d2fcbfc7fa78da8f1eb192273b370", size = 444250, upload-time = "2026-06-01T19:38:24.027Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "albucore" +version = "0.0.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "opencv-python-headless" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/03/81e5b3b6ee7911a70ed19028ccfed90f5cb32fc9fb33af5bc587fc1ab6a1/albucore-0.0.17.tar.gz", hash = "sha256:e9956ac4debc47e804f0677ff4e23939ba322986eac16e801f8ea1c98269db65", size = 12271, upload-time = "2024-09-20T19:36:19.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/20/9f56b72131ea71c9566f0cc303a9e92156767845164c0f4ec10534630991/albucore-0.0.17-py3-none-any.whl", hash = "sha256:751a6d219a0b5217b44168d5fae90c27eadfa5bc381cbb7cc74536e90aeeac5b", size = 10378, upload-time = "2024-09-20T19:36:18.796Z" }, +] + +[[package]] +name = "albumentations" +version = "1.4.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "albucore" }, + { name = "eval-type-backport" }, + { name = "numpy" }, + { name = "opencv-python-headless" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "scikit-image" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/52/cd2399a7037a70dd6410a7c890a1cdfd79563c03c4a7f3311278c9a3b1b0/albumentations-1.4.18.tar.gz", hash = "sha256:701a9405f059f761f00ce00e187954d01276bdb78b33abcf864e79727db3bf1a", size = 207321, upload-time = "2024-10-08T22:32:47.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/2f/468208ac3345b59286f5a73dd6e298c111c8a6a5896f658d221cd55ebf8d/albumentations-1.4.18-py3-none-any.whl", hash = "sha256:57ed0a634de9d3b34d003585aa90e9164e164ccc4ecb797eee8fbad8da1e9eaf", size = 224034, upload-time = "2024-10-08T22:32:45.763Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "boto3" +version = "1.42.70" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/7c/d7a533916d1afc9e17f8594203a85799d42f7c5751464fbdb25ead8db9d2/boto3-1.42.70.tar.gz", hash = "sha256:d060b0d83d2832e403671b9a895e73c3b025df8bb5896d89e401b0678705aac4", size = 112808, upload-time = "2026-03-17T19:43:22.445Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/a1/128e3676fb9b4fd965a93554e5e07045975ee6bd6e9fdb536cdffa32e99e/boto3-1.42.70-py3-none-any.whl", hash = "sha256:18a108c4d5df89a200b3949de0d39c0879b100c455e3229ea38275dd392db0f4", size = 140554, upload-time = "2026-03-17T19:43:20.406Z" }, +] + +[[package]] +name = "botocore" +version = "1.42.70" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/b80e1fcee4f732e0e9314bbb8679be9d5690caa1566c4a4cd14e9724d2dd/botocore-1.42.70.tar.gz", hash = "sha256:9ee17553b7febd1a0c1253b3b62ab5d79607eb6163c8fb943470a8893c31d4fa", size = 14997068, upload-time = "2026-03-17T19:43:10.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/51/08f32aea872253173f513ba68122f4300966290677c8e59887b4ffd5d957/botocore-1.42.70-py3-none-any.whl", hash = "sha256:54ed9d25f05f810efd22b0dfda0bb9178df3ad8952b2e4359e05156c9321bd3c", size = 14671393, upload-time = "2026-03-17T19:43:06.777Z" }, +] + +[[package]] +name = "build" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/18/94eaffda7b329535d91f00fe605ab1f1e5cd68b2074d03f255c7d250687d/build-1.4.0.tar.gz", hash = "sha256:f1b91b925aa322be454f8330c6fb48b465da993d1e7e7e6fa35027ec49f3c936", size = 50054, upload-time = "2026-01-08T16:41:47.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596", size = 24141, upload-time = "2026-01-08T16:41:46.453Z" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, +] + +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, +] + +[[package]] +name = "coverage" +version = "7.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, + { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, + { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, +] + +[[package]] +name = "cryptography" +version = "48.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "datasets" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/89/d3d6fef58a488f8569c82fd293ab7cbd4250244d67f425dcae64c63800ea/datasets-3.6.0.tar.gz", hash = "sha256:1b2bf43b19776e2787e181cfd329cb0ca1a358ea014780c3581e0f276375e041", size = 569336, upload-time = "2025-05-07T15:15:02.659Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/34/a08b0ee99715eaba118cbe19a71f7b5e2425c2718ef96007c325944a1152/datasets-3.6.0-py3-none-any.whl", hash = "sha256:25000c4a2c0873a710df127d08a202a06eab7bf42441a6bc278b499c2f72cd1b", size = 491546, upload-time = "2025-05-07T15:14:59.742Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "deepspeed" +version = "0.17.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "einops", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "hjson", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "msgpack", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "ninja", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "numpy", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "packaging", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "psutil", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "py-cpuinfo", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "pydantic", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "tqdm", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/a9/6130c78d84980ed636092be1a262d6429d539105724e675b6f65ef74a05e/deepspeed-0.17.6.tar.gz", hash = "sha256:b3318064ee5798e8a27d201ea8b888f0439973c4eac9af9ab381dd1862ebdf45", size = 1592402, upload-time = "2025-09-19T19:57:50.473Z" } + +[[package]] +name = "diffusers" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "importlib-metadata" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/05/c4c8736c14e0efe9a835fb91c6ff5e1abddf9894a2f2a28fffe6429378a6/diffusers-0.35.1.tar.gz", hash = "sha256:6f4dc0c9d309a4c4914a2179646f2bc801b5e395a43295fff3b5f9dbd3e28fd3", size = 3369127, upload-time = "2025-08-20T04:16:10.668Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/a7/c53f294f34d9e1584388721b3d7aa024ea1ac46e86d0c302fc3db40ed960/diffusers-0.35.1-py3-none-any.whl", hash = "sha256:fe29ff10200970c7c5934c6488c213e2a77a03dad5e6fa00bbd8e1d04234cb0e", size = 4121424, upload-time = "2025-08-20T04:16:08.359Z" }, +] + +[[package]] +name = "dill" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847, upload-time = "2024-01-27T23:42:16.145Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252, upload-time = "2024-01-27T23:42:14.239Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + +[[package]] +name = "dm-tree" +version = "0.1.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "absl-py" }, + { name = "attrs" }, + { name = "numpy" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/83/ce29720ccf934c6cfa9b9c95ebbe96558386e66886626066632b5e44afed/dm_tree-0.1.9.tar.gz", hash = "sha256:a4c7db3d3935a5a2d5e4b383fc26c6b0cd6f78c6d4605d3e7b518800ecd5342b", size = 35623, upload-time = "2025-01-30T20:45:37.13Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/02/61aa90ab695918b4389d75c99bf0ec3cd0abacf1cadbef4053626f23ce34/dm_tree-0.1.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a8d20eeab7fde77a3ed71f07716021eb0edfb4812a128eb381d108af3a310257", size = 175012, upload-time = "2025-03-31T08:35:41.476Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/120cd40556407879c1069941bd8b0d1a75754128c1a5bf0e27dbcf2a49fc/dm_tree-0.1.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80c43417814b1181d3367b335460bfdd30b79ee187a64220e11f6ddd093a4b15", size = 147204, upload-time = "2025-01-30T20:45:25.541Z" }, + { url = "https://files.pythonhosted.org/packages/86/52/27607a275c12858b979b8e943d2bd3bd0f9028503bb7079d5830a8b3cac0/dm_tree-0.1.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2334cfe9d2ed4293f9f1c7aefba0657deaab9ea74b5fadd966f6d01d9b6b42d9", size = 153013, upload-time = "2025-01-30T20:45:26.886Z" }, + { url = "https://files.pythonhosted.org/packages/ea/97/4f78412f73a9350bc8f934441bae5b68b102c8f4240a7f06b4114b51d6de/dm_tree-0.1.9-cp312-cp312-win_amd64.whl", hash = "sha256:9020a5ce256fcc83aa4bc190cc96dd66e87685db0a6e501b0c06aa492c2e38fc", size = 102022, upload-time = "2025-01-30T20:45:28.701Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, +] + +[[package]] +name = "einops" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/81/df4fbe24dff8ba3934af99044188e20a98ed441ad17a274539b74e82e126/einops-0.8.1.tar.gz", hash = "sha256:de5d960a7a761225532e0f1959e5315ebeafc0cd43394732f103ca44b9837e84", size = 54805, upload-time = "2025-02-09T03:17:00.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737", size = 64359, upload-time = "2025-02-09T03:17:01.998Z" }, +] + +[[package]] +name = "eval-type-backport" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/a3/cafafb4558fd638aadfe4121dc6cefb8d743368c085acb2f521df0f3d9d7/eval_type_backport-0.3.1.tar.gz", hash = "sha256:57e993f7b5b69d271e37482e62f74e76a0276c82490cf8e4f0dffeb6b332d5ed", size = 9445, upload-time = "2025-12-02T11:51:42.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/22/fdc2e30d43ff853720042fa15baa3e6122722be1a7950a98233ebb55cd71/eval_type_backport-0.3.1-py3-none-any.whl", hash = "sha256:279ab641905e9f11129f56a8a78f493518515b83402b860f6f06dd7c011fdfa8", size = 6063, upload-time = "2025-12-02T11:51:41.665Z" }, +] + +[[package]] +name = "execnet" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "farama-notifications" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", size = 2131, upload-time = "2023-02-27T18:28:41.047Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", size = 2511, upload-time = "2023-02-27T18:28:39.447Z" }, +] + +[[package]] +name = "filelock" +version = "3.25.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, +] + +[[package]] +name = "flash-attn" +version = "2.8.3" +source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_aarch64.whl" } +resolution-markers = [ + "platform_machine == 'aarch64' and sys_platform == 'linux'", +] +dependencies = [ + { name = "einops", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_aarch64.whl", hash = "sha256:db81083bcc579753140c647fecfb082919b0cce746f9c355af4e37e965e9c224" }, +] + +[package.metadata] +requires-dist = [ + { name = "einops" }, + { name = "torch" }, +] + +[[package]] +name = "flash-attn" +version = "2.8.3" +source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_x86_64.whl" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", +] +dependencies = [ + { name = "einops", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_x86_64.whl", hash = "sha256:4e2f9e39313266b1544b68138b15b91ee6221eccf14f7902b7c6620351340810" }, +] + +[package.metadata] +requires-dist = [ + { name = "einops" }, + { name = "torch" }, +] + +[[package]] +name = "fonttools" +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, + { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "fsspec" +version = "2025.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491, upload-time = "2025-03-07T21:47:56.461Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615, upload-time = "2025-03-07T21:47:54.809Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + +[[package]] +name = "gr00t" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "albumentations" }, + { name = "click" }, + { name = "cryptography" }, + { name = "datasets" }, + { name = "deepspeed", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "diffusers" }, + { name = "dm-tree" }, + { name = "einops" }, + { name = "flash-attn", version = "2.8.3", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_aarch64.whl" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "flash-attn", version = "2.8.3", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_x86_64.whl" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "gitpython" }, + { name = "gymnasium" }, + { name = "huggingface-hub", extra = ["cli"] }, + { name = "jsonlines" }, + { name = "lmdb" }, + { name = "matplotlib" }, + { name = "msgpack" }, + { name = "msgpack-numpy" }, + { name = "numpy" }, + { name = "omegaconf" }, + { name = "onnx" }, + { name = "onnxscript" }, + { name = "opencv-python-headless" }, + { name = "pandas" }, + { name = "peft" }, + { name = "pyzmq" }, + { name = "scipy" }, + { name = "tensorrt-cu12", marker = "platform_machine == 'x86_64'" }, + { name = "tensorrt-cu12-libs", marker = "platform_machine == 'x86_64'" }, + { name = "tensorrt-cu13", marker = "platform_machine == 'aarch64'" }, + { name = "tensorrt-cu13-libs", marker = "platform_machine == 'aarch64'" }, + { name = "termcolor" }, + { name = "torch", version = "2.9.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux'" }, + { name = "torchcodec", version = "0.8.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "torchcodec", version = "0.8.0", source = { path = "scripts/deployment/dgpu/wheels/torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "torchvision", version = "0.24.0", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "torchvision", version = "0.24.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, + { name = "torchvision", version = "0.24.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "transformers" }, + { name = "triton", version = "3.5.0", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "tyro" }, + { name = "wandb" }, +] + +[package.optional-dependencies] +dev = [ + { name = "boto3" }, + { name = "build" }, + { name = "ipython" }, + { name = "pip-licenses" }, + { name = "pre-commit" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-timeout" }, + { name = "pytest-xdist" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "albumentations", specifier = "==1.4.18" }, + { name = "boto3", marker = "extra == 'dev'" }, + { name = "build", marker = "extra == 'dev'" }, + { name = "click", specifier = "==8.1.8" }, + { name = "cryptography", specifier = ">=46.0.7" }, + { name = "datasets", specifier = "==3.6.0" }, + { name = "deepspeed", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'", specifier = "==0.17.6" }, + { name = "diffusers", specifier = "==0.35.1" }, + { name = "dm-tree" }, + { name = "einops", specifier = "==0.8.1" }, + { name = "flash-attn", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'", url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_aarch64.whl" }, + { name = "flash-attn", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'", url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.9cxx11abiTRUE-cp312-cp312-linux_x86_64.whl" }, + { name = "gitpython", specifier = "==3.1.50" }, + { name = "gymnasium", specifier = "==1.2.2" }, + { name = "huggingface-hub", extras = ["cli"] }, + { name = "ipython", marker = "extra == 'dev'" }, + { name = "jsonlines", specifier = "==4.0.0" }, + { name = "lmdb", specifier = "==1.7.5" }, + { name = "matplotlib", specifier = "==3.10.1" }, + { name = "msgpack", specifier = "==1.1.0" }, + { name = "msgpack-numpy", specifier = "==0.4.8" }, + { name = "numpy", specifier = "==1.26.4" }, + { name = "omegaconf", specifier = "==2.3.0" }, + { name = "onnx", specifier = ">=1.20.0" }, + { name = "onnxscript" }, + { name = "opencv-python-headless", specifier = ">=4.5,<4.13" }, + { name = "pandas", specifier = "==2.2.3" }, + { name = "peft", specifier = "==0.17.1" }, + { name = "pip-licenses", marker = "extra == 'dev'" }, + { name = "pre-commit", marker = "extra == 'dev'" }, + { name = "pytest", marker = "extra == 'dev'" }, + { name = "pytest-cov", marker = "extra == 'dev'" }, + { name = "pytest-timeout", marker = "extra == 'dev'" }, + { name = "pytest-xdist", marker = "extra == 'dev'" }, + { name = "pyzmq", specifier = "==27.0.1" }, + { name = "ruff", marker = "extra == 'dev'" }, + { name = "scipy", specifier = "==1.15.3" }, + { name = "tensorrt-cu12", marker = "platform_machine == 'x86_64'", specifier = ">=10.15.1.29" }, + { name = "tensorrt-cu12-libs", marker = "platform_machine == 'x86_64'", specifier = ">=10.15.1.29", index = "https://pypi.nvidia.com/" }, + { name = "tensorrt-cu13", marker = "platform_machine == 'aarch64'", specifier = ">=10.15.1.29" }, + { name = "tensorrt-cu13-libs", marker = "platform_machine == 'aarch64'", specifier = ">=10.15.1.29", index = "https://pypi.nvidia.com/" }, + { name = "termcolor", specifier = "==3.2.0" }, + { name = "tomli", marker = "python_full_version < '3.11' and extra == 'dev'" }, + { name = "torch", marker = "sys_platform != 'linux'", specifier = "==2.9.0" }, + { name = "torch", marker = "sys_platform == 'linux'", specifier = "==2.9.0", index = "https://download.pytorch.org/whl/cu128" }, + { name = "torchcodec", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'", path = "scripts/deployment/dgpu/wheels/torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl" }, + { name = "torchcodec", marker = "platform_machine == 'x86_64'", specifier = "==0.8.0" }, + { name = "torchvision", marker = "sys_platform != 'linux'", specifier = "==0.24.0" }, + { name = "torchvision", marker = "sys_platform == 'linux'", specifier = "==0.24.0", index = "https://download.pytorch.org/whl/cu128" }, + { name = "transformers", specifier = "==4.57.3" }, + { name = "triton", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'", specifier = "==3.5.0", index = "https://download.pytorch.org/whl/cu128" }, + { name = "tyro", specifier = "==0.9.17" }, + { name = "wandb", specifier = "==0.23.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "gymnasium" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cloudpickle" }, + { name = "farama-notifications" }, + { name = "numpy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/1c/d70b2ddd067992fa0332deae08293ef2dc489917ac5342e0e4b8850641f6/gymnasium-1.2.2.tar.gz", hash = "sha256:46d927328f8518bb5a689dbe270d228c1da2b08bcb71ae0152c10aa66f48d530", size = 829250, upload-time = "2025-11-04T15:21:06.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/53/39cd8c2f85e213fce1f32367c4bdbd3402d3bcde7d0826a1172a0f2c5cc0/gymnasium-1.2.2-py3-none-any.whl", hash = "sha256:f04ec362b1fdf73a8b327db5ef89384a3f2ba411e05d3521513414fbbb2199c8", size = 952118, upload-time = "2025-11-04T15:21:03.484Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/08/23c84a26716382c89151b5b447b4beb19e3345f3a93d3b73009a71a57ad3/hf_xet-1.4.2.tar.gz", hash = "sha256:b7457b6b482d9e0743bd116363239b1fa904a5e65deede350fbc0c4ea67c71ea", size = 672357, upload-time = "2026-03-13T06:58:51.077Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/86/b40b83a2ff03ef05c4478d2672b1fc2b9683ff870e2b25f4f3af240f2e7b/hf_xet-1.4.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:71f02d6e4cdd07f344f6844845d78518cc7186bd2bc52d37c3b73dc26a3b0bc5", size = 3800339, upload-time = "2026-03-13T06:58:36.245Z" }, + { url = "https://files.pythonhosted.org/packages/64/2e/af4475c32b4378b0e92a587adb1aa3ec53e3450fd3e5fe0372a874531c00/hf_xet-1.4.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e9b38d876e94d4bdcf650778d6ebbaa791dd28de08db9736c43faff06ede1b5a", size = 3559664, upload-time = "2026-03-13T06:58:34.787Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4c/781267da3188db679e601de18112021a5cb16506fe86b246e22c5401a9c4/hf_xet-1.4.2-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:77e8c180b7ef12d8a96739a4e1e558847002afe9ea63b6f6358b2271a8bdda1c", size = 4217422, upload-time = "2026-03-13T06:58:27.472Z" }, + { url = "https://files.pythonhosted.org/packages/68/47/d6cf4a39ecf6c7705f887a46f6ef5c8455b44ad9eb0d391aa7e8a2ff7fea/hf_xet-1.4.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c3b3c6a882016b94b6c210957502ff7877802d0dbda8ad142c8595db8b944271", size = 3992847, upload-time = "2026-03-13T06:58:25.989Z" }, + { url = "https://files.pythonhosted.org/packages/2d/ef/e80815061abff54697239803948abc665c6b1d237102c174f4f7a9a5ffc5/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d9a634cc929cfbaf2e1a50c0e532ae8c78fa98618426769480c58501e8c8ac2", size = 4193843, upload-time = "2026-03-13T06:58:44.59Z" }, + { url = "https://files.pythonhosted.org/packages/54/75/07f6aa680575d9646c4167db6407c41340cbe2357f5654c4e72a1b01ca14/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6b0932eb8b10317ea78b7da6bab172b17be03bbcd7809383d8d5abd6a2233e04", size = 4432751, upload-time = "2026-03-13T06:58:46.533Z" }, + { url = "https://files.pythonhosted.org/packages/cd/71/193eabd7e7d4b903c4aa983a215509c6114915a5a237525ec562baddb868/hf_xet-1.4.2-cp37-abi3-win_amd64.whl", hash = "sha256:ad185719fb2e8ac26f88c8100562dbf9dbdcc3d9d2add00faa94b5f106aea53f", size = 3671149, upload-time = "2026-03-13T06:58:57.07Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7e/ccf239da366b37ba7f0b36095450efae4a64980bdc7ec2f51354205fdf39/hf_xet-1.4.2-cp37-abi3-win_arm64.whl", hash = "sha256:32c012286b581f783653e718c1862aea5b9eb140631685bb0c5e7012c8719a87", size = 3533426, upload-time = "2026-03-13T06:58:55.46Z" }, +] + +[[package]] +name = "hjson" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/e5/0b56d723a76ca67abadbf7fb71609fb0ea7e6926e94fcca6c65a85b36a0e/hjson-3.1.0.tar.gz", hash = "sha256:55af475a27cf83a7969c808399d7bccdec8fb836a07ddbd574587593b9cdcf75", size = 40541, upload-time = "2022-08-13T02:53:01.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/7f/13cd798d180af4bf4c0ceddeefba2b864a63c71645abc0308b768d67bb81/hjson-3.1.0-py3-none-any.whl", hash = "sha256:65713cdcf13214fb554eb8b4ef803419733f4f5e551047c9b711098ab7186b89", size = 54018, upload-time = "2022-08-13T02:52:59.899Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/b7/8cb61d2eece5fb05a83271da168186721c450eb74e3c31f7ef3169fa475b/huggingface_hub-0.36.2.tar.gz", hash = "sha256:1934304d2fb224f8afa3b87007d58501acfda9215b334eed53072dd5e815ff7a", size = 649782, upload-time = "2026-02-06T09:24:13.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" }, +] + +[package.optional-dependencies] +cli = [ + { name = "inquirerpy" }, +] + +[[package]] +name = "identify" +version = "2.6.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/c4/7fb4db12296cdb11893d61c92048fe617ee853f8523b9b296ac03b43757e/identify-2.6.18.tar.gz", hash = "sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd", size = 99580, upload-time = "2026-03-15T18:39:50.319Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl", hash = "sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737", size = 99394, upload-time = "2026-03-15T18:39:48.915Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/84/93bcd1300216ea50811cee96873b84a1bebf8d0489ffaf7f2a3756bab866/imageio-2.37.3.tar.gz", hash = "sha256:bbb37efbfc4c400fcd534b367b91fcd66d5da639aaa138034431a1c5e0a41451", size = 389673, upload-time = "2026-03-09T11:31:12.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646, upload-time = "2026-03-09T11:31:10.771Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "inquirerpy" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pfzy" }, + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/73/7570847b9da026e07053da3bbe2ac7ea6cde6bb2cbd3c7a5a950fa0ae40b/InquirerPy-0.3.4.tar.gz", hash = "sha256:89d2ada0111f337483cb41ae31073108b2ec1e618a49d7110b0d7ade89fc197e", size = 44431, upload-time = "2022-06-27T23:11:20.598Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/ff/3b59672c47c6284e8005b42e84ceba13864aa0f39f067c973d1af02f5d91/InquirerPy-0.3.4-py3-none-any.whl", hash = "sha256:c65fdfbac1fa00e3ee4fb10679f4d3ed7a012abf4833910e63c295827fe2a7d4", size = 67677, upload-time = "2022-06-27T23:11:17.723Z" }, +] + +[[package]] +name = "ipython" +version = "8.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/61/1810830e8b93c72dcd3c0f150c80a00c3deb229562d9423807ec92c3a539/ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39", size = 5513996, upload-time = "2026-01-05T10:59:06.901Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/df/db59624f4c71b39717c423409950ac3f2c8b2ce4b0aac843112c7fb3f721/ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86", size = 831813, upload-time = "2026-01-05T10:59:04.239Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jmespath" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" }, +] + +[[package]] +name = "jsonlines" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload-time = "2023-09-01T12:34:44.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload-time = "2023-09-01T12:34:42.563Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, +] + +[[package]] +name = "lazy-loader" +version = "0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/ac/21a1f8aa3777f5658576777ea76bfb124b702c520bbe90edf4ae9915eafa/lazy_loader-0.5.tar.gz", hash = "sha256:717f9179a0dbed357012ddad50a5ad3d5e4d9a0b8712680d4e687f5e6e6ed9b3", size = 15294, upload-time = "2026-03-06T15:45:09.054Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl", hash = "sha256:ab0ea149e9c554d4ffeeb21105ac60bed7f3b4fd69b1d2360a4add51b170b005", size = 8044, upload-time = "2026-03-06T15:45:07.668Z" }, +] + +[[package]] +name = "lmdb" +version = "1.7.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/a3/3756f2c6adba4a1413dba55e6c81a20b38a868656517308533e33cb59e1c/lmdb-1.7.5.tar.gz", hash = "sha256:f0604751762cb097059d5412444c4057b95f386c7ed958363cf63f453e5108da", size = 883490, upload-time = "2025-10-15T03:39:44.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/b4/8b862c4d7fd6f68cb33e2a919169fda8924121dc5ff61e3cc105304a6dd4/lmdb-1.7.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b48c2359eea876d7b634b49f84019ecc8c1626da97c795fc7b39a793676815df", size = 100910, upload-time = "2025-10-15T03:39:00.727Z" }, + { url = "https://files.pythonhosted.org/packages/27/64/8ab5da48180d5f13a293ea00a9f8758b1bee080e76ea0ab0d6be0d51b55f/lmdb-1.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f84793baeb430ba984eb6c1b4e08c0a508b1c03e79ce79fcda0f29ecc06a95a", size = 99376, upload-time = "2025-10-15T03:39:01.791Z" }, + { url = "https://files.pythonhosted.org/packages/43/e0/51bc942fe5ed3fce69c631b54f52d97785de3d94487376139be6de1e199a/lmdb-1.7.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68cc21314a33faac1b749645a976b7655e7fa7cc104a72365d2429d2db7f6342", size = 298556, upload-time = "2025-10-15T03:39:02.787Z" }, + { url = "https://files.pythonhosted.org/packages/66/c5/19ea75c88b91d12da5c6f4bbe2aca633047b6b270fd613d557583d32cc5c/lmdb-1.7.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2d9b7e102fcfe5e0cfb3acdebd403eb55ccbe5f7202d8f49d60bdafb1546d1e", size = 299449, upload-time = "2025-10-15T03:39:03.903Z" }, + { url = "https://files.pythonhosted.org/packages/1b/74/365194203dbff47d3a1621366d6a1133cdcce261f4ac0e1d0496f01e6ace/lmdb-1.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:69de89cc79e03e191fc6f95797f1bef91b45c415d1ea9d38872b00b2d989a50f", size = 99328, upload-time = "2025-10-15T03:39:04.949Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3a/a441afebff5bd761f7f58d194fed7ac265279964957479a5c8a51c42f9ad/lmdb-1.7.5-cp312-cp312-win_arm64.whl", hash = "sha256:0c880ee4b309e900f2d58a710701f5e6316a351878588c6a95a9c0bcb640680b", size = 94191, upload-time = "2025-10-15T03:39:05.975Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2c/982cb5afed533d0cb8038232b40c19b5b85a2d887dec74dfd39e8351ef4b/lmdb-1.7.5-py3-none-any.whl", hash = "sha256:fc344bb8bc0786c87c4ccb19b31f09a38c08bd159ada6f037d669426fea06f03", size = 148539, upload-time = "2025-10-15T03:39:42.982Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335, upload-time = "2025-02-27T19:19:51.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488, upload-time = "2025-02-27T19:18:51.436Z" }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264, upload-time = "2025-02-27T19:18:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048, upload-time = "2025-02-27T19:18:56.536Z" }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111, upload-time = "2025-02-27T19:18:59.439Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771, upload-time = "2025-02-27T19:19:01.944Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742, upload-time = "2025-02-27T19:19:04.632Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msgpack" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260, upload-time = "2024-09-10T04:25:52.197Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421, upload-time = "2024-09-10T04:25:49.63Z" }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277, upload-time = "2024-09-10T04:24:48.562Z" }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222, upload-time = "2024-09-10T04:25:36.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971, upload-time = "2024-09-10T04:24:58.129Z" }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403, upload-time = "2024-09-10T04:25:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356, upload-time = "2024-09-10T04:25:31.406Z" }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028, upload-time = "2024-09-10T04:25:17.08Z" }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100, upload-time = "2024-09-10T04:25:08.993Z" }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254, upload-time = "2024-09-10T04:25:06.048Z" }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085, upload-time = "2024-09-10T04:25:01.494Z" }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347, upload-time = "2024-09-10T04:25:33.106Z" }, +] + +[[package]] +name = "msgpack-numpy" +version = "0.4.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msgpack" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/94/61e8aee142733ebfdc400a05bdac6e1763c4514bba3b42743d223f388450/msgpack-numpy-0.4.8.tar.gz", hash = "sha256:c667d3180513422f9c7545be5eec5d296dcbb357e06f72ed39cc683797556e69", size = 10923, upload-time = "2022-06-09T03:43:08.739Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/5d/f25ac7d4fb77cbd53ddc6d05d833c6bf52b12770a44fa9a447eed470ca9a/msgpack_numpy-0.4.8-py2.py3-none-any.whl", hash = "sha256:773c19d4dfbae1b3c7b791083e2caf66983bb19b40901646f61d8731554ae3da", size = 6919, upload-time = "2022-06-09T03:43:06.82Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603, upload-time = "2024-01-28T18:52:34.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/f7/7ec7fddc92e50714ea3745631f79bd9c96424cb2702632521028e57d3a36/multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", size = 134824, upload-time = "2024-01-28T18:52:26.062Z" }, + { url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519, upload-time = "2024-01-28T18:52:28.115Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741, upload-time = "2024-01-28T18:52:29.395Z" }, + { url = "https://files.pythonhosted.org/packages/ea/89/38df130f2c799090c978b366cfdf5b96d08de5b29a4a293df7f7429fa50b/multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", size = 132628, upload-time = "2024-01-28T18:52:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload-time = "2024-01-28T18:52:31.981Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "ninja" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/73/79a0b22fc731989c708068427579e840a6cf4e937fe7ae5c5d0b7356ac22/ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978", size = 242558, upload-time = "2025-08-11T15:10:19.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/de/0e6edf44d6a04dabd0318a519125ed0415ce437ad5a1ec9b9be03d9048cf/ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa", size = 180716, upload-time = "2025-08-11T15:09:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/34/6f/5f5a54a1041af945130abdb2b8529cbef0cdcbbf9bcf3f4195378319d29a/ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200", size = 581758, upload-time = "2025-08-11T15:10:13.295Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.8.4.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/99/db44d685f0e257ff0e213ade1964fc459b4a690a73293220e98feb3307cf/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0", size = 590537124, upload-time = "2025-03-07T01:43:53.556Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.8.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/1f/b3bd73445e5cb342727fd24fe1f7b748f690b460acadc27ea22f904502c8/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4412396548808ddfed3f17a467b104ba7751e6b58678a4b840675c56d21cf7ed", size = 9533318, upload-time = "2025-03-07T01:40:10.421Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.8.93" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d1/e50d0acaab360482034b84b6e27ee83c6738f7d32182b987f9c7a4e32962/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8", size = 43106076, upload-time = "2025-03-07T01:41:59.817Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.8.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/75/f865a3b236e4647605ea34cc450900854ba123834a5f1598e160b9530c3a/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d", size = 965265, upload-time = "2025-03-07T01:39:43.533Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.10.2.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/41/e79269ce215c857c935fd86bcfe91a451a584dfc27f1e068f568b9ad1ab7/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8", size = 705026878, upload-time = "2025-06-06T21:52:51.348Z" }, + { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, +] + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.3.3.83" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/bc/7771846d3a0272026c416fbb7e5f4c1f146d6d80704534d0b187dd6f4800/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a", size = 193109211, upload-time = "2025-03-07T01:44:56.873Z" }, + { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, +] + +[[package]] +name = "nvidia-cufile-cu12" +version = "1.13.1.3" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f5/5607710447a6fe9fd9b3283956fceeee8a06cda1d2f56ce31371f595db2a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:4beb6d4cce47c1a0f1013d72e02b0994730359e17801d395bdcbf20cfb3bb00a", size = 1120705, upload-time = "2025-03-07T01:45:41.434Z" }, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.9.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/5e/92aa15eca622a388b80fbf8375d4760738df6285b1e92c43d37390a33a9a/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd", size = 63625754, upload-time = "2025-03-07T01:46:10.735Z" }, + { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" }, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.7.3.90" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/32/f7cd6ce8a7690544d084ea21c26e910a97e077c9b7f07bf5de623ee19981/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0", size = 267229841, upload-time = "2025-03-07T01:46:54.356Z" }, + { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, +] + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.5.8.93" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/f7/cd777c4109681367721b00a106f491e0d0d15cfa1fd59672ce580ce42a97/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc", size = 288117129, upload-time = "2025-03-07T01:47:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu12" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/b9/598f6ff36faaece4b3c50d26f50e38661499ff34346f00e057760b35cc9d/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8878dce784d0fac90131b6817b607e803c36e629ba34dc5b433471382196b6a5", size = 283835557, upload-time = "2025-02-26T00:16:54.265Z" }, + { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" }, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.27.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/1c/857979db0ef194ca5e21478a0612bcdbbe59458d7694361882279947b349/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:31432ad4d1fb1004eb0c56203dc9bc2178a1ba69d1d9e02d64a6938ab5e40e7a", size = 322400625, upload-time = "2025-06-26T04:11:04.496Z" }, + { url = "https://files.pythonhosted.org/packages/6e/89/f7a07dc961b60645dbbf42e80f2bc85ade7feb9a491b11a1e973aa00071f/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457", size = 322348229, upload-time = "2025-06-26T04:11:28.385Z" }, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.8.93" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a2/8cee5da30d13430e87bf99bb33455d2724d0a4a9cb5d7926d80ccb96d008/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7", size = 38386204, upload-time = "2025-03-07T01:49:43.612Z" }, +] + +[[package]] +name = "nvidia-nvshmem-cu12" +version = "3.3.20" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/9d/3dd98852568fb845ec1f7902c90a22b240fe1cbabda411ccedf2fd737b7b/nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b0b960da3842212758e4fa4696b94f129090b30e5122fea3c5345916545cff0", size = 124484616, upload-time = "2025-08-04T20:24:59.172Z" }, + { url = "https://files.pythonhosted.org/packages/3b/6c/99acb2f9eb85c29fc6f3a7ac4dccfd992e22666dd08a642b303311326a97/nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d00f26d3f9b2e3c3065be895e3059d6479ea5c638a3f38c9fec49b1b9dd7c1e5", size = 124657145, upload-time = "2025-08-04T20:25:19.995Z" }, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.8.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/c0/1b303feea90d296f6176f32a2a70b5ef230f9bdeb3a72bddb0dc922dc137/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7ad891da111ebafbf7e015d34879f7112832fc239ff0d7d776b6cb685274615", size = 91161, upload-time = "2025-03-07T01:42:23.922Z" }, + { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, +] + +[[package]] +name = "omegaconf" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120, upload-time = "2022-12-08T20:59:22.753Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500, upload-time = "2022-12-08T20:59:19.686Z" }, +] + +[[package]] +name = "onnx" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/8a/335c03a8683a88a32f9a6bb98899ea6df241a41df64b37b9696772414794/onnx-1.20.1.tar.gz", hash = "sha256:ded16de1df563d51fbc1ad885f2a426f814039d8b5f4feb77febe09c0295ad67", size = 12048980, upload-time = "2026-01-10T01:40:03.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/4c/4b17e82f91ab9aa07ff595771e935ca73547b035030dc5f5a76e63fbfea9/onnx-1.20.1-cp312-abi3-macosx_12_0_universal2.whl", hash = "sha256:1d923bb4f0ce1b24c6859222a7e6b2f123e7bfe7623683662805f2e7b9e95af2", size = 17903547, upload-time = "2026-01-10T01:39:31.015Z" }, + { url = "https://files.pythonhosted.org/packages/64/5e/1bfa100a9cb3f2d3d5f2f05f52f7e60323b0e20bb0abace1ae64dbc88f25/onnx-1.20.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddc0b7d8b5a94627dc86c533d5e415af94cbfd103019a582669dad1f56d30281", size = 17412021, upload-time = "2026-01-10T01:39:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/d3fec0dcf9a7a99e7368112d9c765154e81da70fcba1e3121131a45c245b/onnx-1.20.1-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9336b6b8e6efcf5c490a845f6afd7e041c89a56199aeda384ed7d58fb953b080", size = 17510450, upload-time = "2026-01-10T01:39:36.589Z" }, + { url = "https://files.pythonhosted.org/packages/74/a7/edce1403e05a46e59b502fae8e3350ceeac5841f8e8f1561e98562ed9b09/onnx-1.20.1-cp312-abi3-win32.whl", hash = "sha256:564c35a94811979808ab5800d9eb4f3f32c12daedba7e33ed0845f7c61ef2431", size = 16238216, upload-time = "2026-01-10T01:39:39.46Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c7/8690c81200ae652ac550c1df52f89d7795e6cc941f3cb38c9ef821419e80/onnx-1.20.1-cp312-abi3-win_amd64.whl", hash = "sha256:9fe7f9a633979d50984b94bda8ceb7807403f59a341d09d19342dc544d0ca1d5", size = 16389207, upload-time = "2026-01-10T01:39:41.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/a0/4fb0e6d36eaf079af366b2c1f68bafe92df6db963e2295da84388af64abc/onnx-1.20.1-cp312-abi3-win_arm64.whl", hash = "sha256:21d747348b1c8207406fa2f3e12b82f53e0d5bb3958bcd0288bd27d3cb6ebb00", size = 16344155, upload-time = "2026-01-10T01:39:45.536Z" }, +] + +[[package]] +name = "onnx-ir" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "sympy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/e6/672fefb2f108d077f58181a7babf4c0f8d1182a30353ffc9c79c63afc5ee/onnx_ir-0.2.1.tar.gz", hash = "sha256:8b8b10a93f43e65962104de6070c43c5dacb0e3cdfefc7c8059dd83c9db64f35", size = 144279, upload-time = "2026-04-20T20:21:47.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/aa/f7a53321c60b9ad9ee184b6018292ed6b5389947592a2c8c09c736bb7f9e/onnx_ir-0.2.1-py3-none-any.whl", hash = "sha256:c7285da889312f91882de2092e298a9eeeefbfc1d1951c49d983992967eb09a7", size = 166792, upload-time = "2026-04-20T20:21:46.357Z" }, +] + +[[package]] +name = "onnxscript" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "onnx-ir" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/99/fd948eba63ba65b52265a4cd09a14f96bb9f5b730fcef58876c4358bf406/onnxscript-0.7.0.tar.gz", hash = "sha256:c95ed7b339b02cface56ee27689565c46612e1fc542c562298dddfdad5268dc5", size = 612032, upload-time = "2026-04-20T17:09:19.775Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/ce/2ed92575cc3be4ea1db5f38f16f20765f9b20b69b14d6c1d9972658a8ee9/onnxscript-0.7.0-py3-none-any.whl", hash = "sha256:5b356907d4501e9919f8599c91d8da967406a37b1fac2b40caa55a49acf242ea", size = 714842, upload-time = "2026-04-20T17:09:22.089Z" }, +] + +[[package]] +name = "opencv-python-headless" +version = "4.11.0.86" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929, upload-time = "2025-01-16T13:53:40.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460, upload-time = "2025-01-16T13:52:57.015Z" }, + { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330, upload-time = "2025-01-16T13:55:45.731Z" }, + { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060, upload-time = "2025-01-16T13:51:59.625Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856, upload-time = "2025-01-16T13:53:29.654Z" }, + { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425, upload-time = "2025-01-16T13:52:49.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386, upload-time = "2025-01-16T13:52:56.418Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, +] + +[[package]] +name = "parso" +version = "0.8.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, +] + +[[package]] +name = "peft" +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch", version = "2.9.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux'" }, + { name = "tqdm" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/b8/2e79377efaa1e5f0d70a497db7914ffd355846e760ffa2f7883ab0f600fb/peft-0.17.1.tar.gz", hash = "sha256:e6002b42517976c290b3b8bbb9829a33dd5d470676b2dec7cb4df8501b77eb9f", size = 568192, upload-time = "2025-08-21T09:25:22.703Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fe/a2da1627aa9cb6310b6034598363bd26ac301c4a99d21f415b1b2855891e/peft-0.17.1-py3-none-any.whl", hash = "sha256:3d129d64def3d74779c32a080d2567e5f7b674e77d546e3585138216d903f99e", size = 504896, upload-time = "2025-08-21T09:25:18.974Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pfzy" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/5a/32b50c077c86bfccc7bed4881c5a2b823518f5450a30e639db5d3711952e/pfzy-0.3.4.tar.gz", hash = "sha256:717ea765dd10b63618e7298b2d98efd819e0b30cd5905c9707223dceeb94b3f1", size = 8396, upload-time = "2022-01-28T02:26:17.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/d7/8ff98376b1acc4503253b685ea09981697385ce344d4e3935c2af49e044d/pfzy-0.3.4-py3-none-any.whl", hash = "sha256:5f50d5b2b3207fa72e7ec0ef08372ef652685470974a107d0d4999fc5a903a96", size = 8537, upload-time = "2022-01-28T02:26:16.047Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, +] + +[[package]] +name = "pip-licenses" +version = "5.5.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prettytable" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/18/ddd93af610a04f56a51a27095ddfe55238e1ec236f6758730a0d2c0b49f2/pip_licenses-5.5.5.tar.gz", hash = "sha256:60750c006adf7a0910347b726e8ee9fee3bc8d2e7c8307a5c4ec0776c8e2a276", size = 54955, upload-time = "2026-03-28T22:12:56.48Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/9a/6acfdb8d463eac7cdae7534d35d72237eca63f5fbafe797289d8a5fae447/pip_licenses-5.5.5-py3-none-any.whl", hash = "sha256:f4c4c6d9e6a03612cf59f29f19dc8ab54904d82e055b8e191498f2279a224e14", size = 23247, upload-time = "2026-03-28T22:12:54.89Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, +] + +[[package]] +name = "prettytable" +version = "3.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/45/b0847d88d6cfeb4413566738c8bbf1e1995fad3d42515327ff32cc1eb578/prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0", size = 67892, upload-time = "2025-11-14T17:33:20.212Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/8c/83087ebc47ab0396ce092363001fa37c17153119ee282700c0713a195853/prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287", size = 34433, upload-time = "2025-11-14T17:33:19.093Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" }, + { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" }, + { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", size = 104716, upload-time = "2022-10-25T20:38:06.303Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", size = 22335, upload-time = "2022-10-25T20:38:27.636Z" }, +] + +[[package]] +name = "pyarrow" +version = "23.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/22/134986a4cc224d593c1afde5494d18ff629393d74cc2eddb176669f234a4/pyarrow-23.0.1.tar.gz", hash = "sha256:b8c5873e33440b2bc2f4a79d2b47017a89c5a24116c055625e6f2ee50523f019", size = 1167336, upload-time = "2026-02-16T10:14:12.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/4b/4166bb5abbfe6f750fc60ad337c43ecf61340fa52ab386da6e8dbf9e63c4/pyarrow-23.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f4b0dbfa124c0bb161f8b5ebb40f1a680b70279aa0c9901d44a2b5a20806039f", size = 34214575, upload-time = "2026-02-16T10:09:56.225Z" }, + { url = "https://files.pythonhosted.org/packages/e1/da/3f941e3734ac8088ea588b53e860baeddac8323ea40ce22e3d0baa865cc9/pyarrow-23.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7707d2b6673f7de054e2e83d59f9e805939038eebe1763fe811ee8fa5c0cd1a7", size = 35832540, upload-time = "2026-02-16T10:10:03.428Z" }, + { url = "https://files.pythonhosted.org/packages/88/7c/3d841c366620e906d54430817531b877ba646310296df42ef697308c2705/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:86ff03fb9f1a320266e0de855dee4b17da6794c595d207f89bba40d16b5c78b9", size = 44470940, upload-time = "2026-02-16T10:10:10.704Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a5/da83046273d990f256cb79796a190bbf7ec999269705ddc609403f8c6b06/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:813d99f31275919c383aab17f0f455a04f5a429c261cc411b1e9a8f5e4aaaa05", size = 47586063, upload-time = "2026-02-16T10:10:17.95Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/b7d2ebcff47a514f47f9da1e74b7949138c58cfeb108cdd4ee62f43f0cf3/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bf5842f960cddd2ef757d486041d57c96483efc295a8c4a0e20e704cbbf39c67", size = 48173045, upload-time = "2026-02-16T10:10:25.363Z" }, + { url = "https://files.pythonhosted.org/packages/43/b2/b40961262213beaba6acfc88698eb773dfce32ecdf34d19291db94c2bd73/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564baf97c858ecc03ec01a41062e8f4698abc3e6e2acd79c01c2e97880a19730", size = 50621741, upload-time = "2026-02-16T10:10:33.477Z" }, + { url = "https://files.pythonhosted.org/packages/f6/70/1fdda42d65b28b078e93d75d371b2185a61da89dda4def8ba6ba41ebdeb4/pyarrow-23.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:07deae7783782ac7250989a7b2ecde9b3c343a643f82e8a4df03d93b633006f0", size = 27620678, upload-time = "2026-02-16T10:10:39.31Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "pytest-timeout" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" }, +] + +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-discovery" +version = "1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/7e/9f3b0dd3a074a6c3e1e79f35e465b1f2ee4b262d619de00cfce523cc9b24/python_discovery-1.1.3.tar.gz", hash = "sha256:7acca36e818cd88e9b2ba03e045ad7e93e1713e29c6bbfba5d90202310b7baa5", size = 56945, upload-time = "2026-03-10T15:08:15.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/80/73211fc5bfbfc562369b4aa61dc1e4bf07dc7b34df7b317e4539316b809c/python_discovery-1.1.3-py3-none-any.whl", hash = "sha256:90e795f0121bc84572e737c9aa9966311b9fde44ffb88a5953b3ec9b31c6945e", size = 31485, upload-time = "2026-03-10T15:08:13.06Z" }, +] + +[[package]] +name = "pytz" +version = "2026.1.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/5f/557d2032a2f471edbcc227da724c24a1c05887b5cda1e3ae53af98b9e0a5/pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b", size = 281158, upload-time = "2025-08-03T05:05:40.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/9b/c0957041067c7724b310f22c398be46399297c12ed834c3bc42200a2756f/pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd", size = 1305432, upload-time = "2025-08-03T05:03:32.177Z" }, + { url = "https://files.pythonhosted.org/packages/8e/55/bd3a312790858f16b7def3897a0c3eb1804e974711bf7b9dcb5f47e7f82c/pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd", size = 895095, upload-time = "2025-08-03T05:03:33.918Z" }, + { url = "https://files.pythonhosted.org/packages/20/50/fc384631d8282809fb1029a4460d2fe90fa0370a0e866a8318ed75c8d3bb/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a", size = 651826, upload-time = "2025-08-03T05:03:35.818Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0a/2356305c423a975000867de56888b79e44ec2192c690ff93c3109fd78081/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577", size = 839751, upload-time = "2025-08-03T05:03:37.265Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1b/81e95ad256ca7e7ccd47f5294c1c6da6e2b64fbace65b84fe8a41470342e/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e", size = 1641359, upload-time = "2025-08-03T05:03:38.799Z" }, + { url = "https://files.pythonhosted.org/packages/50/63/9f50ec965285f4e92c265c8f18344e46b12803666d8b73b65d254d441435/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb", size = 2020281, upload-time = "2025-08-03T05:03:40.338Z" }, + { url = "https://files.pythonhosted.org/packages/02/4a/19e3398d0dc66ad2b463e4afa1fc541d697d7bc090305f9dfb948d3dfa29/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55", size = 1877112, upload-time = "2025-08-03T05:03:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/bf/42/c562e9151aa90ed1d70aac381ea22a929d6b3a2ce4e1d6e2e135d34fd9c6/pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb", size = 558177, upload-time = "2025-08-03T05:03:43.979Z" }, + { url = "https://files.pythonhosted.org/packages/40/96/5c50a7d2d2b05b19994bf7336b97db254299353dd9b49b565bb71b485f03/pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686", size = 618923, upload-time = "2025-08-03T05:03:45.438Z" }, + { url = "https://files.pythonhosted.org/packages/13/33/1ec89c8f21c89d21a2eaff7def3676e21d8248d2675705e72554fb5a6f3f/pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed", size = 552358, upload-time = "2025-08-03T05:03:46.887Z" }, +] + +[[package]] +name = "regex" +version = "2026.2.28" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/71/41455aa99a5a5ac1eaf311f5d8efd9ce6433c03ac1e0962de163350d0d97/regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2", size = 415184, upload-time = "2026-02-28T02:19:42.792Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/42/9061b03cf0fc4b5fa2c3984cbbaed54324377e440a5c5a29d29a72518d62/regex-2026.2.28-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fcf26c3c6d0da98fada8ae4ef0aa1c3405a431c0a77eb17306d38a89b02adcd7", size = 489574, upload-time = "2026-02-28T02:16:50.455Z" }, + { url = "https://files.pythonhosted.org/packages/77/83/0c8a5623a233015595e3da499c5a1c13720ac63c107897a6037bb97af248/regex-2026.2.28-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02473c954af35dd2defeb07e44182f5705b30ea3f351a7cbffa9177beb14da5d", size = 291426, upload-time = "2026-02-28T02:16:52.52Z" }, + { url = "https://files.pythonhosted.org/packages/9e/06/3ef1ac6910dc3295ebd71b1f9bfa737e82cfead211a18b319d45f85ddd09/regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b65d33a17101569f86d9c5966a8b1d7fbf8afdda5a8aa219301b0a80f58cf7d", size = 289200, upload-time = "2026-02-28T02:16:54.08Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c9/8cc8d850b35ab5650ff6756a1cb85286e2000b66c97520b29c1587455344/regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71dcecaa113eebcc96622c17692672c2d104b1d71ddf7adeda90da7ddeb26fc", size = 796765, upload-time = "2026-02-28T02:16:55.905Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5d/57702597627fc23278ebf36fbb497ac91c0ce7fec89ac6c81e420ca3e38c/regex-2026.2.28-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:481df4623fa4969c8b11f3433ed7d5e3dc9cec0f008356c3212b3933fb77e3d8", size = 863093, upload-time = "2026-02-28T02:16:58.094Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/f3ecad537ca2811b4d26b54ca848cf70e04fcfc138667c146a9f3157779c/regex-2026.2.28-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64e7c6ad614573e0640f271e811a408d79a9e1fe62a46adb602f598df42a818d", size = 909455, upload-time = "2026-02-28T02:17:00.918Z" }, + { url = "https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4", size = 802037, upload-time = "2026-02-28T02:17:02.842Z" }, + { url = "https://files.pythonhosted.org/packages/44/7c/c6d91d8911ac6803b45ca968e8e500c46934e58c0903cbc6d760ee817a0a/regex-2026.2.28-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:864cdd1a2ef5716b0ab468af40139e62ede1b3a53386b375ec0786bb6783fc05", size = 775113, upload-time = "2026-02-28T02:17:04.506Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8d/4a9368d168d47abd4158580b8c848709667b1cd293ff0c0c277279543bd0/regex-2026.2.28-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:511f7419f7afab475fd4d639d4aedfc54205bcb0800066753ef68a59f0f330b5", size = 784194, upload-time = "2026-02-28T02:17:06.888Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bf/2c72ab5d8b7be462cb1651b5cc333da1d0068740342f350fcca3bca31947/regex-2026.2.28-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b42f7466e32bf15a961cf09f35fa6323cc72e64d3d2c990b10de1274a5da0a59", size = 856846, upload-time = "2026-02-28T02:17:09.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f4/6b65c979bb6d09f51bb2d2a7bc85de73c01ec73335d7ddd202dcb8cd1c8f/regex-2026.2.28-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8710d61737b0c0ce6836b1da7109f20d495e49b3809f30e27e9560be67a257bf", size = 763516, upload-time = "2026-02-28T02:17:11.004Z" }, + { url = "https://files.pythonhosted.org/packages/8e/32/29ea5e27400ee86d2cc2b4e80aa059df04eaf78b4f0c18576ae077aeff68/regex-2026.2.28-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4390c365fd2d45278f45afd4673cb90f7285f5701607e3ad4274df08e36140ae", size = 849278, upload-time = "2026-02-28T02:17:12.693Z" }, + { url = "https://files.pythonhosted.org/packages/1d/91/3233d03b5f865111cd517e1c95ee8b43e8b428d61fa73764a80c9bb6f537/regex-2026.2.28-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb3b1db8ff6c7b8bf838ab05583ea15230cb2f678e569ab0e3a24d1e8320940b", size = 790068, upload-time = "2026-02-28T02:17:14.9Z" }, + { url = "https://files.pythonhosted.org/packages/76/92/abc706c1fb03b4580a09645b206a3fc032f5a9f457bc1a8038ac555658ab/regex-2026.2.28-cp312-cp312-win32.whl", hash = "sha256:f8ed9a5d4612df9d4de15878f0bc6aa7a268afbe5af21a3fdd97fa19516e978c", size = 266416, upload-time = "2026-02-28T02:17:17.15Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/2a6f7dff190e5fa9df9fb4acf2fdf17a1aa0f7f54596cba8de608db56b3a/regex-2026.2.28-cp312-cp312-win_amd64.whl", hash = "sha256:01d65fd24206c8e1e97e2e31b286c59009636c022eb5d003f52760b0f42155d4", size = 277297, upload-time = "2026-02-28T02:17:18.723Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f0/58a2484851fadf284458fdbd728f580d55c1abac059ae9f048c63b92f427/regex-2026.2.28-cp312-cp312-win_arm64.whl", hash = "sha256:c0b5ccbb8ffb433939d248707d4a8b31993cb76ab1a0187ca886bf50e96df952", size = 270408, upload-time = "2026-02-28T02:17:20.328Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rich" +version = "14.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/df/f8629c19c5318601d3121e230f74cbee7a3732339c52b21daa2b82ef9c7d/ruff-0.15.6.tar.gz", hash = "sha256:8394c7bb153a4e3811a4ecdacd4a8e6a4fa8097028119160dffecdcdf9b56ae4", size = 4597916, upload-time = "2026-03-12T23:05:47.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/2f/4e03a7e5ce99b517e98d3b4951f411de2b0fa8348d39cf446671adcce9a2/ruff-0.15.6-py3-none-linux_armv6l.whl", hash = "sha256:7c98c3b16407b2cf3d0f2b80c80187384bc92c6774d85fefa913ecd941256fff", size = 10508953, upload-time = "2026-03-12T23:05:17.246Z" }, + { url = "https://files.pythonhosted.org/packages/70/60/55bcdc3e9f80bcf39edf0cd272da6fa511a3d94d5a0dd9e0adf76ceebdb4/ruff-0.15.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ee7dcfaad8b282a284df4aa6ddc2741b3f4a18b0555d626805555a820ea181c3", size = 10942257, upload-time = "2026-03-12T23:05:23.076Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/005c29bd1726c0f492bfa215e95154cf480574140cb5f867c797c18c790b/ruff-0.15.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3bd9967851a25f038fc8b9ae88a7fbd1b609f30349231dffaa37b6804923c4bb", size = 10322683, upload-time = "2026-03-12T23:05:33.738Z" }, + { url = "https://files.pythonhosted.org/packages/5f/74/2f861f5fd7cbb2146bddb5501450300ce41562da36d21868c69b7a828169/ruff-0.15.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13f4594b04e42cd24a41da653886b04d2ff87adbf57497ed4f728b0e8a4866f8", size = 10660986, upload-time = "2026-03-12T23:05:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/c1/a1/309f2364a424eccb763cdafc49df843c282609f47fe53aa83f38272389e0/ruff-0.15.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2ed8aea2f3fe57886d3f00ea5b8aae5bf68d5e195f487f037a955ff9fbaac9e", size = 10332177, upload-time = "2026-03-12T23:05:56.145Z" }, + { url = "https://files.pythonhosted.org/packages/30/41/7ebf1d32658b4bab20f8ac80972fb19cd4e2c6b78552be263a680edc55ac/ruff-0.15.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70789d3e7830b848b548aae96766431c0dc01a6c78c13381f423bf7076c66d15", size = 11170783, upload-time = "2026-03-12T23:06:01.742Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/6d488f6adca047df82cd62c304638bcb00821c36bd4881cfca221561fdfc/ruff-0.15.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:542aaf1de3154cea088ced5a819ce872611256ffe2498e750bbae5247a8114e9", size = 12044201, upload-time = "2026-03-12T23:05:28.697Z" }, + { url = "https://files.pythonhosted.org/packages/71/68/e6f125df4af7e6d0b498f8d373274794bc5156b324e8ab4bf5c1b4fc0ec7/ruff-0.15.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c22e6f02c16cfac3888aa636e9eba857254d15bbacc9906c9689fdecb1953ab", size = 11421561, upload-time = "2026-03-12T23:05:31.236Z" }, + { url = "https://files.pythonhosted.org/packages/f1/9f/f85ef5fd01a52e0b472b26dc1b4bd228b8f6f0435975442ffa4741278703/ruff-0.15.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98893c4c0aadc8e448cfa315bd0cc343a5323d740fe5f28ef8a3f9e21b381f7e", size = 11310928, upload-time = "2026-03-12T23:05:45.288Z" }, + { url = "https://files.pythonhosted.org/packages/8c/26/b75f8c421f5654304b89471ed384ae8c7f42b4dff58fa6ce1626d7f2b59a/ruff-0.15.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:70d263770d234912374493e8cc1e7385c5d49376e41dfa51c5c3453169dc581c", size = 11235186, upload-time = "2026-03-12T23:05:50.677Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/d5a6d065962ff7a68a86c9b4f5500f7d101a0792078de636526c0edd40da/ruff-0.15.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:55a1ad63c5a6e54b1f21b7514dfadc0c7fb40093fa22e95143cf3f64ebdcd512", size = 10635231, upload-time = "2026-03-12T23:05:37.044Z" }, + { url = "https://files.pythonhosted.org/packages/d6/56/7c3acf3d50910375349016cf33de24be021532042afbed87942858992491/ruff-0.15.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8dc473ba093c5ec238bb1e7429ee676dca24643c471e11fbaa8a857925b061c0", size = 10340357, upload-time = "2026-03-12T23:06:04.748Z" }, + { url = "https://files.pythonhosted.org/packages/06/54/6faa39e9c1033ff6a3b6e76b5df536931cd30caf64988e112bbf91ef5ce5/ruff-0.15.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:85b042377c2a5561131767974617006f99f7e13c63c111b998f29fc1e58a4cfb", size = 10860583, upload-time = "2026-03-12T23:05:58.978Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/509a201b843b4dfb0b32acdedf68d951d3377988cae43949ba4c4133a96a/ruff-0.15.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cef49e30bc5a86a6a92098a7fbf6e467a234d90b63305d6f3ec01225a9d092e0", size = 11410976, upload-time = "2026-03-12T23:05:39.955Z" }, + { url = "https://files.pythonhosted.org/packages/6c/25/3fc9114abf979a41673ce877c08016f8e660ad6cf508c3957f537d2e9fa9/ruff-0.15.6-py3-none-win32.whl", hash = "sha256:bbf67d39832404812a2d23020dda68fee7f18ce15654e96fb1d3ad21a5fe436c", size = 10616872, upload-time = "2026-03-12T23:05:42.451Z" }, + { url = "https://files.pythonhosted.org/packages/89/7a/09ece68445ceac348df06e08bf75db72d0e8427765b96c9c0ffabc1be1d9/ruff-0.15.6-py3-none-win_amd64.whl", hash = "sha256:aee25bc84c2f1007ecb5037dff75cef00414fdf17c23f07dc13e577883dca406", size = 11787271, upload-time = "2026-03-12T23:05:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/7f/d0/578c47dd68152ddddddf31cd7fc67dc30b7cdf639a86275fda821b0d9d98/ruff-0.15.6-py3-none-win_arm64.whl", hash = "sha256:c34de3dd0b0ba203be50ae70f5910b17188556630e2178fd7d79fc030eb0d837", size = 11060497, upload-time = "2026-03-12T23:05:25.968Z" }, +] + +[[package]] +name = "s3transfer" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/04/74127fc843314818edfa81b5540e26dd537353b123a4edc563109d8f17dd/s3transfer-0.16.0.tar.gz", hash = "sha256:8e990f13268025792229cd52fa10cb7163744bf56e719e0b9cb925ab79abf920", size = 153827, upload-time = "2025-12-01T02:30:59.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/51/727abb13f44c1fcf6d145979e1535a35794db0f6e450a0cb46aa24732fe2/s3transfer-0.16.0-py3-none-any.whl", hash = "sha256:18e25d66fed509e3868dc1572b3f427ff947dd2c56f844a5bf09481ad3f3b2fe", size = 86830, upload-time = "2025-12-01T02:30:57.729Z" }, +] + +[[package]] +name = "safetensors" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, +] + +[[package]] +name = "scikit-image" +version = "0.25.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "imageio" }, + { name = "lazy-loader" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "scipy" }, + { name = "tifffile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/a8/3c0f256012b93dd2cb6fda9245e9f4bff7dc0486880b248005f15ea2255e/scikit_image-0.25.2.tar.gz", hash = "sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde", size = 22693594, upload-time = "2025-02-18T18:05:24.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/8c/5df82881284459f6eec796a5ac2a0a304bb3384eec2e73f35cfdfcfbf20c/scikit_image-0.25.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb", size = 13986000, upload-time = "2025-02-18T18:04:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e6/93bebe1abcdce9513ffec01d8af02528b4c41fb3c1e46336d70b9ed4ef0d/scikit_image-0.25.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed", size = 13235893, upload-time = "2025-02-18T18:04:51.049Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/eda616e33f67129e5979a9eb33c710013caa3aa8a921991e6cc0b22cea33/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d", size = 14178389, upload-time = "2025-02-18T18:04:54.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b5/b75527c0f9532dd8a93e8e7cd8e62e547b9f207d4c11e24f0006e8646b36/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824", size = 15003435, upload-time = "2025-02-18T18:04:57.586Z" }, + { url = "https://files.pythonhosted.org/packages/34/e3/49beb08ebccda3c21e871b607c1cb2f258c3fa0d2f609fed0a5ba741b92d/scikit_image-0.25.2-cp312-cp312-win_amd64.whl", hash = "sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2", size = 12899474, upload-time = "2025-02-18T18:05:01.166Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, +] + +[[package]] +name = "sentry-sdk" +version = "2.55.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/b8/285293dc60fc198fffc3fcdbc7c6d4e646e0f74e61461c355d40faa64ceb/sentry_sdk-2.55.0.tar.gz", hash = "sha256:3774c4d8820720ca4101548131b9c162f4c9426eb7f4d24aca453012a7470f69", size = 424505, upload-time = "2026-03-17T14:15:51.707Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/66/20465097782d7e1e742d846407ea7262d338c6e876ddddad38ca8907b38f/sentry_sdk-2.55.0-py2.py3-none-any.whl", hash = "sha256:97026981cb15699394474a196b88503a393cbc58d182ece0d3abe12b9bd978d4", size = 449284, upload-time = "2026-03-17T14:15:49.604Z" }, +] + +[[package]] +name = "setuptools" +version = "82.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, +] + +[[package]] +name = "shtab" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/7a/7f131b6082d8b592c32e4312d0a6da3d0b28b8f0d305ddd93e49c9d89929/shtab-1.8.0.tar.gz", hash = "sha256:75f16d42178882b7f7126a0c2cb3c848daed2f4f5a276dd1ded75921cc4d073a", size = 46062, upload-time = "2025-11-18T10:57:47.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/e1/202a31727b0d096a04380f78e809074d7a1d0a22d9d5a39fea1d2353fd02/shtab-1.8.0-py3-none-any.whl", hash = "sha256:f0922a82174b4007e06ac0bac4f79abd826c5cca88e201bfd927f889803c571d", size = 14457, upload-time = "2025-11-18T10:57:45.906Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tensorrt-cu12" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tensorrt-cu12-bindings", marker = "platform_machine == 'x86_64'" }, + { name = "tensorrt-cu12-libs", marker = "platform_machine == 'x86_64'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/a7/c8d81de98428c7dd67b5b9df0e1ea21c497661b4703f946e8d84b39ad76e/tensorrt_cu12-10.15.1.29.tar.gz", hash = "sha256:d28acc4d14804cac0b50c0c1fc58c0d25cb974aa4c53cda5cfd8c4a4154c45fe", size = 19096, upload-time = "2026-01-30T07:44:47.652Z" } + +[[package]] +name = "tensorrt-cu12-bindings" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/a1/feb1b14806e9a5f486b2b69b41623b8eb15b18e86634c992f82a3a4bd3ae/tensorrt_cu12_bindings-10.15.1.29-cp312-none-manylinux_2_28_x86_64.whl", hash = "sha256:627533cc801209887173b28137eb571e1cf52ecf2afb4c92c6cf29c41711f580", size = 1140872, upload-time = "2026-01-29T21:15:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/cb/be/a37d45dc6cad228a4b02facec060ed9cc7808373d5b7f3d2e33ddbc9aeb2/tensorrt_cu12_bindings-10.15.1.29-cp312-none-win_amd64.whl", hash = "sha256:39b348cf0ffc548e928b1d180649f9cfbf37563b128fc81b59c172722dc9f1c3", size = 893027, upload-time = "2026-01-29T21:15:49.231Z" }, +] + +[[package]] +name = "tensorrt-cu12-libs" +version = "10.15.1.29" +source = { registry = "https://pypi.nvidia.com/" } +wheels = [ + { url = "https://pypi.nvidia.com/tensorrt-cu12-libs/tensorrt_cu12_libs-10.15.1.29-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:eebdc8740f40179ae0c0a974535b2ced47ac98dc0b93699581533ad980e84b98" }, + { url = "https://pypi.nvidia.com/tensorrt-cu12-libs/tensorrt_cu12_libs-10.15.1.29-py2.py3-none-win_amd64.whl", hash = "sha256:79343fa678dd4b5270c01d6e56985db08c55bb82898959bd3d028238268745c2" }, +] + +[[package]] +name = "tensorrt-cu13" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tensorrt-cu13-bindings", marker = "(platform_machine != 'x86_64' and sys_platform != 'linux') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "tensorrt-cu13-libs", marker = "(platform_machine != 'x86_64' and sys_platform != 'linux') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/0b/ff3683ddf1960227fb2c6210e92ab83c26eda92091046c123d8dfc1adc93/tensorrt_cu13-10.15.1.29.tar.gz", hash = "sha256:60edcdf1a68526732ea613c309283af036f418f6ebcbc8e18d24566b74d776e0", size = 19084, upload-time = "2026-01-30T07:42:55.055Z" } + +[[package]] +name = "tensorrt-cu13-bindings" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/26/2c78ff712ec9da3aa4851ad86999dae6c5aa927de53a75aa5255cbcdd9c1/tensorrt_cu13_bindings-10.15.1.29-cp312-none-manylinux_2_35_aarch64.whl", hash = "sha256:503a623a015cfce5bf00477162be2e872fdf2397acaf840f75c9dd22f41d6672", size = 1144656, upload-time = "2026-01-29T20:59:50.421Z" }, +] + +[[package]] +name = "tensorrt-cu13-libs" +version = "10.15.1.29" +source = { registry = "https://pypi.nvidia.com/" } +wheels = [ + { url = "https://pypi.nvidia.com/tensorrt-cu13-libs/tensorrt_cu13_libs-10.15.1.29-py2.py3-none-manylinux_2_35_aarch64.whl", hash = "sha256:f2f6fdaba477ef5536e9932d7f0ce2952ab3c87c5d0fbf93f080388390cba1de" }, +] + +[[package]] +name = "termcolor" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/56/ab275c2b56a5e2342568838f0d5e3e66a32354adcc159b495e374cda43f5/termcolor-3.2.0.tar.gz", hash = "sha256:610e6456feec42c4bcd28934a8c87a06c3fa28b01561d46aa09a9881b8622c58", size = 14423, upload-time = "2025-10-25T19:11:42.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/d5/141f53d7c1eb2a80e6d3e9a390228c3222c27705cbe7f048d3623053f3ca/termcolor-3.2.0-py3-none-any.whl", hash = "sha256:a10343879eba4da819353c55cb8049b0933890c2ebf9ad5d3ecd2bb32ea96ea6", size = 7698, upload-time = "2025-10-25T19:11:41.536Z" }, +] + +[[package]] +name = "tifffile" +version = "2025.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/d0/18fed0fc0916578a4463f775b0fbd9c5fed2392152d039df2fb533bfdd5d/tifffile-2025.5.10.tar.gz", hash = "sha256:018335d34283aa3fd8c263bae5c3c2b661ebc45548fde31504016fcae7bf1103", size = 365290, upload-time = "2025-05-10T19:22:34.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/06/bd0a6097da704a7a7c34a94cfd771c3ea3c2f405dd214e790d22c93f6be1/tifffile-2025.5.10-py3-none-any.whl", hash = "sha256:e37147123c0542d67bc37ba5cdd67e12ea6fbe6e86c52bee037a9eb6a064e5ad", size = 226533, upload-time = "2025-05-10T19:22:27.279Z" }, +] + +[[package]] +name = "tokenizers" +version = "0.22.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, + { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, + { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, + { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, +] + +[[package]] +name = "torch" +version = "2.9.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'darwin'", + "platform_machine == 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'darwin'", + "platform_machine != 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux'", +] +dependencies = [ + { name = "filelock", marker = "sys_platform != 'linux'" }, + { name = "fsspec", marker = "sys_platform != 'linux'" }, + { name = "jinja2", marker = "sys_platform != 'linux'" }, + { name = "networkx", marker = "sys_platform != 'linux'" }, + { name = "setuptools", marker = "sys_platform != 'linux'" }, + { name = "sympy", marker = "sys_platform != 'linux'" }, + { name = "typing-extensions", marker = "sys_platform != 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/11/c1c5ba6691cda6279087c35bd626536e4fd29521fe740abf5008377a9a02/torch-2.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4582b162f541651f0cb184d3e291c05c2f556c7117c64a9873e2ee158d40062b", size = 109280887, upload-time = "2025-10-15T15:46:26.228Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5f/b85bd8c05312d71de9402bf5868d217c38827cfd09d8f8514e5be128a52b/torch-2.9.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:33f58e9a102a91259af289d50525c30323b5c9ae1d31322b6447c0814da68695", size = 74478983, upload-time = "2025-10-15T15:46:39.406Z" }, +] + +[[package]] +name = "torch" +version = "2.9.0+cu128" +source = { registry = "https://download.pytorch.org/whl/cu128" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine == 'aarch64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", +] +dependencies = [ + { name = "filelock", marker = "sys_platform == 'linux'" }, + { name = "fsspec", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "networkx", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cufile-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "sys_platform == 'linux'" }, + { name = "setuptools", marker = "sys_platform == 'linux'" }, + { name = "sympy", marker = "sys_platform == 'linux'" }, + { name = "triton", version = "3.5.0", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "triton", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.9.0%2Bcu128-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e1765625084e320f1eb2f4eb5fd9d14d39d08d7a1880c10a307ce5de20831d27", upload-time = "2025-10-14T17:28:29Z" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.9.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:87c62d3b95f1a2270bd116dbd47dc515c0b2035076fbb4a03b4365ea289e89c4", upload-time = "2025-10-14T17:28:41Z" }, +] + +[[package]] +name = "torchcodec" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'darwin'", + "platform_machine == 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/fd/eec92c82545038a90ffd24e3626bb3a85f7d51577b04819c1c753d380a9b/torchcodec-0.8.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2ec2e874dfb6fbf9bbeb792bea56317529636e78db175f56aad1e4efd6e12502", size = 1898382, upload-time = "2025-10-16T14:43:37.699Z" }, + { url = "https://files.pythonhosted.org/packages/fe/09/ce7436151a3825f27c00263d722b0cf093609921da6cf24b0fa8133cc415/torchcodec-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:318da9af9179d156be0a84296e909d51e4cd758598eaaea08c828790c80bf977", size = 2070488, upload-time = "2025-10-16T14:43:21.803Z" }, +] + +[[package]] +name = "torchcodec" +version = "0.8.0" +source = { path = "scripts/deployment/dgpu/wheels/torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl" } +resolution-markers = [ + "platform_machine == 'aarch64' and sys_platform == 'linux'", +] +wheels = [ + { filename = "torchcodec-0.8.0-cp312-cp312-linux_aarch64.whl", hash = "sha256:3c5bf377f922d2126041b3c49846504083a015d44979ca594e368ccc8c4c0814" }, +] + +[package.metadata] +requires-dist = [ + { name = "numpy", marker = "extra == 'dev'" }, + { name = "pillow", marker = "extra == 'dev'" }, + { name = "pytest", marker = "extra == 'dev'" }, +] +provides-extras = ["dev"] + +[[package]] +name = "torchvision" +version = "0.24.0" +source = { registry = "https://download.pytorch.org/whl/cu128" } +resolution-markers = [ + "platform_machine == 'aarch64' and sys_platform == 'linux'", +] +dependencies = [ + { name = "numpy", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "pillow", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.24.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5d6bcd7393774c82531f7ec411f352129fe8c302bba7765c372398a71d5df4a8", upload-time = "2025-10-15T14:15:54Z" }, +] + +[[package]] +name = "torchvision" +version = "0.24.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'darwin'", + "platform_machine == 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'darwin'", + "platform_machine != 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux'", +] +dependencies = [ + { name = "numpy", marker = "sys_platform != 'linux'" }, + { name = "pillow", marker = "sys_platform != 'linux'" }, + { name = "torch", version = "2.9.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/ef/81e4e69e02e2c4650b30e8c11c8974f946682a30e0ab7e9803a831beff76/torchvision-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c61d40bcd2e2451e932902a702ad495ba1ec6f279e90b1e15cef2bb55dc911e2", size = 1891726, upload-time = "2025-10-15T15:51:16.977Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ad/3c56fcd2a0d6e8afa80e115b5ade4302232ec99655220a51d05709819523/torchvision-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:060b7c50ed4b3fb0316b08e2e31bfd874ec2f63ef5ae02f81e54341ca4e88703", size = 4292225, upload-time = "2025-10-15T15:51:27.699Z" }, +] + +[[package]] +name = "torchvision" +version = "0.24.0+cu128" +source = { registry = "https://download.pytorch.org/whl/cu128" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", +] +dependencies = [ + { name = "numpy", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "pillow", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "torch", version = "2.9.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.24.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e505bd83ee10edb94523d0b805a08f50b8862b58d2cc6f02d14cd4e7ef9302bc", upload-time = "2025-10-15T14:05:29Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "transformers" +version = "4.57.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/70/d42a739e8dfde3d92bb2fff5819cbf331fe9657323221e79415cd5eb65ee/transformers-4.57.3.tar.gz", hash = "sha256:df4945029aaddd7c09eec5cad851f30662f8bd1746721b34cc031d70c65afebc", size = 10139680, upload-time = "2025-11-25T15:51:30.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/6b/2f416568b3c4c91c96e5a365d164f8a4a4a88030aa8ab4644181fdadce97/transformers-4.57.3-py3-none-any.whl", hash = "sha256:c77d353a4851b1880191603d36acb313411d3577f6e2897814f333841f7003f4", size = 11993463, upload-time = "2025-11-25T15:51:26.493Z" }, +] + +[[package]] +name = "triton" +version = "3.5.0" +source = { registry = "https://download.pytorch.org/whl/cu128" } +resolution-markers = [ + "platform_machine == 'aarch64' and sys_platform == 'linux'", +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/triton-3.5.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b82b46df35ae9e0b85a382d99a076e6ebea23a3a5dbaca7dc24a7571e6bebad", upload-time = "2026-01-22T23:05:48Z" }, +] + +[[package]] +name = "triton" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/9b/30988039e1e84df7554fba24e6a734d2d0e847af33cabdf9b532b3c51456/triton-3.5.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da21fccceafc163e3a5e857abe34351ef76345af06cabf9637a914742671f0b", size = 159946647, upload-time = "2025-10-15T19:15:56.325Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3a/e991574f3102147b642e49637e0281e9bb7c4ba254edb2bab78247c85e01/triton-3.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9e71db82261c4ffa3921cd050cd5faa18322d2d405c30eb56084afaff3b0833", size = 170476535, upload-time = "2025-10-13T16:38:05.18Z" }, +] + +[[package]] +name = "typeguard" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/e8/66e25efcc18542d58706ce4e50415710593721aae26e794ab1dec34fb66f/typeguard-4.5.1.tar.gz", hash = "sha256:f6f8ecbbc819c9bc749983cc67c02391e16a9b43b8b27f15dc70ed7c4a007274", size = 80121, upload-time = "2026-02-19T16:09:03.392Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/88/b55b3117287a8540b76dbdd87733808d4d01c8067a3b339408c250bb3600/typeguard-4.5.1-py3-none-any.whl", hash = "sha256:44d2bf329d49a244110a090b55f5f91aa82d9a9834ebfd30bcc73651e4a8cc40", size = 36745, upload-time = "2026-02-19T16:09:01.6Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tyro" +version = "0.9.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docstring-parser" }, + { name = "rich" }, + { name = "shtab" }, + { name = "typeguard" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/86/90242f575fa5d50c6d5fae6c47a95cd5b56b17413dc6d8391190aed58ac5/tyro-0.9.17.tar.gz", hash = "sha256:4a43386c6f3c8a06ed40a2f290de22fa3306300c68599ce5d7bd6fd1ad13c35a", size = 262449, upload-time = "2025-03-13T01:39:45.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b1/c0c62adcd5e64244af876a3173f194d02dc1fe830cae28370b6d9e315971/tyro-0.9.17-py3-none-any.whl", hash = "sha256:f601fcd27edc99bc10a03602a47930ce8906ed995179a98b689bc85db38bec40", size = 123658, upload-time = "2025-03-13T01:39:43.912Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "virtualenv" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/92/58199fe10049f9703c2666e809c4f686c54ef0a68b0f6afccf518c0b1eb9/virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098", size = 5840618, upload-time = "2026-03-09T17:24:38.013Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f", size = 5825084, upload-time = "2026-03-09T17:24:35.378Z" }, +] + +[[package]] +name = "wandb" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "gitpython" }, + { name = "packaging" }, + { name = "platformdirs" }, + { name = "protobuf" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sentry-sdk" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/8b/db2d44395c967cd452517311fd6ede5d1e07310769f448358d4874248512/wandb-0.23.0.tar.gz", hash = "sha256:e5f98c61a8acc3ee84583ca78057f64344162ce026b9f71cb06eea44aec27c93", size = 44413921, upload-time = "2025-11-11T21:06:30.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/61/a3220c7fa4cadfb2b2a5c09e3fa401787326584ade86d7c1f58bf1cd43bd/wandb-0.23.0-py3-none-macosx_12_0_arm64.whl", hash = "sha256:b682ec5e38fc97bd2e868ac7615a0ab4fc6a15220ee1159e87270a5ebb7a816d", size = 18992250, upload-time = "2025-11-11T21:06:03.412Z" }, + { url = "https://files.pythonhosted.org/packages/90/16/e69333cf3d11e7847f424afc6c8ae325e1f6061b2e5118d7a17f41b6525d/wandb-0.23.0-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:ec094eb71b778e77db8c188da19e52c4f96cb9d5b4421d7dc05028afc66fd7e7", size = 20045616, upload-time = "2025-11-11T21:06:07.109Z" }, + { url = "https://files.pythonhosted.org/packages/62/79/42dc6c7bb0b425775fe77f1a3f1a22d75d392841a06b43e150a3a7f2553a/wandb-0.23.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e43f1f04b98c34f407dcd2744cec0a590abce39bed14a61358287f817514a7b", size = 18758848, upload-time = "2025-11-11T21:06:09.832Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/d6ddb78334996ccfc1179444bfcfc0f37ffd07ee79bb98940466da6f68f8/wandb-0.23.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5847f98cbb3175caf5291932374410141f5bb3b7c25f9c5e562c1988ce0bf5", size = 20231493, upload-time = "2025-11-11T21:06:12.323Z" }, + { url = "https://files.pythonhosted.org/packages/52/4d/0ad6df0e750c19dabd24d2cecad0938964f69a072f05fbdab7281bec2b64/wandb-0.23.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6151355fd922539926e870be811474238c9614b96541773b990f1ce53368aef6", size = 18793473, upload-time = "2025-11-11T21:06:14.967Z" }, + { url = "https://files.pythonhosted.org/packages/f8/da/c2ba49c5573dff93dafc0acce691bb1c3d57361bf834b2f2c58e6193439b/wandb-0.23.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df62e426e448ebc44269140deb7240df474e743b12d4b1f53b753afde4aa06d4", size = 20332882, upload-time = "2025-11-11T21:06:17.865Z" }, + { url = "https://files.pythonhosted.org/packages/40/65/21bfb10ee5cd93fbcaf794958863c7e05bac4bbeb1cc1b652094aa3743a5/wandb-0.23.0-py3-none-win32.whl", hash = "sha256:6c21d3eadda17aef7df6febdffdddfb0b4835c7754435fc4fe27631724269f5c", size = 19433198, upload-time = "2025-11-11T21:06:21.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/33/cbe79e66c171204e32cf940c7fdfb8b5f7d2af7a00f301c632f3a38aa84b/wandb-0.23.0-py3-none-win_amd64.whl", hash = "sha256:b50635fa0e16e528bde25715bf446e9153368428634ca7a5dbd7a22c8ae4e915", size = 19433201, upload-time = "2025-11-11T21:06:24.607Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/5ecfae12d78ea036a746c071e4c13b54b28d641efbba61d2947c73b3e6f9/wandb-0.23.0-py3-none-win_arm64.whl", hash = "sha256:fa0181b02ce4d1993588f4a728d8b73ae487eb3cb341e6ce01c156be7a98ec72", size = 17678649, upload-time = "2025-11-11T21:06:27.289Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, +] + +[[package]] +name = "wrapt" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/64/925f213fdcbb9baeb1530449ac71a4d57fc361c053d06bf78d0c5c7cd80c/wrapt-2.1.2.tar.gz", hash = "sha256:3996a67eecc2c68fd47b4e3c564405a5777367adfd9b8abb58387b63ee83b21e", size = 81678, upload-time = "2026-03-06T02:53:25.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/b6/1db817582c49c7fcbb7df6809d0f515af29d7c2fbf57eb44c36e98fb1492/wrapt-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff2aad9c4cda28a8f0653fc2d487596458c2a3f475e56ba02909e950a9efa6a9", size = 61255, upload-time = "2026-03-06T02:52:45.663Z" }, + { url = "https://files.pythonhosted.org/packages/a2/16/9b02a6b99c09227c93cd4b73acc3678114154ec38da53043c0ddc1fba0dc/wrapt-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6433ea84e1cfacf32021d2a4ee909554ade7fd392caa6f7c13f1f4bf7b8e8748", size = 61848, upload-time = "2026-03-06T02:53:48.728Z" }, + { url = "https://files.pythonhosted.org/packages/af/aa/ead46a88f9ec3a432a4832dfedb84092fc35af2d0ba40cd04aea3889f247/wrapt-2.1.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c20b757c268d30d6215916a5fa8461048d023865d888e437fab451139cad6c8e", size = 121433, upload-time = "2026-03-06T02:54:40.328Z" }, + { url = "https://files.pythonhosted.org/packages/3a/9f/742c7c7cdf58b59085a1ee4b6c37b013f66ac33673a7ef4aaed5e992bc33/wrapt-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79847b83eb38e70d93dc392c7c5b587efe65b3e7afcc167aa8abd5d60e8761c8", size = 123013, upload-time = "2026-03-06T02:53:26.58Z" }, + { url = "https://files.pythonhosted.org/packages/e8/44/2c3dd45d53236b7ed7c646fcf212251dc19e48e599debd3926b52310fafb/wrapt-2.1.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f8fba1bae256186a83d1875b2b1f4e2d1242e8fac0f58ec0d7e41b26967b965c", size = 117326, upload-time = "2026-03-06T02:53:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/74/e2/b17d66abc26bd96f89dec0ecd0ef03da4a1286e6ff793839ec431b9fae57/wrapt-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e3d3b35eedcf5f7d022291ecd7533321c4775f7b9cd0050a31a68499ba45757c", size = 121444, upload-time = "2026-03-06T02:54:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/3c/62/e2977843fdf9f03daf1586a0ff49060b1b2fc7ff85a7ea82b6217c1ae36e/wrapt-2.1.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6f2c5390460de57fa9582bc8a1b7a6c86e1a41dfad74c5225fc07044c15cc8d1", size = 116237, upload-time = "2026-03-06T02:54:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/27fc67914e68d740bce512f11734aec08696e6b17641fef8867c00c949fc/wrapt-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7dfa9f2cf65d027b951d05c662cc99ee3bd01f6e4691ed39848a7a5fffc902b2", size = 120563, upload-time = "2026-03-06T02:53:20.412Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9f/b750b3692ed2ef4705cb305bd68858e73010492b80e43d2a4faa5573cbe7/wrapt-2.1.2-cp312-cp312-win32.whl", hash = "sha256:eba8155747eb2cae4a0b913d9ebd12a1db4d860fc4c829d7578c7b989bd3f2f0", size = 58198, upload-time = "2026-03-06T02:53:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b2/feecfe29f28483d888d76a48f03c4c4d8afea944dbee2b0cd3380f9df032/wrapt-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1c51c738d7d9faa0b3601708e7e2eda9bf779e1b601dce6c77411f2a1b324a63", size = 60441, upload-time = "2026-03-06T02:52:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/44/e1/e328f605d6e208547ea9fd120804fcdec68536ac748987a68c47c606eea8/wrapt-2.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:c8e46ae8e4032792eb2f677dbd0d557170a8e5524d22acc55199f43efedd39bf", size = 58836, upload-time = "2026-03-06T02:53:22.053Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/8528ac2dfa2c1e6708f647df7ae144ead13f0a31146f43c7264b4942bf12/wrapt-2.1.2-py3-none-any.whl", hash = "sha256:b8fd6fa2b2c4e7621808f8c62e8317f4aae56e59721ad933bac5239d913cf0e8", size = 43993, upload-time = "2026-03-06T02:53:12.905Z" }, +] + +[[package]] +name = "xxhash" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744, upload-time = "2025-10-02T14:34:34.622Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035, upload-time = "2025-10-02T14:34:37.354Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, + { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163, upload-time = "2025-10-02T14:34:39.872Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411, upload-time = "2025-10-02T14:34:41.569Z" }, + { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898, upload-time = "2025-10-02T14:34:46.302Z" }, + { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655, upload-time = "2025-10-02T14:34:47.571Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001, upload-time = "2025-10-02T14:34:49.273Z" }, + { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, + { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617, upload-time = "2025-10-02T14:34:51.954Z" }, + { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534, upload-time = "2025-10-02T14:34:53.276Z" }, + { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, +] + +[[package]] +name = "yarl" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, + { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, + { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +]