tiktoken


Nametiktoken JSON
Version 0.8.0 PyPI version JSON
download
home_pageNone
Summarytiktoken is a fast BPE tokeniser for use with OpenAI's models
upload_time2024-10-03 22:44:04
maintainerNone
docs_urlNone
authorShantanu Jain
requires_python>=3.9
licenseMIT License Copyright (c) 2022 OpenAI, Shantanu Jain 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.
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ⏳ tiktoken

tiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser for use with
OpenAI's models.

```python
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
assert enc.decode(enc.encode("hello world")) == "hello world"

# To get the tokeniser corresponding to a specific model in the OpenAI API:
enc = tiktoken.encoding_for_model("gpt-4o")
```

The open source version of `tiktoken` can be installed from PyPI:
```
pip install tiktoken
```

The tokeniser API is documented in `tiktoken/core.py`.

Example code using `tiktoken` can be found in the
[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).


## Performance

`tiktoken` is between 3-6x faster than a comparable open source tokeniser:

![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)

Performance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` from
`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.


## Getting help

Please post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).

If you work at OpenAI, make sure to check the internal documentation or feel free to contact
@shantanu.

## What is BPE anyway?

Language models don't see text like you and I, instead they see a sequence of numbers (known as tokens).
Byte pair encoding (BPE) is a way of converting text into tokens. It has a couple desirable
properties:
1) It's reversible and lossless, so you can convert tokens back into the original text
2) It works on arbitrary text, even text that is not in the tokeniser's training data
3) It compresses the text: the token sequence is shorter than the bytes corresponding to the
   original text. On average, in practice, each token corresponds to about 4 bytes.
4) It attempts to let the model see common subwords. For instance, "ing" is a common subword in
   English, so BPE encodings will often split "encoding" into tokens like "encod" and "ing"
   (instead of e.g. "enc" and "oding"). Because the model will then see the "ing" token again and
   again in different contexts, it helps models generalise and better understand grammar.

`tiktoken` contains an educational submodule that is friendlier if you want to learn more about
the details of BPE, including code that helps visualise the BPE procedure:
```python
from tiktoken._educational import *

# Train a BPE tokeniser on a small amount of text
enc = train_simple_encoding()

# Visualise how the GPT-4 encoder encodes text
enc = SimpleBytePairEncoding.from_tiktoken("cl100k_base")
enc.encode("hello world aaaaaaaaaaaa")
```


## Extending tiktoken

You may wish to extend `tiktoken` to support new encodings. There are two ways to do this.


**Create your `Encoding` object exactly the way you want and simply pass it around.**

```python
cl100k_base = tiktoken.get_encoding("cl100k_base")

# In production, load the arguments directly instead of accessing private attributes
# See openai_public.py for examples of arguments for specific encodings
enc = tiktoken.Encoding(
    # If you're changing the set of special tokens, make sure to use a different name
    # It should be clear from the name what behaviour to expect.
    name="cl100k_im",
    pat_str=cl100k_base._pat_str,
    mergeable_ranks=cl100k_base._mergeable_ranks,
    special_tokens={
        **cl100k_base._special_tokens,
        "<|im_start|>": 100264,
        "<|im_end|>": 100265,
    }
)
```

**Use the `tiktoken_ext` plugin mechanism to register your `Encoding` objects with `tiktoken`.**

This is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise prefer
option 1.

To do this, you'll need to create a namespace package under `tiktoken_ext`.

Layout your project like this, making sure to omit the `tiktoken_ext/__init__.py` file:
```
my_tiktoken_extension
├── tiktoken_ext
│   └── my_encodings.py
└── setup.py
```

`my_encodings.py` should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.
This is a dictionary from an encoding name to a function that takes no arguments and returns
arguments that can be passed to `tiktoken.Encoding` to construct that encoding. For an example, see
`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.

Your `setup.py` should look something like this:
```python
from setuptools import setup, find_namespace_packages

setup(
    name="my_tiktoken_extension",
    packages=find_namespace_packages(include=['tiktoken_ext*']),
    install_requires=["tiktoken"],
    ...
)
```

Then simply `pip install ./my_tiktoken_extension` and you should be able to use your
custom encodings! Make sure **not** to use an editable install.


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "tiktoken",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": null,
    "author": "Shantanu Jain",
    "author_email": "shantanu@openai.com",
    "download_url": "https://files.pythonhosted.org/packages/37/02/576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099/tiktoken-0.8.0.tar.gz",
    "platform": null,
    "description": "# \u23f3 tiktoken\n\ntiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser for use with\nOpenAI's models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe open source version of `tiktoken` can be installed from PyPI:\n```\npip install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf you work at OpenAI, make sure to check the internal documentation or feel free to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don't see text like you and I, instead they see a sequence of numbers (known as tokens).\nByte pair encoding (BPE) is a way of converting text into tokens. It has a couple desirable\nproperties:\n1) It's reversible and lossless, so you can convert tokens back into the original text\n2) It works on arbitrary text, even text that is not in the tokeniser's training data\n3) It compresses the text: the token sequence is shorter than the bytes corresponding to the\n   original text. On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts to let the model see common subwords. For instance, \"ing\" is a common subword in\n   English, so BPE encodings will often split \"encoding\" into tokens like \"encod\" and \"ing\"\n   (instead of e.g. \"enc\" and \"oding\"). Because the model will then see the \"ing\" token again and\n   again in different contexts, it helps models generalise and better understand grammar.\n\n`tiktoken` contains an educational submodule that is friendlier if you want to learn more about\nthe details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments directly instead of accessing private attributes\n# See openai_public.py for examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n    # If you're changing the set of special tokens, make sure to use a different name\n    # It should be clear from the name what behaviour to expect.\n    name=\"cl100k_im\",\n    pat_str=cl100k_base._pat_str,\n    mergeable_ranks=cl100k_base._mergeable_ranks,\n    special_tokens={\n        **cl100k_base._special_tokens,\n        \"<|im_start|>\": 100264,\n        \"<|im_end|>\": 100265,\n    }\n)\n```\n\n**Use the `tiktoken_ext` plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise prefer\noption 1.\n\nTo do this, you'll need to create a namespace package under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n\u251c\u2500\u2500 tiktoken_ext\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 my_encodings.py\n\u2514\u2500\u2500 setup.py\n```\n\n`my_encodings.py` should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary from an encoding name to a function that takes no arguments and returns\narguments that can be passed to `tiktoken.Encoding` to construct that encoding. For an example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour `setup.py` should look something like this:\n```python\nfrom setuptools import setup, find_namespace_packages\n\nsetup(\n    name=\"my_tiktoken_extension\",\n    packages=find_namespace_packages(include=['tiktoken_ext*']),\n    install_requires=[\"tiktoken\"],\n    ...\n)\n```\n\nThen simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom encodings! Make sure **not** to use an editable install.\n\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2022 OpenAI, Shantanu Jain  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. ",
    "summary": "tiktoken is a fast BPE tokeniser for use with OpenAI's models",
    "version": "0.8.0",
    "project_urls": {
        "changelog": "https://github.com/openai/tiktoken/blob/main/CHANGELOG.md",
        "homepage": "https://github.com/openai/tiktoken",
        "repository": "https://github.com/openai/tiktoken"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c9baa35fad753bbca8ba0cc1b0f3402a70256a110ced7ac332cf84ba89fc87ab",
                "md5": "e9aec9936e07a62306d763e0f8261175",
                "sha256": "b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e9aec9936e07a62306d763e0f8261175",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1039905,
            "upload_time": "2024-10-03T22:43:17",
            "upload_time_iso_8601": "2024-10-03T22:43:17.292949Z",
            "url": "https://files.pythonhosted.org/packages/c9/ba/a35fad753bbca8ba0cc1b0f3402a70256a110ced7ac332cf84ba89fc87ab/tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "910513dab8fd7460391c387b3e69e14bf1e51ff71fe0a202cd2933cc3ea93fb6",
                "md5": "c14bfccdf31500e62b31c8e4955cd430",
                "sha256": "9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c14bfccdf31500e62b31c8e4955cd430",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 982417,
            "upload_time": "2024-10-03T22:43:19",
            "upload_time_iso_8601": "2024-10-03T22:43:19.437137Z",
            "url": "https://files.pythonhosted.org/packages/91/05/13dab8fd7460391c387b3e69e14bf1e51ff71fe0a202cd2933cc3ea93fb6/tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e99818ec4a8351a6cf4537e40cd6e19a422c10cce1ef00a2fcb716e0a96af58b",
                "md5": "0233bd5c801f1b63d4b0a4bb8692be19",
                "sha256": "25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "0233bd5c801f1b63d4b0a4bb8692be19",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1144915,
            "upload_time": "2024-10-03T22:43:21",
            "upload_time_iso_8601": "2024-10-03T22:43:21.385076Z",
            "url": "https://files.pythonhosted.org/packages/e9/98/18ec4a8351a6cf4537e40cd6e19a422c10cce1ef00a2fcb716e0a96af58b/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2e28cf3633018cbcc6deb7805b700ccd6085c9a5a7f72b38974ee0bffd56d311",
                "md5": "6efd63d522ccede3dd93a2bdfe1caa30",
                "sha256": "f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6efd63d522ccede3dd93a2bdfe1caa30",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1177221,
            "upload_time": "2024-10-03T22:43:23",
            "upload_time_iso_8601": "2024-10-03T22:43:23.325837Z",
            "url": "https://files.pythonhosted.org/packages/2e/28/cf3633018cbcc6deb7805b700ccd6085c9a5a7f72b38974ee0bffd56d311/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "57818a5be305cbd39d4e83a794f9e80c7f2c84b524587b7feb27c797b2046d51",
                "md5": "7d512a41b30acf0ee3272b636c9e0204",
                "sha256": "6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7d512a41b30acf0ee3272b636c9e0204",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1237398,
            "upload_time": "2024-10-03T22:43:24",
            "upload_time_iso_8601": "2024-10-03T22:43:24.710514Z",
            "url": "https://files.pythonhosted.org/packages/57/81/8a5be305cbd39d4e83a794f9e80c7f2c84b524587b7feb27c797b2046d51/tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dcda8d1cc3089a83f5cf11c2e489332752981435280285231924557350523a59",
                "md5": "839c5099634f564dc521137e5565b538",
                "sha256": "d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "839c5099634f564dc521137e5565b538",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 884215,
            "upload_time": "2024-10-03T22:43:26",
            "upload_time_iso_8601": "2024-10-03T22:43:26.793254Z",
            "url": "https://files.pythonhosted.org/packages/dc/da/8d1cc3089a83f5cf11c2e489332752981435280285231924557350523a59/tiktoken-0.8.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f61eca48e7bfeeccaf76f3a501bd84db1fa28b3c22c9d1a1f41af9fb7579c5f6",
                "md5": "a188930ffb921e5417a5c504b4e8c3bd",
                "sha256": "d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a188930ffb921e5417a5c504b4e8c3bd",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1039700,
            "upload_time": "2024-10-03T22:43:28",
            "upload_time_iso_8601": "2024-10-03T22:43:28.315992Z",
            "url": "https://files.pythonhosted.org/packages/f6/1e/ca48e7bfeeccaf76f3a501bd84db1fa28b3c22c9d1a1f41af9fb7579c5f6/tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8cf8f0101d98d661b34534769c3818f5af631e59c36ac6d07268fbfc89e539ce",
                "md5": "7cd767a4e56d41beb5809e16cde92ff6",
                "sha256": "2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "7cd767a4e56d41beb5809e16cde92ff6",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 982413,
            "upload_time": "2024-10-03T22:43:29",
            "upload_time_iso_8601": "2024-10-03T22:43:29.807074Z",
            "url": "https://files.pythonhosted.org/packages/8c/f8/f0101d98d661b34534769c3818f5af631e59c36ac6d07268fbfc89e539ce/tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "01c4c4a4360de845217b6aa9709c15773484b50479f36bb50419c443204e5de9",
                "md5": "c52ccd945dcf1223058bf94f49d534ae",
                "sha256": "9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c52ccd945dcf1223058bf94f49d534ae",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1176588,
            "upload_time": "2024-10-03T22:43:31",
            "upload_time_iso_8601": "2024-10-03T22:43:31.136840Z",
            "url": "https://files.pythonhosted.org/packages/01/c4/c4a4360de845217b6aa9709c15773484b50479f36bb50419c443204e5de9/tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f8a3ef984e976822cd6c2227c854f74d2e60cf4cd6fbfca46251199914746f78",
                "md5": "c120ba324494e3d6b559126edc8cea7c",
                "sha256": "56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c120ba324494e3d6b559126edc8cea7c",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1237261,
            "upload_time": "2024-10-03T22:43:32",
            "upload_time_iso_8601": "2024-10-03T22:43:32.750097Z",
            "url": "https://files.pythonhosted.org/packages/f8/a3/ef984e976822cd6c2227c854f74d2e60cf4cd6fbfca46251199914746f78/tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1e86eea2309dc258fb86c7d9b10db536434fc16420feaa3b6113df18b23db7c2",
                "md5": "54b32ad2d47f1ed2ca180f6d8dcece2e",
                "sha256": "326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "54b32ad2d47f1ed2ca180f6d8dcece2e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 884537,
            "upload_time": "2024-10-03T22:43:34",
            "upload_time_iso_8601": "2024-10-03T22:43:34.592253Z",
            "url": "https://files.pythonhosted.org/packages/1e/86/eea2309dc258fb86c7d9b10db536434fc16420feaa3b6113df18b23db7c2/tiktoken-0.8.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c12234b2e136a6f4af186b6640cbfd6f93400783c9ef6cd550d9eab80628d9de",
                "md5": "ea48da6beef9dbd760a1ec7736b9db07",
                "sha256": "881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ea48da6beef9dbd760a1ec7736b9db07",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1039357,
            "upload_time": "2024-10-03T22:43:36",
            "upload_time_iso_8601": "2024-10-03T22:43:36.362860Z",
            "url": "https://files.pythonhosted.org/packages/c1/22/34b2e136a6f4af186b6640cbfd6f93400783c9ef6cd550d9eab80628d9de/tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "04d2c793cf49c20f5855fd6ce05d080c0537d7418f22c58e71f392d5e8c8dbf7",
                "md5": "8c7dec7d4caa26e0807148807e6f9a3a",
                "sha256": "fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "8c7dec7d4caa26e0807148807e6f9a3a",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 982616,
            "upload_time": "2024-10-03T22:43:37",
            "upload_time_iso_8601": "2024-10-03T22:43:37.658582Z",
            "url": "https://files.pythonhosted.org/packages/04/d2/c793cf49c20f5855fd6ce05d080c0537d7418f22c58e71f392d5e8c8dbf7/tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b3a179846e5ef911cd5d75c844de3fa496a10c91b4b5f550aad695c5df153d72",
                "md5": "b0af0d1ed4dd23868e660b5b0ee5f8ea",
                "sha256": "9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b0af0d1ed4dd23868e660b5b0ee5f8ea",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1144011,
            "upload_time": "2024-10-03T22:43:39",
            "upload_time_iso_8601": "2024-10-03T22:43:39.092699Z",
            "url": "https://files.pythonhosted.org/packages/b3/a1/79846e5ef911cd5d75c844de3fa496a10c91b4b5f550aad695c5df153d72/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2632e0e3a859136e95c85a572e4806dc58bf1ddf651108ae8b97d5f3ebe1a244",
                "md5": "00db86a186bb6a277ae637c178b9c95c",
                "sha256": "d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "00db86a186bb6a277ae637c178b9c95c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1175432,
            "upload_time": "2024-10-03T22:43:40",
            "upload_time_iso_8601": "2024-10-03T22:43:40.323018Z",
            "url": "https://files.pythonhosted.org/packages/26/32/e0e3a859136e95c85a572e4806dc58bf1ddf651108ae8b97d5f3ebe1a244/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c789926b66e9025b97e9fbabeaa59048a736fe3c3e4530a204109571104f921c",
                "md5": "61d139037c1137d24aa175bb5675222a",
                "sha256": "294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "61d139037c1137d24aa175bb5675222a",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1236576,
            "upload_time": "2024-10-03T22:43:41",
            "upload_time_iso_8601": "2024-10-03T22:43:41.516764Z",
            "url": "https://files.pythonhosted.org/packages/c7/89/926b66e9025b97e9fbabeaa59048a736fe3c3e4530a204109571104f921c/tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "45e239d4aa02a52bba73b2cd21ba4533c84425ff8786cc63c511d68c8897376e",
                "md5": "d81d475b5c4ecfcd8e2777c1a9f26c80",
                "sha256": "d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d81d475b5c4ecfcd8e2777c1a9f26c80",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 883824,
            "upload_time": "2024-10-03T22:43:43",
            "upload_time_iso_8601": "2024-10-03T22:43:43.330521Z",
            "url": "https://files.pythonhosted.org/packages/45/e2/39d4aa02a52bba73b2cd21ba4533c84425ff8786cc63c511d68c8897376e/tiktoken-0.8.0-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e338802e79ba0ee5fcbf240cd624143f57744e5d411d2e9d9ad2db70d8395986",
                "md5": "5b16dd9c6b67824e50f3da283c2656e8",
                "sha256": "02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5b16dd9c6b67824e50f3da283c2656e8",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1039648,
            "upload_time": "2024-10-03T22:43:45",
            "upload_time_iso_8601": "2024-10-03T22:43:45.220415Z",
            "url": "https://files.pythonhosted.org/packages/e3/38/802e79ba0ee5fcbf240cd624143f57744e5d411d2e9d9ad2db70d8395986/tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b1da24cdbfc302c98663fbea66f5866f7fa1048405c7564ab88483aea97c3b1a",
                "md5": "17bdc613f6224b7e7c89d403bda50f21",
                "sha256": "c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "17bdc613f6224b7e7c89d403bda50f21",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 982763,
            "upload_time": "2024-10-03T22:43:46",
            "upload_time_iso_8601": "2024-10-03T22:43:46.571701Z",
            "url": "https://files.pythonhosted.org/packages/b1/da/24cdbfc302c98663fbea66f5866f7fa1048405c7564ab88483aea97c3b1a/tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e4f00ecf79a279dfa41fc97d00adccf976ecc2556d3c08ef3e25e45eb31f665b",
                "md5": "433605d4e8ede8344f67f59a5970024a",
                "sha256": "6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "433605d4e8ede8344f67f59a5970024a",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1144417,
            "upload_time": "2024-10-03T22:43:48",
            "upload_time_iso_8601": "2024-10-03T22:43:48.633266Z",
            "url": "https://files.pythonhosted.org/packages/e4/f0/0ecf79a279dfa41fc97d00adccf976ecc2556d3c08ef3e25e45eb31f665b/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "abd3155d2d4514f3471a25dc1d6d20549ef254e2aa9bb5b1060809b1d3b03d3a",
                "md5": "dbd0b4a7ea66abd96017dfc47eda504e",
                "sha256": "4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dbd0b4a7ea66abd96017dfc47eda504e",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1175108,
            "upload_time": "2024-10-03T22:43:50",
            "upload_time_iso_8601": "2024-10-03T22:43:50.568379Z",
            "url": "https://files.pythonhosted.org/packages/ab/d3/155d2d4514f3471a25dc1d6d20549ef254e2aa9bb5b1060809b1d3b03d3a/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "19eb5989e16821ee8300ef8ee13c16effc20dfc26c777d05fbb6825e3c037b81",
                "md5": "d538ad7ad01f80be3e0bfa79140b4cb7",
                "sha256": "5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d538ad7ad01f80be3e0bfa79140b4cb7",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1236520,
            "upload_time": "2024-10-03T22:43:51",
            "upload_time_iso_8601": "2024-10-03T22:43:51.759668Z",
            "url": "https://files.pythonhosted.org/packages/19/eb/5989e16821ee8300ef8ee13c16effc20dfc26c777d05fbb6825e3c037b81/tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "405914b20465f1d1cb89cfbc96ec27e5617b2d41c79da12b5e04e96d689be2a7",
                "md5": "b85c5b17fa82afa5ff3225920ee827d2",
                "sha256": "18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "b85c5b17fa82afa5ff3225920ee827d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 883849,
            "upload_time": "2024-10-03T22:43:53",
            "upload_time_iso_8601": "2024-10-03T22:43:53.999045Z",
            "url": "https://files.pythonhosted.org/packages/40/59/14b20465f1d1cb89cfbc96ec27e5617b2d41c79da12b5e04e96d689be2a7/tiktoken-0.8.0-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "08f38a8ba9329e6b426d822c974d58fc6477f3f7b3b8deef651813d275cbe75f",
                "md5": "fe4a59beae9047d9ae25eef1d586fd3c",
                "sha256": "7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fe4a59beae9047d9ae25eef1d586fd3c",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1040915,
            "upload_time": "2024-10-03T22:43:55",
            "upload_time_iso_8601": "2024-10-03T22:43:55.177892Z",
            "url": "https://files.pythonhosted.org/packages/08/f3/8a8ba9329e6b426d822c974d58fc6477f3f7b3b8deef651813d275cbe75f/tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "427a914bd98100449422778f9222d00b3a4ee654211c40784e57541fa46311ab",
                "md5": "7a656dbf90440cefe47598ccecd9a5e7",
                "sha256": "886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "7a656dbf90440cefe47598ccecd9a5e7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 983753,
            "upload_time": "2024-10-03T22:43:56",
            "upload_time_iso_8601": "2024-10-03T22:43:56.303526Z",
            "url": "https://files.pythonhosted.org/packages/42/7a/914bd98100449422778f9222d00b3a4ee654211c40784e57541fa46311ab/tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f7011483856d84827c5fe541cb160f07914c6b063b8d961146e9c3557c4730c0",
                "md5": "ae48187a7f78a6cb4f58b8f4bc2195dc",
                "sha256": "6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "ae48187a7f78a6cb4f58b8f4bc2195dc",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1145913,
            "upload_time": "2024-10-03T22:43:58",
            "upload_time_iso_8601": "2024-10-03T22:43:58.682228Z",
            "url": "https://files.pythonhosted.org/packages/f7/01/1483856d84827c5fe541cb160f07914c6b063b8d961146e9c3557c4730c0/tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c2e16c7a772e0200131e960e3381f1d7b26406bc5612c70677989c1498af2a60",
                "md5": "5e05e735cfb04bb2b90f6bcf02108329",
                "sha256": "b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5e05e735cfb04bb2b90f6bcf02108329",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1178505,
            "upload_time": "2024-10-03T22:43:59",
            "upload_time_iso_8601": "2024-10-03T22:43:59.860777Z",
            "url": "https://files.pythonhosted.org/packages/c2/e1/6c7a772e0200131e960e3381f1d7b26406bc5612c70677989c1498af2a60/tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3e6b3ae00f0bff5d0b6925bf6370cf0ff606f56daed76210c2b0a156017b78dc",
                "md5": "97df403acb979b1725396683d68f5753",
                "sha256": "845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "97df403acb979b1725396683d68f5753",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1239111,
            "upload_time": "2024-10-03T22:44:01",
            "upload_time_iso_8601": "2024-10-03T22:44:01.094102Z",
            "url": "https://files.pythonhosted.org/packages/3e/6b/3ae00f0bff5d0b6925bf6370cf0ff606f56daed76210c2b0a156017b78dc/tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d53b7c8812952ca55e1bab08afc1dda3c5991804c71b550b9402e82a082ab795",
                "md5": "214c5ae25ef5c4671f8a45773a9bf45d",
                "sha256": "1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "214c5ae25ef5c4671f8a45773a9bf45d",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 884803,
            "upload_time": "2024-10-03T22:44:03",
            "upload_time_iso_8601": "2024-10-03T22:44:03.079091Z",
            "url": "https://files.pythonhosted.org/packages/d5/3b/7c8812952ca55e1bab08afc1dda3c5991804c71b550b9402e82a082ab795/tiktoken-0.8.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3702576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099",
                "md5": "89c2416ed3ccd09f84952fa7dd29c84b",
                "sha256": "9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"
            },
            "downloads": -1,
            "filename": "tiktoken-0.8.0.tar.gz",
            "has_sig": false,
            "md5_digest": "89c2416ed3ccd09f84952fa7dd29c84b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 35107,
            "upload_time": "2024-10-03T22:44:04",
            "upload_time_iso_8601": "2024-10-03T22:44:04.196326Z",
            "url": "https://files.pythonhosted.org/packages/37/02/576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099/tiktoken-0.8.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-03 22:44:04",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "openai",
    "github_project": "tiktoken",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "tiktoken"
}
        
Elapsed time: 0.35546s