ddeutil


Nameddeutil JSON
Version 0.4.6 PyPI version JSON
download
home_pageNone
SummaryCore data utility functions and objects
upload_time2025-01-18 11:13:36
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9.13
licenseMIT
keywords data utility
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Core Data Utility

[![test](https://github.com/ddeutils/ddeutil/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/ddeutils/ddeutil/actions/workflows/tests.yml)
[![codecov](https://codecov.io/gh/ddeutils/ddeutil/graph/badge.svg?token=G3XGBSRKA6)](https://codecov.io/gh/ddeutils/ddeutil)
[![pypi version](https://img.shields.io/pypi/v/ddeutil)](https://pypi.org/project/ddeutil/)
[![python support version](https://img.shields.io/pypi/pyversions/ddeutil)](https://pypi.org/project/ddeutil/)
[![size](https://img.shields.io/github/languages/code-size/ddeutils/ddeutil)](https://github.com/ddeutils/ddeutil)
[![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![type check: mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)

A **core data utility** package, this package implements the data utility 
functions and objects.

I was created this package base on sub-package namespace, `ddeutil` (This 
feature use for independent installation). This package able to extend with 
any sub-extension with this namespace.
So, this namespace able to scale-out the requirement with folder level design.
You can add any custom features and import it by `import ddeutil.{extension}`.

> [!NOTE]
> This package provide the base utility functions and objects for any sub-namespace
> package.

## :round_pushpin: Installation

```shell
pip install -U ddeutil
```

**Python version supported**:

| Python Version | Installation                        | Support Fixed Bug  |
|----------------|-------------------------------------|--------------------|
| `>=3.9,<3.14`  | `pip install -U ddeutil`            | :heavy_check_mark: |

> [!NOTE]
> If you want to install all optional dependencies for this package, you can use
> `pip install -U ddeutil[all]`. For optional dependencies that use on this
> package, it will list on below table;
> 
> | Optional deps     | Installation                       | Modules                                                 |
> |-------------------|------------------------------------|---------------------------------------------------------|
> | `ujson`           | `pip install -U ddeutil[checksum]` | `hash.checksum`                                         |
> | `python-dateutil` | `pip install -U ddeutil[dateutil]` | `dtutils.next_date_with_freq`, `dtutils.calc_data_freq` | 
> | `psutil`          | `pip install -U ddeutil[memory]`   | `threader.MonitorThread`.                               |

## :dart: Features

This data package implements all of utility functions and objects that does not
re-create again when the sub-namespace package want it because it is a basic utility
but has a lot of using require.

| Module          |          Name           | Description                                                                                                                                                                                       | Remark      |
|:----------------|:-----------------------:|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|
| base            |   `isinstance_check`    | Return True if a data is instance of the respect instance.                                                                                                                                        |             |
|                 |     `import_string`     | Import a dotted module path and return the attribute/class designated by the last name in the path.                                                                                               | no coverage |
|                 |         `lazy`          | Lazy use import_string function that wrapped with partial function.                                                                                                                               |             |
|                 |       `round_up`        | Round up the number with decimals precision size.                                                                                                                                                 |             |
|                 |      `remove_pad`       | Remove zero padding of zero prefix string.                                                                                                                                                        |             |
|                 |         `first`         | Returns the first item in the `iterable` that satisfies the `condition`.                                                                                                                          |             |
|                 |        `onlyone`        | Get only one element from check list that exists in match list.                                                                                                                                   |             |
|                 |        `hasdot`         | Return True value if dot searching exists in content data.                                                                                                                                        |             |
|                 |        `getdot`         | Return the value if dot searching exists in content data.                                                                                                                                         |             |
|                 |        `setdot`         | Set the value if dot searching exists in content data.                                                                                                                                            |             |
|                 |      `filter_dict`      | Filter dict value with excluded and included collections.                                                                                                                                         |             |
|                 |      `random_str`       | Random string from uppercase ASCII and number 0-9.                                                                                                                                                | no coverage |
|                 |       `coalesce`        | Coalesce function that is a just naming define function.                                                                                                                                          | no coverage |
| base.checker    |        `can_int`        | Check an input value that can be integer type or not (but some value does not use int() to convert it such as 0.0 or 3.0)                                                                         |             |
|                 |        `is_int`         | Check an input value that be integer type or not.                                                                                                                                                 |             |
| base.convert    |       `must_bool`       | Return the boolean value that was converted from string, integer, or boolean value.                                                                                                               |             |
|                 |       `must_list`       | Return the list value that was converted from string or list value.                                                                                                                               |             |
|                 |        `str2any`        | Convert an input string value to the real type of that object. Note that this convert function do not force or try-hard to convert type such as a boolean value should be 'True' or 'False' only. |             |
|                 |       `str2args`        | Convert an input string to `args` and `kwargs` values.                                                                                                                                            |             |
|                 |       `str2bool`        | Convert an input string value to boolean (`True` or `False`).                                                                                                                                     |             |
|                 |       `str2dict`        | Convert an input string value to `dict`.                                                                                                                                                          |             |
|                 |     `str2int_float`     | Convert an input string value to `int` or `float`.                                                                                                                                                |             |
|                 |       `str2list`        | Convert an input string value to `list`.                                                                                                                                                          |             |
| base.hash       |       `checksum`        |                                                                                                                                                                                                   |             |
|                 |        `freeze`         |                                                                                                                                                                                                   | no coverage |
|                 |      `freeze_args`      |                                                                                                                                                                                                   | no coverage |
|                 |      `hash_value`       |                                                                                                                                                                                                   |             |
|                 |       `hash_str`        |                                                                                                                                                                                                   |             |
| base.merge      |      `merge_dict`       |                                                                                                                                                                                                   |             |
|                 |   `merge_dict_value`    |                                                                                                                                                                                                   |             |
|                 | `merge_dict_value_list` | Merge value that be list type of dicts together if it has a same key.                                                                                                                             |             |
|                 |      `merge_list`       | Merge lists together.                                                                                                                                                                             |             |
|                 |      `sum_values`       | Sum all values in an input dict value with start and end index.                                                                                                                                   |             |
|                 |       `zip_equal`       |                                                                                                                                                                                                   |             |
| base.sorting    |        `ordered`        |                                                                                                                                                                                                   |             |
|                 |     `sort_priority`     |                                                                                                                                                                                                   |             |
| base.splitter   |        `isplit`         |                                                                                                                                                                                                   |             |
|                 |      `must_rsplit`      |                                                                                                                                                                                                   |             |
|                 |      `must_split`       |                                                                                                                                                                                                   |             |
| decorator       |       `deepcopy`        | Deep-copy any args and kwargs for func and method.                                                                                                                                                |             |
|                 |         `retry`         | Retry decorator with sequential.                                                                                                                                                                  |             |
|                 |        `profile`        | Profile the current memory and cpu usage while wrapped function running.                                                                                                                          |             |
| dtutils         |     `replace_date`      | Replace datetime matrix that less than an input mode to origin value.                                                                                                                             |             |
|                 |       `next_date`       | Return the next date with specific unit mode.                                                                                                                                                     |             |
|                 |    `closest_quarter`    | Return closest quarter datetime of an input datetime.                                                                                                                                             |             |
|                 |       `last_dom`        | Get the latest day of month that relate with an input datetime value.                                                                                                                             |             |
|                 |       `last_doq`        | Get the latest day of quarter that relate with an input datetime value.                                                                                                                           |             |
|                 |    `next_date_freq`     | Prepare datetime to next datetime with frequency value.                                                                                                                                           |             |
|                 |    `calc_date_freq`     | Prepare datetime to calculate datetime with frequency value.                                                                                                                                      |             |
| threader        |   `ThreadWithControl`   | Threading object that can control maximum background agent and result after complete.                                                                                                             |             |
|                 |     `MonitorThread`     | Monitoring threading object that log the current memory and cpu usage.                                                                                                                            |             |

## :beers: Usages

I will show some examples of function in this package. If you want to use
complex or adjust some parameter, please see doc-string or real source code
(I think it does not complex, and you can see how that function work).

### OnlyOne

```python
from ddeutil.core import onlyone

assert 'a' == onlyone(['a', 'b'], ['a', 'b', 'c'])
assert 'c' == onlyone(('a', 'b'), ['c', 'e', 'f'])
assert onlyone(['a', 'b'], ['c', 'e', 'f'], default=False) is None
```

### Instance Check

```python
from ddeutil.core import isinstance_check
from typing import Union, Optional, NoReturn, Any

assert isinstance_check("s", str)
assert isinstance_check(["s"], list[str])
assert isinstance_check(("s", "t"), tuple[str, ...])
assert not isinstance_check(("s", "t"), tuple[str])
assert isinstance_check({"s": 1, "d": "r"}, dict[str, Union[int, str]])
assert isinstance_check("s", Optional[str])
assert isinstance_check(1, Optional[Union[str, int]])
assert not isinstance_check("s", list[str])
assert isinstance_check([1, "2"], list[Union[str, int]])
assert not isinstance_check("s", NoReturn)
assert isinstance_check(None, NoReturn)
assert isinstance_check("A", Any)
assert isinstance_check([1, [1, 2, 3]], list[Union[list[int], int]])
assert not isinstance_check([1], Union[str, int])
assert isinstance_check((1, "foo", True), tuple[int, str, bool])
```

### String to Any

```python
from ddeutil.core import str2any

assert str2any('22') == 22
assert str2any("1245") == 1245
assert str2any('"string"') == "string"
assert str2any("[1, 2, 3]") == [1, 2, 3]
assert str2any('{"key": "value"}') == {"key": "value"}
assert str2any("1245.123") == 1245.123
assert str2any("True")
assert str2any("[1, 2") == "[1, 2"
assert str2any("1.232.1") == "1.232.1"
```

## :speech_balloon: Contribute

I do not think this project will go around the world because it has specific propose,
and you can create by your coding without this project dependency for long term
solution. So, on this time, you can open [the GitHub issue on this project:raised_hands:](https://github.com/ddeutils/ddeutil/issues)
for fix bug or request new feature if you want it.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ddeutil",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9.13",
    "maintainer_email": null,
    "keywords": "data, utility",
    "author": null,
    "author_email": "korawica <korawich.anu@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/9a/1a/763c6029e7df2101a0fad5d600b36fe710548841736614b357b6f09ac19e/ddeutil-0.4.6.tar.gz",
    "platform": null,
    "description": "# Core Data Utility\n\n[![test](https://github.com/ddeutils/ddeutil/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/ddeutils/ddeutil/actions/workflows/tests.yml)\n[![codecov](https://codecov.io/gh/ddeutils/ddeutil/graph/badge.svg?token=G3XGBSRKA6)](https://codecov.io/gh/ddeutils/ddeutil)\n[![pypi version](https://img.shields.io/pypi/v/ddeutil)](https://pypi.org/project/ddeutil/)\n[![python support version](https://img.shields.io/pypi/pyversions/ddeutil)](https://pypi.org/project/ddeutil/)\n[![size](https://img.shields.io/github/languages/code-size/ddeutils/ddeutil)](https://github.com/ddeutils/ddeutil)\n[![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![type check: mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)\n\nA **core data utility** package, this package implements the data utility \nfunctions and objects.\n\nI was created this package base on sub-package namespace, `ddeutil` (This \nfeature use for independent installation). This package able to extend with \nany sub-extension with this namespace.\nSo, this namespace able to scale-out the requirement with folder level design.\nYou can add any custom features and import it by `import ddeutil.{extension}`.\n\n> [!NOTE]\n> This package provide the base utility functions and objects for any sub-namespace\n> package.\n\n## :round_pushpin: Installation\n\n```shell\npip install -U ddeutil\n```\n\n**Python version supported**:\n\n| Python Version | Installation                        | Support Fixed Bug  |\n|----------------|-------------------------------------|--------------------|\n| `>=3.9,<3.14`  | `pip install -U ddeutil`            | :heavy_check_mark: |\n\n> [!NOTE]\n> If you want to install all optional dependencies for this package, you can use\n> `pip install -U ddeutil[all]`. For optional dependencies that use on this\n> package, it will list on below table;\n> \n> | Optional deps     | Installation                       | Modules                                                 |\n> |-------------------|------------------------------------|---------------------------------------------------------|\n> | `ujson`           | `pip install -U ddeutil[checksum]` | `hash.checksum`                                         |\n> | `python-dateutil` | `pip install -U ddeutil[dateutil]` | `dtutils.next_date_with_freq`, `dtutils.calc_data_freq` | \n> | `psutil`          | `pip install -U ddeutil[memory]`   | `threader.MonitorThread`.                               |\n\n## :dart: Features\n\nThis data package implements all of utility functions and objects that does not\nre-create again when the sub-namespace package want it because it is a basic utility\nbut has a lot of using require.\n\n| Module          |          Name           | Description                                                                                                                                                                                       | Remark      |\n|:----------------|:-----------------------:|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|\n| base            |   `isinstance_check`    | Return True if a data is instance of the respect instance.                                                                                                                                        |             |\n|                 |     `import_string`     | Import a dotted module path and return the attribute/class designated by the last name in the path.                                                                                               | no coverage |\n|                 |         `lazy`          | Lazy use import_string function that wrapped with partial function.                                                                                                                               |             |\n|                 |       `round_up`        | Round up the number with decimals precision size.                                                                                                                                                 |             |\n|                 |      `remove_pad`       | Remove zero padding of zero prefix string.                                                                                                                                                        |             |\n|                 |         `first`         | Returns the first item in the `iterable` that satisfies the `condition`.                                                                                                                          |             |\n|                 |        `onlyone`        | Get only one element from check list that exists in match list.                                                                                                                                   |             |\n|                 |        `hasdot`         | Return True value if dot searching exists in content data.                                                                                                                                        |             |\n|                 |        `getdot`         | Return the value if dot searching exists in content data.                                                                                                                                         |             |\n|                 |        `setdot`         | Set the value if dot searching exists in content data.                                                                                                                                            |             |\n|                 |      `filter_dict`      | Filter dict value with excluded and included collections.                                                                                                                                         |             |\n|                 |      `random_str`       | Random string from uppercase ASCII and number 0-9.                                                                                                                                                | no coverage |\n|                 |       `coalesce`        | Coalesce function that is a just naming define function.                                                                                                                                          | no coverage |\n| base.checker    |        `can_int`        | Check an input value that can be integer type or not (but some value does not use int() to convert it such as 0.0 or 3.0)                                                                         |             |\n|                 |        `is_int`         | Check an input value that be integer type or not.                                                                                                                                                 |             |\n| base.convert    |       `must_bool`       | Return the boolean value that was converted from string, integer, or boolean value.                                                                                                               |             |\n|                 |       `must_list`       | Return the list value that was converted from string or list value.                                                                                                                               |             |\n|                 |        `str2any`        | Convert an input string value to the real type of that object. Note that this convert function do not force or try-hard to convert type such as a boolean value should be 'True' or 'False' only. |             |\n|                 |       `str2args`        | Convert an input string to `args` and `kwargs` values.                                                                                                                                            |             |\n|                 |       `str2bool`        | Convert an input string value to boolean (`True` or `False`).                                                                                                                                     |             |\n|                 |       `str2dict`        | Convert an input string value to `dict`.                                                                                                                                                          |             |\n|                 |     `str2int_float`     | Convert an input string value to `int` or `float`.                                                                                                                                                |             |\n|                 |       `str2list`        | Convert an input string value to `list`.                                                                                                                                                          |             |\n| base.hash       |       `checksum`        |                                                                                                                                                                                                   |             |\n|                 |        `freeze`         |                                                                                                                                                                                                   | no coverage |\n|                 |      `freeze_args`      |                                                                                                                                                                                                   | no coverage |\n|                 |      `hash_value`       |                                                                                                                                                                                                   |             |\n|                 |       `hash_str`        |                                                                                                                                                                                                   |             |\n| base.merge      |      `merge_dict`       |                                                                                                                                                                                                   |             |\n|                 |   `merge_dict_value`    |                                                                                                                                                                                                   |             |\n|                 | `merge_dict_value_list` | Merge value that be list type of dicts together if it has a same key.                                                                                                                             |             |\n|                 |      `merge_list`       | Merge lists together.                                                                                                                                                                             |             |\n|                 |      `sum_values`       | Sum all values in an input dict value with start and end index.                                                                                                                                   |             |\n|                 |       `zip_equal`       |                                                                                                                                                                                                   |             |\n| base.sorting    |        `ordered`        |                                                                                                                                                                                                   |             |\n|                 |     `sort_priority`     |                                                                                                                                                                                                   |             |\n| base.splitter   |        `isplit`         |                                                                                                                                                                                                   |             |\n|                 |      `must_rsplit`      |                                                                                                                                                                                                   |             |\n|                 |      `must_split`       |                                                                                                                                                                                                   |             |\n| decorator       |       `deepcopy`        | Deep-copy any args and kwargs for func and method.                                                                                                                                                |             |\n|                 |         `retry`         | Retry decorator with sequential.                                                                                                                                                                  |             |\n|                 |        `profile`        | Profile the current memory and cpu usage while wrapped function running.                                                                                                                          |             |\n| dtutils         |     `replace_date`      | Replace datetime matrix that less than an input mode to origin value.                                                                                                                             |             |\n|                 |       `next_date`       | Return the next date with specific unit mode.                                                                                                                                                     |             |\n|                 |    `closest_quarter`    | Return closest quarter datetime of an input datetime.                                                                                                                                             |             |\n|                 |       `last_dom`        | Get the latest day of month that relate with an input datetime value.                                                                                                                             |             |\n|                 |       `last_doq`        | Get the latest day of quarter that relate with an input datetime value.                                                                                                                           |             |\n|                 |    `next_date_freq`     | Prepare datetime to next datetime with frequency value.                                                                                                                                           |             |\n|                 |    `calc_date_freq`     | Prepare datetime to calculate datetime with frequency value.                                                                                                                                      |             |\n| threader        |   `ThreadWithControl`   | Threading object that can control maximum background agent and result after complete.                                                                                                             |             |\n|                 |     `MonitorThread`     | Monitoring threading object that log the current memory and cpu usage.                                                                                                                            |             |\n\n## :beers: Usages\n\nI will show some examples of function in this package. If you want to use\ncomplex or adjust some parameter, please see doc-string or real source code\n(I think it does not complex, and you can see how that function work).\n\n### OnlyOne\n\n```python\nfrom ddeutil.core import onlyone\n\nassert 'a' == onlyone(['a', 'b'], ['a', 'b', 'c'])\nassert 'c' == onlyone(('a', 'b'), ['c', 'e', 'f'])\nassert onlyone(['a', 'b'], ['c', 'e', 'f'], default=False) is None\n```\n\n### Instance Check\n\n```python\nfrom ddeutil.core import isinstance_check\nfrom typing import Union, Optional, NoReturn, Any\n\nassert isinstance_check(\"s\", str)\nassert isinstance_check([\"s\"], list[str])\nassert isinstance_check((\"s\", \"t\"), tuple[str, ...])\nassert not isinstance_check((\"s\", \"t\"), tuple[str])\nassert isinstance_check({\"s\": 1, \"d\": \"r\"}, dict[str, Union[int, str]])\nassert isinstance_check(\"s\", Optional[str])\nassert isinstance_check(1, Optional[Union[str, int]])\nassert not isinstance_check(\"s\", list[str])\nassert isinstance_check([1, \"2\"], list[Union[str, int]])\nassert not isinstance_check(\"s\", NoReturn)\nassert isinstance_check(None, NoReturn)\nassert isinstance_check(\"A\", Any)\nassert isinstance_check([1, [1, 2, 3]], list[Union[list[int], int]])\nassert not isinstance_check([1], Union[str, int])\nassert isinstance_check((1, \"foo\", True), tuple[int, str, bool])\n```\n\n### String to Any\n\n```python\nfrom ddeutil.core import str2any\n\nassert str2any('22') == 22\nassert str2any(\"1245\") == 1245\nassert str2any('\"string\"') == \"string\"\nassert str2any(\"[1, 2, 3]\") == [1, 2, 3]\nassert str2any('{\"key\": \"value\"}') == {\"key\": \"value\"}\nassert str2any(\"1245.123\") == 1245.123\nassert str2any(\"True\")\nassert str2any(\"[1, 2\") == \"[1, 2\"\nassert str2any(\"1.232.1\") == \"1.232.1\"\n```\n\n## :speech_balloon: Contribute\n\nI do not think this project will go around the world because it has specific propose,\nand you can create by your coding without this project dependency for long term\nsolution. So, on this time, you can open [the GitHub issue on this project:raised_hands:](https://github.com/ddeutils/ddeutil/issues)\nfor fix bug or request new feature if you want it.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Core data utility functions and objects",
    "version": "0.4.6",
    "project_urls": {
        "Homepage": "https://github.com/ddeutils/ddeutil/",
        "Source Code": "https://github.com/ddeutils/ddeutil/"
    },
    "split_keywords": [
        "data",
        " utility"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0ab5eac15e2f1442759d36637878013a410e09265f6643cbaa43c7cdd6b53b09",
                "md5": "b87ac63d48b1c61a7d7b30ed3ffdff7f",
                "sha256": "62af1271d4d2d479def336ece805e9173336179b3e3020a07f33a0fa68c45786"
            },
            "downloads": -1,
            "filename": "ddeutil-0.4.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b87ac63d48b1c61a7d7b30ed3ffdff7f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9.13",
            "size": 25938,
            "upload_time": "2025-01-18T11:13:33",
            "upload_time_iso_8601": "2025-01-18T11:13:33.899840Z",
            "url": "https://files.pythonhosted.org/packages/0a/b5/eac15e2f1442759d36637878013a410e09265f6643cbaa43c7cdd6b53b09/ddeutil-0.4.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9a1a763c6029e7df2101a0fad5d600b36fe710548841736614b357b6f09ac19e",
                "md5": "294ba36b985d9011b8fd3f083c97a4e3",
                "sha256": "5c5c0e7c1767a89f41a78b7aad22034afe1baa7e9da748c014db9a58a409acaf"
            },
            "downloads": -1,
            "filename": "ddeutil-0.4.6.tar.gz",
            "has_sig": false,
            "md5_digest": "294ba36b985d9011b8fd3f083c97a4e3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9.13",
            "size": 30582,
            "upload_time": "2025-01-18T11:13:36",
            "upload_time_iso_8601": "2025-01-18T11:13:36.241970Z",
            "url": "https://files.pythonhosted.org/packages/9a/1a/763c6029e7df2101a0fad5d600b36fe710548841736614b357b6f09ac19e/ddeutil-0.4.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-01-18 11:13:36",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ddeutils",
    "github_project": "ddeutil",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "ddeutil"
}
        
Elapsed time: 9.37266s