diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 60012654..095b63d0 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -41,7 +41,7 @@ jobs: uses: actions/configure-pages@v2 - name: setup python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3.x @@ -57,7 +57,7 @@ jobs: - name: load environment cache id: cached-poetry-dependencies - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: .venv key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ebff59a6..ec9ed12f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: "0" - name: setup python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3.x @@ -47,7 +47,7 @@ jobs: - name: load environment cache id: cached-poetry-dependencies - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: .venv key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json index 96869dfd..086a8e4e 100644 --- a/.obsidian/core-plugins.json +++ b/.obsidian/core-plugins.json @@ -4,6 +4,7 @@ "switcher", "graph", "backlink", + "canvas", "outgoing-link", "tag-pane", "page-preview", diff --git a/Taskfile.yml b/Taskfile.yml index be82a350..1a2a0101 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -5,7 +5,7 @@ version: '3' vars: PUBLIC_BRANCH: published - CURRENT_VERSION: 22.2 + CURRENT_VERSION: 23.1 MATERIAL_TAG: 9.1.4 MATERIAL_INSIDER_TAG: 9.1.4-insiders-4.32.4 diff --git a/docs/assets/extra.js b/docs/assets/extra.js new file mode 100644 index 00000000..20726088 --- /dev/null +++ b/docs/assets/extra.js @@ -0,0 +1,23 @@ +/* site specific tweaks */ + +// hide header and footer for urls that include 'with-your-sandbox' +var header = document.querySelector("header"); +var footer = document.querySelector("footer"); +let previousUrl = ""; + +const observer = new MutationObserver(() => { + if (location.href !== previousUrl) { + previousUrl = location.href; + if (location.href?.includes("with-your-sandbox")) { + header.style.display = "none"; + footer.style.display = "none"; + } else { + header.style.display = "block"; + footer.style.display = "block"; + } + } +}); + +const config = { subtree: true, childList: true }; +observer.observe(document, config); + diff --git a/docs/automate/cmemc-command-line-interface/command-reference/admin/client/index.md b/docs/automate/cmemc-command-line-interface/command-reference/admin/client/index.md new file mode 100644 index 00000000..eb66189e --- /dev/null +++ b/docs/automate/cmemc-command-line-interface/command-reference/admin/client/index.md @@ -0,0 +1,87 @@ +--- +title: "cmemc: Command Group - admin client" +description: "List client accounts, get or generate client account secrets." +icon: material/account-cog +tags: + - Keycloak + - Security + - cmemc +--- +# admin client Command Group + + +List client accounts, get or generate client account secrets. + +This command group is an opinionated interface to the Keycloak realm of your Corporate Memory instance. In order to be able to use the commands in this group, the configured cmemc connection account needs to be equipped with the `manage-clients` role in the used realm. + +Client accounts are identified by a client ID which is unique in the scope of the used realm. + +In case your Corporate Memory deployment does not use the default deployment layout, the following additional config variables can be used in your connection configuration: ``KEYCLOAK_BASE_URI`` defaults to `{`CMEM_BASE_URI`}/auth` and locates your Keycloak deployment; ``KEYCLOAK_REALM_ID`` defaults to `cmem` and identifies the used realm. + + +## admin client list + +List client accounts. + +```shell-session title="Usage" +$ cmemc admin client list [OPTIONS] +``` + + + + +Outputs a list of client accounts, which can be used to get an overview as well as a reference for the other commands of the `admin client` command group. + +!!! note + The list command only outputs clients which have a client secret. Use the `--raw` option to get a JSON description of all clients. + + + + +??? info "Options" + ```text + + --raw Outputs raw JSON. + --id-only Lists only Client ID. This is useful for piping the IDs into + other commands. + ``` + +## admin client secret + +Get or generate a new secret for a client account. + +```shell-session title="Usage" +$ cmemc admin client secret [OPTIONS] CLIENT_ID +``` + + + + +This command retrieves or generates a new secret for a client account from a realm. + + + +??? info "Options" + ```text + + --generate Generate a new secret + --output Display client secret + ``` + +## admin client open + +Open clients in the browser. + +```shell-session title="Usage" +$ cmemc admin client open [CLIENT_IDS]... +``` + + + + +With this command, you can open a client in the keycloak web interface in your browser. + +The command accepts multiple client IDs which results in opening multiple browser tabs. + + + diff --git a/docs/automate/cmemc-command-line-interface/command-reference/admin/index.md b/docs/automate/cmemc-command-line-interface/command-reference/admin/index.md index b565b623..ea75c3e1 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/admin/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/admin/index.md @@ -24,9 +24,9 @@ $ cmemc admin status [OPTIONS] -This command outputs version and health information of the selected deployment. If the version information can not be retrieved, UNKNOWN shown. +This command outputs version and health information of the selected deployment. If the version information cannot be retrieved, UNKNOWN is shown. -In addition to that, this command warns you if the target version of your cmemc client is newer than the version of your backend and if the ShapeCatalog has a different version then your DataPlatform component. +Additionally, this command warns you if the target version of your cmemc client is newer than the version of your backend and if the ShapeCatalog has a different version than your DataPlatform component. To get status information of all configured deployments use this command in combination with parallel. @@ -40,20 +40,28 @@ $ cmemc config list | parallel --ctag cmemc -c {} admin status ??? info "Options" ```text - --key TEXT Get only specific key(s) from the status / info output. - There are two special keys available: 'all' will list all - available keys in the table, 'overall.healthy' with result - in UP in case all health flags are UP as well (otherwise - DOWN). + --key TEXT Get only specific key(s) from the status / + info output. There are two special keys + available: 'all' will list all available keys + in the table, 'overall.healthy' with result + in UP in case all health flags are UP as + well (otherwise DOWN). - --enforce-table A single value with --key will be returned as plain text - instead of a table with one row and the header. This - default behaviour allows for more easy integration with - scripts. This flag enforces the use of tabular output, even - for single row tables. + --exit-1 [never|error|always] Specify, when this command returns with exit + code 1. Available options are 'never' (exit 0 + on errors and warnings), 'error' (exit 1 on + errors, exit 0 on warnings), 'always' (exit 1 + on errors and warnings). [default: never] - --raw Outputs combined raw JSON output of the health/info - endpoints. + --enforce-table A single value with --key will be returned as + plain text instead of a table with one row + and the header. This default behaviour allows + for more easy integration with scripts. This + flag enforces the use of tabular output, even + for single row tables. + + --raw Outputs combined raw JSON output of the + health/info endpoints. ``` ## admin token @@ -74,7 +82,7 @@ $ curl -H "Authorization: Bearer $(cmemc -c my admin token)" $(cmemc -c my confi ``` -Please be aware that this command can reveal secrets, which you do not want to have in log files or on the screen. +Please be aware that this command can reveal secrets which you might not want to be present in log files or on the screen. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/admin/metrics/index.md b/docs/automate/cmemc-command-line-interface/command-reference/admin/metrics/index.md index 00e7f8c4..32b76ca1 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/admin/metrics/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/admin/metrics/index.md @@ -10,7 +10,7 @@ tags: List and get metrics. -This command group consists of commands for reading and listing internal monitoring metrics of eccenca Corporate Memory. A deployment consists of multiple jobs (e.g. DP, DI), which provide multiple metric families on an endpoint. +This command group consists of commands for reading and listing internal monitoring metrics of eccenca Corporate Memory. A deployment consists of multiple jobs (e.g. DP, DI), which provide multiple metric families for an endpoint. Each metric family can consist of different samples identified by labels with a name and a value (dimensions). A metric has a specific type (counter, gauge, summary and histogram) and additional metadata. @@ -67,7 +67,7 @@ $ cmemc admin metrics inspect [OPTIONS] METRIC_ID -This command outputs the data of a metric. The first table includes basic meta data about the metric. The second table includes sample labels and values. +This command outputs the data of a metric. The first table includes basic metadata about the metric. The second table includes sample labels and values. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/admin/store/index.md b/docs/automate/cmemc-command-line-interface/command-reference/admin/store/index.md index 202bcbef..5290f304 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/admin/store/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/admin/store/index.md @@ -25,10 +25,10 @@ $ cmemc admin store showcase [OPTIONS] -This command creates a showcase scenario of multiple graphs including integration graphs, shapes, statement annotations etc. +This command creates a showcase scenario of multiple graphs including integration graphs, shapes, statement annotations, etc. !!! note - There is currently no deletion mechanism for the showcase data, so you need to remove the showcase graphs manually (or just remove all graphs). + There is currently no deletion mechanism for the showcase data and you need to remove the showcase graphs manually (or just remove all graphs). @@ -57,10 +57,10 @@ $ cmemc admin store bootstrap [OPTIONS] -This command imports the bootstrap data needed for managing shapes, access conditions, the query catalog and the vocabulary catalog. +This command imports the bootstrap data needed for managing shapes and configuration objects. !!! note - There is currently no deletion mechanism for the bootstrap data, so you need to remove the graphs manually (or just remove all graphs). + The command will first remove all existing bootstrap data (identified with the isSystemResource flag) and will then import the new data to the corresponding graphs (shape catalog, vocabulary catalog, configuration graph). @@ -83,7 +83,7 @@ $ cmemc admin store export [OPTIONS] BACKUP_FILE -The backup file is a ZIP archive containing all knowledge graphs as Turtle files + configuration file for each graph. +The backup file is a ZIP archive containing all knowledge graphs (one Turtle file + configuration file per graph). This command will create lots of load on the server. It can take a long time to complete. @@ -107,11 +107,11 @@ $ cmemc admin store import BACKUP_FILE -The backup file is a ZIP archive containing all knowledge graphs as Turtle files + configuration file for each graph. +The backup file is a ZIP archive containing all knowledge graphs (one Turtle file + configuration file per graph). -The command will load a single backup ZIP archive into the triple store, by replacing all graphs with the content of the Turtle files in the archive and deleting all graphs which are not in the archive. +The command will load a single backup ZIP archive into the triple store by replacing all graphs with the content of the Turtle files in the archive and deleting all graphs which are not in the archive. -This command will create lots of load on the server. It can take a long time to complete. The backup file will be transferred to the server, then unzipped and imported graph by graph. After the initial transfer, the network connection is not used anymore, so it will be closed by proxies sometimes. This does not mean that the import failed. +This command will create lots of load on the server. It can take a long time to complete. The backup file will be transferred to the server, then unzipped and imported graph by graph. After the initial transfer the network connection is not used anymore and may be closed by proxies. This does not mean that the import failed. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/admin/user/index.md b/docs/automate/cmemc-command-line-interface/command-reference/admin/user/index.md new file mode 100644 index 00000000..d89c92a0 --- /dev/null +++ b/docs/automate/cmemc-command-line-interface/command-reference/admin/user/index.md @@ -0,0 +1,162 @@ +--- +title: "cmemc: Command Group - admin user" +description: "List, create, delete and modify user accounts." +icon: material/account-cog +tags: + - Keycloak + - Security + - cmemc +--- +# admin user Command Group + + +List, create, delete and modify user accounts. + +This command group is an opinionated interface to the Keycloak realm of your Corporate Memory instance. In order to be able to manage user data, the configured cmemc connection account needs to be equipped with the `manage-users` role in the used realm. + +User accounts are identified by a username which unique in the scope of the used realm. + +In case your Corporate Memory deployment does not use the default deployment layout, the following additional config variables can be used in your connection configuration: ``KEYCLOAK_BASE_URI`` defaults to `/auth` on ``CMEM_BASE_URI`` and locates your Keycloak deployment; ``KEYCLOAK_REALM_ID`` defaults to `cmem` and identifies the used realm. + + +## admin user list + +List user accounts. + +```shell-session title="Usage" +$ cmemc admin user list [OPTIONS] +``` + + + + +Outputs a list of user accounts, which can be used to get an overview as well as a reference for the other commands of the `admin user` command group. + + + +??? info "Options" + ```text + + --raw Outputs raw JSON. + --id-only Lists only username. This is useful for piping the IDs into + other commands. + ``` + +## admin user create + +Create a user account. + +```shell-session title="Usage" +$ cmemc admin user create USERNAME +``` + + + + +This command creates a new user account. + +!!! note + The created user account has no metadata such as personal data or group assignments. In order to add these details to a user account, use the `admin user update` command. + + + + +## admin user update + +Update a user account. + +```shell-session title="Usage" +$ cmemc admin user update [OPTIONS] USERNAME +``` + + + + +This command updates metadata and group assignments of a user account. + +For each data value, a separate option needs to be used. All options can be combined in a single execution. + +!!! note + In order to assign a group to a user account, the group need to be added or imported to the realm upfront. + + + + +??? info "Options" + ```text + + --first-name TEXT Set a new first name. + --last-name TEXT Set a new last name. + --email TEXT Set a new email. + --assign-group TEXT Assign a group. + --unassign-group TEXT Unassign a group. + ``` + +## admin user delete + +Delete a user account. + +```shell-session title="Usage" +$ cmemc admin user delete USERNAME +``` + + + + +This command deletes a user account from a realm. + +!!! note + The deletion of a user account does not delete the assigned groups of this account, only the assignments to these groups. + + + + +## admin user password + +Change the password of a user account. + +```shell-session title="Usage" +$ cmemc admin user password [OPTIONS] USERNAME +``` + + + + +With this command, the password of a user account can be changed. The default execution mode of this command is an interactive prompt which asks for the password (twice). In order automate password changes, you can use the ``--value`` option. + +!!! warning + Providing passwords on the command line can be dangerous (e.g. due to a potential exploitation in the shell history). A suggested more save way for automation is to provide the password in a variable first (e.g. with `NEW_PASS=$(pwgen -1 40)`) and use it afterwards in the cmemc call: `cmemc admin user password max --value ${NEW_PASS}`. + + + + +??? info "Options" + ```text + + --value TEXT With this option, the new password can be set in a non- + interactive way. + + --temporary If enabled, the user must change the password on next + login. + + --request-change If enabled, will send a email to user to reset the + password. + ``` + +## admin user open + +Open user in the browser. + +```shell-session title="Usage" +$ cmemc admin user open [USERNAMES]... +``` + + + + +With this command, you can open a user in the keycloak console in your browser to change them. + +The command accepts multiple usernames which results in opening multiple browser tabs. + + + diff --git a/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/index.md b/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/index.md index c9490fc0..5f3e8047 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/index.md @@ -22,7 +22,7 @@ $ cmemc admin workspace export [OPTIONS] [FILE] -Depending on the requested type, this ZIP contains either a turtle file for each project (type rdfTurtle) or a substructure of resource files and XML descriptions (type xmlZip). +Depending on the requested export type, this ZIP file contains either one Turtle file per project (type `rdfTurtle`) or a substructure of resource files and XML descriptions (type `xmlZip`). The file name is optional and will be generated with by the template if absent. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/python/index.md b/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/python/index.md index ff0ac72c..942f8653 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/python/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/admin/workspace/python/index.md @@ -29,9 +29,9 @@ $ cmemc admin workspace python install PACKAGE -This command is basically a `pip install` in the remote python environment. +This command is essentially a `pip install` in the remote python environment. -You can install a package by uploading a source distribution .tar.gz file, or by uploading a build distribution .whl file, or by specifying a package name, more precisely, a pip requirement specifier with a package name available on pypi.org (e.g. `requests==2.27.1`). +You can install a package by uploading a source distribution .tar.gz file, by uploading a build distribution .whl file, or by specifying a package name, i.e., a pip requirement specifier with a package name available on pypi.org (e.g. `requests==2.27.1`). @@ -46,7 +46,7 @@ $ cmemc admin workspace python uninstall PACKAGE_NAME -This command is basically a `pip uninstall` in the remote python environment. +This command is essentially a `pip uninstall` in the remote python environment. @@ -61,7 +61,7 @@ $ cmemc admin workspace python list [OPTIONS] -This command is basically a `pip list` in the remote python environment. +This command is essentially a `pip list` in the remote python environment. It outputs a table of python package identifiers with version information. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/config/index.md b/docs/automate/cmemc-command-line-interface/command-reference/config/index.md index d00824ab..f95305cb 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/config/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/config/index.md @@ -3,6 +3,7 @@ title: "cmemc: Command Group - config" description: "List and edit configs as well as get config values." icon: material/cog-outline tags: + - Configuration - cmemc --- # config Command Group @@ -104,9 +105,9 @@ Get the value of a known cmemc configuration key. ```shell-session title="Usage" $ cmemc config get [CMEM_BASE_URI|SSL_VERIFY|REQUESTS_CA_BUNDLE|DP_API_END - POINT|DI_API_ENDPOINT|OAUTH_TOKEN_URI|OAUTH_GRANT_TYPE|OAUTH_USER - |OAUTH_PASSWORD|OAUTH_CLIENT_ID|OAUTH_CLIENT_SECRET|OAUTH_ACCESS_ - TOKEN] + POINT|DI_API_ENDPOINT|KEYCLOAK_BASE_URI|KEYCLOAK_REALM_ID|OAUTH_T + OKEN_URI|OAUTH_GRANT_TYPE|OAUTH_USER|OAUTH_PASSWORD|OAUTH_CLIENT_ + ID|OAUTH_CLIENT_SECRET|OAUTH_ACCESS_TOKEN] ``` @@ -134,7 +135,7 @@ $ cmemc config eval [OPTIONS] -The output of this command is suitable to be used by a shells `eval` command. It will output the complete configuration as `export key="value"` statements. This allows for preparation of a shell environment. +The output of this command is suitable to be used by a shell's `eval` command. It will output the complete configuration as `export key="value"` statements, which allow for the preparation of a shell environment. ```shell-session title="Example" $ eval $(cmemc -c my config eval) @@ -150,7 +151,7 @@ $ eval $(cmemc -c my config eval) ??? info "Options" ```text - --unset Instead of export all configuration keys, this option will unset - all key. + --unset Instead of exporting all configuration keys, this option will + unset all keys. ``` diff --git a/docs/automate/cmemc-command-line-interface/command-reference/dataset/index.md b/docs/automate/cmemc-command-line-interface/command-reference/dataset/index.md index eed74aee..f4845b48 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/dataset/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/dataset/index.md @@ -10,9 +10,9 @@ tags: List, create, delete, inspect, up-/download or open datasets. -This command group allows for managing workspace datasets as well as dataset file resources. Datasets can be created and deleted. File resources can be uploaded and downloaded. Details of dataset parameter can be listed with inspect. +This command group allows for managing workspace datasets as well as dataset file resources. Datasets can be created and deleted. File resources can be uploaded and downloaded. Details of dataset parameters can be listed with inspect. -Datasets are identified with a combined key of the `PROJECT_ID` and a `DATASET_ID` (e.g: `my-project:my-dataset`). +Datasets are identified by a combined key of the `PROJECT_ID` and a `DATASET_ID` (e.g: `my-project:my-dataset`). !!! note To get a list of existing datasets, execute the `dataset list` command or use tab-completion. @@ -30,24 +30,24 @@ $ cmemc dataset list [OPTIONS] -Outputs a list of datasets IDs which can be used as reference for the dataset create and delete commands. +Output and filter a list of available datasets. Each dataset is listed with its ID, type and label. ??? info "Options" ```text - --filter ... List datasets based on meta data. First parameter - --filter CHOICE can be one of ['project', 'regex', - 'tag', 'type']. The second parameter is based on - CHOICE. + --filter ... Filter datasets based on metadata. First parameter + can be one of the following values: project, regex, + tag, type. The options for the second parameter + depend on the first parameter. - --raw Outputs raw JSON objects of dataset search API + --raw Outputs raw JSON objects of the dataset search API response. - --id-only Lists only dataset identifier and no labels or - other meta data. This is useful for piping the ids - into other cmemc commands. + --id-only Lists only dataset IDs and no labels or other + metadata. This is useful for piping the IDs into + other cmemc commands. ``` ## dataset delete @@ -84,7 +84,7 @@ This command deletes existing datasets in integration projects from Corporate Me project. The behaviour is similar to the 'dataset list --project' command. - --filter ... Delete datasets based on meta data. First parameter + --filter ... Delete datasets based on metadata. First parameter --filter CHOICE can be one of ['project', 'regex', 'tag', 'type']. The second parameter is based on CHOICE. @@ -115,7 +115,7 @@ Without providing an output path, the output file name will be the same as the r ```text --replace Replace existing files. This is a dangerous option, so use it - with care. + with care! ``` ## dataset upload @@ -129,10 +129,10 @@ $ cmemc dataset upload DATASET_ID INPUT_PATH -This command uploads a file to a dataset. The content of the uploaded file replaces the remote file resource. The name of the remote file resource is not changed. +This command uploads a file to a dataset. The content of the uploaded file replaces the remote file resource. The name of the remote file resource will not be changed. !!! warning - If the remote file resource is used in more than one dataset, the other datasets are also affected by this command. + If the remote file resource is used in more than one dataset, all of these datasets are affected by this command. !!! warning @@ -184,9 +184,9 @@ $ cmemc dataset create [OPTIONS] [DATASET_FILE] -Datasets are created in projects and can have associated file resources. Each dataset has a type (such as `csv`) and a list of parameter which can change or specify the dataset behaviour. +Datasets are created in projects and can have associated file resources. Each dataset has a type (such as `csv`) and a list of parameters which can alter or specify the dataset behaviour. -To get more information on possible dataset types and parameter on these types, use the `--help-types` and `--help-parameter` options. +To get more information about available dataset types and associated parameters, use the `--help-types` and `--help-parameter` options. ```shell-session title="Example" $ cmemc dataset create --project my-project --type csv my-file.csv diff --git a/docs/automate/cmemc-command-line-interface/command-reference/dataset/resource/index.md b/docs/automate/cmemc-command-line-interface/command-reference/dataset/resource/index.md index a54cfa3e..281a3769 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/dataset/resource/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/dataset/resource/index.md @@ -10,7 +10,7 @@ tags: List, inspect or delete dataset file resources. -File resources are identified by its name and project ID. +File resources are identified by their paths and project IDs. ## dataset resource list @@ -32,11 +32,11 @@ Outputs a table or a list of dataset resources (files). ```text --raw Outputs raw JSON. - --id-only Lists only resource names and no other meta data. + --id-only Lists only resource names and no other metadata. This is useful for piping the IDs into other commands. - --filter ... Filter file resources based on a meta data. First + --filter ... Filter file resources based on metadata. First parameter CHOICE can be one of ['project', 'regex']. The second parameter is based on CHOICE, e.g. a project ID or a regular expression string. @@ -53,7 +53,7 @@ $ cmemc dataset resource delete [OPTIONS] [RESOURCE_IDS]... -You have three selection mechanisms: with specific IDs, you will delete only these resources; by using `--filter` your will delete resources based on the filter type and value; by using `--all` will delete all resources. +There are three selection mechanisms: with specific IDs, only those specified resources will be deleted; by using `--filter`, resources based on the filter type and value will be deleted; using `--all` will delete all resources. @@ -64,7 +64,7 @@ You have three selection mechanisms: with specific IDs, you will delete only the -a, --all Delete all resources. This is a dangerous option, so use it with care. - --filter ... Filter file resources based on a meta data. First + --filter ... Filter file resources based on metadata. First parameter CHOICE can be one of ['project', 'regex']. The second parameter is based on CHOICE, e.g. a project ID or a regular expression string. @@ -72,7 +72,7 @@ You have three selection mechanisms: with specific IDs, you will delete only the ## dataset resource inspect -Display all meta data of a file resource. +Display all metadata of a file resource. ```shell-session title="Usage" $ cmemc dataset resource inspect [OPTIONS] RESOURCE_ID diff --git a/docs/automate/cmemc-command-line-interface/command-reference/graph/index.md b/docs/automate/cmemc-command-line-interface/command-reference/graph/index.md index 5b90518f..a3471411 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/graph/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/graph/index.md @@ -29,7 +29,7 @@ $ cmemc graph count [OPTIONS] [IRIS]... -This command lists graphs with their triple count. Counts are done without following imported graphs. +This command lists graphs with their triple count. Counts do not inlude imported graphs. @@ -62,10 +62,10 @@ Imported graphs which do not exist are shown as `[missing: IRI]`. Imported graph -a, --all Show tree of all (readable) graphs. --raw Outputs raw JSON of the graph importTree API response. - --id-only Lists only graph identifier (IRIs) and no labels or other meta - data. This is useful for piping the IRIs into other commands. - The output with this option is a sorted, flat, de-duplicated - list of existing graphs. + --id-only Lists only graph identifier (IRIs) and no labels or other + metadata. This is useful for piping the IRIs into other + commands. The output with this option is a sorted, flat, de- + duplicated list of existing graphs. ``` ## graph list @@ -85,7 +85,7 @@ $ cmemc graph list [OPTIONS] --raw Outputs raw JSON of the graphs list API response. --id-only Lists only graph identifier (IRIs) and no labels - or other meta data. This is useful for piping the + or other metadata. This is useful for piping the IRIs into other commands. --filter ... Filter graphs based on effective access @@ -172,7 +172,7 @@ $ cmemc graph import [OPTIONS] INPUT_PATH [IRI] -If input is a directory, it scans for file-pairs such as `xxx.ttl` and `xxx.ttl.graph` where `xxx.ttl` is the actual triples file and `xxx.ttl.graph` contains the graph IRI as one string: `https://mygraph.de/xxx/`. +If input is a directory, it scans for file-pairs such as `xyz.ttl` and `xyz.ttl.graph` where `xyz.ttl` is the actual triples file and `xyz.ttl.graph` contains the graph IRI as one string: `https://mygraph.de/xyz/`. If input is a file, content will be uploaded to IRI. If `--replace` is set, the data will be overwritten, if not, it will be added. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/index.md b/docs/automate/cmemc-command-line-interface/command-reference/index.md index d107e74c..64db829f 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/index.md @@ -20,6 +20,9 @@ tags: | ------------: | :------ | :---------- | | [admin](admin/index.md) | [status](admin/index.md#admin-status) | Output health and version information. | | [admin](admin/index.md) | [token](admin/index.md#admin-token) | Fetch and output an access token. | +| [admin client](admin/client/index.md) | [list](admin/client/index.md#admin-client-list) | List client accounts. | +| [admin client](admin/client/index.md) | [secret](admin/client/index.md#admin-client-secret) | Get or generate a new secret for a client account. | +| [admin client](admin/client/index.md) | [open](admin/client/index.md#admin-client-open) | Open clients in the browser. | | [admin metrics](admin/metrics/index.md) | [get](admin/metrics/index.md#admin-metrics-get) | Get sample data of a metric. | | [admin metrics](admin/metrics/index.md) | [inspect](admin/metrics/index.md#admin-metrics-inspect) | Inspect a metric. | | [admin metrics](admin/metrics/index.md) | [list](admin/metrics/index.md#admin-metrics-list) | List metrics for a specific job. | @@ -27,6 +30,12 @@ tags: | [admin store](admin/store/index.md) | [bootstrap](admin/store/index.md#admin-store-bootstrap) | Update/Import bootstrap data. | | [admin store](admin/store/index.md) | [export](admin/store/index.md#admin-store-export) | Backup all knowledge graphs to a ZIP archive. | | [admin store](admin/store/index.md) | [import](admin/store/index.md#admin-store-import) | Restore graphs from a ZIP archive. | +| [admin user](admin/user/index.md) | [list](admin/user/index.md#admin-user-list) | List user accounts. | +| [admin user](admin/user/index.md) | [create](admin/user/index.md#admin-user-create) | Create a user account. | +| [admin user](admin/user/index.md) | [update](admin/user/index.md#admin-user-update) | Update a user account. | +| [admin user](admin/user/index.md) | [delete](admin/user/index.md#admin-user-delete) | Delete a user account. | +| [admin user](admin/user/index.md) | [password](admin/user/index.md#admin-user-password) | Change the password of a user account. | +| [admin user](admin/user/index.md) | [open](admin/user/index.md#admin-user-open) | Open user in the browser. | | [admin workspace](admin/workspace/index.md) | [export](admin/workspace/index.md#admin-workspace-export) | Export the complete workspace (all projects) to a ZIP file. | | [admin workspace](admin/workspace/index.md) | [import](admin/workspace/index.md#admin-workspace-import) | Import the workspace from a file. | | [admin workspace](admin/workspace/index.md) | [reload](admin/workspace/index.md#admin-workspace-reload) | Reload the workspace from the backend. | @@ -47,7 +56,7 @@ tags: | [dataset](dataset/index.md) | [open](dataset/index.md#dataset-open) | Open datasets in the browser. | | [dataset resource](dataset/resource/index.md) | [list](dataset/resource/index.md#dataset-resource-list) | List available file resources. | | [dataset resource](dataset/resource/index.md) | [delete](dataset/resource/index.md#dataset-resource-delete) | Delete file resources. | -| [dataset resource](dataset/resource/index.md) | [inspect](dataset/resource/index.md#dataset-resource-inspect) | Display all meta data of a file resource. | +| [dataset resource](dataset/resource/index.md) | [inspect](dataset/resource/index.md#dataset-resource-inspect) | Display all metadata of a file resource. | | [dataset resource](dataset/resource/index.md) | [usage](dataset/resource/index.md#dataset-resource-usage) | Display all usage data of a file resource. | | [graph](graph/index.md) | [count](graph/index.md#graph-count) | Count triples in graph(s). | | [graph](graph/index.md) | [tree](graph/index.md#graph-tree) | Show graph tree(s) of the owl:imports hierarchy. | @@ -83,7 +92,7 @@ tags: | [workflow](workflow/index.md) | [open](workflow/index.md#workflow-open) | Open a workflow in your browser. | | [workflow scheduler](workflow/scheduler/index.md) | [open](workflow/scheduler/index.md#workflow-scheduler-open) | Open scheduler(s) in the browser. | | [workflow scheduler](workflow/scheduler/index.md) | [list](workflow/scheduler/index.md#workflow-scheduler-list) | List available scheduler. | -| [workflow scheduler](workflow/scheduler/index.md) | [inspect](workflow/scheduler/index.md#workflow-scheduler-inspect) | Display all meta data of a scheduler. | +| [workflow scheduler](workflow/scheduler/index.md) | [inspect](workflow/scheduler/index.md#workflow-scheduler-inspect) | Display all metadata of a scheduler. | | [workflow scheduler](workflow/scheduler/index.md) | [disable](workflow/scheduler/index.md#workflow-scheduler-disable) | Disable scheduler(s). | | [workflow scheduler](workflow/scheduler/index.md) | [enable](workflow/scheduler/index.md#workflow-scheduler-enable) | Enable scheduler(s). | diff --git a/docs/automate/cmemc-command-line-interface/command-reference/project/index.md b/docs/automate/cmemc-command-line-interface/command-reference/project/index.md index ec50cae2..6acafda6 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/project/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/project/index.md @@ -31,7 +31,7 @@ $ cmemc project open PROJECT_IDS... With this command, you can open a project in the workspace in your browser to change them. -The command accepts multiple projects IDs which results in opening multiple browser tabs. +The command accepts multiple project IDs which results in opening multiple browser tabs. @@ -54,7 +54,7 @@ Outputs a list of project IDs which can be used as reference for the project cre ```text --raw Outputs raw JSON. - --id-only Lists only project identifier and no labels or other meta data. + --id-only Lists only project identifier and no labels or other metadata. This is useful for piping the IDs into other commands. ``` @@ -69,7 +69,7 @@ $ cmemc project export [OPTIONS] [PROJECT_IDS]... -Projects can be exported with different export formats. The default type is a zip archive which includes metadata as well as dataset resources. If more than one project is exported, a file is created for each project. By default, these files are created in the current directory and with a descriptive name (see `--template` option default). +Projects can be exported with different export formats. The default type is a zip archive which includes metadata as well as dataset resources. If more than one project is exported, a file is created for each project. By default, these files are created in the current directory with a descriptive name (see `--template` option default). !!! note Projects can be listed by using the `project list` command. @@ -155,14 +155,14 @@ $ cmemc project delete [OPTIONS] [PROJECT_IDS]... -This deletes existing data integration projects from Corporate Memory. +This command deletes existing data integration projects from Corporate Memory. !!! warning Projects will be deleted without prompting! !!! note - Projects can be listed by using the `project list` command. + Projects can be listed with the `project list` command. @@ -179,13 +179,13 @@ This deletes existing data integration projects from Corporate Memory. Create projects. ```shell-session title="Usage" -$ cmemc project create PROJECT_IDS... +$ cmemc project create [OPTIONS] PROJECT_IDS... ``` -This creates one or more new projects. Existing projects will not be overwritten. +This command creates one or more new projects. Existing projects will not be overwritten. !!! note Projects can be listed by using the `project list` command. @@ -193,6 +193,16 @@ This creates one or more new projects. Existing projects will not be overwritten +??? info "Options" + ```text + + --from-transformation TEXT This option can be used to explicitly create the + link specification, which is internally executed + when using the mapping suggestion of a + transformation task. You need the task ID of the + transformation task. + ``` + ## project reload Reload projects from the workspace provider. @@ -204,7 +214,7 @@ $ cmemc project reload [OPTIONS] [PROJECT_IDS]... -This command reloads all tasks of a project from the workspace provider. This is the same as the `workspace reload` command, but for a single project only. +This command reloads all tasks of a project from the workspace provider. This is similar to the `workspace reload` command, but for a single project only. !!! note You need this in case you changed project data externally or loaded a project which uses plugins which are not installed yet. In this case, install the plugin(s) and reload the project afterwards. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/query/index.md b/docs/automate/cmemc-command-line-interface/command-reference/query/index.md index ba214e8c..78cbecf0 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/query/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/query/index.md @@ -106,7 +106,7 @@ Outputs a list of query URIs which can be used as reference for the query execut ??? info "Options" ```text - --id-only Lists only query identifier and no labels or other meta data. + --id-only Lists only query identifier and no labels or other metadata. This is useful for piping the ids into other cmemc commands. ``` @@ -148,7 +148,7 @@ You can filter queries based on status and runtime in order to investigate slow ```text --id-only Lists only query identifier and no labels or other - meta data. This is useful for piping the ids into + metadata. This is useful for piping the ids into other cmemc commands. --raw Outputs raw JSON response of the query status API. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/cache/index.md b/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/cache/index.md index 41f3321e..93539e3c 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/cache/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/cache/index.md @@ -46,7 +46,7 @@ $ cmemc vocabulary cache list [OPTIONS] ```text --id-only Lists only vocabulary term identifier (IRIs) and no labels or - other meta data. This is useful for piping the ids into other + other metadata. This is useful for piping the ids into other cmemc commands. --raw Outputs raw JSON. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/index.md b/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/index.md index f295eb1a..805daa30 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/vocabulary/index.md @@ -46,7 +46,7 @@ Vocabularies are graphs (see `graph` command group) which consists of class and ```text --id-only Lists only vocabulary identifier (IRIs) and - no labels or other meta data. This is useful + no labels or other metadata. This is useful for piping the ids into other cmemc commands. diff --git a/docs/automate/cmemc-command-line-interface/command-reference/workflow/index.md b/docs/automate/cmemc-command-line-interface/command-reference/workflow/index.md index 6d3aee74..fafa5d28 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/workflow/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/workflow/index.md @@ -65,32 +65,30 @@ With this command, you can execute a workflow that uses variable datasets as inp ??? info "Options" ```text - -i, --input FILE From which file the input is taken: note - that the maximum file size to upload is - limited to a server configured value. If the + -i, --input FILE From which file the input is taken. If the workflow has no defined variable input - dataset, this can be ignored. + dataset, this option is not allowed. - -o, --output FILE To which file the result is written to: use + -o, --output FILE To which file the result is written to. Use '-' in order to output the result to stdout. If the workflow has no defined variable - output dataset, this can be ignored. Please - note that the io command will not warn you - on overwriting existing output files. + output dataset, this option is not allowed. + Please note that the io command will not + warn you on overwriting existing output + files. - --input-mimetype [guess|application/xml|application/json|text/csv] + --input-mimetype [application/x-plugin-csv|application/x-plugin-json|application/xml|application/x-plugin-excel|application/octet-stream|application/x-plugin-multiCsv|text/plain|guess] Which input format should be processed: If not given, cmemc will try to guess the mime type based on the file extension or will - fail + fail. - --output-mimetype [guess|application/xml|application/json|application/n-triples|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|text/csv] + --output-mimetype [application/x-plugin-csv|application/x-plugin-excel|application/n-triples|application/n-triples|application/x-plugin-json|application/xml|guess] Which output format should be requested: If not given, cmemc will try to guess the mime type based on the file extension or will fail. In case of an output to stdout, a - default mime type will be used (currently - xml). + default mime type will be used (JSON). --autoconfig / --no-autoconfig Setup auto configuration of input datasets, e.g. in order to process CSV files with @@ -113,13 +111,13 @@ $ cmemc workflow list [OPTIONS] ??? info "Options" ```text - --filter ... List workflows based on meta data. First parameter + --filter ... List workflows based on metadata. First parameter --filter CHOICE can be one of ['io', 'project', 'regex', 'tag']. The second parameter is based on CHOICE. --id-only Lists only workflow identifier and no labels or - other meta data. This is useful for piping the IDs + other metadata. This is useful for piping the IDs into other commands. --raw Outputs raw JSON objects of workflow task search diff --git a/docs/automate/cmemc-command-line-interface/command-reference/workflow/scheduler/index.md b/docs/automate/cmemc-command-line-interface/command-reference/workflow/scheduler/index.md index 034c364f..f868a14f 100644 --- a/docs/automate/cmemc-command-line-interface/command-reference/workflow/scheduler/index.md +++ b/docs/automate/cmemc-command-line-interface/command-reference/workflow/scheduler/index.md @@ -57,13 +57,13 @@ Outputs a table or a list of scheduler IDs which can be used as reference for th ```text --raw Outputs raw JSON. - --id-only Lists only task identifier and no labels or other meta data. - This is useful for piping the IDs into other commands. + --id-only Lists only task identifier and no labels or other metadata. This + is useful for piping the IDs into other commands. ``` ## workflow scheduler inspect -Display all meta data of a scheduler. +Display all metadata of a scheduler. ```shell-session title="Usage" $ cmemc workflow scheduler inspect [OPTIONS] SCHEDULER_ID diff --git a/docs/automate/cmemc-command-line-interface/configuration/file-based-configuration/index.md b/docs/automate/cmemc-command-line-interface/configuration/file-based-configuration/index.md index 602d6fef..d09a7560 100644 --- a/docs/automate/cmemc-command-line-interface/configuration/file-based-configuration/index.md +++ b/docs/automate/cmemc-command-line-interface/configuration/file-based-configuration/index.md @@ -24,7 +24,7 @@ If you need to change this location and want to use another config file, you hav - run cmemc with the `--config-file path/to/your/config.ini` option - set a new config file with the environment variable `CMEMC_CONFIG_FILE` -However, once you start cmemc the first time without any command or option, it will create an empty config file at this location and will output a general introduction. +However, once you start cmemc the first time without any command or option, it will create an empty configuration file at this location and will output a general introduction. ??? example "First cmemc run ..." @@ -75,19 +75,22 @@ However, once you start cmemc the first time without any command or option, it w workflow List, execute, status or open (io) workflows. ``` -You can now edit your config file and add credentials and URL parameters for your Corporate Memory deployment. -You either search for the config manually in your home directory or you can use the `config edit` command, which opens the config file in your default text editor (specified by the [`EDITOR` variable](https://wiki.archlinux.org/title/environment_variables#Default_programs)). +You can now edit your configuration file and add credentials and URL parameters for your Corporate Memory deployment. +You either search for the configuration manually in your home directory or you can use the `config edit` command, which opens the configuration file in your default text editor (specified by the [`EDITOR` variable](https://wiki.archlinux.org/title/environment_variables#Default_programs)). ``` shell-session $ cmemc config edit Open editor for config file /home/user/.config/cmemc/config.ini ``` -The rules for the config file are similar to a Windows INI file and are explained in detail at [docs.python.org](https://docs.python.org/3/library/configparser.html). +The rules for the configuration file are similar to a Windows INI file and are explained in detail at [docs.python.org](https://docs.python.org/3/library/configparser.html). ## Examples -!!! example inline end +Below is a minimal example using the `client_credentials` grant type. + +!!! example + ``` ini [my-local] CMEM_BASE_URI=http://localhost/ @@ -96,31 +99,36 @@ The rules for the config file are similar to a Windows INI file and are explaine OAUTH_CLIENT_SECRET=... ``` -Here is a minimal example using the `client_credentials` grant type. - This creates a named section `my-local` which is a connection to a Corporate Memory deployment on `http://localhost/`. The authorization will be done with a system account `cmem-service-account` and the given client secret. -Using this combination of config parameters is based on a typical installation where all components are available under the same hostname. +Using this combination of configuration parameters is based on a typical installation where all components are available under the same host name. + +Another example using `password` grant type. + +!!! example -!!! example inline end ``` ini [my-local] CMEM_BASE_URI=http://localhost/ OAUTH_GRANT_TYPE=password OAUTH_CLIENT_ID=cmemc - OAUTH_USERNAME=user + OAUTH_USER=user OAUTH_PASSWORD=... ``` -Another example using `password` grant type. - This creates a named section `my-local`, which is a connection to a Corporate Memory deployment on `http://localhost/`. -The authorization will be done with the given `OAUTH_USERNAME` and the `OAUTH_PASSWORD`. +The authorization will be done with the given `OAUTH_USER` and `OAUTH_PASSWORD`. + +!!! info + + The OAuth 2.0 token endpoint location ([`OAUTH_TOKEN_URI`](#oauth_token_uri)) defaults to `$KEYCLOAK_BASE_URI/realms/$KEYCLOAK_REALM_ID/protocol/openid-connect/token`. + If Keycloak is exposed to a different domain than Corporate Memory, make sure the variables [`KEYCLOAK_BASE_URI`](#keycloak_base_uri) and [`KEYCLOAK_REALM_ID`](#keycloak_realm_id) are configured correctly. + Please refer to [Configure Corporate Memory with an external Keycloak](../../../../deploy-and-configure/configuration/keycloak/using-external-keycloak/) for more information. ## Configuration Variables -The above example provides access to an installation where all components including keycloak are deployed with the default URL base. -However, if you need to fine-tune all locations or want to use special functionality, the following config file parameters can be used. +The above example provides access to an installation where all components (including Keycloak) are deployed with the default URL base. +However, if you need to fine-tune all locations or want to use special functionality, the following configuration parameters can be used. ### Location related @@ -139,25 +147,31 @@ This variable defaults to `http://docker.localhost/`. This is the base location (HTTP(S) URL) of all Data Integration APIs. -Usually you do **not need to set** this configuration variable. - -This variable defaults to `$CMEM_BASE_URI/dataintegration/`. +This variable defaults to `$CMEM_BASE_URI/dataintegration/` and usually does **not** need to be set. #### DP_API_ENDPOINT This is the base location (HTTP(S) URL) of all Data Platform APIs. -Usually you do **not need to set** this configuration variable. +This variable defaults to `$CMEM_BASE_URI/dataplatform/` and usually does **not** need to be set. + +#### KEYCLOAK_BASE_URI + +This is the base location (HTTP(S) URL) of all Keycloak APIs. -This variable defaults to `$CMEM_BASE_URI/dataplatform/`. +This variable defaults to `$CMEM_BASE_URI/auth/` and usually does **not** need to be set. + +#### KEYCLOAK_REALM_ID + +This is the identifier of your Keycloak Realm. + +This variable defaults to `cmem` and usually does **not** need to be set. #### OAUTH_TOKEN_URI This is the [OpenID Connect (OIDC)](https://en.wikipedia.org/wiki/OpenID#OpenID_Connect_(OIDC)) OAuth 2.0 token endpoint location (HTTP(S) URL). -Usually you do **not need to set** this configuration variable. - -This variable defaults to `$CMEM_BASE_URI/auth/realms/cmem/protocol/openid-connect/token`. +This variable defaults to `$KEYCLOAK_BASE_URI/realms/$KEYCLOAK_REALM_ID/protocol/openid-connect/token` and usually does **not** need to be set. ### Authentication related @@ -176,7 +190,8 @@ The following values can be used: #### OAUTH_CLIENT_ID -This configures the used client ID. Ususally, the following cmemc related clients are configured in the standard Corporate Memory realm: +This configures the used client ID. +Usually, the following cmemc related clients are configured in the standard Corporate Memory realm: - `cmem-service-account` is the client which is configured to be used with the `client_credentials` grant type. - `cmemc` is the client which is configured to be used with the `password` grant type. @@ -207,13 +222,13 @@ You **only** need to set this configuration variable if you use the `client_cred #### OAUTH_ACCESS_TOKEN -This variable specifies a prefetched access token. +This variable specifies a pre-fetched access token. You **only** need to set this configuration variable if you use the `prefetched_token` grant type. #### OAUTH_PASSWORD_PROCESS -In order to avoid saving credentials in config files you can use this optional configuration variable **instead** of the `OAUTH_PASSWORD` variable. +In order to avoid saving credentials in configuration files you can use this optional configuration variable **instead** of the `OAUTH_PASSWORD` variable. Please refer to [Getting Credentials from external Processes](../getting-credentials-from-external-processes/index.md) for more information. @@ -221,7 +236,7 @@ This variable defaults to `none`. #### OAUTH_CLIENT_SECRET_PROCESS -In order to avoid saving credentials in config files you can use this optional configuration variable **instead** of the `OAUTH_CLIENT_SECRET` variable. +In order to avoid saving credentials in configuration files you can use this optional configuration variable **instead** of the `OAUTH_CLIENT_SECRET` variable. Please refer to [Getting Credentials from external Processes](../getting-credentials-from-external-processes/index.md) for more information. @@ -229,7 +244,7 @@ This variable defaults to `none`. #### OAUTH_ACCESS_TOKEN_PROCESS -In order to avoid saving credentials in config files you can use this optional configuration variable **instead** of the `OAUTH_ACCESS_TOKEN` variable. +In order to avoid saving credentials in configuration files you can use this optional configuration variable **instead** of the `OAUTH_ACCESS_TOKEN` variable. Please refer to [Getting Credentials from external Processes](../getting-credentials-from-external-processes/index.md) for more information. diff --git a/docs/automate/cmemc-command-line-interface/invocation/docker-image/index.md b/docs/automate/cmemc-command-line-interface/invocation/docker-image/index.md index a54d4b03..87867f33 100644 --- a/docs/automate/cmemc-command-line-interface/invocation/docker-image/index.md +++ b/docs/automate/cmemc-command-line-interface/invocation/docker-image/index.md @@ -16,16 +16,16 @@ This is especially needed if you want to use cmemc in orchestrations. The following image - tag combinations are available for public use: -- `docker-registry.eccenca.com/eccenca-cmemc:v22.1` - a specific release +- `docker-registry.eccenca.com/eccenca-cmemc:v23.2` - a specific release - `docker-registry.eccenca.com/eccenca-cmemc:latest` - same as the latest release ``` shell-session title="Image retrieval and check cmemc version" -$ docker run -it --rm docker-registry.eccenca.com/eccenca-cmemc:v22.1 --version -Unable to find image 'docker-registry.eccenca.com/eccenca-cmemc:v22.1' locally -v22.1: Pulling from eccenca-cmemc -Digest: sha256:29bdd320e02f1b7758df22528740964225b62530c73c773a55c36c0e9e18b647 -Status: Downloaded newer image for docker-registry.eccenca.com/eccenca-cmemc:v22.1 -cmemc, version v22.1.1, running under python 3.9.13 +$ docker run -it --rm docker-registry.eccenca.com/eccenca-cmemc:v23.2 --version +Unable to find image 'docker-registry.eccenca.com/eccenca-cmemc:v23.2' locally +v23.2: Pulling from eccenca-cmemc +Digest: sha256:.... +Status: Downloaded newer image for docker-registry.eccenca.com/eccenca-cmemc:v23.2 +cmemc, version v23.2 running under python 3.11.4 ``` ## Volumes diff --git a/docs/automate/cmemc-command-line-interface/invocation/github-action/index.md b/docs/automate/cmemc-command-line-interface/invocation/github-action/index.md index 53554a15..807d9448 100644 --- a/docs/automate/cmemc-command-line-interface/invocation/github-action/index.md +++ b/docs/automate/cmemc-command-line-interface/invocation/github-action/index.md @@ -15,14 +15,14 @@ In order to control eccenca Corporate Memory instances from within Github Action ## Runner Provisioning Providing a working cmemc command is simple. -You just need to install a python environment suitable to run cmemc (currently `3.9`). +You just need to install a python environment suitable to run cmemc (currently `3.11`). This can be done with the [setup-python](https://github.com/actions/setup-python) action. After that, simply use `pip` to install cmemc: ```yaml title="Partial github action yaml showing cmemc provisioning" - uses: actions/setup-python@v4 with: - python-version: '3.9' + python-version: '3.11' - name: install cmemc run: | pip install -q cmem-cmemc diff --git a/docs/automate/processing-data-with-variable-input-workflows/index.md b/docs/automate/processing-data-with-variable-input-workflows/index.md index d58549e6..0dd234cf 100644 --- a/docs/automate/processing-data-with-variable-input-workflows/index.md +++ b/docs/automate/processing-data-with-variable-input-workflows/index.md @@ -18,7 +18,7 @@ The workflow is then called via an HTTP REST call (or via [cmemc](../cmemc-comm This allows for solving all kinds of [☆ Automation](../) tasks when you need to process lots of small data snippets or similar. -!!! Abstract +!!! Abstract The complete tutorial is available as a [project file](tutorial-varinput.project.zip). You can import this project @@ -35,7 +35,7 @@ First, install all required ontologies/vocabularies which are needed for mapping In this tutorial, we need the _Schema.org_ and the _RDFS_ vocabulary. Press the (toggle switch) button on the right to install them. -![Vocabulary catalog](pdwviw-vocab-catalog.png) +![Vocabulary catalog](pdwviw-vocab-catalog.png){ class="bordered" } ## 2 Create a new project @@ -43,7 +43,7 @@ Second, create in the tab **DATA INTEGRATION** a new project. Provide it with a The project will include everything you need to build a workflow for extracting Feed XML data, transforming it into RDF, and loading it into a Knowledge Graph. -![Create new project dialog](pdwviw-create-new-project.png) +![Create new project dialog](pdwviw-create-new-project.png){ class="bordered" } ## 3 Create an (example) feed dataset and target graph dataset @@ -54,7 +54,7 @@ For this tutorial, you may take this file: [feed.xml](feed.xml)(1) 1. Original feed source was: `https://www.ecdc.europa.eu/en/taxonomy/term/2942/feed` -![Create XML dataset dialog](pdwviw-create-xml-dataset.png) +![Create XML dataset dialog](pdwviw-create-xml-dataset.png){ class="bordered" } ## 4 Create the feed transformation @@ -64,14 +64,14 @@ The mappings are based on classes and properties defined by the _Schema.org_ and In case you need help with mapping data from XML to RDF, feel free to visit your respective tutorial: [Lift data from JSON and XML sources](../../build/lift-data-from-json-and-xml-sources/). -![Feed transformation](pdwviw-feed-transformation.png) +![Feed transformation](pdwviw-feed-transformation.png){ class="bordered" } ## 5 Create the variable input and workflow Create a new workflow in your project. Move the **input** XML feed dataset and the **Feed Data** Graph into the workflow editor and connect them with your created **Transform feed**. -![Workflow with variable input](pdwviw-variable-input-workflow.png) +![Workflow with variable input](pdwviw-variable-input-workflow.png){ class="bordered" } ## 6 Use `cmemc` to feed data into the workflow @@ -107,4 +107,4 @@ http://feeds.bbci.co.uk/news/rss.xml In **EXPLORATION**, you can study the ingested feed data in your Knowledge Graph. -![Explore the result](pdwviw-review-knowledge-graph.png) +![Explore the result](pdwviw-review-knowledge-graph.png){ class="bordered" } diff --git a/docs/automate/processing-data-with-variable-input-workflows/pdwviw-review-knowledge-graph.png b/docs/automate/processing-data-with-variable-input-workflows/pdwviw-review-knowledge-graph.png index d3ea3ac6..7f4347b4 100644 Binary files a/docs/automate/processing-data-with-variable-input-workflows/pdwviw-review-knowledge-graph.png and b/docs/automate/processing-data-with-variable-input-workflows/pdwviw-review-knowledge-graph.png differ diff --git a/docs/automate/processing-data-with-variable-input-workflows/pdwviw-vocab-catalog.png b/docs/automate/processing-data-with-variable-input-workflows/pdwviw-vocab-catalog.png index 6187c91e..0b7d23a9 100644 Binary files a/docs/automate/processing-data-with-variable-input-workflows/pdwviw-vocab-catalog.png and b/docs/automate/processing-data-with-variable-input-workflows/pdwviw-vocab-catalog.png differ diff --git a/docs/build/.pages b/docs/build/.pages index 6a92dfe9..324f29dd 100644 --- a/docs/build/.pages +++ b/docs/build/.pages @@ -9,5 +9,6 @@ nav: - Lift Web API Data: extracting-data-from-a-web-api - Workflow Reconfiguration: workflow-reconfiguration - Incremental Database Loading: loading-jdbc-datasets-incrementally + - Connect to Snowflake: snowflake-tutorial - Active learning: active-learning - + - Link Intrusion Detection Systems to Open-Source INTelligence: tutorial-how-to-link-ids-to-osint diff --git a/docs/build/active-learning/index.md b/docs/build/active-learning/index.md index e5e20006..0603f517 100644 --- a/docs/build/active-learning/index.md +++ b/docs/build/active-learning/index.md @@ -1,7 +1,6 @@ --- icon: fontawesome/solid/wand-magic-sparkles subtitle: Use AI/ML to learn linking rules -status: new tags: - BeginnersTutorial --- diff --git a/docs/build/define-prefixes-namespaces/DM-query-editor.png b/docs/build/define-prefixes-namespaces/DM-query-editor.png index a53e638f..045a1804 100644 Binary files a/docs/build/define-prefixes-namespaces/DM-query-editor.png and b/docs/build/define-prefixes-namespaces/DM-query-editor.png differ diff --git a/docs/build/define-prefixes-namespaces/DM-turtle-editor.png b/docs/build/define-prefixes-namespaces/DM-turtle-editor.png index 06f9173a..023ebfd0 100644 Binary files a/docs/build/define-prefixes-namespaces/DM-turtle-editor.png and b/docs/build/define-prefixes-namespaces/DM-turtle-editor.png differ diff --git a/docs/build/define-prefixes-namespaces/index.md b/docs/build/define-prefixes-namespaces/index.md index 265ff91a..9cf2aa33 100644 --- a/docs/build/define-prefixes-namespaces/index.md +++ b/docs/build/define-prefixes-namespaces/index.md @@ -13,8 +13,8 @@ Namespace declarations allow for the abbreviation of IRIs by using a prefixed re For example, after defining a namespace with the values -- **prefix name** = `cohw`, and the -- **namespace IRI** = `https://data.company.org/hardware/` +- **prefix name** = `cohw`, and the +- **namespace IRI** = `https://data.company.org/hardware/` you can use the term `cohw:test` as an abbreviation for the full IRI `https://data.company.org/hardware/test`. @@ -22,15 +22,14 @@ This is particularly useful when you have to write source code in Turtle and SPA ## Managing Namespace Declarations - ### Using the Vocabulary Catalog After installing a vocabulary from the [Vocabulary Catalog](/explore-and-author/vocabulary-catalog), the vocabulary namespace declaration is automatically added to all integration projects. In order to get the **prefix name** and the **namespace IRI** from the vocabulary graph, the following terms from the [VANN vocabulary](https://vocab.org/vann/) need to be used on the Ontology resource. -- [vann:preferredNamespacePrefix](https://vocab.org/vann/#preferredNamespacePrefix) - to specify the **prefix name** -- [vann:preferredNamespaceUri](https://vocab.org/vann/#preferredNamespaceUri) - to specify the **namespace IRI** +- [vann:preferredNamespacePrefix](https://vocab.org/vann/#preferredNamespacePrefix) - to specify the **prefix name** +- [vann:preferredNamespaceUri](https://vocab.org/vann/#preferredNamespaceUri) - to specify the **namespace IRI** In the Explore area, an Ontology with a correct namespace declaration looks like this: @@ -43,7 +42,7 @@ The `vocabulary` command group of [cmemc](../../automate/cmemc-command-line-inte Beginning with v22.2, this command has an additional option `--namespace` which you can use to set a vocabulary namespace even if the vocabulary does not include the data needed for autodiscovery: ```shell-session -$ cmemc vocabulary import my-ont.ttl --namespace myo https//example.org/my/` +cmemc vocabulary import my-ont.ttl --namespace myo https//example.org/my/` ``` ### Using the Project Configuration @@ -52,10 +51,10 @@ In addition to the used vocabulary namespace declarations, you may want to add w Such organization use cases include: -- Namespaces per class / resource type: - - **prefix name** = `persons`, **namespace IRI** = `https://example.org/data/persons/` -- Namespaces per data owner or origin: - - **prefix name** = `sales`, **namespace IRI** = `https://example.org/data/sales/` +- Namespaces per class / resource type: + - **prefix name** = `persons`, **namespace IRI** = `https://example.org/data/persons/` +- Namespaces per data owner or origin: + - **prefix name** = `sales`, **namespace IRI** = `https://example.org/data/sales/` Prefixes in Data Integration are defined on a project basis. When creating a new project, a list of well-know prefixes is already declared. @@ -69,8 +68,8 @@ By using the **Edit Prefix Settings** button in this Configuration area, you wil In this dialog, you are able to -- Delete a namespace declaration → **Delete Prefix** -- Add a new namespace declaration → **Add** +- Delete a namespace declaration → **Delete Prefix** +- Add a new namespace declaration → **Add** ## Validating Namespace Declarations @@ -78,6 +77,6 @@ After adding namespace declarations to a project you are able to use the abbrevi ![Prefixes displayed in the mapping dialogs, e.g. property selection.](prefix-displayed-in-mapping.png) -![Query Editor](DM-query-editor.png) +![Query Editor](DM-query-editor.png){ class="bordered" } -![Turtle Editor](DM-turtle-editor.png) +![Turtle Editor](DM-turtle-editor.png){ class="bordered" } diff --git a/docs/build/lift-data-from-json-and-xml-sources/index.md b/docs/build/lift-data-from-json-and-xml-sources/index.md index 49ddb5a1..04cddc4d 100644 --- a/docs/build/lift-data-from-json-and-xml-sources/index.md +++ b/docs/build/lift-data-from-json-and-xml-sources/index.md @@ -30,11 +30,11 @@ The documentation consists of the following steps, which are described in detail The following material is used in this tutorial: -- Sample vocabulary describing the data in the JSON and XML files: [products_vocabulary.nt](products_vocabulary.nt) +- Sample vocabulary describing the data in the JSON and XML files: [products_vocabulary.nt](products_vocabulary.nt) - ![Visualization of the "Products Vocabulary".](products-vocab-xml+json.png) + ![Visualization of the "Products Vocabulary".](products-vocab-xml+json.png){ class="bordered" } -- Sample JSON file: [services.json](services.json) +- Sample JSON file: [services.json](services.json) ```json [ @@ -56,7 +56,8 @@ The following material is used in this tutorial: ] ``` -- Sample XML file: [orgmap.xml](orgmap.xml) +- Sample XML file: [orgmap.xml](orgmap.xml) + ```xml @@ -110,19 +111,19 @@ The vocabulary contains the classes and properties needed to map the source data 1. In Corporate Memory, click **Vocabularies** in the navigation under **EXPLORE** on the left side of the page. - ![Menu entry EXPLORE > Vocabularies](menu-explore-vocabularies.png){width="30%"} + ![Menu entry EXPLORE > Vocabularies](menu-explore-vocabularies.png){ class="bordered" width="30%" } 2. Click **Register new vocabulary** on the top right of the **Vocabulary catalog** page in Corporate Memory. - ![Vocabularies Catalog](vocab-catalog-xml+json.png) + ![Vocabularies Catalog](vocab-catalog-xml+json.png){ class="bordered" } 3. Define a **Name**, a **Graph URI** and a **Description** of the vocabulary. _In this example we will use:_ - - Name: _**Product Vocabulary**_ - - Graph URI: _**http://ld.company.org/prod-vocab/**_ - - Description: _**Example vocabulary modeled to describe relations between products and services.**_ + - Name: _**Product Vocabulary**_ + - Graph URI: _****_ + - Description: _**Example vocabulary modeled to describe relations between products and services.**_ - ![Dialog to register a new vocabulary.](dialog-register-new-vocabulary.png){width="50%"} + ![Dialog to register a new vocabulary.](dialog-register-new-vocabulary.png){ class="bordered" width="50%" } 4. Click **REGISTER**. @@ -136,11 +137,11 @@ To add the data files, click Projects under BUILD in the navigation on the left 2. In **Create new item** window, select **JSON** and click Add. - ![Dialog to create new JSON dataset](create-dataset-JSON.png) + ![Dialog to create new JSON dataset](create-dataset-JSON.png){ class="bordered" } 3. Define a **Label** for the dataset and upload the [services.json](services.json) file. You can leave all the other fields at default values. - ![Dialog to create new JSON dataset](dialog-create-new-json-dataset.png){width="45%"} ![Dialog to create new JSON dataset](dialog-create-new-json-dataset-2.png){width="45%"} + ![Dialog to create new JSON dataset](dialog-create-new-json-dataset.png){ class="bordered" width="45%"} ![Dialog to create new JSON dataset](dialog-create-new-json-dataset-2.png){ class="bordered" width="45%"} 4. Click **Create**. @@ -148,11 +149,11 @@ To add the data files, click Projects under BUILD in the navigation on the left 1. Press the **Create** button and select XML - ![Dialog to create new XML dataset](create-dataset-XML.png) + ![Dialog to create new XML dataset](create-dataset-XML.png){ class="bordered" } 2. Define a **Label** for the dataset and upload the [orgmap.xml](orgmap.xml) example file. You can leave all the other fields at default values. - ![Dialog to create new XML dataset](dialog-create-new-xml-dataset.png) + ![Dialog to create new XML dataset](dialog-create-new-xml-dataset.png){ class="bordered" } 3. Click **Create**. @@ -162,7 +163,7 @@ To add the data files, click Projects under BUILD in the navigation on the left 2. In **Create new item** window, select **Knowledge Graph** and click **Add**. The Create new item of type Knowledge Graph window appears. - ![Dialog to create new Knowledge Graph dataset](create-dataset-KG.png) + ![Dialog to create new Knowledge Graph dataset](create-dataset-KG.png){ class="bordered" } 3. Fill in the required details such as Label and Description. @@ -173,7 +174,7 @@ To add the data files, click Projects under BUILD in the navigation on the left - Name: _**Service Knowledge Graph**_ - Graph: _**http://ld.company.org/prod-instances/**_ - ![Dialog to create new Knowledge Graph dataset](create-new-kg-for-json.png) + ![Dialog to create new Knowledge Graph dataset](create-new-kg-for-json.png){ class="bordered" } === "XML" @@ -182,7 +183,7 @@ To add the data files, click Projects under BUILD in the navigation on the left - Name: _**Organization Knowledge Graph**_ - Graph: _**http://ld.company.org/organization-data/**_ - ![Dialog to create new Knowledge Graph dataset](create-new-kg-for-xml.png) + ![Dialog to create new Knowledge Graph dataset](create-new-kg-for-xml.png){ class="bordered" } ## 4 Create a Transformation @@ -192,7 +193,7 @@ The transformation defines how an input dataset (e.g.: JSON or XML) will be tran 2. On the **Create New Item** window, select **Transform** and click **Add** to create a new transformation. - ![Create new Transformation](create-new-tf.png) + ![Create new Transformation](create-new-tf.png){ class="bordered" } 3. In the **Create new item of type Transform** window, enter the required fields. @@ -205,7 +206,7 @@ The transformation defines how an input dataset (e.g.: JSON or XML) will be tran - Select the Source Dataset: _**Services JSON**_ - Select the Output Dataset: _**Service_Knowledge_Graph**_ - ![Dialog to create new Transformation](create-new-tf-for-json.png) + ![Dialog to create new Transformation](create-new-tf-for-json.png){ class="bordered" } Click **Create**. @@ -219,7 +220,7 @@ The transformation defines how an input dataset (e.g.: JSON or XML) will be tran - Type: _**dept**_ (define the Source Type, which defines the XML element that should be iterated when creating resources) - Select the Output Dataset: _**Organization_Knowledge_Graph**_ - ![Dialog to create new Transformation](create-new-tf-for-xml.png) + ![Dialog to create new Transformation](create-new-tf-for-xml.png){ class="bordered" } Click **Create**. @@ -227,7 +228,7 @@ The transformation defines how an input dataset (e.g.: JSON or XML) will be tran 5. Click **Edit** to create a base mapping. - ![Mapping header configuration.](mapping-configuration-header.png) + ![Mapping header configuration.](mapping-configuration-header.png){ class="bordered" } 6. Define the **Target entity type** from the vocabulary, the **URI pattern** and a **Label** for the mapping. @@ -280,13 +281,13 @@ The transformation defines how an input dataset (e.g.: JSON or XML) will be tran 7. Evaluate your mapping by pressing on the ![Button expand](button-expand-xml+json.png) button in the **Examples of target data** property to see at most three generated base URIs. - ![Preview of mapping results](mapping-value-preview.png) + ![Preview of mapping results](mapping-value-preview.png){ class="bordered" } We have now created the Service entities in the Knowledge Graph. Next we will now add the name of our entity. 8. Click the circular blue **+** icon on the lower right and select **Add value mapping**. - ![Add a mapping rule](service-mapping-add-rule.png) + ![Add a mapping rule](service-mapping-add-rule.png){ class="bordered" } === "JSON" @@ -298,7 +299,7 @@ The transformation defines how an input dataset (e.g.: JSON or XML) will be tran - which corresponds to the following element in the json-file: _[ {"ProductManager": {  "name": "Corinna Ludwig"} ... } ...]_ - An optional Label: _**has Product Manager**_ - ![Configuration of a mapping rule](mapping-rule-config-json.png) + ![Configuration of a mapping rule](mapping-rule-config-json.png){ class="bordered" } Click **Save**. @@ -312,7 +313,7 @@ The transformation defines how an input dataset (e.g.: JSON or XML) will be tran - which corresponds to the `department name` attribute in the XML file - An optional Label: _**department name**_ - ![Configuration of a mapping rule](mapping-rule-config-xml.png) + ![Configuration of a mapping rule](mapping-rule-config-xml.png){ class="bordered" } Click **Save**. @@ -320,17 +321,17 @@ By clicking on the ![Button expand](button-expand-xml+json.png) button in the ** === "JSON" - ![Mapping result](mapping-result-json.png) + ![Mapping result](mapping-result-json.png){ class="bordered" } === "XML" - ![Mapping result](mapping-result-xml.png) + ![Mapping result](mapping-result-xml.png){ class="bordered" } ## 5 Evaluate a Transformation Click **Transform evaluation** to evaluate the transformed entities. -![Transformation evaluation view](xml+json-transform-evaluation.png) +![Transformation evaluation view](xml+json-transform-evaluation.png){ class="bordered" } ## 6 Build the Knowledge Graph @@ -338,13 +339,13 @@ Click **Transform evaluation** to evaluate the transformed entities. 2. Press the ![Button play](button-play-xml+json.png) button and validate the results. In this example, 9x Service entities were created in our Knowledge Graph based on the mapping. 3. You can click **Knowledge Graphs** under **EXPLORE** to (re-)view of the created Knowledge Graphs 4. Enter the following URIs in the Enter search term for JSON and XML respectively. - - JSON / Service: _**http://ld.company.org/prod-instances/**_ - - XML / Department: _**http://ld.company.org/organization-data/**_ + - JSON / Service: _****_ + - XML / Department: _****_ === "JSON" - ![Service KG](services-kg.png) + ![Service KG](kg-services.png){ class="bordered" } === "XML" - ![Organization KG](kg-organization.png) + ![Organization KG](kg-organization.png){ class="bordered" } diff --git a/docs/build/lift-data-from-json-and-xml-sources/kg-organization.png b/docs/build/lift-data-from-json-and-xml-sources/kg-organization.png index 51d06af2..49a219b3 100644 Binary files a/docs/build/lift-data-from-json-and-xml-sources/kg-organization.png and b/docs/build/lift-data-from-json-and-xml-sources/kg-organization.png differ diff --git a/docs/build/lift-data-from-json-and-xml-sources/kg-services.png b/docs/build/lift-data-from-json-and-xml-sources/kg-services.png new file mode 100644 index 00000000..c3c984e7 Binary files /dev/null and b/docs/build/lift-data-from-json-and-xml-sources/kg-services.png differ diff --git a/docs/build/lift-data-from-json-and-xml-sources/menu-explore-vocabularies.png b/docs/build/lift-data-from-json-and-xml-sources/menu-explore-vocabularies.png index 673f5299..55906885 100644 Binary files a/docs/build/lift-data-from-json-and-xml-sources/menu-explore-vocabularies.png and b/docs/build/lift-data-from-json-and-xml-sources/menu-explore-vocabularies.png differ diff --git a/docs/build/lift-data-from-json-and-xml-sources/services-kg.png b/docs/build/lift-data-from-json-and-xml-sources/services-kg.png deleted file mode 100644 index 4e45b854..00000000 Binary files a/docs/build/lift-data-from-json-and-xml-sources/services-kg.png and /dev/null differ diff --git a/docs/build/lift-data-from-json-and-xml-sources/vocab-catalog-xml+json.png b/docs/build/lift-data-from-json-and-xml-sources/vocab-catalog-xml+json.png index 64d91204..abfd1caf 100644 Binary files a/docs/build/lift-data-from-json-and-xml-sources/vocab-catalog-xml+json.png and b/docs/build/lift-data-from-json-and-xml-sources/vocab-catalog-xml+json.png differ diff --git a/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/explore-vocab-catalog.png b/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/explore-vocab-catalog.png index 7ccabc94..55906885 100644 Binary files a/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/explore-vocab-catalog.png and b/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/explore-vocab-catalog.png differ diff --git a/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/index.md b/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/index.md index 481941a9..0cdfaa9c 100644 --- a/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/index.md +++ b/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/index.md @@ -38,11 +38,11 @@ The documentation consists of the following steps, which are described in detail The following material is used in this tutorial, you should download the files and have them at hand throughout the tutorial: -- Sample vocabulary which describes the data in the CSV files: [products_vocabulary.nt](products_vocabulary.nt) +- Sample vocabulary which describes the data in the CSV files: [products_vocabulary.nt](products_vocabulary.nt) - ![](products-vocab.png) + ![](products-vocab.png){ class="bordered" } -- Sample CSV file: [services.csv](services.csv) +- Sample CSV file: [services.csv](services.csv) !!! info @@ -52,7 +52,7 @@ The following material is used in this tutorial, you should download the files a | I241-8776317 | Component Confabulation | Z249-1364492, L557-1467804, C721-7900144, ... | Corinna.Ludwig@company.org | 1082,00 EUR | | … | … | … | … | … | -- Sample Excel file: [products.xlsx](products.xlsx) +- Sample Excel file: [products.xlsx](products.xlsx) !!! info @@ -72,11 +72,11 @@ The vocabulary contains the classes and properties needed to map the data into t 1. In Corporate Memory, click Vocabularies under **EXPLORE** in the navigation on the left side of the page. - ![](explore-vocab-catalog.png){width="30%"} + ![](explore-vocab-catalog.png){ class="bordered" width="30%" } 2. Click **Register new vocabulary** on the top right. - ![](vocab-catalog.png) + ![](vocab-catalog.png){ class="bordered" } 3. Define a **Name**, a **Graph URI** and a **Description** of the vocabulary. _In this example we will use:_ @@ -85,7 +85,7 @@ The vocabulary contains the classes and properties needed to map the data into t - Description: _**Example vocabulary modeled to describe relations between products and services.**_ - Vocabulary File: Browse in your filesystem for the **[products_vocabulary.nt](products_vocabulary.nt)** file and select it to be uploaded. - ![](register-new-vocab.png){width="50%"} + ![](register-new-vocab.png){ class="bordered" width="50%" } === "cmemc" @@ -101,7 +101,7 @@ The vocabulary contains the classes and properties needed to map the data into t 1. In Corporate Memory, click Projects under **BUILD** in the navigation on the left side of the page. - ![](menu-build-projects.png){width="30%"} + ![](menu-build-projects.png){ class="bordered" width="30%" } 2. Click **Create** at the top of the page.  @@ -115,11 +115,11 @@ The vocabulary contains the classes and properties needed to map the data into t 7. In the **Create new item** dialog, select **CSV**. - ![](build-dataset-types-csv.png) + ![](build-dataset-types-csv.png){ class="bordered" } 8. Fill out a label and upload the **[services.csv](services.csv) sample file**. - ![](create new-dataset-csv.png) + ![](create new-dataset-csv.png){ class="bordered" } 9. Click **Create**.** Leave all other parameters at their default values. @@ -131,7 +131,7 @@ The vocabulary contains the classes and properties needed to map the data into t 1. In the project, Click **Create** and select the **JDBC endpoint** type. - ![](build-dataset-types-jdbc.png) + ![](build-dataset-types-jdbc.png){ class="bordered" } 2. Define a **Label** for the dataset, specify the **JDBC Driver connection URL**, the **table** name and the **user** and **password** to connect to the database. _In this example we will use:_ @@ -141,7 +141,7 @@ The vocabulary contains the classes and properties needed to map the data into t - username: _**root**_ - password: _**\*\*\*\***_ - ![](create new-dataset-jdbc.png) + ![](create new-dataset-jdbc.png){ class="bordered" } The general form of the JDBC connection string is: @@ -186,15 +186,15 @@ To validate that the input data is correct, you can preview the data table in Co 1. On the dataset page, press the **Load preview** button - ![](dataset-services.png) + ![](dataset-services.png){ class="bordered" } 2. Once the preview is loaded, you can view a couple of rows to check that your data is accessible. - ![](dataset-services-preview.png) + ![](dataset-services-preview.png){ class="bordered" } 3. Optionally, you can click **start profiling** and explore statistics about the dataset. - ![](dataset-services-profiling.png) + ![](dataset-services-profiling.png){ class="bordered" } --- @@ -204,14 +204,14 @@ To validate that the input data is correct, you can preview the data table in Co 2. In Create new item window, select Knowledge Graph and click Add. - ![](build-dataset-types-kg.png) + ![](build-dataset-types-kg.png){ class="bordered" } 3. The Create new item of type Knowledge Graph window appears. 4. Define a **Label** for the Knowledge Graph and provide a **graph** uri. Leave all the other parameters at the default values. _In this example we will use:_ - - Label: _**Service Knowledge Graph**_ - - Graph: _**http://ld.company.org/prod-instances/**_ + - Label: _**Service Knowledge Graph**_ + - Graph: _****_ 5. Click **Create**. @@ -227,35 +227,35 @@ The transformation defines how an input dataset (e.g. CSV) will be transformed i 3. Fill out the the details leaving the **target vocabularies** field at its default value **all installed vocabularies,** which will enable us to create a transformation to the previously installed products vocabulary. _In this example we will use:_ - - Name: _**Lift Service Database**_ - - _In the section **INPUT TASK** in the field **Dataset**, select the previously created dataset: **Services** (Input Dataset)._ - - _Select the previously created dataset as the Output Dataset: **Service Knowledge Graph**_ + - Name: _**Lift Service Database**_ + - _In the section **INPUT TASK** in the field **Dataset**, select the previously created dataset: **Services** (Input Dataset)._ + - _Select the previously created dataset as the Output Dataset: **Service Knowledge Graph**_ 4. In the main area you will find the **Mapping editor**. - ![](services-mapping.png) + ![](services-mapping.png){ class="bordered" } 5. Click **Mapping** in the main area to expand its menu. - ![](mapping-header.png) + ![](mapping-header.png){ class="bordered" } 6. Click **Edit** to create a base mapping. - ![](services-mapping-rule.png) + ![](services-mapping-rule.png){ class="bordered" } 7. Define the **Target entity type** from the vocabulary, the **URI pattern** and a **label** for the mapping. _In this example we will use:_ - - Target entity type: _**Service**_ - - URI pattern: + - Target entity type: _**Service**_ + - URI pattern: - - Click **Create custom pattern** - - Insert _**http://ld.company.org/prod-inst/{ServiceID}**_ - - where _http://ld.company.org/prod-inst/_ is a common prefix for the instances in this use case, - - and _{ServiceID}_ is a placeholder that will resolve to the column of that name + - Click **Create custom pattern** + - Insert _****_ + - where __ is a common prefix for the instances in this use case, + - and _{ServiceID}_ is a placeholder that will resolve to the column of that name - - _An optional Label: **Service**_ + - _An optional Label: **Service**_ - ![](services-mapping-class.png) + ![](services-mapping-class.png){ class="bordered" } 8. Click **Save** _Example RDF triple in our Knowledge Graph based on the mapping definition:_ @@ -265,22 +265,22 @@ The transformation defines how an input dataset (e.g. CSV) will be transformed i 9. Evaluate your mapping by clicking the Expand ![](button-expand.png) button in the **Examples of target data** property to see at most three generated base URIs. - ![](mapping-inline-preview.png) + ![](mapping-inline-preview.png){ class="bordered" } We have now created the Service entities in the Knowledge Graph. As a next step, we will add the name of the Service entity. 10. Press the circular **Blue + button** on the lower right and select **Add value mapping**. - ![](services-mapping-add-rule.png) + ![](services-mapping-add-rule.png){ class="bordered" } 11. Define the **Target property**, the **Data type**, the **Value path** (column name) and a **Label** for your value mapping. _In this example we will use:_ - - Target Property: **_name_** - - Data type: _**StringValueType**_ - - Value path: _**ServiceName**_ (which corresponds to the column of that name) - - An optional Label: _**service name**_ + - Target Property: **_name_** + - Data type: _**StringValueType**_ + - Value path: _**ServiceName**_ (which corresponds to the column of that name) + - An optional Label: _**service name**_ - ![](services-mapping-rule-edit.png) + ![](services-mapping-rule-edit.png){ class="bordered" } 12. Click **Save.** @@ -290,7 +290,7 @@ The transformation defines how an input dataset (e.g. CSV) will be transformed i Go the **Transform evaluation** tab of your transformation to view a list of generated entities. By clicking one of the generated entities, more details are provided. -![](mapping-evaluation.png) +![](mapping-evaluation.png){ class="bordered" } --- @@ -298,12 +298,12 @@ Go the **Transform evaluation** tab of your transformation to view a list of gen 1. Go into the mapping and visit the **Transform execution** tab. - ![](mapping-execution.png) + ![](mapping-execution.png){ class="bordered" } 2. Press the ![](button-play.png) button and validate the results. In this example, 9x Service triples were created in our Knowledge Graph based on the mapping. - ![](mapping-execution-result.png) + ![](mapping-execution-result.png){ class="bordered" } -3. Finally you can use the DataManager **Knowledge Graphs** module to (re-)view of the created Knowledge Graph: http://ld.company.org/prod-instances/ +3. Finally you can use the DataManager **Knowledge Graphs** module to (re-)view of the created Knowledge Graph: - ![](kg-result.png) + ![](kg-result.png){ class="bordered" } diff --git a/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/kg-result.png b/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/kg-result.png index e48c2027..4081406c 100644 Binary files a/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/kg-result.png and b/docs/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/kg-result.png differ diff --git a/docs/build/loading-jdbc-datasets-incrementally/graph-turtle-view.png b/docs/build/loading-jdbc-datasets-incrementally/graph-turtle-view.png index 705cc0d4..3080e850 100644 Binary files a/docs/build/loading-jdbc-datasets-incrementally/graph-turtle-view.png and b/docs/build/loading-jdbc-datasets-incrementally/graph-turtle-view.png differ diff --git a/docs/build/loading-jdbc-datasets-incrementally/index.md b/docs/build/loading-jdbc-datasets-incrementally/index.md index e8fc81e9..71f0536e 100644 --- a/docs/build/loading-jdbc-datasets-incrementally/index.md +++ b/docs/build/loading-jdbc-datasets-incrementally/index.md @@ -36,13 +36,13 @@ To extract data from a relational database, you need to first register a **JDBC 1. In Corporate Memory, click Projects under **BUILD** in the navigation on the left side of the page. - ![Menu BUILD > Projects](incr-jdbc-menu-build-projects.png) + ![Menu BUILD > Projects](incr-jdbc-menu-build-projects.png){ class="bordered" } 2. Click **Create** at the top of the page. 3. In the Create new item window, select Project and click Add. The Create new item of type Project window appears. 4. In the Create new item window, select Dataset under **Item Type**, search for JDBC endpoint, and click **Add**. - ![Create JDBC Dataset](create-dataset-JDBC.png) + ![Create JDBC Dataset](create-dataset-JDBC.png){ class="bordered" } 5. Provide the required configuration details for the JDBC endpoint: - **Label**: Provide a table name. @@ -55,9 +55,9 @@ To extract data from a relational database, you need to first register a **JDBC - **User**: Provide the user name which is allowed to access the database. - **Password**: Provide the user password that is allowed to access the database. -![Configuration of a JDBC dataset](configure-JDBC-1.png) +![Configuration of a JDBC dataset](configure-JDBC-1.png){ class="bordered" } -![Configuration of a JDBC dataset](configure-JDBC-2.png) +![Configuration of a JDBC dataset](configure-JDBC-2.png){ class="bordered" } ## 2 Create a Metadata Graph @@ -75,7 +75,7 @@ In our example, the JDBC Endpoint IRI looks like this: _.snowflakecomputing.com/?`). +2. Snowflake specific property for the jar file location: `spark.sql.options.jdbc.snowflake.jar="/location/for/snowflake-*-jdbc.jar"` +3. Snowflake specific property for the driver class name: `spark.sql.options.jdbc.snowflake.name="com.snowflake.client.jdbc.SnowflakeDriver"` + +!!! example "Example configuration snippet" + + ```properties + # … + spark.sql.options { + # … + # configure Snowflake JDBC driver + jdbc.drivers = "snowflake" + jdbc.snowflake.jar = ${ELDS_HOME}"/etc/dataintegration/conf/snowflake-jdbc-3.13.30.jar" + jdbc.snowflake.name = "net.snowflake.client.jdbc.SnowflakeDriver" + # … + } + # … + ``` + +## 2. Create a database in Snowflake + +- Login to Snowflake enter the **username** and **password**, then click on **Sign in**. + +![image](snowflake-login.png){ width="50%" class="bordered" } + +- Click on **Database** on the left side of the page. + +![image](snowflake-click_on_database.png){ class="bordered" } + +- Click on **+Database** on the right side of the page. + +![image](snowflake-add-database.png){ class="bordered" } + +- Type the database name **Product**, then click on **Create**. + +![image](snowflake-product-name-database.png){ width="50%" class="bordered" } + +- Click on database **product**, then click on **+Schema** on the right side of the page. + +![image](snowflake-dd-schema.png){ class="bordered" } + +- Type the schema name **products_vocabulary** and click on **Create**. + +![image](snowflake-schema-name.png){ width="50%" class="bordered" } + +- Click on scheme **products_vocabulary** on the left side of the page then click on **Create** on the right side of the page, then click on **Table**, then select then **Standard**. + +![image](snowflake-click-on-standard.png){ class="bordered" } + +- Click on schema name **products_vocabulary** on the left side of the page and type the **sql query** for creating a table in the center, then click on **Run** on the right side of the page. + +You can create the _PRODUCT_ table with the following SQL query: + +```sql +CREATE TABLE product( + product_id VARCHAR(12) NOT NULL PRIMARY KEY + ,product_name VARCHAR(50) NOT NULL + ,height INTEGER NOT NULL + ,width INTEGER NOT NULL + ,depth INTEGER NOT NULL + ,weigth INTEGER NOT NULL + ,product_manager VARCHAR(50) NOT NULL + ,price VARCHAR(10) NOT NULL +) ; +``` + +- Type or copy the **SQL** query for creating a database in the table that is created, then click on **Run**. + +![image](snowflake-sql-for-table.png){ class="bordered" } + +In the **Worksheets** view (you might need to create a new worksheet), select the **product** database, the **products_vocabulary** schema and finally the **product** table. +Here you can populate some test data with the following SQL query: + +??? example "INSERT query" + + ```sql + INSERT INTO product(product_id,product_name,height,width,depth,weigth,product_manager,price) VALUES + ('I241-8776317','Strain Compensator',12,68,15,8,'Baldwin.Dirksen@company.org','0,50 EUR') + ,('D215-3449390','Gauge Crystal',77,58,19,15,'Wanja.Hoffmann@company.org','2,00 EUR') + ,('P925-8919074','Inductor Switch',72,61,13,8,'Sabrina.Geiger@company.org','1,86 EUR') + ,('P516-8211068','Film Multiplexer Rheostat Warp',80,57,15,6,'Kristen.Bauers@company.org','0,43 EUR') + ,('N558-1730215','Flow Coil Dipole Strain',43,12,14,14,'Kevin.Feigenbaum@company.org','1,62 EUR') + ,('Y274-1029755','Polymer Transistor Transformer',80,80,12,7,'Adolfina.Hoch@company.org','4,49 EUR') + ,('U360-2815908','Potentiometer Rheostat',65,19,14,3,'Manfred.Foth@company.org','3,09 EUR') + ,('O662-4012383','Resistor Crystal Encoder',70,60,18,19,'Karen.Brant@company.org','3,17 EUR') + ,('D642-3058791','Polymer LCD Dipole Switch',33,68,17,6,'Valda.Everhart@company.org','1,01 EUR') + ,('K167-1377420','Coil Potentiometer Transducer',58,16,17,5,'Siglind.Brinkerhoff@company.org','2,66 EUR') + ,('C977-9932879','Memristor Encoder',30,22,19,2,'Siglind.Brinkerhoff@company.org','3,79 EUR') + ,('E585-3605747','Resistor Dipole',30,67,16,6,'Heinrich.Hoch@company.org','1,09 EUR') + ,('Q523-3322183','Resistor Gauge Capacitor',13,46,13,3,'Lambert.Faust@company.org','2,76 EUR') + ,('G934-5417476','Aluminum Multiplexer Memristor Transformer',57,44,16,17,'Erhard.Fried@company.org','1,84 EUR') + ,('N180-3300253','Encoder Transducer',57,46,17,9,'Rebecca.Hall@company.org','1,35 EUR') + ,('X874-7370643','Network Resistor',54,29,20,10,'Franz.Kornhaeusel@company.org','1,94 EUR') + ,('H745-5284103','Gauge Breaker Compensator',76,51,17,5,'Manfred.Foth@company.org','0,23 EUR') + ,('L275-4377274','Inductor Transformer',27,52,19,6,'Lambert.Faust@company.org','1,23 EUR') + ,('R181-9365849','Log-periodic LCD Transformer',64,52,15,4,'Jarvis.Jans@company.org','2,40 EUR') + ,('U341-6920661','Capacitor Transducer',69,63,14,7,'Franziska.Acker@company.org','5,55 EUR') + ,('K764-8378288','Aluminum Resistor Warp',66,19,13,8,'Nadia.Schubert@company.org','5,06 EUR') + ,('I409-8215134','Film LCD Transducer',67,17,20,1,'Baldwin.Dirksen@company.org','2,46 EUR') + ,('X510-5668523','Coil Resistor Encoder',70,14,12,3,'Karch.Moeller@company.org','3,60 EUR') + ,('T792-4232124','Encoder',26,14,19,6,'Ulrik.Denzel@company.org','5,74 EUR') + ,('Y134-8040496','Oscillator Memristor',37,76,20,11,'Kristen.Bauers@company.org','1,85 EUR') + ,('V436-9027098','Polymer Gauge Crystal',37,14,14,5,'Gretel.Roth@company.org','1,97 EUR') + ,('P844-4114854','Field-effect Strain Compensator',42,73,12,19,'Herr.Haan.Bader@company.org','0,96 EUR') + ,('H389-3327633','Flow Driver Strain',36,36,11,14,'Miles.Amsel@company.org','0,16 EUR') + ,('J259-5185660','Memristor Encoder',40,55,12,16,'Heinrich.Hoch@company.org','4,86 EUR') + ,('I590-4406621','Heisenberg Coil Resistor Meter',32,78,17,12,'Sabrina.Bayer@company.org','0,60 EUR') + ,('A816-3021832','Rheostat Breaker',19,28,14,18,'Lili.Geier@company.org','3,86 EUR') + ,('E424-4700158','Rheostat Compensator Meter',72,58,20,1,'Sabrina.Bayer@company.org','1,80 EUR') + ,('K334-8882985','Network Resonator Encoder',21,49,17,10,'Bert.Blumstein@company.org','3,09 EUR') + ,('H690-4065164','Heisenberg Oscillator Memristor Meter',47,55,20,1,'Jarvis.Jans@company.org','1,81 EUR') + ,('J625-3464908','Sensor Crystal Warp',24,57,11,17,'Thomas.Mueller@company.org','0,75 EUR') + ,('V104-2082346','Flow Dipole Transformer',64,73,17,12,'Anamchara.Foerstner@company.org','3,36 EUR') + ,('R298-1578179','Gauge Strain Breaker',30,17,12,14,'Reiner.Widmann@company.org','4,45 EUR') + ,('O761-2575092','Switch Transformer Transducer',51,71,20,13,'Nadia.Schubert@company.org','4,18 EUR') + ,('N560-4369045','Resistor Compensator',21,57,11,4,'Herr.Burgh.Eichel@company.org','2,61 EUR') + ,('D903-5325470','Flow Crystal Rheostat',70,17,13,20,'Franziska.Acker@company.org','0,45 EUR') + ,('Y632-7948469','Multiplexer Coil',14,67,13,5,'Lili.Geier@company.org','2,24 EUR') + ,('O204-4321819','Field-effect Resistor Potentiometer Rheostat',76,14,19,7,'Karch.Moeller@company.org','5,86 EUR') + ,('C527-6179790','LCD Oscillator Sensor',67,61,13,2,'Arnelle.Gerber@company.org','0,16 EUR') + ,('A981-3634031','Driver Memristor',50,59,20,13,'Jarvis.Jans@company.org','5,55 EUR') + ,('R774-2450170','Log-periodic Network Warp',16,19,13,9,'Ida.Halle@company.org','5,23 EUR') + ,('E709-4829800','Transducer Warp',18,14,13,18,'Henny.Foth@company.org','4,51 EUR') + ,('W268-8954866','Gauge Warp',15,24,11,9,'Ida.Halle@company.org','3,80 EUR') + ,('J628-9483622','Field-effect Transistor Crystal',77,76,13,16,'Emil.Gotti@company.org','0,16 EUR') + ,('E661-6880042','Crystal Rheostat Breaker',76,39,20,10,'Adolfina.Hoch@company.org','2,60 EUR') + ,('F553-8518538','Aluminum Sensor Capacitor',52,39,14,3,'Lambert.Faust@company.org','2,99 EUR') + ,('P982-4384687','Oscillator Sensor Resonator',47,62,11,4,'Franz.Kornhaeusel@company.org','4,40 EUR') + ,('R187-6602262','Film Resistor Crystal Encoder',61,67,11,8,'Reiner.Widmann@company.org','1,27 EUR') + ,('N478-8857002','Transformer Capacitor Breaker',19,32,11,12,'Nadia.Schubert@company.org','3,33 EUR') + ,('I884-8763759','Ceramic Inductor Breaker',69,22,19,11,'Bert.Blumstein@company.org','2,64 EUR') + ,('F424-2241578','Strain Meter',66,79,11,9,'Elena.Herzog@company.org','1,80 EUR') + ,('J178-5863159','Crystal Transducer',38,13,20,7,'Waldtraud.Kuttner@company.org','4,82 EUR') + ,('C699-1385746','Resistor Driver Breaker',59,59,17,4,'Herr.Haan.Bader@company.org','5,97 EUR') + ,('L433-1376544','LCD Gauge Warp',25,12,18,7,'Liese.Adam@company.org','0,78 EUR') + ,('O270-3409076','Flow Network Dipole Warp',55,33,19,4,'Corinna.Ludwig@company.org','2,05 EUR') + ,('T592-5377501','Field-effect Strain Capacitor',13,63,13,5,'Berlin.Schulz@company.org','4,28 EUR') + ,('F383-6450755','Strain Encoder',33,53,11,17,'Frauke.Faerber@company.org','0,25 EUR') + ,('K313-8452822','Heisenberg Crystal Transformer',15,71,18,17,'Franz.Kornhaeusel@company.org','2,92 EUR') + ,('C844-8161134','Crystal Compensator',19,39,13,11,'Miles.Amsel@company.org','2,90 EUR') + ,('E296-9034321','Heisenberg Inductor Breaker Encoder',63,11,12,6,'Corinna.Ludwig@company.org','4,09 EUR') + ,('A548-4778785','Coil Potentiometer Dipole',45,36,18,20,'Frauke.Faerber@company.org','0,41 EUR') + ,('E563-8448172','Warp Capacitor Meter',20,57,13,14,'Lili.Geier@company.org','5,78 EUR') + ,('E267-7496794','Crystal Rheostat',34,47,11,6,'Frau.Irmalinda‚Äò.Becker@company.org','1,11 EUR') + ,('V881-4674578','Planck Dipole Driver Crystal',73,24,16,2,'Dietlinde.Boehme@company.org','4,23 EUR') + ,('R112-2955867','Oscillator Encoder Compensator',53,67,13,14,'Sylvester.Brant@company.org','0,64 EUR') + ,('H577-3512936','Film Coil Crystal Strain',52,46,17,15,'Arnelle.Gerber@company.org','0,10 EUR') + ,('U990-5234138','LCD Inductor',15,78,16,15,'Anamchara.Foerstner@company.org','1,52 EUR') + ,('E358-6492536','Resistor Crystal',40,69,11,15,'Reiner.Widmann@company.org','2,18 EUR') + ,('R287-3749176','Log-periodic Memristor Encoder',64,14,17,12,'Manfred.Foth@company.org','3,78 EUR') + ,('N915-2423517','Aluminum Encoder Transformer Meter',47,75,20,1,'Frauke.Faerber@company.org','4,02 EUR') + ,('C770-9751514','Transistor Resonator Breaker',74,45,17,1,'Xochitl.Aue@company.org','4,97 EUR') + ,('X863-5063447','Coil Potentiometer Transducer',41,53,19,2,'Thomas.Mueller@company.org','5,69 EUR') + ,('Z553-4314789','Dipole Capacitor',76,11,15,1,'Marius.Fux@company.org','3,23 EUR') + ,('M244-7026376','Coil Compensator',34,55,17,11,'Sabrina.Geiger@company.org','3,22 EUR') + ,('J859-3337215','Inductor Memristor',74,50,13,14,'Liese.Adam@company.org','5,59 EUR') + ,('R786-6586508','Coil LCD Rheostat',42,32,19,19,'Thomas.Mueller@company.org','1,79 EUR') + ,('G858-9670227','Network Transducer',57,39,15,5,'Siglind.Brinkerhoff@company.org','0,38 EUR') + ,('J884-3242067','Network Inductor',29,26,18,3,'Sabrina.Geiger@company.org','2,57 EUR') + ,('F812-7003324','Rheostat Compensator',31,56,15,18,'Baldwin.Guenther@company.org','1,73 EUR') + ,('U507-1853778','LCD Dipole Capacitor',45,78,18,13,'Lili.Geier@company.org','2,93 EUR') + ,('M253-4759368','Multiplexer Resonator',71,66,12,1,'Ratt.Hartmann@company.org','4,16 EUR') + ,('Y185-1184618','Gauge Compensator',12,38,14,12,'Waldtraud.Kuttner@company.org','1,64 EUR') + ,('J481-5585150','Multiplexer Potentiometer Strain',77,19,14,9,'Wolfgang.Martin@company.org','5,81 EUR') + ,('Z452-1805723','Capacitor Switch',34,67,17,11,'Yanka.Schreiber@company.org','3,24 EUR') + ,('F525-2265345','Oscillator Driver',12,39,13,19,'Sigmund.Gros@company.org','0,85 EUR') + ,('N279-5579447','Sensor Potentiometer Dipole',30,16,17,12,'Sigmund.Gros@company.org','0,28 EUR') + ,('F326-8777433','Polymer Inductor Transistor Warp',23,22,18,18,'Herr.Haan.Bader@company.org','2,68 EUR') + ,('A998-9941987','Flow Compensator',55,18,11,1,'Herr.Haan.Bader@company.org','5,29 EUR') + ,('F611-6226129','Phase LCD Dipole',59,62,12,3,'Jarvis.Jans@company.org','5,33 EUR') + ,('I314-5607546','Polymer Resistor Dipole Gauge',57,69,16,7,'Yanka.Schreiber@company.org','5,06 EUR') + ,('W988-3702091','Inductor Rheostat Warp',79,35,12,12,'Kevin.Feigenbaum@company.org','5,65 EUR') + ,('X663-2500265','Transformer Transducer',47,27,19,1,'Arnelle.Gerber@company.org','4,78 EUR') + ,('M750-1800450','Crystal Encoder',26,51,14,10,'Wolfgang.Martin@company.org','2,68 EUR') + ,('W156-1748173','Crystal Rheostat Warp',58,11,11,13,'Jarvis.Jans@company.org','2,50 EUR') + ,('Z739-3332146','Polymer LCD Transistor',39,58,17,7,'Erhard.Fried@company.org','3,29 EUR') + ,('J872-7568181','Encoder Breaker',18,37,16,8,'Berlin.Schulz@company.org','1,22 EUR') + ,('L485-8083934','Inductor Warp Switch',68,20,15,7,'Valda.Everhart@company.org','0,78 EUR') + ,('J628-3649699','Breaker Meter',78,34,17,15,'Nadia.Schubert@company.org','4,21 EUR') + ,('T831-2675171','Planck Coil Oscillator',40,24,13,20,'Bert.Blumstein@company.org','2,26 EUR') + ,('B436-6020212','Potentiometer Crystal',59,18,14,19,'Minnie.Kuehn@company.org','3,59 EUR') + ,('L691-1489542','Phase Multiplexer Driver Capacitor',62,55,13,14,'Lukas.Gerver@company.org','3,77 EUR') + ,('T808-9704137','Gauge Encoder Breaker',48,39,18,9,'Karch.Moeller@company.org','3,22 EUR') + ,('P774-3681449','Resonator Switch',52,35,13,19,'Karen.Brant@company.org','1,82 EUR') + ,('I264-7314323','Film Inductor Memristor',66,24,19,11,'Yanka.Schreiber@company.org','3,39 EUR') + ,('R477-9013874','Coil Warp',76,46,17,6,'Berlin.Schulz@company.org','5,88 EUR') + ,('Y467-5818685','Memristor Compensator',22,30,18,1,'Bert.Blumstein@company.org','3,93 EUR') + ,('N673-7692368','Driver Resonator',65,60,15,13,'Nadia.Schubert@company.org','5,57 EUR') + ,('E576-3538706','Encoder Breaker',45,55,14,8,'Lili.Geier@company.org','4,27 EUR') + ,('B507-9536014','LCD Network',48,49,17,11,'Sylvester.Brant@company.org','1,76 EUR') + ,('P253-1288849','Dipole Compensator',55,24,12,15,'Sylvester.Brant@company.org','0,98 EUR') + ,('S418-2584457','Bipolar-junction Dipole',17,47,13,16,'Ratt.Beyer@company.org','4,32 EUR') + ,('V940-2277346','Aluminum Oscillator Potentiometer Encoder',78,52,18,2,'Manfred.Foth@company.org','4,16 EUR') + ,('P323-7286189','Sensor Encoder Warp',16,27,16,14,'Reiner.Widmann@company.org','1,66 EUR') + ,('T341-6404509','LCD Transducer Meter',78,29,20,17,'Marius.Fux@company.org','0,39 EUR') + ,('S388-7116324','Polymer Inductor Transistor Oscillator',44,66,11,11,'Emil.Gotti@company.org','1,70 EUR') + ,('G439-8153345','Memristor Driver Breaker',52,49,13,10,'Henny.Foth@company.org','2,33 EUR') + ,('F496-3982542','Resonator Rheostat Breaker',67,27,11,16,'Herr.Burgh.Eichel@company.org','2,79 EUR') + ,('G494-2537921','Coil Encoder Switch',62,59,13,11,'Kevin.Feigenbaum@company.org','3,16 EUR') + ,('D516-5106885','Driver Rheostat Capacitor',54,42,13,1,'Herr.Burgh.Eichel@company.org','0,96 EUR') + ,('R902-1645052','Film Network Gauge Compensator',72,65,11,8,'Emil.Gotti@company.org','0,65 EUR') + ,('P494-3529490','Ceramic Crystal Switch',76,64,12,9,'Henny.Foth@company.org','1,72 EUR') + ,('K199-8327732','Phase Transistor Crystal',49,79,13,12,'Karen.Brant@company.org','3,60 EUR') + ,('C200-5363446','Network Transducer',27,59,12,3,'Ratt.Beyer@company.org','4,55 EUR') + ,('P785-3702584','Log-periodic Multiplexer Potentiometer Memristor',59,26,18,6,'Sylvester.Brant@company.org','4,57 EUR') + ,('L940-7353182','Resonator Warp',41,28,18,20,'Ida.Halle@company.org','3,21 EUR') + ,('H747-8053953','Resonator Meter',25,37,16,1,'Elisabeth.Harman@company.org','0,52 EUR') + ,('U681-7406159','Film Driver Switch',68,73,14,8,'Sabrina.Bayer@company.org','0,27 EUR') + ,('A360-3041803','Inductor Transformer Warp',33,62,14,16,'Marius.Fux@company.org','4,89 EUR') + ,('F675-6890144','Resistor Inductor Strain',66,31,12,10,'Arnelle.Gerber@company.org','1,06 EUR') + ,('E938-3071637','LCD Dipole',15,24,15,17,'Ida.Halle@company.org','5,44 EUR') + ,('Q694-8417409','Sensor Crystal',58,55,15,9,'Baldwin.Dirksen@company.org','2,44 EUR') + ,('K780-7736227','Driver Rheostat',18,36,14,20,'Ida.Halle@company.org','2,95 EUR') + ,('E365-4375068','Strain Compensator',72,28,17,17,'Bert.Blumstein@company.org','2,09 EUR') + ,('M774-4843227','Breaker Transducer',38,21,18,18,'Dietlinde.Boehme@company.org','1,32 EUR') + ,('A994-9085459','LCD Compensator',41,49,18,5,'Franziska.Acker@company.org','4,08 EUR') + ,('X204-1803083','Crystal Strain Compensator',18,33,14,20,'Karen.Brant@company.org','5,67 EUR') + ,('H197-3970480','Coil Gauge Transformer',56,72,19,6,'Valda.Everhart@company.org','5,55 EUR') + ,('L827-5554014','Flow Oscillator Dipole',80,15,18,8,'Corinna.Ludwig@company.org','5,58 EUR') + ,('L103-3316729','Multiplexer Potentiometer',49,66,12,9,'Siglind.Brinkerhoff@company.org','3,69 EUR') + ,('C171-3616793','Coil Resonator Capacitor',16,70,12,8,'Wanja.Hoffmann@company.org','2,34 EUR') + ,('W780-8057984','Planck Transformer Compensator',52,67,11,20,'Kevin.Feigenbaum@company.org','2,46 EUR') + ,('I395-2294150','Gauge Resonator',80,65,13,10,'Heinrich.Hoch@company.org','0,00 EUR') + ,('M367-8246717','Potentiometer Gauge Warp',56,54,20,7,'Miles.Amsel@company.org','1,07 EUR') + ,('Z165-5413714','Gauge Transducer',13,59,16,10,'Franz.Kornhaeusel@company.org','2,05 EUR') + ,('E246-3200290','Field-effect Network Rheostat',75,28,12,13,'Dietlinde.Boehme@company.org','1,06 EUR') + ,('U733-5722614','Network Breaker Compensator',62,17,13,5,'Ulrik.Denzel@company.org','2,14 EUR') + ,('T735-5591779','Memristor Encoder',48,34,20,12,'Manfred.Foth@company.org','0,22 EUR') + ,('W726-4190110','Ceramic Multiplexer Transistor LCD',43,41,12,10,'Ratt.Hartmann@company.org','4,90 EUR') + ,('F204-7999856','Meter Warp',52,37,14,8,'Elisabeth.Harman@company.org','5,99 EUR') + ,('N773-8807466','Multiplexer Switch',79,18,17,18,'Elisabeth.Harman@company.org','5,77 EUR') + ,('L984-7886943','Resistor Oscillator',23,33,13,8,'Sabrina.Geiger@company.org','0,18 EUR') + ,('F735-3322876','Planck Potentiometer Capacitor',68,15,19,13,'Xochitl.Aue@company.org','0,95 EUR') + ,('N832-1055352','Coil Driver',25,13,12,13,'Elisabeth.Harman@company.org','3,48 EUR') + ,('R410-7957011','Planck Network Dipole',22,79,15,2,'Emil.Gotti@company.org','5,07 EUR') + ,('Z373-9393076','Resonator Transformer',40,71,17,10,'Franziska.Acker@company.org','5,45 EUR') + ,('H956-3958783','Aluminum Resistor Transistor Transformer',18,40,11,14,'Elisabeth.Harman@company.org','4,57 EUR') + ,('H482-4970770','Transistor Rheostat Switch',21,71,11,1,'Marius.Fux@company.org','2,84 EUR') + ,('D483-7794770','Memristor Gauge',20,69,20,1,'Herr.Haan.Bader@company.org','2,12 EUR') + ,('I892-8435352','Heisenberg LCD Driver',55,30,11,3,'Sigmund.Gros@company.org','4,19 EUR') + ,('G547-8961166','Bipolar-junction Oscillator Compensator',51,51,12,15,'Siglind.Brinkerhoff@company.org','0,81 EUR') + ,('B161-8326597','Inductor Potentiometer',65,27,20,14,'Waldtraud.Kuttner@company.org','5,68 EUR') + ,('L760-6079543','Resistor Breaker',24,35,17,4,'Thomas.Mueller@company.org','1,49 EUR') + ,('O256-6180697','Heisenberg Rheostat Switch',31,49,17,2,'Bert.Blumstein@company.org','5,42 EUR') + ,('V285-7238338','LCD Inductor',61,25,12,14,'Bert.Blumstein@company.org','2,55 EUR') + ,('Q992-9818584','Flow Oscillator Inductor Compensator',12,27,18,2,'Nadia.Schubert@company.org','3,20 EUR') + ,('Y695-6135491','Polymer Warp',76,49,20,16,'Arendt.Beitel@company.org','4,59 EUR') + ,('Y966-2972645','Field-effect Driver',30,42,14,4,'Wolfgang.Martin@company.org','0,89 EUR') + ,('W434-6067873','Network Encoder',24,65,11,17,'Gretel.Roth@company.org','1,87 EUR') + ,('U889-6360502','Encoder Capacitor Compensator',40,35,12,19,'Adolfina.Hoch@company.org','5,07 EUR') + ,('Z170-8513315','Sensor Crystal Resonator',23,52,16,20,'Anamchara.Foerstner@company.org','5,57 EUR') + ,('C409-9349178','Multiplexer Rheostat Encoder',35,80,15,6,'Ulrik.Denzel@company.org','4,77 EUR') + ,('B131-7597100','LCD Sensor Transducer',51,44,16,18,'Sabrina.Geiger@company.org','3,70 EUR') + ,('N869-4606944','Film Memristor Compensator',57,63,16,18,'Sigmund.Gros@company.org','3,11 EUR') + ,('H973-6742173','Bipolar-junction Transistor Transformer',78,75,17,15,'Arendt.Beitel@company.org','0,21 EUR') + ,('M210-9470943','Network Transducer',75,27,16,6,'Siglind.Brinkerhoff@company.org','4,94 EUR') + ,('J209-5198739','Phase Memristor Capacitor',15,28,14,4,'Wolfgang.Martin@company.org','3,87 EUR') + ,('L205-6345377','Planck Coil Potentiometer',51,57,15,10,'Kevin.Feigenbaum@company.org','4,65 EUR') + ,('C633-6541408','Field-effect Potentiometer Transformer Switch',59,14,12,5,'Adolfina.Hoch@company.org','5,28 EUR') + ,('G205-5318100','LCD Gauge',41,79,11,15,'Elena.Herzog@company.org','5,90 EUR') + ,('R135-6598379','Capacitor Meter',54,33,16,8,'Reiner.Widmann@company.org','5,52 EUR') + ,('Z222-5977620','Transformer Switch',80,14,14,13,'Minnie.Kuehn@company.org','4,94 EUR') + ,('V787-2710358','Ceramic Sensor Encoder',62,71,18,5,'Jarvis.Jans@company.org','4,18 EUR') + ,('W892-1983772','Log-periodic Coil Sensor Transducer',55,68,12,12,'Yanka.Schreiber@company.org','4,86 EUR') + ,('Y440-4146454','Resistor Memristor',77,74,18,12,'Arendt.Beitel@company.org','1,40 EUR') + ,('E529-9160800','Network Inductor',16,62,12,19,'Arendt.Beitel@company.org','3,83 EUR') + ,('E355-4376121','Film Oscillator Dipole',57,50,17,2,'Karch.Moeller@company.org','5,53 EUR') + ,('W988-9267091','Transistor Strain',66,58,11,3,'Sabrina.Geiger@company.org','1,40 EUR') + ,('X517-5656435','Multiplexer Capacitor',35,32,15,15,'Karen.Brant@company.org','5,45 EUR') + ,('J824-9483042','Dipole Resonator Breaker',38,38,18,17,'Manfred.Foth@company.org','2,58 EUR') + ,('M292-6646786','Phase Sensor Crystal Capacitor',33,64,12,19,'Emil.Gotti@company.org','4,18 EUR') + ,('M703-4614993','Coil Potentiometer Transducer',77,66,13,4,'Miles.Amsel@company.org','5,11 EUR') + ,('P903-7514284','Dipole Capacitor',47,56,20,14,'Reiner.Widmann@company.org','5,97 EUR') + ,('I122-1391097','Inductor Memristor Oscillator',40,32,13,19,'Karch.Moeller@company.org','3,67 EUR') + ,('D817-8084362','Multiplexer Resistor Compensator',74,79,20,19,'Heinrich.Hoch@company.org','2,53 EUR') + ,('W744-1785439','Film Multiplexer Dipole Strain',62,74,19,8,'Ulrik.Denzel@company.org','1,98 EUR') + ,('C402-5072074','Coil Inductor Encoder',27,49,17,12,'Herr.Haan.Bader@company.org','0,76 EUR') + ,('E660-5579477','Film Oscillator Transistor Capacitor',41,38,14,1,'Berlin.Schulz@company.org','0,38 EUR') + ,('W776-4360677','Field-effect Transducer Meter',75,77,14,13,'Franziska.Acker@company.org','3,26 EUR') + ,('F179-4094930','Bipolar-junction Sensor Crystal',27,24,19,12,'Adolfina.Hoch@company.org','2,96 EUR') + ,('Z293-3675192','Ceramic Potentiometer Gauge Encoder',79,56,13,7,'Nadia.Schubert@company.org','2,33 EUR') + ,('B818-8738213','Crystal Capacitor',37,52,11,17,'Berlin.Schulz@company.org','2,45 EUR') + ,('A243-3332548','Bipolar-junction Crystal Meter',43,46,17,10,'Ulrik.Denzel@company.org','3,18 EUR') + ,('G420-6271055','Potentiometer Driver',70,36,17,13,'Kristen.Bauers@company.org','1,82 EUR') + ,('R930-5997475','Coil Driver Capacitor',31,61,15,13,'Minnie.Kuehn@company.org','4,33 EUR') + ,('J129-5121523','Inductor Driver Transducer',20,63,18,11,'Reiner.Widmann@company.org','0,23 EUR') + ,('Y162-1430218','Ceramic Dipole Memristor Breaker',28,63,13,11,'Jarvis.Jans@company.org','4,11 EUR') + ,('K630-6895992','LCD Gauge Switch',34,58,13,17,'Ratt.Hartmann@company.org','1,58 EUR') + ,('Z190-5822042','Polymer Multiplexer Crystal Capacitor',48,60,12,10,'Jarvis.Jans@company.org','0,20 EUR') + ,('J734-1368842','Inductor Gauge Meter',55,70,18,7,'Baldwin.Guenther@company.org','4,99 EUR') + ,('H664-9736043','Log-periodic Potentiometer Resonator',18,40,20,19,'Lambert.Faust@company.org','5,02 EUR') + ,('C614-4108640','Log-periodic LCD Breaker',27,75,18,14,'Bert.Blumstein@company.org','1,79 EUR') + ,('N377-1619045','Capacitor Encoder Compensator',47,70,13,2,'Corinna.Ludwig@company.org','5,70 EUR') + ,('S424-4152456','Potentiometer',22,17,19,12,'Lambert.Faust@company.org','0,45 EUR') + ,('T319-6530857','Sensor Transducer',43,41,20,15,'Sigmund.Gros@company.org','1,37 EUR') + ,('S680-6146547','Rheostat Capacitor',68,57,20,5,'Erhard.Fried@company.org','1,04 EUR') + ,('V437-5667353','Sensor Driver Strain',36,14,20,3,'Emil.Gotti@company.org','0,84 EUR') + ,('P717-5835879','Rheostat Transformer',22,43,13,14,'Ulrik.Denzel@company.org','5,31 EUR') + ,('X234-5007377','Polymer Multiplexer Potentiometer Resistor',21,73,19,7,'Dieterich.Blau@company.org','5,38 EUR') + ,('V673-7881809','Heisenberg Resistor Resonator Compensator',57,56,15,13,'Dieterich.Blau@company.org','0,26 EUR') + ,('E471-9316820','Bipolar-junction Coil Dipole Transformer',65,56,14,14,'Anamchara.Foerstner@company.org','2,66 EUR') + ,('S429-3352092','Dipole Switch',77,41,14,17,'Henny.Foth@company.org','2,16 EUR') + ,('E189-1255687','LCD Potentiometer Breaker',79,13,13,18,'Rebecca.Hall@company.org','2,68 EUR') + ,('Z617-4660142','Ceramic Potentiometer Compensator',15,41,16,12,'Arnelle.Gerber@company.org','3,37 EUR') + ,('W493-4799721','Network Warp',64,50,16,20,'Kristen.Bauers@company.org','5,69 EUR') + ,('H338-7439287','Field-effect Resistor Potentiometer Meter',21,51,15,2,'Franz.Kornhaeusel@company.org','1,69 EUR') + ,('T348-1607769','LCD Resistor Sensor',36,14,16,10,'Kristen.Bauers@company.org','1,27 EUR') + ,('B365-4394675','Flow Gauge Resonator Breaker',27,13,13,12,'Kevin.Feigenbaum@company.org','2,50 EUR') + ,('R231-2442628','Transformer Transducer',58,20,14,9,'Frau.Irmalinda‚Äò.Becker@company.org','3,29 EUR') + ,('R383-8831143','Flow Potentiometer Resonator',41,47,12,16,'Franziska.Acker@company.org','1,14 EUR') + ,('V509-7873455','LCD Potentiometer Transformer',61,14,17,13,'Yanka.Schreiber@company.org','2,40 EUR') + ,('W903-2104201','Bipolar-junction Encoder Compensator',52,66,15,15,'Baldwin.Guenther@company.org','5,28 EUR') + ,('R675-2629492','Sensor Breaker Warp',56,67,13,7,'Emil.Gotti@company.org','1,81 EUR') + ,('N823-7028680','LCD Potentiometer Switch',58,57,18,9,'Arendt.Beitel@company.org','3,76 EUR') + ,('Y616-2122188','Potentiometer Driver',49,63,11,14,'Henny.Foth@company.org','5,42 EUR') + ,('H426-2605604','Film Network Multiplexer Compensator',15,22,12,2,'Miles.Amsel@company.org','2,57 EUR') + ,('N105-3985051','Multiplexer Resistor',71,49,19,20,'Lukas.Gerver@company.org','1,83 EUR') + ,('S915-2398244','Bipolar-junction Capacitor Crystal Breaker',41,76,19,19,'Nadia.Schubert@company.org','4,52 EUR') + ,('V178-8820348','LCD Inductor',60,16,20,11,'Herr.Burgh.Eichel@company.org','2,30 EUR') + ,('H660-8942410','Sensor Warp',39,53,20,2,'Waldtraud.Kuttner@company.org','4,24 EUR') + ,('W769-8151254','Field-effect LCD Multiplexer Capacitor',66,40,12,12,'Thomas.Mueller@company.org','3,57 EUR') + ,('I571-8597034','Transistor Compensator',51,74,17,7,'Manfred.Foth@company.org','0,49 EUR') + ,('D965-2729258','Film Sensor Switch',48,68,13,3,'Elena.Herzog@company.org','0,03 EUR') + ,('D605-8095260','Network Inductor',38,64,19,18,'Gretel.Roth@company.org','2,31 EUR') + ,('A837-2549775','LCD Gauge',25,46,18,19,'Siglind.Brinkerhoff@company.org','3,23 EUR') + ,('R599-8820686','Film Sensor Dipole',31,67,14,5,'Liese.Adam@company.org','2,58 EUR') + ,('Y728-2083256','Gauge Crystal Encoder',51,31,13,14,'Ratt.Hartmann@company.org','1,74 EUR') + ,('C799-8367143','Coil Strain Meter',32,50,20,4,'Frau.Irmalinda‚Äò.Becker@company.org','2,28 EUR') + ,('X148-3354774','Multiplexer Compensator',25,44,18,3,'Lili.Geier@company.org','2,04 EUR') + ,('I966-3317124','Dipole Breaker Transducer',14,51,14,7,'Elena.Herzog@company.org','3,64 EUR') + ,('X946-6308579','Field-effect Resistor Encoder',43,48,12,11,'Baldwin.Guenther@company.org','4,00 EUR') + ,('D690-6928884','Flow Network Oscillator Encoder',71,50,17,3,'Sabrina.Bayer@company.org','1,54 EUR') + ,('F565-7076382','Dipole Resonator Transducer',54,21,19,10,'Manfred.Foth@company.org','1,40 EUR') + ,('U714-9883090','Aluminum Multiplexer LCD Capacitor',73,33,13,1,'Wanja.Hoffmann@company.org','1,07 EUR') + ,('P228-7323906','Bipolar-junction Network Inductor Oscillator',36,38,12,3,'Anamchara.Foerstner@company.org','1,39 EUR') + ,('C916-8310851','Bipolar-junction Oscillator Transformer',34,23,18,19,'Sabrina.Geiger@company.org','1,71 EUR') + ,('N269-8309461','LCD Potentiometer Warp',41,17,12,9,'Sabrina.Bayer@company.org','4,99 EUR') + ,('B120-9942467','Coil Driver',45,66,12,3,'Henny.Foth@company.org','1,06 EUR') + ,('U967-6553099','Bipolar-junction Gauge Warp',52,80,14,19,'Sabrina.Geiger@company.org','2,82 EUR') + ,('V759-7427700','LCD Dipole Resonator',53,29,17,19,'Ratt.Beyer@company.org','2,21 EUR') + ,('N583-9253059','Dipole Breaker',68,12,17,7,'Manfred.Foth@company.org','1,06 EUR') + ,('Z775-8853334','Aluminum Multiplexer Dipole',33,63,18,8,'Nadia.Schubert@company.org','3,89 EUR') + ,('E917-4866901','Capacitor Warp',15,52,14,5,'Dietlinde.Boehme@company.org','0,42 EUR') + ,('M175-2087039','Film Oscillator',28,70,17,1,'Franziska.Acker@company.org','2,18 EUR') + ,('W985-1612943','Aluminum Switch',31,38,13,13,'Sylvester.Brant@company.org','1,48 EUR') + ,('C119-5354812','Planck Sensor Strain',19,68,18,11,'Sabrina.Geiger@company.org','0,40 EUR') + ,('L619-5092078','Crystal Resonator Transformer',44,66,16,20,'Wolfgang.Martin@company.org','5,97 EUR') + ,('E652-6887116','Gauge Compensator',26,56,17,3,'Franziska.Acker@company.org','2,29 EUR') + ,('E617-6594892','Field-effect Driver Strain Compensator',37,56,13,8,'Wanja.Hoffmann@company.org','4,38 EUR') + ,('M449-5231838','Transistor Crystal',50,30,17,12,'Miles.Amsel@company.org','4,22 EUR') + ,('J856-1304399','Resistor Transducer',72,54,11,13,'Xochitl.Aue@company.org','2,88 EUR') + ,('W295-9452529','Sensor Encoder',67,72,14,7,'Lukas.Gerver@company.org','5,90 EUR') + ,('X235-5406274','Sensor Transducer',15,34,16,7,'Franz.Kornhaeusel@company.org','3,00 EUR') + ,('F330-3792974','Coil',51,23,12,5,'Sigmund.Gros@company.org','3,13 EUR') + ,('S840-8753783','Polymer Multiplexer Sensor',80,21,20,14,'Yanka.Schreiber@company.org','0,36 EUR') + ,('A607-3251492','Bipolar-junction Transistor Compensator',63,51,11,6,'Bert.Blumstein@company.org','2,79 EUR') + ,('T814-8858070','Multiplexer Transistor',40,60,19,16,'Karch.Moeller@company.org','2,54 EUR') + ,('B541-8783084','Flow Potentiometer Gauge',30,28,12,14,'Minnie.Kuehn@company.org','0,76 EUR') + ,('Q176-6210359','Oscillator Transistor Crystal',74,28,20,10,'Valda.Everhart@company.org','5,56 EUR') + ,('U128-5766392','Multiplexer Resistor',35,73,17,14,'Liese.Adam@company.org','1,48 EUR') + ,('C551-8482722','Planck Transducer',39,40,16,17,'Jarvis.Jans@company.org','2,22 EUR') + ,('L569-8145670','Capacitor Transistor Compensator',35,45,17,1,'Arendt.Beitel@company.org','2,85 EUR') + ,('F251-2666285','Bipolar-junction Strain Transducer',43,60,20,18,'Frauke.Faerber@company.org','0,11 EUR') + ,('J154-2269983','Capacitor Compensator',48,34,17,4,'Elena.Herzog@company.org','4,85 EUR') + ,('S877-1860797','Driver Transistor',53,26,16,11,'Gretel.Roth@company.org','3,95 EUR') + ,('W521-8006606','Flow Memristor Transistor Compensator',65,31,12,6,'Elena.Herzog@company.org','0,02 EUR') + ,('I679-1230971','Memristor Compensator',64,55,18,1,'Berlin.Schulz@company.org','1,74 EUR') + ,('Q881-7871943','Oscillator Resonator Compensator',45,53,17,4,'Wolfgang.Martin@company.org','5,93 EUR') + ,('X342-6389543','Planck Resistor Crystal Breaker',80,71,13,8,'Sabrina.Geiger@company.org','3,81 EUR') + ,('E813-9861759','Ceramic Memristor Warp',24,16,19,17,'Elena.Herzog@company.org','1,62 EUR') + ,('L173-2699667','Coil LCD',51,70,16,17,'Bert.Blumstein@company.org','4,44 EUR') + ,('S859-8143033','Field-effect Breaker Strain Transformer',63,74,13,20,'Xochitl.Aue@company.org','0,08 EUR') + ,('E558-1962104','Planck Breaker Compensator',64,58,13,20,'Miles.Amsel@company.org','5,12 EUR') + ,('H660-6112027','Network Multiplexer Encoder',62,74,16,10,'Manfred.Foth@company.org','3,89 EUR') + ,('N982-3577798','Network Transformer',68,28,11,16,'Manfred.Foth@company.org','3,78 EUR') + ,('X407-9945990','Transistor Breaker',55,61,17,17,'Yanka.Schreiber@company.org','2,36 EUR') + ,('M650-8586992','Memristor Gauge',59,28,14,4,'Lambert.Faust@company.org','4,88 EUR') + ,('Z887-4941382','Encoder Compensator',51,15,13,10,'Kristen.Bauers@company.org','4,57 EUR') + ,('J986-8306638','Phase Multiplexer Crystal Transducer',15,39,20,5,'Wanja.Hoffmann@company.org','0,81 EUR') + ,('C431-5986267','Transformer Meter',16,26,17,5,'Ulrik.Denzel@company.org','2,09 EUR') + ,('I468-8034393','Network Rheostat',23,49,17,5,'Wolfgang.Martin@company.org','3,79 EUR') + ,('L748-3922794','Phase Driver Switch',70,74,14,9,'Lili.Geier@company.org','1,40 EUR') + ,('B934-4668099','Sensor Potentiometer',79,43,15,14,'Karen.Brant@company.org','3,08 EUR') + ,('O944-9764063','Inductor Memristor Resonator',50,59,11,5,'Heinrich.Hoch@company.org','5,38 EUR') + ,('L365-6842646','Driver Transducer',23,22,12,2,'Sigmund.Gros@company.org','1,70 EUR') + ,('E502-4333702','Heisenberg Resistor Gauge Dipole',15,22,16,1,'Minnie.Kuehn@company.org','0,38 EUR') + ,('J234-3498557','Inductor Driver Breaker',50,28,16,7,'Wolfgang.Martin@company.org','5,92 EUR') + ,('Q516-8248086','Transducer Switch',24,30,20,9,'Lili.Geier@company.org','5,41 EUR') + ,('P360-3533771','Aluminum Transducer Capacitor Switch',46,31,13,9,'Waldtraud.Kuttner@company.org','2,45 EUR') + ,('K367-1320550','Strain Encoder',62,27,16,8,'Dietlinde.Boehme@company.org','4,08 EUR') + ,('M812-1436368','Bipolar-junction Crystal Rheostat',25,42,11,8,'Adolfina.Hoch@company.org','2,03 EUR') + ,('A750-6901242','Film Resistor Memristor Meter',37,37,19,4,'Kristen.Bauers@company.org','5,49 EUR') + ,('B150-4370781','Planck Coil Crystal Meter',31,52,14,18,'Ulrik.Denzel@company.org','5,87 EUR') + ,('D160-4387774','Gauge Transformer',56,26,12,17,'Herr.Burgh.Eichel@company.org','5,51 EUR') + ,('S176-7294665','Planck Gauge Compensator',23,64,16,15,'Ulrik.Denzel@company.org','0,76 EUR') + ,('L189-7913415','Oscillator Warp',57,33,14,11,'Baldwin.Dirksen@company.org','5,95 EUR') + ,('C917-9516418','LCD Coil',73,32,18,16,'Miles.Amsel@company.org','3,30 EUR') + ,('R725-9753976','Coil Resistor Encoder',44,66,11,13,'Baldwin.Dirksen@company.org','3,31 EUR') + ,('T721-4459242','Coil Compensator',38,56,14,16,'Marius.Fux@company.org','5,55 EUR') + ,('U229-5087557','Log-periodic Sensor Inductor Transistor',58,19,19,14,'Ida.Halle@company.org','2,12 EUR') + ,('L371-9651048','Inductor Sensor',30,61,15,19,'Nadia.Schubert@company.org','1,17 EUR') + ,('J391-2253339','Heisenberg LCD Resonator',26,28,19,17,'Karen.Brant@company.org','3,73 EUR') + ,('G840-8611458','Aluminum Sensor Memristor',26,11,15,5,'Henny.Foth@company.org','4,07 EUR') + ,('D975-3237312','Planck Coil Memristor',13,31,12,7,'Sigmund.Gros@company.org','2,00 EUR') + ,('P957-8177638','Multiplexer Dipole Transducer',52,45,14,17,'Arnelle.Gerber@company.org','3,31 EUR') + ,('E585-4643170','LCD Memristor Rheostat',36,75,18,7,'Minnie.Kuehn@company.org','0,71 EUR') + ,('N206-9059859','Polymer Memristor Capacitor',43,80,19,1,'Bert.Blumstein@company.org','4,10 EUR') + ,('U623-2779596','Multiplexer LCD Switch',17,66,19,10,'Bert.Blumstein@company.org','5,95 EUR') + ,('P989-7962038','Bipolar-junction LCD Resistor',37,75,19,5,'Bert.Blumstein@company.org','4,60 EUR') + ,('J653-7148856','Coil Transducer Warp',42,65,12,11,'Waldtraud.Kuttner@company.org','2,67 EUR') + ,('P966-3555304','Planck Dipole Rheostat Breaker',67,22,12,4,'Erhard.Fried@company.org','5,44 EUR') + ,('J178-7002767','Flow LCD Transistor Transducer',40,56,13,15,'Liese.Adam@company.org','1,78 EUR') + ,('A932-9527078','Ceramic Multiplexer Potentiometer Gauge',67,49,13,12,'Heinrich.Hoch@company.org','1,48 EUR') + ,('M885-1885470','Field-effect Transistor Crystal Switch',48,23,11,5,'Erhard.Fried@company.org','4,22 EUR') + ,('H747-8390476','Flow Multiplexer Inductor Breaker',25,16,14,18,'Elisabeth.Harman@company.org','5,14 EUR') + ,('J370-9195708','Multiplexer Potentiometer Compensator',61,14,13,3,'Lambert.Faust@company.org','4,54 EUR') + ,('Z288-2942538','Network Dipole Capacitor',28,46,15,18,'Thomas.Mueller@company.org','0,00 EUR') + ,('L592-1084147','Coil Potentiometer Compensator',52,61,12,20,'Ida.Halle@company.org','4,90 EUR') + ,('H491-2171849','Multiplexer Meter',52,74,11,5,'Ratt.Hartmann@company.org','0,29 EUR') + ,('M827-2856044','Driver Warp',28,36,16,3,'Kevin.Feigenbaum@company.org','2,87 EUR') + ,('Y714-9954664','Bipolar-junction Oscillator Gauge',58,29,17,15,'Arendt.Beitel@company.org','2,09 EUR') + ,('X502-7135246','Heisenberg Resonator Rheostat Transducer',55,11,16,5,'Jarvis.Jans@company.org','2,77 EUR') + ,('J498-2858887','Bipolar-junction Oscillator Memristor Capacitor',66,77,12,11,'Kevin.Feigenbaum@company.org','0,25 EUR') + ,('W847-4354260','Aluminum Resistor Gauge',72,39,19,5,'Gretel.Roth@company.org','4,66 EUR') + ,('U333-8518360','Driver Switch Transducer',25,13,19,19,'Frau.Irmalinda‚Äò.Becker@company.org','0,73 EUR') + ,('A964-7949458','Bipolar-junction Encoder Transducer',72,46,19,10,'Miles.Amsel@company.org','2,91 EUR') + ,('X365-6429727','Coil Inductor Multiplexer',58,60,11,16,'Lukas.Gerver@company.org','4,77 EUR') + ,('N654-6497636','Coil Transformer Compensator',46,43,16,18,'Liese.Adam@company.org','0,80 EUR') + ,('S314-3937138','Heisenberg Memristor Breaker Switch',33,34,15,14,'Sabrina.Bayer@company.org','0,14 EUR') + ,('G261-8681976','Multiplexer Oscillator Inductor',52,21,15,1,'Rebecca.Hall@company.org','4,62 EUR') + ,('N411-3014396','Network Compensator',65,72,13,10,'Baldwin.Dirksen@company.org','1,59 EUR') + ,('K296-6028981','Inductor Strain',76,73,20,20,'Franziska.Acker@company.org','1,75 EUR') + ,('P174-7697886','Dipole Transducer',66,62,15,12,'Elisabeth.Harman@company.org','3,74 EUR') + ,('L612-4428366','Resonator Rheostat',53,15,18,20,'Arendt.Beitel@company.org','2,76 EUR') + ,('W436-5301120','Encoder Transducer',32,63,19,20,'Baldwin.Dirksen@company.org','5,21 EUR') + ,('F969-8946081','Inductor Rheostat',19,69,13,2,'Baldwin.Dirksen@company.org','5,83 EUR') + ,('O531-4282131','Multiplexer',70,28,19,20,'Kristen.Bauers@company.org','4,67 EUR') + ,('N366-8062929','Network Oscillator Strain',15,70,19,17,'Reiner.Widmann@company.org','3,40 EUR') + ,('X989-6385984','Sensor Encoder Transformer',41,40,17,8,'Adolfina.Hoch@company.org','1,00 EUR') + ,('X308-3411861','Aluminum Breaker Capacitor Warp',38,17,12,7,'Wanja.Hoffmann@company.org','3,22 EUR') + ,('Y117-1025328','Planck Switch',46,29,12,5,'Elena.Herzog@company.org','1,67 EUR') + ,('R524-4869682','Planck Multiplexer Inductor',13,67,20,10,'Gretel.Roth@company.org','3,50 EUR') + ,('E812-9665212','Bipolar-junction LCD Potentiometer Encoder',44,40,13,3,'Wanja.Hoffmann@company.org','1,11 EUR') + ,('C970-6304679','Ceramic Coil Rheostat',47,69,20,9,'Henny.Foth@company.org','1,62 EUR') + ,('E103-2799984','Encoder Transducer',26,23,17,11,'Baldwin.Guenther@company.org','4,67 EUR') + ,('X643-1063819','Dipole Compensator',20,55,17,6,'Franziska.Acker@company.org','0,06 EUR') + ,('H598-5149929','Transistor Rheostat',53,48,19,8,'Franziska.Acker@company.org','2,17 EUR') + ,('T769-2350399','Multiplexer LCD',62,11,12,5,'Karch.Moeller@company.org','1,70 EUR') + ,('H631-9376983','Aluminum Network Oscillator Capacitor',19,28,19,10,'Berlin.Schulz@company.org','5,36 EUR') + ,('C213-4995667','Potentiometer Crystal Encoder',14,43,12,1,'Sabrina.Geiger@company.org','0,12 EUR') + ,('V382-3883746','Network Dipole Warp',74,77,13,12,'Kristen.Bauers@company.org','3,68 EUR') + ,('O636-3428529','Resonator Strain Meter',34,33,17,2,'Dietlinde.Boehme@company.org','0,77 EUR') + ,('R774-3816629','Log-periodic Encoder Transducer',19,40,18,3,'Ratt.Hartmann@company.org','4,21 EUR') + ,('P913-2073572','Network Dipole Rheostat',48,16,15,5,'Adolfina.Hoch@company.org','4,07 EUR') + ,('B567-3760235','LCD Resonator',12,20,18,9,'Ida.Halle@company.org','3,57 EUR') + ,('B488-6957957','Strain Capacitor',26,48,15,18,'Minnie.Kuehn@company.org','2,91 EUR') + ,('I696-9739398','Breaker Resonator Encoder',45,60,15,20,'Manfred.Foth@company.org','4,28 EUR') + ,('E890-4143899','Coil Crystal Strain',40,70,14,1,'Thomas.Mueller@company.org','4,62 EUR') + ,('D525-4805979','Compensator Transducer',16,68,14,6,'Herr.Burgh.Eichel@company.org','2,92 EUR') + ,('H962-4715431','Phase Dipole Transformer',12,49,14,20,'Henny.Foth@company.org','4,75 EUR') + ,('P708-1537318','Bipolar-junction Network Strain',62,68,13,10,'Ratt.Hartmann@company.org','5,99 EUR') + ,('E868-5063965','Coil Compensator',64,21,13,1,'Emil.Gotti@company.org','5,26 EUR') + ,('N568-8608034','Coil Oscillator Switch',49,71,16,5,'Herr.Burgh.Eichel@company.org','1,80 EUR') + ,('C402-4354819','Film Potentiometer',65,48,11,8,'Lili.Geier@company.org','4,92 EUR') + ,('Z655-3173353','Multiplexer Inductor Crystal',21,19,14,5,'Baldwin.Guenther@company.org','2,84 EUR') + ,('Q696-9337626','Ceramic Coil Breaker',40,17,20,10,'Ratt.Beyer@company.org','2,72 EUR') + ,('K288-9703549','Sensor Rheostat',23,49,12,16,'Berlin.Schulz@company.org','1,27 EUR') + ,('F332-3707903','Gauge Breaker',24,39,12,16,'Elisabeth.Harman@company.org','2,44 EUR') + ,('N879-4735381','Multiplexer Inductor Crystal',29,15,12,5,'Sigmund.Gros@company.org','0,55 EUR') + ,('X620-7792033','Ceramic Resistor Rheostat',38,36,20,19,'Lukas.Gerver@company.org','3,80 EUR') + ,('P453-8155326','Encoder Breaker',22,71,19,12,'Karen.Brant@company.org','0,39 EUR') + ,('X602-2515162','Dipole Warp',40,32,17,10,'Karch.Moeller@company.org','1,64 EUR') + ,('D548-3561584','Potentiometer Gauge Compensator',72,32,18,14,'Franziska.Acker@company.org','2,09 EUR') + ,('H267-1492366','Sensor Transducer',79,74,19,12,'Elisabeth.Harman@company.org','5,05 EUR') + ,('Z739-8572107','Network Potentiometer Gauge',54,19,12,19,'Gretel.Roth@company.org','2,23 EUR') + ,('C390-4121800','Sensor Strain',74,17,18,6,'Yanka.Schreiber@company.org','5,75 EUR') + ,('T941-8766844','Planck Inductor Gauge Resonator',43,11,17,10,'Lukas.Gerver@company.org','1,63 EUR') + ,('F264-7752472','Resonator Switch',21,44,12,17,'Karch.Moeller@company.org','0,71 EUR') + ,('F266-5876962','Multiplexer Transistor',73,32,13,9,'Ulrik.Denzel@company.org','0,29 EUR') + ,('P602-5728865','Phase Compensator Capacitor Switch',45,30,13,5,'Sigmund.Gros@company.org','1,39 EUR') + ,('F708-2915261','Crystal Resonator',23,79,11,6,'Yanka.Schreiber@company.org','4,23 EUR') + ,('C371-9169438','Polymer Transducer Meter',79,68,19,12,'Henny.Foth@company.org','2,27 EUR') + ,('A769-5120124','Flow Memristor Gauge',62,63,12,6,'Karch.Moeller@company.org','5,23 EUR') + ,('Q248-7597886','Oscillator Strain',17,76,12,15,'Emil.Gotti@company.org','3,36 EUR') + ,('Z848-4991684','Multiplexer Dipole',79,24,15,9,'Frauke.Faerber@company.org','1,92 EUR') + ,('H972-9616381','Film Coil Inductor Transformer',28,34,19,16,'Elena.Herzog@company.org','1,99 EUR') + ,('J505-2473322','Coil Rheostat Transducer',69,23,19,5,'Manfred.Foth@company.org','3,32 EUR') + ,('N153-4376308','Aluminum Inductor Breaker',80,47,16,19,'Elena.Herzog@company.org','0,39 EUR') + ,('S113-2439377','LCD Potentiometer',34,56,19,9,'Herr.Haan.Bader@company.org','2,44 EUR') + ,('W821-9428247','Dipole Memristor Encoder',50,55,20,4,'Liese.Adam@company.org','1,44 EUR') + ,('B693-5414825','Planck Transformer Transistor Capacitor',50,14,15,15,'Gretel.Roth@company.org','5,09 EUR') + ,('X634-4382180','Inductor Driver Potentiometer',14,44,13,3,'Valda.Everhart@company.org','2,16 EUR') + ,('Q189-5857908','Phase Multiplexer Crystal Warp',39,73,19,15,'Nadia.Schubert@company.org','3,90 EUR') + ,('M206-5050706','Resistor Transducer',12,44,12,12,'Minnie.Kuehn@company.org','0,56 EUR') + ,('U614-3483402','Sensor Compensator Transducer',38,50,15,14,'Sabrina.Bayer@company.org','0,04 EUR') + ,('N324-6810821','Aluminum Rheostat Transformer Warp',20,67,15,20,'Kristen.Bauers@company.org','3,71 EUR') + ,('B646-2108570','Dipole Transducer',46,26,16,9,'Kristen.Bauers@company.org','1,14 EUR') + ,('P577-5587693','Network Dipole Memristor',15,51,18,6,'Ida.Halle@company.org','3,86 EUR') + ,('Y505-9919340','Ceramic Capacitor Transformer Warp',59,78,20,13,'Ratt.Hartmann@company.org','1,23 EUR') + ,('U389-9635839','Multiplexer Switch',24,58,12,19,'Jarvis.Jans@company.org','0,51 EUR') + ,('J820-7132026','Polymer Inductor',41,65,15,4,'Arnelle.Gerber@company.org','3,67 EUR') + ,('A225-1988393','Field-effect Dipole Gauge',59,77,18,4,'Bert.Blumstein@company.org','0,06 EUR') + ,('K651-4147885','LCD Crystal',48,50,16,15,'Rebecca.Hall@company.org','2,14 EUR') + ,('K850-3410875','Transducer Gauge Switch',55,11,16,6,'Baldwin.Guenther@company.org','3,82 EUR') + ,('Q187-2944814','Multiplexer Potentiometer LCD',33,12,13,9,'Adolfina.Hoch@company.org','5,64 EUR') + ,('M205-1376206','Dipole Memristor Encoder',17,80,15,19,'Kevin.Feigenbaum@company.org','1,02 EUR') + ,('R302-4754313','Aluminum Inductor Gauge Capacitor',43,66,15,7,'Wolfgang.Martin@company.org','1,49 EUR') + ,('S100-7238368','Sensor Potentiometer',62,20,12,5,'Xochitl.Aue@company.org','0,28 EUR') + ,('L816-8238278','Inductor',48,70,14,7,'Yanka.Schreiber@company.org','3,21 EUR') + ,('M810-8954183','Aluminum Gauge Resonator',13,16,12,4,'Gretel.Roth@company.org','3,09 EUR') + ,('X283-7840276','Planck Sensor Dipole Capacitor',55,20,12,6,'Corinna.Ludwig@company.org','1,87 EUR') + ,('M974-1997588','Potentiometer Dipole',41,19,18,4,'Herr.Haan.Bader@company.org','3,38 EUR') + ,('Y863-3538159','Multiplexer Rheostat',69,15,11,17,'Thomas.Mueller@company.org','4,77 EUR') + ,('H510-3094779','Resonator Transformer',16,65,15,20,'Yanka.Schreiber@company.org','0,81 EUR') + ,('N998-2489600','Bipolar-junction Strain',19,43,13,7,'Liese.Adam@company.org','1,15 EUR') + ,('Z646-5864967','Coil Encoder Switch',77,62,13,20,'Ratt.Hartmann@company.org','0,19 EUR') + ,('H244-4330589','LCD Strain',29,40,20,13,'Franz.Kornhaeusel@company.org','0,63 EUR') + ,('L792-8374906','Sensor Memristor Meter',29,66,15,3,'Erhard.Fried@company.org','1,58 EUR') + ,('X897-7676293','Coil Potentiometer Strain',42,33,18,13,'Manfred.Foth@company.org','1,66 EUR') + ,('W304-6414305','Transducer',42,22,17,16,'Baldwin.Dirksen@company.org','3,37 EUR') + ,('T504-8448784','Flow Potentiometer Gauge Oscillator',75,11,12,1,'Arendt.Beitel@company.org','5,90 EUR') + ,('J731-7469427','Transformer Compensator',75,28,20,2,'Ratt.Beyer@company.org','2,75 EUR') + ,('Y889-4226936','Coil Oscillator',24,34,13,17,'Corinna.Ludwig@company.org','5,64 EUR') + ,('A909-7626614','Transistor Encoder',36,15,19,20,'Valda.Everhart@company.org','5,43 EUR') + ,('R414-3098561','Multiplexer Meter',52,56,16,16,'Berlin.Schulz@company.org','4,35 EUR') + ,('M436-2993715','LCD Resonator Compensator',26,41,17,3,'Heinrich.Hoch@company.org','5,66 EUR') + ,('G826-1197003','Heisenberg LCD Oscillator Breaker',53,28,15,4,'Anamchara.Foerstner@company.org','0,44 EUR') + ,('C375-1115425','Polymer Inductor Gauge Rheostat',74,38,14,17,'Ratt.Hartmann@company.org','1,63 EUR') + ,('V645-2413888','Log-periodic Oscillator Transistor Rheostat',46,62,13,13,'Elisabeth.Harman@company.org','2,24 EUR') + ,('P787-7863897','Switch Transducer',72,20,17,6,'Nadia.Schubert@company.org','0,18 EUR') + ,('T995-5683542','Resonator Rheostat',55,21,14,7,'Valda.Everhart@company.org','4,33 EUR') + ,('U169-4232721','Driver Breaker Warp',21,68,19,15,'Reiner.Widmann@company.org','4,54 EUR') + ,('V876-7098157','Potentiometer Transistor',71,16,15,5,'Gretel.Roth@company.org','1,26 EUR') + ,('W358-5750223','Coil Warp',67,34,17,20,'Sigmund.Gros@company.org','4,01 EUR') + ,('E971-2487589','Network Encoder',21,13,16,8,'Henny.Foth@company.org','1,84 EUR') + ,('P360-3765415','LCD Dipole',71,22,14,1,'Manfred.Foth@company.org','1,00 EUR') + ,('T806-6069877','Planck Crystal Rheostat Switch',27,37,19,18,'Jarvis.Jans@company.org','4,20 EUR') + ,('U619-9969216','Coil Inductor Transistor',72,56,13,4,'Dieterich.Blau@company.org','2,00 EUR') + ,('L262-1109442','Polymer Inductor Rheostat Breaker',58,37,17,2,'Bert.Blumstein@company.org','0,31 EUR') + ,('N881-4812973','Meter',49,22,17,6,'Wolfgang.Martin@company.org','1,60 EUR') + ,('R389-4348258','Network Gauge',69,77,18,2,'Baldwin.Guenther@company.org','3,92 EUR') + ,('M400-3382615','Field-effect Transistor Compensator',29,77,20,14,'Xochitl.Aue@company.org','5,50 EUR') + ,('D243-3238752','Log-periodic Transistor Encoder Compensator',63,47,15,4,'Henny.Foth@company.org','0,98 EUR') + ,('Q861-1618446','Bipolar-junction Driver Crystal',50,24,14,14,'Gretel.Roth@company.org','2,17 EUR') + ,('N709-2262876','Multiplexer Memristor Switch',35,25,12,15,'Karen.Brant@company.org','3,05 EUR') + ,('Q546-7014038','Field-effect Memristor Rheostat',56,62,18,14,'Franziska.Acker@company.org','2,48 EUR') + ,('C622-9716605','Oscillator Transducer',58,20,14,7,'Franziska.Acker@company.org','4,09 EUR') + ,('R247-6538517','Crystal Breaker',47,66,17,13,'Liese.Adam@company.org','1,53 EUR') + ,('J470-3164222','Multiplexer Memristor Rheostat',41,54,19,4,'Franziska.Acker@company.org','2,70 EUR') + ,('V600-6144297','Driver Transducer',70,45,18,19,'Ulrik.Denzel@company.org','5,54 EUR') + ,('E162-5553215','Film Inductor Rheostat',43,14,17,14,'Liese.Adam@company.org','2,27 EUR') + ,('E187-6115721','LCD Inductor Transducer',56,11,13,5,'Sabrina.Bayer@company.org','5,61 EUR') + ,('F559-6763700','Gauge Capacitor',37,79,12,19,'Henny.Foth@company.org','0,55 EUR') + ,('N704-3896920','Strain Encoder',25,48,14,3,'Thomas.Mueller@company.org','0,16 EUR') + ,('U318-1465198','Aluminum Network Dipole Transducer',50,57,19,17,'Ulrik.Denzel@company.org','3,83 EUR') + ,('Y788-9882822','Planck Multiplexer Capacitor',24,31,13,10,'Thomas.Mueller@company.org','5,24 EUR') + ,('Z587-4413312','Aluminum Dipole Sensor Capacitor',17,45,12,5,'Elena.Herzog@company.org','2,04 EUR') + ,('R862-8479315','Aluminum Transducer Rheostat Warp',43,12,15,13,'Minnie.Kuehn@company.org','4,25 EUR') + ,('H569-9184293','Inductor Rheostat Breaker',73,12,19,17,'Franziska.Acker@company.org','3,96 EUR') + ,('H641-1089353','Log-periodic Potentiometer Resonator',76,26,19,5,'Henny.Foth@company.org','2,17 EUR') + ,('K375-1173149','Inductor Breaker',66,53,17,12,'Siglind.Brinkerhoff@company.org','4,25 EUR') + ,('I327-6567979','Gauge Transducer',41,30,16,8,'Nadia.Schubert@company.org','2,13 EUR') + ,('L374-3374767','Resistor Potentiometer Strain',51,53,13,8,'Heinrich.Hoch@company.org','5,91 EUR') + ,('M650-3458375','Heisenberg Network Strain Encoder',45,42,13,8,'Emil.Gotti@company.org','2,53 EUR') + ,('H958-9648652','Potentiometer Crystal Warp',71,49,15,1,'Wanja.Hoffmann@company.org','3,42 EUR') + ,('L781-7008508','Bipolar-junction Multiplexer Inductor Transformer',16,21,11,13,'Kevin.Feigenbaum@company.org','5,13 EUR') + ,('V887-9194738','Gauge Meter Transducer',71,31,18,8,'Waldtraud.Kuttner@company.org','1,22 EUR') + ,('F779-9528637','Phase Sensor Transistor',56,61,18,12,'Reiner.Widmann@company.org','3,29 EUR') + ,('Z254-1002324','Transistor Crystal',22,46,14,16,'Erhard.Fried@company.org','2,34 EUR') + ,('Q594-6895704','LCD Network',42,76,17,20,'Rebecca.Hall@company.org','1,54 EUR') + ,('O300-8464663','Crystal Strain',80,69,18,13,'Dietlinde.Boehme@company.org','3,57 EUR') + ,('R338-2935955','Film Multiplexer Breaker',35,13,20,6,'Nadia.Schubert@company.org','1,42 EUR') + ,('U861-6382993','Compensator Meter',60,65,11,8,'Corinna.Ludwig@company.org','2,82 EUR') + ,('Q353-5311148','Ceramic Compensator Breaker Transducer',48,16,12,6,'Lambert.Faust@company.org','0,25 EUR') + ,('E793-4560979','Capacitor Resonator Compensator',69,68,18,5,'Dieterich.Blau@company.org','4,21 EUR') + ,('H374-8481414','Network Multiplexer Resonator',34,43,18,10,'Ratt.Beyer@company.org','3,92 EUR') + ,('Z889-8463159','Resistor Inductor',41,61,15,2,'Anamchara.Foerstner@company.org','0,57 EUR') + ,('O553-6585255','Resistor Encoder Breaker',71,13,16,7,'Gretel.Roth@company.org','3,07 EUR') + ,('G625-3606813','Phase Multiplexer Inductor Crystal',53,79,14,8,'Adolfina.Hoch@company.org','0,01 EUR') + ,('K353-7420061','Rheostat Compensator',71,64,11,3,'Anamchara.Foerstner@company.org','5,85 EUR') + ,('D603-1225899','Field-effect Memristor Resonator Transducer',64,50,19,5,'Wolfgang.Martin@company.org','0,61 EUR') + ,('J544-6748850','LCD Compensator',80,23,16,18,'Sigmund.Gros@company.org','1,10 EUR') + ,('W846-7438265','Resistor Memristor Capacitor',60,27,11,20,'Erhard.Fried@company.org','5,32 EUR') + ,('E373-8515317','Field-effect Resistor Resonator',64,47,17,16,'Franziska.Acker@company.org','5,56 EUR') + ,('I771-2451857','Potentiometer Breaker Oscillator',59,28,16,6,'Karch.Moeller@company.org','1,13 EUR') + ,('T732-3194846','Film Oscillator Rheostat Transformer',52,25,14,20,'Herr.Burgh.Eichel@company.org','1,41 EUR') + ,('R946-7112528','Sensor Breaker',47,64,14,10,'Baldwin.Guenther@company.org','2,86 EUR') + ,('G812-4734922','Heisenberg Network Potentiometer',64,76,12,12,'Elena.Herzog@company.org','5,23 EUR') + ,('B825-7596233','Resistor Compensator',24,74,19,14,'Arendt.Beitel@company.org','4,50 EUR') + ,('B429-3694560','Network Switch',67,11,19,5,'Wanja.Hoffmann@company.org','0,52 EUR') + ,('W232-7656495','Transistor Compensator Transducer',13,25,12,12,'Henny.Foth@company.org','3,33 EUR') + ,('K542-2074800','Coil Encoder',54,71,20,3,'Sabrina.Geiger@company.org','3,06 EUR') + ,('U489-9025040','Compensator Warp',78,57,15,10,'Frau.Irmalinda‚Äò.Becker@company.org','1,72 EUR') + ,('Z763-7274829','Potentiometer Rheostat',77,68,16,1,'Wanja.Hoffmann@company.org','5,40 EUR') + ,('X954-5873970','Bipolar-junction Oscillator Memristor Sensor',57,35,20,18,'Yanka.Schreiber@company.org','3,16 EUR') + ,('M805-4248390','Polymer Inductor Crystal Capacitor',49,13,18,14,'Wolfgang.Martin@company.org','2,91 EUR') + ,('A166-3766336','Aluminum LCD Driver Gauge',53,77,14,2,'Xochitl.Aue@company.org','1,27 EUR') + ,('G144-7255154','Dipole Rheostat Capacitor',34,54,13,3,'Arnelle.Gerber@company.org','3,54 EUR') + ,('E469-1218832','Dipole Crystal',76,50,15,8,'Elisabeth.Harman@company.org','5,72 EUR') + ,('R586-3728998','Gauge Breaker',62,72,16,13,'Arnelle.Gerber@company.org','4,78 EUR') + ,('O194-8514321','Aluminum Capacitor Warp',12,78,15,9,'Elisabeth.Harman@company.org','1,67 EUR') + ,('I272-3912947','Ceramic Inductor Resonator',36,67,13,18,'Kevin.Feigenbaum@company.org','1,90 EUR') + ,('J420-5667802','Ceramic Inductor Crystal Transformer',55,13,19,11,'Elisabeth.Harman@company.org','1,27 EUR') + ,('B625-4480024','Sensor Resonator Compensator',23,59,13,13,'Lili.Geier@company.org','0,52 EUR') + ,('Y194-2779293','Field-effect LCD Strain',30,28,16,19,'Herr.Haan.Bader@company.org','4,06 EUR') + ,('P337-4636612','Sensor Driver Crystal',64,80,16,12,'Emil.Gotti@company.org','5,37 EUR') + ,('V283-8186620','Dipole Crystal',48,48,16,1,'Franz.Kornhaeusel@company.org','0,52 EUR') + ,('U379-6681071','Heisenberg Coil Inductor LCD',30,40,19,2,'Waldtraud.Kuttner@company.org','1,66 EUR') + ,('N317-6012752','Oscillator Driver Sensor',42,58,18,7,'Marius.Fux@company.org','2,98 EUR') + ,('Y354-7075426','Aluminum LCD Warp',15,49,19,4,'Emil.Gotti@company.org','4,82 EUR') + ,('B937-9245602','Driver Compensator',47,62,13,6,'Berlin.Schulz@company.org','2,16 EUR') + ,('J769-7213127','Planck Multiplexer Driver Transistor',73,13,19,15,'Emil.Gotti@company.org','5,24 EUR') + ,('V488-1866672','Log-periodic Rheostat Strain Transducer',60,22,13,8,'Jarvis.Jans@company.org','5,55 EUR') + ,('U833-1786284','Oscillator Crystal Resonator',19,64,17,16,'Rebecca.Hall@company.org','5,11 EUR') + ,('R506-1245812','Film Strain Breaker',70,62,17,5,'Jarvis.Jans@company.org','4,47 EUR') + ,('S480-3531134','Oscillator Gauge',14,12,17,5,'Waldtraud.Kuttner@company.org','0,20 EUR') + ,('N607-6979614','Rheostat Strain Meter',13,40,18,19,'Manfred.Foth@company.org','1,26 EUR') + ,('W176-3285571','Log-periodic Oscillator Breaker',13,49,20,20,'Corinna.Ludwig@company.org','2,63 EUR') + ,('E226-4279524','Resistor Compensator',35,12,13,4,'Marius.Fux@company.org','4,05 EUR') + ,('P317-3419187','Network Breaker Transducer',52,25,11,20,'Ida.Halle@company.org','2,09 EUR') + ,('Q514-9410667','Phase Strain Transducer',23,13,13,10,'Lambert.Faust@company.org','3,16 EUR') + ,('N137-2655981','Inductor Compensator',27,45,18,4,'Wolfgang.Martin@company.org','2,16 EUR') + ,('A566-1562523','Planck Dipole Sensor Warp',43,57,13,19,'Adolfina.Hoch@company.org','2,83 EUR') + ,('C245-8365837','Potentiometer Resonator Encoder',16,44,14,20,'Berlin.Schulz@company.org','0,49 EUR') + ,('C182-2689274','Potentiometer Driver',20,54,11,17,'Thomas.Mueller@company.org','5,99 EUR') + ,('P472-9724615','Field-effect Potentiometer Resonator',34,75,11,3,'Elisabeth.Harman@company.org','1,43 EUR') + ,('E835-1316991','Resistor Breaker',37,20,19,20,'Thomas.Mueller@company.org','3,94 EUR') + ,('G403-4566802','LCD Resonator Warp',22,66,11,16,'Lili.Geier@company.org','4,20 EUR') + ,('B286-1369879','Flow Coil Meter',58,51,16,5,'Arendt.Beitel@company.org','0,69 EUR') + ,('E172-8066897','Driver Compensator',15,68,13,19,'Ratt.Hartmann@company.org','4,60 EUR') + ,('G625-4620445','Log-periodic Driver Compensator',19,35,20,16,'Dietlinde.Boehme@company.org','4,32 EUR') + ,('M522-9124638','Flow LCD Resistor Encoder',16,73,18,2,'Corinna.Ludwig@company.org','5,11 EUR') + ,('S839-8840069','Phase Resonator Meter',22,75,11,9,'Baldwin.Guenther@company.org','0,12 EUR') + ,('B918-9468392','Multiplexer Resistor Memristor',29,45,13,18,'Reiner.Widmann@company.org','3,60 EUR') + ,('Y580-9027193','Bipolar-junction LCD Resistor',40,77,20,10,'Dieterich.Blau@company.org','0,47 EUR') + ,('A755-9228475','Resistor Driver',79,64,12,16,'Frauke.Faerber@company.org','4,15 EUR') + ,('W177-1965331','Ceramic Coil Memristor Gauge',29,74,15,3,'Reiner.Widmann@company.org','2,92 EUR') + ,('L932-9433395','Dipole Inductor Crystal',67,76,11,3,'Lukas.Gerver@company.org','5,82 EUR') + ,('V610-4162567','Breaker Encoder',64,13,17,10,'Thomas.Mueller@company.org','3,81 EUR') + ,('H502-2553729','Flow Resistor Inductor Transformer',68,71,18,18,'Ulrik.Denzel@company.org','5,73 EUR') + ,('S450-5654221','Multiplexer Transistor',41,43,11,6,'Frauke.Faerber@company.org','1,96 EUR') + ,('O856-7652159','Coil Gauge Strain',32,30,16,17,'Heinrich.Hoch@company.org','0,74 EUR') + ,('Y884-3616085','Phase Potentiometer Memristor Sensor',26,48,18,6,'Erhard.Fried@company.org','1,36 EUR') + ,('J671-5760255','Driver Crystal',63,40,12,14,'Sabrina.Bayer@company.org','0,59 EUR') + ,('G187-5631756','Polymer Multiplexer Compensator Transducer',16,11,15,6,'Wolfgang.Martin@company.org','3,23 EUR') + ,('N905-1544917','Phase Dipole Transistor',54,50,11,9,'Gretel.Roth@company.org','5,78 EUR') + ,('E405-1045893','Polymer Sensor',21,52,15,1,'Karch.Moeller@company.org','3,58 EUR') + ,('J519-7020928','Driver Transducer',14,44,16,3,'Ulrik.Denzel@company.org','4,09 EUR') + ,('N744-5971232','Coil Strain',57,72,17,8,'Siglind.Brinkerhoff@company.org','4,82 EUR') + ,('S531-7887299','Transistor Switch',61,60,18,12,'Adolfina.Hoch@company.org','5,75 EUR') + ,('T914-4676603','Crystal Rheostat Meter',64,62,13,19,'Berlin.Schulz@company.org','3,51 EUR') + ,('T161-7769514','Network Breaker Capacitor',15,61,14,2,'Nadia.Schubert@company.org','5,56 EUR') + ,('W830-6681347','Aluminum Resonator Capacitor Warp',80,47,20,7,'Rebecca.Hall@company.org','5,62 EUR') + ,('Z615-8618743','Film Resistor Inductor Switch',43,72,17,19,'Baldwin.Guenther@company.org','5,31 EUR') + ,('W529-7595129','Film LCD Strain',61,18,16,1,'Anamchara.Foerstner@company.org','2,98 EUR') + ,('U772-6050161','Resonator Encoder Warp',35,66,17,12,'Bert.Blumstein@company.org','1,41 EUR') + ,('H941-5264433','Transformer Breaker Meter',65,79,15,6,'Marius.Fux@company.org','4,65 EUR') + ,('T124-5609647','Network Compensator',19,51,20,15,'Kevin.Feigenbaum@company.org','3,20 EUR') + ,('N237-3608803','Flow Capacitor Meter',40,11,15,5,'Berlin.Schulz@company.org','0,26 EUR') + ,('I242-5347848','Compensator Warp',24,28,20,5,'Corinna.Ludwig@company.org','1,26 EUR') + ,('M521-8491113','Multiplexer Coil Resonator',61,67,17,19,'Manfred.Foth@company.org','5,07 EUR') + ,('D237-6587630','Heisenberg Transformer Crystal Encoder',35,74,19,18,'Herr.Haan.Bader@company.org','4,86 EUR') + ,('V519-6173906','Inductor Memristor Breaker',70,35,20,6,'Siglind.Brinkerhoff@company.org','4,26 EUR') + ,('T608-9573692','Coil Resonator',71,74,11,1,'Reiner.Widmann@company.org','3,87 EUR') + ,('U743-1581581','Memristor Driver Strain',63,13,11,2,'Anamchara.Foerstner@company.org','2,01 EUR') + ,('H634-7337115','Gauge Crystal',35,24,20,3,'Herr.Burgh.Eichel@company.org','1,36 EUR') + ,('B187-7652875','Driver Memristor Crystal',17,42,14,4,'Miles.Amsel@company.org','3,18 EUR') + ,('J781-8212433','Oscillator Meter',55,25,11,6,'Bert.Blumstein@company.org','0,15 EUR') + ,('E882-2235305','Phase Multiplexer Network Warp',51,62,18,4,'Rebecca.Hall@company.org','2,02 EUR') + ,('U651-8669022','Heisenberg Inductor Rheostat Transformer',65,23,12,1,'Kevin.Feigenbaum@company.org','4,25 EUR') + ,('I893-5009730','Polymer Potentiometer Meter',18,12,16,1,'Liese.Adam@company.org','4,96 EUR') + ,('W686-1387652','Oscillator Breaker',65,65,13,3,'Herr.Haan.Bader@company.org','2,77 EUR') + ,('Z322-3336300','Transducer Encoder Switch',14,74,16,3,'Lambert.Faust@company.org','5,99 EUR') + ,('G346-2864946','LCD Strain Encoder',43,75,18,1,'Sabrina.Bayer@company.org','5,54 EUR') + ,('G881-8555057','Flow Dipole Meter Warp',21,71,13,16,'Ratt.Beyer@company.org','2,21 EUR') + ,('T151-7042410','Memristor Switch',22,52,12,1,'Wolfgang.Martin@company.org','3,20 EUR') + ,('Q672-2667601','Multiplexer Resonator',59,54,12,6,'Thomas.Mueller@company.org','0,22 EUR') + ,('M901-8670057','Field-effect Resonator Switch',72,52,19,9,'Sylvester.Brant@company.org','5,33 EUR') + ,('Z358-5797618','Sensor Encoder',68,38,16,8,'Wanja.Hoffmann@company.org','1,22 EUR') + ,('K995-8098017','Resonator Meter',71,28,17,6,'Ratt.Beyer@company.org','2,13 EUR') + ,('E465-6674831','Network Sensor Transistor',52,61,11,2,'Liese.Adam@company.org','5,38 EUR') + ,('L787-2053792','Potentiometer Rheostat Compensator',20,17,20,15,'Liese.Adam@company.org','1,58 EUR') + ,('V156-6277722','Multiplexer Resistor Transducer',55,23,17,3,'Elisabeth.Harman@company.org','4,17 EUR') + ,('S212-6028302','Rheostat Encoder',71,48,20,20,'Arnelle.Gerber@company.org','0,16 EUR') + ,('I479-8852507','Sensor Memristor Strain',64,31,18,9,'Jarvis.Jans@company.org','1,66 EUR') + ,('O502-4324008','Sensor Transistor Encoder',36,29,12,16,'Liese.Adam@company.org','0,84 EUR') + ,('C744-6535902','Coil Warp',77,43,13,10,'Waldtraud.Kuttner@company.org','0,45 EUR') + ,('I625-9097378','Coil Compensator',29,22,14,3,'Lukas.Gerver@company.org','0,06 EUR') + ,('O489-4154201','Potentiometer Transistor Compensator',72,21,12,8,'Manfred.Foth@company.org','4,37 EUR') + ,('R318-8770198','Flow Transistor Compensator Transducer',66,76,11,14,'Baldwin.Dirksen@company.org','5,68 EUR') + ,('Q493-2919102','Oscillator Capacitor',70,31,17,18,'Franziska.Acker@company.org','2,96 EUR') + ,('O712-3456018','Log-periodic Compensator',71,31,15,14,'Miles.Amsel@company.org','4,45 EUR') + ,('B888-3582334','Aluminum Potentiometer Crystal',42,35,20,20,'Karch.Moeller@company.org','2,50 EUR') + ,('S874-6150679','Multiplexer Transistor',37,28,18,20,'Sylvester.Brant@company.org','2,63 EUR') + ,('D371-6210252','Memristor Capacitor Transformer',48,39,17,12,'Gretel.Roth@company.org','0,77 EUR') + ,('G127-3809321','Heisenberg Memristor Gauge',71,53,16,1,'Baldwin.Guenther@company.org','2,96 EUR') + ,('O787-2734023','Aluminum Memristor Strain',18,22,15,1,'Wanja.Hoffmann@company.org','1,97 EUR') + ,('U955-7894277','Transducer Gauge Meter',12,77,14,7,'Nadia.Schubert@company.org','4,03 EUR') + ,('S174-1960652','Ceramic Resonator Rheostat',35,34,11,7,'Anamchara.Foerstner@company.org','0,48 EUR') + ,('C721-7900144','Planck Network Warp',61,60,16,20,'Herr.Haan.Bader@company.org','4,51 EUR') + ,('M133-5945489','Transducer Warp',72,51,15,8,'Ratt.Beyer@company.org','3,08 EUR') + ,('A599-2465791','Driver Memristor',56,19,14,8,'Baldwin.Dirksen@company.org','1,87 EUR') + ,('X230-3586307','LCD Network',70,25,11,17,'Herr.Haan.Bader@company.org','5,11 EUR') + ,('Q223-1316238','Dipole Inductor Switch',45,32,13,9,'Lili.Geier@company.org','2,11 EUR') + ,('Z288-2722877','Polymer Transistor Breaker Compensator',45,27,19,12,'Baldwin.Guenther@company.org','2,60 EUR') + ,('D679-1940878','LCD Potentiometer Transducer',62,14,12,7,'Dietlinde.Boehme@company.org','2,95 EUR') + ,('D381-6342696','Inductor',67,75,15,6,'Sylvester.Brant@company.org','0,06 EUR') + ,('Y553-3929384','Crystal Capacitor',40,80,20,3,'Wanja.Hoffmann@company.org','5,02 EUR') + ,('X480-1491345','LCD Gauge Crystal',34,32,14,1,'Reiner.Widmann@company.org','3,67 EUR') + ,('C605-1105328','Log-periodic Gauge Compensator Meter',25,68,11,20,'Frau.Irmalinda‚Äò.Becker@company.org','0,00 EUR') + ,('I409-8883822','Polymer Sensor Dipole Meter',48,21,14,2,'Rebecca.Hall@company.org','5,23 EUR') + ,('W697-5712939','Transformer Capacitor',66,17,20,10,'Valda.Everhart@company.org','0,53 EUR') + ,('M128-9664568','Sensor Rheostat Breaker',15,30,14,9,'Arendt.Beitel@company.org','4,25 EUR') + ,('F442-1761220','Aluminum Oscillator Transistor Strain',43,33,12,17,'Kevin.Feigenbaum@company.org','2,16 EUR') + ,('O475-7125508','Multiplexer Oscillator Coil',68,67,17,10,'Minnie.Kuehn@company.org','2,17 EUR') + ,('T725-1852362','Field-effect Multiplexer Potentiometer',39,64,15,17,'Kevin.Feigenbaum@company.org','2,02 EUR') + ,('B820-6334766','LCD Strain Capacitor',63,56,14,4,'Lili.Geier@company.org','5,85 EUR') + ,('Y191-7589606','Gauge Breaker',34,66,18,18,'Ratt.Hartmann@company.org','4,35 EUR') + ,('Q568-8156489','Gauge Capacitor Meter',17,79,17,4,'Karch.Moeller@company.org','0,37 EUR') + ,('J785-9314350','Inductor Crystal Oscillator',70,16,18,3,'Elisabeth.Harman@company.org','3,26 EUR') + ,('F661-8988230','Warp Transistor Meter',66,58,12,11,'Wolfgang.Martin@company.org','1,88 EUR') + ,('M361-5073440','Film Transformer Transducer',54,16,19,3,'Wolfgang.Martin@company.org','5,05 EUR') + ,('K689-4865625','Log-periodic Multiplexer Dipole Transducer',15,64,18,18,'Ulrik.Denzel@company.org','3,54 EUR') + ,('Q951-7651773','Coil Compensator',56,16,17,1,'Xochitl.Aue@company.org','2,05 EUR') + ,('P395-9316579','Aluminum Multiplexer Oscillator Memristor',25,27,11,12,'Adolfina.Hoch@company.org','3,50 EUR') + ,('W457-2405463','LCD Gauge Warp',18,57,15,10,'Siglind.Brinkerhoff@company.org','4,59 EUR') + ,('U367-8732482','Coil Sensor Potentiometer',14,55,11,8,'Baldwin.Dirksen@company.org','1,24 EUR') + ,('C301-4034359','Oscillator Breaker',13,13,13,19,'Franz.Kornhaeusel@company.org','4,55 EUR') + ,('J998-8511305','Resonator Transformer',12,48,15,2,'Baldwin.Dirksen@company.org','5,54 EUR') + ,('V892-8476786','Encoder Meter',27,41,20,9,'Sylvester.Brant@company.org','1,18 EUR') + ,('Q751-8742744','Inductor Resonator',29,46,11,17,'Franziska.Acker@company.org','3,74 EUR') + ,('C440-1370895','Potentiometer Capacitor',56,79,20,18,'Sabrina.Bayer@company.org','4,88 EUR') + ,('Q891-1871898','Coil LCD',38,22,13,5,'Arendt.Beitel@company.org','4,08 EUR') + ,('M645-5460777','Log-periodic Multiplexer Rheostat',27,18,11,19,'Frau.Irmalinda‚Äò.Becker@company.org','2,94 EUR') + ,('J518-7067023','Phase Oscillator Strain',49,13,14,1,'Baldwin.Dirksen@company.org','3,85 EUR') + ,('U573-1229465','Potentiometer Transformer Oscillator',71,47,18,12,'Karen.Brant@company.org','0,86 EUR') + ,('B741-3218460','Dipole Oscillator Warp',25,23,13,3,'Minnie.Kuehn@company.org','1,05 EUR') + ,('L741-9253790','LCD Strain',78,56,20,2,'Dieterich.Blau@company.org','1,87 EUR') + ,('O203-5447809','Dipole Encoder Compensator',24,70,17,12,'Kevin.Feigenbaum@company.org','0,48 EUR') + ,('S271-9518696','Crystal Encoder',58,34,13,2,'Franz.Kornhaeusel@company.org','5,14 EUR') + ,('Y979-3662601','Memristor Strain Switch',52,50,12,12,'Ratt.Hartmann@company.org','1,68 EUR') + ,('H487-6374164','Inductor Memristor',29,72,18,12,'Lili.Geier@company.org','3,42 EUR') + ,('D764-9088510','Crystal Strain',43,13,12,9,'Corinna.Ludwig@company.org','2,22 EUR') + ,('G966-6452177','Coil Driver Resonator',71,63,11,17,'Gretel.Roth@company.org','0,11 EUR') + ,('D206-3028092','Resonator Compensator Switch',31,63,13,16,'Marius.Fux@company.org','5,18 EUR') + ,('T973-5442896','Sensor Driver Transducer',60,76,17,3,'Frau.Irmalinda‚Äò.Becker@company.org','1,84 EUR') + ,('K636-3664460','Memristor Capacitor',14,64,19,13,'Erhard.Fried@company.org','1,44 EUR') + ,('Z367-7507010','Dipole Strain Encoder',69,44,13,8,'Lili.Geier@company.org','3,97 EUR') + ,('B232-9941304','Ceramic Rheostat Compensator',52,14,17,11,'Henny.Foth@company.org','1,90 EUR') + ,('H676-3055632','Film LCD Warp',51,75,17,7,'Corinna.Ludwig@company.org','1,67 EUR') + ,('Z212-3451369','Driver Strain',37,49,15,20,'Sylvester.Brant@company.org','5,92 EUR') + ,('N664-8476091','Rheostat Encoder',31,66,19,9,'Siglind.Brinkerhoff@company.org','0,57 EUR') + ,('B888-7564557','Log-periodic Resistor Inductor Potentiometer',52,72,17,4,'Dieterich.Blau@company.org','5,46 EUR') + ,('O212-8971793','Strain Meter',66,16,12,11,'Frauke.Faerber@company.org','3,93 EUR') + ,('H605-1270029','Transistor Rheostat',61,28,17,19,'Gretel.Roth@company.org','2,30 EUR') + ,('P965-2818538','Warp Compensator Transducer',78,55,11,2,'Waldtraud.Kuttner@company.org','2,55 EUR') + ,('N892-9855685','Crystal Strain Capacitor',77,45,14,11,'Karch.Moeller@company.org','2,98 EUR') + ,('A617-7075018','Crystal Switch',32,30,15,19,'Sabrina.Geiger@company.org','1,40 EUR') + ,('H439-1697643','Log-periodic LCD Gauge',17,21,16,1,'Herr.Haan.Bader@company.org','0,14 EUR') + ,('Z143-3180282','Multiplexer Sensor Encoder',19,37,13,16,'Anamchara.Foerstner@company.org','4,31 EUR') + ,('Y788-8477334','Inductor Encoder Capacitor',67,24,17,1,'Anamchara.Foerstner@company.org','1,44 EUR') + ,('T230-5902294','LCD Resistor',22,69,20,6,'Jarvis.Jans@company.org','3,05 EUR') + ,('H944-2667418','Coil Resistor',78,54,12,9,'Kevin.Feigenbaum@company.org','4,51 EUR') + ,('Z397-1183067','Bipolar-junction Memristor Transistor Breaker',46,58,16,11,'Heinrich.Hoch@company.org','0,69 EUR') + ,('Z556-4824310','Memristor Transistor Capacitor',71,50,18,15,'Ratt.Beyer@company.org','2,85 EUR') + ,('M350-8985312','Oscillator Memristor Transistor',20,80,17,15,'Lambert.Faust@company.org','2,04 EUR') + ,('U827-2294099','Potentiometer Inductor Warp',65,23,19,13,'Yanka.Schreiber@company.org','3,21 EUR') + ,('S321-8453459','Resonator Transformer',68,53,13,2,'Gretel.Roth@company.org','1,35 EUR') + ,('B387-9270009','Film Inductor Warp',46,66,18,16,'Arnelle.Gerber@company.org','4,67 EUR') + ,('E495-3503010','Dipole Resonator Transformer',38,64,17,12,'Kevin.Feigenbaum@company.org','5,96 EUR') + ,('S841-8644004','Flow Sensor Transistor Encoder',22,47,13,1,'Corinna.Ludwig@company.org','2,92 EUR') + ,('V485-9644250','Polymer Network Oscillator Breaker',27,45,11,13,'Adolfina.Hoch@company.org','5,26 EUR') + ,('K479-8347265','Phase Resistor Memristor Meter',67,37,11,12,'Jarvis.Jans@company.org','0,60 EUR') + ,('I904-2574215','Coil Encoder',15,46,16,7,'Thomas.Mueller@company.org','3,24 EUR') + ,('Y676-8284278','Encoder Warp',41,43,11,18,'Herr.Haan.Bader@company.org','2,59 EUR') + ,('X408-2200602','Inductor Capacitor Meter',18,26,12,20,'Lukas.Gerver@company.org','4,67 EUR') + ,('K473-9950981','Coil Compensator',48,33,20,20,'Henny.Foth@company.org','2,56 EUR') + ,('V571-2893837','Network Driver',27,30,19,13,'Elena.Herzog@company.org','2,65 EUR') + ,('W220-5347961','Ceramic Coil Oscillator Breaker',30,21,17,13,'Herr.Burgh.Eichel@company.org','0,19 EUR') + ,('D627-4615108','Coil Dipole Breaker',63,31,15,9,'Erhard.Fried@company.org','4,43 EUR') + ,('N694-7625752','Field-effect Resistor Sensor',27,61,16,8,'Emil.Gotti@company.org','2,65 EUR') + ,('X504-5674380','Ceramic Memristor Resonator Compensator',51,52,13,18,'Ratt.Hartmann@company.org','3,88 EUR') + ,('N589-9719896','Sensor Transformer',41,30,14,2,'Corinna.Ludwig@company.org','2,60 EUR') + ,('B688-8088841','Log-periodic Crystal Rheostat Encoder',67,23,20,9,'Herr.Haan.Bader@company.org','3,47 EUR') + ,('H642-6966395','Polymer Strain Rheostat',37,69,15,8,'Herr.Haan.Bader@company.org','3,62 EUR') + ,('I503-2217600','Aluminum Dipole Breaker',21,44,20,3,'Lambert.Faust@company.org','4,51 EUR') + ,('Y973-8480546','Resistor Transistor Switch',80,29,17,2,'Siglind.Brinkerhoff@company.org','2,19 EUR') + ,('N866-6363347','Polymer Memristor Resonator Capacitor',12,68,17,5,'Miles.Amsel@company.org','4,23 EUR') + ,('S871-7304748','Bipolar-junction Resonator Switch',57,70,11,13,'Marius.Fux@company.org','0,53 EUR') + ,('Y557-7149751','Coil Rheostat',35,14,14,3,'Bert.Blumstein@company.org','0,87 EUR') + ,('X215-2461803','Crystal Capacitor',65,38,20,6,'Elena.Herzog@company.org','5,10 EUR') + ,('G223-2092566','Dipole Transistor',55,23,11,20,'Berlin.Schulz@company.org','2,27 EUR') + ,('K832-2729798','Resistor Potentiometer Oscillator',61,65,13,16,'Xochitl.Aue@company.org','2,73 EUR') + ,('P393-8310950','Multiplexer Crystal Switch',66,14,15,14,'Karen.Brant@company.org','2,89 EUR') + ,('Q476-3668478','LCD Crystal Resonator',77,63,11,8,'Franz.Kornhaeusel@company.org','2,91 EUR') + ,('R228-5965688','Field-effect LCD Gauge Transformer',15,58,16,7,'Sylvester.Brant@company.org','1,77 EUR') + ,('V303-8717097','Network',51,67,14,12,'Kristen.Bauers@company.org','2,77 EUR') + ,('J725-8697253','Resistor Inductor Switch',68,70,11,15,'Xochitl.Aue@company.org','4,50 EUR') + ,('N324-9642439','Driver Warp',72,24,12,1,'Wolfgang.Martin@company.org','2,56 EUR') + ,('I334-4449270','Resistor Dipole Gauge',38,28,16,6,'Baldwin.Dirksen@company.org','5,34 EUR') + ,('U501-5365139','Sensor Transformer Compensator',48,53,18,12,'Liese.Adam@company.org','0,63 EUR') + ,('F800-9858235','Field-effect Gauge Transistor',15,20,19,20,'Franziska.Acker@company.org','1,86 EUR') + ,('Q661-7217088','Crystal Rheostat',80,33,18,12,'Sabrina.Geiger@company.org','3,76 EUR') + ,('H380-8298145','Flow Coil Switch',25,26,19,6,'Rebecca.Hall@company.org','4,20 EUR') + ,('C898-2055295','Sensor Potentiometer',42,74,18,13,'Yanka.Schreiber@company.org','3,70 EUR') + ,('S649-2935217','LCD Inductor Memristor',26,22,11,19,'Thomas.Mueller@company.org','5,22 EUR') + ,('T294-9722443','Heisenberg LCD Crystal Resonator',59,25,16,16,'Emil.Gotti@company.org','3,78 EUR') + ,('U281-1671869','Dipole Transformer Meter',27,62,11,15,'Kristen.Bauers@company.org','1,45 EUR') + ,('Q263-2186291','Sensor Crystal',35,58,18,6,'Thomas.Mueller@company.org','3,02 EUR') + ,('A828-3713433','Multiplexer Breaker',69,40,15,8,'Thomas.Mueller@company.org','4,14 EUR') + ,('R645-9208510','Memristor Breaker',75,71,16,15,'Heinrich.Hoch@company.org','0,45 EUR') + ,('B308-8130581','Memristor Breaker',37,29,17,15,'Franziska.Acker@company.org','4,02 EUR') + ,('Q210-8168184','Network Multiplexer',18,67,12,20,'Dietlinde.Boehme@company.org','4,49 EUR') + ,('A403-4549719','Flow Gauge Transformer',39,65,20,8,'Gretel.Roth@company.org','5,33 EUR') + ,('K242-3459162','Resistor Warp',54,18,15,14,'Kristen.Bauers@company.org','0,41 EUR') + ,('M672-3016632','Multiplexer Crystal Compensator',53,54,15,19,'Corinna.Ludwig@company.org','5,99 EUR') + ,('K143-3113342','Inductor Driver Breaker',30,48,15,18,'Sabrina.Bayer@company.org','4,01 EUR') + ,('O906-8511345','Ceramic Inductor Transistor',67,24,16,15,'Lukas.Gerver@company.org','3,08 EUR') + ,('A529-2906246','Sensor Crystal',38,22,13,9,'Elisabeth.Harman@company.org','2,47 EUR') + ,('S590-1665348','Heisenberg LCD Resonator Transformer',48,78,13,10,'Reiner.Widmann@company.org','5,77 EUR') + ,('T958-2055544','Bipolar-junction Network Transformer',52,26,19,11,'Berlin.Schulz@company.org','5,76 EUR') + ,('O952-1686669','LCD Resonator Breaker',28,77,11,10,'Berlin.Schulz@company.org','3,32 EUR') + ,('B926-8983325','Gauge Encoder Capacitor',73,76,11,5,'Wanja.Hoffmann@company.org','4,53 EUR') + ,('T274-5886301','Coil Gauge Transformer',58,46,17,3,'Adolfina.Hoch@company.org','2,07 EUR') + ,('E354-7057568','Resonator',27,17,11,19,'Elena.Herzog@company.org','1,58 EUR') + ,('W872-7508740','Gauge Rheostat',53,76,20,16,'Xochitl.Aue@company.org','1,45 EUR') + ,('U723-8910149','Memristor Gauge Transformer',61,18,18,20,'Wolfgang.Martin@company.org','1,16 EUR') + ,('W915-7858301','Capacitor Warp',53,50,11,14,'Sabrina.Bayer@company.org','3,42 EUR') + ,('H156-2424615','Polymer Driver Transistor Breaker',28,50,16,1,'Wolfgang.Martin@company.org','3,76 EUR') + ,('W615-3080767','Resistor Resonator Switch',17,44,13,19,'Henny.Foth@company.org','0,17 EUR') + ,('L822-2103281','Polymer Encoder Switch',15,63,12,5,'Dieterich.Blau@company.org','3,25 EUR') + ,('H754-2495350','Crystal Breaker',68,43,15,19,'Lambert.Faust@company.org','2,77 EUR') + ,('D599-6113892','Aluminum Multiplexer Coil Strain',80,17,18,14,'Adolfina.Hoch@company.org','5,85 EUR') + ,('Z927-4746244','Phase Resistor Transistor Meter',42,69,18,15,'Henny.Foth@company.org','3,50 EUR') + ,('V284-9786067','Field-effect Transformer Warp',34,21,13,15,'Wolfgang.Martin@company.org','3,05 EUR') + ,('D915-4717890','Oscillator Switch',23,14,13,1,'Liese.Adam@company.org','4,28 EUR') + ,('I251-4065887','Aluminum Dipole Crystal',35,13,11,17,'Berlin.Schulz@company.org','5,04 EUR') + ,('O494-6195301','Capacitor Strain Breaker',36,49,12,7,'Ida.Halle@company.org','3,82 EUR') + ,('O626-4153303','Driver Memristor',19,38,19,11,'Thomas.Mueller@company.org','2,54 EUR') + ,('N171-1815828','LCD Sensor',72,72,12,20,'Minnie.Kuehn@company.org','5,38 EUR') + ,('Q316-9683240','Multiplexer Transistor',65,26,16,5,'Berlin.Schulz@company.org','4,21 EUR') + ,('C836-5221890','Driver Rheostat Transformer',28,62,17,17,'Ratt.Beyer@company.org','5,63 EUR') + ,('R454-6248815','LCD Sensor Network',16,37,17,3,'Frau.Irmalinda‚Äò.Becker@company.org','3,04 EUR') + ,('U217-4742599','Transistor Transducer',45,39,19,15,'Sabrina.Bayer@company.org','1,76 EUR') + ,('F574-4728030','Inductor Memristor Resonator',16,57,20,17,'Berlin.Schulz@company.org','5,83 EUR') + ,('A391-9508821','Oscillator Compensator',15,42,11,20,'Baldwin.Dirksen@company.org','1,77 EUR') + ,('Y372-1509836','Oscillator Breaker',60,43,13,18,'Franz.Kornhaeusel@company.org','0,72 EUR') + ,('Y327-7144928','Planck Resonator LCD Strain',14,21,18,10,'Baldwin.Dirksen@company.org','4,44 EUR') + ,('G950-4257402','Transformer Transducer',32,68,15,1,'Minnie.Kuehn@company.org','1,71 EUR') + ,('L855-9772914','Phase Breaker Encoder',39,26,14,9,'Anamchara.Foerstner@company.org','5,19 EUR') + ,('T119-8723477','Driver Crystal',53,67,13,17,'Anamchara.Foerstner@company.org','2,61 EUR') + ,('F126-7002599','Log-periodic Oscillator Transistor',75,48,18,7,'Jarvis.Jans@company.org','1,47 EUR') + ,('C717-1997689','Coil Oscillator',17,15,17,6,'Dietlinde.Boehme@company.org','1,42 EUR') + ,('O875-5580798','Heisenberg LCD Network Memristor',54,24,11,19,'Heinrich.Hoch@company.org','2,94 EUR') + ,('C625-4647902','Heisenberg LCD Dipole Crystal',41,61,11,18,'Nadia.Schubert@company.org','3,36 EUR') + ,('K926-9334427','LCD Encoder Compensator',39,29,19,9,'Karen.Brant@company.org','3,13 EUR') + ,('M627-4661911','Phase Memristor Driver',58,59,19,7,'Franziska.Acker@company.org','1,44 EUR') + ,('N462-6714196','Gauge Encoder',55,43,12,20,'Erhard.Fried@company.org','3,41 EUR') + ,('Q245-9575444','Inductor Driver Encoder',67,59,13,19,'Wolfgang.Martin@company.org','5,73 EUR') + ,('J437-7431991','Potentiometer Crystal',43,27,18,10,'Emil.Gotti@company.org','2,76 EUR') + ,('B143-5457756','Flow Coil Resistor Capacitor',55,62,17,6,'Yanka.Schreiber@company.org','5,96 EUR') + ,('G226-1299624','Multiplexer Crystal Transformer',44,19,13,2,'Arendt.Beitel@company.org','3,64 EUR') + ,('Z604-4291151','Log-periodic Oscillator Capacitor',80,13,15,18,'Sylvester.Brant@company.org','2,22 EUR') + ,('T872-6914723','Resistor Oscillator',23,68,19,14,'Xochitl.Aue@company.org','2,54 EUR') + ,('L805-3283253','Coil Compensator Warp',20,40,11,19,'Elena.Herzog@company.org','2,80 EUR') + ,('E172-7848498','LCD Transducer',50,56,15,10,'Dieterich.Blau@company.org','5,34 EUR') + ,('O571-8892490','Network Rheostat Transformer',26,76,18,2,'Sabrina.Geiger@company.org','5,29 EUR') + ,('R490-4226805','Coil Resonator LCD',49,32,13,9,'Bert.Blumstein@company.org','4,78 EUR') + ,('K968-2682119','Field-effect Inductor Oscillator Compensator',52,72,16,2,'Lili.Geier@company.org','4,37 EUR') + ,('Z518-1747933','Resonator Encoder Warp',24,58,19,16,'Manfred.Foth@company.org','0,98 EUR') + ,('T381-5661009','Sensor Compensator',14,23,14,3,'Manfred.Foth@company.org','2,59 EUR') + ,('Z872-5435339','Polymer Gauge Capacitor',18,37,19,1,'Ratt.Beyer@company.org','5,70 EUR') + ,('J878-7667870','LCD Crystal',65,12,20,2,'Anamchara.Foerstner@company.org','5,51 EUR') + ,('M721-8978045','LCD Memristor Warp',55,76,11,18,'Corinna.Ludwig@company.org','1,30 EUR') + ,('A560-7347187','Oscillator Driver',52,39,16,9,'Kevin.Feigenbaum@company.org','0,52 EUR') + ,('M770-3602005','Sensor Capacitor Breaker',20,63,19,1,'Thomas.Mueller@company.org','4,60 EUR') + ,('Q890-8785073','Film Dipole Rheostat',56,66,13,12,'Berlin.Schulz@company.org','2,50 EUR') + ,('G451-8179125','Phase Transistor Warp',50,47,12,6,'Heinrich.Hoch@company.org','2,89 EUR') + ,('J385-6425761','Dipole Driver Meter',78,17,16,11,'Bert.Blumstein@company.org','4,17 EUR') + ,('G378-7132339','Resistor Dipole',19,30,19,5,'Rebecca.Hall@company.org','0,06 EUR') + ,('E815-1132509','Resistor Sensor Resonator',36,77,17,19,'Lukas.Gerver@company.org','1,18 EUR') + ,('F414-1779577','Multiplexer Potentiometer Breaker',75,67,16,16,'Elisabeth.Harman@company.org','5,33 EUR') + ,('D194-9594371','Sensor Gauge Transistor',43,23,19,2,'Nadia.Schubert@company.org','1,11 EUR') + ,('X223-5282026','LCD Capacitor',57,79,14,18,'Franziska.Acker@company.org','1,26 EUR') + ,('X842-8356738','Aluminum Resistor Transformer',17,24,20,7,'Bert.Blumstein@company.org','2,91 EUR') + ,('D729-5737042','Coil Resistor Warp',36,13,16,3,'Adolfina.Hoch@company.org','5,52 EUR') + ,('T802-5361374','Gauge Breaker Switch',17,30,18,8,'Lukas.Gerver@company.org','2,10 EUR') + ,('F388-7030185','Oscillator Transistor Transducer',42,42,12,13,'Elisabeth.Harman@company.org','0,10 EUR') + ,('C794-6433363','Sensor Strain',54,57,20,18,'Reiner.Widmann@company.org','2,84 EUR') + ,('I199-7642085','Coil Strain',48,21,16,9,'Waldtraud.Kuttner@company.org','1,38 EUR') + ,('M323-1526287','Encoder Meter',67,45,17,7,'Ida.Halle@company.org','5,04 EUR') + ,('A509-5571891','Multiplexer Inductor',64,34,11,12,'Frau.Irmalinda‚Äò.Becker@company.org','0,49 EUR') + ,('K267-2045349','Inductor Crystal Oscillator',27,52,13,14,'Erhard.Fried@company.org','4,05 EUR') + ,('I653-5994473','Bipolar-junction Potentiometer Capacitor',60,76,16,4,'Elisabeth.Harman@company.org','3,72 EUR') + ,('E958-8187096','Multiplexer Resistor Driver',45,41,19,13,'Arendt.Beitel@company.org','2,83 EUR') + ,('X324-6249454','Breaker Meter',71,74,17,16,'Karen.Brant@company.org','5,76 EUR') + ,('N687-2334901','Potentiometer Transducer',50,56,11,12,'Sigmund.Gros@company.org','0,98 EUR') + ,('K845-4116844','Breaker Encoder Transducer',36,54,15,4,'Thomas.Mueller@company.org','3,60 EUR') + ,('H752-8461936','Network LCD',35,41,16,4,'Wanja.Hoffmann@company.org','3,62 EUR') + ,('V421-9533599','Network Switch',18,44,16,13,'Emil.Gotti@company.org','2,13 EUR') + ,('P385-1200138','Potentiometer Resonator',34,45,15,18,'Elisabeth.Harman@company.org','0,45 EUR') + ,('R591-4930195','Multiplexer Resonator Transformer',48,49,11,8,'Minnie.Kuehn@company.org','3,81 EUR') + ,('J575-3390923','Phase Coil Capacitor Transducer',79,57,16,11,'Wanja.Hoffmann@company.org','1,51 EUR') + ,('W579-1877166','Polymer Oscillator Potentiometer Meter',40,57,12,14,'Herr.Burgh.Eichel@company.org','2,63 EUR') + ,('M313-3585673','Heisenberg Memristor Rheostat Transducer',77,19,14,13,'Xochitl.Aue@company.org','0,10 EUR') + ,('N573-1498086','Dipole Transformer',63,19,12,17,'Ratt.Hartmann@company.org','5,53 EUR') + ,('G444-8036184','Network Memristor Breaker',47,45,15,15,'Manfred.Foth@company.org','2,73 EUR') + ,('K662-1238230','Memristor Transistor Compensator',67,23,11,3,'Wolfgang.Martin@company.org','4,58 EUR') + ,('U958-4696127','Memristor Compensator Meter',28,52,12,6,'Liese.Adam@company.org','2,39 EUR') + ,('K559-3177627','Rheostat Transformer Warp',61,11,13,20,'Frauke.Faerber@company.org','4,83 EUR') + ,('S439-3814007','LCD Coil Strain',75,49,18,16,'Xochitl.Aue@company.org','4,86 EUR') + ,('N451-6994769','Multiplexer Memristor Crystal',25,14,12,14,'Corinna.Ludwig@company.org','5,58 EUR') + ,('A181-1118563','Compensator Switch',32,22,14,5,'Adolfina.Hoch@company.org','3,70 EUR') + ,('J571-5923698','Multiplexer Resistor',26,31,19,16,'Emil.Gotti@company.org','4,27 EUR') + ,('G694-2879694','Planck Transistor Switch Transducer',76,67,20,19,'Thomas.Mueller@company.org','0,13 EUR') + ,('N243-4639047','Aluminum Resistor Meter',17,22,14,16,'Herr.Haan.Bader@company.org','2,76 EUR') + ,('N778-8753186','Planck Multiplexer Transformer Warp',75,20,16,6,'Ratt.Beyer@company.org','3,88 EUR') + ,('K739-4867689','Multiplexer Resonator Compensator',77,25,19,16,'Elisabeth.Harman@company.org','1,64 EUR') + ,('E829-2591611','Memristor Compensator',29,76,15,9,'Sigmund.Gros@company.org','2,35 EUR') + ,('Q980-7885274','Heisenberg Strain Capacitor',74,35,14,4,'Herr.Haan.Bader@company.org','2,67 EUR') + ,('P983-2994865','Log-periodic Sensor Switch Transducer',34,11,15,14,'Wanja.Hoffmann@company.org','1,19 EUR') + ,('D518-3930277','Sensor Resonator',71,11,17,11,'Xochitl.Aue@company.org','3,18 EUR') + ,('G272-3422671','Resistor Sensor',18,52,15,2,'Arnelle.Gerber@company.org','0,61 EUR') + ,('Y728-5119478','Sensor Crystal Transducer',36,21,17,11,'Liese.Adam@company.org','4,05 EUR') + ,('C710-5880579','Inductor Rheostat Capacitor',18,24,14,6,'Minnie.Kuehn@company.org','2,73 EUR') + ,('A145-1240844','Bipolar-junction Coil Compensator Transducer',28,17,20,14,'Ratt.Hartmann@company.org','3,72 EUR') + ,('F818-8141054','LCD Gauge',51,61,20,3,'Sabrina.Geiger@company.org','1,25 EUR') + ,('L747-7633290','Resistor Sensor Encoder',76,18,14,16,'Franz.Kornhaeusel@company.org','4,81 EUR') + ,('Y167-8599364','Oscillator Meter',37,39,18,7,'Erhard.Fried@company.org','2,19 EUR') + ,('Z545-6121719','LCD Sensor Breaker',23,58,14,10,'Arendt.Beitel@company.org','4,29 EUR') + ,('W658-9979899','Multiplexer Switch',46,38,11,10,'Kevin.Feigenbaum@company.org','4,90 EUR') + ,('P528-2149873','Encoder Compensator',40,79,14,4,'Franziska.Acker@company.org','0,72 EUR') + ,('N480-3487616','Resonator Transformer',17,19,12,14,'Lukas.Gerver@company.org','0,79 EUR') + ,('E737-8373948','Oscillator Inductor',45,79,12,9,'Franz.Kornhaeusel@company.org','2,32 EUR') + ,('H915-3627727','Flow Coil Gauge',62,34,18,13,'Frauke.Faerber@company.org','2,32 EUR') + ,('K411-1729714','Driver Gauge',45,69,20,16,'Minnie.Kuehn@company.org','4,02 EUR') + ,('I311-9589498','Coil LCD Capacitor',44,31,17,6,'Ratt.Beyer@company.org','5,80 EUR') + ,('C800-3270129','Network Potentiometer Encoder',46,48,19,19,'Gretel.Roth@company.org','1,10 EUR') + ,('K481-3281345','Network Dipole Driver',63,35,19,11,'Marius.Fux@company.org','3,31 EUR') + ,('L586-5133830','Multiplexer Dipole',52,34,14,7,'Henny.Foth@company.org','3,08 EUR') + ,('T805-4210259','Heisenberg Network Oscillator Strain',48,36,19,17,'Emil.Gotti@company.org','1,03 EUR') + ,('Z980-8040792','Inductor Transistor Oscillator',41,42,17,16,'Jarvis.Jans@company.org','5,54 EUR') + ,('H402-6061531','Switch',57,69,15,11,'Sabrina.Geiger@company.org','0,44 EUR') + ,('X375-4984404','Multiplexer Transistor',37,45,20,6,'Rebecca.Hall@company.org','4,56 EUR') + ,('Z358-9013730','Flow Potentiometer Transistor',66,76,15,12,'Lukas.Gerver@company.org','3,00 EUR') + ,('A739-4780210','Memristor Driver Strain',57,26,14,2,'Jarvis.Jans@company.org','2,54 EUR') + ,('P870-6495639','Inductor Transistor Warp',61,73,11,18,'Dieterich.Blau@company.org','5,71 EUR') + ,('W917-2544526','Resonator Encoder Compensator',77,68,19,3,'Heinrich.Hoch@company.org','0,89 EUR') + ,('J826-7793079','Coil Potentiometer Memristor',64,31,20,9,'Wolfgang.Martin@company.org','4,86 EUR') + ,('J555-1586043','Transformer Inductor Encoder',59,21,17,6,'Dietlinde.Boehme@company.org','4,40 EUR') + ,('H355-1126195','Polymer Memristor Meter',24,45,18,1,'Bert.Blumstein@company.org','5,11 EUR') + ,('G556-4971578','Flow Coil Memristor Breaker',34,15,20,3,'Sigmund.Gros@company.org','5,84 EUR') + ,('T147-7011803','Oscillator Transistor Capacitor',20,74,16,13,'Frau.Irmalinda‚Äò.Becker@company.org','5,37 EUR') + ,('O727-5999075','Field-effect Transistor Rheostat Breaker',49,11,19,6,'Wanja.Hoffmann@company.org','1,59 EUR') + ,('Z994-6661823','Potentiometer Transducer Meter',30,57,15,7,'Waldtraud.Kuttner@company.org','0,38 EUR') + ,('E952-1325145','Driver Gauge',70,18,17,19,'Frau.Irmalinda‚Äò.Becker@company.org','1,07 EUR') + ,('G249-4926490','Film Network Crystal',62,61,20,3,'Franziska.Acker@company.org','2,44 EUR') + ,('Q627-3868402','Network Memristor',16,52,13,19,'Berlin.Schulz@company.org','0,89 EUR') + ,('A628-8869626','Inductor Gauge Oscillator',76,47,11,19,'Nadia.Schubert@company.org','1,28 EUR') + ,('J225-9158499','Resistor Rheostat Capacitor',42,19,20,15,'Arendt.Beitel@company.org','2,00 EUR') + ,('R272-9406400','Potentiometer Driver',38,76,18,1,'Herr.Haan.Bader@company.org','0,38 EUR') + ,('X704-7151241','Film Dipole Crystal',36,24,12,2,'Baldwin.Guenther@company.org','2,16 EUR') + ,('M986-2342719','Resistor Memristor',15,33,18,14,'Manfred.Foth@company.org','5,60 EUR') + ,('F773-4598178','Transistor Breaker Switch',54,32,14,3,'Reiner.Widmann@company.org','1,79 EUR') + ,('F797-8658626','Multiplexer Gauge Crystal',60,80,11,19,'Bert.Blumstein@company.org','5,56 EUR') + ,('O491-3823912','LCD Sensor',20,26,12,1,'Elisabeth.Harman@company.org','5,82 EUR') + ,('D544-9061559','Rheostat Capacitor Meter',57,48,20,4,'Baldwin.Guenther@company.org','3,90 EUR') + ,('O748-4307356','LCD Inductor Oscillator',59,33,18,5,'Thomas.Mueller@company.org','0,37 EUR') + ,('O537-7333259','Oscillator Transformer',21,79,17,20,'Reiner.Widmann@company.org','4,00 EUR') + ,('G535-8172375','Film Breaker Transducer',74,51,16,11,'Arendt.Beitel@company.org','3,84 EUR') + ,('C845-4085909','Flow Network Strain',38,39,16,12,'Erhard.Fried@company.org','1,54 EUR') + ,('P163-9337479','Transistor Encoder Compensator',55,78,19,1,'Corinna.Ludwig@company.org','1,08 EUR') + ,('M225-8144152','Phase Resistor Encoder Warp',29,26,18,2,'Berlin.Schulz@company.org','5,89 EUR') + ,('D146-5615241','LCD Gauge Transformer',67,73,12,5,'Sabrina.Bayer@company.org','5,12 EUR') + ,('A315-1730287','Network Dipole',28,74,12,11,'Miles.Amsel@company.org','3,03 EUR') + ,('Z319-4514647','Phase Resistor Breaker Oscillator',14,75,11,1,'Corinna.Ludwig@company.org','1,25 EUR') + ,('N451-2350273','Network Strain Meter',42,25,18,17,'Heinrich.Hoch@company.org','4,50 EUR') + ,('B519-3674576','LCD Crystal Encoder',20,75,12,10,'Xochitl.Aue@company.org','5,15 EUR') + ,('R771-3893828','Multiplexer LCD Transducer',71,45,19,6,'Valda.Everhart@company.org','4,46 EUR') + ,('C247-3833661','Encoder Transformer',58,25,12,12,'Ratt.Beyer@company.org','3,44 EUR') + ,('T586-1678071','Resistor Transistor Capacitor',72,70,18,16,'Gretel.Roth@company.org','2,40 EUR') + ,('R658-8902629','Strain Meter',62,23,20,20,'Arnelle.Gerber@company.org','0,89 EUR') + ,('A595-2446575','Sensor Driver Capacitor',27,77,11,7,'Frau.Irmalinda‚Äò.Becker@company.org','3,67 EUR') + ,('S702-5472237','Field-effect Driver Switch',16,64,19,3,'Gretel.Roth@company.org','4,98 EUR') + ,('P162-1457428','Polymer Coil Capacitor Warp',62,71,13,5,'Karen.Brant@company.org','4,24 EUR') + ,('N733-1946687','LCD Encoder',20,60,14,5,'Ida.Halle@company.org','1,80 EUR') + ,('N819-5417282','Inductor Dipole',19,52,12,15,'Heinrich.Hoch@company.org','0,41 EUR') + ,('D762-3837218','Inductor Capacitor Switch',18,49,11,4,'Sylvester.Brant@company.org','2,43 EUR') + ,('H538-7285000','Breaker Meter',74,51,12,2,'Gretel.Roth@company.org','0,87 EUR') + ,('G179-6566342','Resistor Rheostat Meter',67,36,18,3,'Baldwin.Guenther@company.org','3,11 EUR') + ,('D519-3521758','Sensor Driver Resonator',67,13,16,3,'Elena.Herzog@company.org','2,91 EUR') + ,('L557-1467804','Phase Resistor Transistor Strain',58,22,15,2,'Lukas.Gerver@company.org','0,29 EUR') + ,('R481-9898984','LCD Sensor',73,13,15,15,'Lambert.Faust@company.org','5,64 EUR') + ,('W981-1196694','Multiplexer Memristor Breaker',75,51,12,13,'Heinrich.Hoch@company.org','5,99 EUR') + ,('T812-6060686','Coil Gauge Strain',14,47,16,16,'Frau.Irmalinda‚Äò.Becker@company.org','5,21 EUR') + ,('R944-4832283','Phase Memristor Strain',42,17,16,3,'Lili.Geier@company.org','1,43 EUR') + ,('M662-6209836','Resistor Potentiometer Meter',61,41,14,2,'Xochitl.Aue@company.org','3,29 EUR') + ,('W661-3032609','LCD Inductor Oscillator',54,65,17,3,'Adolfina.Hoch@company.org','0,11 EUR') + ,('D973-4134519','Aluminum Network Transducer',67,29,17,8,'Lili.Geier@company.org','5,24 EUR') + ,('E395-9906117','Flow Inductor Crystal Encoder',24,62,18,16,'Frau.Irmalinda‚Äò.Becker@company.org','0,80 EUR') + ,('K671-7410535','Driver Rheostat',65,67,17,15,'Erhard.Fried@company.org','0,64 EUR') + ,('F146-1429118','Flow Gauge Rheostat Encoder',72,41,20,1,'Miles.Amsel@company.org','5,15 EUR') + ,('P729-6290809','Heisenberg Driver Resonator Transducer',39,50,13,5,'Ratt.Beyer@company.org','4,38 EUR') + ,('O311-4466005','Coil Inductor',64,64,14,18,'Miles.Amsel@company.org','3,10 EUR') + ,('T782-3734983','Dipole Transformer',35,34,20,14,'Erhard.Fried@company.org','3,04 EUR') + ,('M914-2979544','Log-periodic Oscillator Sensor',39,62,16,18,'Arnelle.Gerber@company.org','4,34 EUR') + ,('H274-5987347','Driver Resonator',73,49,20,4,'Arendt.Beitel@company.org','2,59 EUR') + ,('Z768-8346288','Coil Sensor Network',64,21,17,6,'Frau.Irmalinda‚Äò.Becker@company.org','5,91 EUR') + ,('H288-7210201','Log-periodic Memristor Meter',39,54,14,18,'Corinna.Ludwig@company.org','3,53 EUR') + ,('H388-1193255','Resonator Rheostat',64,14,19,1,'Wolfgang.Martin@company.org','3,86 EUR') + ,('D400-2425852','Sensor Crystal',25,45,17,15,'Sabrina.Bayer@company.org','4,58 EUR') + ,('R860-6284767','Oscillator Compensator Warp',75,27,20,7,'Lili.Geier@company.org','1,02 EUR') + ,('J720-4179367','Phase Sensor Crystal',45,37,15,3,'Minnie.Kuehn@company.org','2,93 EUR') + ,('I319-7938682','Phase Network Transistor',13,33,14,7,'Lukas.Gerver@company.org','0,19 EUR') + ,('C858-3557118','Sensor Resonator',26,17,18,9,'Gretel.Roth@company.org','5,23 EUR') + ,('G333-6105148','Planck Oscillator Encoder Transducer',26,15,19,3,'Sigmund.Gros@company.org','2,33 EUR') + ,('W501-5990901','Film Memristor Resonator Compensator',18,20,19,13,'Xochitl.Aue@company.org','0,30 EUR') + ,('W986-7950553','Field-effect Memristor Resonator Compensator',13,45,20,8,'Siglind.Brinkerhoff@company.org','5,27 EUR') + ,('Z439-5790785','Log-periodic Network Meter Switch',55,32,19,13,'Sabrina.Bayer@company.org','2,90 EUR') + ,('I482-3778442','Dipole Rheostat Compensator',69,41,18,3,'Karen.Brant@company.org','3,76 EUR') + ,('A688-6056899','Multiplexer Inductor',63,33,11,14,'Jarvis.Jans@company.org','0,98 EUR') + ,('B633-4277974','Multiplexer Strain',71,56,11,15,'Bert.Blumstein@company.org','1,99 EUR') + ,('C574-6212593','Planck Network Memristor',13,17,11,19,'Bert.Blumstein@company.org','1,74 EUR') + ,('M558-2275045','Sensor Switch',40,12,16,5,'Anamchara.Foerstner@company.org','3,41 EUR') + ,('H609-2196524','Planck Potentiometer Transformer',56,77,15,11,'Frau.Irmalinda‚Äò.Becker@company.org','4,50 EUR') + ,('V654-5789502','Polymer Resistor Memristor Strain',33,67,15,2,'Kristen.Bauers@company.org','5,81 EUR') + ,('N463-8050264','Multiplexer Network',75,15,11,1,'Herr.Haan.Bader@company.org','1,56 EUR') + ,('W344-5163065','Heisenberg Capacitor Transducer',16,50,18,8,'Yanka.Schreiber@company.org','2,97 EUR') + ,('H173-1200706','Memristor Rheostat Transformer',14,27,18,2,'Elisabeth.Harman@company.org','2,77 EUR') + ,('A464-7310986','Network Driver',16,40,16,10,'Berlin.Schulz@company.org','2,99 EUR') + ,('L128-5499058','Field-effect Multiplexer Potentiometer',56,46,14,19,'Adolfina.Hoch@company.org','0,51 EUR') + ,('Q774-7287508','Flow Potentiometer Crystal Rheostat',44,45,15,17,'Frauke.Faerber@company.org','3,94 EUR') + ,('R726-8194447','Oscillator Crystal Switch',44,26,14,17,'Marius.Fux@company.org','5,03 EUR') + ,('D334-6681399','Resistor Inductor Gauge',55,71,16,11,'Lambert.Faust@company.org','3,98 EUR') + ,('U836-7709298','Driver Switch Transducer',38,33,19,15,'Berlin.Schulz@company.org','0,47 EUR') + ,('E416-7318916','Dipole Crystal',13,48,13,11,'Wolfgang.Martin@company.org','4,47 EUR') + ,('Y920-5864778','LCD Sensor Potentiometer',44,32,14,9,'Emil.Gotti@company.org','3,73 EUR') + ,('P901-7842562','Dipole Transistor Strain',66,66,20,12,'Elena.Herzog@company.org','1,30 EUR') + ,('Q852-7359409','Ceramic Network Rheostat',49,14,20,3,'Baldwin.Dirksen@company.org','1,19 EUR') + ,('I532-1549244','Resonator Encoder',34,33,12,7,'Yanka.Schreiber@company.org','1,87 EUR') + ,('Y968-9133870','Oscillator Rheostat',26,76,13,19,'Herr.Burgh.Eichel@company.org','3,14 EUR') + ,('O857-5463957','Transistor Compensator',37,35,18,2,'Franziska.Acker@company.org','3,62 EUR') + ,('C697-6765940','Network Driver',13,28,16,19,'Arnelle.Gerber@company.org','5,22 EUR') + ,('H236-9180061','Oscillator Dipole Capacitor',30,61,13,6,'Manfred.Foth@company.org','3,61 EUR') + ,('Z249-1364492','Meter Transducer',25,45,14,12,'Corinna.Ludwig@company.org','4,12 EUR') + ,('Y914-2603866','Aluminum Strain Transformer',68,67,19,16,'Karen.Brant@company.org','3,30 EUR') + ,('S218-3305033','Phase Network Sensor Compensator',20,65,13,9,'Heinrich.Hoch@company.org','4,16 EUR') + ,('Q442-2123335','Aluminum Potentiometer Capacitor',67,25,19,19,'Liese.Adam@company.org','1,65 EUR') + ,('U286-4664935','Multiplexer Memristor',14,59,14,17,'Heinrich.Hoch@company.org','0,38 EUR') + ,('J164-5917711','Film Multiplexer Crystal Rheostat',78,29,11,18,'Manfred.Foth@company.org','4,33 EUR') + ,('V999-1676345','Potentiometer Switch Warp',47,36,15,19,'Reiner.Widmann@company.org','0,85 EUR') + ,('F198-1414890','Crystal Transformer',78,46,12,11,'Gretel.Roth@company.org','2,89 EUR') + ,('V404-9975399','Resonator Transformer',78,70,11,16,'Manfred.Foth@company.org','3,20 EUR') + ,('O184-6903943','Oscillator Crystal',44,38,17,19,'Karen.Brant@company.org','1,15 EUR') + ,('L316-4863597','Potentiometer Inductor',36,54,15,4,'Dieterich.Blau@company.org','1,23 EUR') + ,('D331-6211280','LCD Coil Transistor',75,20,12,5,'Ulrik.Denzel@company.org','2,19 EUR') + ,('B523-5464510','Bipolar-junction Switch Transducer',29,80,14,5,'Lukas.Gerver@company.org','0,54 EUR') + ,('O125-6715778','Ceramic Network Driver',31,30,16,10,'Siglind.Brinkerhoff@company.org','2,51 EUR') + ,('G251-8414984','Coil Rheostat',13,53,12,7,'Yanka.Schreiber@company.org','3,66 EUR') + ,('Q986-9996088','Planck Transistor Transformer',24,61,14,7,'Gretel.Roth@company.org','1,12 EUR') + ,('Z272-2955088','Coil Sensor Resonator',43,29,15,10,'Wolfgang.Martin@company.org','0,82 EUR') + ,('V450-8692412','Film Network Gauge Meter',28,22,18,17,'Minnie.Kuehn@company.org','2,61 EUR') + ,('H252-2977732','Field-effect Oscillator Switch Transducer',13,51,12,15,'Kevin.Feigenbaum@company.org','0,38 EUR') + ,('I980-1040313','Film Resonator Capacitor Strain',28,16,20,3,'Sigmund.Gros@company.org','3,38 EUR') + ,('T291-4144066','LCD Gauge Warp',49,60,20,20,'Emil.Gotti@company.org','4,32 EUR') + ,('F344-7012314','Switch Encoder Transducer',59,37,20,7,'Lukas.Gerver@company.org','3,25 EUR') + ,('G144-5498082','Multiplexer Transistor Transformer',69,17,19,15,'Wanja.Hoffmann@company.org','0,86 EUR') + ,('J824-5227925','Strain Switch',73,34,11,20,'Kevin.Feigenbaum@company.org','0,94 EUR') + ,('M605-5951566','Rheostat Transformer',54,65,16,15,'Karch.Moeller@company.org','3,94 EUR') + ,('D228-6993564','Log-periodic LCD Gauge Warp',50,15,11,2,'Nadia.Schubert@company.org','4,36 EUR') + ,('I965-1821441','Multiplexer Resistor',48,26,15,1,'Kevin.Feigenbaum@company.org','2,73 EUR') + ,('L536-5185541','Coil Gauge',39,25,14,6,'Ratt.Beyer@company.org','4,22 EUR') + ,('C831-2580759','Warp',32,57,19,12,'Baldwin.Dirksen@company.org','4,28 EUR') + ,('D844-3535311','Resistor Gauge Encoder',12,36,17,11,'Bert.Blumstein@company.org','0,90 EUR') + ,('K898-8238720','Multiplexer Transformer',33,76,18,10,'Thomas.Mueller@company.org','5,10 EUR') + ,('Y299-9772513','Log-periodic Oscillator Transformer',62,40,17,3,'Kevin.Feigenbaum@company.org','0,38 EUR') + ,('X716-6172862','Coil Resonator',74,36,16,8,'Baldwin.Guenther@company.org','3,20 EUR'); + ``` + +![image](snowflake-sql-query-data.png){ class="bordered" } + +!!! success "Step Result" + + The database has been populated as shown below. + + ![image](snowflake-table-created.png){ class="bordered" } + +## 3. Create a project in eccenca Corporate Memory + +- Click on **Create** on the right side of the page. + +![image](snowflake-create-project.png){ class="bordered" } + +- Click on Project, then click on **Add**. + +![image](snowflake-add-project.png){ class="bordered" } + +- Type the project name **product** in the title field, then click on **Create**. + +![image](snowflake-project-name.png){ class="bordered" } + +- Click on **Create** on the right side of the page. + +![image](snowflake-create.png){ class="bordered" } + +- Click on **JDBC endpoint**, then click on **Add**. + +![image](snowflake-jdbc.png){ class="bordered" } + +- Type the name **product table (JDBC)** in the label field. + +![image](snowflake-product-name.png){ class="bordered" } + +- Type the **JDBC URL** path in the **JDBC Driver connection URL** field. + +!!! Note + + This is a JDBC connection string for connecting to Snowflake data warehouse in eccenca corporate memory. + + + +!!! Example + + `jdbc:snowflake://kiaouyb-fe21477.snowflakecomputing.com/?db=product&schema=products_vocabulary` + +Here is a breakdown of the elements of this example connection string. + +- `jdbc:snowflake://` is the prefix for the snowflake JDBC driver. + +- `kiaouyb-fe21477.snowflakecomputing.com` is the URL for the snowflake account you want to connect to. + The number `WTXSZXM-FS77078` is the organization number you will get from Snowflake as shown below. + +![image](snowflake-organization-number.png){ class="bordered" } + +- `?db=product` specifies the name of the Snowflake database you want to connect to.In this case, the database is named product. + +- `&schema=products_vocabulary` specifies the name of the Snowflake schema that you want to use within the specified database. + In this case, the schema name is _products_vocabulary_. + +![image](snowflake-jdbc-uri-name.png){ class="bordered" } + +- Type Source query as + + ```sparql + SELECT * from product + ``` + +![image](snowflake-query-source.png){ class="bordered" } + +- Select the **Query strategy** as **Execute the given source query.No paging or virtual query**. + +![image](snowflake-query-strategy.png){ class="bordered" } + +- Select the **Write strategy** as **An exception will be thrown, if the table already exists.** + +![image](snowflake-write-stategy.png){ class="bordered" } + +- Click on the **ADVANCED OPTIONS**. + +![image](snowflake-jdbc-dataset-advanced-options.png){ class="bordered" } + +- Type **Username** and **Password** in the dialog window, then click on **Create**. + +![image](snowflake-userpassword.png){ class="bordered" } + +!!! success "Step Result" + + JDBC endpoint is created and data is transferred from Snowflake to eccenca Corporate Memory. + + ![image](snowflake-jdbc-created.png){ class="bordered" } + +## 4. Create a transformation to build mapping rules + +- Click on **Create** on the right side of the page. + +![image](snowflake-click-on-create.png){ class="bordered" } + +- Click on **Transform** on the left side of the page, then on **Transform** in the centre of the page, then click on **Add**. + +![image](snowflake-transformation.png){ class="bordered" } + +- Type the name **product** in the **Label** field, in the **INPUT TASK Dataset** select **Product Table (JDBC)** and in the **Type** field select **table**. + +![image](snowflake-trans-connect.png){ class="bordered" } + +![image](snowflake-type-table.png){ class="bordered" } + +- In the **Output** dataset field select **product graph**, then click on **Create** . + +![image](snowflake-output-gp.png){ class="bordered" } + +- Click on **Mapping**, then click on **Edit**. + +![image](snowflake-click-on-mapping.png){ class="bordered" } + +- For the target entity select **Product (pv:product)**. + +![image](snowflake-target-entity.png){ class="bordered" } + +- Click on **create custom pattern**. + +![image](snowflake-custom-pattern.png){ class="bordered" } + +- Type the URI pattern as ``. + You can use either company.org or company.com as per your requirement. + Then type the label name as **product** and then click on **save**. + +![image](snowflake-uri-pattern.png){ class="bordered" } + +- Click on **+Icon**, then select the **Add value mapping**. + +![image](snowflake-add-value.png){ class="bordered" } + +- Select the **target property** according to transformation requirements, for example name, id, etc., then select the **value path** according to the target property as the product name, product id etc. + This step will help in mapping the data from the source to the target property. + +![image](snowflake-target-property.png){ class="bordered" } + +- Type the label name **product name**, then click on **Save**. + +![image](snowflake-trans-label.png){ class="bordered" } + +!!! success "Step Result" + + Mapping rule is created successfully. + + ![image](snowflake-mapping-rule.png){ class="bordered" } + +!!! note + + We have the suggestion option as well; click on the **+Icon** and select the **Suggestion mapping**. + + ![image](snowflake-suggestions.png){ class="bordered" } + +!!! success "Step Result" + + Suggestion appears as below can select as per the requirement. + + ![image](snowflake-suggestion-result.png){ class="bordered" } + +!!! note + + Suggestions generated are based on vocabulary which describes the data in the CSV files: [products_vocabulary.nt](products_vocabulary.nt) + +- **Tick** the box to select the suggestions to be added, then click on **Add**. + +![image](snowflake-tick.png){ class="bordered" } + +## 5. Create a knowledge graph + +- Click on **Create** on the right side of the page. + +![image](snowflake-trans-result.png){ class="bordered" } + +- Select **Knowledge Graph**, then click on **Add**. + +![image](snowflake-kg-graph.png){ class="bordered" } + +- Select the **target project** from the drop down menu as **product**. + +![image](snowflake-graph-target.png){ class="bordered" } + +- Type **product graph** in the label field, then enter the **graph URI** in the Graph field, then click on **Create**. + +![image](snowflake-graph-uri.png){ class="bordered" } + +!!! success "Step Result" + + Graph is created successfully. + + ![image](snowflake-easynav-graph.png){ class="bordered" } + diff --git a/docs/build/snowflake-tutorial/products_vocabulary.nt b/docs/build/snowflake-tutorial/products_vocabulary.nt new file mode 100644 index 00000000..5b0f550f --- /dev/null +++ b/docs/build/snowflake-tutorial/products_vocabulary.nt @@ -0,0 +1,220 @@ + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "Products vocabulary"@en . + "eligible for" . + "Service"@en . + "Product"@en . + "expert for" . + "Employee"@en . + "Product Category"@en . + "has address" . + "Agent"@en . + "Address"@en . + "has category" . + "has direct report" . + "Manager"@en . + "has manager" . + "has product manager" . + "manages product" . + "member of" . + "Department"@en . + "price"@en . + "Price"@en . + "responsible for" . + "address text"@en . + "amount"@en . + "city"@en . + "country"@en . + "currency"@en . + "depth in mm"@en . + "Hardware"@en . + "email"@en . + "house number"@en . + "ID" . + "name"@en . + "phone number"@en . + "postal code"@en . + "price in EUR"@en . + "street"@en . + "weight in g"@en . + "width in mm"@en . + "Software"@en . + "height in mm"@en . + "Example vocabulary modeled from a simple sentence about products and services."@en . + "Some value add service realized based on other product(s)"@en . + "Anything that we make and/or sell"@en . + "An employee in my company"@en . + "Abstract base class for people, robots or other things that can act."@en . + "An address object to explicitly handle address details"@en . + "An employee with some direct reports and management duties"@en . + "A department in an organization"@en . + "A price object to deal with multiple prices and/or currencies"@en . + "2018-08-29"^^ . + "eccenca GmbH" . + "René Pietzsch" . + "2018-08-29"^^ . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "0.0.1" . + . + "prod" . + "http://ld.company.org/prod-vocab/" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . diff --git a/docs/build/snowflake-tutorial/snowflake-add-database.png b/docs/build/snowflake-tutorial/snowflake-add-database.png new file mode 100644 index 00000000..f5e13221 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-add-database.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-add-project.png b/docs/build/snowflake-tutorial/snowflake-add-project.png new file mode 100644 index 00000000..a31fa985 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-add-project.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-add-value.png b/docs/build/snowflake-tutorial/snowflake-add-value.png new file mode 100644 index 00000000..13886e17 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-add-value.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-click-on-create.png b/docs/build/snowflake-tutorial/snowflake-click-on-create.png new file mode 100644 index 00000000..c2a2024c Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-click-on-create.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-click-on-mapping.png b/docs/build/snowflake-tutorial/snowflake-click-on-mapping.png new file mode 100644 index 00000000..d561cde6 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-click-on-mapping.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-click-on-standard.png b/docs/build/snowflake-tutorial/snowflake-click-on-standard.png new file mode 100644 index 00000000..dd92c61e Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-click-on-standard.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-click_on_database.png b/docs/build/snowflake-tutorial/snowflake-click_on_database.png new file mode 100644 index 00000000..cc5ac683 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-click_on_database.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-create-project.png b/docs/build/snowflake-tutorial/snowflake-create-project.png new file mode 100644 index 00000000..eb5d43b1 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-create-project.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-create.png b/docs/build/snowflake-tutorial/snowflake-create.png new file mode 100644 index 00000000..eb175ca2 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-create.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-custom-pattern.png b/docs/build/snowflake-tutorial/snowflake-custom-pattern.png new file mode 100644 index 00000000..6c43ff90 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-custom-pattern.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-dd-schema.png b/docs/build/snowflake-tutorial/snowflake-dd-schema.png new file mode 100644 index 00000000..cb0f4ae9 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-dd-schema.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-easynav-graph.png b/docs/build/snowflake-tutorial/snowflake-easynav-graph.png new file mode 100644 index 00000000..7e94fdaf Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-easynav-graph.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-graph-target.png b/docs/build/snowflake-tutorial/snowflake-graph-target.png new file mode 100644 index 00000000..26bbb4f5 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-graph-target.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-graph-uri.png b/docs/build/snowflake-tutorial/snowflake-graph-uri.png new file mode 100644 index 00000000..d73f51a8 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-graph-uri.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-jdbc-created.png b/docs/build/snowflake-tutorial/snowflake-jdbc-created.png new file mode 100644 index 00000000..1cf773c1 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-jdbc-created.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-jdbc-dataset-advanced-options.png b/docs/build/snowflake-tutorial/snowflake-jdbc-dataset-advanced-options.png new file mode 100644 index 00000000..da4bf5c2 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-jdbc-dataset-advanced-options.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-jdbc-uri-name.png b/docs/build/snowflake-tutorial/snowflake-jdbc-uri-name.png new file mode 100644 index 00000000..f5db2836 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-jdbc-uri-name.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-jdbc.png b/docs/build/snowflake-tutorial/snowflake-jdbc.png new file mode 100644 index 00000000..3620843e Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-jdbc.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-kg-graph.png b/docs/build/snowflake-tutorial/snowflake-kg-graph.png new file mode 100644 index 00000000..9fa2806a Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-kg-graph.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-login.png b/docs/build/snowflake-tutorial/snowflake-login.png new file mode 100644 index 00000000..fa5bf681 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-login.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-mapping-rule.png b/docs/build/snowflake-tutorial/snowflake-mapping-rule.png new file mode 100644 index 00000000..b7a5ff8d Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-mapping-rule.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-organization-number.png b/docs/build/snowflake-tutorial/snowflake-organization-number.png new file mode 100644 index 00000000..d39bc2a5 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-organization-number.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-output-gp.png b/docs/build/snowflake-tutorial/snowflake-output-gp.png new file mode 100644 index 00000000..907bb494 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-output-gp.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-product-name-database.png b/docs/build/snowflake-tutorial/snowflake-product-name-database.png new file mode 100644 index 00000000..b170cb91 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-product-name-database.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-product-name.png b/docs/build/snowflake-tutorial/snowflake-product-name.png new file mode 100644 index 00000000..31dca18c Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-product-name.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-project-name.png b/docs/build/snowflake-tutorial/snowflake-project-name.png new file mode 100644 index 00000000..e9eb26c6 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-project-name.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-query-source.png b/docs/build/snowflake-tutorial/snowflake-query-source.png new file mode 100644 index 00000000..ce8ae353 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-query-source.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-query-strategy.png b/docs/build/snowflake-tutorial/snowflake-query-strategy.png new file mode 100644 index 00000000..10db0c5d Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-query-strategy.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-schema-name.png b/docs/build/snowflake-tutorial/snowflake-schema-name.png new file mode 100644 index 00000000..4895e14b Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-schema-name.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-sql-for-table.png b/docs/build/snowflake-tutorial/snowflake-sql-for-table.png new file mode 100644 index 00000000..0e3a7cf4 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-sql-for-table.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-sql-query-data.png b/docs/build/snowflake-tutorial/snowflake-sql-query-data.png new file mode 100644 index 00000000..8f733dce Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-sql-query-data.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-suggestion-result.png b/docs/build/snowflake-tutorial/snowflake-suggestion-result.png new file mode 100644 index 00000000..90c85348 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-suggestion-result.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-suggestions.png b/docs/build/snowflake-tutorial/snowflake-suggestions.png new file mode 100644 index 00000000..972b7c2d Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-suggestions.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-table-created.png b/docs/build/snowflake-tutorial/snowflake-table-created.png new file mode 100644 index 00000000..b2b44c91 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-table-created.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-target-entity.png b/docs/build/snowflake-tutorial/snowflake-target-entity.png new file mode 100644 index 00000000..e542602e Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-target-entity.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-target-property.png b/docs/build/snowflake-tutorial/snowflake-target-property.png new file mode 100644 index 00000000..b6b77343 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-target-property.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-tick.png b/docs/build/snowflake-tutorial/snowflake-tick.png new file mode 100644 index 00000000..5425e08a Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-tick.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-trans-connect.png b/docs/build/snowflake-tutorial/snowflake-trans-connect.png new file mode 100644 index 00000000..37dfb671 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-trans-connect.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-trans-label.png b/docs/build/snowflake-tutorial/snowflake-trans-label.png new file mode 100644 index 00000000..659ec7c9 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-trans-label.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-trans-result.png b/docs/build/snowflake-tutorial/snowflake-trans-result.png new file mode 100644 index 00000000..9d4f5da0 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-trans-result.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-transformation.png b/docs/build/snowflake-tutorial/snowflake-transformation.png new file mode 100644 index 00000000..797751c1 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-transformation.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-type-table.png b/docs/build/snowflake-tutorial/snowflake-type-table.png new file mode 100644 index 00000000..47fe34aa Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-type-table.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-uri-pattern.png b/docs/build/snowflake-tutorial/snowflake-uri-pattern.png new file mode 100644 index 00000000..220f9223 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-uri-pattern.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-userpassword.png b/docs/build/snowflake-tutorial/snowflake-userpassword.png new file mode 100644 index 00000000..f946aa4c Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-userpassword.png differ diff --git a/docs/build/snowflake-tutorial/snowflake-write-stategy.png b/docs/build/snowflake-tutorial/snowflake-write-stategy.png new file mode 100644 index 00000000..94345455 Binary files /dev/null and b/docs/build/snowflake-tutorial/snowflake-write-stategy.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/alert_data_of_ioc.png b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/alert_data_of_ioc.png new file mode 100644 index 00000000..06583e89 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/alert_data_of_ioc.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/demo-splunk-with-kg-edit.png b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/demo-splunk-with-kg-edit.png new file mode 100644 index 00000000..5968c797 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/demo-splunk-with-kg-edit.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/index.md b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/index.md new file mode 100644 index 00000000..ff4c34c5 --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/index.md @@ -0,0 +1,181 @@ +# Specify the dashboards before the RDF models + +Another typical problem curing the creation of a knowledge graph is the time waste and performance loss due to the extraction of unnecessary information. +Thus, we put emphasis on the specification of the data model and as such limiting the data scope and size instead of conceptualizing useless ontology terms and bloating our knowledge graph with meaningless triples. + +In this tutorial, we will show how to (1) define the information available in an alert of a IDS source and how to link this with OSINT, (2) create the interfaces for the final user to show these information, (3) specify the RDF model of each concept to extract the minimal vocabulary of your minimal knowledge graph. + +## The interfaces of use cases + +In the previous tutorial, we have defined the use cases in contact with the humans, ie. analysts (see figure 1) + +

+ +

+ +*Figure 1. We need to imagine an interface where analysts can list the IoCs during the incident and read all their documentations.* + +The classic Splunk interface is a set of panels, like "static table" panel. This table panel can show a table of cells and also one cell with a text via in input a Splunk Search Processing Language (SPL). With the plugin [Linked Data App](../link-IDS-event-to-KG/eccenca_commands.tar.gz) ([tutorial page](../link-IDS-event-to-KG/index.md)), we can insert a SPARQL query and select the part of your knowledge graph to print (figure 2). + +![](demo-splunk-with-kg-edit.png) + +*Figure 2. An analyst can insert a SPARQL query with Splunk token in input of one "static table" panel of his dashboard with the plugin "Linked Data App"* + +The first dashboard to do for our use cases is the list of IoCs with classic SPL queries of analysts via a static table and allow the analyst to select one IoC via a click in the table. The dashboard with this selected row can save the ID of IoC in a global variable for the other panels in the same dashboard ([a Splunk token](https://docs.splunk.com/Documentation/Splunk/9.0.5/Viz/tokens)). When this variable (Splunk token) is changed by the user, Splunk is able to recalculate automatically the queries with this variable in the other static tables. So with this mechanism, we can print the details in the knowledge graph (with SPARQL queries) and the IoC statistics in the Splunk indexes (with SPL queries) around of one selected IoC. With these knowledge about Splunk dashboard, we proposed to analysts a first naive interface in the figure 3. + +

+ +

+ +*Figure 3. Imagine the expected Splunk dashboard with its interaction* + +Here, the figure 3 is nice but before this first schema during the project, there are a lot of shemas and all were minimalist and ugly often only on a whiteboard. This type schema before the technical feasibility is only to validate the objective with the analysts before starting the development. During the technical feasibility, we can decrease/increase step-by-step your objectives to show finally a first result in figure 4 in a real dashboard. + +![](../link-IDS-event-to-KG/demo_ld_without_html.png) + +*Figure 4. First interface with only SPARQL queries in SPLUNK static tables.* + +## Technical feasibility with the available information + +It's not really technical to check if the data is available or not, but without technical knowledge, it's hard to evaluate the difficulty to link each id to their instance in your RDF knowledge graph. +In this tutorial, we learn to use Corporate Memory of Eccenca to transform these IDs to IRI to import properly these ID with the other data necessary to build these interface. + +After research and one meeting with analysts, we have chosen the datasets of Mitre Attack, the datasets of IoC rules (Sigma and Hayabusa) in Github and of course, the IoCs data already in the Splunk indexes. + +![](alert_data_of_ioc.png) + +*Figure 5. Define the information available in alerts of IDS and in OSINT to link these information.* + +The Splunk indexes of IoCs are selected by the analysts in the dashboard via the component [multiselect input](https://docs.splunk.com/Documentation/Splunk/9.0.5/Viz/FormEditor#Multiselect) in the form part of dashboard (the form part inits other Splunk tokens). We have choosen the IDs to link these data and the figure 5 resumes how we are going to link these data via Corporate Memory of Eccenca. + +## Understand the base of Splunk dashboards + +A Splunk dashboard is coded in XML. The Splunk user can modify a dashboard via a no-code interface or directly in the code. + +A user can clone any dashboard before modifying it. + +For example, in our dashboard, you can find: + +- the root element `form`, +- the definition of input component to select the Splunk indexes by the user and +- the table panel to execute a SPL query and show the result in a table + +```xml +
+ +... + + + index=" + " + OR + index + index + + | eventcount summarize=false index=* +| search NOT index IN ("history", "cim_modactions", "summary") +| dedup index +| fields index + 0 + + + all + * + +... + + + + + | tstats count where $selected_index$ ld.ld_source_type=hayabusa Level!=info $level$ by RuleTitle +| rename RuleTitle as "Rule name" +| sort - count + 0 + + + + + + $click.value$ + +
+
+ ... +
+... +
+``` + +To read this code, you need to know the [Splunk concept "token"](https://docs.splunk.com/Documentation/Splunk/9.0.5/Viz/tokens). Quickly, a Splunk token is a global variable in the dashboard between all the components of dashboard. + +In this example, the token "selected_index" is defined by the input component and reuse it in the SPL query of the table panel. When the user click on a label in this panel, this selected `RuleTitle` is saved in the token `selected_rule` and the panel which uses this token, are refreshed. So, we use tokens in the SPARQL queries to refresh automatically the SPARQL results inside dashboards. For example, this SPARQL query prints three columns "Source","Description" and "MitreID", only if the user initializes before the token `selected_rule` in another panel of dashboard: + +```xml + + + Rule's sources + + + | sparql +query="prefix ctis: <https://github.com/SigmaHQ/sigma-specification/blob/main/Sigma_specification.md#> +prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> +prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> +prefix xsd: <http://www.w3.org/2001/XMLSchema#> + +SELECT DISTINCT (STRBEFORE(STRAFTER(STR(?link),\"https://github.com/\"),\"/\") as ?Source) (?comment as ?Description) ?link (?mitreID as ?MitreID) +FROM <http://example.com/rule> +WHERE { + VALUES ?title { \"$selected_rule$\" } + + ?ruleHayabusa a ctis:Rule ; + rdfs:label ?title ; + rdfs:comment ?comment ; + rdfs:seeAlso ?referenceLink; + rdfs:isDefinedBy ?link ; + ctis:filename ?filename . + OPTIONAL { + ?ruleHayabusa ctis:mitreAttackTechniqueId ?mitreID . + } +}" +... + + ... + ["Source","Description","MitreID"] +
+
+
+``` + +!!! Tip + + The editor of Splunk is limited for SPARQL. You can develop your SPARQL query in Corporate Memory Sparql editor. After, like you can see in this example, you have to insert (automatically) `\` before all `"` in your query before to copy this SPARQL in a Splunk query. If your SPARQL query works in the dashboard, you can insert the tokens. + +!!! Warning + + You can follow the tutorial about Mitre Attack and Rules wihout using Splunk. If you want execute the dashboards with your knowledge graph, you need to modify the SPL queries of dashboards according to your data in Splunk. We do not share the indexes of Splunk in this tutorial. + +## Technical feasibility with the Splunk dashboard + +During our project, we have implemented the SPARQL command necessary to execute a SPARQL query in a SPL query but also several scripts to extend the panels of dashboard. For example, these are problems to print a HTML text and open a external Web page in a dashboard. Before starting a knowledge graph, we need to know if we have to work with a specific syntax in output for Splunk. So, we have searched the simplest solution to print the HTML literal in our knowledge graph with their links. We found it and implemented simple Javascript scripts to resolve these problems. These scripts are imported via the header of dashboard XML and called in the XML of static table panel. You can see the final dashboard with the Mitre description in HTML (the Mitre in these datasets uses Markdown but we show how convert Markdown link to HTML). We give you these scripts in your [Linked Data App](../link-IDS-event-to-KG/eccenca_commands.tar.gz) ([tutorial page](../link-IDS-event-to-KG/index.md)). + +![](../link-IDS-event-to-KG/demo_ld.png) + +*Figure 6. With an extern Javascript script, static tables support HTML and the user can open.* + +## Conclusion: starting to specify the necessary RDF models for these interfaces + +With the interfaces, the available data and their links in head, the analyst can now imagine the necessary RDF models of concepts (for example, figure 7 and 8) in his future knowledge graph to generate expected dashboards. These RDF models evolve at the same time as the interfaces (forever) and according to future RDF standards of Cyber world. With Corporate Memory, after each evolution of your models, you can rebuild your knowledge graph "from scratch" when you want. Several RDF models of different versions can exist in your knowledge graphs, so you can update progressively your dashboards without service interruption of old dashboards. + +![](../lift-data-from-STIX-2.1-data-of-mitre-attack/rdf-model-course-of-action.png) +*Figure 7. RDF model of Mitre concept "course of action" in our future knowledge graph.* + +![](../lift-data-from-YAML-data-of-hayabusa-sigma/23-1-rdf-model-rule.png) +*Figure 8. RDF model of concept "IoC Rule" in our future knowledge graph.* + +--- + +Tutorial: [how to link Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT)](../index.md) + +Next chapter: [Build a Knowledge Graph from MITRE ATT&CK® datasets](../lift-data-from-STIX-2.1-data-of-mitre-attack/index.md) + +Previous chapter: [Specify the dashboards of use cases before the RDF models](../define-the-interfaces/index.md) diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/interface.png b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/interface.png new file mode 100644 index 00000000..11645a30 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/interface.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/use_cases_with_interfaces.png b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/use_cases_with_interfaces.png new file mode 100644 index 00000000..25852b71 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-interfaces/use_cases_with_interfaces.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/advanced_use_cases.png b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/advanced_use_cases.png new file mode 100644 index 00000000..be3251fc Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/advanced_use_cases.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/basic_use_cases.png b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/basic_use_cases.png new file mode 100644 index 00000000..4f5e8fae Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/basic_use_cases.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/diagram.drawio b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/diagram.drawio new file mode 100644 index 00000000..07621d1e --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/diagram.drawio @@ -0,0 +1 @@ +7V1bc5vIEv41qvNkirnPPDp2spvaeNcbpzZ7HrEY2xwjoQXky/76M8NNwIwkJAGSnaQqiRgQkrq/7uk7E3Qxe/kl9hYPV5Evwwl0/ZcJupxAiCDD6j+98pqvQI5QvnIfB36+5q4WboJ/Zb4IytVl4MukcWEaRWEaLIpFkC9Oo/lcTtPGmhfH0XPzsrso9BsLC+9eNu6uF26mXiiNy74HfvqQr3JSu/pXGdw/lJ8M3OLMzCsvLhaSB8+PnmtL6OMEXcRRlOavZi8XMtTUa9Ll05qz1ReL5Tzt8gZy5d//z/vt+V8a3/01T9lL6PEzUXy5Jy9cFr/4ZhEu54/Fd05fS0Kor7/QL5ez8FPszdTLD88PQSpvFt5Urz8rAKi1h3QWqiOgTxf0gupD1ImSSkgf3UbLuS/9L7flxU8yTgNF9vMwuJ+rtVng+/qjP3jFQijv1Ls/JOrjgvn9l+zokqiV4geo98uXtaQBFcEVVGU0k2n8qi4p3nDGKM3fU8D0DOOCMM8rplNSXPRQZ7jLiyu9Amn31e1XzFAvCn7swhuwljeut1hkaI4zpM29e0UTfb/5k0zS4N5Lg2ieZAv6YvX3t18mkIaagrfqPfRev4ru1Ak5ncr51OuT35QPye8kjaPHShhhXwggvIUA14IAxE0ECDIYAOAGACi2JZrDcu4vokD9yjcjsL6XPEi/uE0fvEOuaPKu0rk13gGGHWKRX06G4h5azz1NgtvIi/3kB2YbI27JkZJxiAiDcRi5NsZxIQZiHIDC4JzBJnUfZYKs404f5MG8iWpmwXS5S9UJQ3tQR98Xies/Pv758PdZ+O0vRaHF9b9n+J2YCgYPLJzaCbUAcsteASzWAhVD7RUdbYX0Qep/l2kUB144mkkAKHqDJgGGJqctdiER0KagKB5KEMGGneUimil70H87MmnZVg4TUMiZwTbXpjyhdV8BbDC2bTDn3olBcKBqRW2+AWGzByxcI3wwa8Dc9i5rzHLTSEcfYumlWrOaGlU7X9Nlkkaztn/WJ6cxaXCanKCLbWpTZDHTFRdM7kJ3KCMdEIO7H1+82SLUzMw2w0oyrdzNd1XN4wf1dc9C+ZQFwAbjMyBDSnQ/fHYdwcTqT4Pngnbl+GBa2JTnnTj+HKgvnrNc0Xi6DJXg6ysf59FzKP17fZt7HQwtb/fHzeffv1lv9RR42Y4dL6I4Vx9XchZl1MziNulDkDSstf5wxBshGtyzvmjaY71tD5A72NghCDERxVcX1kGFhrPIDEx9/l0dn8+98DXZGJo5nyrm1oj9xbuV4XWUBJnmQJe3Uaq3DpMbadTibbRMw2AuL6pAuNsT3Tmgbc0thKm50Zi+KDDj1l8CTenCw/kcXWjR8ZdxFhhVWgcBTY/8bDCfBr6miP4BmTir9UBrcl8m0zhYFOHTPXz+QyGOHWEYrxbvEtio3Uck2k5tE98fX+R0WZo8JXVvrs+//vlFrf2zlPpjqxNVGPrmWp+OpbrAIhfDExhy6DCDwMhC4PI31wk8nGtADQJfx1lQt8BzDZdNkmdbjEL7fzTc46XexUYnKqHEglobUeGoOoJtIepVkMa5OlBm3Kyw1dySoseQfyslgSUTMTIlzYDoV+lpqyeaV9T8Lm+b0CyQG02XM0WSkrzekxeE3m1mbnnK5khbeJ4X6vso2hcaBoawwphZI9JDkR+am10TyGrff0xq0M2VgbyTihpTeRwguwaQuW0fc8fEMTT3sQ2EzNTDaZKyyjk2dqxRSWnGIJUUKz9K/erMzWkeKYsrXPqyWrxvXFIctUhbs23bxm9lFYfaXP7gTR/vY+2+XEShtqYv51qNoA9y7p/rGhC1Ei3kPF/5FOhfmlnHjQhWnPs/2wzn1IvvZdph28l8wfo7k2gZT+VWo3Y9ElzHBQg0kABN7weUPI+l8k2Dp+aXsAGh+MTrPI28Ah40gQfcVfqjvFX+u66rJPSndTdEFiTbbpiTeMMNywuju7tENq7JsFyR7gB4m1GCdwVvher49e/6wX/1gUPKw8uX+snL121i0RHcXeSHWuVnrVgoqRCkGWU6G1QsgA3FeH+xwK7thm3NfQpCYQZLfwrFYUIhOgpFaQK+NaHoUSREO3d+ChJh+u3vSyJegvTv4ox+XZMHdbQSB30wpjSAn9JwitJgBlzelTSsRfZ2m8YO2C4yge3IHgK2EGBLggUeYPALZLkh7mbu94VKZDr9l7UMX5a/z0qo81Bgs4C6AOP8NlnY4NhbJheeYqUbBg4xtZihNq0JXDBYpZtphH6PgywTkcdwLq4+Xl1oNmUB81pocXIBJ+dFvUaZuZ3kaYm5fG4z3+D18BWfUOAWtW0RM2IJ8/SRmLAS27RvNhM7J68vQ5nTdn4CZEVljHEFYgtZqYWshAxEVm6Q9UauiBrmmcwsCDmNZotlKuOsmWO2CJU6yOsNglXkfZXOHJ22OifP8bpqD4DMco9KMdQJ3Udi3l6Ev5HQWZqhTAGrX600eEZqdK6PZRxEfgZiv8aI0yMyPzaRLYWNl5s0QI7snAW6L+kIBMWO297ZzI1tZCpaqnrXKAXDSmnk2VeEbVc3JKmXLvfLYRxKcOiU3UwlwZlZ2mkl+GDtVZb8cFXAkMj4KZjKNQXyr8oAVv/dBXHGE1tvXcaJ/LqmDZkodXIbvRhMGLsm6DCGcmNLtZgqQ1UEWblpTUi1gb7y/QpvsEYrm69n+Gt7hTUmHZ3ENemfeqvBBvk41PtjwijQpe0qzM6en+VmHHSLWOzh99kBYYtWvy1AiKMCgrsGD0W7xqEzICgTDmEIUaGMQgFxq99aCNdhGHMiXMI5Y6MihZlezo2yX6aruoBAAeFFZ/8LYzBf9UKlQ/XWXFR91yqHGu1Wpbd5HPeHQeRw1iQ3ZJbop23zHUxdM3Pz/bqcnwzJzBYiavEZbRRDQ/mMzOY0tlC6KlMx4hxHIGJLxqFbUfV4RDQdwosoXM408n79dqVNv69qU1BkjCsh1lZzMM0Udl62tvDm0qzGH6EjGLSsLmqtqLIUrg4mxvyHKAPadddf00jGzH1/A0g3ZLMIapUBla7MEFkB7JpZAdEGVGc7ADJLjsFty/u4ySw7sm0VQKdhPlrsxw0O7vHsR9oE6Rkvu792Rg1o7yWcio5VY33hQZjuxEn1+Bzoz8Pm1mIJ3I7qzQP3h8gl97KxsK77CtmqDvrbNCh3iBBId2YDxlkzZH0GAXGYYBwRwhElEOyrGKBADmOUMaE+CLqGngDqezBK9fQfSBhDrS7xgXUGcE1z8yeKNycRtqKYjoli6uBa4qU1ImzvYAgUwGHKUtfDDBhAouWdA6SEBwoFacAFcmF72xwatZZ2v4s4S9ysDYtn3uZy4WeuZjPgXUtHrAmne6HRM5+s7ZbOE85verNl7eD5sWPnwNIUb9B4jIlXTcLYvNuhJl6toYvNChnbCdg4G3C7EwDWUH0kLwBw5sC2w9curOjuCOiapJYtMbYnAIAlEvdz2NaBst9yQIhlYhMcV/gt3YLt/LBlm6rtaOXOl1i3vixDrLczs8rQuKdGkwwT+fwgYzOW+6Z3Pxujx938Sp1+ekq+0jTbtfw6qo+k5RHgjmIRoBgDF6FW5Icy5e4hlyofzeUCkL29PWWPtwrha8NJxlL/0FT/5/6TN59mdXll+qBelpNXnp5aNqEliJaRLiNbW6XYd/SW5UsqdTb2rTjLVXuZbuR1+aTRY0bxZHOTWXZ0LeMgq1HcWdd0sBP5Rry4jkJI01G1FHD11kGDUXOXaFeBddUZuAlyhLtFgMbMNABLh8IfGlvV8Je8XcGfmJNfysTvcSusLfWUR6/8Bcjc1i/KMY06khBGz8W8vkw7m2SszSSpKJ1kGfdM0Zf1wUegNtWx1TXlwHbKc9vAkuEqK9GBQ/ZWYxVXXPqxpyoisaEEXJlWBs/tYxXhcCw382PrypeT1ySVehzqIo70UwyUG1WI4KqQ2Wh1mMv0OYqz6SxFiVVUDhVLFnIa3GVGVVW0n5/MvnetheIIssocBtbyDXfUkoM9YwQg05gt9h5zklNTZP9Z6ifXfNg097S8ZrJ7k0XLdj6SmkVr1Sy2qtmBpkKtqSfZzVx+c8mlNeMYttjJk73c742dox28720VO4Ly1uAeYMKnt7QV2Zi2ajcLdne/+ea0FdwrbTWqqY1NU/tdycx+6N84GrsH9APanuxum6rXm+/oKvuYuNUf2Phowh3hUrWMOaKMI7hvMApj7mDBMMOUI5fwVlyKO4xTJiihGLuoDOR1loVX668fUjJMd+ldSUY1ysRRrJ/Ux5kgwiebBprog/0DL9vlrHSWOgjathDN2IJGnNbmAtTWwyFiSvmrswKRFu53kC7mqLdTQZSsUtr8VQABBxOgn8cGscCCw5OXrn6705qhRNYMJTJYxRaPFUvcPrRk2E62ZtBv78E7VCjvTWHMRQhDULUlVYYUgw7nFEDCKIKCjZyHwKdQobyxVnZrhxs6btaKu20Ttt2j2L3hEZkPi8K6bV+pQKg72tSuMzY++m2AXLljpspBYFiNsxfiNli1R1RNbcTt32ILTcShIyPONg6vJ8SRJuKwGBhy25GETmuXq9KnuyMJWB50d2QkmYV3+zyl53vwGPhe2uvTjYd9qNq6R+f0EIZu+sEr/DSenLO6rveH4q3htFki/6WWKwi97PXMC5/Vzy0qqVbjThJNFg2BLEeg2b2QfmDye/hwMRVKYlpSxGxj2m3FTcNl4ogZ8LKQ92kZzmXs3QZhkAYyOVESM1cYY3usLbDK8LI0wQ5I5B8kduI6QpTDX/Nt2MVs59hJfVsHormtU1JZlkeyJK1tuhv6MDdEY1wAmmgdcuYsRk1z4EwwJS2IA4ohxtSIkexQdNe+8c6jZ6vq7eb7Boy3kHfel16PZoqGRDKORopmbny84uFN7hi0on5DhjIN6aFEOAxzJigiyKga22ECLnWU8UQZJIK4CIn2p+hApkCAqr9aVHcUrDEkyYwydZyS1sX4fgP16u1RZwJhyxiTcUvWySn0JR04nIAc133WncGAQ4ZcDhBFVRdALTADHEQIIxQJgklbNrt718aoPAUgoWxGgnWihHfLDPYnz5bmpT/0GNT3OcjA6iCMLKy2JvCxhdX+1WhnacXHnUVnmSeIEHNA6047COXmzA4WytU5WmanxOIJIoasSUEfbyYhAwfhgDscCgQJAmRVslS3z7iyMpGASHAXdbPP+sOBpRH/2+f3q6ttIcmedLU6jCNdjLpikH5I+1XkS33F/wE= \ No newline at end of file diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/index.md b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/index.md new file mode 100644 index 00000000..b8a332cb --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/index.md @@ -0,0 +1,122 @@ +# Define the need, the expected result and the use cases + +A typical mistake when staring to work on a complex ontology is the absence of a real use case and a lack of understanding of the cyber analysts requirements. + +In this part, we explains how to: + +1. Clarify a need +2. Propose an expected result +3. Define an use case to implement + +## Define the need of precise users + +There are three things to know to describe a need: + +1. For who +2. What +3. The context + +With our customers, we claim a knowledge graph can reduce the work of analysts in the Cybersecurity. So, one of our customer wanted to help their IN Analysts with the software Corporate Memory of eccenca. +After several meeting, we defined the need. + +### For who + +!!! example "For who" + + The future use case is to help the IN Analysts (Incident Responders) but also SOC Analysts (Security Operation Center). + +Each field of activity is vast and brings together very different professions. Cybersecurity is no exception. It is necessary to organize work meetings with end users even if they have no knowledge of knowledge graphs for the moment. So you can ask them about their trades and identify what they want. However, keep in mind the most famous quote attributed to Ford: "If I had asked people what they wanted, they would have said faster horses." During the meetings, the question of "What" is not about the final result or the method to do it. The question is "what do you think to need?". After only, we can start to imagine how a knowledge graph can help or not. + +### What + +The conclusion of first meetings was: + +!!! example "What" + + The analysts want a solution to link the heterogenous data of different indexes in Splunk to improve their capacity to analyze an incident via their Splunk dashboards. + +Of course, during the meetings, a lot of needs are explained by the analysts but you need to choose the need to resolve according to the context. + +### The context + +During the meetings, we try to understand the "why" of their needs and their feeling about the knowledge graph technology. + +!!! example "Context of the analyst job" + + Today, a IN Analysts (Incident Responders) switches between the timeline of alerts’ messages and an autonomous research in his event store (like Splunk). During this research of evidences for the last incident, there are often new unknown alerts’ messages of recent indicators of compromise rules. Each analyst for each unknown message will try to understand the reason of this message before investigating in the metadata behind this new alert. A professional analyst takes between 30s and 2 minutes to open all references in his browser about a new alert. + +Feeling of the analyst about the knowledge graph technology: + +!!! example "Feeling of the analyst about the knowledge graph technology" + + Today, typically, the IN Analysts have the skills necessary to write NoSQL requests to query their event store. + As eccenca is going to create RDF graphs of OSINT, IN analysts will need to write SPARQL queries to jointly query IDS and knowledge graphs. + SPARQL is an untypical skill among IN Analysis, thus, they need to make the investment to gain this knowledge. + Like every investment a payoff is expected, in this case we see a significant reduction of the time spent by the analyst. + Only after this demonstration, the IN Analysts will try to learn maybe to write SPARQL queries in their dashboards or they will create a new job in their team to do these new dashboards. + +Very quickly (in a lot of customer meetings), the skills are the first problem to work with a knowledge graph and the no interoperability of a lot of knowledge graph on the market does not help to resolve this problem. To onboard the future final users with the technologies of Linked Data, a minimal and simple need is often the best way to start to think "graph". Only after, we can propose more complex graphs to resolve other needs and only after, we can do to understand the objectives to build/use in their domain a global ontology. + +## Propose an expected result + +Here, the context shows this project is an exploration with like deliverable probably a demonstrator. So, your project started like a exploration with a lot of meetings to understand how these analysts work concretely. We choose a public dataset of one previous incident with the analysts. After, they create the Splunk indexes with these datasets. With these Splunk indexes near of the reality, we can learn alone to use Splunk in order to understand the desire to use this tool to build their dashboards with a knowledge graph. + +During this step of R&D, we are developing the tools to request a SPARQL service via an authentification OAuth directly by Splunk dashboard. You will install these Splunk apps step-by-step during this tutorial or you can download their "tar.gz" in SPlunk now: + +- "[Linked Data App](../link-IDS-event-to-KG/eccenca_commands.tar.gz)" to install the SPARQL command. You need to configure it with the details in his README file or in [its tutorial page](../link-IDS-event-to-KG/index.md). +- "[Investigate lateral movements with a knowledge graph](../link-IDS-event-to-KG-via-cmem/eccenca_poc_investigate.tar.gz)" to install our demonstrator to connect SPLUNK to CMEM. You need to read his README or [its tutorial page](../link-IDS-event-to-KG/index.md) to understand this example. + +After several propositions, analysts oriented the implementation of our first dashboards and finally, we showed clearly a benefice to use a knowledge graph via these results. + +In this tutorial, we study only this first result: + +!!! example "Expected result" + A knowledge graph will reduce the time required to research details on the Web of each new alerts in the IDS of IN Analysts. + To achieve such savings we aggregate all links of sources and references about alerts in the Security information and event management (SIEM) in a knowledge graph. + Analyst are able to read the Mitre information directly in his timeline (e.g. in SPLUNK) and to access all references about an alert from this central place. + + ![](slide_result_expected.png) + + *Figure 1. Example of expected results for analysts during the task to understand the meaning and relevance of new alerts in their IDS.* + +When we know the waited results, we can imagine the necessary use cases. + +## First use cases + +We know the final need, the expected results and the limits of knowledge graph with the Linked Data technologies in Splunk. So, we can define the probable use cases to implement and all the actors who will interact with these use cases. + +![](basic_use_cases.png) + +*Figure 2. UML use cases to resolve this basic need and several use cases with Wikidata to show the interoperability of knowledge graphs with the Linked data technologies. Each bubble in this type of schema is a use case.* + +With a simple UML schema of use cases, you can delimited each use case, their priorities and their tasks for the next step, ie. specify the essential interfaces to limit the complexity of future RDF graph. + +In this tutorial, after to test this first result, we claim a knowledge graph can reduce the time required to research details on the Web of each new alerts in the IDS of IN Analysts by 50 to 95%, see figure 1. The next step is to specify the interfaces before starting to think about the graphs. + +## Advanced use cases + +Another result of this project was to resolve this other need: + +!!! example "For who" + IN analysts +!!! example "What" + Calculate and manage their investigations' knowledge graphs of high-level and low-level directly in Splunk +!!! example "Context" + Linking IDS events to a knowledge graph can be complex. + This is for several reasons like labels/IDs/structures of the same resources can be different. + Corporate Memory provides advanced capabilities to perform this in an automatic way. + To use these tools, we need to export the data of SPLUNK to Corporate Memory. + Analysts need to export data from SPLUNK to Corporate Memory on the fly and execute Corporate Memory workflows with reconciling complex data automatically and SPARQL update queries directly triggered via their SPLUNK dashboards. + + For the moment, we are searching the best way to resolve this need but a demonstrator to manage several investigations in the same knowledge graphs is available with several examples of dasboards in the Splunk app "[Investigate lateral movements with a knowledge graph](../link-IDS-event-to-KG-via-cmem/eccenca_poc_investigate.tar.gz)" ([tutorial page](../link-IDS-event-to-KG/index.md)). This need is for advanced users of Corporate Memory and it may be proposed in a future tutorial. + +![](advanced_use_cases.png) + +*Figure 3. UML use cases to resolve this avanced need.* + +--- + +Tutorial: [how to link Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT)](../index.md) + +Next chapter: [Specify the dashboards of use cases before the RDF models](../define-the-interfaces/index.md) + diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/slide_result_expected.png b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/slide_result_expected.png new file mode 100644 index 00000000..7f59ab89 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/define-the-need/slide_result_expected.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/index.md b/docs/build/tutorial-how-to-link-ids-to-osint/index.md new file mode 100644 index 00000000..9b48f7d7 --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/index.md @@ -0,0 +1,44 @@ +--- +icon: material/table +subtitle: such as STIX +tags: + - ExpertTutorial +--- + +# How to link Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT) + +## Plan of tutorial + +1. Introduction, level, material +2. [Define the need, the expected result and the use case](define-the-need/index.md) +3. [Specify the dashboards before the RDF models](define-the-interfaces/index.md) +4. Build Knowledge Graphs from: + 1. [STIX 2.1 data such as the MITRE ATT&CK® datasets](lift-data-from-STIX-2.1-data-of-mitre-attack/index.md) + 2. [Indicators of compromise rules, like Hayabusa and Sigma rules](lift-data-from-YAML-data-of-hayabusa-sigma/index.md) +5. Link IDS event to a knowledge graph in dashboards via: + 1. [Queries](link-IDS-event-to-KG/index.md) + 2. [Inferences](link-IDS-event-to-KG-via-cmem/index.md) (for the advanced users of Corporate Memory) + +## Introduction + +“Everything as code” has become the status quo among leading organizations adopting DevSecOps and SRE practices, and yet, monitoring and observability have lagged behind the advancements made in application and infrastructure delivery for the Cyber Investigation Analysts. +“Investigating as code” is not just automated installation and configuration of agents, plugins, and exporters to collect the alerts of Indicator of Compromise (IoC) — it encompasses the conception of a custom dashboard to navigate in gigabytes of event data linked to open data of Open-Source INTelligence (OSINT). +However, traces and knowledge about attacks are heterogeneous due to fragmented cyber communities. +This fact prevents rapid development and makes the “investigating as code” a difficult and tedious task, including cybersecurity event browsing. + +This tutorial is going to demonstrate solutions that exist to browse the knowledge of an attack like on the Web with Linked Data technology. +It also includes the development of new custom links between events and knowledge, ie. inferences. + +This self-service monitoring/alerting and now inferencing allows analysts breaking data silos which enables by continuous improvement the linking of Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT). + +## Level + +This tutorial is also suitable for beginners. +Simple examples will allow you to discover Linked Data technologies. + +## Material + +eccenca will offer an online sandbox running an instance of Corporate Memory. +You can also install Corporate Memory Control ([cmemc](https://eccenca.com/go/cmemc)) on your computer to test the example of bash scripts in this tutorial. +For the part "Link IDS event to a knowledge graph in dashboards", you need to have a Splunk instance where you can install the Splunk apps of this tutorial. + diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-collect_IDs.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-collect_IDs.gif new file mode 100644 index 00000000..383d76f4 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-collect_IDs.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-RDF-dataset-result.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-RDF-dataset-result.png new file mode 100644 index 00000000..717bda94 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-RDF-dataset-result.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-RDF-dataset.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-RDF-dataset.gif new file mode 100644 index 00000000..bb03fb04 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-RDF-dataset.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-prefix.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-prefix.gif new file mode 100644 index 00000000..729ec803 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-prefix.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-project.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-project.gif new file mode 100644 index 00000000..7fd695fe Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-project.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-transformer.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-transformer.gif new file mode 100644 index 00000000..da9c5357 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-transformer.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-workflow.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-workflow.gif new file mode 100644 index 00000000..1505384c Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-create-workflow.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-graph-navigation.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-graph-navigation.gif new file mode 100644 index 00000000..4aea5aac Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-graph-navigation.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-STIX.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-STIX.png new file mode 100644 index 00000000..83a8a548 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-STIX.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-gen.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-gen.png new file mode 100644 index 00000000..b1ea9137 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-gen.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-global.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-global.png new file mode 100644 index 00000000..3a572219 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-ex-workflow-global.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-objects.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-objects.gif new file mode 100644 index 00000000..0c0e237a Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-objects.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-properties.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-properties.gif new file mode 100644 index 00000000..9599bbdc Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-properties.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-rdfslabel.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-rdfslabel.png new file mode 100644 index 00000000..387e1dcc Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-rdfslabel.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-references.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-references.gif new file mode 100644 index 00000000..fde7c2d3 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-references.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-root-object.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-root-object.gif new file mode 100644 index 00000000..7415a0df Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-extract-root-object.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-import-JSON-result.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-import-JSON-result.png new file mode 100644 index 00000000..48e9c0ac Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-import-JSON-result.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-import-JSON.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-import-JSON.gif new file mode 100644 index 00000000..e98e108e Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-import-JSON.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-regex-replace.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-regex-replace.gif new file mode 100644 index 00000000..d3404d58 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-regex-replace.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-regex-replace.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-regex-replace.png new file mode 100644 index 00000000..92eb1930 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-regex-replace.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-see-steps-during-a-transformation.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-see-steps-during-a-transformation.png new file mode 100644 index 00000000..b448bf37 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-see-steps-during-a-transformation.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-all_datasets.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-all_datasets.gif new file mode 100644 index 00000000..930d27fa Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-all_datasets.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-query.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-query.gif new file mode 100644 index 00000000..abab579e Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-query.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-task.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-task.gif new file mode 100644 index 00000000..97606a23 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-task.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-void.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-void.gif new file mode 100644 index 00000000..e12c76fa Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-sparql-void.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-cmemc-activity.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-cmemc-activity.png new file mode 100644 index 00000000..7ac4172a Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-cmemc-activity.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-extract-rdfslabel.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-extract-rdfslabel.png new file mode 100644 index 00000000..00e8c500 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-extract-rdfslabel.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-transformer.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-transformer.png new file mode 100644 index 00000000..57483198 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-transformer.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-worflow.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-worflow.png new file mode 100644 index 00000000..c7a004ac Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-success-worflow.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-warning-bad-uri.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-warning-bad-uri.png new file mode 100644 index 00000000..f65d5273 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-warning-bad-uri.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-workflow-import.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-workflow-import.png new file mode 100644 index 00000000..1f39fc80 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-1-workflow-import.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-2-fix-url.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-2-fix-url.png new file mode 100644 index 00000000..1874a56f Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/23-2-fix-url.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/MITREATTCK_tutorial.zip b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/MITREATTCK_tutorial.zip new file mode 100644 index 00000000..94ee2f6a Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/MITREATTCK_tutorial.zip differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/RDF_model_and_pattern.drawio b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/RDF_model_and_pattern.drawio new file mode 100644 index 00000000..6e7e8bd6 --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/RDF_model_and_pattern.drawio @@ -0,0 +1 @@ +7Vhfc9s2DP8se/Dd+kCfqP96TNKkfehuvcvt1j5SEiWzoUSFomN7n36QSNmiZNdOm2R32/xgiQAIgPgBMOiFd1NtP0jSrH4TOeUL18m3C+/9wnVdx/Xg0VF2mhI5riaUkuWahA+Ee/YXNUTHUNcsp60lqITgijU2MRN1TTNl0YiUYmOLFYLbVhtS0hnhPiN8Tv2T5WqlqXHgHOgfKStXg2XsGE5FBmFDaFckF5sRybtdeDdSCKXfqu0N5V3whrjofXcnuHvHJK3VJRtuP3mfv2zQlfhaP+bV7f327o9HZLQ8Eb42B164IQd9121D6s5rtTOhCB/XnavX1lvZPVdKdWhcdbbdu5Kp1TpdZqKCRcWUpIgoRbIHWOoX1Cq2RTlRZNGlh7YHXG1S60zXdc4pQjjxsZcHFIURDZBP/BgRP4OvInXCNEoCP6cmvntPXTg45Acsrjcrpuh9Q7KOs4EU7d2tOKwwvBaiVibncAhrwllZwyKDmFLZezUN8hAxKhXdjkgm6B+oqKiSOxAxXOQmgd5jSsAPTUZsDgnlD1myGiVTZGjE5HC5132AuYuxRvoZqCfPRx0Oq5AJDwDtcFocT4ZMMQIiv6ffunJ0Q1J1Ma/TttFCx8B+OQBfAi8cu0s/GX0iCz4vmsOHB4jH8PnBK8E39MYRfmQewjq/6vpfl82ctC3L7MhJARVGOzPOc+LYirXM6PmOoogsqTqfgzS3+u8clVGUgyM1MtAk5USxJ7trH4u8sfBZMDjZHvTQLtHEm5SePrbZNG6yEz0Y24rieKJIx2WmqM+D/al/IjVON/ScPV3Yz4cdqZxSwKdezUuX7ev03SH2BosgOdJ3Paj1eJ5WU9hernbd/wE6BVA4BGcMkB+9MUDeDKAXmW8uR3eLtNZMcA6/oUzUMAYVQYEDz0NFiCPkZyRGCUl9FBKYsMOoIA5O/i1ZEU2ywguOZEWwTPy3zAr/+SMT4CeknpZkmf4KroFtZ3i868PldCFFBakY32nRj5Q/UcUyMuK3fcw7Lg6b7ZihjXacWsiK8BHviUhG4AkYEbWWtD0jl5HmlMjGhLhj+o6jOZwqAB3B8TNWl/OdQjYrUhuVrqadnCI1h8FEUhs7znDQnqMkqCpA+2CnppoLSdHf8UZGNkLmtlt7XXCS9IGBuk5nq6R4oMiklSWXQhWX/YSEJii6AdYAjl/ejTzNaSYk6atWrVj2UNPWuMdqBrMxPy47QvK7ciN3LLmCC6KmwclZ23CyG8Q5A4br/MKqRkhF6u8O8GIY4C8b2H9q2gTQ5e5Lx1wGw/Krke0X77fWamdWrz+lDr8GZ8fUoXs5SydKQvvCgGf96xUnWezZE2jgTK4hl46ys/FpqujEKHtQNAiKomjp64y70fPb8n/nJgu/pEvPGX3si2zo/+MX2XgG35tdZM+XfnRh6b9RXQOYUJNwU41gDvRgBLLBDP2lH+AkSqLYi90o+bGiD8JoGY8yBltGMJ7ei3/4OgvLw1+fWvzwB7J3+zc=7R1bc5u4+rech0zbMwOjK4jHJm22Z6ed02l6ZnefdmSDbTYYvEBu++uPBAiDwAlxgOCWTKcGSQih736RdIYvtve/xHy3+RK5XnCGgHt/hj+cIYQAwuJHljzkJTZAecE69t28CO4Lrvx/vKIQFKU3vusltYZpFAWpv6sXLqMw9JZprYzHcXRXb7aKgvpbd3ztNQquljxolv7mu+kmL2UU7Ms/ef56o94MQVGz5apxUZBsuBvdVYrwxzN8EUdRml9t7y+8QE6empf8ucsDteXAYi9Muzzw1f771w+fLpdr9M9ff2w/X/H/2rdG0cstD26KDz5DViD6O3f9Wzno9KGYCevvGznS89rVuvjNnljEeokYTNaNKkW1HpEYnwCjuDm/2/ipd7XjS1lzJzBJlG3SbSDuoLhcRWFaoAa0xD0P/HUobpbi07247Lo6F+rDvDj17itFxdz84kVbL40fRJOi1sAK5QpMhRggk+ZFd3vQYwXPTQXsrCjjBbaty+73ABEXBUyeAR80w0fBBzlUgw8irw4ffBA+yY6HHQG0SVPJzd7LoaDLtZ9ubhbmMtrKEflp7Bk8TfnyWtzmF0aS+veGy1N+hnBRtBO/Xhwaxoq6zPNcyyCMOwZZuiuDY9c2XLhaccdZYhfxCvzzYZ4EAmCgEShUFFsBP2kDvz0U+MnzwS++NjWK+REQB4G3aseKZerzrEkrrOpg7w9yPQAKEWBS29n/sTrYAGiCDSriroKN0IHARp8PtmUURHEOsXi9eCu+QLwaqJ932cwBOZnGim/94CFv+skLbr3UX/JKfZLNtqyF1u6+WpG/VNaEUbzlQaXulsc+F78Cb3h6E3vJE+2WfHeoyV0xw7KSiC/IagJP4pEhPn/ph+vmk1G82/Cw6BLlZQcxOa/xQzfDIVkF1IdmNWksulqJ3tV7Qi+vFQiRKWyVl9xFsVsfVtmX+JLFtS+6k30maRxde0aBUrV2C0Eo6zi6CV1DgyKiMAdg9eJdZaSut4xinvpRaKQbf3kdekkxPD/0BX0G7W0rkHy0XWU4tXarIOKpPjmun+wC/qCaB76oQOBf/nYXxSkPH2Ui6cPO68z0Q/e9VJwl+w54kvjLOsfIZtKT5AVa+IcAefzwe1GZ3fwhb4SgLm4/3FcrPzyou3s//b14g7z+o1K+f0TeqCcOcqokuomX3tNCO+Xx2kuf5u6eWzMRmnyvwsdoi/RRZbEXCLDf1g2LNt5WvOFr5IsvK9kqpNiEUGOljibZ8m8vnqwaA1pnqNmXGGi9r3x+Gn1lHLf8+uOZsDWg7PxPuPEXvvzeq4ck9YQmBb4JshMy7KErGdTRfIJS1GrqvqXVXEU/PJTyY7cAcBK85ODsP0nx1qQo3tb1XdQjtevK1cDUznqk9uMkus4jYnclZXnAF9Jl1VE2CsT4nD1QQ+OGuSPJXGh9wfuiYuu7ruzjXGhu/j98kfUnUXUn5zuDAD0/ox86sZJHiVHnL6VnrHjpWdX51MZ3gIkczdJWgvCF6GzoDhZW7yFarRJvEORzDiLfIS9KZ0nzJBa342pV3dO7vIjCxHcFHkmFcbkJJSLlcBQ6bpDI4kiiROzdetn8phsv1w8FjKWaLNT1lRyLF9/6Sy/J1HfZwBNavlA7Vf3KD7JKP7yNhJniZpfyOSUy40JkmuLvLPe7JjlRBf61fOX73e5ztLyWQ714e+GnmVabf+BvQv2XujwCF9F2y0NXXv769eLjt+/vsu4OEFwnx9TUZTOELX4p0iIodPWtN9msSO2EhHNvarszKSFuERNT22IAEcdBNrJ1VGGmrHYIxqKBo0nlrhKegBYRb48r4uHhYMJryfjC/HW9ZBn7u5z5WXwrOUS4SHZ1jnOikr8k9T5EP7br+KmI7lgiKLpBo4l6eDhi8nKzsu6oz12wZuaiN6N4nZXqoZZcgv99IyXt5XdIJMcf2Pneg4CDbewENd22aNRgC2yLtvQq1IYXTgo/JyKdDEsPetIjbcyGdl+Ga8YSPyMEY0RzLw558GfsrTyBJJl2fTICJTN1z0u5epGLVTEYfJn9PUPmKErsQ+ZQ6vSDy7YWILZHEzptAaWJMCbFcJ7kTHhanAlRbBJoMwApcIiFcR22BBHTcWwAmdCZGUPHMS3S4hkjbGS1uU9HeK9qc8ntxPibXO5UuF5XlqZouA+WBlC/anQpYx1NJxuNw7U5++eQ+Rwy//FC5veJIIT3YnIyV2o3tiZH+SqGGqHApAzs/0idQbRFCdmYQUJ4ROBnZhwz45gZx7CMQzCNegijzjfaIhjj8o3DMbuXW/P1rNrTyAchNjVB9c+qQwzjpnsOtrnnBgMZGjzmNIIVDKcVPTKwbZlMI05Kj4wSCRu/pTcwrr1bov6Afrp8Qv4M+dY7Ycv1gL+uFFOd7FrUZ3gIgnqkW61PeTGW6+JnLLtWsaheFtj0mAMiI01loGkRRGvzr91SQNCMYnElyqRGK36AmKnLuzzXQvSdZ1oYfHGTeK6xeChknBcnZoazL8q6mNZqEOQgk2h5F5jYr74iCA0epBo/80J9wpPSU6UQT0V6CrXJBBYGRKhHju0gC9URhhDpRWaAiFpiObo/rbNcRdDEoKJM25oZTgSy2loMfGgxe0Q4bDa8Z8P7BA3vQum7iYM6hpfSrZvCN1k9sKum12dQdqAIRj2KZ4wXokVHrPl7Vl7QiNpaX3pZD2qYviabgKb+RdscR2Qw/etwOHWKyd6P5Emfdo600HlMoqlblDZ9VMiWEYwmggznpppDmbNi9FMpRnVv2OAK0g9r3HZdHVhqUcBBdceW8peNZf7ayKQYMWg7ADOme9kIxSZzKLMhsy2HWkcav7YtrF8tiYrCzgbvvsMRtMC2aPREQhRdM4jVkKfiY6HUJJQiiqGDCYPM0XwfQkk0bYIBYgAjGxJyHJpRZkLMhNQklEHEkOb6I5ia2KaQEoaBXHDTCfd6w6vTWmH4PdpGIV/zXOpdycV9b3MTRd7/ysMbnmEQst7JulYd9X1mtYiLk1/NR/YKqMImq22tA2ghImsoLRUPHkydsqSdWBDWEryF2eLPsjGDWDdrAMImwA5jlsy3Qs6RghRR2yTa8sCGGTQwI1NyfHrJyD/0Gj7cZ5C27zV8JRXUnxhOS1MrESpIWKycm5rkcKR+XcnJ0RYplCtwK3zKaeFT+s47/UmRI/YnnH0ds6/jBH0dJ5Z9KRmHziyaOueoKZd4jhjPzGJmFtNjFs2Nj1+bU8wbqM6cYuYUk+MUBEFTqBHln+6UJ6/NN45Y6jzzjZlvzHxj6P3s6KOrSNvc4eMyjhH3mt07wMs9qF91O7tphfuUCCn3WNFh3tXb7WgdWXpG/tCe7h8gFAwnhRqGA0xmQ8EaoEUsRohmtshAsIMZFayDWBQDLT2g+0ZT+p5VdGzUGXJtahHu+O/iL3mc1bGRjldMCTUgs03iVFdD1MEFWqTJuOd/KCZWASA/OeLH0wqSPkmUXekb6hvJ0ZFjoORwDPRQMsdCKMtCi6+olcIeeGsY1fJCvR3EnoGzPTPbM0/n/exib+XfSyRUZ0uBUsJk+P3USWTiVzyaL3JYyEKeyJA5uvzf1ftfPppb90yu8Ch6fDQHaKanmZ5+HHqK3VXWWtfWWsirpK67uzvzDhcbB8NsB5ZLeTjqpVChRH9G8hCm/N4QsJ1paqapn5KmkkMyqp2IUHayYL7KLqOg5cbb8pl8ZvL5Ccknd0C/QCShLH50+fuXz1fPo6OjvNo5TNQWN6634jdZ51W7Gpbdv/AgWdbcBanNxV1uqTVKxrfKKh7Sq/RNbVt+Co4kCPS8B9y2vQvELa4jXB7d3T+cmjmVfTuPej1EM39qgGM0lcP86XM0JxbCkGn2yKE2tgijgGh5eJghE9rYptSxKQYOOs6NhW1gMnI4N5hhoqPo0H6tZn7fdLyenTfomxgySZYED58Ehh1bh3JnP6h+3Dmmjb6Gxphmntc3bxdIGYDAFx4LDUzKpcAPr+WSsIWc9k/fv3zel+nH4Xzz1pL5t+ol9OKMnr/NllJ8zG+y/z+If/9+py4v3u5biKuLd6r2XdvL8rG2GBFcYoNQlcRHvTlDBL2pot6bRcDD6ze6tiP9wtU+xJRyvY1GTcmG7+RlGKUeyoyIjHo+LxQ5PaUV5bSFJAvXV6WkkWysFq+Ukv/FYreM6Jab8bXs6dFKUoPtqUba8oYOM67CSHB5ssk4FaxPqiz/yqUNE2YlSLBmpYD+VnwiarC6o2WyvPvqxb6YCrm66IVC1+nKJqe1ExvWmRm0jwwPlQcUHTwVd2im2MxF+a4O+RLFA6xUWvlBUDmsZ7XyrOWyYTOJGtd2FuBR/HpOLiEz9Twg1LbHMIGmWvE4Si4QGTxxY/xzpxVOTYVakcwHI4gyQbeYAT0BHVFkWoRYgCGbMUa1Xbw6L3iFcg/yioqM6q8hcGTK7jOvYz6k+hHSnfIp1UjrdrxDdhT1zunRs695ir7mnzU9Ojsrgx0UU21a0ajZ0bSZsHSZnfi+n/cse+PP8sSLEhoSt8S0xnyZHyTv5wfCSyLg1bPi8yPmsx1W89PnFzd+4JYVuXzKzHrNBq+qxtmYvgh8Wpd9y5JsA5nXNpxfRcdumNoUNlFpXFObomdp18OY2q1ubDSUH1sp309q6YrOJqKlU+fxI3xsoaRbENgYOhRaR25KY+sJ/3DkU+XpEVtYdA6LHbP76slb9nJnVuZUzC59mSBoYUJyj78xd2mlbZsRTNvK7y9gpnB+IowGAnn0VMUdoLmFKOrFHWBAIF5TXTigIebYS4Ron3uGz/6AR4h89ge0Ts+8XHr2B8z+gMn5A4QkrB3FqImpMv7zav6AlghVZqYXGoqAVrYVOMisfR4k0qDPDfm6fJGYlgX1i3w8uRns+U2agTvN6LTFy2C0eBlmE3+PHVZHE18PkPaHHs8LoI1o4tuPm/gTCcGrfeCfVuOnFdUrV2SWjktydHKSrUfhpYEoFHaKKEHYVhv4jqWotwXuRsbo4/GJdl3xOzF8QhYzITwoBi09ett5p3eATIoqy8e16LOlnx00MHYphn2a2KUOND417OqTWzHETOXY3jst+sIiudookprOvrlQVjZfIlea3B//Dw==7V1bk5u4Ev4t52Gqdh+gdEOXx5kks7tVySZ1Zk+d7FMKG2xTweDFTDzOr1+Jm0EID/YYm0k8lYqNJAS0ur+v1S3hG/xm+fRb4q4WH2LPD28Q8J5u8NsbhBBAWH6okm1eYmHB85J5Enh5GdwVPATf/aIQFKWPgeevGw3TOA7TYNUsnMZR5E/TRpmbJPGm2WwWh82rrty53yp4mLphu/T/gZcu8lLugF35734wX5RXhqCoWbpl46JgvXC9eFMrwu9u8JskjtP82/LpjR8q6ZVyyc+776itbizxo7TPCR/urX++fGUfl8Ht9l0yoYB++W4VvXxzw8figYubTbelBOZJ/LhqX6w8009S/8k0FO6k7GH3tFJP/Hjpp8lWtivOshAvJLSttAbZTl602ckciqLZoiZvxsqWbjHQ8+oCO1nIL4U4DhANMoiGhvK6d17wrSEi+s+jGsS7xrd58ZmdMUn0EnlLWTdlqSZ0eX9Sw+XB3WYRpP7Dyp2qmo20Mlm2SJfyUd5C+XUWR2lhNZDKYzcM5pE8mMqB8pOq6/rI7VUEfTjbw1YfEubYglLqcEE4x4Cx9ggRYdOBRghfR2ifYXEbEU4wg5gjRAmBDSuD2KakbWSXHVFyHdF9IwqJDTDGBAIHQioQwU3gZLYY24g6zxPMkHI/WMQWYsAGmqnwksMbckU24QZZgoEkSQeU5AkEJ/XRFvU/1pQh4wYZCscgwKEInXWCy3rlRkZ0mcZhLBXrVlYm88kv8gnkpUH58WsmOaCEac3cZRBu86a/++E3Pw2mbq1+nUlb1UK6eqpX5BdVNVGcLN2wVvfNTQJXfko9d9PHRPnBe9tN3VVXk00hYVVJ5BNkNaGfSsOx5ONPg2jePjNOVgs3KrpEeZlUh9QqLO8262OW1mqCyMt0SFWB8kGzmjSRXc1k7+V1Ij+vlQqRuem1i2zixGveVtWXfJLJ10B2p/pcp0n81bcKlWq0m7jTr8p1jTxLG0XkwHwA619+rd2p50/jxE2DOLLSRTD9Gvnr4vaCKEiDUjp629pI7m1Xu51Gu1kYu6kuHC9Yr0J3WzYPA1mBwH+C5SpOUjcyU+BUdirPSLcrv8Z9uZZ3kV/k3arpkoLT0F2vg2kTMTJJ+sq8gAE/5JAn289FZXbwtzqQvnlx+PapXvl2Wx49Benn4grq+9+18t0p6qA8oxOp1vFjMvWfZ6LUTeb+PlYucNb3GhPDvX6wY5iZlGWJH8ph/9acTpqwrbjCpziQT7Zz4rCt5pTVn85MUKObXAxFJ/XZoNavRajNRbMzoUNvLqtWZxn6VpI4HpD5wd5eJ/h0OYGdyG6Gh7o9trrE92mQht0W1cvJbNrR+Giak/bMuwrG1PUbD+XniB5+zkXAanjo4eOAnp0unBJc6HnBpdTZQ9y9bt/mKG9CR5DEmyk/InQnKkrak5elLrzPTmhoeGvqoxBAepzhbVGxDDxP9XEnvcbgexGLU1q8UgLPhsC5u3He9kKZvXb64gAgsJEoJwJlmJichDwrJag0utlDPJut/WG0zxRYHTW3ef56mgQr5aG+coZj+qALA6UBYRNkYLWhJp/QFE7+SWitNIZL81qJCo5NCcJQMAcAhhjW1AVz22GUC4IxERUyHcqBGCvPXeNAvbOhObA7Qn4pDiympk20cZcKFqLJetWEmVfKjJWtn4IaMWt66GXW48XUSDXdPBs1Hh7kvzA1LoM08b88Jt1O27D5hROQIhI2cLQBp4aAbM1xNyHv6WmxT37gRbR4Bnoj46I3iPV8Ojt2HtfOzGs9DU1gpqTHsQTWQUWyuZ9Ebvgl8We+1JKpv35FlJRNJu8qVHuTg5q8GXyf/R3AWqUpnoK1HEecRpnLHHWpgZoDNSBNmdJFI0GmEnGehSY8Ls9b+tY2UZlA6ABBKNbS15AQWwgG5IxNOJyj40ALOy3HW6rkmR3v7tD2hR3vCu3k/bdR7rWgXl9IK234FJAG0ECOuBYo1dR+QIQzRdpPRa6Zz2y5aSp1t68iXTpyhDGwHV5LtmncA0zLQNA5cyPIFNR+baRU6t1ISMki7WwFQuzIsI+FhaE33W0ZmH4q1R/Qbc4F8iVyl/4rJpIO97laf9GLZiqrPAXNQMCbNINOo+VYoxmth+FopoSoMWJWX8hCI5viI0FsQDEgEGPBBGrG8hCkypHmgMhKQkWJzAdjmYA2Bp1rBRT52Yy1qs8FckcEt6/r+a7r+V7ver5aBFoLP/ej29GycF+eLZlk1NM5rVu9iwGJtjux8nKv7wbfV/HRvakQXZsumPTQo9cQEcO+MoSR7eA2Vw+2kB+Zch4nToDpqahB1OCghUyXntwzXRmEYTJPTfsRBtODI5IbVwfm6sC8XgemGTMY3JEZ+6TS6TmprJwWIFBzFl8GB8407cREUSXikAmAOddCCggybHPhcAY5o8Kh+MhpJydy3qlncPAxc81d32dwvwZPGO5W+O0W9VU7Zvas8PPc9SLrFL5Ir/uuh8A91fpcyyGQYxPHQQ6GAhOup1sEETYjGEhvESMGybGxEghtTqHg2CFS/SFDenLTcWzMHOgQjgF2mLbhduhgyavba7NzM3+YlclUpZc0WHMMXqg494TkB9xy05uER7LnZrd4S8IEZ/KPMswhLhepV9uoCbYBFlxiDaAOEhqM9IUrCVE2YbVUp7YIWugr/gbGJ2xKbI5iwcQPvVK5svwxr1TWVHw4D670OWtK+BckZZxgREQi3Zj23gLaDm2Z3pikp6JP9zYe1JLeNZxxDWf8iOGMp7WnohlposTXkwTUXV4ELAg2gUXb7eQGsBhsIRO+Jm+vYHEFi/GBhfPMEkh4aeAwJTlPOlc9bbRsLPNKfU8Q0Sd4/QNdeiYNnHuuOPiesTMHTNG4VAVSYHMGpWFDSignRN84SIQtMHek4RPqYKC9VKG3IiFdJzE4syJ1J2C7gqITyYWSpGusIen+F8uqlxfsNYi7Aq/uytVdeT5+vkr8WfCklDAPYt2o6E0RvMr0e5GmxXDfy3/zIF08TuxpvFR2pHZuyE95qvx/EsYTVeiuVYwK3f/v4fa3d/bSu1H5jaLHHitPrvZ0tacfwZ4Sb5a11gPBBvOqrGuz2dgbbMeJdP/voRBCfgDFZpIDZX/Wehul7pMlx/ZqU1eb+iltat3FUWYjkmIAyojk491nFjRd+Ev3aj5X8/kJzSePL72AklD2Vtn7zx/ePxxmR0cFrfIxKTfaef7Mfcw6r8/B9067D3iXO6asekf7vhUXGBum03SwENYRLyI/AJS6Itwd+e1nltQMeUctsKi9yL91t/FjsvateGa50/pKoN2vPHz8b7vslE9x6AbZDsHmW+Ktlauw1fAYfUPE64W7Ul+jOPVR9iRZROv9pDS05+wwtzWkluDoCw/SWDUu1ydUD3qi6HIzmsRMLxwG0PgaKqgHiE5nk6b1cd0xxYKdGnHCmmxV+adigFUJArhCvvJXpNSYNaOQxpeh50ukBngdOu0ZnCzRaiTRSYxJ8/3VTW3iUnMwhoBhKBxIj1wdRTixCaxdhOpXwTY9725XbFqjNy6I/vjprz8+/nn7/ufCNIsAanM9RI7bTgaExMaGH9/RX852uh9TOuxlIYNiGrjp+IGHQio1WCOswrxPfhJIWSh9eyHaleYzFhRjmsJwiGynlnY99u0j1a623StnT5VTUXPt6scK8+a733zE7/4F \ No newline at end of file diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/RDF_tree_objects.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/RDF_tree_objects.png new file mode 100644 index 00000000..ae02a9cc Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/RDF_tree_objects.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/index.md b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/index.md new file mode 100644 index 00000000..97d2960e --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/index.md @@ -0,0 +1,800 @@ +# Build a Knowledge Graph from STIX 2.1 data such as the MITRE ATT&CK® datasets + +## Introduction + +MITRE ATT&CK is a globally-accessible knowledge base of adversary tactics and techniques based on real-world observations. The ATT&CK knowledge base is used as a foundation for the development of specific threat models and methodologies in the private sector, in government, and in the cybersecurity product and service community. + +The MITRE ATT&CK datasets in STIX 2.1 JSON collections are here: + +* [enterprise-attack.json](https://github.com/mitre-attack/attack-stix-data/tree/master/enterprise-attack/enterprise-attack.json) +* [mobile-attack.json](https://github.com/mitre-attack/attack-stix-data/blob/master/mobile-attack/mobile-attack.json) +* [ics-attack.json](https://github.com/mitre-attack/attack-stix-data/blob/master/ics-attack/ics-attack.json) + +[Structured Threat Information Expression (STIX™)]( +https://oasis-open.github.io/cti-documentation/stix/intro.html) is a language and serialization format used to exchange cyber threat intelligence (CTI). + +The "ontology" of MITRE ATT&CK with STIX is here: [https://github.com/mitre/cti/blob/master/USAGE.md](https://github.com/mitre/cti/blob/master/USAGE.md) + +The objective of this tutorial is not focus on the ontologies. In our use case, we just need to extract several metadata. If the community of STIX wants to resolve their problems, it will be the moment to define a solid ontology. If you are a newbie with the Linked Data technologies, you have to learn to generate in first a functional knowledge graph for your needs before building a perfect ontology for everybody. When you masterize the ontologies, we will modify this first ontology and you could refresh your knowledge graph when you want with Corporate Memory. + +This tutorial is written in order to gradually acquire all the skills necessary to build from scratch a knowledge graph with Corporate Memory and update it automatically via Corporate Memory Console. +This tutorial must be completed in order. + +Labs: + +1. Create a new project for your knowledge graph in your Sandbox +2. Import the datasets to convert in RDF +3. Create named graphs of your knowledge graph +4. Create a RDF transformer for STIX 2.1 +5. Create the workflow to transform all STIX datasets to RDF +6. Create the global named graph of your knowledge graph +7. Test the SPARQL query to obtain the name, the description and the references of a Mitre tag +8. (optional) Create the Void description of knowledge graph +9. (optional) Refresh your knowledge graph automatically + +You can improve this first knowledge graph with these exercises: + +1. Create an inference in your knowledge graph via a SPARQL Update query +2. Create an other knowledge graph for CAPEC linked to MITRE ATT&CK + +## Labs + +### Create your sandbox + +You need to create your sandbox of Corporate Memory to create your tempory knowledge graph for this tutorial. + +Follow the instructions here: [https://eccenca.my](https://eccenca.my/) + +### Create a project + +For each type of dataset, you can create an new project with all the tools necessary to convert this dataset in a knowledge graph. + +Create a new project, reproduce the demonstration in the following video: + +* Title: MITRE ATT&CK® + +* Description: MITRE ATT&CK® is a globally-accessible knowledge base of adversary tactics and techniques based on real-world observations. + +![](23-1-create-project.gif) + +### Import datasets + +MITRE ATT&CK® has 3 domains: [Entreprise](https://attack.mitre.org/techniques/enterprise/), [Mobile](https://attack.mitre.org/techniques/mobile/) and [ICS](https://attack.mitre.org/techniques/ics/). + +Each domain dataset is saved in GitHub: + +* [enterprise-attack.json](https://github.com/mitre-attack/attack-stix-data/tree/master/enterprise-attack/enterprise-attack.json) +* [mobile-attack.json](https://github.com/mitre-attack/attack-stix-data/blob/master/mobile-attack/mobile-attack.json) +* [ics-attack.json](https://github.com/mitre-attack/attack-stix-data/blob/master/ics-attack/ics-attack.json) + +1. Download these 3 files +2. Create for each JSON file, a JSON dataset: +![](23-1-import-JSON.gif) + +!!! Tip + + Give a short name at each dataset/transformer/etc in Corporate Memory to recognize it easily in the workflow view. For example, we will use "MA Entreprise (JSON)" like label and "MITRE ATT&CK® Entreprise dataset STIX 2.1" like description for the Entreprise dataset and so "MA Mobile (JSON)" for Mobile, "MA ICS (JSON)" for ICS, etc. + +!!! Success + + Now, you can see these JSON datasets in Corporate Memory: + ![](23-1-import-JSON-result.png) + +### Create named graphs + +!!! Info + + A knowledge graph is an abstract concept. Concretly in a triplestore or a RDF graph database via Corporate Memory, the database saves each RDF triple of graph in a named graph or RDF dataset in Corporate Memory. A graph named is a set of triples. So, a knowledge graph can be composed by one or several named graphs. + +!!! Tip + + A named graph can be modify without affecting the other named graphs. Each dataset of Mitre can be updated at any moment, so we are going to create a specific named graph for each Mitre dataset to simplify the update of each dataset in your knowledge graph. + + A good practice is to name the named graph by the URI of its real source on the Web, so the labels and graph names of your RDF datasets can be: + + * Entreprise domain + + - Label: MA Entreprise (knowledge graph) + - Graph name: https://github.com/mitre-attack/attack-stix-data/raw/master/enterprise-attack/enterprise-attack.json + + * Mobile domain + + - Label: MA Mobile (knowledge graph) + - Graph name: https://github.com/mitre-attack/attack-stix-data/raw/master/mobile-attack/mobile-attack.json + + * ICS domain + + - Label: MA ICS (knowledge graph) + - Graph name: https://github.com/mitre-attack/attack-stix-data/raw/master/ics-attack/ics-attack.json + +Create one RDF dataset for each Mitre dataset: + +1. Add component "Knowledge Graph" +2. Put a label +3. Put a URI of named graph +4. Enable "Clear graph before workflow execution" + +![](23-1-create-RDF-dataset.gif) + +!!! Success + + Now, you can see these RDF datasets in Corporate Memory: + ![](23-1-create-RDF-dataset-result.png) + +!!! Tip + + The consequence of the option "Clear graph before workflow execution" is the named graph will be deleted (with all its triples) before receiving new triples when you use this named graph like an output in a workflow and also in the transformer task (in the next step). + + This option is to use only for the graphs which will generate automatically by Corporate Memory. + +### Create a transformer + +!!! Tip + + There are not bad manners to build a knowledge graph but there are knowledge graphs useless or very hard to use by the analysts or developers in their missions. + + Without having all queries necessary in their missions, your knowledge will continue to evolve to sastify all needs of your users. + + With Corporate Memory, you can develop progressively your vocabularies RDFS or your ontologies OWL to describes your knowledge graph. + + If it's your first knowledge graph, the best manner to start is with RDFS vocabularies because you can develop it like you develop classes and their instances in an object oriented language. It's exactly the same manner to describe the world. Of course, there are differences but you can start a first functional knowledge graph without being an expert. + + Here, you will create all classes and attributes necessary in your use case case. Not more, not less. So, we are adding each STIX object in your knowledge base with its STIX type, its label, its description and its references. Each reference can have an url, a label, a description and an external ID, like Mitre ID or CAPEC ID. + + In UML, you can represent your targeted model like that: here a RDF model to describe an instance of type "course-of-action" in MITRE ATT&CK. (you can download the [File drawio of schemas](./RDF_model_and_pattern.drawio)) + + ![RDF model to describe an instance of type "course-of-action" in MITRE ATT&CK](rdf-model-course-of-action.png) + + The SPARQL query for this model can be specify in UML with a RDF pattern: here a RDF pattern to select the "course-of-action" objects with a known Mitre ID + + ![RDF pattern to select the "course-of-action" objects with a knowed Mitre ID](rdf-pattern-to-select-a-course-of-action-with-a-mitre-tag.png) + + Without an official vocabulary and its official prefix, we are using the documentation on the Web of its datasets: [https://github.com/mitre/cti/blob/master/USAGE.md](https://github.com/mitre/cti/blob/master/USAGE.md) + + So, to make a prefix, we choosed a short name, for example "ctia", and the IRI will build with the Web address of its documentation with a # at the end (to link to anchors of attributes in the Web page, if they exist): + + ```turtle + prefix ctia: + ``` + +1. Create the prefix of your vocabulary: + + ```turtle + prefix ctia: + ``` + +![](23-1-create-prefix.gif) + +2. Create the (Mitre) STIX 2.1 transformer + +This transformer will be a component of your worflow. You could reuse it in several workflows in other projects. To create a new transformer, you need to give a: + +* Label: STIX 2.1 transformer +* Input: MA Entreprise (JSON) +* Output: MA Entreprise (knowledge graph) + +![](23-1-create-transformer.gif) + +!!! Tip + + In your use case, there is only this transformer to build this named graph, so there is no consequence on the final knowledge graph when we test this transformer on this graph (automatically cleared after each execution of transformer). However, a good practice is to create a tempory graph in ouput for each transformer, so your final knowledge graph is not affected during the modification of your transformer before executing the workflows with this transformer. In this case, you need to hide this tempory graph of your users. + + You can create a transformer for several syntaxes in input: JSON, XML, CSV, etc. If your format does not exist in Corporate Memory, you can convert your data in JSON before importing this data in Corporate Memory. + +!!! Info + + STIX gives the possibility to extend its syntaxes. Mitre uses this possibility. So, in theory, if we need to import all the data, we can extend this transformer at all STIX attributes and add the Mitre attributes described in its [documentation](https://github.com/mitre/cti/blob/master/USAGE.md). + +3. Study the tree of STIX data + +```json +{ + "type": "bundle", + "id": "bundle--19413d5e-67e5-4a48-a4c8-afb06b7954de", + "spec_version": "2.1", + "objects": [ + { + "type": "x-mitre-collection", + "id": "x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019", + "name": "Enterprise ATT&CK", + "description": "ATT&CK for Enterprise provides a knowledge base of real-world adversary behavior targeting traditional enterprise networks. ATT&CK for Enterprise covers the following platforms: Windows, macOS, Linux, PRE, Office 365, Google Workspace, IaaS, Network, and Containers.", + ... + }, + { + "id": "attack-pattern--0042a9f5-f053-4769-b3ef-9ad018dfa298", + "type": "attack-pattern", + "name": "Extra Window Memory Injection", + "description": "Adversaries may inject malicious code..." , + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1055.011", + "url": "https://attack.mitre.org/techniques/T1055/011" + }, + { + "url": "https://msdn.microsoft.com/library/windows/desktop/ms633574.aspx", + "description": "Microsoft. (n.d.). About Window Classes. Retrieved December 16, 2017.", + "source_name": "Microsoft Window Classes" + },... +``` + +To extract STIX objects with its type, its label, its description and its references, we need to navigate via a root object of type "bundle" before touching the STIX objects. Each object has an ID, we suppose unique in all Mitre datasets to generate IRI of all objects. We use your prefix ctia to build the class name and the properties of your RDFS vocabulary. Here, we build the vocabulary of manner agile for your use case because Mitre had not proposed a RDFS vocabulary for its datasets. + +4. Create the root object and give it an unique IRI: + +* RDF type: ctia:Object +* IRI pattern: + +![](23-1-extract-root-object.gif) + +!!! Tip + + You can develop an IRI from scratch in the IRI formula editor, like here or directly in the form and improve it after, if necessary (see an example in the next step). + + The important is to test the result in the evaluation view. + +!!! Success + + During the development of a transformer, you can test your transformation and check all the steps. + + ![](23-1-see-steps-during-a-transformation.png) + +5. Link the sub-objects to their root: + +* Value path: objects + +with their IRI and the property ctia:object: + +* RDF property: ctia:object +* RDF type: ctia:Object +* IRI pattern: + +![](23-1-extract-objects.gif) + +!!! Tip + + The RDFS classes start by an uppercase and the property by a lowercase and apply the camel case notation, if possible. The objective is to create cool IRI, ie. lisible IDs for humans and unique on the Web. + + There are exceptions, like Wikidata which prefers to use a number for their IRI but with a explicit label in all languages. + + Moreover, if there is no clear ontology in your domain, the best is to take the name of parameters of the source (here json). So, we will use the property, like `ctia:external_id` with underscore because it's the convention of Mitre in its datasets. If Mitre defines a best RDF ontology, we will modify simply your transformer to respect their new ontology. + +!!! Tip + + We could limit the number of objects to import, if you add conditions in the formula editor with the field "type" of objects, for example. + +6. Extract now their type, label and description with these properties for example: + +* ctia:type + * RDF type: URI + * Via the "value forma editor" create the IRI: `https://github.com/mitre/cti/blob/master/USAGE.md#{type}` +* rdfs:label + * value path: name + * RDF type: String +* ctia:description + * value path: description + * RDF type: String + +![](23-1-extract-properties.gif) + +!!! Tip + + STIX type doesn't apply the camel case and doesn't start by an uppercase. We prefers to create a specific property ctia:type for this reason. + + You can reuse a vocabulary already in Corporate Memory (like rdfs) but you are also free to develop a new vocabulary on the fly with your prefixes. + +!!! Success + + When you test your transformer, you can see the future instances in your knowledge graph: + ![](23-1-success-transformer.png) + +7. At the end of the last step, we saw the dataset uses the syntax of Markdown to define a Web link. In the interface of SPLUNK, we need to use the HTML syntax. Modify the formula for the description with the operator "regex replace". + +* Regex: `\[([^\[\]]*)\]\(([^\(\)]*)\)` +* Replace: `$1` + +![](23-1-regex-replace.gif) + +!!! Success + In the "value formula editor", you can immediatly check the result of your formula. + ![](23-1-regex-replace.png) + +!!! Tip + + At any moment, you will modify your vocabulary according to your needs that you will find during your development. You need to modify this transformer and relaunch all your workflows which use this transformer. + +!!! Tip + + The regular expression are often necessary in the components of "value formula editor". The website [regex101](https://regex101.com/) will help you to develop and debug the regular expressions. + +8. Via the same method, we are linking the references objects to their STIX objects: + +* via the property: `ctia:external_references` +* Type: ctia:Reference +* value path: external_references +* IRI of each object: its own URL () + +ctia:Reference object has these properties: + +* ctia:source_name +* ctia:description +* ctia:url +* ctia:external_id + +![](23-1-extract-references.gif) + +!!! Tip + + Sometimes, several urls are not correct. You can use the component "Fix URI" to fix the classic problems. + + ![](23-2-fix-url.png) + +!!! Warning + + When you make a transformer on a dataset, you see quickly the limit of data. For example with Mitre, several references are a set of citations without URL. + + ![](23-1-warning-bad-uri.png) + + For example references with this description: `(Citation: Palo Alto menuPass Feb 2017)(Citation: DOJ APT10 Dec 2018)(Citation: District Court of NY APT10 Indictment December 2018)` + + The URL for the majority of citations can be found in the dataset but we need to do a first pass before to link correctly the citations at their URL. + + Moreover, we can find also citation directly in the description of several objects but without URL and without their references in their JSON tree. + + Here, it's a simple tutorial. So, we do not try to fix this problem of citations for the moment, but if you want a tutorial to fix it, let me a comment in this page. + +!!! Success + + To test your transformer, you need to develop one or several SPARQL queries with the RDF pattern which will use in your use case. You are developing this query in the SPARQL editor: + + ```sparql + #Test 1 transformer STIX 2.1 + + PREFIX rdfs: + PREFIX ctia: + + SELECT + ?title ?description + (GROUP_CONCAT(?link; separator="
") as ?references) + FROM + WHERE { + { + ?resource ctia:type ctia:course-of-action . + } union { + ?resource ctia:type ctia:attack-pattern . + } + + ?resource rdfs:label ?title ; + ctia:description ?description ; + ctia:external_references ?mitre_url . + + ?mitre_url ctia:external_id "T1490" ; + ctia:source_name "mitre-attack" . + + OPTIONAL { + ?resource ctia:external_references [ + ctia:url ?reference_url ; + ctia:source_name ?reference_label ; + ctia:description ?reference_description + ] . + BIND( CONCAT("",?reference_label,": ",?reference_description ,"") as ?link) + } + } + GROUP BY ?title ?description + ``` + + ![](23-1-sparql-query.gif) + +9. During the building of interfaces, we saw the same MITRE ID of IoC rules is used by the concepts of tactic, mitigation, technique,... In the final interface, we will print properly the label of each concept for the same Mitre ID, like "Technique TXX" or "Mitigation TXX". + +!!! Tip + + Moreover, Corporate Memory indexes some specific properties automatically, like rdfs:label. Without this property, it's not easy to find the objects by a search by text. To facilite the research of references, like the mitre id, you are adding the property rdfs:label to reference objects. + +So, we add a new property `rdfs:label` to object `ctia:Reference`. If the reference is not a Mitre ID, we will copy the source_name else we will extract the type of concept in the URL and concat his Mitre ID: + +* In the transformer STIX, add the property rdfs:label (type string) to object `ctia:Reference`. + +![](rdf-model-course-of-action.png) + +* Customize the value of label, like in this RDF model: (try to do this rule alone before to look at this possible response) + +![](23-1-extract-rdfslabel.png) + +!!! Success + + You can test the result when you search the Mitre ID via the explorer of knowledge graph "MA Entreprise": + + + +### Create a workflow + +You have now a STIX transformer. We are building here a workflow to apply this transformer for all datasets in same time. + +1. Create a workflow with a name, for example "MITRE ATT&CK® workflow" +2. Insert the input JSON dataset +3. Insert the output RDF dataset +3. Insert the transformer +4. Link the three components +5. Execute the workflow to test it +6. Save it + + ![](23-1-create-workflow.gif) + +7. Do the same operations for the two other datasets. + +!!! Success + + At the end, the workflow looks like that: + + ![](23-1-success-worflow.png) + +### Create a global named graph + +To simplify the requests by a SPARQL query on your knowledge graph, we are offering the possibility to request all data of these 3 datasets in same time. + +We are showing the "SPARQL tasks", another important feature available in Corporate Memory. More precisely, we will work with the SPARQL Update task with Jinja template. + +!!! Note + + Jinja is a text-based template language and thus can be used to generate any markup as well as source code, like SPARQL. Corporate Memory gives the possibility to insert the name of named graph in a SPARQL query according to its position in the worflow to execute. + + For example, `$outputProperties.uri("graph")` inserts the name of graph connected to the output of the task in the workflow and `$inputProperties.uri("graph")` inserts the name of graph connected to the input. It's very practice to do repetive tasks, like to calculate the VoiD description at each update of graph. + +1. Create a "Knowledge Graph" dataset (ie, a RDF dataset) + + * Label: MITRE ATT&CK® (knowledge graph) + * URI (name of graph): + * Enable "Clear graph before workflow execution" + +2. Create a "SPARQL Update query" task without missing to enable the Jinja Template + + * Label: Import graph + +```sparql +PREFIX owl: + +INSERT DATA { + GRAPH $outputProperties.uri("graph") { + $outputProperties.uri("graph") + owl:imports $inputProperties.uri("graph") . + } +} +``` + +!!! Note + + In this query, Jinja replace $outputProperties.uri("graph") and $inputProperties.uri("graph") according to our workflow so the final code executed of this query is, for example: + + ```sparql + PREFIX owl: + + INSERT DATA { + GRAPH { + + owl:imports . + } + } + ``` + +!!! Success + + In the Turtle view of RDF dataset "MITRE ATT&CK®", you can see the triples inserted by your SPARQL query. + + ```turtle + + owl:imports ; + owl:imports ; + owl:imports + . + ``` + +1. In the same workflow add one SPARQL task for each RDF datasets and in output add the RDF dataset "MITRE ATT&CK®". Execute it and save it. + + ![](23-1-sparql-task.gif) + +!!! Success + + ![](23-1-workflow-import.png) + + In the Turtle view of RDF dataset "MITRE ATT&CK®", you can see the triples inserted by your SPARQL query. + + ```turtle + + owl:imports ; + owl:imports ; + owl:imports + . + ``` + +### Test your final SPARQL query + +Now, you can request all the datasets in same time through the named graph `https://attack.mitre.org` to respond at the final query of our use case: + +```sparql +#Test 2 final query + +PREFIX rdfs: +PREFIX ctia: + +SELECT +?title ?description +(GROUP_CONCAT( distinct ?link; separator="
") as ?references) +FROM +WHERE { + { + ?resource ctia:type ctia:course-of-action . + } union { + ?resource ctia:type ctia:attack-pattern . + } + + ?resource rdfs:label ?title ; + ctia:description ?description ; + ctia:external_references ?mitre_url . + + ?mitre_url ctia:external_id "T1490" ; + ctia:source_name "mitre-attack" . + + OPTIONAL { + ?resource ctia:external_references [ + ctia:url ?reference_url ; + ctia:source_name ?reference_label ; + ctia:description ?reference_description + ] . + BIND( CONCAT("",?reference_label,": ",?reference_description ,"") as ?link) + } +} +GROUP BY ?title ?description +``` + +!!! Success + + ![](23-1-sparql-all_datasets.gif) + +### Create the Void description + +In theory, RDF datasets in the Linked Open Data have to have a [VoID](https://www.w3.org/TR/void/) description with their statistics. The objective is to catalog automatically these datasets. + +!!! Info + + [VoID](https://www.w3.org/TR/void/) is an RDF Schema vocabulary for expressing metadata about RDF datasets. It is intended as a bridge between the publishers and users of RDF data. + +Here, we are creating a new SPARQL Update task to calculate and insert automatically the statistics of our global graph and add a [VoID](https://www.w3.org/TR/void/) description. + +1. In the same workflow, insert a new SPARQL Update task with this query to calculate the statistics: + +* label: Calculate VoID + +```sparql +PREFIX rdfs: +PREFIX dcterms: +prefix void: + +INSERT +{ + GRAPH $outputProperties.uri("graph") { + $outputProperties.uri("graph") a void:Dataset; + rdfs:label "MITRE ATT&CK®"; + rdfs:comment "MITRE ATT&CK® is a globally-accessible knowledge base of adversary tactics and techniques based on real-world observations."; + void:triples ?triples ; + void:entities ?entities . + } +} +USING $outputProperties.uri("graph") +WHERE { + { + SELECT (COUNT(DISTINCT ?resource) as ?entities) + WHERE { + ?resource a ?class . + } + } + { + SELECT (COUNT(?s) as ?triples) + WHERE { + ?s ?p ?o . + } + } +} +``` + +!!! Tip + + This query uses the variable `$outputProperties.uri("graph")` (Jinja template). If the name of graph changes, the code of the query stays stable in your workflow. + +![](23-1-sparql-void.gif) + +!!! Success + + The final triples in the graph `https://attack.mitre.org`after this worflow. + + ```turtle + prefix owl: + prefix rdf: + prefix rdfs: + prefix xsd: + + + rdf:type ; + rdfs:comment "MITRE ATT&CK® is a globally-accessible knowledge base of adversary tactics and techniques based on real-world observations." ; + rdfs:label "MITRE ATT&CK®" ; + 28081 ; + 150120 ; + owl:imports + , + , + . + ``` + +### Refresh all automatically + +The datasets of Mitre are updated regularly. You may want to update them automatically via a command line in a bash file. In this script, we use CMEM. + +1. [Install CMEMC - a Command Line Interface of CMEM](/automate/cmemc-command-line-interface/installation/) + +2. Open your config file: + +```bash +cmemc config edit +``` + +3. Insert your sandbox in your CMEMC config, example with a password grant type: + +```bash +[johndo.eccenca.my] +CMEM_BASE_URI=https://johndo.eccenca.my/ +OAUTH_GRANT_TYPE=password +OAUTH_CLIENT_ID=cmemc +OAUTH_USER=johndo@example.com +OAUTH_PASSWORD=XXXXXXXXX +``` + +You need to replace "johndo" by other thing, "" by your login (email) in the sandbox and XXXXXXXXX by your password. Save the file (with VI, :wq). + +!!! Tip + + Immediatly, in the file ~/.bashrc, you can specify your sandbox like your instance by default for CMEMC with this line: + + ```bash + export CMEMC_CONNECTION=johndo.eccenca.my + ``` + +Test: + +```bash +cmemc graph list +# or cmemc -c johndo.eccenca.my graph list +``` + +If you can connect it, you can see your knowledge graph "" in the list. + +4. You need to know the IDs of your JSON datasets IDs and your workflow ID to implement the command lines with the tool [Corporate Memory Console]() ( + +![](23-1-collect_IDs.gif) + +For example in my demo the JSON datasets and the workflow have these IDs: + +``` +MITREATTCK_3dc114458dfd4c57:MAEntrepriseJSON_14f0f94ed5de5daa +MITREATTCK_3dc114458dfd4c57:MAICSJSON_e024c6433ed523e1 +MITREATTCK_3dc114458dfd4c57:MAMobileJSON_3f890442dad17750 + +MITREATTCK_3dc114458dfd4c57:MITREATTCKworkflow_0b8fa5454ef21a00 +``` + +5. You can now import the file directly of Mitre repository on GitHub and import the files in the sandbox and execute your workflow. + +```bash +wget https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/enterprise-attack/enterprise-attack.json +wget https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/mobile-attack/mobile-attack.json +wget https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/ics-attack/ics-attack.json + +cmemc dataset download --replace MITREATTCK_3dc114458dfd4c57:MAEntrepriseJSON_14f0f94ed5de5daa enterprise-attack.json +cmemc dataset download --replace MITREATTCK_3dc114458dfd4c57:MAMobileJSON_3f890442dad17750 mobile-attack.json +cmemc dataset download --replace MITREATTCK_3dc114458dfd4c57:MAICSJSON_e024c6433ed523e1 ics-attack.json +cmemc workflow execute --wait MITREATTCK_3dc114458dfd4c57:MITREATTCKworkflow_0b8fa5454ef21a00 +``` + +!!! Success + + You can see the result in the shell but also via the "Activities Board". It's useful to follow the errors of your workflows, if you execute a script via a Linux Cron, for example. + + ![](23-1-success-cmemc-activity.png) + +!!! Tip + + With these command lines, you can now start a cron every day to check the Mitre updates and start refreshing your datasets. + +## Exercices + +### Create inferences + +After this tutorial, you want probably to navigate in your new knowledge graph between the relationships of Objects STIX. Before, you need to create inferences of these STIX "relationships" in your knowledge graph via a SPARQL Update query. + +1. In the STIX transformer, import also the fields: `ctia:source_ref`, `ctia:target_ref` and `ctia:relationship_type`. + +2. Create a new SPARQL Update task "convert STIX relationships to rdf statements" with this code: + +```sparql +PREFIX ctia: + +INSERT { + GRAPH $outputProperties.uri("graph") { + ?sourceIRI ?propertyIRI ?targetIRI . + } +} +WHERE { + GRAPH $inputProperties.uri("graph") { + ?relationship + ctia:type ctia:relationship ; + ctia:source_ref ?source ; + ctia:target_ref ?target ; + ctia:relationship_type ?property . + } + + BIND (IRI(CONCAT("https://github.com/mitre-attack/attack-stix-data#",?source)) as ?sourceIRI) + BIND (IRI(CONCAT("https://github.com/mitre/cti/blob/master/USAGE.md#",?property)) as ?propertyIRI) + BIND (IRI(CONCAT("https://github.com/mitre-attack/attack-stix-data#",?target)) as ?targetIRI) +} +``` + +This SPARQL query create explicitly the STIX links in the knowledge graph. Here, we create a new inference via a simple query. + +3. Create a new Knowledge graph dataset "STIX inferences" with this IRI: + +!!! Tip + + Separate always the facts extracted of raw data and the inferences calculate with other graphs. So, you can recalculate your inferences without rebuild all knowledge graph. + +4. Split the workflow in two workflows: + + * "Transform all STIX data to RDF" to calculate the inferences after RDF triples + ![](23-1-ex-workflow-STIX.png) + + * "Assemble the global knowledge graph", it will import all the graphs of projects + ![](23-1-ex-workflow-gen.png) + +5. Create a new workflow "MITRE ATT&CK® workflow" where you will insert the other workflows, like that: + + ![](23-1-ex-workflow-global.png) + +!!! Success + + You can now navigate in your first knowledge graph: + ![](23-1-ex-graph-navigation.gif) + +### Reconcile automatically the STIX concepts via the Linking tasks + +[The "Linking task"](/build/active-learning) is very useful to reconcile the instance of concepts in your graphs when their labels are inserted manually with some light differences. For example, you can reconcile the tool, malware, etc of different STIX documents. + +1. Read the documentation of ["Linking task"](/build/active-learning) + +2. Use the json of [STIX report](https://oasis-open.github.io/cti-documentation/examples/example_json/apt1.json) of [Mandiant's APT1 Report](https://oasis-open.github.io/cti-documentation/stix/examples.html) to reconcile the STIX tools in this report and the tools in the Mitre knowledge graph with your transformer STIX and a Linking task. + +### Add the CAPEC dataset + +The Common Attack Pattern Enumeration and Classification (CAPEC™) effort provides a publicly available catalog of common attack patterns that helps users understand how adversaries exploit weaknesses in applications and other cyber-enabled capabilities. + +* Dataset: [https://github.com/mitre/cti/blob/master/capec/2.1/stix-capec.json](https://github.com/mitre/cti/blob/master/capec/2.1/stix-capec.json) +* The CAPEC "ontology": [https://github.com/mitre/cti/blob/master/USAGE-CAPEC.md](https://github.com/mitre/cti/blob/master/USAGE-CAPEC.md) + +1. Import the CAPEC dataset in Corporate Memory +2. Create the named graph of CAPEC +3. In the workflows of MITRE ATT&CK, generate also the CAPEC dataset +4. Modify the transformer to support the references to CAPEC dataset from MITRE datasets. + +## Conclusion + +STIX uses JSON syntax and can therefore be converted to RDF via Corporate Memory. Here, we have only extracted a few useful fields for our use case but if you want to import all the data, you will need to import the other properties from STIX 2.1, the extended properties in your Mitre datasets and convert the other STIX relationships to RDF statements (like in the exercice "Create inferences"). + +## Ressources + +* [RDF schemas (Model, pattern, etc)](RDF_model_and_pattern.drawio) +* [Archive of CMEM project](MITREATTCK_tutorial.zip) + +--- + +Tutorial: [how to link Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT)](../index.md) + +Next chapter: [Build a Knowledge Graph of compromise rules, like Hayabusa and Sigma rules](../lift-data-from-YAML-data-of-hayabusa-sigma/index.md) + +Previous chapter: [Specify the dashboards before the RDF models](../define-the-interfaces/index.md) diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/rdf-model-course-of-action.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/rdf-model-course-of-action.png new file mode 100644 index 00000000..513e2198 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/rdf-model-course-of-action.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/rdf-pattern-to-select-a-course-of-action-with-a-mitre-tag.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/rdf-pattern-to-select-a-course-of-action-with-a-mitre-tag.png new file mode 100644 index 00000000..dcac0534 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-STIX-2.1-data-of-mitre-attack/rdf-pattern-to-select-a-course-of-action-with-a-mitre-tag.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-json-dataset.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-json-dataset.gif new file mode 100644 index 00000000..f730ec4f Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-json-dataset.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-prefix-ctis.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-prefix-ctis.gif new file mode 100644 index 00000000..af8655db Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-prefix-ctis.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-worflow.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-worflow.gif new file mode 100644 index 00000000..f17ca223 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-add-worflow.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-formula-mitreid.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-formula-mitreid.png new file mode 100644 index 00000000..a500354d Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-formula-mitreid.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-id-worflow.gif b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-id-worflow.gif new file mode 100644 index 00000000..748bba00 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-id-worflow.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-iri-rule.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-iri-rule.png new file mode 100644 index 00000000..41f0e921 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-iri-rule.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-rdf-model-rule.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-rdf-model-rule.png new file mode 100644 index 00000000..c964855c Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-rdf-model-rule.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-rules-isdefinedby.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-rules-isdefinedby.png new file mode 100644 index 00000000..b4e2f134 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-rules-isdefinedby.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-extract-rule.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-extract-rule.png new file mode 100644 index 00000000..2ba668c0 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-extract-rule.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-extract-rule2.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-extract-rule2.png new file mode 100644 index 00000000..161bc69b Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-extract-rule2.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-workflow.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-workflow.png new file mode 100644 index 00000000..5914fe05 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-success-workflow.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-workflow-allow-replacement.png b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-workflow-allow-replacement.png new file mode 100644 index 00000000..3461147f Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/23-1-workflow-allow-replacement.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/RDF_model_and_pattern.drawio b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/RDF_model_and_pattern.drawio new file mode 100644 index 00000000..6d91febb --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/RDF_model_and_pattern.drawio @@ -0,0 +1 @@ +7VxJk9u4Ff4tOXTVzIEsLFyPvbjtJLN4YpfHyaULIkEJZS4aEmq18uvzwE0kRaolNdmW09JBIkFsBL63fA+Aruht9PQ+ZcvFr4nPwyuC/KcrendFCMWuCz8qZVOkYGKbRco8FX6Ztk34JP7Ly0RUpq6Ez7NWRpkkoRTLdqKXxDH3ZCuNpWmybmcLkrDd6pLN+U7CJ4+Fu6l/Cl8uilTHRNv0D1zMF1XLGJVPIlZlLhOyBfOTdSOJvruit2mSyOIqerrloRq9alyKcvcDT+uOpTyWhxTg6W/vswdK/qTv7W8frv+41iKskaKWRxauyhe+IlYI9d344lF1Wm7KkbD+Wqme3gRJLLUsn6dryIDxEib7ZvscrubqdyGlmqJr1SFyz/8KQzHTU85gDLmfeJkuEpUew1fIJM8kXLCYhRspvAyuPcOmxKJEcz3sa4brIM0NmKNh33U8lwYudri+kFFYdXiWvqi/VTXQdP7qVSpp1UpgTAF6cHOzXgjJPy2Zp56sAf75S0N/6B0u2y3hjNU9C8U8hhsPpounddXN+Sun9JGnkj81ksr5fM+TiMt0A1nKp8QosVVJl0HLhPUWq4ZTpi0aOK3SWCke87ruLYLgogTREYCiRwNqxrxv8zRZxb7mJWGSFvOUzmc/ERN0BXQDNS9+zocO5dMasEiEm6LAbRJnSQjvk2eE6lmkZqRs5DZZpYIrhPzG192HRZEoiZOsmM66gQZuSIkbFIqYa9VY5o/cPSKwlYAnaDPkupdEcJeuYBTI/TJNvAcPpEKKJH5Yi/hh5vncF/JhBnrhAZRa8CChHE/1zRbpU0CUTARRrdZ/JUZdow+i5i5Erakgah0NUXhXqZWjo2Y85IHcq0QAR/ERYBexkIKFvVXeKAORwzsQ81WaIwXuP+eoEPEcrr8IBt83BXL0d1/fNYBS9OQoFZd3j6sRRMdhyBoHMtTsIMY0dxBD7R6lRqdCjN2DmK7Qxf61cjeU+IAWyoTXHqf2oHZHDQYr3XwtH+Y3/1Y3ulnd3j01H95tyrvB0c5A33l8zyuVelqydM7l88LC/ZabtDt3jbkxe6amSks5GHvx2Hau+uarbOFjImLZMHimpTtux+a5nWkv3r0s2XSIupXhjvW0sNmuqRidnZpyDNXvfjqsnEFFNKg/BjUR2mdGcWU9txc/9yqb1A+UzxayGQ8HlUgX+QCNX/ICLcDvGBOlAAQ41tflg0j4vqrjJuVgZtksr0+BeqnGO58B8+bKvDtIyewV267mqdlC2WjLIe/TSEgnrmu2wKIZowBa62BQw267iiQIMj4J+tzpzOAdlzC6mdIvC3Bz0CpT30lQJ5ReTj4TUcRiP6d1uT5SZi3XJ6BO6uyFDfQ6NtBnkunKFi5E3hb3FrH4a6VK5AlJIBW/QFJEPCu6oRqabXJ6Fq4BPyqXao5JCfLD06wYevhS9QMrSVdePr3QI6bKzXiQ5MVCtoq9RWGAUwa+Z6Tq05ts5Ie2uhjhXUet1+x29e9oZhcfz06H9eOxPPAFLtzBbbU58hwgv5qVBOGTmEfswx9K+aor+J2FyUwNI8uUPi0ohCLKwBp8FeZQdYzChBUp4VlW85KX8JQT3M8tfdnDpvvkYwwh6JAVjN0etoJ6hMCeTAj6GPUbcT4rBXAm3icm4H06buPTBotNTvREsb3r1lpdRE3sjGJjOn+gdCtFdscDEXP/ZnOoLnh93zL3fW9qHX9bqHjoDL3PP4e7n7XkjuF/mqY7EobbODPoa/mbFbl6i4qMnpciMwykU2Q7CJvINSxKO3rMNXTXtREGXWc6DjlNqVldeu2Yr0uv8YSBPiAFSqNFQqb8OucOnyv28Xf/fJXboZqrEtUxNBcidgsHldC8EMMUt2ql1qvpsb5o4DOcoRORQUUYpvoZWtL4wMNHrqa+n1VY1YpE8aBoVD2JkzRqUZFHlgoGvwAgJlcpz57J57HlUJZ1Y+FDOcLFkgiXAFVNrZ4oQrxTMkmXC6DIxQNSpA0ztfwJkJoco+oRql40fyIV2wYSHlXtxOWKDejOfLm30cg6Sf12t+q64E1m3wRUp+oEnp9841qpfVv5ToqrFT31uZcUwQpNLoT3LQZW1cMWu3kbM7k33yD7DBMmu4Pji2wZsk2VXS1iwcXfRLRMUsnifi33lIEgXMPg5GGOw8KBqpffJYBhk+6ywS5161sKnWzVAJ8Q370oiouiuCiKiRUFdnV3mMX3xT1fVW9UvGjyTTmtgGPKfY/FLN14al8Ok0kkPA0SAfcs2oYfA0pdbvvM9pEZWMi0Az/wfJ/aBpkFXkAtM+CcMLeuQwUmPxeLdMWvHtUO8lvcskM7rIj27Ydwe/A22ZYd0men3ggxr171TIg5plg3qGEbloMsEzttjoNN19VtgyLAAgU1ZhinMXNimLqqA1uG6WDiEKtD1JGpU9vEpuFQRE27Q60mpu10V/193i7yn9GKmYqioManM1m4R7D75JqYwyh52Va84b14F//z4n9e/M/v5n92XIDatH8vj5O+4Q1u5+UAELKzEkjqIwVH2/ndZUWCzE5l41lz86P75fdV+h8NZwb6x/Xnx3+y33u3Tu7nMsN+vgLVQYTB2iEMKGBeu8zWZg0tV2acX4dZ0tAnRQeOIx+vG+Q3yvv70jrffeGpD7SuV5T264IRYv8mcjqxfzKKlGidvXivF/ynw7vmjt+zObCo9K/8bMCBmy9P4bYj2THNNtpxlLaqcXrir9jt2ehvTOUAVw54Y7LYyHZtevtUIe5MDBTuxi8MfKJ1wk43EtI98TEx0TQqxB9xVgncdOAPDYcWmMhPmtZMLx3rSZgUvjCpC5N6/szQMuWBeFIgLCzKVeNAXPhMHLiz8RSGknsiAESWW0HrbagirnI/tPLk8V1at7fXWbpI20Xa/n+kDXhDnrtEfjzLim3JPcJXy956vdbXVE/SOdzg3Ie6R8rWgX8F9WnZJpbsSYO5vcjURabepEwNWrB+IYJhUGuNKhx/n0uQt+DqAMVFfC7i8+bEpwiMv8AkkXxd6/7rr798Ok6OToq2F3NS7bn3ecBWdeSvuTI/RvSi/oOBmsn2BCwMh+oY77LpMf6coDde2rf34ywi8fxJyLyYbhtOeV+UdG2jvN8WVTfNkh95KmCAVKjzleL6ZxY2MQwdGa5LTGpgipHR2XKPkKkT6jrYIbZFTLcTEjs44m8BXM1tQM4xO810F5snjv6fsAL9Oifc1bFjngfzf5wz7nv1xRmfccdtrFeSOWqwvndsJjzRdtqB2B/vUHg32kt6zsPSqdaqeyd19FNkAwbxGXM4qgHbh94zMWAUdaP1px523fmjgZ2z0xMbpeFjYYNGaXBH08TWqozfBiLkMYsOXxWc3lwdaJ5GO0imIR0j2x4Fy90d31anhuks0gmrx5cdeZcwwmVH3rRujklx+48d2voB090/oBvJ51ExyvofYAsts/0jXfrufw== \ No newline at end of file diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/importRules.sh b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/importRules.sh new file mode 100755 index 00000000..e9436fbb --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/importRules.sh @@ -0,0 +1,13 @@ +#!/bin/bash -x + +output_dir_rules=/home/karima/datasets/rules + +mkdir -p ${output_dir_rules} +cd ${output_dir_rules} +git clone --depth 1 https://github.com/Yamato-Security/hayabusa-rules +git clone --depth 1 https://github.com/SigmaHQ/sigma + +for file in $(find . -name '*.yml'); do + [ -f "$file" ] || break + yq ".rulePath = \"${file}\"" -o=json $file > ${file}.json +done diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/importRules2.sh b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/importRules2.sh new file mode 100755 index 00000000..febc7882 --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/importRules2.sh @@ -0,0 +1,20 @@ +#!/bin/bash -x + +output_dir_rules=/home/karima/datasets/rules + +mkdir -p ${output_dir_rules} +cd ${output_dir_rules} +git clone --depth 1 https://github.com/Yamato-Security/hayabusa-rules +git clone --depth 1 https://github.com/SigmaHQ/sigma + +for file in $(find . -name '*.yml'); do + [ -f "$file" ] || break + yq ".rulePath = \"${file}\"" -o=json $file > ${file}.json +done + +cmemc graph delete http://example.com/rule + +for file in $(find . -name '*.json'); do + [ -f "$file" ] || break + cmemc workflow io RulesHayabusaSigma_671e1f43d94bbc36:Importrules_6ccbc14b656c75c9 -i ${file} +done \ No newline at end of file diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/index.md b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/index.md new file mode 100644 index 00000000..f5b7a87f --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma/index.md @@ -0,0 +1,245 @@ +# Build the Knowledge Graph from indicators of compromise rules, like Hayabusa and Sigma rules + +## Introduction + +There are a lot of sources to download the indicators of compromise rules to detect a possible future incident. + +There are rules for Host-based intrusion detection systems (HIDS) with Hayabusa/Sigma, for example, and Network intrusion detection systems (NIDS) with Suricata/Zeek for example. + +Here, we are working with the Hayabusa/Sigma rules available via GitHub: + +- [https://github.com/Yamato-Security/hayabusa-rules](https://github.com/Yamato-Security/hayabusa-rules) +- [https://github.com/SigmaHQ/sigma](https://github.com/Yamato-Security/hayabusa-rules) + +The problem of interoperability, here, is the YAML format of files, their random position in their folders in their Github projets. Moreover, the same rule can exist in different projects but in this tutorial, we will not fix this problem and we consider the IRI rule is their Web address. In Corporate Memory, we would fix that with the Linked Tool, we will study this tool in a next part of this tutorial. + +To build this knowledge graph of rules, we need to: + +1. Create a JSON dataset with all rules +2. Build the transformer of a JSON rule to RDF +3. Build a workflow to insert each rule in an unique knowledge graph +4. Use this workflow in CMEMC to import automatically all rules + +## Import the JSON datasets + +The YAML syntax is used to define each rule and there is one file by rule. + +Corporate Memory doesn't support YAML (for the moment) but you can convert the files in JSON with this bash where you need to install git and [yq](https://github.com/mikefarah/yq). + +Moreover, we use yq to add the field `rulePath` in each file with their paths in their repositories to have the possibility to rebuild their positions on the Web and so allowing the analyst to click directly on this link to read the details and may be, modify this rule. + +At the end of this bash, you will have a tree of JSON files and we will apply a workflow on each file. + +!!! Tip + + Don't forget to replace the final folder before using this bash. + +```bash +#!/bin/bash -x + +output_dir_rules=/home/karima/datasets/rules + +mkdir -p ${output_dir_rules} +cd ${output_dir_rules} +git clone --depth 1 https://github.com/Yamato-Security/hayabusa-rules +git clone --depth 1 https://github.com/SigmaHQ/sigma + +for file in $(find . -name '*.yml'); do + [ -f "$file" ] || break + yq ".rulePath = \"${file}\"" -o=json $file > ${file}.json + +done +``` + +We can test this script: + +```bash +cd ~/git/tutorial-how-to-link-ids-to-osint/docs/build/tutorial-how-to-link-ids-to-osint/lift-data-from-YAML-data-of-hayabusa-sigma +chmod +x importRules.sh +./importRules.sh +``` + +For example, the file [proc_creation_win_bcdedit_boot_conf_tamper.yml](https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_bcdedit_boot_conf_tamper.yml) will become this JSON file: + +```json +{ + "title": "Boot Configuration Tampering Via Bcdedit.EXE", + "id": "1444443e-6757-43e4-9ea4-c8fc705f79a2", + "status": "stable", + "description": "Detects the use of the bcdedit command to tamper with the boot configuration data. This technique is often times used by malware or attackers as a destructive way before launching ransomware.", + "references": [ + "https://github.com/redcanaryco/atomic-red-team/blob/f339e7da7d05f6057fdfcdd3742bfcf365fee2a9/atomics/T1490/T1490.md", + "https://eqllib.readthedocs.io/en/latest/analytics/c4732632-9c1d-4980-9fa8-1d98c93f918e.html" + ], + ... + "tags": [ + "attack.impact", + "attack.t1490" + ], + ... + "level": "high", + "rulePath": "./sigma/rules/windows/process_creation/proc_creation_win_bcdedit_boot_conf_tamper.yml" +} +``` + +## Create the knowledge graph + +The collected rules are from Sigma and Hayabusa repositories. [Hayabusa "are trying to make this rules as close to sigma rules as possible"](https://github.com/Yamato-Security/hayabusa-rules#rule-file-format). In your use case, we need properties defined by Sigma and which also exist in Hayabusa rules. The day where there will be a official RDF vocabulary to define a rule, we will use it. Waiting, your minimal vocabulary is "defined" here: [https://github.com/SigmaHQ/sigma-specification/blob/main/Sigma_specification.md#](https://github.com/SigmaHQ/sigma-specification/blob/main/Sigma_specification.md#). We use this address for the prefix of your RDF vocabulary for your use case. + +The filename of the same rule between repositories does not change. So, we are making the IRI of rules with their filename and a arbitrary IRI, like "". However, we want to give the possibility to open the original YAML rule directly via SPLUNK, so we add the property `rdfs:isDefinedBy` to associate the rule Web URLs to a rule. +We will not use the guid id or Web address of the rule in its IRI because rules are often duplicate between the repositories and the filename and the title seem to be the used IDs of rules in Splunk and not the guid id. + +This new transformer are building the following RDF model for your use case: + +![](23-1-rdf-model-rule.png) + +1. Create a new project to build the knowledge graph of "Rules Hayabusa Sigma" + +2. In this project, create a RDF dataset "Rules Hayabusa Sigma" in Corporate Memory for all rules with the named graph: `http://example.com/rule` + +3. Create a JSON dataset "Rule example (JSON)" in Corporate Memory with one example of rule: + + ![](23-1-add-json-dataset.gif) + +4. Create the prefix of your vocabulary: + + ```turtle + prefix ctis: + ``` + + ![](23-1-add-prefix-ctis.gif) + +5. Create the transformer for "SIGMA Hayabusa rule" to build this RDF model. + +Rule object: + +- type: `ctis:Rule` + +- IRI: concatenation of "" with the result of this regular expression `^.*?([^\/]*)$` on the rule path + +![](23-1-iri-rule.png) + +- property `ctis:filename` with the result of this regular expression `^.*?([^\/]*)$` on the value path `rulePath` +- property `rdfs:label` with the value path `title` +- property `rdfs:comment` with the value path `description` +- property `rdfs:seeAlso` with the value path `references` +- property `ctis:mitreAttackTechniqueId` is building with this formula with the value path `tags` + - Filter by regex: `^attack\.t\d+$` + - Regex replace `attack\.t` by `T` + +![](23-1-formula-mitreid.png) + +- property `rdfs:isDefinedBy` on the value path `rulePath` is building with this formula to link the rules to their Web addresses. + - Add two "Regex replace" + - replace `\./hayabusa-rules/` by `https://github.com/Yamato-Security/hayabusa-rules/blob/main/` + - replace `\./sigma/` by `https://github.com/SigmaHQ/sigma/blob/master/` + +![](23-1-rules-isdefinedby.png) + +So the rulepath `./sigma/rules/windows/process_creation/proc_creation_win_bcdedit_boot_conf_tamper.yml` becomes the link `https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_bcdedit_boot_conf_tamper.yml` and `./hayabusa-rules/hayabusa/sysmon/Sysmon_15_Info_ADS-Created.yml`becomes `https://github.com/Yamato-Security/hayabusa-rules/blob/main/hayabusa/sysmon/Sysmon_11_Med_FileCreated_RuleAlert.yml` + +!!! Tips + + To test your transformer, you can use the tab "Transform execution". Here, the knowledge graph will not be cleared after each workflow or execution to test your transformer because the option "clear graph before workflow" is disabled. However during the steps to build this transformer, you can enable tempory this option to see and test the final transformer. + You need only to disable this option when your transformer is finished. + +!!! Success + + Your example of rule exists now in your knowledge graph: + ![](23-1-success-extract-rule2.png) + ![](23-1-success-extract-rule.png) + +6. Make the workflow "Import rules" with one input + + ![](23-1-success-workflow.png) + +And don't forget to allow the replacement of JSON dataset because it allows to replace this specific JSON by all other rules during the execution of this worflow. + +![](23-1-workflow-allow-replacement.png) + +![](23-1-add-worflow.gif) + +7. Copy the workflow ID + + ![](23-1-id-worflow.gif) + +!!! Success + + In this example the ID of workflow is `RulesHayabusaSigma_671e1f43d94bbc36:Importrules_6ccbc14b656c75c9` + +## Apply the worflow to all files + +We modify the first bash where we add the line to clear the knowledge graph before importing all rules via our worflow where we subtitute the JSON dataset in input by the rules' files. + +!!! Tip + + Don't forget to replace the worflow ID and the final folder before using this bash. + +!!! Tip + + CMEMC config file need to be correctly configurated before to execute this bash, like in the previous tutorial. + + For example: + + ```bash + [johndo.eccenca.my] + CMEM_BASE_URI=https://johndo.eccenca.my/ + OAUTH_GRANT_TYPE=password + OAUTH_CLIENT_ID=cmemc + OAUTH_USER=johndo@example.com + OAUTH_PASSWORD=XXXXXXXXX + ``` + You need to replace "johndo" by other thing, "johndo@example.com" by your login (email) in the sandbox and XXXXXXXXX by your password. Save the file (with VI, :wq). + + Don't forget to specify the config by default to use by CMEMC. + + ```bash + export CMEMC_CONNECTION=johndo.eccenca.my + ``` + +```bash +#!/bin/bash -x + +output_dir_rules=/home/karima/datasets/rules + +mkdir -p ${output_dir_rules} +cd ${output_dir_rules} +git clone --depth 1 https://github.com/Yamato-Security/hayabusa-rules +git clone --depth 1 https://github.com/SigmaHQ/sigma + +for file in $(find . -name '*.yml'); do + [ -f "$file" ] || break + yq ".rulePath = \"${file}\"" -o=json $file > ${file}.json +done + +cmemc graph delete http://example.com/rule + +for file in $(find . -name '*.json'); do + [ -f "$file" ] || break + cmemc workflow io RulesHayabusaSigma_671e1f43d94bbc36:Importrules_6ccbc14b656c75c9 -i ${file} +done +``` + +We can test this script: + +```bash +./importRules2.sh +``` + +## Conclusion + +Here, we learnt how to generate a knowledge graph with files in input with Corporate Memory to prepare the worflow and cmemc to execute this worklow on all files. + +## Ressources + +- [RDF schemas (Model, pattern, etc)](RDF_model_and_pattern.drawio) +- [script 1](importRules.sh) +- [script 2](importRules2.sh) + +--- + +Tutorial: [how to link Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT)](../index.md) + +Next chapter: [Link IDS event to a knowledge graph in dashboards via queries](../link-IDS-event-to-KG/index.md) + +Previous chapter: [Build a Knowledge Graph of MITRE ATT&CK® datasets](../lift-data-from-STIX-2.1-data-of-mitre-attack/index.md) diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/eccenca_poc_investigate.tar.gz b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/eccenca_poc_investigate.tar.gz new file mode 100644 index 00000000..d126d98c Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/eccenca_poc_investigate.tar.gz differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/index.md b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/index.md new file mode 100644 index 00000000..44586067 --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/index.md @@ -0,0 +1,230 @@ +# Link IDS event to a knowledge graph via advanced tools + +## Introduction + +In this tutorial, we are using the Splunk app "Investigate lateral movements with a knowledge graph", like example. This app contains several dasboards to help the analysts to navigate in the Hayabusa or Sigma alerts before searching in the Suricata and Sysmon alerts. We hope this method can "Accelerate Cyber Threat Hunting". + +In the demo of this Splunk app via the video 1, the user selects the data about one investigation via Splunk and generate a bash script to export these data via the Splunk API in tempory graphs in Corporate Memory for each investigation. + +![](splunk-app-demo-poc-app.gif) + +*Video 1: Splunk dashboards of the Splunk app "Investigate lateral movements with a knowledge graph"* + +In this page, we are showing how, we : + +1. Install the Splunk app "Investigate lateral movements with a knowledge graph" +2. "Accelerate Cyber Threat Hunting" with dashboards +3. Manage the graphs of your application +4. Export data in Splunk to Corporate Memory +5. Reasoning with data in Corporate Memory via Splunk +6. Reconcile automatically the complex data via Linking tasks + +## Install the Splunk app "Investigate lateral movements with a knowledge graph" + +This tutorial describes the method in the app "[Investigate lateral movements with a knowledge graph](eccenca_poc_investigate.tar.gz)". You can install it and modify the source code. The queries and workflows used in its dashboards are not shared because they are built according to Splunk indexes which are not shared also. But, you can modify the dashboards and build your queries and workflows in your sandbox. + +This app is not directly connected to your Corporate Memory instance. The custom REST endpoint in this app via the file "Investigation.py" generates bash scripts for CMEMC to create or delete the tempory graphs of each investigation (and create/delete tempory folders). When the script is generated for one investigation, the script "createInvestigation.sh" or "deleteInvestigation.sh" via a cron service on your Splunk server calls it and CMEMC will use this configuration by default on this server to connect to your Corporate Memory instance. + +Position of these scripts in the folders of this app: + +``` ++---bin +| Investigation.py ++---cmem +| createInvestigation.sh +| deleteInvestigation.sh +``` + +Moreover, a settings file is necessary to insert the credentials of Splunk (like token, IP, port) and to specify the folders to manage the files of investigations on the server, ie. the generated scripts and the exported raw data of Splunk. Read the file "README.md" for more information. + +## "Accelerate Cyber Threat Hunting" with dashboards + +In this Proof of Concept, we have implemented two types of investigation: + +- high-level with the data of alerts of Zeek and Hayabusa/Sigma +- low-level with the data of Suricata and Sysmon + +For each investigation, an analyst selects and navigates in the data with two dashboards for each type of investigation: + +- one dashboard (see figure 1) to select the data to transfer to knowledge graph: typeA_request.xml +- one dashboard (see figure 2,3,4) to navigate in the knowledge graph: typeA_dashboard.xml + +![](poc-app_request.png) + +*Figure 1: Splunk dashboard to select the data before executing a high-level investigation* + +![](poc-app_high_level_computers.png) + +*Figure 2: High-level investigation dashboard with the list of computers implicated in the incident* + +![](poc-app_high_level_period.png) + +*Figure 3: High-level investigation dashboard with the panel to select a specific period during an incident according to IoCs details* + +![](poc-app_low_level.png) + +*Figure 4: low-level investigation dashboard contains the command lines of Windows processus rised Suricata alerts during the period selected by the analyst in a high-level investigation dashboard.* + +The idea is the analyst can do an investigation high-level without using a lot of ressources (a little graph) but when he want to see the suspicious processus on one computer in a specific period, he can ask an investigation low-level with a maximum of details. + +To follow the calculation of investigations and free memory when one investigation is closed, we developed another dashboard "investigation_list.xml" (see figure 5). This dashboard prints the status of investigations actually in the knowledge graph. Here, each investigation is saved in tempory graphs and the analyst can create and delete them directly in Splunk. + +![](poc-app_list_investigations.png) + +*Figure 5: The dashboard "investigation list" shows all the tempory graph actually in the knowledge graph. The analyst can open an investigation, see the SPL query generated when he has created an investigation and delete it when he want.* + +With these interfaces to manage and calculate different investigations with different levels of details, we imagined a first method to "follow lateral movements" (see figure 6) in order to understand the objectives of the incident. We hope this PoC will "Accelerate Cyber Threat Hunting". + +![](poc-app_hunt.png) + +*Figure 6: Analyst can select a computer and a period to analyze the suspicious processus implicated in Suricata alerts. So, an analyst can follow the "lateral movements" and see the command lines executed by these suspicious processus.* + +## Manage the graphs of your application + +A knowledge graph in Corporate Memory is a set of named RDF graphs. Each named graph can be managed and each named graph can have missions very different. In this PoC, when a new investigation is created, the app creates in first the named graph "investigation" to link all the other tempory named graphs for this investigation with the property "owl:imports". So, when an analyst want to delete an investigation, the app can find all the tempory graphs of this investigation and can delete all its tempory graphs simply. Moreover, the analyst can request with SPARQL all these tempory graphs via one named graph "investigation" (thanks to "owl:imports"), so the complexity of tempory graphs is invisible for the final user. + +An error of novices is to save all the triples of data in input and their inferences in the same graph. For each upload of facts, each calculated inference, etc, you need to save their triples in its own named graph because during the life of data (and the development), you want to restore easily one named graph without re-building all the other graphs. + +This manner to manage the graphs has been applied in this app, so an analyst is able to write in his dashboard code the data to upload from Splunk to knowledge graph with the tokens "source_x", for example: + +```xml + { + "index": $selected_index|s$, + "search": "sauron_metadata.sauron_source_type=hayabusa Level!=info | table RuleTitle RuleFile | dedup RuleTitle RuleFile", + "workflowID": "b5deffdd-f4b9-4d1a-8ea0-9b3410d915e7_PoC21:investigation-hayabusa" + } +``` + +This token contains a json object where: + +- "index" the list of splunk indexes of the SPL query +- "search" the second part of the SPL query +- "workflowID" the ID of workflow in Corporate Memory to convert the raw data of Splunk in RDF in a tempory graph + +An analyst can import as many sources as needed with several tokens, ie. "source_1", "source_2", etc. + +There are not consensus about the manner to calculate inferences on the RDF data in a knowledge graph. To simplify, one inference is a set of triples in a graph according to calculations with other triples in input. These calculations are possible only after all the sources are imported in the knowlege graph, ie. here, when all temporary graphs are created, the analyst can apply multiple calculations on these temporary graphs. Each calculation will create new triples in new tempory graphs always associated at the same investigation. We have created the token "inferences" to insert in the dashboard the json array of inferences to calculate when all data are imported from Splunk. For example: + +```xml + + [ + { + "comment": "POC 2.1: inference 1: Resolve hostname in Zeek Notice with Zeek DNS", + "command": "query", + "queryIRI": "https://ns.eccenca.com/data/queries/d063d87e-9122-41a3-84e9-4a05c2d0766e", + "inferenceID": "1" + }, + { + "comment": "Linking hostname to prepare to calculate computers", + "command": "workflow", + "workflowID": "b5deffdd-f4b9-4d1a-8ea0-9b3410d915e7_PoC21:WORFLOW_CONSOLIDATION_HOSTNAME_bebe8b4a7f975e90" + }, + { + "comment": "POC 2.1: inference 2: Calculate computers", + "command": "query", + "queryIRI": "https://ns.eccenca.com/data/queries/10cd6a60-c5d4-444c-8a09-6dc63f51576f", + "inferenceID": "2" + }, + ... + ] + +``` + +We use two manners to calculate new inferences: + +- when the inference is simple to calculate with SPARQL, we use a SPARQL update query with parameters in Corporate Memory (like "inferenceID" to build the name of destination tempory graph). "queryIRI" is the IRI of the query in the catalog of Corporate Memory. +- when the inference is complex to calculate, we use a workflow of Corporate Memory. + +With these tokens "source_1", "source_2", etc and "inferences" in the dashboard, the app can generate a bash script for CMEMC. + +We explain now how to insert these tokens in a dashboard. + +## Export data in Splunk to Corporate Memory + +In the previous chapter, you explain the role of token "source_x" to create a new tempory graph with Splunk data. This token contains SPL queries with other external tokens. To calculate correctly these SPL queries, you need to "set" the token "source_x" in the xml element `change` of last input component of these external tokens, like in this example with the external token "selected_index": + +```xml + + + index=" + " + OR + index + index + + | eventcount summarize=false index=* +| search NOT index IN ("history", "cim_modactions", "summary") +| dedup index +| fields index + 0 + + + all + * + + { + "index": $selected_index|s$, + "search": "sauron_metadata.sauron_source_type=hayabusa Level!=info | table RuleTitle RuleFile | dedup RuleTitle RuleFile", + "workflowID": "b5deffdd-f4b9-4d1a-8ea0-9b3410d915e7_PoC21:investigation-hayabusa" + } + + +``` + +Here the example is simple with one external token, but when you have several external tokens in the token "source_x", there are often problems to generate a complet SPL query (to check the SPL query, you need to use the Javascript console via the Javascript "investigation.js" to read the final SPL queries in the tokens "source_x"). + +You can add in your dashboard several tokens "source_1", "source_2", "source_3", etc. Each source generates a part of final bash script where a curl command requests the Splunk API and a CMEMC command executes the specified worflow via its ID in the token. With this method, the analyst is free to import any Splunk data and choose any CMEM workflow according to these data. The SPL queries are executed by the Splunk API (via curl), so the analyst is free to use all commands supported in Splunk to select the data. For example, with low-level investigation, these SPL queries contains also the selected period by the analyst to limit the quantity of data to import. + +## Reasoning with data in Corporate Memory via Splunk + +When all the sources are imported in the knowlege graph, the app will use the token "inferences" to execute the last calculations to do on the knowledge graphs. Here, there is not SPL query to calculate so we "set" simply the token "inferences" in the xml element `init`: + +```xml + + + [ +... + { + "comment": "Linking hostname to prepare to calculate computers", + "command": "workflow", + "workflowID": "b5deffdd-f4b9-4d1a-8ea0-9b3410d915e7_PoC21:WORFLOW_CONSOLIDATION_HOSTNAME_bebe8b4a7f975e90" + }, + { + "comment": "POC 2.1: inference 2: Calculate computers", + "command": "query", + "queryIRI": "https://ns.eccenca.com/data/queries/10cd6a60-c5d4-444c-8a09-6dc63f51576f", + "inferenceID": "2" + }, +... + ] + + +``` + +If you want to reuse your own algorithm to calculate new inferences, you can develop your own [plugin](develop/python-plugins/) in Corporate Memory and call it in a workflow that you can call in a Splunk dashboard. + +## Reconcile automatically the complex data via a Linking task + +In the previous chapter, you saw it is possible to call a workflow in a Splunk dashboard. A workflow is a set of components available in Corporate Memory, like transformer, tasks (SPARQL update query), etc. + +One component is **very useful** to reconcile the instance of concepts in your graphs like the concept of tools of different STIX documents or again, the computer according to their hostnames in the logs of systems and networks, etc. This component is the Linking task. + +To use it: + +1. Read the documentation of ["Linking task"](/build/active-learning) to learn to use it + +2. [Do the exercice "Reconcile automatically the STIX concepts via the Linking tasks" in the page of tutorial about Mitre's datasets](../lift-data-from-STIX-2.1-data-of-mitre-attack/#reconcile-automatically-the-stix-concepts-via-the-linking-tasks) + +## Conclusion + +RDF is often considerated like too simple to manage the complexe knowledge but the reality is this simplicity is the core to manage all type of complexity. This abstraction is rarely simple for the novices but when you know use RDF properly with professional tools like Corporate Memory, you will make all type of applications, like applications in the cybersecurity. + +Often with this tutorial, the analysts said there is already in SIEM (like Splunk) a lot of tools to hunt via the data. It's truth. There are a lot of tools in the SIEM to help the analysts. The difference with Corporate Memory and the Linked Data technologies, **YOU ARE FREE** because you can calculate your own inferences on your data, you can connect your SIEM with your knowledge graphs and ofcourse, your knowledge graphs is INTEROPERABLE, ie. you can connect your structured data with other tools in your information systems. Moreover, Corporate Memory can support several databases, so you are able to choose the best RDF database according the size of your investigations and the type of calculations to do. + +Now, you know what is it possible to do simply an app in the CyberSecurity with the Linked Data technologies and Corporate Memory. + +--- + +Tutorial: [how to link Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT)](../index.md) + +Previous chapter: [Link IDS event to a knowledge graph in dashboards via queries](../link-IDS-event-to-KG/index.md) diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_high_level_computers.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_high_level_computers.png new file mode 100644 index 00000000..71ca1174 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_high_level_computers.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_high_level_period.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_high_level_period.png new file mode 100644 index 00000000..cd87507c Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_high_level_period.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_hunt.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_hunt.png new file mode 100644 index 00000000..c6ddfd4f Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_hunt.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_list_investigations.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_list_investigations.png new file mode 100644 index 00000000..362d85db Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_list_investigations.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_low_level.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_low_level.png new file mode 100644 index 00000000..b260ae08 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_low_level.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_request.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_request.png new file mode 100644 index 00000000..85111ec5 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/poc-app_request.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/splunk-app-demo-poc-app.gif b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/splunk-app-demo-poc-app.gif new file mode 100644 index 00000000..06d3020b Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG-via-cmem/splunk-app-demo-poc-app.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/demo_ld.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/demo_ld.png new file mode 100644 index 00000000..8f4a7a81 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/demo_ld.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/demo_ld_without_html.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/demo_ld_without_html.png new file mode 100644 index 00000000..98d587f0 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/demo_ld_without_html.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/eccenca_commands.tar.gz b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/eccenca_commands.tar.gz new file mode 100644 index 00000000..1e24e899 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/eccenca_commands.tar.gz differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/index.md b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/index.md new file mode 100644 index 00000000..98d7fabc --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/index.md @@ -0,0 +1,421 @@ +# Link IDS event to a knowledge graph in dashboards via SPARQL queries + +## Introduction + +In this tutorial, we are using the Linked Data App for Splunk. This app contains the SPARQL command necessary to dasboards to help the analysts to understand the Hayabusa and Sigma alerts before searching manually in the data via a SPL (Search Processing Language) query in Splunk. + +In the demo of this app in the video 1, the user selects the indexes of his investigation and select an alert message to open its sources on the Web before searching manually via the Splunk interfaces. Splunk, automatically, refreshes the SPARQL queries in the dashboard after each interaction of user. + +![](splunk-app-demo-LD-app.gif) + +*Video 1: Splunk dashboards of the Linked Data App* + +In this tutorial, we learn to: + +1. Install the "Linked Data App" for this tutorial +2. Configure the SPARQL endpoint of your sandbox +3. Add other SPARQL endpoints +4. An example of dashboard with your private knowledge graphs + +## Install the "Linked Data App" in Splunk for this tutorial + +The "Linked Data App" extends Splunk Search Processing Language (SPL) to support the [SPARQL protocol](https://www.w3.org/TR/sparql11-protocol/). + +1. Download the tar.gz: [Linked Data App](../link-IDS-event-to-KG/eccenca_commands.tar.gz) + +2. Open the App window in Splunk via the icon "tools" (see figure 1) + +![](splunk_apps_menu.png) + +*Figure 1: In the top of the list of installed Splunk apps, you need to click on the icon "tools" to open the window to manage your apps* + +3. Upload the app in Splunk (see video 2) + +![](splunk-app-install.gif) + +*Video 2: When the tar.gz of the "Linked Data App", you can upload it manually directly in Splunk.* + +!!! Tip + + The dependencies of this app are already in its tar.gz but you can update the dependencies yourself, via the lines: + + ```bash + cd eccenca_commands + pip install sparqlwrapper -t bin --upgrade + pip install splunk-sdk -t bin --upgrade + ``` + +## Configure the SPARQL endpoint of your sandbox + +When you made your knowledge graphs in the previous pages, you have used the eccenca sandbox. To use these structured data in Splunk dashboards, you need to connect the SPARQL endpoint of your sandbox to Splunk via the "Linked Data App". + +After the installation, this app is in the folder `etc/apps/eccenca_commands` of Splunk directory. + +1. Create the file `settings.conf`: + +```bash +cd etc/apps/eccenca_commands +cp default/settings_template_sandbox.conf default/settings.conf +vi default/settings.conf +``` + +You have an example of configuration for the eccenca sandbox SPARQL endpoint in the file `default/settings_template_sandbox.conf` (and another example via Oauth2 secret ID in the file `default/settings_template_oauth_secret_id.conf`). + +2. Insert your credentials in the the file `settings.conf`, ie. replace `johndo` by the name of your sandbox (endpointRead, token_endpoint), `johndo@example.com` by your email and `XXXXXXXXX` by your password. Don't change the parameters OAUTH_CLIENT_ID and OAUTH_GRANT_TYPE. + +```ini +[config:default] +# replace johndo.eccenca.my by your sandbox +endpointRead=https://johndo.eccenca.my/dataplatform/proxy/default/sparql +accessMethod=oauth2 +# replace johndo.eccenca.my by your sandbox +token_endpoint=https://johndo.eccenca.my/auth/realms/cmem/protocol/openid-connect/token +OAUTH_CLIENT_ID=cmemc +OAUTH_GRANT_TYPE=password +# replace johndo@example.com by your email +OAUTH_USER=johndo@example.com +# insert your password +OAUTH_PASSWORD=XXXXXXXXX +``` + +3. Restart after your Splunk instance (via the administration windows) + +4. Test your sandbox endpoint in Splunk with this SPL query: + +``` +| sparql + query=" + select * + where { + ?s ?p ?v + } + LIMIT 10 + " +``` + +## Add other SPARQL endpoints + +To add a new SPARQL endpoint, add these two lines in your file `settings.conf` where your need to replace here `wikidata` by the name of new public endpoint and `https://query.wikidata.org/sparql` by the url of endpoint. + +```ini +[config:wikidata] +endpointRead=https://query.wikidata.org/sparql +``` + +Restart after your Splunk instance and request in Splunk your endpoint with the parameter config (here wikidata) to select the config to use in the file `settings.conf`: + +``` +| sparql + config="wikidata" + query=" + select * + where { + ?s ?p ?v + } + LIMIT 10 + " +``` + +!!! Tip + + You can clone the dashboards of this app to see and modify the SPARQL examples with Wikidata. + +## An example of dashboard with your private knowledge graphs + +To work, our example of dashboard need to have Splunk indexes of IoCs. We cannot share our indexes but you can modify our example with your own SPL queries according to your Splunk indexes. + +![](demo_ld.png) + +*Figure 2: Dashboard with SPARQL commands and the script `table_html.js` to print the HTML and to open Web pages of alerts' references* + +!!! Tip + + The SPARQL command respects the logic of SPLUNK to see all metadata of the SPARQL response (types of literal, etc). However, in a dashboard via a static table panel, you want probably to see only the columns in the header of your SPARQL query. In the XML element `table`, you can select the columns in output via the XML element `fields`: + + ```xml + ["Source","Description","MitreID"] + ``` + + Of course, you can do it also via the SPL query. + +You can see the XML of dashboard in the figure 2: + +```xml +
+ + + + +
+ + + index=" + " + OR + index + index + + | eventcount summarize=false index=* +| search NOT index IN ("history", "cim_modactions", "summary") +| dedup index +| fields index + 0 + + + all + * + + + + critical + high + medium + low + critical,medium,high,low + Level=" + " + OR + +
+ + + + + | tstats count where $selected_index$ ld_metadata.ld_source_type=hayabusa Level=low + 0 + + + + + + + + + + + + + + | tstats count where $selected_index$ ld_metadata.ld_source_type=hayabusa Level=medium + 0 + + + + + + + + + + + + + + | tstats count where $selected_index$ ld_metadata.ld_source_type=hayabusa Level=high + 0 + + + + + + + + + + + + + + | tstats count where $selected_index$ ld_metadata.ld_source_type=hayabusa Level=critical + 0 + + + + + + + + + + + + + + + + | tstats count where $selected_index$ ld_metadata.ld_source_type=hayabusa Level!=info $level$ by RuleTitle +| rename RuleTitle as "Rule name" +| sort - count + 0 + + + + + + $click.value$ + +
+
+
+ + + Rule's sources + + + | sparql +query="prefix ctis: <https://github.com/SigmaHQ/sigma-specification/blob/main/Sigma_specification.md#> +prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> +prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> +prefix xsd: <http://www.w3.org/2001/XMLSchema#> + +SELECT DISTINCT (STRBEFORE(STRAFTER(STR(?link),\"https://github.com/\"),\"/\") as ?Source) (?comment as ?Description) ?link (?mitreID as ?MitreID) +FROM <http://example.com/rule> +WHERE { + VALUES ?title { \"$selected_rule$\" } + + ?ruleHayabusa a ctis:Rule ; + rdfs:label ?title ; + rdfs:comment ?comment ; + rdfs:seeAlso ?referenceLink; + rdfs:isDefinedBy ?link ; + ctis:filename ?filename . + OPTIONAL { + ?ruleHayabusa ctis:mitreAttackTechniqueId ?mitreID . + } +}" + -24h@h + now + + $result.MitreID$ + + + + + $row.link|n$ + + + + ["Source","Description","MitreID"] +
+
+ + Rule's references + + + | sparql +query="prefix ctis: <https://github.com/SigmaHQ/sigma-specification/blob/main/Sigma_specification.md#> +prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> +prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> +prefix xsd: <http://www.w3.org/2001/XMLSchema#> + +SELECT DISTINCT (GROUP_CONCAT(STRBEFORE(STRAFTER(STR(?link),\"https://github.com/\"),\"/\"); separator=', ') as ?Source) (?referenceLink as ?Reference) +FROM <http://example.com/rule> +WHERE { + VALUES ?title { \"$selected_rule$\" } + + ?ruleHayabusa a ctis:Rule ; + rdfs:label ?title ; + rdfs:comment ?comment ; + rdfs:seeAlso ?referenceLink; + rdfs:isDefinedBy ?link ; + ctis:filename ?filename . +} +GROUP BY ?referenceLink" + -24h@h + now + + + + + ["Source","Reference"] + + $row.Reference|n$ + +
+
+
+ + + + Mitre description in relation with this rule + + | sparql +query=" +PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> +PREFIX ctia: <https://github.com/mitre/cti/blob/master/USAGE.md#> + +SELECT +(CONCAT (\"<b>\",?title,\"</b>\",\"<br/>\",?description,\"<br/><br/>\",GROUP_CONCAT( distinct ?link; separator=\"<br/>\")) as ?html) +FROM <https://github.com/mitre-attack/attack-stix-data/raw/master/enterprise-attack/enterprise-attack.json> +WHERE { + + { + ?resource ctia:type ctia:course-of-action . + } union { + ?resource ctia:type ctia:attack-pattern . + } + + ?resource rdfs:label ?title ; + ctia:description ?description ; + ctia:external_references ?mitre_url . + + ?mitre_url ctia:external_id \"$MitreID$\" ; + ctia:source_name \"mitre-attack\" . + + OPTIONAL { + ?resource ctia:external_references [ + ctia:url ?reference_url ; + ctia:source_name ?reference_label ; + ctia:description ?reference_description + ] . + BIND( CONCAT(\"<a href='\",STR(?reference_url),\"'>\",?reference_label,\": \",?reference_description ,\"</a>\") as ?link) + } + +} +GROUP BY ?title ?description" + -24h@h + now + + + + ["html"] +
+
+
+ + + + + $selected_index$ ld_metadata.ld_source_type=hayabusa RuleTitle="$selected_rule$" +| strcat Channel " type " EventID event_source +| table RecordID, Timestamp, event_source, Computer, Details + 0 + + + + + search?q=$selected_index$%20ld_metadata.ld_source_type%3Devtx%20EventRecordID%3D$click.value$&earliest=0&latest= + +
+
+
+
+``` + +## Conclusion + +In the "Linked Data App", we implemented a simple SPARQL command to request the Linked Open Data and also your private knowledge graphs. + +The Linked Data technologies give the opportunity to push the Open-Source INTelligence (OSINT) in the Linked Open Data and it will simplify the work of analysts via their SIEM, like Splunk or other. + +In the previous pages of this tutorial, you are able to create new classes and new properties in your knowledge graphs for Mitre Attack or IoC rules when you feel the need to do so. This natural behavior in the concept “Everything as code” creates a natural entropy of the global ontology of cyber domain. The first victim of this entropy is all the analysts. This problem can be resolve, if the analysts work together to build their cyber ontologies with the Linked Data technology, like Wikipedia contributors made Wikidata. It is only a matter of willpower and skill that you have now obtained through this tutorial. + +In the next page, we are using advanced tools in Coporate Memory to "Accelerate Cyber Threat Hunting". + +--- + +Tutorial: [how to link Intrusion Detection Systems (IDS) to Open-Source INTelligence (OSINT)](../index.md) + +Next chapter: [Link IDS event to a knowledge graph in dashboards via inferences](../link-IDS-event-to-KG-via-cmem/index.md) (for the advanced users of Corporate Memory) + +Previous chapter: [Build a Knowledge Graph from indicators of compromise rules, like Hayabusa and Sigma rules](../lift-data-from-YAML-data-of-hayabusa-sigma/index.md) diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk-app-demo-LD-app.gif b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk-app-demo-LD-app.gif new file mode 100644 index 00000000..cb0c6773 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk-app-demo-LD-app.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk-app-install.gif b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk-app-install.gif new file mode 100644 index 00000000..faa28636 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk-app-install.gif differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk_apps_menu.png b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk_apps_menu.png new file mode 100644 index 00000000..b3dc24e8 Binary files /dev/null and b/docs/build/tutorial-how-to-link-ids-to-osint/link-IDS-event-to-KG/splunk_apps_menu.png differ diff --git a/docs/build/tutorial-how-to-link-ids-to-osint/usecase.drawio b/docs/build/tutorial-how-to-link-ids-to-osint/usecase.drawio new file mode 100644 index 00000000..1a59a86e --- /dev/null +++ b/docs/build/tutorial-how-to-link-ids-to-osint/usecase.drawio @@ -0,0 +1 @@ +7V1Zd6M4Fv4t85Bzuh7wwRhvj1nKXenpdNdUMlU1TzkChK0OIBfIcdy/fq4WMKuNHewmFXxyYiMJId373UVXCxeDa//l1xAtF3fUwd6FoTsvF4ObC8MwRlMDvnjKRqX0xyplHhJHpvW3Cffkb6wSdZW6Ig6OMgUZpR4jy2yiTYMA2yyThsKQrrPFXOpln7pEc1xIuLeRV0z9Rhy2kKmTob5N/4TJfBE/ua+rHB/FhVVCtEAOXaeSBh8vBtchpUz+8l+uscepF9NF3jeryE0aFuKA1bkhuv0ReH/Tr8uV+fFr8O9Pvw6evmiqlmfkrVSHVWPZJqYAtHvJfwaUYWj0lUVXgYOd3y0PEvuQsF4Qhu+XyOal1oADSFswP86OJE+NIfx+xiEjQNxLj8wDSGSUF0bqyoae4BASPGRh7wrZT/OQP+yaejQULQigpiuXBkwBpW/CdZEQca/gafgllaQI8yumPmbhBoqoXG3am6Y/k5GsQaFWG0wUE9dbDAxjiC5S/E+4jRTu5smztqyBH4o7B3DKKOHUyGOcwEsUZFg2+rHioLpa0ogwQoG0l5AfYg8x8owFxUBeBE1Fxtz6ZQTNhnbpo4n8Ho8/yHKc2JqLfOJtZGmoHvmca+oh90tvFTxBxmeo3qWhDz/vaEDz5WS9twEIakShKJIJ1/Iyklf5m25CCkQx9HsURDvrhRxk0/JKrukqJIArQ/8Dr8tvT4rwCx+eEkk4JxSQIOb975vLl3SGpDrPCaDzyEvlPaOQIPgGeCO2Crka21nORsuqImuFMZ5pgooROR5mIC8abysJ5sU7abhccMKJDEOmgUAwTQncpajDZakcAqIdqOfocUdFDguhKsFf9ZxA0QdEQmjZ1EPWNHSyzUrqgp5YTwSq43VGLKRPWFNClSlnJdKv5aBqDIeST+kfH1ItdbBNQ8SBr7EFsZ8CHKnmkQDkIaZOvmyKkzvLpZqTLjdKADWaq28hnVZYKptVqCpUM05qArUhRT37gKPEvylolDD/H+RBbXTtAOhusO8TubryXFc17FIvlTrpPavrU4nhPmGr1tJ1Le1xGu+ADkhCBla0LL8+Ssm8wX6/qX7uUuL7aaDbIKtRpiNPeCP02DP2uPd/MNAPcCphsKdoIL/0NO/StBzHtDy2R1qAfFzszKXnzQj2nNvApVWM5w+qw/szYu0AEiuw9Y3kh1FbQHQH1Lq2jMepcUaOaLsoz0TzQ24JC8To9Xp7+l+R3GnqTlP/s/1snc5t3nS0TVNfw2gk4LHD43h+YmRubUTLGvZTGJwt74+1NfebCEYBnbnpzE1nbjpzU8fcUH+54nMN7VTrnb05qb3ZMv9Yg+NvbFVJz6M22ue3dKanMz2tND1dTOrspufjMw7Y7U0Vz7twVE5bb+l1rLLud9q5086ddu60cy3tzF5mxMOdeq6tnhOCHaufocO3f3z+7wN8i0mD2R2xQxpRl2nfSMDXF2gywPP45xLLBQDI62F4cKfYO8X+FhV761T0zx/x+Z3T5liOd+GeN2yhYs4fa54WAM7O0HSGpk2G5icxIDWNxN7ensOAfOGrT53qwI1K5k89q6qOiZiJkAwGtmmazj5bIxt7Thbv3mfQEpt0tKlJYeToYBX/dOamMzdvTiSaNyrVur2m4WhPAK3KqKw8vCvc9OahefzQpvVda4fUVRiiLa6Oj8rtcWiOdU1cd6LzTbJVD7ReZcWWIbUf7RCLMOHjmgSPlu1gh7BHi1L2aNPAfWTAOBz2Nn46IGCVWNky/6izyZ1NfjPaobPJx9nkB8I6o/wWu9YOsas2yjGw3plVvuKnXIjdoy6Zr+QcHlw/CEMsOqp/JQj+X0lj3fv4/WNnmzvb3Gol0c0DvsF5wAfi44gPAI7lemtt89sQmn92LjDN/WNNMFBvoOmmxo8U4iZzcDkw4Z/R7w34AT0XxpVIFMa0s0qdVTqzgLVnfPUqS/Rqu3HGEaPnPPqYIUecklJndrDmlN1r1MDx83wHzdiVCtS5If/6Fr8OLKqZpzmp6VDF35D9OB9S9+v7Q693wX5Xv5ypUB+N9auBgXP2FA2rxIc4YBz8E0Kj03Bn1XD7Vr8cltxMd9/zaWfd4ZTd4ZS1DkZ0PYpYnjgOiZYe2sTFPQIZhv4v4i9pyFDAdlqBw2xMJ9GdRHcSfYbjZpsIvHXS2UlnJ52NSufWc25oEMar2WOQc+f486Zf7D2tn7ej6cP1k5Py4+P0TcPoDYsH6sevTsgcqD9KijZ+pP6g8kj92tPrkwo23YNe4RP9OnX5P+FYxaeU6cgD2km162GbYa7UrE1S7hPaIGsVIQ7xVWYZSnaUW87f9JsXhETl355APC+XVHj/Qv41DT5xHP6YUvCE8n0QkKDH+FGNyuNp0hCezGEeT2bx9QwDswRNg1O9ncHcByVX0myLlK84dFCADgyVGBV4WzCmzMUM/uaELVZWz6Zgf2f3ZO6jT//h6oH/4t1DkTj+aLZHJ+10/ssiLg55flUvzkszLlzgSMzWcpM5/OKLR8E+JOtHUyTaFfQqrp15RauOXsBaEQisSBasOpkmUY5EpR6p1hl6hZbhZa4T4g908bmofFWMg120Shh35rfFmEZRHZnTEnVknkodDfepo/LgLXxct1Xxb5ZbiGntQ3g8LDmN0J5ofVuZjL7ST0xNHDTlcTZSyy6WcJFuDH8OjuyQLCUn9mlD63D8jN0GG3uDGTiCfFTLFtwFXEWJ7ygTlA0QjfF9FHCXkVH+T0BM6BpQNUlxiUc7h0c+Q93juFwQ8SxsLwLyY8XvEAnUZZiXY3yZjGxG4pvCQHINSlOMJLnKYgyULg4jqb7gH68fg6FY2SKwAC1C/D4LwziRX3poFdgLKQx8+Eh9WV8pb945eEPsYjBQNufCYdhtimq5aSu9POm8UqJx81nt6IbYscE7DDc89jNDjPrE1uSJQg99YX/ld893zkqnYrPxD88jVg+cPPAPsEPtqEd4m7nwzTzEQIx4DwLkbcB/4p6pDf1AE63vTCf2dOBO+xPcE/5Zs2LySr++NfLTkPOB5mn5q+V7lDvYjZGxJtykdu4RH5xo1rJGnU8lu26D/iyTKqS+Ni6lulBHrQnMGT1zom8/k/htrclrL8dlAxmzNx2WBOr6pxrMjLp3lIrw6GBL+J3vJZ2UjTRPxp1xkTvbhXAnsa+q0MujT1iIHx3qI8JnhJK7pQ8/bLAVKkXwfhmSCGtSmWUKn6rHwxsxs3F6ihKnQMTUBP4qhG5TVwOLwmc+NMsyhtZkOtYs1x5rZt+YaJPB1NGGBp6OR6ZjuWh0Dvo0OtKtJg4oaRyCR/aY8c1PBbnziNAq9Ko5fnb3PusjK29ByHiPhnOunAjjk6eAvmjr01cZ5PSU7ukpGYF42Pgxtz68gqJvzPMRLNgqvAMcoPPyIJHQXXrsjfJgD9h3Er8hjdSsFWp0XNnEWczAsWmWmJnZ9Mzi/tMMo87VlbdlERKDYHl03vtraYPDDPYAfkEa3Au9nen97TSepgKkkcYn0bGjWRstCVZmYiZ1bMZPzexsiLwtTH+gPg3QXC0Ju+fx6l8kn/n1byhYITEsMkYfeN63ePZWv1aMh5+XlgpdZ/dPvG92H+SjnI3dpfz77fP1xy8PNTj3k7AtY1wLvTnviOdsw82WAfE2WBBLTLHdbyKG+dJVfp7nMxba5i4ZexyiT05JvnZqb76ElzhiRlJOL4q3o/GZSBZST8w68mnLZYj5e30OVM/tmRMf37wijFu2juUUAUOzJGBYEtEdDoc9vSSia+qnihlOKpenVOnsV+y9T6+WLiylLlvKzffBaIvUXf3pmcYxza57qxdnyUyhZof6KgajRYy8aHJ3+yxE6wNWENZtUklgdVZI6/0V1VnLUeIJ1FvvduAETJUknyjUbw5KJLdsjevwVFI7LUjtvVxQqpYpx+tVxFKSeI2zWHciF6V8wxb35f+8v/3j4cM7Xr5cWA0/LOFsv4SzJ1u9HD8sxdqbtHchOXvHlQPnJuJLeGwiF66TLYOzcHiv/B0O6vB3Uj6LejoW9wssLrAIB85lGNI1pzU//oTYWYYVSTlTe8FuYgtVX00CgcPNd15XTx+N4oT/yYTpME64eVGPk1eb9NVnHBKgDsfEzU7Ny1A4x2wHdRQnsDPHO1mc2a1SrXq3u+tSjShjqXrCZ0qE4U82zOQQZBg5WMihvLpti4xCTcM9K5UHeWMhKVWoWEAuocMrUGi0FYUaoE43szA0B+N9MHwhTGLYMMfqWt47GcbX21v5RfrOPH4PA7XEwH5Q7wX/uFXgn+aw358cif3RJFtTfgXEqaFetrusFVDXe6NpBun9Y5TtFvpTI4P88bh/MPKPB7lRE+Rmq0AOHldexY+OhLmp9/qT0Thew5VfwQXZupmyALm9lKcWguK+uAfhKiYbiNUKcrGgfU3DJ9eTwWDhVl7TcMl32vI77rBPBYfk8MISIw4RS7Jp8CwHG8oNfbj9Lsb3MNZnSeVZFzXJFM/5cjNLykW8ylVA3I0YxXjyVsLHt/zFPrpHnnBS3e1NlPeOL9X4tZXub63dUnt0zGRfFEt12mjAl+6P89agZGtV6U7PvDg150gX91YpSHMOK0AtV6Hc/rsmokZLbLEIIt7x3KDJJYGIkDooWlgUhU4HnUagM81r2H6/CB2jbMv5+HDo8MAY33KTUp5Aw8UddTAv8X8=7Vxbc9o4FP41zKQPML5gkjwCSbqXdKaTdDbdfdkRtgBNZYvKAkJ//Z4jyWAbzB2SdqHtgI5lXc75zlV2a343fv0oyWj4SUSU1zwneq35dzXP892WB19ImRnKjXNrCAPJIkNyF4Rn9oNaomOpYxbRtNBRCcEVGxWJoUgSGqoCjUgppsVufcGLs47IgC4RnkPCl6kvLFJDu4vAWdB/o2wwzGZ2HXslJllnS0iHJBLTHMm/r/ldKYQyv+LXLuXIvIwv5r6HiqvzhUmaqG1umI3ayW16/Y/4g9KPf47+/f7y8KNuR5kQPrYbfhnSBJk8pMjBhPBZqnD1lAN7U6TBPzkG/njdeb+IpMOeIDLCa7QvaTqk6fyqgC+JszAK4jDMULOMw4q+wvo7QxVzILjwM1VSfKNdwYUESiIS6NnpM85LJMLZIIFmCByACfzOhErFQHZteyFmUYTTdKZDpujziIQ45xSQCjQpxklEkTkOtDjpUd4h4beBpmczRbRPxhzX1xeJeiAx4wjkv6iMgDeWbFHr3th2dnPN8x39yfrZTVuVwNXS10ppunOMgHJREVMlZ9DF3lB3Hd8Cy2qW17Lt6QKnfkYb5jCa0YhVjcF88AV64IcF0A5g8pbAVPNamnkRmxSE3vo+Rth3Cr8G9lvf0SsT0hFJVo7RmwutHhrGt3GhCVOMcD2Ag8yvp1pKeM29Gb2unPxJw9pJSAxfLRIjTJJeOjKjXEiWtNTmhokPRkbHk1tPyIjK/OUJkVf1ep7+YTcRvwf+XUjvAVzbIiaEUdSGdQB5yWABTZu9jFpye+mUxZwY15bzDegrwiHj0SOZiTFa7FTBXrJWZygk+wH9ycJZEpl5IN8p9HjGO+2Y4JKhz+fMv7gl0ifyWuj4SFKVrUZwTkYp6+n14Y0xkQOWdIRSIradVjnYnEfPe8lWrejMFy428+ec9hcsO7KXdLPILeclg+YKL+lmEejR3aS/s5vc3g5WuVMUwMqhy1rQqrabh2pcecjfY4y9Pefq7vHxA3w/CoLx2HtwJxevcSH90qRzedmyIrWCIGhtmK4nV7hSY8DWe9j/gxE9wIg1Go3Tcv70/MntWg56V14QmCqE692YH04+HejbdB27LzL25Wk7WIPxnK5I+mwwlkQxgdN/AR2hkiUDvJ1h2aMTgoNiqnH/9f49KPFRDcLP4HTPZaVcN7jdMFuFYpwYuUtJS7BBk1ZqdHE/q8txu9bgbMxeWYGDOUNQpUfd7a65oDzZkBtJAm7vc10kHcKNFEbojARLlA7Bgw78Beh2nUZQC+6QbUHHXbThL3aXChQZlk+YzhEoZDJTitlMRwpFFOnN86wdk5at8pHqwthykmJTkixD2ZSR3JwqIWlWJiRbW/Q15ZZiOe+OKsK4riP3MKPFGjHDpikwU11BHnOsHq9NrYvKd8mtN+XWJ0mmfW9L6J4Ou8Em7IbzYvwCm1lZfvcApIx7bwPux5WKsGfQsUInnBy5er4rMcod7JgDHHCCNXOgk9ApXiPQ3RF9dNt4dEbBM69Rwy2cywYzckCBt4rzYGDsQZXZ6Til2Z4MoWf4qaERxyRBi6OE3j2yXqMZwDzvbuQUluQUgSdpoLyM9YI5hwn7PtZMTfWEyrCbxfokDJaBE/VQn2LCp6B12AunIwptCZWp0Q8jkAhclhyHik2w35TgfT3aF/o2TsYJGDINEkmSVMRmvP1Ck20529hZ7sdXo6FSePDbRqPhPQxAUONeA+QIDUmjEOIkOQtBmA8m2amKH5fUZOeY8vjArdTYvfVzTZZ33i0djIOi2Ol3zlmvISkBr0MjEaYNtlnmv558z6+HW89Y7YfekvVH8EPlob+4zdt16XRF9eQkUvo9GbKe9mzPs1RRMIrOEw0xqULv8Qny3YF1XzspSYVpWRLxGynTVo8VFKOfkTl40IoGbNE+ta298PliooOljVkui3TAYqIPSLtNoAKpu86wdFQzknRCEzXfe8RSSIFN7KB3BTuasFAHKTociSARs0GOvg75hL7IkongEx3FaBalGcakxVhD21/9eFZqahqcfdOsHY0eBUY4QL3qMmVAqHf3wpIIn9HCQFgHY/jzj8/d+6cvH3L1yvNx9Yn2KSREyA/s+OYBzxoG/SrxjS0AyIzzB+vgkUp2+zvH3ZC7TQEOctaW/tSKCT7Q+wH+qf2vSnGlp+zMZ87MfUp0zaOU6LzgVHWO1hlrdG0ODExrhay5VJ7boH6X6tw7qM61tq3Oud6pUHt9OGqXTzicvmH2gpYdkRx+crtitpUFRGtxtj6zOmABZuD67jnGIedTTnY6Nf/hrc5/PMfz606zjujUTzq3fXAfbc9t+N7ykivOIveqHR5bdL+BQuzI5GOET9seDO5xaL35wH+Tqb4cBh7/MLB1lEjDP5XJvrmY7ONZ7Z/HaAc7Ge2f1mK/88c2DjTqF+v9xtZ7xStY57Xet3sdh1cpWBFrl0jhXWHt9q2xlr0gUQBbCRY0idr4Fi60Qk7SlIVFZhVfwtziHctmrfodS+CmnH3FsRq3zWZG+FsTHH9OuMsSftOa5VufwcwCd/BtUkN8ZcqMeN10bdsMeHMd2PZiPGzMco3yaIY9NFp65biU5AMLxVjaiGntSySKyAFdh6GKulYeNCswk9Ek5UQ/gpBf2yog2Rk+o9blahKlikQd/GXDdWF4+3FvikOabdtR8u8ylwb2A5BocLv4BMV5/BZcz3284jSGa0vTaC2YM+kAxVh+q/r9KEbglhTDvd5HMbaH8kaIVpi5M0G0FRQxulTC3RaTSyP5Zcu7N+zw6Zb5/xNgui/+twX//j8= \ No newline at end of file diff --git a/docs/deploy-and-configure/configuration/access-conditions/index.md b/docs/deploy-and-configure/configuration/access-conditions/index.md index 2d408759..65237d0c 100644 --- a/docs/deploy-and-configure/configuration/access-conditions/index.md +++ b/docs/deploy-and-configure/configuration/access-conditions/index.md @@ -11,6 +11,11 @@ The Access control module shows the list of all access conditions manageable b Access conditions specify access rights for users and groups to graphs and actions. To open the Access control, open the menu :fontawesome-solid-ellipsis-vertical: in the Module bar and click Access control. +!!! bug + + In the current version of Corporate Memory, access conditions are visible in the user interface only for user accounts, which are in the super-admin / root group (usually `elds-admins`, see property `authorization.rootAccess` [here](../dataplatform/application-full/#authorization)). + This will be fixed in the next release. + ## Access conditions The main window shows the list of all access conditions manageable by your account. diff --git a/docs/deploy-and-configure/configuration/dataintegration/index.md b/docs/deploy-and-configure/configuration/dataintegration/index.md index a3cb7870..9611a8ae 100644 --- a/docs/deploy-and-configure/configuration/dataintegration/index.md +++ b/docs/deploy-and-configure/configuration/dataintegration/index.md @@ -356,6 +356,37 @@ workspace.repository.projectS3 = { # /path/to/my-workspace/ } ``` +For this S3 plugin make sure the account has at least these permissions attached: + +``` json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": "s3:ListBucket", + "Resource": "arn:aws:s3:::" + }, + { + "Sid": "VisualEditor1", + "Effect": "Allow", + "Action": "s3:ListAllMyBuckets", + "Resource": "*" + }, + { + "Sid": "VisualEditor2", + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ], + "Resource": "arn:aws:s3:::/*" + } + ] +} +``` ### S3 Bucket, Shared Directory - s3 diff --git a/docs/deploy-and-configure/configuration/dataplatform/application-full.md b/docs/deploy-and-configure/configuration/dataplatform/application-full.md index 18223eb7..1b492d07 100644 --- a/docs/deploy-and-configure/configuration/dataplatform/application-full.md +++ b/docs/deploy-and-configure/configuration/dataplatform/application-full.md @@ -2,7 +2,7 @@ ## License By default, DataPlatform is subject to the eccenca free Personal, Evaluation and Development License Agreement (PEDAL), a license intended for non-commercial usage. When your delivery includes a dedicated license file, you have to configure DataPlatform to enable your license. -There are several options for changing the default configuration. If the properties under license are not provided, the included default license (PEDAL) is used. +To change the default configuration, you have several options. If the properties under license are not provided the default license included (PEDAL) is used. In case a dedicated license file is used, different configuration options can overwrite each other. The license is read in the following sequence: @@ -53,59 +53,32 @@ This section provides general configuration settings. ### Caching -DataPlatform provides caching support, which is enabled by default with an in-memory Caffeine cache. +DataPlatform provides caching support which is enabled by default with an in-memory Caffeine cache. ***Property: spring.cache.type*** -Use this property to define the type of cache to use. The default type (CAFFEINE) provides an in-memory cache suitable for simple standalone installations or test deployments. +Use this property to define the type of cache to use. The default type (INFINISPAN) provides a cache based on infinispan +which can be further configured under the custom properties "spring.cache.infinispan" To disable caching, set the type to NONE (not recommended). | Category | Value | |--- | ---: | -| Default | CAFFEINE | +| Default | INFINISPAN | | Required | true | -| Valid values | CAFFEINE, REDIS, NONE | +| Valid values | INFINISPAN, NONE | | Environment | SPRING_CACHE_TYPE | -#### Redis +***Property: spring.cache.infinispan.mode*** -Set REDIS to use a Redis cache. Use this cache type in scenarios with higher scalability demands or clustered setups. If this cache type is used, you must set the spring.cache.redis.host and spring.cache.redis.port properties as well. - -Configuration example: - -```yaml -spring: - cache: - type: REDIS - redis: - host: localhost - port: 6379 -``` - - -***Property: spring.cache.redis.host*** - -Use this property to set the hostname where the Redis cache is available. | Category | Value | |--- | ---: | -| Default | *none* | -| Required | only if spring.cache.type=REDIS provided | -| Valid values | string | -| Environment | SPRING_CACHE_REDIS_HOST | - -***Property: spring.cache.redis.port*** - -Use this property to set the TCP port where the Redis cache is available. - -| Category | Value | -|--- | ---: | -| Default | *none* | -| Required | only if spring.cache.type=REDIS provided | +| Default | LOCAL | +| Required | false | | Valid values | string | -| Environment | SPRING_CACHE_REDIS_PORT | +| Environment | SPRING_CACHE_INFINISPAN_MODE | Multipart upload limits config You may need to set the following parameter values to 2048MB for implementations @@ -114,7 +87,7 @@ that cannot handle large requests ***Property: spring.servlet.multipart.max-file-size*** -Use this property to define the maximum size of an uploaded file in bytes. Values can use the suffixes "MB" or "KB" (e.g. '1024MB'). +Use this property to define the maximum size of an uploaded file in number of bytes. Values can use the suffixed "MB" or "KB" (e.g. '1024MB'). **Note:** If DataPlatform is deployed in a Servlet container, make sure to also configure support for large file sizes. @@ -128,7 +101,7 @@ Use this property to define the maximum size of an uploaded file in bytes. Value ***Property: spring.servlet.multipart.max-request-size*** -Use this property to define the maximum size of HTTP request in bytes. Values can use the suffixes "MB" or "KB" (e.g. '1024MB'). +Use this property to define the maximum size of HTTP request in number of bytes. Values can use the suffixed "MB" or "KB" (e.g. '1024MB'). | Category | Value | |--- | ---: | @@ -184,11 +157,11 @@ The service name for DataPlatform under which the traces are stored | Valid values | string | | Environment | SPRING_ZIPKIN_SERVICE_NAME | -Spring Cloud Sleuth distributed tracing. This generates IDs for queries/updates and all operations in DataPlatform. Write to tracing exporter s. spring.zipkin. +Spring Cloud Sleuth distributed tracing. This generated IDs for queries/updates and all operations in DataPlatform. Write to tracing exporter s. spring.zipkin. ***Property: spring.sleuth.enabled*** -Whether tracing is enabled. If not, then IDs for i.e. queries are generated via UUID mechanism. Backend store "neptune" is not compatible with tracing enabled. +Whether tracing is enabled. If not then IDs for i.e. queries are generated via UUID mechanism. Backend store "neptune" is not compatible with tracing enabled. | Category | Value | |--- | ---: | @@ -201,7 +174,7 @@ Whether tracing is enabled. If not, then IDs for i.e. queries are generated via You can activate endpoints to expose an OpenAPI compliant specification of the available DataPlatform APIs. Developers can make use of this information to understand the API and to bootstrap client integration code. -The server URLs can be customized by setting the environment variable OPENAPI_SERVER_URLS on the machine or in the docker container that runs DataManager: +The servers URLs can be customized by setting the environment variable OPENAPI_SERVER_URLS on the machine or in the docker container that runs DataManager: ```bash export OPENAPI_SERVER_URLS="https://my-custom.domain.com:443/dataplatform" @@ -220,7 +193,7 @@ springdoc: ***Property: springdoc.api-docs.enabled*** -Use this property to enable and expose the endpoint that provides the OpenAPI compliant specification of the DataPlatform APIs. The following endpoints will become available when this option is set to true: +Use this property to enable and expose endpoint that provide the OpenAPI compliant specification of the DataPlatform APIs. The following endpoints will become available when this option is set to true: - /v3/api-docs - /v3/api-docs.yaml @@ -309,7 +282,7 @@ Use this property to define the list of headers that an actual response might ha ***Property: http.cors.allowCredentials*** -Use this property to define whether the browser should send credentials, such as cookies, with cross domain requests. +Use this property to define whether the browser should send credentials, such as cookies along with cross domain requests. | Category | Value | |--- | ---: | @@ -320,7 +293,7 @@ Use this property to define whether the browser should send credentials, such as ***Property: http.cors.maxAge*** -Use this property to define how long (in seconds) the response from a pre-flight request can be cached by clients. +Use this property to define how long in seconds the response from a pre-flight request can be cached by clients. | Category | Value | |--- | ---: | @@ -336,7 +309,7 @@ Java 11 HTTP client settings for HTTP access to the backend store. ***Property: httpclient.connectionPoolSize*** -The maximum number of connections to keep in the HTTP/1.1 keep-alive cache. A value of 0 denotes that the cache is unbound +The maximum number of connections to keep in the HTTP/1.1 keep alive cache. A value of 0 means that the cache is unbounded | Category | Value | |--- | ---: | @@ -347,7 +320,7 @@ The maximum number of connections to keep in the HTTP/1.1 keep-alive cache. A va ***Property: httpclient.keepalive.timeout*** -The number of seconds to keep idle HTTP/1.1 connections alive in the keep-alive cache +The number of seconds to keep idle HTTP/1.1 connections alive in the keep alive cache | Category | Value | |--- | ---: | @@ -358,12 +331,12 @@ The number of seconds to keep idle HTTP/1.1 connections alive in the keep-alive ## Authorization -DataPlatform supports authorization of RDF named graphs and actions. Authorization for clients and/or users is specified by the access conditions model which is described in section Access conditions. You can configure root access for a specific group of users that are given unrestricted access regardless of the defined access conditions. Refer to section Root Access for more information. +DataPlatform supports authorization of RDF named graphs and actions. Authorization for clients and/or users is specified by the access conditions model which is described in section Access conditions. You can configure root access for a specific group of users who are given unrestricted access regardless of the defined access conditions. Refer to section Root Access for more information. ***Property: authorization.rootAccess*** Use this property to enable or disable root access. -DataPlatform allows root access for a specific administrator group (see property authorization.abox.adminGroup). You can toggle root access using the property authorization.rootAccess. Regardless of the access conditions declared in the access conditions model (see Access conditions), all members of the administrator group are permitted to read and write any graph of any endpoint and are allowed to perform all actions. +DataPlatform allows root access for a specific administrator group (see property authorization.abox.adminGroup). You can toggle root access using the property authorization.rootAccess. Regardless of the access conditions declared in the access conditions model (see Access conditions), all members of the administrator group are permitted to read and write all graphs of all endpoints and are allowed to perform all actions. For example, the following configuration grants root access to any user in the group admins: @@ -382,6 +355,30 @@ authorization: | Valid values | boolean | | Environment | AUTHORIZATION_ROOTACCESS | +Use the following configuration options to specify options for collecting user information + +***Property: authorization.userInfoGraph.active*** + +Use this property to enable/disable collection of user information of logged-in users + +| Category | Value | +|--- | ---: | +| Default | true | +| Required | false | +| Valid values | string | +| Environment | AUTHORIZATION_USERINFOGRAPH_ACTIVE | + +***Property: authorization.userInfoGraph.ignored-account-names*** + +Logins of the following account names are not collected + +| Category | Value | +|--- | ---: | +| Default | [service-account-cmem-service-account] | +| Required | false | +| Valid values | string | +| Environment | AUTHORIZATION_USERINFOGRAPH_IGNORED_ACCOUNT_NAMES | + Use the following configuration options to specify values used by DataPlatform when working with RDF data, such as default URIs and prefixes. ***Property: authorization.abox.adminGroup*** @@ -424,7 +421,7 @@ Use this property to configure the URI of the public user (see section Public ac ***Property: authorization.abox.prefix*** Use this property to set the namespace of URIs created by DataPlatform. -**Note:** If you change this property, you also need to change the corresponding shape definitions for access conditions (i.e., the URI template), as well as existing URI descriptions and existing access conditions. +**Note:** If you change this property, you also need to change the corresponding shape definitions for access conditions (more precisely, the URI template), as well as existing URI descriptions and existing access conditions. | Category | Value | @@ -436,21 +433,12 @@ Use this property to set the namespace of URIs created by DataPlatform. #### Access conditions -**Note:** The access conditions model is empty if you do not provide a configuration in this section. - -Access conditions are defined in the access conditions model, an RDF named graph containing instances of the OWL class eccauth:AccessCondition is defined by the eLDS Auth schema Ontology. - -An access condition consists of the following elements: - - - type: Only RDF resources of type eccauth:AccessCondition are valid access conditions. - - requirements: Conditions to be fulfilled by the logged-in user such as group membership. All conditions must be fulfilled, otherwise the access condition is not fulfilled. - - grants: Actions or data the user is allowed to execute and/or access such as accessing a specific API or reading a graph. - -For simplicity, the Turtle serialization syntax is used in the following examples, however, you can define the access conditions model in any RDF serialization. +**IMPORTANT:** The following properties are deprecated and have no function anymore! ***Property: authorization.abox.accessConditions.url*** +**DEPRECATED** Use this property to set the URL of the access conditions model file. This can be either a remote (http://...) or a local (file:...) .rdf file. Refer to section Access conditions for more information on the access conditions model. @@ -463,8 +451,9 @@ Use this property to set the URL of the access conditions model file. This can b ***Property: authorization.abox.accessConditions.graph*** +**DEPRECATED** Use this property to set the graph containing the access conditions model. -**Note:** If you change this property, you also need to change the corresponding shape definitions for access conditions (i.e., the UI SPARQL queries). +**Note:** If you change this property, you also need to change the corresponding shape definitions for access conditions (more precisely, the UI SPARQL queries). | Category | Value | @@ -479,10 +468,10 @@ Use this property to set the graph containing the access conditions model. SPARQL endpoints declare how DataPlatform connects to a SPARQL-capable store or service. This includes stores that are capable of reading and writing RDF such as Virtuoso as well as read-only services like remote SPARQL HTTP endpoints (e.g. DBpedia). -With the default configuration, DataPlatform uses an in-memory database. This means, that no persistent storage is available unless a store supporting data persistence is configured. +With the default configuration, DataPlatform uses an in-memory database. This means, that no persistent storage is available, unless a store supporting data persistence is configured. -The following example shows a setup in which for each Resource all rdfs:label, Literals with language es, then en and in the end those without a language are evaluated. -If there are no matches here, skos:prefLabel is examined in the same way +The following example showcases a setup in which for each Resource all rdfs:label, Literals with language es, then en and in the end those without a language are evaluated. +If nothing matches here, skos:prefLabel is examined in the same way ```yaml proxy: @@ -500,7 +489,7 @@ proxy: ***Property: proxy.defaultBaseIri*** -Base IRI for this Corporate Memory instance. If not set, falls back to environment variable DEPLOY_BASE_URL, further fallback to https://fallback.eccenca.com/ +Base IRI for this Corporate Memory instance. If not set falls back to environment variable DEPLOY_BASE_URL, further fallback to https://fallback.eccenca.com/ | Category | Value | |--- | ---: | @@ -551,7 +540,7 @@ Specifies base language preferences for this instance. ***Property: proxy.languagePreferencesAnyLangFallback*** -Allows the fallback to ignoring the languagePreferences, in case none of the configured ones match the data. +Allows the fallback to ignoring the languagePreferences, in case none of the configured match the data. | Category | Value | |--- | ---: | @@ -562,8 +551,8 @@ Allows the fallback to ignoring the languagePreferences, in case none of the con ***Property: proxy.maxCBDDepth*** -The Concise Boundary Description is used for viewing and editing resources. -By default, up to a maximum of 5 Blank nodes are traversed for calculation. +The Concise Boundary Description is used for viewing and editing resoures. +By default up to a max of 5 Blank nodes are traversed for calculation. Increasing the max fetch will support deeper constructs, but will also add to loading time. @@ -578,9 +567,9 @@ Increasing the max fetch will support deeper constructs, but will also add to lo Maximum Values for shaped Resources When a resource is shaped by shacl forms, *shapedMaxValueCount* limits the number of values -returned per `shacl:PropertyShape`. The default needs to be larger than the DataManager setting +returned per `shacl:PropertyShape`. The default needs to be larger than the DataManager setting for for 'propertyLimit', which is up to 25. Changing this value allows custom -endpoints to fetch more data. Increasing this value will increase response time. +endpoints to fetch more data. Increasing this value will increase response time | Category | Value | @@ -590,20 +579,20 @@ endpoints to fetch more data. Increasing this value will increase response time. | Valid values | string | | Environment | PROXY_SHAPEDMAXVALUECOUNT | -***Property: proxy.cacheInvalidationCron*** +***Property: proxy.cacheExpiration*** -Cache Invalidation Frequency - Caches in DataPlatform are invalidated on updates and in regular intervals. This allows setting a cron for a scheduled eviction of all caches. +Cache Expiration - Caches in DataPlatform have a default expiration time which can be set | Category | Value | |--- | ---: | -| Default | 0 */30 * * * * | +| Default | PT30M | | Required | false | -| Valid values | Cron setting according to https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#scheduling-cron-expression | -| Environment | PROXY_CACHEINVALIDATIONCRON | +| Valid values | ISO 8601 duration format string i.e. PT30M, PT1D | +| Environment | PROXY_CACHEEXPIRATION | ***Property: proxy.cacheSelectiveInvalidation*** -Indicates whether the DataPlatform caches should selectively invalidate based upon the result of the done operations (insofar as determinable) or not. +Indicates whether the DataPlatform caches should selectively invalidate based upon the result of the done operations (insofar as determinable) or not | Category | Value | |--- | ---: | @@ -643,18 +632,18 @@ Used for resolving titles & comments and loading shaped resources. DataPlatform can sync graphs between git repositories and the backend store. Changes of graphs in the backend are transferred to the git repository on each update / write of the graph. -Changes of the graph in the git repository are synchronized with the store on a scheduled basis. +Changes of the graph in the git repository are synchronized to the store on a scheduled basis. - + Only HTTP git repositories with basic authentication can be used. -A local public bare repository accessible from DataPlatform can be used in the DataPlatform configuration (for testing purposes). +A local public bare repository reachable from DataPlatform can be used in the DataPlatform configuration (for testing purposes). -For details on how to provide the correct git authentication refer to . +For details how to provide the correct git authentication refer to . !!! note - All properties need to be written in camel case (e.g. "gitSync"), hyphens as separators must not be used. + All properties need to be written as camel case (e.g. "gitSync"), hyphens as separators must not be used. -An example git DataPlatform configuration using a gitlab git repository looks as follows: +An example git DataPlatform configuration using a gitlab git repository looks like: ```yaml gitSync: @@ -691,7 +680,7 @@ The folder inside the repositories where Corporate Memory places the synchronize ***Property: gitSync.remoteUrl*** -A remote git repository (http, local) - http repositories configured in graph configuration take precedence over this +A remote git repository (http, local) - configured http repositories in graph configuration take precedence over this | Category | Value | |--- | ---: | @@ -735,7 +724,7 @@ The git password for simple user/password authentification - may be empty for lo ***Property: gitSync.committerName*** -The committer name that appears in the commit message on system commits +The committer name which appears in the commit message on system commits | Category | Value | |--- | ---: | @@ -746,7 +735,7 @@ The committer name that appears in the commit message on system commits ***Property: gitSync.committerEmail*** -The committer email that appears in the commit message on system commits +The committer email which appears in the commit message on system commits | Category | Value | |--- | ---: | @@ -780,7 +769,7 @@ specify a log file (auto-rotating, 10Mb file size). Possible log settings for specific modules: Query Logging: com.eccenca.elds.backend.sparql.query.logging: DEBUG -The levels can also be configured on runtime via the loggers HTTP endpoint as described in section Application loggers in the Developer Manual. +The levels can also be configured on runtime via the loggers HTTP endpoint as described in section Application loggers of the Developer Manual. ```yaml logging: @@ -798,7 +787,7 @@ File output creates an auto-rotating file with 10 MB file size each. ***Property: logging.file.name*** -Log file name (e.g., `myapp.log`). Names can be an exact location or relative to the current directory. +Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory. | Category | Value | |--- | ---: | @@ -809,7 +798,7 @@ Log file name (e.g., `myapp.log`). Names can be an exact location or relative to ***Property: logging.file.path*** -Location of the log file, e.g., `/var/log`. +Location of the log file. For instance, `/var/log`. | Category | Value | |--- | ---: | @@ -820,7 +809,7 @@ Location of the log file, e.g., `/var/log`. ***Property: logging.config*** -Logging for DataPlatform can also be configured with Logback, which, for example, allows a more granular control of file rolling strategies. For further information on configuration options, refer to the Logback’s Configuration manual section and the Spring Boot’s Configure Logback for Logging manual section. +Logging for DataPlatform can also be configured with Logback, which, for example, allows a more granular control on file rolling strategies. For further information on configuration options, refer to the Logback’s Configuration manual section and the Spring Boot’s Configure Logback for Logging manual section. Use this property to specify where the Logback configuration is located. @@ -897,9 +886,19 @@ logging: | Valid values | string | | Environment | LOGGING_LEVEL_COM_ECCENCA_ELDS_BACKEND_STARDOG_STARDOGTEMPLATE | +***Property: logging.level.com.eccenca.elds.backend.cache.logging*** + + +| Category | Value | +|--- | ---: | +| Default | WARN | +| Required | false | +| Valid values | string | +| Environment | LOGGING_LEVEL_COM_ECCENCA_ELDS_BACKEND_CACHE_LOGGING | + ## Audit trail logging -DataPlatform is able to log the access of each user to named graphs in the form of an audit trail log under the logger name audit. +DataPlatform is able to log the access of each user to named graphs in form of an audit trail log under the logger name audit. ```yaml auditTrail: @@ -986,9 +985,21 @@ Use this property to define the context path under which DataPlatform is availab | Valid values | string | | Environment | SERVER_SERVLET_CONTEXTPATH | +Tomcat servlet settings + +***Property: server.servlet.session.cookie.same-site*** + + +| Category | Value | +|--- | ---: | +| Default | none | +| Required | false | +| Valid values | string | +| Environment | SERVER_SERVLET_SESSION_COOKIE_SAME_SITE | + ### HTTPS support for standalone mode -If DataPlatform is executed in standalone mode (see Standalone), the embedded servlet container can be configured to support one-way (server certification) or two-way (server and client certification) SSL. A KeyStore is required for one-way SSL and both a KeyStore and a TrustStore are required for two-way SSL. +If DataPlatform is executed in standalone mode (see Standalone), the embedded servlet container can be configured to support one-way (server certification) or two-way (server and client certification) SSL. A KeyStore is required for one-way SSL and both a KeyStore as well as a TrustStore are required for two-way SSL. Refer to the Oracle documentation to see how to create KeyStore and TrustStore files. @@ -1036,7 +1047,7 @@ Use this property to set the password to unlock the KeyStore used for one-way or Use this property to define the client identification policy. -If WANT is set, client identification is optional. If NEED is set, client identification is mandatory and unauthenticated clients are refused. +If WANT is set, client identification is optional. If NEED is set, client identification is mandatory, so unauthenticated clients are refused. | Category | Value | @@ -1114,7 +1125,7 @@ Bulk upload Pool Size - Limits how many (bulk/large) uploads via GSP / bulk load ***Property: scheduler.analyticalPoolSize*** -Limits how many analytical requests can be run in parallel. Analytical requests can have longer runtimes than retrieval requests. +Limits how many analytical requests can be run in parallel. Analytical requests can have longer runtimes than retrieval requests. | Category | Value | |--- | ---: | @@ -1131,7 +1142,7 @@ Please s. API documentation under /api/upload/ for further information. ***Property: files.maxStorageSingleFileSizeMb*** -Maximum size of one stored file (as uploaded, i.e., can also be compressed size) +Maximum size of one stored file (as uploaded i.e. can also be compressed size) Value in Mb @@ -1168,19 +1179,6 @@ Stored files and saved analysis will be deleted if older than maintenanceExpirat | Valid values | string | | Environment | FILES_MAINTENANCEEXPIRATIONDURATION | -***Property: files.maintenanceCron*** - -Cron setting for housekeeping / maintenance job -Stored files and saved analysis will be deleted if older than maintenanceExpirationDuration - - -| Category | Value | -|--- | ---: | -| Default | 0 0 1 * * ? | -| Required | false | -| Valid values | string | -| Environment | FILES_MAINTENANCECRON | - ## Store configuration Store properties for connecting to a triple store backend. Please see specific sections in documentation for each backend. diff --git a/docs/deploy-and-configure/configuration/dataplatform/application-graphdb-full.md b/docs/deploy-and-configure/configuration/dataplatform/application-graphdb-full.md index 55c62929..37514d18 100644 --- a/docs/deploy-and-configure/configuration/dataplatform/application-graphdb-full.md +++ b/docs/deploy-and-configure/configuration/dataplatform/application-graphdb-full.md @@ -3,7 +3,7 @@ Configuration example: -This example configures a connection with HTTPS to a remote GraphDB store () using the workbench import directory +This example configures a connection with HTTPS to a remote graphdb store () using the workbench import directory which is shared with the GraphDB instance. The repository will be created on startup of CMEM. ```yaml @@ -117,7 +117,7 @@ Import directory to be utilized in the "workbench import with shared folder" app ***Property: store.graphdb.useDirectTransfer*** -Set to true to use the native Graph Store API endpoint. Set to false to use the GraphDB workbench import. The import directory must then be set. +Set to true to use the native Graph Store API endpoint. Set to false to use the GraphDB workbench import. The import directory must be set then. | Category | Value | |--- | ---: | @@ -161,7 +161,7 @@ Whether to make use of GraphDB change tracking during SPARQL updates (s. 150MB. To upload larger files a graph file is temporarily stored in an S3 bucket and uploaded via Neptune Bulk Loader. The S3 bucket needs to be in the same region as the Neptune cluster. For more information s. https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load.html. If S3 upload is not necessary, the limit of 150 MB on HTTPS uploads apply for Neptune. The whole section can be left out of the configuration. +Settings for S3 bucket connection and upload of large files to the neptune instance. The neptune store blocks all HTTP requests with size >150MB. To upload larger files a graph file is temporarily stored in a S3 bucket and uploaded via Neptune Bulk Loader. The S3 bucket needs to be in the same region as the neptune cluster. For more information s. https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load.html. If no S3 upload is necessary then the limit of 150 MB on HTTPS uploads apply for neptune. The whole section can be left out of the configuration. ***Property: store.neptune.s3.bucketNameOrAPAlias*** @@ -101,7 +101,7 @@ The name of the bucket or access point -> the role CMEM runs under needs write a ***Property: store.neptune.s3.iamRoleArn*** -The name of the role the Neptune loader accesses the bucket -> the role needs read access to the bucket s. https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load-tutorial-IAM.html +The name of the role the neptune loader accesses the bucket -> the role needs read access to the bucket s. https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load-tutorial-IAM.html | Category | Value | |--- | ---: | @@ -123,7 +123,7 @@ The threshold on uncompressed graph data when bulk upload is applied with a maxi ***Property: store.neptune.s3.bulkLoadParallelism*** -The degree of parallelism (CPU) for the Neptune loader. Possible values are LOW, MEDIUM, HIGH, OVERSUBSCRIBE, default is HIGH +The degree of parallelism (CPU) for the neptune loader, possible values are LOW, MEDIUM, HIGH, OVERSUBSCRIBE, default of HIGH | Category | Value | |--- | ---: | diff --git a/docs/deploy-and-configure/configuration/dataplatform/application-oauth-full.md b/docs/deploy-and-configure/configuration/dataplatform/application-oauth-full.md index d83f1ff6..d90a5e3d 100644 --- a/docs/deploy-and-configure/configuration/dataplatform/application-oauth-full.md +++ b/docs/deploy-and-configure/configuration/dataplatform/application-oauth-full.md @@ -18,9 +18,9 @@ spring: #### OAuth 2.0 Resource Server -In order to protect access to its resources, DataPlatform acts as an OAuth 2.0 resource server accepting and responding to a protected resource request using a JSON Web Token (JWT). +In order to protect access to it’s resources, DataPlatform acts as an OAuth 2.0 resource server accepting and responding to a protected resource request using a JSON Web Token (JWT). -Neither the OAuth 2.0 specification nor the JSON Web Token specification define any mandatory claims to be contained in a JWT access token. However, if the property spring.security.oauth2.resourceserver.jwt.issuer-uri is set, the iss (issuer) claim is required to be contained in the JWT. Its value must be the same as the configured issuer URI. Additionally, in order to identify the requesting principal, either the username claim or the clientId claim must be contained in the JWT. +The OAuth 2.0 specification as well as the JSON Web Token specification don’t define any mandatory claims to be contained in a JWT access token. However, if the property spring.security.oauth2.resourceserver.jwt.issuer-uri is set, the iss (issuer) claim is required to be contained in the JWT. It’s value must be equal to the configured issuer URI. Additionally, in order to identify the requesting principal, either the username claim or the clientId claim must be contained in the JWT. ***Property: spring.security.oauth2.resourceserver.anonymous*** @@ -52,7 +52,7 @@ If this property is set, the iss (issuer) claim is required to be contained in t ***Property: spring.security.oauth2.resourceserver.jwt.jwkSetUri*** -Use this property to specify the JSON Web Key URI to use for verifying the JWT token. +Use this property to specify the JSON Web Key URI to use to verify the JWT token. | Category | Value | |--- | ---: | @@ -62,7 +62,7 @@ Use this property to specify the JSON Web Key URI to use for verifying the JWT t | Conflicts with | spring.security.oauth2.resourceserver.jwt.issuerUri | | Environment | SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWKSETURI | -Use the following configuration options to specify the claims conveyed by a JWT used to access protected resources of DataPlatform. If nothing is configured, the following default configuration is provided +Use the following configuration options to specify the claims conveyed by a JWT used to access protected resources of DataPlatform. If nothing is configured, a default configuration is provided with the following configuration ***Property: spring.security.oauth2.resourceserver.jwt.claims.username*** @@ -97,3 +97,82 @@ Use this property to specify the claim providing the OAuth 2.0 client ID to whic | Valid values | string | | Environment | SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_CLAIMS_CLIENTID | +#### OAuth 2.0 client configuration + +In order to protect access to it's resources, DataPlatform acts as an OAuth 2.0 Client which provides authentication its own clients by means of a session cookie. For this type of authentication a JSON Web Token (JWT) +is not necessary. The registration which is configured is named "keycloak" and provides a login page redirecting to a keycloak backend. For specific customizations please s. https://docs.spring.io/spring-security/reference/servlet/oauth2/client/index.html + + +One authentication backend is configured named 'keycloak'. The login page is accessible under '{basepath}/oauth2/authorization/keycloak' + + +***Property: spring.security.oauth2.client.registration.keycloak.client-id*** + + +| Category | Value | +|--- | ---: | +| Default | dataintegration | +| Required | false | +| Valid values | string | +| Environment | SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_CLIENT_ID | + +***Property: spring.security.oauth2.client.registration.keycloak.authorization-grant-type*** + + +| Category | Value | +|--- | ---: | +| Default | authorization_code | +| Required | false | +| Valid values | string | +| Environment | SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_AUTHORIZATION_GRANT_TYPE | + +***Property: spring.security.oauth2.client.registration.keycloak.client-authentication-method*** + + +| Category | Value | +|--- | ---: | +| Default | basic | +| Required | false | +| Valid values | string | +| Environment | SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_CLIENT_AUTHENTICATION_METHOD | + +***Property: spring.security.oauth2.client.registration.keycloak.redirectUri*** + + +| Category | Value | +|--- | ---: | +| Default | {baseUrl}/login/oauth2/code/{registrationId} | +| Required | false | +| Valid values | string | +| Environment | SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_REDIRECTURI | + +***Property: spring.security.oauth2.client.registration.keycloak.scope*** + + +| Category | Value | +|--- | ---: | +| Default | [openid, profile, email] | +| Required | false | +| Valid values | string | +| Environment | SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_SCOPE | + +***Property: spring.security.oauth2.client.registration.keycloak.provider.keycloak.issuer-uri*** + + +| Category | Value | +|--- | ---: | +| Default | http://docker.localhost/auth/realms/cmem | +| Required | false | +| Valid values | string | +| Environment | SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_PROVIDER_KEYCLOAK_ISSUER_URI | + +***Property: spring.security.oauth2.client.registration.keycloak.provider.keycloak.user-name-attribute*** + + +| Category | Value | +|--- | ---: | +| Default | preferred_username | +| Required | false | +| Valid values | string | +| Environment | SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_PROVIDER_KEYCLOAK_USER_NAME_ATTRIBUTE | + diff --git a/docs/deploy-and-configure/configuration/dataplatform/application-stardog-full.md b/docs/deploy-and-configure/configuration/dataplatform/application-stardog-full.md index 91570752..c37eedd2 100644 --- a/docs/deploy-and-configure/configuration/dataplatform/application-stardog-full.md +++ b/docs/deploy-and-configure/configuration/dataplatform/application-stardog-full.md @@ -3,8 +3,8 @@ Configuration example: -This example configures a connection with HTTPS to a remote Stardog store (https://remote:5820). All SPARQL updates have a -timeout configured to 5 minutes. +This example configures a connection with HTTPS to a remote stardog store (https://remote:5820). All SPARQL updates have a +timout of 5 minutes configured. ```yaml store: diff --git a/docs/deploy-and-configure/configuration/keycloak/.pages b/docs/deploy-and-configure/configuration/keycloak/.pages new file mode 100644 index 00000000..fc8fb4e6 --- /dev/null +++ b/docs/deploy-and-configure/configuration/keycloak/.pages @@ -0,0 +1,5 @@ +nav: + - Keycloak: index.md + - Changing Passwords and Keys: change-passwords-and-keys + - Using an external Keycloak: using-external-keycloak + diff --git a/docs/deploy-and-configure/configuration/keycloak/change-passwords-and-keys/index.md b/docs/deploy-and-configure/configuration/keycloak/change-passwords-and-keys/index.md index 444ef3f5..b5b32d95 100644 --- a/docs/deploy-and-configure/configuration/keycloak/change-passwords-and-keys/index.md +++ b/docs/deploy-and-configure/configuration/keycloak/change-passwords-and-keys/index.md @@ -1,10 +1,12 @@ --- tags: + - Configuration - Security + - Keycloak --- -# Change Passwords and Keys +# Changing Passwords and Keys -This page describes how to change passwords and keys for a new deployment (esp. in the context of a [Single Node Cloud Installation](./../../../installation/scenario-single-node-cloud-installation/index.md)) +This page describes how to change passwords and keys for a new deployment (esp. in the context of a [Single Node Cloud Installation](./../../../installation/scenario-single-node-cloud-installation/index.md)). Assuming your instance runs at `https://cmem.example.com/` in a default installation Keycloak is deployed at `https://cmem.example.com/auth` (this may vary depending on your setup). diff --git a/docs/deploy-and-configure/configuration/keycloak/cmem-service-account.json b/docs/deploy-and-configure/configuration/keycloak/cmem-service-account.json new file mode 100644 index 00000000..e4d1f5dc --- /dev/null +++ b/docs/deploy-and-configure/configuration/keycloak/cmem-service-account.json @@ -0,0 +1,129 @@ +{ + "clientId": "cmem-service-account", + "name": "CMEM service account", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "Please-Fill-This-Secret", + "redirectUris": [ + "*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": false, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": true, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "saml.assertion.signature": "false", + "saml.force.post.binding": "false", + "saml.multivalued.roles": "false", + "saml.encrypt": "false", + "post.logout.redirect.uris": "+", + "saml.server.signature": "false", + "saml.server.signature.keyinfo.ext": "false", + "exclude.session.state.from.auth.response": "false", + "saml_force_name_id_format": "false", + "saml.client.signature": "false", + "tls.client.certificate.bound.access.tokens": "false", + "saml.authnstatement": "false", + "display.on.consent.screen": "false", + "saml.onetimeuse.condition": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "protocolMappers": [ + { + "name": "DataPlatform audience", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-mapper", + "consentRequired": false, + "config": { + "id.token.claim": "false", + "access.token.claim": "true", + "included.custom.audience": "dataplatform" + } + }, + { + "name": "Client ID", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientId", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientId", + "jsonType.label": "String" + } + }, + { + "name": "Client Host", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientHost", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientHost", + "jsonType.label": "String" + } + }, + { + "name": "roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-client-role-mapper", + "consentRequired": false, + "config": { + "multivalued": "true", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "groups", + "jsonType.label": "String", + "usermodel.clientRoleMapping.clientId": "cmem-service-account" + } + }, + { + "name": "Client IP Address", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientAddress", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientAddress", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ], + "access": { + "view": true, + "configure": true, + "manage": true + } +} \ No newline at end of file diff --git a/docs/deploy-and-configure/configuration/keycloak/cmem.json b/docs/deploy-and-configure/configuration/keycloak/cmem.json new file mode 100644 index 00000000..b2a3e8a3 --- /dev/null +++ b/docs/deploy-and-configure/configuration/keycloak/cmem.json @@ -0,0 +1,76 @@ +{ + "clientId": "cmem", + "name": "Corporate Memory", + "description": "A general client allowing login from DM DP DI", + "rootUrl": "", + "adminUrl": "", + "baseUrl": "", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+", + "oauth2.device.authorization.grant.enabled": "false", + "backchannel.logout.revoke.offline.tokens": "false", + "use.refresh.tokens": "true", + "tls-client-certificate-bound-access-tokens": "false", + "oidc.ciba.grant.enabled": "false", + "backchannel.logout.session.required": "true", + "client_credentials.use_refresh_token": "false", + "acr.loa.map": "{}", + "require.pushed.authorization.requests": "false", + "display.on.consent.screen": "false", + "token.response.type.bearer.lower-case": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "protocolMappers": [ + { + "name": "groups", + "protocol": "openid-connect", + "protocolMapper": "oidc-group-membership-mapper", + "consentRequired": false, + "config": { + "full.path": "false", + "id.token.claim": "false", + "access.token.claim": "true", + "claim.name": "groups", + "userinfo.token.claim": "true" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "acr", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ], + "access": { + "view": true, + "configure": true, + "manage": true + } +} \ No newline at end of file diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_1.png b/docs/deploy-and-configure/configuration/keycloak/createClient_1.png new file mode 100644 index 00000000..9d884fa3 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_1.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_10.png b/docs/deploy-and-configure/configuration/keycloak/createClient_10.png new file mode 100644 index 00000000..618f86f1 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_10.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_10_1.png b/docs/deploy-and-configure/configuration/keycloak/createClient_10_1.png new file mode 100644 index 00000000..8cd595d7 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_10_1.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_10_2.png b/docs/deploy-and-configure/configuration/keycloak/createClient_10_2.png new file mode 100644 index 00000000..66cce740 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_10_2.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_11.png b/docs/deploy-and-configure/configuration/keycloak/createClient_11.png new file mode 100644 index 00000000..684afda2 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_11.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_12.png b/docs/deploy-and-configure/configuration/keycloak/createClient_12.png new file mode 100644 index 00000000..21346377 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_12.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_13.png b/docs/deploy-and-configure/configuration/keycloak/createClient_13.png new file mode 100644 index 00000000..958f2224 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_13.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_13_1.png b/docs/deploy-and-configure/configuration/keycloak/createClient_13_1.png new file mode 100644 index 00000000..07fca9dc Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_13_1.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_14.png b/docs/deploy-and-configure/configuration/keycloak/createClient_14.png new file mode 100644 index 00000000..3849525e Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_14.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_15.png b/docs/deploy-and-configure/configuration/keycloak/createClient_15.png new file mode 100644 index 00000000..03ff9b7f Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_15.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_16.png b/docs/deploy-and-configure/configuration/keycloak/createClient_16.png new file mode 100644 index 00000000..c22b253b Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_16.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_16_1.png b/docs/deploy-and-configure/configuration/keycloak/createClient_16_1.png new file mode 100644 index 00000000..d5ad101c Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_16_1.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_16_2.png b/docs/deploy-and-configure/configuration/keycloak/createClient_16_2.png new file mode 100644 index 00000000..4c5ddc00 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_16_2.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_17.png b/docs/deploy-and-configure/configuration/keycloak/createClient_17.png new file mode 100644 index 00000000..7b35c4e5 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_17.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_2.png b/docs/deploy-and-configure/configuration/keycloak/createClient_2.png new file mode 100644 index 00000000..73dceacf Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_2.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_3.png b/docs/deploy-and-configure/configuration/keycloak/createClient_3.png new file mode 100644 index 00000000..1b8c115e Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_3.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_4.png b/docs/deploy-and-configure/configuration/keycloak/createClient_4.png new file mode 100644 index 00000000..68273161 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_4.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_5.png b/docs/deploy-and-configure/configuration/keycloak/createClient_5.png new file mode 100644 index 00000000..30d446c1 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_5.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_6.png b/docs/deploy-and-configure/configuration/keycloak/createClient_6.png new file mode 100644 index 00000000..8fc9adb8 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_6.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_7.png b/docs/deploy-and-configure/configuration/keycloak/createClient_7.png new file mode 100644 index 00000000..ecfb3659 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_7.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_7_1.png b/docs/deploy-and-configure/configuration/keycloak/createClient_7_1.png new file mode 100644 index 00000000..a50976c7 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_7_1.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_7_2.png b/docs/deploy-and-configure/configuration/keycloak/createClient_7_2.png new file mode 100644 index 00000000..7fbd7df6 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_7_2.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_7_3.png b/docs/deploy-and-configure/configuration/keycloak/createClient_7_3.png new file mode 100644 index 00000000..77fca31e Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_7_3.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_7_4.png b/docs/deploy-and-configure/configuration/keycloak/createClient_7_4.png new file mode 100644 index 00000000..4ede9064 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_7_4.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_8.png b/docs/deploy-and-configure/configuration/keycloak/createClient_8.png new file mode 100644 index 00000000..a028e0e6 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_8.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/createClient_9.png b/docs/deploy-and-configure/configuration/keycloak/createClient_9.png new file mode 100644 index 00000000..3526389f Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/createClient_9.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/import-client-cmem.png b/docs/deploy-and-configure/configuration/keycloak/import-client-cmem.png new file mode 100644 index 00000000..b71205e4 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/import-client-cmem.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/index.md b/docs/deploy-and-configure/configuration/keycloak/index.md index 8c315a36..1073105e 100644 --- a/docs/deploy-and-configure/configuration/keycloak/index.md +++ b/docs/deploy-and-configure/configuration/keycloak/index.md @@ -2,91 +2,252 @@ tags: - Configuration - Security + - Keycloak --- # Keycloak ## Introduction -This page documents important steps in order to configure Keycloak as an authentication backend for Corporate Memory. +This page describes important steps in order to configure Keycloak as an authentication backend for Corporate Memory. +The screenshots displayed in this documentation were taken from Keycloak v20 using the `keycloak.v2` theme. + !!! info - You do not need these instruction in case you followed the documentation on [Scenario: Local Installation](./../../installation/scenario-local-installation/index.md) or [Scenario: Single Node Cloud Installation](./../../installation/scenario-single-node-cloud-installation/index.md) (in this case, everything was done automatically). However, in case you need to integrate Corporate Memory with an existing Keycloak, this page may help you. Please also have the [Keycloak - Server Administration Guide](https://www.keycloak.org/docs/latest/server_admin/) ready :smile: + + You do not need these instruction in case you followed the documentation on [Scenario: Local Installation](./../../installation/scenario-local-installation/index.md) or [Scenario: Single Node Cloud Installation](./../../installation/scenario-single-node-cloud-installation/index.md) (in this case, everything was done automatically). + However, in case you need to integrate Corporate Memory with an existing Keycloak, this page may help you. + Please also have the [Keycloak - Server Administration Guide](https://www.keycloak.org/docs/latest/server_admin/) ready :smile: ## Realm configuration -In order to separate all configuration +!!! warning + + A realm can be im-/exported. + However, exported realms will not contain user credentials. -- Add new realm `cmem` +To create a realm, use the drop down menu for choosing a realm on the left side. + + - Create a realm `cmem` + - Select **Realm settings** + - **General** tab: + - Change HTML Display name to `Corporate Memory` + - **Themes** tab - Switch realm's login theme to `eccenca` - - Change Display name to `CMEM` - - Change HTML Display name to `Corporate Memory` + - Switch realm's account theme to `eccenca` ## Client configuration -- Add a client called `cmem-oauth2-client` - - - This client is intended for usage by DataManager and DataIntegration (user login) - - Configure this client ID under `oauth.clientId` in DataIntegration's configuration file - - Configure this client ID under `js.config.workspaces.default.authorization.oauth2.clientId` in DataManager's configuration file - - Enable `Standard Flow Enabled` (enables OAuth 2.0 Authorization Code Flow) - - Enable `Implicit Flow Enabled` - - Add the adequate URL pattern (wildcard `http://example.org/*` works) to `Valid Redirect URIs` (`*` for testing purposes is acceptable) - - Save - - Go to `Mappers` - - Click `Create` - - Name `groups` - - Mapper Type `Group Membership` - - Token Claim Name `groups` - - Disable `Full group path` - - Disable `Add to ID token` - - Enable `Add to access token` - - (Only for DP < 19.10.1) Click `Create` - - Name `DataPlatform audience` - - Mapper Type `Audience` - - Included Client Audience --> "Select One" (do not touch it) - - Included Custom Audience `dataplatform` - - Disable `Add to ID token` - - Enable `Add to access token` - -- Add client called `cmem-service-account` - - - This client is intended for internal use by DataIntegration (scheduler super-user) and data import purposes ([cmemc](https://documentation.eccenca.com/latest/automate/cmemc-command-line-interface)) - - Set the `Access Type` to `confidential` - - Go to `Settings` and enable `Service Accounts Enabled` (enables OAuth 2.0 Client Credentials Flow) - - Save - - Go to `Credentials` and configure `Client Id and Secret` - - If DataIntegration schedulers are required, configure this client id and secret under the properties`workbench.superuser.client` and `workbench.superuser.clientSecret` in DataIntegration's configuration file - - For the importer add the client secret to `docker-compose.importer.yml` - - Go to `Roles` and add the `elds-admins` role - - Go to `Service Account Roles -> Client Roles (cmem-service-account)` and add the `elds-admins` role to `Assigned Roles` - - Go to `Mappers` - - Click `Create` - - Name `roles` - - Mapper Type `User Client Role` - - Client ID `cmem-service-account` - - Token Claim Name `groups` - - Enable `Add to access token` - - (Only for DP < 19.10.1) Click `Create` - - Name `DataPlatform audience` - - Mapper Type `Audience` - - Included Client Audience --> "Select One" (do not touch it) - - Included Custom Audience `dataplatform` - - Disable `Add to ID token` - - Enable `Add to access token` - -## Groups configuration - -- Go to `Groups` - - Add the following groups: - - `elds-admins` - - Any groups provided by your user management system (e.g. LDAP) that must be recognized/mapped by Keycloak - - In CHO, `local-users`, `local-admins` - -## Users configuration +Clients are used to link users and groups managed in Keycloak to Corporate Memory. +There are two different clients used by Corporate Memory: + +- The first client is used to authenticate a user for using the web interface (usually named `cmem`). +- The other client is used as a technical user with the command line interface (typically named `cmem-service-account`). + Depending on the environment, there might be other use cases, when running background schedules, then a third client, also as technical user, might be useful. + + +### Access conditions, roles and groups + +Corporate Memory uses access conditions which are related to users or groups. +This is described at [Access Conditions](./../access-conditions/index.md). +To use groups from Keycloak in Corporate Memory access conditions, all Keycloak client configurations need to have attached mappers: + +- For the web interface client (`cmem`), the user groups need to get attached to the client. + This is done by a **Group Membership** mapper (described below). + With this mapper each group of a user is assigned for the authentication process, so Corporate Memory is aware of the user and group IDs for setting up access conditions. + +- For the technical account clients (such as `cmem-service-account`), Keycloak does not allow to add groups directly to a client. + To work around this limitation, we are using **ROLES** instead. + By creating a mapper to re-define roles from groups, we allow Corporate Memory to read roles as groups attached to the client token. + +In the default setup in helm or docker-compose deployments, we often refer to the `elds-admins` group, acting as a super-admin / root group. +Every user in this group has all possible rights in Corporate Memory, no matter which access conditions are available. +This is configured in the DataPlatform configuration or as an environment variable `AUTHORIZATION_ABOX_ADMINGROUP=elds-admins` (see also [Dataplatform configuration authorization](./../dataplatform/application-full/#authorization)). + + +### Option 1: Import the needed clients from a JSON export + +To import a pre-configured `cmem` client for using the web interface, follow these steps: + +!!! quote inline end "" + + ![Dialog import cmem client](import-client-cmem.png) + +- Login to Keycloak and select the Corporate Memory realm (`cmem`). +- Download the [client configuration for using the web interface](cmem.json) (`cmem.json`). +- Select **Clients**, then **Import client**. +- **Browse** for the downloaded `cmem.json` and select it. +- **Save** new client. + +To import a pre-configured `cmem-service-account` client, repeat the process with the [client configuration with credentials for the technical account (`cmem-service-account`)](cmem-service-account.json) (`cmem-service-account.json`). + + +### Option 2: Create client configurations manually + +#### Add the `cmem` client for using the web interface + +This client is intended for the usage with DataManager, DataPlatform and DataIntegration (user login): + +![Dialog create cmem client](createClient_1.png){ class="bordered" } + + - **Client type**: OpenID Connect + - **Client ID**: i.e. `cmem`, you need to remember this and use this later + - **Name** and **Description**: fill as you like + - Select **Next** + - **Client authentication**: Off + - **Authorization**: Off + - Enable **Standard Flow Enabled** (enables OAuth 2.0 Authorization Code Flow) + - Before v23.1: + - Additionally enable **Implicit Flow Enabled** + - **Save** + +![Dialog create cmem client](createClient_2.png){ class="bordered" } + +The dialog above closes and you land on the configuration page of this client: + + - **Valid redirect URIs**: Add the correct URL pattern (e.g., wildcard `https://cmem.example.net/*` works) to `Valid Redirect URIs` (`*` for testing purposes can be used as well) and **Save** + - Switch the Tabs to **Client scopes** and click on the first scope (i.e.: `cmem-dedicated`) + +![Dialog select cmem-service-account-dedicated](createClient_11.png){ class="bordered" } +![Dialog create mapper](createClient_4.png){ class="bordered" } +![Dialog create mapper](createClient_5.png){ class="bordered" } + + - Click **Configure a new mapper** + - Select Mapper Type **Group Membership** + - **Name** `groups` + - **Token Claim Name** `groups` + - Disable **Full group path** + - Disable **Add to ID token** + - Enable **Add to access token** + - Enable **Add to user info** + - **Save** + +![Dialog create mapper](createClient_6.png){ class="bordered" } + + - In Corporate Memory configuration until v22.2: + - Configure this client ID under `js.config.workspaces.default.authorization.oauth2.clientId` in DataManager's configuration file (Datamanager needs implicit flow) + - Configure this client ID under `oauth.clientId = "cmem"` in DataManager's configuration file (Dataintegration needs standard flow) + - In Corporate Memory configuration from v23.1: + - Configure this client ID in the environments with the name `OAUTH_CLIENT_ID` in `/environments/config.env` (defaults to `cmem` if not set) + + +#### Add the `cmem-service-account` client + +This client is intended for internal use by DataIntegration (scheduler super-user) and data import purposes ([cmemc](https://documentation.eccenca.com/latest/automate/cmemc-command-line-interface)). + +This descriptions can also be used to create clients with different permissions than admins. +For this, just create a different role name later, and create an access condition with this groups name in Corporate Memory as it is described in [Access Conditions](./../access-conditions/index.md). + +![Dialog create role](createClient_7_1.png){ class="bordered" } +![Dialog create role](createClient_7_2.png){ class="bordered" } +![Dialog create role](createClient_7_3.png){ class="bordered" } + + - **Client type**: OpenID Connect + - **Client ID**: i.e. `cmem-service-account`, you need to remember this and use this later + - **Name** and **Description**: fill as you like + - click **Next** + - **Client authentication**: On + - **Authorization**: Off + - **Authentication flow**: only enable `Service accounts roles`, the rest can be disabled + - **Save** + + - Go to **Credentials** and configure **Client Id and Secret**, copy the client secret for later usage + +![Dialog create role](createClient_7_4.png){ class="bordered" } + + - Go to **Roles** and click **Create role** to create the `elds-admins` role + +![Dialog create role](createClient_7.png){ class="bordered" } +![Dialog create role](createClient_8.png){ class="bordered" } + + - Click **Action** and select **Add associated roles** + +![Dialog create role](createClient_9.png){ class="bordered" } + + - Select **Filter by client** from the filter pull-down-menu + +![Dialog create role](createClient_10.png){ class="bordered" } + + - In this dialog select the client by name which you are currently configuring (here `cmem-service-account`) and then **Assign** + +![Dialog create role](createClient_10_1.png){ class="bordered" } + + - Go back to **Client details** e.g., by using the top navigation + - In the **Roles** tab you now see your created role here + +![Dialog create role](createClient_10_2.png){ class="bordered" } + + - Switch the Tabs to **Client scopes** and click on the first scope (i.e.: `cmem-service-account-dedicated`) + +![Dialog create mapper](createClient_11.png){ class="bordered" } + + - select **Add mapper** -> **By configuration** + +![Dialog create mapper](createClient_13_1.png){ class="bordered" } + + - select Mapper Type `User Client Role` + - **Name** `roles` + - **Client ID** select the client you are currently configuring from the pull-down-menu (here `cmem-service-account`) + - Enable **Multivalued** + - **Token Claim Name** `groups` + - Enable **Add to ID token** + - Enable **Add to access token** + - Enable **Add to user info** + - **Save** + +![Dialog create mapper](createClient_13.png){ class="bordered" } + +![Dialog create mapper](createClient_14.png){ class="bordered" } + + - After **Save** go back to **Client details** + - Go to tab **Service account roles** tab + - Select the link in the center **To manage detail and group mappings, click on the username service-account-YOUR_CLIENT_ID** + +![Dialog add role to client](createClient_15.png){ class="bordered" } + + - Go to tab **Role mapping** and select **Assign role** + +![Dialog add role to client](createClient_16.png){ class="bordered" } + + - Change the filter to **Filter by clients** and select the new Client ID, i.e `cmem-service-account` + - Click **Assign** + +![Dialog add role to client](createClient_16_2.png){ class="bordered" } +![Dialog add role to client](createClient_16_1.png){ class="bordered" } +![Dialog add role to client](createClient_17.png){ class="bordered" } + + +## Corporate Memory configuration after setting up clients + + - If **DataIntegration** schedulers are required, configure this client id and secret under the properties `workbench.superuser.client` and `workbench.superuser.clientSecret` in DataIntegration's configuration file or + - in docker-compose-orchestration you can edit this in the environment as: + ``` bash + CMEM_SERVICE_ACCOUNT_CLIENT_ID=cmem-service-account + CMEM_SERVICE_ACCOUNT_CLIENT_SECRET=YourSecret + DATAINTEGRATION_CMEM_SERVICE_CLIENT=cmem-service-account + DATAINTEGRATION_CMEM_SERVICE_CLIENT_SECRET=YourSecret + ``` + - in helm this value is defined by: + ``` yaml + DATAINTEGRATION_CMEM_SERVICE_CLIENT_SECRET: {{ .Values.global.cmemClientSecret }} + DATAINTEGRATION_CMEM_SERVICE_CLIENT: {{ .Values.global.cmemClientId }} + ``` + - For **cmemc** you can configure this with `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET`. + +### Groups configuration + +- Go to **Groups** and add the following groups: + - These groups are used only to assign them to user accounts (clients have roles-to-group mappers). + - `elds-admins` + - Any groups provided by your user management system (e.g. LDAP) that must be recognized/mapped by Keycloak + - In Corporate Memory docker orchestration, `local-users`, `local-admins` + +### Users configuration - This applies to the [Docker Orchestration](./../docker-orchestration/index.md), for other setups consult the [Keycloak manual](https://www.keycloak.org/docs/latest/server_admin/). - Go to `Users` - Add the following users and assign their groups respectively (for each user go to credentials, add password and disable `Temporary`) - - `user:user` - - groups: `local-users` and `group_user_a` (legacy group) - - `admin:admin` + - `user:user` + - groups: `local-users` + - `admin:admin` + - groups: `local-admin` + diff --git a/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/CSP-settings.png b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/CSP-settings.png new file mode 100644 index 00000000..b4e10769 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/CSP-settings.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/client-redirect-uri.png b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/client-redirect-uri.png new file mode 100644 index 00000000..c3507a70 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/client-redirect-uri.png differ diff --git a/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/index.md b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/index.md new file mode 100644 index 00000000..22cbc6f5 --- /dev/null +++ b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/index.md @@ -0,0 +1,111 @@ +--- +tags: + - Configuration + - Security + - Keycloak +--- +# Configure Corporate Memory with an external Keycloak + +## Introduction + +Maybe you already operate a central Keycloak deployment in your infrastructure or you want to deploy multiple stages of Corporate Memory with a single Keycloak. +Very often this results a Keycloak which is deployed in a different domain than your Corporate Memory, i.e. `cmem.example.com` and `keycloak.example.com`. +For this scenario, this page give some hints. + +## Configuration in Keycloak + +When using a Keycloak in a different domain, you have to allow this domain in the Keycloak settings: + +- In **Realm Settings**, go to **Security defenses** tab + - `X-Frame-Options` need to be cleared + - The `Content-Security-Policy` header needs to be defined for allowing the framing of the login mask of Keycloak for the deployment `frame-src ;` +- In **Clients** go to i.e. `cmem` client + - add `https://cmem.example.com/*` to Valid redirect URIs + +![CSP-settings](CSP-settings.png){ class="bordered" } + +![Client redirect URI](client-redirect-uri.png){ class="bordered" } + +## Configuration in Corporate Memory + +### Environments + +When running the Corporate Memory docker orchestration, you can configure the Keycloak through editing `environments/config.env`. +Then just add the variables below. +You can get those from the `.well-known` url from your instance, e.g. `https://keycloak.example.com/auth/realms/cmem/.well-known/openid-configuration`: + +``` bash +OAUTH_AUTHORIZATION_URL=${EXTERNAL_BASE_URL}/auth/realms/cmem/protocol/openid-connect/auth +OAUTH_TOKEN_URL=${EXTERNAL_BASE_URL}/auth/realms/cmem/protocol/openid-connect/token +OAUTH_JWK_SET_URL=${EXTERNAL_BASE_URL}/auth/realms/cmem/protocol/openid-connect/certs +OAUTH_USERINFO_URL=${EXTERNAL_BASE_URL}/auth/realms/cmem/protocol/openid-connect/userinfo +OAUTH_LOGOUT_REDIRECT_URL=${EXTERNAL_BASE_URL}/auth/realms/cmem/protocol/openid-connect/logout?redirect_uri=${EXTERNAL_BASE_URL} +OAUTH_CLIENT_ID=cmem +``` + +![well-known configuration](well-known-config.png){ class="bordered" } + +### Dataintegration (optional) + +By default, Dataintegration is configured through environments. +However you can also edit this in Dataintegration's config file `dataintegration.conf`: + +``` bash +oauth.clientId = ${OAUTH_CLIENT_ID} +oauth.authorizationUrl = ${OAUTH_AUTHORIZATION_URL} +oauth.tokenUrl = ${OAUTH_TOKEN_URL} +oauth.logoutRedirectUrl = ${OAUTH_LOGOUT_REDIRECT_URL} +``` + +### Dataplatform (optional) + +By default, Dataplatform is configured through environments. +However you can also edit this in Dataplatform's config file `application.yml`: + +``` yaml +spring.security.oauth2: + resourceserver: + anonymous: "${DATAPLATFORM_ANONYMOUS}" + jwt: + jwk-set-uri: "${OAUTH_JWK_SET_URL}" + client: + registration: + keycloak: + client-id: "${OAUTH_CLIENT_ID}" + authorization-grant-type: "authorization_code" + client-authentication-method: "basic" + redirectUri: "${DEPLOY_BASE_URL: 'http://localhost' }/dataplatform/login/oauth2/code/{registrationId}" + scope: # openid is mandatory as spring somehow does not add it to the userinfo request + - openid + - profile + - email + provider: + keycloak: + jwk-set-uri: "${OAUTH_JWK_SET_URL}" + authorization-uri: "${OAUTH_AUTHORIZATION_URL}" + token-uri: "${OAUTH_TOKEN_URL}" + user-info-uri: "${OAUTH_USERINFO_URL}" + user-name-attribute: "preferred_username" +``` + +### cmemc + +In cmemc you also need to change the Keycloak cmemc tries to authenticate before connecting to Corporate Memory. +You have to add this: + +``` ini +KEYCLOAK_BASE_URI=https://keycloak.example.com/ +KEYCLOAK_REALM_ID=cmem +``` + +### Helm charts (optional) + +In the helm charts, we assumed you deploy Keycloak by official charts, either via operator, or via helm charts. +In either way you can configure the base realm path in the value section. + +``` yaml + # This is the base Keycloak realm url, e.g. https://cmem.example.com/auth/realms/cmem + .Values.global.keycloakIssuerUrl: https://keycloak.example.com/auth/realms/cmem + .Values.global.oauthClientId: cmem +``` + diff --git a/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/well-known-config.png b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/well-known-config.png new file mode 100644 index 00000000..4666b930 Binary files /dev/null and b/docs/deploy-and-configure/configuration/keycloak/using-external-keycloak/well-known-config.png differ diff --git a/docs/deploy-and-configure/configuration/production-ready-settings/22-1-changing-keycloak-cookie-settings.png b/docs/deploy-and-configure/configuration/production-ready-settings/22-1-changing-keycloak-cookie-settings.png deleted file mode 100644 index 22f7ffd5..00000000 Binary files a/docs/deploy-and-configure/configuration/production-ready-settings/22-1-changing-keycloak-cookie-settings.png and /dev/null differ diff --git a/docs/deploy-and-configure/configuration/production-ready-settings/22-1-keycloak-client-settings.png b/docs/deploy-and-configure/configuration/production-ready-settings/22-1-keycloak-client-settings.png deleted file mode 100644 index 54d6795e..00000000 Binary files a/docs/deploy-and-configure/configuration/production-ready-settings/22-1-keycloak-client-settings.png and /dev/null differ diff --git a/docs/deploy-and-configure/configuration/production-ready-settings/23-1-keycloak-client-settings.png b/docs/deploy-and-configure/configuration/production-ready-settings/23-1-keycloak-client-settings.png new file mode 100644 index 00000000..a27382d7 Binary files /dev/null and b/docs/deploy-and-configure/configuration/production-ready-settings/23-1-keycloak-client-settings.png differ diff --git a/docs/deploy-and-configure/configuration/production-ready-settings/23-1-keycloak-realm-settings.png b/docs/deploy-and-configure/configuration/production-ready-settings/23-1-keycloak-realm-settings.png new file mode 100644 index 00000000..06f27493 Binary files /dev/null and b/docs/deploy-and-configure/configuration/production-ready-settings/23-1-keycloak-realm-settings.png differ diff --git a/docs/deploy-and-configure/configuration/production-ready-settings/index.md b/docs/deploy-and-configure/configuration/production-ready-settings/index.md index 51d699d0..947bb666 100644 --- a/docs/deploy-and-configure/configuration/production-ready-settings/index.md +++ b/docs/deploy-and-configure/configuration/production-ready-settings/index.md @@ -5,7 +5,7 @@ tags: --- # Production-Ready Settings -If you plan to deploy Corporate Memory in a publically accessible environment you need to take care about some final configuration steps. +If you plan to deploy Corporate Memory in a non-trusted environment, you need to take care about some final configuration steps. ## Restrict Redirect URLs @@ -13,15 +13,11 @@ As stated in the [Keycloak Server Administration Guide](https://www.keycloak.org > Make your registered redirect URIs as specific as possible. Registering vague redirect URIs for Authorization Code Flows may allow malicious clients to impersonate another client with broader access. -Corporate Memory uses the following clients to authenticate against keycloak. -For each client, you have to adjust the **Valid Redirect URIs** field. +Corporate Memory uses the `cmem` client to authenticate against Keycloak, so adjust the **Valid Redirect URIs** field for this client. -- datamanager -- dataintegration +Select`cmem` realm, then **Clients** → `cmem` and enter your deploy URL, e.g., `https://cmem.example.net/*`. -Go to `Cmem-Realm` → `Clients` → `datamanger / dataintegration` and enter your deploy URL, e.g., `https://cmem.example.net/*`. - -![changing-keycloak-client-settings](22-1-keycloak-client-settings.png) +![Keycloak: Client Settings: Valid Redirect URLs](23-1-keycloak-client-settings.png) ## Password Policies @@ -30,21 +26,48 @@ To enforce this, setting up [password policies](https://www.keycloak.org/docs/la ## Cookie Settings -In Keycloak you should enforce the secure flag for keycloak cookies. -Go to `Cmem-Realm` → `Realm Settings` → `Login` and change **Require SSL** to `all requests`. -If you are running without SSL, you will no longer be able to log in to Corporate Memory. +### Keycloak + +In Keycloak you should enforce the secure flag for Keycloak cookies. +Select `cmem` realm, then **Realm settings** → **General** and change **Require SSL** to `All requests`. +If you are running Corporate Memory without SSL for testing, you will no longer be able to login after this step. Once this is done, make sure DataPlatform and DataIntegration use `HTTPS` to connect to Keycloak. See the usage of `DATAPLATFORM_AUTH_URL`, `OAUTH_AUTHORIZATION_URL` and `OAUTH_TOKEN_URL`. -![changing-keycloak-cookie-settings](22-1-changing-keycloak-cookie-settings.png) +![Keycloak: Client Settings](23-1-keycloak-realm-settings.png) + +### DataPlatform + +For DataPlatform you can uncomment these cookie setting in `application.yml`. + +```yaml +## This is important to set flags for DP session cookies +server.servlet.session.cookie.same-site: Strict + +# If this is enabled it only allows usage of cookies if TLS connection are available +server.servlet.session.cookie.secure: true +``` + +### DataIntegration + +Similar to DataPlatform, you can also set cookie settings for DataIntegration inside `productions.conf` for docker-compose deployments or in `dataintegration.conf` in helm deployments + +```yaml +# sets "secure" flag in PLAY_SESSION cookie +# https://www.playframework.com/documentation/2.8.x/SettingsSession +play.http.session.secure = ${DATAINTEGRATION_SECURE_COOKIE} +``` + +In the [Play documentation](https://www.playframework.com/documentation/2.8.x/SettingsSession), you can find further information, i.e. also setting `sameSite = "lax"`or `strict`. By default DataIntegration sets this to `lax` + ## CORS Settings ### DataPlatform DataPlatform uses `http.cors.allowedOrigins *` as the default setting. -It is recommended to correctly set the values for the following headers: +It is recommended to set custom values for the following headers: - `Access-Control-Allow-Origin`:  specifies which domains can access a site's resources. For example, if ABC Corp. has domains `ABC.com` and `XYZ.com`, then its developers can use this header to securely grant `XYZ.com` access to ABC.com's resources. - `Access-Control-Allow-Methods`: specifies which HTTP request methods (`GET`, `PUT`, `DELETE`, etc.) can be used to access resources. This header lets developers further enhance security by specifying what methods are valid when XYZ accesses ABC's resources. @@ -72,7 +95,7 @@ http: ### DataIntegration DataIntegration uses `cors.config.allowOrigins *` as the default setting.  -It is recommended to correctly set the value for the `Access-Control-Allow-Origin` header. +It is recommended to set custom values for the `Access-Control-Allow-Origin` header. It specifies which domains can access a site's resources. For example, if ABC Corp. has the domains `ABC.com` and `XYZ.com`, you can use this header to securely grant `XYZ.com` access to `ABC.com`'s resources. Detailed configuration options can be found [here](./../dataintegration/index.md). diff --git a/docs/deploy-and-configure/installation/22-1-cmem-login-page.png b/docs/deploy-and-configure/installation/22-1-cmem-login-page.png deleted file mode 100644 index c258d011..00000000 Binary files a/docs/deploy-and-configure/installation/22-1-cmem-login-page.png and /dev/null differ diff --git a/docs/deploy-and-configure/installation/22-1-successful-login.png b/docs/deploy-and-configure/installation/22-1-successful-login.png deleted file mode 100644 index c09a5b1a..00000000 Binary files a/docs/deploy-and-configure/installation/22-1-successful-login.png and /dev/null differ diff --git a/docs/deploy-and-configure/installation/scenario-local-installation/index.md b/docs/deploy-and-configure/installation/scenario-local-installation/index.md index e7cdb028..01effd92 100644 --- a/docs/deploy-and-configure/installation/scenario-local-installation/index.md +++ b/docs/deploy-and-configure/installation/scenario-local-installation/index.md @@ -9,10 +9,10 @@ The code examples in this section assumes that you have POSIX-compliant shell (l ## Requirements -- Access credentials to eccenca Artifactory and eccenca Docker Registry → [contact us to get yours](https://eccenca.com/en/contact) -- [docker](https://www.docker.com/) and [docker-compose](https://docs.docker.com/compose/install/) (v1) installed locally -- [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) installed locally -- At least 4 CPUs and 12GB of RAM (recommended: 16GB) dedicated to docker +- Access credentials to eccenca Artifactory and eccenca Docker Registry → [contact us to get yours](https://eccenca.com/en/contact) +- [docker](https://www.docker.com/) and [docker-compose](https://docs.docker.com/compose/install/) (v1) installed locally +- [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) installed locally +- At least 4 CPUs and 12GB of RAM (recommended: 16GB) dedicated to docker ## Setup & Check Installation Environment @@ -153,16 +153,8 @@ Run make logs to see log output Open your browser and navigate to  -![cmem-login-page](../22-1-cmem-login-page.png) - -Click CONTINUE WITH LOGIN and use one of these default accounts: - | account | password | description | | ------- | -------- | ------------------------------------------------------------------------------------------- | | `admin` | `admin` | Is member of the global admin group (can see and do anything) | -| `user` | `user` | Is member of the local user group (can not change access conditions or see internal graphs) | - -![successful-login](../22-1-successful-login.png) After successful login, you will see Corporate Memory interface. You can now proceed to the :arrow_right:[Getting Started](../../../getting-started/index.md) section. - diff --git a/docs/deploy-and-configure/installation/scenario-redhat-enterprise-linux-7/index.md b/docs/deploy-and-configure/installation/scenario-redhat-enterprise-linux-7/index.md index 8fc18e10..cf9ec38c 100644 --- a/docs/deploy-and-configure/installation/scenario-redhat-enterprise-linux-7/index.md +++ b/docs/deploy-and-configure/installation/scenario-redhat-enterprise-linux-7/index.md @@ -9,9 +9,9 @@ This page describes a docker-compose based orchestration running on RedHat Enter ## Requirements -- [Virtualbox](https://www.oracle.com/virtualization/technologies/vm/downloads/virtualbox-downloads.html) and [vagrant](https://www.vagrantup.com/downloads.html) installed locally -- Terminal with ssh client installed locally -- POSIX-compatible command line interface (Linux, macOS or WSL for Windows) +- [Virtualbox](https://www.oracle.com/virtualization/technologies/vm/downloads/virtualbox-downloads.html) and [vagrant](https://www.vagrantup.com/downloads.html) installed locally +- Terminal with ssh client installed locally +- POSIX-compatible command line interface (Linux, macOS or WSL for Windows) ## Provisioning @@ -253,15 +253,8 @@ echo "10.10.10.10 corporate.memory" >> /etc/hosts Open your browser and navigate to [https://corporate.memory] -![cmem-login-page](../22-1-cmem-login-page.png) - -Click CONTINUE WITH LOGIN and use one of these default accounts: - | account | password | description | | ------- | -------- | ------------------------------------------------------------------------------------------- | | `admin` | `admin` | Is member of the global admin group (can see and do anything) | -| `user` | `user` | Is member of the local user group (can not change access conditions or see internal graphs) | - -![successful-login](../22-1-successful-login.png) After successful login, you will see Corporate Memory interface. You can now proceed to the :arrow_right:[Getting Started](../../../getting-started/index.md) section. diff --git a/docs/deploy-and-configure/installation/scenario-single-node-cloud-installation/index.md b/docs/deploy-and-configure/installation/scenario-single-node-cloud-installation/index.md index d7ac5cca..c50b5059 100644 --- a/docs/deploy-and-configure/installation/scenario-single-node-cloud-installation/index.md +++ b/docs/deploy-and-configure/installation/scenario-single-node-cloud-installation/index.md @@ -9,10 +9,10 @@ This page describes a docker-compose based orchestration running on a server ins ## Requirements -- ssh access to a server instance (Debian 11) with a public IP address -- A resolvable domain name to this server -- Terminal with ssh client installed locally -- An eccenca partner account for the docker registry as well as the release artifact area +- ssh access to a server instance (Debian 11) with a public IP address +- A resolvable domain name to this server +- Terminal with ssh client installed locally +- An eccenca partner account for the docker registry as well as the release artifact area ## Server Provisioning @@ -89,10 +89,10 @@ $ vi prod.env In addition that, you need to remove the default config and link it to your prod.env ```shell-session -$ cd /opt/cmem-orchestration/environments +cd /opt/cmem-orchestration/environments -$ rm config.env -$ ln -s prod.env config.env +rm config.env +ln -s prod.env config.env ``` To see all available configuration options refer to [Docker Orchestration configuration](./../../configuration/docker-orchestration/index.md) page. @@ -100,8 +100,8 @@ To see all available configuration options refer to [Docker Orchestration confi Next, request SSL certificates from [letsencrypt](https://letsencrypt.org/) service: ```shell-session -$ cd /opt/cmem-orchestration -$ make letsencrypt-create +cd /opt/cmem-orchestration +make letsencrypt-create ``` Change `CMEM_BASE_URI` according to your `DEPLOYHOST`. @@ -121,16 +121,16 @@ EOF Finally deploy the Corporate Memory instance: ```shell-session -$ make clean-pull-start-bootstrap -$ make tutorials-import +make clean-pull-start-bootstrap +make tutorials-import ``` Optional: you can install cmem as a systemd service for this use these commands as root oder sudo: ```shell-session -$ cp /opt/cmem-orchestration/conf/systemd/cmem-orchestration.service /etc/systemd/system -$ systemctl enable cmem-orchestration -$ systemctl start cmem-orchestration +cp /opt/cmem-orchestration/conf/systemd/cmem-orchestration.service /etc/systemd/system +systemctl enable cmem-orchestration +systemctl start cmem-orchestration ``` ## Validation and Finalisation @@ -142,13 +142,9 @@ Click **CONTINUE WITH LOGIN** and use one of these default accounts: | account | password | description | | ------- | -------- | ------------------------------------------------------------------------------------------- | | `admin` | `admin` | Is member of the global admin group (can see and do anything) | -| `user` | `user` | Is member of the local user group (can not change access conditions or see internal graphs) | - -![successful-login](../22-1-successful-login.png) After successful login, you will see Corporate Memory interface. You can now proceed to the :material-arrow-right: [Getting Started](../../../getting-started/index.md) section. Do not forget to change the passwords of your deployment, especially if it is available from the public internet. For this, take a look at [Change Passwords and Keys](../../configuration/keycloak/change-passwords-and-keys/index.md). - diff --git a/docs/explore-and-author/.pages b/docs/explore-and-author/.pages index 1321dcec..4e6a1a64 100644 --- a/docs/explore-and-author/.pages +++ b/docs/explore-and-author/.pages @@ -1,5 +1,6 @@ nav: - Explore and Author: index.md + - Workspace Selection and Configuration: workspace-configuration - Graph Exploration: graph-exploration - Vocabulary Catalog: vocabulary-catalog - Thesauri Management: thesauri-management diff --git a/docs/explore-and-author/easynav-module/GraphResourcePattern/index.md b/docs/explore-and-author/easynav-module/GraphResourcePattern/index.md index 1d2fae79..9393f8ac 100644 --- a/docs/explore-and-author/easynav-module/GraphResourcePattern/index.md +++ b/docs/explore-and-author/easynav-module/GraphResourcePattern/index.md @@ -503,9 +503,9 @@ The `GraphResourcePattern` object reference is provided in different ways depend ---------------------------------------------------------------------------------------------------------------------------- Generated using [json-schema-for-humans](https://github.com/coveooss/json-schema-for-humans) on 2022-11-10 at 21:15:54 +0100 -An concrete example object is shown here: + An concrete example object is shown here: -!!! example "Example `GraphResourcePattern`" +=== "Graphresourcepattern" ```json { diff --git a/docs/explore-and-author/embedding-services-via-the-integrations-module/index.md b/docs/explore-and-author/embedding-services-via-the-integrations-module/index.md index f1fab72a..45ff2873 100644 --- a/docs/explore-and-author/embedding-services-via-the-integrations-module/index.md +++ b/docs/explore-and-author/embedding-services-via-the-integrations-module/index.md @@ -7,7 +7,7 @@ tags: A DataManager module is available that can be used to embed / integrate other web-services in Corporate Memory. The module can be used and configured globally or individually per workspace configuration. -[![](./integrations.png)](./integrations.png) +![image](integration.png){ class="bordered" } ## Activation and configuration in DataManager @@ -39,7 +39,7 @@ A restart of DataManager will be required in order for the configuration change ## Link Configuration in DataIntegration -The (module) link configuration in DataIntegration is managed in its own configuration. Thus, the following snippet from a `dataintegration.conf`  shows how to add the "INTEGRATINOS" link to the DataIntegrations menu: +The (module) link configuration in DataIntegration is managed in its own configuration. Thus, the following snippet from a `dataintegration.conf`  shows how to add the "INTEGRATIONS" link to the DataIntegrations menu: ``` js eccencaDataManager.moduleLinks = [ @@ -72,6 +72,7 @@ eccencaDataManager.moduleLinks = [ ``` !!! Note + The "`name"` and "`defaultLabel`" property should be aligned in the DataManager and DataIntegration configuration for consistency. A restart of DataIntegration will be required in order for the configuration change to become effective. @@ -80,4 +81,4 @@ A restart of DataIntegration will be required in order for the configuration cha A typical (eccenca) use case for the Integrations Module is to embed redash dashboards. In order show a dashboard in a Corporate Memory make sure your redash instance use the same protocol as your Corporate Memory instance (typically https). Then open the dashboard that should be embedded and click the sharing button ![](./share.png){ .off-glb width=32 }. In the dialog make sure "*Allow public access*" is enabled. Copy the "*Secret address*" and paste this address into the "`url`" property of a tab configuration, as shown above. -[![](./share_dashboard.png){ width=561 }](./share_dashboard.png) +![](./share_dashboard.png){ class="bordered" width=561 } diff --git a/docs/explore-and-author/embedding-services-via-the-integrations-module/integration.png b/docs/explore-and-author/embedding-services-via-the-integrations-module/integration.png new file mode 100644 index 00000000..8561586e Binary files /dev/null and b/docs/explore-and-author/embedding-services-via-the-integrations-module/integration.png differ diff --git a/docs/explore-and-author/embedding-services-via-the-integrations-module/integrations.png b/docs/explore-and-author/embedding-services-via-the-integrations-module/integrations.png deleted file mode 100644 index 7aa9e01f..00000000 Binary files a/docs/explore-and-author/embedding-services-via-the-integrations-module/integrations.png and /dev/null differ diff --git a/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/index.md b/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/index.md index eaa52930..2569af27 100644 --- a/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/index.md +++ b/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/index.md @@ -13,42 +13,42 @@ Working with shapes allows for creation of a customized Linked Data user interfa You can define forms using SHACL rules. The rules state: -1. What types of resources the form definition applies to. This is based on the `rdf:type` of a resource. -2. What fields are shown in the form in which order. Field contents are retrieved from properties connected to the resource. -3. Which other, linked resources are shown in the form. Linked resources can either be shown as links or as their full form. -4. Which texts are used to name and describe fields, as well as the tab in the user interface. +1. What types of resources the form definition applies to. This is based on the `rdf:type` of a resource. +2. What fields are shown in the form in which order. Field contents are retrieved from properties connected to the resource. +3. Which other, linked resources are shown in the form. Linked resources can either be shown as links or as their full form. +4. Which texts are used to name and describe fields, as well as the tab in the user interface. Forms are defined in the CMEM Shapes Catalog graph. The graph URI is `https://vocab.eccenca.com/shacl/`. Form definitions are twofold: -1. The form itself is defined as so called `NodeShape`. NodeShapes define which types of resources the form applies to (the target class), and which fields are shown in the form (the Properties). -2. The individual fields are defined as so called `PropertyShape`. PropertyShapes define which property is used to retrieve data for the field (the path), the name of the field, a description, its cardinality (min and max count), its position in the form (the order), and if it should always be shown. In case of object properties, it also defines the type of the linked resource (the class). The full list of features is described in [section PropertyShapes](#propertyshapes). +1. The form itself is defined as so called `NodeShape`. NodeShapes define which types of resources the form applies to (the target class), and which fields are shown in the form (the Properties). +2. The individual fields are defined as so called `PropertyShape`. PropertyShapes define which property is used to retrieve data for the field (the path), the name of the field, a description, its cardinality (min and max count), its position in the form (the order), and if it should always be shown. In case of object properties, it also defines the type of the linked resource (the class). The full list of features is described in [section PropertyShapes](#propertyshapes). To define a new form, for example for `foaf:Person` resources, navigate to the CMEM Shapes Catalog graph and select `NodeShape` in Navigation. The list of existing NodeShapes is shown. Click "Create a new SHACL Node shape" in the upper right to create a new NodeShape. Enter a name of the resource. An empty NodeShape resource is created and shown. -[![](./createNodeShape.png)](./createNodeShape.png) +![](./createNodeShape.png){ class="bordered" } To create the initial definition, click ![](./ic_mode_edit_black_18dp_1x.png){ .off-glb } (Edit). A form is shown to you with input fields Name, Property Shapes, Vocabulary, Target class and Statement Annotation. The initial definition requires the name, and the target class. Fields are attached to the form later. Target class in particular binds the form to the resources it should cover. The Target class field features an auto-complete that displays all classes stored in Corporate Memory. The example form should cover resources of the type `foaf:Person`, so enter `foaf:Person` in the Target class field. Click SAVE to save the NodeShape. -[![](./EditNodeShape.png)](./EditNodeShape.png) +![](./EditNodeShape.png){ class="bordered" } You have now created an "empty" form that covers `foaf:Person` resources with tab name "Person". Navigating to a `foaf:Person` resource, you see a new tab as defined. You can still see all properties of the resource in the PROPERTIES tab. -[![](./nodeshape.png)](./nodeshape.png) +![](/nodeshape.png){ class="bordered" } To define new fields, for example showing the email address of the person (defined as `foaf:mbox`), navigate to the CMEM Shapes Catalog graph and select `PropertyShape` in Navigation. The list of existing PropertyShapes is shown. Click CREATE NEW PROPERTYSHAPE in the upper right to create a new PropertyShape. Enter a name of the resource. An empty PropertyShape resource is created and shown. Edit the form using ![](./ic_mode_edit_black_18dp_1x.png). A form is shown with all relevant properties of a field definition. Required in this step are: -1. The name of the field, which will be displayed left of the data content or input field in the form. -2. The description, which will be displayed as tooltip on the question mark to the right of the name. -3. The path, which states which property the field represents. In this example, it is `foaf:mbox`. -4. The form the field should be shown in (Property of). The field provides an auto-complete, so just enter "Person" and select the NodeShape resource you defined in the previous step. +1. The name of the field, which will be displayed left of the data content or input field in the form. +2. The description, which will be displayed as tooltip on the question mark to the right of the name. +3. The path, which states which property the field represents. In this example, it is `foaf:mbox`. +4. The form the field should be shown in (Property of). The field provides an auto-complete, so just enter "Person" and select the NodeShape resource you defined in the previous step. Click SAVE after filling out the required fields. -[![](./nodeshapeedit.png)](./nodeshapeedit.png) +![](nodeshapeedit.png){ class="bordered" } ## Using forms @@ -60,7 +60,7 @@ While browsing your knowledge graph, you will always see your shape in action, w The next images demonstrate this behavior : -[![](./nodeshape.png)](./nodeshape.png) +![](./nodeshape.png){ class="bordered" } ### Creating new resources @@ -68,6 +68,6 @@ You can also create new resources by using a shaped form. One way to achieve thi The next images demonstrate this behaviour: -[![](./createsparqlquery.png)](./createsparqlquery.png) +![](./createsparqlquery.png){ class="bordered" } -[![](./createsparqlqueryeditor.png)](./createsparqlqueryeditor.png) +![](./createsparqlqueryeditor.png){ class="bordered" } diff --git a/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshape.png b/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshape.png index 6f889ae1..a41d95c2 100644 Binary files a/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshape.png and b/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshape.png differ diff --git a/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshapeedit.png b/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshapeedit.png index e1f9b4c6..22188cbc 100644 Binary files a/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshapeedit.png and b/docs/explore-and-author/graph-exploration/building-a-customized-user-interface/nodeshapeedit.png differ diff --git a/docs/explore-and-author/graph-exploration/graphoverview.png b/docs/explore-and-author/graph-exploration/graphoverview.png index 9f1feb20..06fbe554 100644 Binary files a/docs/explore-and-author/graph-exploration/graphoverview.png and b/docs/explore-and-author/graph-exploration/graphoverview.png differ diff --git a/docs/explore-and-author/graph-exploration/index.md b/docs/explore-and-author/graph-exploration/index.md index 41524aca..2911809b 100644 --- a/docs/explore-and-author/graph-exploration/index.md +++ b/docs/explore-and-author/graph-exploration/index.md @@ -24,10 +24,10 @@ The user interface of the Explore module shows the following main areas: - the main area, providing multiple views, depending on which resource has been selected. -1. If necessary, you can toggle the navigation area by using the +1. If necessary, you can toggle the navigation area by using the :eccenca-toggler-moveleft: (hide) and :eccenca-toggler-tree: (show) buttons. -2. _Go to resource_ is used with an IRI to open the resource details page directly. +2. _Go to resource_ is used with an IRI to open the resource details page directly. It is not a search field. You can try to search for a keyword, which might or might not be doing what you intended. @@ -45,7 +45,7 @@ In the main area, the Metadata view of the selected graph appears, showing sev The Graphs are categorized into groups as follows: -- User: All graphs which represent user data (created manually or by build processes).  +- User: All graphs which represent user data (created manually or by build processes). - Vocabularies: All graphs containing vocabularies. - System: All graphs containing configuration data. - All @@ -56,6 +56,7 @@ You can search for a specific graph with **:eccenca-module-search: Search**. To add a new graph to the Graphs list: +
- Click **:eccenca-item-add-artefact: Add new graph**. A dialog appears. - Select a graph type. (1) - Provide a name and enter the graph URI (e.g. `https://ns.eccenca.com`). @@ -63,7 +64,7 @@ To add a new graph to the Graphs list: - Click **Save** to create the new graph.
-1. More concrete, you select a shape here. +1. More concrete, you select a shape here. This can be configured in the workspace configuration as well. ### :eccenca-item-download: Downloading a graph @@ -90,7 +91,7 @@ To update or replace data of a graph: - Click **Update** to start the upload process. -1. You can upload one of the following file formats: Turtle, N-Triples, RDF/XML, or JSON-LD. +1. You can upload one of the following file formats: Turtle, N-Triples, RDF/XML, or JSON-LD. To delete a graph, select **:eccenca-item-remove: Remove graph** on the graph you want to remove and confirm deletion process. @@ -110,7 +111,7 @@ To reset the results delete the keyword and press Enter. Select a class in the Navigation box to show all instances of this class in the main area. (1) { .annotate } -1. The table uses a default query to list all resources with a given class. +1. The table uses a default query to list all resources with a given class. This can be configured by adding a `shui:navigationListQuery` to the class shape. ### Instance Details @@ -118,7 +119,7 @@ Select a class in the Navigation box to show all instances of this class in th To open the Instance Details of a resource click on that resource in the Instance List. Resources are shown as grey chip buttons. -![](./instancedata.png) +![](instancedata.png){ class="bordered" } !!! warning inline end @@ -135,7 +136,7 @@ The availability of these views depends on the context and the resource type. The Resource tab provides a view based on the shapes of the selected resource. The details of the shaped view depends on the configuration. -![](./graphoverview.png) +![](graphoverview.png){ class="bordered" } #### Properties @@ -158,7 +159,7 @@ Click **SAVE** to save your changes. The Statistics tab indicates the number of classes, properties, entities and triples of the graph. -![](./statictics.png) +![](./statictics.png){ class="bordered" } #### Graph @@ -168,7 +169,7 @@ The Statistics tab indicates the number of classes, properties, entities and t The Graph tab shows a visual graph representation of the graph. -![](./graphvisulization.png) +![](./graphvisulization.png){ class="bordered" } #### Vocab @@ -179,13 +180,13 @@ The Graph tab shows a visual graph representation of the graph. This tab shows a graph visualization of an installed vocabulary. It displays all classes showing the class-subclass.  You can open the class details and view the list of instances related to that class. It also allows you to copy the resource IRI. -![](./vocab.png) +![](vocab.png){ class="bordered" } #### References This tab shows all resources that link back to the selected resource. -[](./Reference.png) +![](./Reference.png){ class="bordered" } #### Turtle diff --git a/docs/explore-and-author/graph-exploration/instancedata.png b/docs/explore-and-author/graph-exploration/instancedata.png index 5d004102..a4382da5 100644 Binary files a/docs/explore-and-author/graph-exploration/instancedata.png and b/docs/explore-and-author/graph-exploration/instancedata.png differ diff --git a/docs/explore-and-author/graph-exploration/statement-annotations/annotations.png b/docs/explore-and-author/graph-exploration/statement-annotations/annotations.png index f55fd6e2..3b619575 100644 Binary files a/docs/explore-and-author/graph-exploration/statement-annotations/annotations.png and b/docs/explore-and-author/graph-exploration/statement-annotations/annotations.png differ diff --git a/docs/explore-and-author/graph-exploration/statement-annotations/index.md b/docs/explore-and-author/graph-exploration/statement-annotations/index.md index b1dbc238..304ef0fb 100644 --- a/docs/explore-and-author/graph-exploration/statement-annotations/index.md +++ b/docs/explore-and-author/graph-exploration/statement-annotations/index.md @@ -17,7 +17,7 @@ Statement Annotations provide a way to express knowledge about statements. Typi If enabled on a specific type of statement or type of resource, you see a Statement Annotation text bubble beside every annotatable statement: -![](./statementannotationoveriew.png) +![](statementannotationoveriew.png){ class="bordered" } This bubble has different status: @@ -27,11 +27,11 @@ This bubble has different status: Clicking on one of the text bubbles opens the Statement Annotation dialog for this specific statement: -![](./createstatementannotations.png) +![](./createstatementannotations.png){ class="bordered" } In the Statement Annotation dialog, you can select the Statement Annotation Template and click **Create**. -![](./statementedit.png) +![](./statementedit.png){ class="bordered" } ## Setup @@ -41,25 +41,25 @@ In order to have a working Statement Annotation setup, the following steps need Create a new Graph, edit its metadata and change the type to Statement Annotation Graph. -![](./statementannotation.png) +![](statementannotation.png){ class="bordered" } ### Setup and import the Statement Annotation Graph in your data graph In your data graph, where the resources exist which you want to annotate, import the Statement Annotation Graph and select it as an Annotation Graph. -![](./annotations.png) +![](annotations.png){ class="bordered" } ### Create a shaped form which will be used to annotate statements In your Shape Catalog, select a Node Shape (or create one) which you want to use for statement annotations, and Enable Statement Annotation to true. -![](./setannotations.png) +![](setannotations.png){ class="bordered" } ### Allow statement annotations in your shaped forms on specific Classes or Properties Finally, select the Node Shape or Property Shape from your Shape Catalog, and enable annotations by setting the Enable option in the Statement Annotations group to true. -![](./setannotations.png) +![](setannotations.png){ class="bordered" } This will enable the feature on the statements of all resources shown with this Node Shape or on all statements shown with this Property Shape. @@ -71,7 +71,7 @@ These Annotation Resources are based on specific Shapes which are enabled as Sta Reification Resources as well as Annotation Resources are managed in a Statement Annotation Graph, which need to be configured on a Graph as well as imported to this Graph. The following illustration depicts this schema with boxes and arrows: -![](20-10-StatementAnnotationSchema.png) +![](20-10-StatementAnnotationSchema.png){ class="bordered" } !!! note "Some notes on this:" diff --git a/docs/explore-and-author/graph-exploration/statement-annotations/setannotations.png b/docs/explore-and-author/graph-exploration/statement-annotations/setannotations.png index 1cea55aa..f8e37eb3 100644 Binary files a/docs/explore-and-author/graph-exploration/statement-annotations/setannotations.png and b/docs/explore-and-author/graph-exploration/statement-annotations/setannotations.png differ diff --git a/docs/explore-and-author/graph-exploration/statement-annotations/statementannotation.png b/docs/explore-and-author/graph-exploration/statement-annotations/statementannotation.png index ce065fda..fdb0be40 100644 Binary files a/docs/explore-and-author/graph-exploration/statement-annotations/statementannotation.png and b/docs/explore-and-author/graph-exploration/statement-annotations/statementannotation.png differ diff --git a/docs/explore-and-author/graph-exploration/statement-annotations/statementannotationoveriew.png b/docs/explore-and-author/graph-exploration/statement-annotations/statementannotationoveriew.png index 90e3d2bc..c50bfcb8 100644 Binary files a/docs/explore-and-author/graph-exploration/statement-annotations/statementannotationoveriew.png and b/docs/explore-and-author/graph-exploration/statement-annotations/statementannotationoveriew.png differ diff --git a/docs/explore-and-author/graph-exploration/vocab.png b/docs/explore-and-author/graph-exploration/vocab.png index 0d215277..2c11c677 100644 Binary files a/docs/explore-and-author/graph-exploration/vocab.png and b/docs/explore-and-author/graph-exploration/vocab.png differ diff --git a/docs/explore-and-author/index.md b/docs/explore-and-author/index.md index aa944c0f..ce83eca1 100644 --- a/docs/explore-and-author/index.md +++ b/docs/explore-and-author/index.md @@ -3,6 +3,7 @@ icon: material/star hide: - toc --- + !!! info inline end "" ![Your are here](overview-explore.drawio.png "You are here") diff --git a/docs/explore-and-author/query-module/Queries.png b/docs/explore-and-author/query-module/Queries.png index a008ecf7..26fedd42 100644 Binary files a/docs/explore-and-author/query-module/Queries.png and b/docs/explore-and-author/query-module/Queries.png differ diff --git a/docs/explore-and-author/query-module/index.md b/docs/explore-and-author/query-module/index.md index fec957ad..f73c53d6 100644 --- a/docs/explore-and-author/query-module/index.md +++ b/docs/explore-and-author/query-module/index.md @@ -20,10 +20,9 @@ The catalog lists all existing SPARQL queries including name, type and descripti Use the **:eccenca-operation-search: Search** bar in order to look for a specific query. -![](./Queries.png) - -Select the query from the Queries catalog, to open and load the query.  +![](Queries.png){ class="bordered" } +Select the query from the Queries catalog, to open and load the query. ## Query editor @@ -35,7 +34,7 @@ The query editor features SPARQL syntax highlighting and SPARQL validation, allo The Query editor allows to Run query, Download Results, Delete, Save and Save as Queries. -![](./QueryEditor.png) +![](./QueryEditor.png){ class="bordered" } ### Run a query @@ -44,9 +43,9 @@ The results are presented as a table with pagination. ### Export results -To export the full set of results without any limits in form of a CSV file click **:eccenca-item-download: Download result** on the top right.  +To export the full set of results without any limits in form of a CSV file click **:eccenca-item-download: Download result** on the top right. -![](./QueriesResults.png) +![](./QueriesResults.png){ class="bordered" } !!! info @@ -58,7 +57,6 @@ To export the full set of results without any limits in form of a CSV file click To save a query in the Query catalog click **:material-floppy: Save**. This opens a dialog that allows you to overwrite the existing query. - ### Placeholders In addition to the standard SPARQL syntax, placeholders can be used to parametrize a query. @@ -67,7 +65,7 @@ Multiple placeholders can be defined by changing the name inside the brackets. When a query contains a placeholder, the placeholder list to the right of the query editor shows a field with its name. -![](./placeholder.png) +![](./placeholder.png){ class="bordered" } When running a query that contains placeholders, the query editor replaces the `{{placeholdername}}` string in the query with the respective string entered into the placeholder list. This is a direct string replacement, so placeholders can contain simple strings and literal values, URIs, variables or even sub queries. @@ -86,4 +84,3 @@ When you enter `Person` into the `class` placeholder field in the placeholde ```sparql SELECT * WHERE { ?classInstance a .} ``` - diff --git a/docs/explore-and-author/thesauri-management/CMEM-19-02-navigation-tree.png b/docs/explore-and-author/thesauri-management/CMEM-19-02-navigation-tree.png deleted file mode 100644 index 2d179333..00000000 Binary files a/docs/explore-and-author/thesauri-management/CMEM-19-02-navigation-tree.png and /dev/null differ diff --git a/docs/explore-and-author/thesauri-management/CMEM-22-2-thesaurus-project-catalog.png b/docs/explore-and-author/thesauri-management/CMEM-22-2-thesaurus-project-catalog.png deleted file mode 100644 index 8339d2bb..00000000 Binary files a/docs/explore-and-author/thesauri-management/CMEM-22-2-thesaurus-project-catalog.png and /dev/null differ diff --git a/docs/explore-and-author/thesauri-management/index.md b/docs/explore-and-author/thesauri-management/index.md index 51079a29..1be770be 100644 --- a/docs/explore-and-author/thesauri-management/index.md +++ b/docs/explore-and-author/thesauri-management/index.md @@ -18,8 +18,7 @@ You can think of these relations as a hierarchical tree representing the relatio In a concept scheme Industries, a top branch in this tree, as for example the sub-industry Industrials or Health Care, is called a top concept. All branches together belong to the concept scheme Industries. -![Navigation tree with detail view of the concept Airlines](./CMEM-19-02-navigation-tree.png "Navigation tree with detail view of the concept Airlines") - +![Navigation tree with detail view of the concept Airlines](./navigation-tree.png "Navigation tree with detail view of the concept Airlines"){ class="bordered" } !!! info @@ -43,7 +42,7 @@ In order to get more information on a thesaurus project and edit its metadata, c The view expands showing the project metadata. Click **:eccenca-item-edit: Edit** on the right side of the row to open the edit mode, enter your changes and click **SAVE**. -![Thesaurus project catalog](CMEM-22-2-thesaurus-project-catalog.png "Thesaurus project catalog") +![Thesaurus project catalog](thesaurus-project-catalog.png "Thesaurus project catalog"){ class="bordered" } To open the detail view of a thesaurus project, click the project name in the catalog. @@ -150,8 +149,8 @@ You can add, for example, a second broader concept for an existing concept or a To add relations, select the concept in the navigation tree. In the detail view, click **:eccenca-item-edit: Edit** to open the edit mode. -- To add an associative relation to another concept, enter the concept name in the field **Related concept**. -- To add a further broader relation, enter the name of the broader concept in the field **Broader concepts**. +- To add an associative relation to another concept, enter the concept name in the field **Related concept**. +- To add a further broader relation, enter the name of the broader concept in the field **Broader concepts**. You can only choose from existing concepts. Click **SAVE** to confirm your changes. @@ -169,4 +168,3 @@ When adding relations the inverse relation is automatically added, too. To remove concepts or concept schemes, select the resource in the navigation tree, click the context menu **:eccenca-item-moremenu: Show more options** and select the **Remove** option. Confirm the dialog and click **REMOVE**. - diff --git a/docs/explore-and-author/thesauri-management/navigation-tree.png b/docs/explore-and-author/thesauri-management/navigation-tree.png new file mode 100644 index 00000000..c59027b2 Binary files /dev/null and b/docs/explore-and-author/thesauri-management/navigation-tree.png differ diff --git a/docs/explore-and-author/thesauri-management/thesaurus-project-catalog.png b/docs/explore-and-author/thesauri-management/thesaurus-project-catalog.png new file mode 100644 index 00000000..e37107fa Binary files /dev/null and b/docs/explore-and-author/thesauri-management/thesaurus-project-catalog.png differ diff --git a/docs/explore-and-author/vocabulary-catalog/index.md b/docs/explore-and-author/vocabulary-catalog/index.md index 4888b4b0..93910118 100644 --- a/docs/explore-and-author/vocabulary-catalog/index.md +++ b/docs/explore-and-author/vocabulary-catalog/index.md @@ -10,7 +10,7 @@ tags: Vocabularies are the foundation for semantic data lifting activities.This module shows the list of all managed vocabularies in Corporate Memory that are accessible for the user. The table represents the list of known vocabularies. Installed vocabularies are indicated by the orange switch in the column `Installed`. -[![](./vocabulary.png)](./vocabulary.png) +![](vocabulary.png){ class="bordered" } ## Add new vocabulary @@ -26,8 +26,7 @@ Each table row provides a menu with more options clicking on ![](./ic_keyboard A vocabulary which is known and available but not installed, looks like this: -[![Example of extended information of uninstalled Vocabulary Catalog](./not_installed_vocab.png - "Example of extended information of uninstalled Vocabulary Catalog")](./not_installed_vocab.png) +![Example of extended information of uninstalled Vocabulary Catalog](./not_installed_vocab.png "Example of extended information of uninstalled Vocabulary Catalog"){ class="bordered" } Example of extended information of uninstalled Vocabulary Catalog @@ -36,7 +35,7 @@ Example of extended information of uninstalled Vocabulary Catalog A vocabulary which is installed looks like this -[![Example of extended information of installed Vocabulary Catalog](./installed_vocab.png "Example of extended information of installed Vocabulary Catalog")](./installed_vocab.png) +![Example of extended information of installed Vocabulary Catalog](./installed_vocab.png "Example of extended information of installed Vocabulary Catalog"){ class="bordered" } Example of extended information of installed Vocabulary Catalog diff --git a/docs/explore-and-author/vocabulary-catalog/vocabulary.png b/docs/explore-and-author/vocabulary-catalog/vocabulary.png index a01a17a0..3e88e8f2 100644 Binary files a/docs/explore-and-author/vocabulary-catalog/vocabulary.png and b/docs/explore-and-author/vocabulary-catalog/vocabulary.png differ diff --git a/docs/explore-and-author/workspace-configuration/add-workspace.png b/docs/explore-and-author/workspace-configuration/add-workspace.png new file mode 100644 index 00000000..3157aae1 Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/add-workspace.png differ diff --git a/docs/explore-and-author/workspace-configuration/configuration.png b/docs/explore-and-author/workspace-configuration/configuration.png new file mode 100644 index 00000000..cc8c594f Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/configuration.png differ diff --git a/docs/explore-and-author/workspace-configuration/create-new-workspace.png b/docs/explore-and-author/workspace-configuration/create-new-workspace.png new file mode 100644 index 00000000..a1de6940 Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/create-new-workspace.png differ diff --git a/docs/explore-and-author/workspace-configuration/delete-select.png b/docs/explore-and-author/workspace-configuration/delete-select.png new file mode 100644 index 00000000..91e4576d Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/delete-select.png differ diff --git a/docs/explore-and-author/workspace-configuration/delete-stepresult.png b/docs/explore-and-author/workspace-configuration/delete-stepresult.png new file mode 100644 index 00000000..09a9c746 Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/delete-stepresult.png differ diff --git a/docs/explore-and-author/workspace-configuration/delete.png b/docs/explore-and-author/workspace-configuration/delete.png new file mode 100644 index 00000000..74553d03 Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/delete.png differ diff --git a/docs/explore-and-author/workspace-configuration/details.png b/docs/explore-and-author/workspace-configuration/details.png new file mode 100644 index 00000000..c1058a04 Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/details.png differ diff --git a/docs/explore-and-author/workspace-configuration/enable.png b/docs/explore-and-author/workspace-configuration/enable.png new file mode 100644 index 00000000..cd7d3a0f Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/enable.png differ diff --git a/docs/explore-and-author/workspace-configuration/index.md b/docs/explore-and-author/workspace-configuration/index.md new file mode 100644 index 00000000..836488e1 --- /dev/null +++ b/docs/explore-and-author/workspace-configuration/index.md @@ -0,0 +1,92 @@ +--- +icon: eccenca/application-config +status: new +tags: + - KnowledgeGraph +--- + +# Workspaces + +The specific configuration of the application defines which options are available here, i.e. whether you can select one of several workspaces, access only a default workspace or are allowed to create own workspaces. + +## Select a workspace + +To select a workspace click on the **user icon** on the right side of the page + +![User menu](user.png){ class="bordered" } + +Click the drop-down list and click the workspace you want to open. + +![Workspace selector](workspace.png){ class="bordered" } + +!!! success "Step Result" + + The workspace opens and now you can enable or disabled the modules and change modeule configuration as per your requirement. + + ![Configuration module de-/activation](enable.png){ class="bordered" } + +## Configure a workspace + +Click on the **user icon** on the right side of the page then click on **Configuration**. + +![Configuration module](configuration.png){ class="bordered" } + +Click on **Workspace** then select the workspace you want to see the details. + +![Select workspace to configure](select-workspace.png){ class="bordered" } + + Click on down arrow to expand the **Workspace** and **DI Workspace Configuration** to see the configuration details as shown below. + +![Configuration module settings](details.png){ class="bordered" } + +## Add a Workspace + +Click on the **user icon** on the right side of the page then click on **Configuration**. + +![Configuration module](configuration.png){ class="bordered" } + +Click on **Workspace** on the left side of the page then click on **Create New Workspace** + +![Create workspace](create-new-workspace.png){ class="bordered" } + +Type the **Id** and **Label** name then click on **Add** + +![Add new workspace](add-workspace.png){ class="bordered" } + +!!! success "Step Result" + + The workspace created sucessfully and now you can enable or disabled the modules and change modeule configuration as per your requirement. + + ![Workspace created](enable.png){ class="bordered" } + +!!! note + + Refer to the system manual of eccenca DataManager to get more information on all the options that can be configured here. + +## Delete a workspace + +Click on **User Icon** on the right side of the page then click on **Configuration** then click on **Workspace** + +![Create workspace](create-new-workspace.png){ class="bordered" } + +Select the Workspace from the drop-down you want to delete + +![Select workspace to configure](select-workspace-1.png){ class="bordered" } + +Click on the **Delete Icon** on the right side of the page. + +![Delete selected workspace](delete.png){ class="bordered" } + +Click on **Delete** + +![Delete confirmation dialog](delete-select.png){ class="bordered" } + +!!! success "Step Result" + + The workspace has been deleted. + + ![Deletion result](delete-stepresult.png){ class="bordered" } + +!!! note + + When you delete a workspace, no graphs or Build projects are deleted. diff --git a/docs/explore-and-author/workspace-configuration/select-workspace-1.png b/docs/explore-and-author/workspace-configuration/select-workspace-1.png new file mode 100644 index 00000000..69769135 Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/select-workspace-1.png differ diff --git a/docs/explore-and-author/workspace-configuration/select-workspace.png b/docs/explore-and-author/workspace-configuration/select-workspace.png new file mode 100644 index 00000000..0b0f952a Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/select-workspace.png differ diff --git a/docs/explore-and-author/workspace-configuration/user.png b/docs/explore-and-author/workspace-configuration/user.png new file mode 100644 index 00000000..6496b96e Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/user.png differ diff --git a/docs/explore-and-author/workspace-configuration/workspace.png b/docs/explore-and-author/workspace-configuration/workspace.png new file mode 100644 index 00000000..e949f687 Binary files /dev/null and b/docs/explore-and-author/workspace-configuration/workspace.png differ diff --git a/docs/getting-started/Explore.png b/docs/getting-started/Explore.png deleted file mode 100644 index c199a56c..00000000 Binary files a/docs/getting-started/Explore.png and /dev/null differ diff --git a/docs/getting-started/UserInterface.png b/docs/getting-started/UserInterface.png deleted file mode 100644 index 1f36b3e2..00000000 Binary files a/docs/getting-started/UserInterface.png and /dev/null differ diff --git a/docs/getting-started/Workspace.png b/docs/getting-started/Workspace.png deleted file mode 100644 index f28d0311..00000000 Binary files a/docs/getting-started/Workspace.png and /dev/null differ diff --git a/docs/getting-started/demograph.png b/docs/getting-started/demograph.png new file mode 100644 index 00000000..98c6266b Binary files /dev/null and b/docs/getting-started/demograph.png differ diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 038f5a64..ef9cc549 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -24,28 +24,27 @@ eccenca Corporate Memory is a semantic data management software that accelerates The main features of Corporate Memory include: -- Flexible metadata and schema layer based on knowledge graphs -- Data virtualization and analytics -- Data integration and indexing -- Dataset and vocabulary management -- Thesaurus and taxonomy management -- Big data scalability -- Access control +- Flexible metadata and schema layer based on knowledge graphs +- Data virtualization and analytics +- Data integration and indexing +- Dataset and vocabulary management +- Thesaurus and taxonomy management +- Big data scalability +- Access control ### Minimal requirements For the best user experience, we recommend to use the newest version of Google Chrome or Mozilla Firefox. Corporate Memory is tested with the following browsers: -- Google Chrome 83 or later -- Mozilla Firefox 78 or later -- Microsoft Edge 83 (on Windows) or later +- Google Chrome 83 or later +- Mozilla Firefox 78 or later +- Microsoft Edge 83 (on Windows) or later ## Login and Logout To start eccenca Corporate Memory: 1. Enter the URL in your web browser. -1. Select your workspace and click **CONTINUE WITH LOGIN**. 2. Enter your credentials and click **LOG IN**. After you logged in to your Corporate Memory instance, the main application view appears. @@ -54,54 +53,9 @@ To log out, open the menu :material-dots-vertical: in the Module bar and click ## Workspaces -A workspace is an endpoint of an eccenca DataPlatform identified by a workspace name and the DataPlatform URL. The specific configuration of the application defines which options are available here, i.e. whether you can select one of several workspaces, access only a default workspace or are allowed to create own workspaces. -These options are configured by the system administrator. -For more information on workspace configuration refer to the system manual of eccenca DataManager. - -### Selecting a workspace - -To select an existing workspace open the drop-down list and click the workspace you want to open. -The name and the DataPlatform URL of the selected workspace are shown under **Workspace Configuration**. -Click **CONTINUE WITH LOGIN** and enter your credentials to log in. - -### Adding a new workspace - -!!! info - - Whether this option is available depends on the configuration of Corporate Memory that is defined by the system administrator. - -To add a new workspace, open the drop-down list on the Workspaces window and click **Add New Workspace**. - -![](Workspace.png) - -Under **Workspace Configuration** enter a Workspace Name and the DataPlatform URL. - -Click **SHOW OPTIONS** to display extended configuration options. - -!!! note - - Refer to the system manual of eccenca DataManager to get more information on all the options that can be configured here. - -Click on **CONTINUE WITH LOGIN** to save your entries. - - -### Deleting a workspace - -!!! note - - This option is only available for workspaces created by users themselves. - -To delete a workspace, select the workspace from the drop-down list on the Workspace screen and click **DELETE**. - -The workspace is removed from the drop-down list. - -!!! note - - When you delete a workspace, the graph data is not deleted. - -This section describes the main elements of the graphical user interface of eccenca Corporate Memory. +See the [workspaces](../explore-and-author/workspace-configuration/) section for more details. ## User interface and modules @@ -110,19 +64,19 @@ The user interface of Corporate Memory usually consists of two sections: 1. The module bar providing access to the various modules of Corporate Memory and to a menu with further options 1. The main section for operating the software functions -![](UserInterface.png) +![Graph statistics view](statistic.png) Each module provides a set of functionalities and views for specific use cases. To access a module, click the module name. The active module is highlighted. By default, Corporate Memory provides the following modules: -- EXPLORE - for Knowledge Graph browsing and exploration, specifically - - [Knowledge Graphs](../explore-and-author/index.md) - a generic and extensible RDF data browser and editor - - [Vocabularies](../explore-and-author/vocabulary-catalog/index.md) - for vocabulary management - - [Thesauri](../explore-and-author/thesauri-management/index.md) - for managing thesauri and taxonomies based on SKOS - - [Queries](../explore-and-author/query-module/index.md) - a SPARQL query interface -- [BUILD](../build/index.md) - for creating and integrating Knowledge Graphs, with specific links to +- EXPLORE - for Knowledge Graph browsing and exploration, specifically + - [Knowledge Graphs](../explore-and-author/) - a generic and extensible RDF data browser and editor + - [Vocabularies](../explore-and-author/vocabulary-catalog/) - for vocabulary management + - [Thesauri](../explore-and-author/thesauri-management/) - for managing thesauri and taxonomies based on SKOS + - [Queries](../explore-and-author/query-module/) - a SPARQL query interface +- [BUILD](../build/) - for creating and integrating Knowledge Graphs, with specific links to - Projects - the BUILD Projects level - Datasets - the Datasets across all BUILD Projects - Workflows - the Workflows across all BUILD Projects @@ -134,9 +88,9 @@ By default, Corporate Memory provides the following modules: Use the provided search field(s) in each module to search for specific keywords or strings in names and labels of resources. -The **EXPLORE** module provides more search fields (e.g. in the Graph box, Navigation box, etc.) where you can limit your search to specific graphs or resources. +The **Knowledge Graphs** module provides more search fields (e.g. in the Graph box, Navigation box, etc.) where you can limit your search to specific graphs or resources. -![](Explore.png) +![Explore graph sample](demograph.png) ### Settings menu for table views @@ -189,4 +143,3 @@ This section provides an overview of icons and their functionality in Corporate | ---- | ----------- | | :material-folder: | Object mappings. | | :material-file: | Value mappings. | - diff --git a/docs/getting-started/statistic.png b/docs/getting-started/statistic.png new file mode 100644 index 00000000..b329464b Binary files /dev/null and b/docs/getting-started/statistic.png differ diff --git a/docs/getting-started/with-your-sandbox/.pages b/docs/getting-started/with-your-sandbox/.pages new file mode 100644 index 00000000..e69de29b diff --git a/docs/getting-started/with-your-sandbox/index.md b/docs/getting-started/with-your-sandbox/index.md new file mode 100644 index 00000000..12a5231b --- /dev/null +++ b/docs/getting-started/with-your-sandbox/index.md @@ -0,0 +1,104 @@ +--- +comments: false +hide: + - toc + - navigation +--- + +# Welcome to your eccenca Corporate Memory Sandbox + +!!! info inline end "" + + ![Your are here](overview-cmem.drawio.svg "You are here") + +Thank you for registering your eccenca Corporate Memory Sandbox! We're excited to have you on board and look forward to showing you how Corporate Memory can help you with your data management needs. We hope that you find this experience valuable and informative. If you have any questions or feedback, please don't hesitate to reach out to us. Thanks again for joining us! + +eccenca's Corporate Memory is a platform for creating and managing Enterprise Knowledge Graphs. It has three main stages: _Build_, _Explore_, and _Consume_. In the _Build_ stage, you can convert legacy data points from existing datasets into a Knowledge Graph structure. The _Explore_ stage allows you to interact with your Knowledge Graph, while the _Consume_ stage is used to retrieve information from the graph and integrate it programmatically with your IT infrastructure. + +
+ +- :material-rocket-launch:{ .lg .middle } __Get Started and Get Help__ + + --- + + Learn how to get started with Corporate Memory in our Getting Started Guide. Understand the user interface, application structure, and basic concepts. + + [:octicons-arrow-right-24: Getting Started](../){target=_blank} + + Community support for the sandbox is provided in this [:simple-github: forum](https://github.com/eccenca/documentation.eccenca.com/discussions){target=_blank}, use it seek for help, report issues or suggestions, or discuss solution ideas. + + Find and contact us at: [:simple-github:](https://github.com/eccenca){target=_blank} • [:simple-twitter:](https://twitter.com/eccenca){target=_blank} • [:simple-linkedin:](https://de.linkedin.com/company/eccenca-gmbh){target=_blank} • [:octicons-mail-24:](mailto:info@eccenca.com) + +- :fontawesome-brands-dropbox:{ .lg .middle } __Sandbox Resources__ + + --- + + The sandbox includes a sample build project named _"Product Data Integration Demo"_ and the graphs generated by that project, as well as an integration graph as an entry point: _"Products - Integration"_. Shacl shapes are provided for the product vocabulary. These are used in the EasyNav module for visual exploration as well as in a custom workspace configuration called _Product Data Integration_ to demonstrate how the user interface can be customized. + +- :fontawesome-solid-graduation-cap:{ .lg .middle } __Masterclass Material__ + + --- + + A list of materials and resources to reproduce and follow the masterclass session: _From Zero to KG Hero: Boosting Your KG Creation Productivity with eccenca Corporate Memory_. Originally presented at **The Knowledge Graph Conference 2023**. [Watch the recording on :simple-youtube:](https://youtu.be/qD-hge6gyIE){target=_blank}. + + [:octicons-arrow-right-24: materials and resources](./material){target=_blank} + +- :material-script-text-play-outline:{ .lg .middle } __Tutorials and Examples__ + + --- + + Our [tutorials](../../tutorials){target=_blank} help you to create Knowledge Graphs and to use the exploration and consumption features. To get started, we recommend: + + - [Lift tabular sources (CSV, XSLX, JDBC)](/build/lift-data-from-tabular-data-such-as-csv-xslx-or-database-tables/){target=_blank} + - [Active Learning of Linking Rules](../../build/active-learning){target=_blank} + - [Building a customized User Interface](../../explore-and-author/graph-exploration/building-a-customized-user-interface){target=_blank} + - [Populate Data to Neo4j](../../consume/populate-data-to-neo4j){target=_blank} + - [Data in any Format via Custom API](../../consume/provide-data-in-any-format-via-a-custom-api){target=_blank} + +- :material-graph:{ .lg .middle } __BUILD__ + + --- + + _BUILD_ data product pipelines that turn you existing data points into Enterprise Knowledge Graphs. Use them to create data product assembly lines in a visual, intuitive, and business-user friendly way. + + [:octicons-arrow-right-24: Learn more about _Build_](../../build){target=_blank} + +- :material-compass-rose:{ .lg .middle } __EXPLORE__ + + --- + + With _EXPLORE_, you can interact with and visualize your Knowledge Graph data in both list and drill-down views. Configure custom front-end configurations to meet domain-specific needs without duplicating data. + + [:octicons-arrow-right-24: Learn more about _Explore_](/explore-and-author){target=_blank} + +- :material-api:{ .lg .middle } __CONSUME__ + + --- + + The _CONSUME_ tier provides several standard APIs for retrieving data from your Knowledge Graph. We also provide native integrations with [PowerBI](/consume/consuming-graphs-in-power-bi){target=_blank} and [redash](https://redash.io/){target=_blank}.[Custom APIs](../../consume/provide-data-in-any-format-via-a-custom-api/){target=_blank} can be configured to provide data in any format. + + [:octicons-arrow-right-24: Learn more about _Consume_](/consume){target=_blank} + +- :simple-powerautomate:{ .lg .middle } __AUTOMATE__ + + --- + + With _AUTOMATE_, you can easily set up and automate processes in your Knowledge Graph. Our `cmemc` command line tool simplifies the management and migration of data and configurations in Corporate Memory. Learn about our vision of a DataOps process based on Corporate Memory, how to schedule workflows, and how to use variable data inputs. + + [:octicons-arrow-right-24: Learn more about _Automate_](../../automate){target=_blank} + +- :material-account-school:{ .lg .middle } __Training and Certification__ + + --- + + Our Learning Management System includes courses and certifications for different audiences: e.g., business, (linked data) consultants, or DevOps. + + [:octicons-arrow-right-24: register at _eccenca LMS_](https://lms.eccenca.com/){target=_blank} + +- :material-information-variant:{ .lg .middle } __About Corporate Memory__ + + --- + + eccenca's _Corporate Memory_ solution transforms background knowledge about products, processes, partners, people, policies, and data into understandable and executable containers. By automating decisions across hundreds of individual processes, Corporate Memory helps scale the use and reuse of knowledge, increasing the productivity and effectiveness of knowledge workers. This provides a sustainable approach to scaling decision automation and AI governance. + +
diff --git a/docs/getting-started/with-your-sandbox/material.md b/docs/getting-started/with-your-sandbox/material.md new file mode 100644 index 00000000..8f63fbe9 --- /dev/null +++ b/docs/getting-started/with-your-sandbox/material.md @@ -0,0 +1,60 @@ +--- +comments: false +hide: + - toc + - navigation +--- + +# Masterclass - Material and Namespace Suggestions + +A list of materials and resources to reproduce and follow the masterclass (MC). + +!!! info "About Session" + + This masterclass provides the foundation of KG solutions based on the eccenca Corporate Memory platform. The platform covers the full lifecycle of KG applications. Our partners and experts love it for its productivity, ease of use and level of automation in KG creation and evolution. It boosts your abilities to capture, access and re-use knowledge from your organization in a whole new way. Join our tutors to learn about the platform and what it can do in your KG projects. + +
+ +- ## File resources + + --- + + | Type | Name | Resource | + | -------------- | -------------------------- | ------------------------------------------------------------------ | + | Dataset (XLSX) | Hardware Products | [hardware.xlsx](./material/resources/hardware.xlsx){target=_blank} | + | Dataset (CSV) | Service Products | [services.csv](./material/resources/services.csv){target=_blank} | + | Dataset (JSON) | Supplier | [supplier.json](./material/resources/supplier.json){target=_blank} | + | Dataset (XML) | Organizational Information | [orgmap.xml](./material/resources/orgmap.xml){target=_blank} | + | Vocabulary* | Products Vocabulary | [pv.ttl](./material/vocabs/pv.ttl){target=_blank} | + + *) vocabulary already installed, attached for information purposes only. + +- ## Name(space) suggestions + + --- + + | Type | Name | IRI | + | ------------- | ---------------------- | ----------------------------------- | + | Dataset (KG) | MC Prod - Integration | `http://mc.eccenca.com/prod-int/` | + | Dataset (KG) | MC Prod - Hardware | `http://mc.eccenca.com/prod-hw/` | + | Dataset (KG) | MC Prod - Services | `http://mc.eccenca.com/prod-srv/` | + | Dataset (KG) | MC Prod - Supplier | `http://mc.eccenca.com/prod-suppl/` | + | Dataset (KG) | MC Prod - Organization | `http://mc.eccenca.com/prod-org/` | + | Dataset (KG) | MC Prod - Links | `http://mc.eccenca.com/prod-links/` | + | Build Project | MC Product Build Demo | | + +- ## Resource IRI suggestions + + --- + + | Type | IRI | + | ---------------- | -------------------------------------------------------------- | + | Department | `http://mc.eccenca.com/prod-data/dept-{id}` | + | Employee | `http://mc.eccenca.com/prod-data/empl-{email}` | + | Hardware | `http://mc.eccenca.com/prod-data/hw-{id}` | + | Price | `http://mc.eccenca.com/prod-data/price-{parent-id}-{currency}` | + | Product Category | `http://mc.eccenca.com/prod-data/prod-cat-{name|uuid}` | + | Service | `http://mc.eccenca.com/prod-data/srv-{id}` | + | Supplier | `http://mc.eccenca.com/prod-data/suppl-{id}` | + +
diff --git a/docs/getting-started/with-your-sandbox/material/resources/hardware.xlsx b/docs/getting-started/with-your-sandbox/material/resources/hardware.xlsx new file mode 100644 index 00000000..93e2c0eb Binary files /dev/null and b/docs/getting-started/with-your-sandbox/material/resources/hardware.xlsx differ diff --git a/docs/getting-started/with-your-sandbox/material/resources/orgmap.xml b/docs/getting-started/with-your-sandbox/material/resources/orgmap.xml new file mode 100644 index 00000000..43b1a3fc --- /dev/null +++ b/docs/getting-started/with-your-sandbox/material/resources/orgmap.xml @@ -0,0 +1,471 @@ + + + + Thomas.Mueller@company.org + Thomas Mueller +
Karl-Liebknecht-Straße 885, 82003 Tettnang
+ +49-8200-38218301 +
+ + + Corinna.Ludwig@company.org + Corinna Ludwig +
Ringstraße 276
+ +49-1743-24836762 + Memristor, Gauge, Encoder +
+ + Karen.Brant@company.org + Karen Brant +
Friedrichstraße 664, 30805 Willich
+ (00530) 5040048 + Inductor +
+ + Manfred.Foth@company.org + Manfred Foth +
+ + Coil, Transistor, Warp + + + Herr.Haan.Bader@company.org + Herr Haan Bader +
Cologne Ring 674, 99978 Aach
+ (05126) 3204437 + Oscillator +
+ + Karch.Moeller@company.org + Karch Moeller +
+ + Breaker, Crystal, Encoder, Capacitor + + + + + + + + + + + + + + + + + + + Franz.Kornhaeusel@company.org + Franz Kornhaeusel +
+ (02065) 4946239 + + + + Arendt.Beitel@company.org + Arendt Beitel +
Dessauer Ufer 116, 08763 Olpe
+ +49-8763-66514379 + Coil, Sensor, Encoder, Compensator +
+ + Emil.Gotti@company.org + Emil Gotti +
Kurfürstendamm 465, 91702 Meldorf
+ (0101) 854043584 + Inductor +
+ + Berlin.Schulz@company.org + Berlin Schulz +
Schleißheimer Straße 219
+ + Encoder +
+ + Franziska.Acker@company.org + Franziska Acker +
Berliner Straße 428, 50920 Tann
+ (01908) 6892372 + Memristor +
+ + Dieterich.Blau@company.org + Dieterich Blau +
Esplanade 372, 63144 Löwenstein
+ +49-2961-28181571 + Resistor, Breaker +
+ + Xochitl.Aue@company.org + Xochitl Aue +
Bundesautobahn 1387
+ + LCD, Resistor, Crystal, Compensator, Sensor +
+ + Sigmund.Gros@company.org + Sigmund Gros +
Schadowstraße 785
+ (0916) 071777489 + Multiplexer, Potentiometer, Breaker, Meter +
+ + Wanja.Hoffmann@company.org + Wanja Hoffmann +
+ +49-1083-38194095 + Inductor, Oscillator, Compensator, Switch, Meter + + + Adolfina.Hoch@company.org + Adolfina Hoch +
Motzstraße 26, 13611 Gartz
+ +49-109-5719002 + Coil, Breaker, Transducer, Strain, Meter +
+ + Frauke.Faerber@company.org + Frauke Faerber +
Holstenwall 430, 31356 Gießen
+ (01356) 2318280 + LCD, Inductor, Network, Resistor, Crystal +
+ + Ratt.Beyer@company.org + Ratt Beyer +
Elbchaussee 1310, 02276 Werdau
+ +49-2117-55002657 + Potentiometer, Breaker, Transducer +
+ + Jarvis.Jans@company.org + Jarvis Jans +
Palmaille 837
+ (0322) 517636576 + Coil, Potentiometer, Network, Crystal +
+ + + + + + + + + + + + + + + + + + + + Elena.Herzog@company.org + Elena Herzog +
Kirchgasse 806, 76088 Kamen
+ +49-7608-83268331 +
+ + + Gretel.Roth@company.org + Gretel Roth +
Schaumainkai 488
+ +49-9456-94517553 + Sensor, Gauge, Breaker, Warp +
+ + Wolfgang.Martin@company.org + Wolfgang Martin +
+ +49-701-5973041 + Network, Crystal, Meter + + + Nadia.Schubert@company.org + Nadia Schubert +
+ +49-1805-80560374 + Network, Crystal, Warp + + + Rebecca.Hall@company.org + Rebecca Hall +
+ +49-2776-10372538 + Inductor + + + Sylvester.Brant@company.org + Sylvester Brant +
Holstenwall 310, 68139 Aue
+ (08514) 9139423 + Network, Sensor, Strain, Oscillator +
+ + Siglind.Brinkerhoff@company.org + Siglind Brinkerhoff +
+ +49-4855-99936426 + Strain, Compensator, Switch, Resonator, Meter + + + Ratt.Hartmann@company.org + Ratt Hartmann +
Lintgasse 1310, 47063 Oranienburg
+ (00636) 1323749 + LCD, Resonator, Compensator +
+ + Anamchara.Foerstner@company.org + Anamchara Foerstner +
Jüdenstraße 79, 61467 Leonberg
+ +49-360-5655698 + Inductor, Transistor, Sensor, Gauge, Resonator +
+ + Arnelle.Gerber@company.org + Arnelle Gerber +
Konstablerwache 137, 41750 Beelitz
+ (03586) 7240528 + Driver, Transformer, Compensator, Potentiometer, Meter +
+ + + + + + + + + + + + + + + + + + + + Waldtraud.Kuttner@company.org + Waldtraud Kuttner +
+ (08798) 5416209 + + + + Erhard.Fried@company.org + Erhard Fried +
Kaiserhofstraße 484, 13104 Wittenburg
+ +49-400-5290537 + Transistor +
+ + Miles.Amsel@company.org + Miles Amsel +
+ +49-528-8615329 + Multiplexer, Memristor, Gauge + + + Minnie.Kuehn@company.org + Minnie Kuehn +
+ +49-551-5670308 + Transformer, Network, Compensator + + + Heinrich.Hoch@company.org + Heinrich Hoch +
Motzstraße 741, 44446 Glückstadt
+ +49-4446-26033173 + Coil, Gauge, Crystal, Transformer +
+ + Elisabeth.Harman@company.org + Elisabeth Harman +
Lintgasse 338, 66427 Tegernsee
+ +49-4278-55203507 + Coil, Warp +
+ + Herr.Burgh.Eichel@company.org + Herr Burgh Eichel +
Hohe Straße 288, 09116 Hofheim
+ + Coil, Encoder, Breaker, Compensator +
+ + Lili.Geier@company.org + Lili Geier +
Kirchgasse 781, 21956 Neuenhaus
+ (0938) 228702909 + Inductor, Transistor, Compensator, Sensor, Meter +
+ + Kristen.Bauers@company.org + Kristen Bauers +
Colonnaden 721, 44353 Baumholder
+ + Warp +
+ + + + + + + + + + + + + + + + Reiner.Widmann@company.org + Reiner Widmann +
Mönckebergstraße 489, 40885 Dillenburg
+ +49-408-8516878 +
+ + + Ulrik.Denzel@company.org + Ulrik Denzel +
Steintorwall 416, 26077 Baunatal
+ + Strain +
+ + Sabrina.Bayer@company.org + Sabrina Bayer +
+ +49-82-534-91423 + Crystal + + + Baldwin.Guenther@company.org + Baldwin Guenther +
Leopoldstrasse 157, 05861 Münster
+ + Multiplexer, Oscillator +
+ + Marius.Fux@company.org + Marius Fux +
+ +49-73-917-19816 + Resistor, Rheostat, Capacitor, Warp + + + + + + + + + + + + + + + + Dietlinde.Boehme@company.org + Dietlinde Boehme +
Biebricher Allee 880, 65826 Neukalen
+ (06582) 6550636 +
+ + + Valda.Everhart@company.org + Valda Everhart +
+ +49-04-969-14255 + Inductor, Memristor, Transformer, Potentiometer, Resonator + + + Kevin.Feigenbaum@company.org + Kevin Feigenbaum +
+ + Network, Oscillator, Resonator, Encoder + + + Henny.Foth@company.org + Henny Foth +
Kaiserdamm 531, 66812 Dornburg-Camburg
+ (0686) 108701699 + Capacitor +
+ + Liese.Adam@company.org + Liese Adam +
Berliner Straße 773, 28609 Ginsheim-Gustavsburg
+ +49-6092-34516857 + Potentiometer, Crystal, Warp, Sensor, Transducer +
+ + Bert.Blumstein@company.org + Bert Blumstein +
Wilhelmstraße 232, 15114 Königsberg
+ + Compensator +
+ + Baldwin.Dirksen@company.org + Baldwin Dirksen +
Hauptwache 159, 16200 Heppenheim
+ +49-6200-33069465 + Capacitor +
+ + Sabrina.Geiger@company.org + Sabrina Geiger +
+ +49-8295-77923757 + Potentiometer, Compensator + + + Yanka.Schreiber@company.org + Yanka Schreiber +
+ + Rheostat, Breaker + + + Lambert.Faust@company.org + Lambert Faust +
+ (0673) 525930320 + Coil, Breaker, Network, Warp, Transducer + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/getting-started/with-your-sandbox/material/resources/services.csv b/docs/getting-started/with-your-sandbox/material/resources/services.csv new file mode 100644 index 00000000..f96cf0ed --- /dev/null +++ b/docs/getting-started/with-your-sandbox/material/resources/services.csv @@ -0,0 +1,10 @@ +ServiceID,ServiceName,Products,ProductManager,Price +Y704-9764759,Product Analysis,"O491-3823912, I965-1821441, Z655-3173353, U733-5722614, K411-1729714, J725-8697253, J209-5198739, M175-2087039, S859-8143033, D903-5325470, R860-6284767, E465-6674831, Z170-8513315, V759-7427700, G535-8172375, I625-9097378, H338-7439287, F818-8141054, O856-7652159, H915-3627727, G494-2537921, I904-2574215, U958-4696127, H641-1089353, A145-1240844, R302-4754313, J571-5923698, P360-3765415, Q546-7014038, V178-8820348, A181-1118563, M128-9664568, N573-1498086, O212-8971793, J164-5917711, E576-3538706, U723-8910149, Y676-8284278, W176-3285571, J129-5121523, Z288-2722877, L189-7913415, H958-9648652, A909-7626614, K780-7736227, O184-6903943, W846-7438265, W658-9979899, E495-3503010, Q476-3668478, F264-7752472, F969-8946081, C402-5072074, U743-1581581, O537-7333259, Y714-9954664, J544-6748850, C917-9516418, H487-6374164, I395-2294150, K689-4865625, E296-9034321, U501-5365139, I571-8597034, N982-3577798, E189-1255687, R389-4348258, J731-7469427, X407-9945990, V450-8692412, C800-3270129, A688-6056899, T119-8723477, U128-5766392, Z212-3451369, P785-3702584, S702-5472237, C574-6212593, D965-2729258, J391-2253339, K651-4147885, Q187-2944814, L760-6079543, Q210-8168184, H491-2171849, G547-8961166, J154-2269983, E890-4143899, W892-1983772, T914-4676603, E103-2799984, V485-9644250, E815-1132509, A828-3713433, F496-3982542, Y191-7589606, X308-3411861, N462-6714196, Z739-8572107, S271-9518696, M521-8491113, U507-1853778, R410-7957011, Q223-1316238, A599-2465791, M350-8985312, Y185-1184618, Q980-7885274, D483-7794770, M323-1526287, B646-2108570, C844-8161134, E226-4279524, J385-6425761, Q891-1871898, Y162-1430218, Y884-3616085, S388-7116324, D518-3930277, O952-1686669, D516-5106885, F779-9528637, E416-7318916, U990-5234138, D146-5615241, W986-7950553, Y580-9027193, N915-2423517, U367-8732482, H642-6966395, W661-3032609, K671-7410535, O761-2575092, C409-9349178, E958-8187096, H380-8298145, N654-6497636, M662-6209836, U714-9883090, C710-5880579, N180-3300253, Z604-4291151, T147-7011803, H510-3094779, X863-5063447, S429-3352092, B633-4277974, P925-8919074, I893-5009730, J225-9158499, K832-2729798, E529-9160800, V876-7098157, A315-1730287, L262-1109442, Q176-6210359, M253-4759368, P717-5835879, G556-4971578, E358-6492536, Y920-5864778, A225-1988393, D371-6210252, E812-9665212, P965-2818538, I696-9739398, W521-8006606, Q523-3322183, E563-8448172, A998-9941987, B308-8130581, N237-3608803, W457-2405463, B937-9245602, P957-8177638, E354-7057568, H274-5987347, A994-9085459, C898-2055295, G934-5417476, O300-8464663, G625-3606813, N480-3487616, G144-7255154, Z358-5797618, J824-9483042, W156-1748173, C200-5363446, P163-9337479, G223-2092566, A837-2549775, L103-3316729, H439-1697643, P966-3555304, E829-2591611, X874-7370643, E355-4376121, Y695-6135491, N773-8807466, B387-9270009, I242-5347848, M827-2856044, T995-5683542, I980-1040313, U955-7894277, J370-9195708, X230-3586307, U217-4742599, M225-8144152, J653-7148856, T831-2675171, H690-4065164, I314-5607546, C717-1997689, J720-4179367, C858-3557118, I199-7642085, C794-6433363, Y788-9882822, L787-2053792, O311-4466005, S218-3305033, R726-8194447, S877-1860797, Z222-5977620, Z617-4660142, L855-9772914, H676-3055632, P903-7514284, I122-1391097, T792-4232124, R490-4226805, I251-4065887, Z763-7274829, A548-4778785, M292-6646786, P317-3419187, E502-4333702, Y728-2083256, X324-6249454, M703-4614993, C171-3616793, H389-3327633, G625-4620445, H374-8481414, V610-4162567, W358-5750223, S680-6146547, H569-9184293, K334-8882985, B818-8738213, J824-5227925, L592-1084147, K636-3664460, P393-8310950, Y863-3538159, P787-7863897, L781-7008508, E365-4375068, N366-8062929, T592-5377501, C301-4034359, S176-7294665, K898-8238720, G966-6452177, H288-7210201, D519-3521758, G127-3809321, U489-9025040, U827-2294099, L932-9433395, J785-9314350, W981-1196694, T341-6404509, I409-8883822, F773-4598178, N377-1619045, T230-5902294, L485-8083934, L371-9651048, G333-6105148, G272-3422671, D973-4134519, B187-7652875, D215-3449390, X510-5668523, R599-8820686, L586-5133830, I241-8776317, F812-7003324, V892-8476786, O489-4154201, K375-1173149, C182-2689274, T735-5591779, W493-4799721, H402-6061531, S840-8753783, O502-4324008, E938-3071637, N589-9719896, G858-9670227, V571-2893837, B436-6020212, L747-7633290, T161-7769514, R187-6602262, R228-5965688, E971-2487589, K479-8347265, K473-9950981, M645-5460777, C721-7900144, A566-1562523, A595-2446575, W268-8954866, R591-4930195, G439-8153345, J628-3649699, W501-5990901, H972-9616381, J628-9483622, I892-8435352, Y632-7948469, S590-1665348, P174-7697886, G444-8036184, X602-2515162, P870-6495639, M205-1376206, E471-9316820, J234-3498557, Q248-7597886, I334-4449270, L741-9253790, S113-2439377, Z293-3675192, W917-2544526, X842-8356738, P516-8211068, X663-2500265, J769-7213127, B918-9468392, E373-8515317, R506-1245812, Z927-4746244, S874-6150679, G144-5498082, A403-4549719, E917-4866901, V421-9533599, X517-5656435, N687-2334901, N451-6994769, H745-5284103",Lambert.Faust@company.org,"748,40 EUR" +I241-8776317,Component Confabulation,"Z249-1364492, L557-1467804, C721-7900144, Z604-4291151, W358-5750223, V156-6277722, H752-8461936, Y557-7149751, W903-2104201, N480-3487616, P925-8919074, M449-5231838, N462-6714196, M672-3016632, T504-8448784, T941-8766844",Corinna.Ludwig@company.org,"1082,00 EUR" +D215-3449390,Manual Inspection,"K288-9703549, Z367-7507010, N709-2262876, T341-6404509, I965-1821441, H482-4970770, H609-2196524, N704-3896920, E815-1132509, G625-3606813, I966-3317124, N480-3487616, F146-1429118, A828-3713433, X283-7840276, O787-2734023, Q694-8417409, G144-7255154, N377-1619045, K542-2074800, X408-2200602, K411-1729714, W830-6681347, L371-9651048, T769-2350399, J505-2473322, O270-3409076, D642-3058791, X308-3411861, G226-1299624, C119-5354812, G333-6105148, M914-2979544, Q245-9575444, W615-3080767, J519-7020928, R771-3893828, D973-4134519, D334-6681399, E465-6674831, D215-3449390, H631-9376983, R410-7957011, T586-1678071, Q514-9410667, M350-8985312, V488-1866672, F812-7003324, R272-9406400, O553-6585255, Q442-2123335, T958-2055544, O856-7652159, T274-5886301, Q751-8742744, M323-1526287, W493-4799721, G261-8681976, R658-8902629, F735-3322876, Y616-2122188, K313-8452822, R774-2450170, U955-7894277, R302-4754313, X897-7676293, V571-2893837, O906-8511345, V284-9786067, Y167-8599364, T151-7042410, G251-8414984, H962-4715431, J498-2858887, D518-3930277, M225-8144152, J653-7148856, P360-3765415, R181-9365849, L316-4863597, V178-8820348, J259-5185660, N664-8476091, V156-6277722, J625-3464908, Y966-2972645, S480-3531134, C633-6541408, Q986-9996088, O531-4282131, M206-5050706, H577-3512936, I327-6567979, C213-4995667, I482-3778442, A595-2446575, I503-2217600, S321-8453459, T806-6069877, W268-8954866, E416-7318916, C858-3557118, B429-3694560, D146-5615241, J734-1368842, W986-7950553, Z254-1002324, K559-3177627, O125-6715778, N558-1730215, O212-8971793, J164-5917711, U379-6681071, H236-9180061, Y580-9027193, Y676-8284278, Q627-3868402, R774-3816629, Z165-5413714, V940-2277346, N171-1815828, I892-8435352, I272-3912947, K671-7410535, H973-6742173, K739-4867689, N869-4606944, Q774-7287508, I479-8852507, O761-2575092, C409-9349178, L855-9772914, M662-6209836, U714-9883090, H634-7337115, D160-4387774, X602-2515162, C625-4647902, D400-2425852, P903-7514284, T973-5442896, O204-4321819, Z768-8346288, N744-5971232, E424-4700158, Q661-7217088, G249-4926490, A166-3766336, Q516-8248086, K995-8098017, Q890-8785073, B820-6334766, F565-7076382, M400-3382615, X643-1063819, K968-2682119, A529-2906246, K267-2045349, D729-5737042, X863-5063447, R454-6248815, Z763-7274829, R298-1578179, O537-7333259, D243-3238752, X365-6429727, F442-1761220, C917-9516418, Y194-2779293, D975-3237312, V436-9027098, E529-9160800, V876-7098157, R481-9898984, B625-4480024, A315-1730287, U501-5365139, L691-1489542, X324-6249454, F383-6450755, C171-3616793, P982-4384687, H374-8481414, C799-8367143, M253-4759368, L205-6345377, W358-5750223, G556-4971578, N823-7028680, V509-7873455, I334-4449270, K334-8882985, G812-4734922, T814-8858070, E652-6887116, Y134-8040496, V450-8692412, I409-8215134, F251-2666285, R383-8831143, S113-2439377, A932-9527078, X842-8356738, P901-7842562, U967-6553099, R477-9013874, B365-4394675, P393-8310950, Q992-9818584, D206-3028092, T119-8723477, L536-5185541, E395-9906117, W295-9452529, J769-7213127, R586-3728998, M449-5231838, E813-9861759, X663-2500265, Z739-3332146, N269-8309461, C301-4034359, Y968-9133870, X946-6308579, R506-1245812, B150-4370781, T725-1852362, Z927-4746244, P602-5728865, A225-1988393, O494-6195301, Q263-2186291, M244-7026376, U681-7406159, E917-4866901, V421-9533599, X480-1491345, Y553-3929384, W872-7508740, V600-6144297, D519-3521758, L760-6079543, X204-1803083, H605-1270029, N694-7625752, Z397-1183067, B308-8130581, E469-1218832, N237-3608803, H426-2605604, N451-6994769, H274-5987347, J785-9314350, E890-4143899, W892-1983772, T914-4676603",Ida.Halle@company.org,"1709,54 EUR" +P925-8919074,Predictive Maintenance,"F344-7012314, O712-3456018, O491-3823912, N709-2262876, H502-2553729, M901-8670057, P983-2994865, I264-7314323, L816-8238278, E709-4829800, O300-8464663, X954-5873970, P228-7323906, V485-9644250, G625-3606813, F773-4598178, A828-3713433, O787-2734023, Q694-8417409, X408-2200602, C247-3833661, U614-3483402, Z887-4941382, N673-7692368, W615-3080767, B888-3582334, G223-2092566, F179-4094930, E465-6674831, X510-5668523, R725-9753976, X223-5282026, H267-1492366, P729-6290809, M350-8985312, V488-1866672, T721-4459242, B688-8088841, O856-7652159, X235-5406274, X874-7370643, E355-4376121, Z980-8040792, U229-5087557, G494-2537921, J781-8212433, J872-7568181, G261-8681976, C844-8161134, W493-4799721, F735-3322876, A981-3634031, S840-8753783, X502-7135246, B387-9270009, Y616-2122188, K313-8452822, D381-6342696, Z556-4824310, I242-5347848, I980-1040313, N451-2350273, U955-7894277, Y557-7149751, X897-7676293, V571-2893837, Y167-8599364, T151-7042410, J856-1304399, J370-9195708, G251-8414984, M133-5945489, C371-9169438, X230-3586307, T808-9704137, B926-8983325, V156-6277722, V178-8820348, L316-4863597, J178-7002767, M522-9124638, L805-3283253, C633-6541408, O531-4282131, K479-8347265, C245-8365837, O748-4307356, I327-6567979, I482-3778442, C213-4995667, M128-9664568, P577-5587693, E416-7318916, C858-3557118, W268-8954866, B429-3694560, R414-3098561, D844-3535311, D599-6113892, C845-4085909, K559-3177627, M770-3602005, O125-6715778, Q568-8156489, Y889-4226936, S531-7887299, W501-5990901, B741-3218460, Y676-8284278, U367-8732482, J859-3337215, R112-2955867, O311-4466005, D548-3561584, K845-4116844, R944-4832283, O662-4012383, H956-3958783, P395-9316579, D764-9088510, L984-7886943, P774-3681449, A628-8869626, H958-9648652, S424-4152456, E424-4700158, A909-7626614, T147-7011803, H173-1200706, I122-1391097, J470-3164222, Q672-2667601, B232-9941304, A166-3766336, W658-9979899, P472-9724615, Q516-8248086, E495-3503010, V654-5789502, X643-1063819, U743-1581581, R490-4226805, I251-4065887, B633-4277974, R298-1578179, V673-7881809, L619-5092078, U281-1671869, N206-9059859, I893-5009730, A548-4778785, J225-9158499, K832-2729798, J878-7667870, P385-1200138, U861-6382993, V876-7098157, U501-5365139, E502-4333702, L691-1489542, T291-4144066, K764-8378288, B934-4668099, H389-3327633, I571-8597034, G625-4620445, C744-6535902, K242-3459162, V610-4162567, Y354-7075426, G556-4971578, Q248-7597886, H569-9184293, K334-8882985, E652-6887116, E737-8373948, O727-5999075, X407-9945990, I409-8215134, O875-5580798, F251-2666285, V519-6173906, A932-9527078, T941-8766844, A688-6056899, L592-1084147, X842-8356738, K636-3664460, N105-3985051, A560-7347187, V285-7238338, U333-8518360, L827-5554014, L536-5185541, F797-8658626, Z775-8853334, N998-2489600, E373-8515317, C402-4354819, E365-4375068, E585-3605747, F661-8988230, X989-6385984, C301-4034359, Y968-9133870, S176-7294665, W769-8151254, P785-3702584, U318-1465198, Q263-2186291, L365-6842646, A403-4549719, N568-8608034, M436-2993715, S212-6028302, K651-4147885, X342-6389543, F326-8777433, I590-4406621, U286-4664935, Y553-3929384, X517-5656435, K662-1238230, E563-8448172, O636-3428529, X204-1803083, N687-2334901, Q210-8168184, H491-2171849, B308-8130581, W457-2405463, B488-6957957, T348-1607769, C440-1370895, G547-8961166, J154-2269983, B937-9245602, M627-4661911, M774-4843227, J785-9314350, P957-8177638",Baldwin.Guenther@company.org,"778,15 EUR" +P516-8211068,IoT Data Marketing,"O491-3823912, I965-1821441, F559-6763700, T872-6914723, O857-5463957, H664-9736043, W830-6681347, J505-2473322, S450-5654221, C119-5354812, M175-2087039, Z887-4941382, W615-3080767, R771-3893828, Z170-8513315, E585-4643170, Y788-8477334, J884-3242067, H915-3627727, G494-2537921, I904-2574215, A981-3634031, H641-1089353, Y616-2122188, Z452-1805723, A145-1240844, D762-3837218, N451-2350273, U389-9635839, Z553-4314789, L748-3922794, R181-9365849, G694-2879694, J178-7002767, S480-3531134, Q986-9996088, I327-6567979, C213-4995667, M128-9664568, P253-1288849, K559-3177627, C697-6765940, U723-8910149, W176-3285571, I272-3912947, V887-9194738, L189-7913415, P395-9316579, R902-1645052, N607-6979614, E172-7848498, O204-4321819, S424-4152456, N832-1055352, A909-7626614, Q661-7217088, W847-4354260, K367-1320550, K995-8098017, Q476-3668478, C402-5072074, S314-3937138, F204-7999856, G826-1197003, O537-7333259, V645-2413888, C917-9516418, I395-2294150, E296-9034321, U501-5365139, J518-7067023, D690-6928884, P323-7286189, C744-6535902, N982-3577798, C551-8482722, T732-3194846, G812-4734922, J731-7469427, X407-9945990, V450-8692412, W434-6067873, C800-3270129, S100-7238368, Q992-9818584, L536-5185541, E395-9906117, E813-9861759, Z775-8853334, U128-5766392, X946-6308579, S702-5472237, C375-1115425, S649-2935217, L365-6842646, D627-4615108, M558-2275045, K651-4147885, Q187-2944814, L760-6079543, O636-3428529, H426-2605604, J154-2269983, W903-2104201, B519-3674576, E890-4143899, Z249-1364492, L569-8145670, Z367-7507010, B143-5457756, L816-8238278, E709-4829800, E815-1132509, M974-1997588, A828-3713433, X283-7840276, Z358-9013730, Z518-1747933, B888-3582334, P989-7962038, Z739-8572107, S271-9518696, I653-5994473, U507-1853778, M521-8491113, A599-2465791, R524-4869682, V488-1866672, L792-8374906, X235-5406274, G420-6271055, B646-2108570, J872-7568181, E226-4279524, J385-6425761, F266-5876962, K313-8452822, G346-2864946, K630-6895992, R774-2450170, Y557-7149751, I468-8034393, J498-2858887, S388-7116324, W579-1877166, C633-6541408, F779-9528637, O748-4307356, P577-5587693, J734-1368842, Y728-5119478, Q568-8156489, N558-1730215, Y274-1029755, U367-8732482, N171-1815828, P528-2149873, R112-2955867, W661-3032609, O761-2575092, O662-4012383, E246-3200290, E958-8187096, U169-4232721, U714-9883090, C710-5880579, M810-8954183, N463-8050264, F424-2241578, H754-2495350, C836-5221890, Z604-4291151, T147-7011803, M805-4248390, F565-7076382, M400-3382615, D525-4805979, E162-5553215, S429-3352092, B633-4277974, R298-1578179, A464-7310986, I311-9589498, M986-2342719, N206-9059859, D194-9594371, J225-9158499, E529-9160800, G378-7132339, A315-1730287, T291-4144066, M253-4759368, P717-5835879, Y354-7075426, W177-1965331, V519-6173906, Y979-3662601, N105-3985051, B693-5414825, D206-3028092, T812-6060686, R930-5997475, E660-5579477, W769-8151254, E812-9665212, U681-7406159, A998-9941987, B308-8130581, B937-9245602, F332-3707903, W295-9452529, C898-2055295, T608-9573692, G934-5417476, H482-4970770, B120-9942467, G144-7255154, C247-3833661, J824-9483042, W156-1748173, P163-9337479, G223-2092566, A837-2549775, X223-5282026, L103-3316729, W344-5163065, U229-5087557, Y695-6135491, N773-8807466, E558-1962104, B387-9270009, I242-5347848, U955-7894277, J370-9195708, C371-9169438, M225-8144152, J653-7148856, E835-1316991, V104-2082346, M522-9124638, J720-4179367, C858-3557118, O256-6180697, M770-3602005, V940-2277346, O311-4466005, K845-4116844, S877-1860797, N881-4812973, H676-3055632, M650-8586992, P903-7514284, N744-5971232, G249-4926490, K353-7420061, I122-1391097, X643-1063819, N317-6012752, C527-6179790, R490-4226805, A755-9228475, D243-3238752, E952-1325145, Q493-2919102, A769-5120124, R481-9898984, F383-6450755, X324-6249454, H389-3327633, H374-8481414, Z646-5864967, C699-1385746, L205-6345377, F525-2265345, K334-8882985, C977-9932879, Z272-2955088, O875-5580798, T941-8766844, K636-3664460, R477-9013874, U772-6050161, N269-8309461, F661-8988230, W697-5712939, C301-4034359, M605-5951566, S176-7294665, K898-8238720, M244-7026376, N243-4639047, D519-3521758, W985-1612943, U827-2294099, L932-9433395, R247-6538517, J785-9314350, G205-5318100, T341-6404509, F773-4598178, R786-6586508, N377-1619045, T230-5902294, V437-5667353, G333-6105148, D973-4134519, C605-1105328, H267-1492366, H252-2977732, H631-9376983, R599-8820686, P729-6290809, T586-1678071, U623-2779596, V892-8476786, O553-6585255, S841-8644004, B523-5464510, G179-6566342, C182-2689274, K375-1173149, W493-4799721, H402-6061531, X502-7135246, N324-9642439, Z556-4824310, O502-4324008, A739-4780210, G858-9670227, X897-7676293, B436-6020212, L747-7633290, T161-7769514, L316-4863597, W821-9428247, P844-4114854, Y505-9919340, N478-8857002, M645-5460777, C721-7900144, U889-6360502, G439-8153345, H660-6112027, H236-9180061, V999-1676345, Q627-3868402, J628-9483622, I892-8435352, W744-1785439, N869-4606944, T802-5361374, P174-7697886, G444-8036184, Z319-4514647, T973-5442896, A607-3251492, Z768-8346288, E471-9316820, N583-9253059, Z288-2942538, J820-7132026, T381-5661009, J878-7667870, P385-1200138, K167-1377420, U861-6382993, S174-1960652, J234-3498557, K199-8327732, E737-8373948, O727-5999075, Z293-3675192, P516-8211068, X663-2500265, B918-9468392, E373-8515317, U836-7709298, X148-3354774, Y968-9133870, V382-3883746, G144-5498082, A243-3332548, X504-5674380, E917-4866901, Y553-3929384, D603-1225899, X204-1803083, N687-2334901, N451-6994769",Henny.Foth@company.org,"1162,32 EUR" +N558-1730215,Sensor Adjustment,"F344-7012314, K288-9703549, Q594-6895704, L433-1376544, O491-3823912, G934-5417476, M901-8670057, V485-9644250, H502-2553729, L816-8238278, I966-3317124, O857-5463957, A964-7949458, U733-5722614, H664-9736043, Z518-1747933, K411-1729714, Y117-1025328, L371-9651048, L557-1467804, Y191-7589606, U614-3483402, G333-6105148, O270-3409076, G226-1299624, N673-7692368, B888-3582334, N462-6714196, E172-8066897, X223-5282026, D215-3449390, C605-1105328, G535-8172375, X510-5668523, V759-7427700, E465-6674831, I653-5994473, H631-9376983, L103-3316729, C614-4108640, Y299-9772513, I625-9097378, X215-2461803, F812-7003324, T721-4459242, T504-8448784, E829-2591611, V787-2710358, Y467-5818685, E355-4376121, K375-1173149, W529-7595129, H747-8053953, P913-2073572, Q751-8742744, G494-2537921, Y695-6135491, T735-5591779, H402-6061531, G261-8681976, H598-5149929, N324-9642439, N137-2655981, Y162-1430218, M827-2856044, E267-7496794, O502-4324008, E938-3071637, C970-6304679, N589-9719896, G858-9670227, D544-9061559, M672-3016632, J420-5667802, X234-5007377, D331-6211280, X230-3586307, U217-4742599, W988-3702091, B541-8783084, R181-9365849, J986-8306638, L316-4863597, H690-4065164, G694-2879694, Y966-2972645, C633-6541408, Q986-9996088, C245-8365837, F779-9528637, I314-5607546, Z872-5435339, D915-4717890, M128-9664568, E416-7318916, U889-6360502, W986-7950553, C845-4085909, Q189-5857908, J734-1368842, Y274-1029755, Q568-8156489, Y728-5119478, C390-4121800, H660-6112027, J164-5917711, Z170-8513315, N915-2423517, U723-8910149, W726-4190110, Q627-3868402, J628-9483622, H642-6966395, Q852-7359409, K481-3281345, V940-2277346, I272-3912947, K671-7410535, O761-2575092, K845-4116844, R944-4832283, F574-4728030, E958-8187096, F553-8518538, Z889-8463159, U714-9883090, V881-4674578, D160-4387774, U651-8669022, K780-7736227, H173-1200706, F800-9858235, M205-1376206, W846-7438265, W847-4354260, Q890-8785073, F565-7076382, M400-3382615, R135-6598379, T792-4232124, Y914-2603866, N778-8753186, F204-7999856, E162-5553215, D525-4805979, U743-1581581, G840-8611458, A755-9228475, B633-4277974, Z288-2942538, V303-8717097, Q861-1618446, J820-7132026, C917-9516418, K689-4865625, K167-1377420, U861-6382993, V876-7098157, A315-1730287, R481-9898984, E502-4333702, L691-1489542, F383-6450755, B934-4668099, K242-3459162, P717-5835879, L205-6345377, C831-2580759, K334-8882985, H569-9184293, R389-4348258, J731-7469427, E652-6887116, Z272-2955088, X407-9945990, V450-8692412, Z293-3675192, P516-8211068, S100-7238368, X716-6172862, W776-4360677, B693-5414825, C431-5986267, T119-8723477, M812-1436368, J769-7213127, B918-9468392, X148-3354774, C402-4354819, U128-5766392, M605-5951566, Y968-9133870, S176-7294665, R506-1245812, W769-8151254, W780-8057984, T725-1852362, G144-5498082, A225-1988393, D371-6210252, D627-4615108, N568-8608034, J555-1586043, M558-2275045, C574-6212593, J391-2253339, G966-6452177, W872-7508740, N243-4639047, O636-3428529, L760-6079543, J154-2269983, G547-8961166, E354-7057568, X620-7792033, J785-9314350, W892-1983772",Ulrik.Denzel@company.org,"1125,21 EUR" +Y274-1029755,Industry-Grade Hacking,"I965-1821441, F559-6763700, F146-1429118, O787-2734023, K411-1729714, J505-2473322, F388-7030185, B286-1369879, R771-3893828, R860-6284767, D334-6681399, E465-6674831, Z170-8513315, V759-7427700, C614-4108640, M750-1800450, H338-7439287, Q442-2123335, O856-7652159, Q751-8742744, I904-2574215, H641-1089353, Y616-2122188, Z452-1805723, D762-3837218, I532-1549244, J571-5923698, Y167-8599364, H197-3970480, Z553-4314789, R181-9365849, A181-1118563, G694-2879694, S480-3531134, I327-6567979, C213-4995667, M128-9664568, C845-4085909, N866-6363347, J164-5917711, W176-3285571, Y676-8284278, U723-8910149, J859-3337215, H973-6742173, V887-9194738, O203-5447809, Q316-9683240, U619-9969216, Q696-9337626, E424-4700158, Q661-7217088, B232-9941304, E495-3503010, K995-8098017, Q476-3668478, F969-8946081, S314-3937138, O537-7333259, Y714-9954664, V645-2413888, C917-9516418, I395-2294150, E296-9034321, I571-8597034, P323-7286189, N982-3577798, C551-8482722, T732-3194846, T814-8858070, X407-9945990, S418-2584457, A816-3021832, S439-3814007, T119-8723477, L536-5185541, E813-9861759, U128-5766392, T725-1852362, S702-5472237, C375-1115425, O494-6195301, D627-4615108, M558-2275045, C574-6212593, B888-7564557, Q210-8168184, J154-2269983, C440-1370895, B519-3674576, E890-4143899, W892-1983772, T914-4676603, B143-5457756, V485-9644250, L816-8238278, M974-1997588, S871-7304748, X283-7840276, Z518-1747933, T769-2350399, L557-1467804, Y191-7589606, P989-7962038, M521-8491113, H355-1126195, Q223-1316238, A599-2465791, Y185-1184618, L792-8374906, X235-5406274, D483-7794770, J575-3390923, R862-8479315, E617-6594892, U360-2815908, B646-2108570, J872-7568181, J385-6425761, D516-5106885, F779-9528637, P577-5587693, U990-5234138, B429-3694560, U367-8732482, R774-3816629, Z165-5413714, J671-5760255, P528-2149873, E246-3200290, U169-4232721, Z889-8463159, U714-9883090, C710-5880579, M810-8954183, N463-8050264, D400-2425852, C836-5221890, P472-9724615, F565-7076382, K267-2045349, E162-5553215, H510-3094779, X863-5063447, B633-4277974, D817-8084362, I893-5009730, G378-7132339, V876-7098157, A315-1730287, T291-4144066, J178-5863159, Y354-7075426, Y979-3662601, M812-1436368, Z739-3332146, E660-5579477, Z848-4991684, Y920-5864778, D371-6210252, E812-9665212, P965-2818538, U681-7406159, I696-9739398, D679-1940878, I590-4406621, Q523-3322183, E563-8448172, Z397-1183067, A998-9941987, W457-2405463, A994-9085459, P957-8177638, E354-7057568, H274-5987347, W295-9452529, H388-1193255, F344-7012314, K288-9703549, P228-7323906, B120-9942467, K542-2074800, Y372-1509836, X408-2200602, J824-9483042, C200-5363446, G223-2092566, L275-4377274, T504-8448784, X874-7370643, T274-5886301, Z980-8040792, E355-4376121, N773-8807466, Z439-5790785, V284-9786067, M672-3016632, Z545-6121719, T831-2675171, J625-3464908, H690-4065164, J720-4179367, O256-6180697, I199-7642085, C390-4121800, Y788-9882822, Z615-8618743, O311-4466005, R726-8194447, W988-9267091, N881-4812973, H676-3055632, N744-5971232, I122-1391097, H752-8461936, Q516-8248086, X643-1063819, E952-1325145, M292-6646786, Y728-2083256, K764-8378288, H374-8481414, C799-8367143, W358-5750223, B161-8326597, K334-8882985, P360-3533771, E793-4560979, N324-6810821, L592-1084147, K636-3664460, X716-6172862, A560-7347187, P393-8310950, Q951-7651773, L781-7008508, C402-4354819, F661-8988230, W697-5712939, C301-4034359, M244-7026376, N568-8608034, F326-8777433, H288-7210201, D519-3521758, U489-9025040, L932-9433395, M650-3458375, I264-7314323, I409-8883822, F773-4598178, G403-4566802, R786-6586508, T230-5902294, G333-6105148, O270-3409076, D973-4134519, B187-7652875, E172-8066897, F179-4094930, X510-5668523, C605-1105328, H252-2977732, P708-1537318, Y299-9772513, V892-8476786, O553-6585255, O489-4154201, H747-8053953, I884-8763759, H598-5149929, X502-7135246, Z556-4824310, O502-4324008, X897-7676293, Z373-9393076, B541-8783084, R228-5965688, E971-2487589, K479-8347265, C721-7900144, W268-8954866, R591-4930195, G439-8153345, H660-6112027, H236-9180061, K143-3113342, W744-1785439, N869-4606944, V283-8186620, H747-8390476, Z768-8346288, A529-2906246, G840-8611458, U281-1671869, J820-7132026, Y194-2779293, U861-6382993, S174-1960652, T294-9722443, I334-4449270, L741-9253790, Z293-3675192, M361-5073440, P901-7842562, W776-4360677, L827-5554014, X663-2500265, J769-7213127, M449-5231838, X148-3354774, E373-8515317, Y968-9133870, R506-1245812, Z927-4746244, A243-3332548, S874-6150679, G144-5498082, Q263-2186291, A403-4549719, V421-9533599, M721-8978045, N560-4369045, X480-1491345, F198-1414890, R946-7112528, D603-1225899, A360-3041803, N687-2334901, B825-7596233",Wolfgang.Martin@company.org,"1008,28 EUR" +U360-2815908,Enterprise Navigation,"T608-9573692, L816-8238278, I409-8883822, M974-1997588, N704-3896920, S871-7304748, A964-7949458, R786-6586508, T230-5902294, X408-2200602, F496-3982542, T769-2350399, S859-8143033, J824-9483042, C200-5363446, J519-7020928, H252-2977732, U507-1853778, H941-5264433, D605-8095260, H338-7439287, T721-4459242, Q442-2123335, O553-6585255, O856-7652159, F611-6226129, V787-2710358, T274-5886301, W529-7595129, M323-1526287, I904-2574215, J781-8212433, J872-7568181, J437-7431991, F735-3322876, K313-8452822, G346-2864946, N137-2655981, K630-6895992, C770-9751514, O502-4324008, O944-9764063, R302-4754313, M133-5945489, T808-9704137, A181-1118563, G694-2879694, C717-1997689, T806-6069877, D146-5615241, M770-3602005, Y728-5119478, H660-6112027, Z165-5413714, J628-9483622, I272-3912947, Y632-7948469, R726-8194447, Z222-5977620, Z617-4660142, N654-6497636, H634-7337115, N744-5971232, G249-4926490, M205-1376206, Q672-2667601, M400-3382615, F969-8946081, D525-4805979, S314-3937138, Z322-3336300, D729-5737042, A548-4778785, K832-2729798, J878-7667870, K689-4865625, E296-9034321, Y728-2083256, F383-6450755, D690-6928884, T294-9722443, P982-4384687, G625-4620445, T732-3194846, F525-2265345, Q248-7597886, J731-7469427, X716-6172862, Q992-9818584, D237-6587630, N998-2489600, E365-4375068, E373-8515317, E358-6492536, R506-1245812, B150-4370781, L365-6842646, C574-6212593, N560-4369045, C440-1370895, L932-9433395, J785-9314350, T914-4676603",Baldwin.Dirksen@company.org,"1366,11 EUR" +O662-4012383,Involuntary Service,"F344-7012314, K288-9703549, T608-9573692, N709-2262876, G934-5417476, X954-5873970, B120-9942467, K850-3410875, N480-3487616, F146-1429118, X283-7840276, A964-7949458, N377-1619045, C247-3833661, U614-3483402, J209-5198739, G226-1299624, W156-1748173, J519-7020928, N673-7692368, R860-6284767, B888-3582334, E172-8066897, F179-4094930, C605-1105328, P729-6290809, L103-3316729, L275-4377274, R410-7957011, P966-3555304, Y299-9772513, R524-4869682, F812-7003324, T721-4459242, O553-6585255, B688-8088841, T958-2055544, F818-8141054, G420-6271055, Y467-5818685, G179-6566342, T274-5886301, W529-7595129, B646-2108570, N773-8807466, J872-7568181, G261-8681976, C844-8161134, J437-7431991, E558-1962104, R658-8902629, E226-4279524, Y616-2122188, Z452-1805723, N137-2655981, I242-5347848, N451-2350273, O944-9764063, T151-7042410, L747-7633290, J856-1304399, R228-5965688, W821-9428247, J625-3464908, N664-8476091, H690-4065164, Y966-2972645, P844-4114854, M206-5050706, O531-4282131, M128-9664568, E416-7318916, D146-5615241, D844-3535311, J734-1368842, G439-8153345, O212-8971793, J164-5917711, N915-2423517, B741-3218460, W726-4190110, Q627-3868402, H642-6966395, M313-3585673, I892-8435352, P528-2149873, O311-4466005, W744-1785439, K671-7410535, D548-3561584, R944-4832283, Q774-7287508, C409-9349178, V283-8186620, O203-5447809, N654-6497636, Z889-8463159, D764-9088510, H676-3055632, R902-1645052, D160-4387774, N607-6979614, C625-4647902, D400-2425852, U651-8669022, Q696-9337626, E424-4700158, A909-7626614, Q661-7217088, T147-7011803, I122-1391097, W847-4354260, T805-4210259, A166-3766336, K995-8098017, Q476-3668478, M400-3382615, X643-1063819, Y914-2603866, S314-3937138, Z322-3336300, K267-2045349, H510-3094779, F204-7999856, U743-1581581, A755-9228475, O626-4153303, A548-4778785, Z994-6661823, I395-2294150, A769-5120124, V876-7098157, S915-2398244, J518-7067023, S174-1960652, Y728-2083256, M703-4614993, K764-8378288, B934-4668099, C171-3616793, P323-7286189, E189-1255687, Y354-7075426, W358-5750223, F525-2265345, I334-4449270, B161-8326597, G812-4734922, E737-8373948, S439-3814007, T941-8766844, N892-9855685, P516-8211068, N105-3985051, C431-5986267, Z775-8853334, E813-9861759, R586-3728998, E373-8515317, C402-4354819, T592-5377501, E358-6492536, Z212-3451369, T725-1852362, Q353-5311148, E812-9665212, L365-6842646, N568-8608034, P965-2818538, J555-1586043, N560-4369045, X342-6389543, L374-3374767, Q523-3322183, Q187-2944814, R946-7112528, E563-8448172, O636-3428529, A998-9941987, B308-8130581, U489-9025040, G127-3809321, R247-6538517, A994-9085459, B937-9245602, H274-5987347",Lambert.Faust@company.org,"1619,22 EUR" diff --git a/docs/getting-started/with-your-sandbox/material/resources/supplier.json b/docs/getting-started/with-your-sandbox/material/resources/supplier.json new file mode 100644 index 00000000..74b76714 --- /dev/null +++ b/docs/getting-started/with-your-sandbox/material/resources/supplier.json @@ -0,0 +1,1752 @@ +[ + { + "id": "f2db56ae-0856-4a72-a5a1-497f97e728e5", + "supplier": "Santiago-Gardner", + "city": "Rāipur", + "country": "Bangladesh", + "country_code": "BD" + }, + { + "id": "3f0439ac-320f-4d70-b9a4-2fef9281ff49", + "supplier": "Baker, Medina and George", + "city": "Kuopio", + "country": "Finland", + "country_code": "FI" + }, + { + "id": "dff64a17-e085-4289-9196-a1e7ae8b0c22", + "supplier": "Curtis, Perkins and Sims", + "city": "Norristown", + "country": "United States", + "country_code": "US" + }, + { + "id": "816e4baa-8158-4e2a-8ff4-c9f969998389", + "supplier": "Anderson Ltd", + "city": "Payson", + "country": "United States", + "country_code": "US" + }, + { + "id": "ac3591e8-16d9-4c35-a73e-7ee8466155c6", + "supplier": "Rodriguez-Warren", + "city": "Nikol’skoye", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "64902ce8-7950-458e-bcee-5df3cabc7972", + "supplier": "Manning, Hodges and Mckenzie", + "city": "Marche-en-Famenne", + "country": "Belgium", + "country_code": "BE" + }, + { + "id": "9484418b-c487-4050-9094-050f3bab0817", + "supplier": "Fleming Inc", + "city": "Sant Pere de Ribes", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "7f0c3d05-f16c-44c0-b9f4-5ff9d2892270", + "supplier": "Brown, Torres and Bautista", + "city": "Kishorganj", + "country": "Bangladesh", + "country_code": "BD" + }, + { + "id": "afa65b2a-f046-47f4-b352-97b579c77c21", + "supplier": "Collins and Sons", + "city": "Randolph", + "country": "United States", + "country_code": "US" + }, + { + "id": "e27932a5-487a-4eca-9f9a-d82d5e5c467b", + "supplier": "Li-Gonzalez", + "city": "Bais", + "country": "Philippines", + "country_code": "PH" + }, + { + "id": "f7a4c865-f6d4-4896-bc48-e5ec6b2bf283", + "supplier": "Todd-Mcneil", + "city": "Fukagawa", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "95881d4c-8788-46b1-948f-8b359464556d", + "supplier": "Cervantes, Wagner and Jackson", + "city": "Boedo", + "country": "Argentina", + "country_code": "AR" + }, + { + "id": "29cf8eca-50be-460e-9816-5ae505fc9491", + "supplier": "Fernandez-Roberts", + "city": "Harlingen", + "country": "United States", + "country_code": "US" + }, + { + "id": "4b796fba-c152-4137-b01d-fce80aef6e3c", + "supplier": "Gomez Inc", + "city": "Huddersfield", + "country": "United Kingdom", + "country_code": "GB" + }, + { + "id": "7c930e8b-b9f3-450a-856b-5e03c6b3965e", + "supplier": "Wright Inc", + "city": "Laramie", + "country": "United States", + "country_code": "US" + }, + { + "id": "445081d6-305c-4fb7-b89e-82c86969d4bd", + "supplier": "Adkins, Lopez and Boyd", + "city": "Kriens", + "country": "Switzerland", + "country_code": "CH" + }, + { + "id": "d0c9f303-04ac-44b3-9cbc-afed50b7a260", + "supplier": "Thompson Ltd", + "city": "Krishnarājpet", + "country": "India", + "country_code": "IN" + }, + { + "id": "701e751f-51dc-482f-86d5-544b4af40076", + "supplier": "Marsh, Cunningham and Hill", + "city": "Allauch", + "country": "France", + "country_code": "FR" + }, + { + "id": "6746c17d-5e49-47bc-82a1-90ac0c7aa01c", + "supplier": "Buchanan Group", + "city": "Jeongeup", + "country": "Korea, Republic of", + "country_code": "KR" + }, + { + "id": "6ca36744-76bd-47bd-b4fd-6319ed8c87c7", + "supplier": "Knight PLC", + "city": "Deoli", + "country": "India", + "country_code": "IN" + }, + { + "id": "79274f67-b225-49fa-ad8c-fb20560cb1d5", + "supplier": "Barrera Inc", + "city": "Ho", + "country": "Ghana", + "country_code": "GH" + }, + { + "id": "a167cc0e-4bd5-4831-b9e7-8fef7705d61b", + "supplier": "Hutchinson-Lane", + "city": "Khardah", + "country": "India", + "country_code": "IN" + }, + { + "id": "e9d8bb44-d19d-4453-8db2-d6d656f411be", + "supplier": "Russell, Mcclain and Larson", + "city": "Hartford", + "country": "United States", + "country_code": "US" + }, + { + "id": "373cc68d-3c51-43d9-878a-36aa0aeb86c6", + "supplier": "Stevens PLC", + "city": "Pershotravensk", + "country": "Ukraine", + "country_code": "UA" + }, + { + "id": "cb74384a-d91a-4ce8-9266-44a578c2b505", + "supplier": "Neal LLC", + "city": "Tooting", + "country": "United Kingdom", + "country_code": "GB" + }, + { + "id": "e68696c9-d9e7-4d2b-b467-d923c91ce47b", + "supplier": "Ferrell-Dixon", + "city": "Akonolinga", + "country": "Cameroon", + "country_code": "CM" + }, + { + "id": "78ecdd96-9fd7-46ca-9174-f4170ce51eff", + "supplier": "Hernandez, Mayer and Jones", + "city": "Kratié", + "country": "Cambodia", + "country_code": "KH" + }, + { + "id": "f19beb89-6c1f-45e9-8864-8a832bf17a55", + "supplier": "Poole, Coleman and Shea", + "city": "Bucaramanga", + "country": "Colombia", + "country_code": "CO" + }, + { + "id": "f26204e2-83cc-4526-a8f0-d4c86f295774", + "supplier": "Alvarez-Curtis", + "city": "Saïda", + "country": "Algeria", + "country_code": "DZ" + }, + { + "id": "532fc460-676f-4727-b5b2-6d3771db9ba1", + "supplier": "Horton, Sims and Pacheco", + "city": "East Hampton", + "country": "United States", + "country_code": "US" + }, + { + "id": "25e44a18-cb4f-48aa-bb6a-c05189268df6", + "supplier": "Coleman LLC", + "city": "Brumado", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "29c1b979-da61-4df4-ae3d-a2e303ea4444", + "supplier": "Estes, Johnston and Richardson", + "city": "Karviná", + "country": "Czechia", + "country_code": "CZ" + }, + { + "id": "3f49ac31-7bb0-4a52-8798-548b5cdb9451", + "supplier": "Kidd, Mcdaniel and Russell", + "city": "Lahti", + "country": "Finland", + "country_code": "FI" + }, + { + "id": "6463b573-32bd-4bc5-b2dc-c8e9a96965ba", + "supplier": "Cohen, Bell and Rodriguez", + "city": "Daryāpur", + "country": "India", + "country_code": "IN" + }, + { + "id": "22b67f9e-45e9-449e-8269-a31bd550324a", + "supplier": "Flores PLC", + "city": "Long Beach", + "country": "United States", + "country_code": "US" + }, + { + "id": "b2c1bb54-0977-4eb6-9635-f44843578083", + "supplier": "Cortez Group", + "city": "Hyattsville", + "country": "United States", + "country_code": "US" + }, + { + "id": "9093f9c5-0f56-40d7-b129-c13135c46a14", + "supplier": "Harris-Waller", + "city": "Ciudad Bolivia", + "country": "Venezuela, Bolivarian Republic of", + "country_code": "VE" + }, + { + "id": "66cdfd7b-f68e-40d1-b9dc-0dd54c50b6a1", + "supplier": "Chavez-Price", + "city": "Edegem", + "country": "Belgium", + "country_code": "BE" + }, + { + "id": "d541c0b3-1e4b-4521-9f57-d5be820d4cbc", + "supplier": "Snyder, Robinson and Brown", + "city": "Warrington", + "country": "United Kingdom", + "country_code": "GB" + }, + { + "id": "40a29030-eccd-43f8-974b-ef788e2d3f00", + "supplier": "Jones-Martinez", + "city": "Dūrā", + "country": "Palestine, State of", + "country_code": "PS" + }, + { + "id": "d2a60059-73f4-4fae-9a4a-0ab93f5203eb", + "supplier": "Green and Sons", + "city": "Constantine", + "country": "Algeria", + "country_code": "DZ" + }, + { + "id": "79126b93-df5a-4170-b80e-546a837605f3", + "supplier": "Stewart-Woodard", + "city": "Ādoni", + "country": "India", + "country_code": "IN" + }, + { + "id": "88745cef-2133-4d0c-a1de-00fa0740eb26", + "supplier": "Larson, Lambert and Gay", + "city": "Heishan", + "country": "China", + "country_code": "CN" + }, + { + "id": "22b9733f-4b49-4e82-82b9-d4f87d2b5916", + "supplier": "James-Wright", + "city": "Villepinte", + "country": "France", + "country_code": "FR" + }, + { + "id": "671512dd-f11c-41c7-845d-1a00ae9f40c4", + "supplier": "Gross, Frey and Mcmahon", + "city": "Malaybalay", + "country": "Philippines", + "country_code": "PH" + }, + { + "id": "2451f479-fe10-4322-a8c9-3f4f21f39779", + "supplier": "Figueroa, Ibarra and Jackson", + "city": "Smolensk", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "cd395f35-74dc-4858-8bb9-5fdf0add00ee", + "supplier": "Garrison, Williams and Johnson", + "city": "Kifrī", + "country": "Iraq", + "country_code": "IQ" + }, + { + "id": "fb607751-7ff0-4cea-8e23-d22b4b1c67ad", + "supplier": "Meyer, Marquez and Mckenzie", + "city": "Huimin", + "country": "China", + "country_code": "CN" + }, + { + "id": "d5b857ce-34b9-4bad-9018-216dbe06258c", + "supplier": "Smith and Sons", + "city": "Bambari", + "country": "Central African Republic", + "country_code": "CF" + }, + { + "id": "17c52e07-d5ce-4cfd-87cf-5ac7e3554c0c", + "supplier": "Martin-Mcbride", + "city": "Xinzhou", + "country": "China", + "country_code": "CN" + }, + { + "id": "e9e1b979-df68-4c17-99a4-64dfee7f1926", + "supplier": "Peck, Tucker and Patterson", + "city": "Manizales", + "country": "Colombia", + "country_code": "CO" + }, + { + "id": "a6815a96-329d-414e-89fa-27619179f857", + "supplier": "Simmons, Cox and Craig", + "city": "Kasimov", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "79614820-e391-46f2-8ab9-c5022ad154d8", + "supplier": "Rodriguez-Mcdonald", + "city": "Chharra", + "country": "India", + "country_code": "IN" + }, + { + "id": "fd5556a6-46fc-4d68-846b-e543ce6f4ec9", + "supplier": "Stevens Ltd", + "city": "Chiclayo", + "country": "Peru", + "country_code": "PE" + }, + { + "id": "f80817bf-7010-48c7-a3be-b015b09309d0", + "supplier": "Clarke-Brown", + "city": "Stockerau", + "country": "Austria", + "country_code": "AT" + }, + { + "id": "6de163f7-8aa2-434a-a210-78fea02e490c", + "supplier": "Johnson-Carroll", + "city": "Suozhen", + "country": "China", + "country_code": "CN" + }, + { + "id": "23933f2a-5407-45d9-8bbb-ec36287a1425", + "supplier": "Adams-White", + "city": "San Leandro", + "country": "United States", + "country_code": "US" + }, + { + "id": "f9bfd642-7152-407c-8158-d53fbc55f45b", + "supplier": "Harris, Graves and Gonzalez", + "city": "Siirt", + "country": "Turkey", + "country_code": "TR" + }, + { + "id": "b7f007d8-137c-4d3f-9ceb-03326f71a6c9", + "supplier": "Peterson, Norton and Preston", + "city": "Berekum", + "country": "Ghana", + "country_code": "GH" + }, + { + "id": "ce5caf26-49fb-4813-812b-4675c58b4164", + "supplier": "Little, Dunlap and Nelson", + "city": "Tarawa", + "country": "Kiribati", + "country_code": "KI" + }, + { + "id": "6d5eddf9-7c6f-4a88-8aba-2ef65267d78b", + "supplier": "Martin and Sons", + "city": "Wyoming", + "country": "United States", + "country_code": "US" + }, + { + "id": "88964aa2-4b9a-4427-8232-6c2ea65a851f", + "supplier": "Griffin, Smith and Smith", + "city": "Longview", + "country": "United States", + "country_code": "US" + }, + { + "id": "9c9d9974-bea3-4bf9-882e-c16a80b17e84", + "supplier": "Swanson-Kennedy", + "city": "Zhabei", + "country": "China", + "country_code": "CN" + }, + { + "id": "83983274-a805-4fcd-a909-1c2e14651637", + "supplier": "Nelson, Cruz and Bush", + "city": "Ben Arous", + "country": "Tunisia", + "country_code": "TN" + }, + { + "id": "3a54413c-eb58-4ce0-a538-383fd9c79ba9", + "supplier": "Petty, Hamilton and Solomon", + "city": "Bühl", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "9b333a39-4f8b-4f38-8bc8-3aea5aa24cd8", + "supplier": "Hodges-Johnson", + "city": "Pasco", + "country": "United States", + "country_code": "US" + }, + { + "id": "27f8059f-fe10-4a39-aa68-d66210c9cc59", + "supplier": "Becker LLC", + "city": "Sơn Tây", + "country": "Viet Nam", + "country_code": "VN" + }, + { + "id": "a2a17a94-b064-4682-86ba-1c933616568f", + "supplier": "Bender PLC", + "city": "Dubna", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "11f1284a-d6f0-4822-b716-3e70d1fb91df", + "supplier": "Grant-Nelson", + "city": "Malvern East", + "country": "Australia", + "country_code": "AU" + }, + { + "id": "cba23738-b63d-4845-a168-1fd1fc6082aa", + "supplier": "Miller, Green and Scott", + "city": "Budapest XXIII. kerület", + "country": "Hungary", + "country_code": "HU" + }, + { + "id": "f118463c-1952-4db0-b089-99dbd89ff9d9", + "supplier": "Rowland, Todd and Whitaker", + "city": "el Camp de l'Arpa del Clot", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "05b5a686-c821-41c4-bc2c-b66d35bac1d8", + "supplier": "Curtis, Doyle and Singleton", + "city": "West Hill", + "country": "Canada", + "country_code": "CA" + }, + { + "id": "cc8fb083-225e-4d29-960d-5d74b02adeda", + "supplier": "Olson LLC", + "city": "Cataguases", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "a35a7e67-e729-455a-9dbc-1bf661456179", + "supplier": "Martinez LLC", + "city": "West Whittier-Los Nietos", + "country": "United States", + "country_code": "US" + }, + { + "id": "a0f25cc7-1407-452e-98e2-8fa5083d4041", + "supplier": "Collins, Martin and Lane", + "city": "Sievierodonetsk", + "country": "Ukraine", + "country_code": "UA" + }, + { + "id": "7f696243-08d9-458c-8041-e114a223b897", + "supplier": "Carter Group", + "city": "Unión de Reyes", + "country": "Cuba", + "country_code": "CU" + }, + { + "id": "b66c44e8-057e-4267-8a38-29324107705f", + "supplier": "Watkins Group", + "city": "Krasnoturinsk", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "ea372457-5016-4c1d-a8fc-9d84d6a1138d", + "supplier": "Rivera Group", + "city": "Mabalacat City", + "country": "Philippines", + "country_code": "PH" + }, + { + "id": "d0f6eeee-24cc-4a72-9331-d0ebbb83643b", + "supplier": "Hernandez, Jenkins and Luna", + "city": "Matthews", + "country": "United States", + "country_code": "US" + }, + { + "id": "cb43b726-1b2f-44dd-b960-18b361c7288e", + "supplier": "Hensley-Porter", + "city": "Probolinggo", + "country": "Indonesia", + "country_code": "ID" + }, + { + "id": "847abdb2-44de-41ba-a4ec-235dc4f4a617", + "supplier": "Bolton, Sanchez and Rodgers", + "city": "Düzce", + "country": "Turkey", + "country_code": "TR" + }, + { + "id": "acc9fdfb-2811-4b87-8231-7168c70e7497", + "supplier": "Long-Sullivan", + "city": "Ridderkerk", + "country": "Netherlands", + "country_code": "NL" + }, + { + "id": "1ee8f22a-1460-4875-b1a8-89d7cb2607d6", + "supplier": "Harris-Cunningham", + "city": "Toulouse", + "country": "France", + "country_code": "FR" + }, + { + "id": "db55e5ad-918e-42a0-97b4-1f496f9574dd", + "supplier": "Stewart PLC", + "city": "Rishra", + "country": "India", + "country_code": "IN" + }, + { + "id": "d42974b3-923e-4f26-9bfa-1176e0073791", + "supplier": "Myers-Brown", + "city": "Dera Ghazi Khan", + "country": "Pakistan", + "country_code": "PK" + }, + { + "id": "f0feb132-7033-41f2-99e2-fdb8834302ec", + "supplier": "Lynch LLC", + "city": "Asyūţ", + "country": "Egypt", + "country_code": "EG" + }, + { + "id": "46bae099-f191-415a-aefa-3cab4b0e8c2e", + "supplier": "Avery-Johnson", + "city": "Chicago Heights", + "country": "United States", + "country_code": "US" + }, + { + "id": "42a20063-bd30-49d3-8506-ceac4ceb2d9e", + "supplier": "Davis-Wagner", + "city": "Bormujos", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "8f607810-ca93-4274-9c27-d0a8dcba7c4a", + "supplier": "Odom-Lawrence", + "city": "Suriāpet", + "country": "India", + "country_code": "IN" + }, + { + "id": "84101fbf-6743-43d4-ba46-a35b6a4456ee", + "supplier": "Martin and Sons", + "city": "Barañáin", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "9fdd4db4-fed8-4e24-ba3c-8bbe6c499ec7", + "supplier": "Gregory PLC", + "city": "Mixquiahuala de Juarez", + "country": "Mexico", + "country_code": "MX" + }, + { + "id": "a1a85cfc-109a-47fe-91a2-632334d35f44", + "supplier": "Barber-Hayes", + "city": "Songyang", + "country": "China", + "country_code": "CN" + }, + { + "id": "9bd9e5d6-1726-4bd6-8765-be37a59f5d93", + "supplier": "Morgan-Leonard", + "city": "Câmpulung Moldovenesc", + "country": "Romania", + "country_code": "RO" + }, + { + "id": "0058fc5e-e9e8-46eb-ac6d-673e436a5d7a", + "supplier": "Allen-Short", + "city": "Mondlo", + "country": "South Africa", + "country_code": "ZA" + }, + { + "id": "4d849ba4-b932-4ffc-8b52-61a704dddf0b", + "supplier": "White, Wong and Trevino", + "city": "Hückelhoven", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "aed0f6a6-37b1-4359-a136-cc011522ca85", + "supplier": "Maldonado Inc", + "city": "Yalta", + "country": "Ukraine", + "country_code": "UA" + }, + { + "id": "3dc28ff8-fb6c-46fc-9fa6-5b12826cedc3", + "supplier": "Reese-Williams", + "city": "Avezzano", + "country": "Italy", + "country_code": "IT" + }, + { + "id": "aaaa3f68-318a-4d8d-b080-79490e9e9dfa", + "supplier": "Thornton, Cook and Estrada", + "city": "Jamestown", + "country": "United States", + "country_code": "US" + }, + { + "id": "c7727eb2-7951-47e3-9021-df78e52c2d35", + "supplier": "Carter, Webb and Bush", + "city": "Somanda", + "country": "Tanzania, United Republic of", + "country_code": "TZ" + }, + { + "id": "3a9702b1-ea92-4fd3-871c-9108ef23921b", + "supplier": "Green-Crawford", + "city": "Mairinque", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "63168792-6134-48e8-a709-8e3cc0d5811c", + "supplier": "Brown PLC", + "city": "Ranchi", + "country": "India", + "country_code": "IN" + }, + { + "id": "ae3e7157-5d50-464c-9b47-e14e1b30ce4c", + "supplier": "Meyer, Floyd and Jackson", + "city": "Hemmingen", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "9da10220-7964-4a7a-a1ea-571a63cc483d", + "supplier": "Johnson, Khan and Oconnell", + "city": "Namioka", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "199401f4-32dd-46f1-b07f-aa38ce75bd07", + "supplier": "Morgan, Brown and Martin", + "city": "Neuwied", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "2b70d47e-fa6a-4329-8112-22287096bc44", + "supplier": "Jordan, James and Bradley", + "city": "Saint-Lô", + "country": "France", + "country_code": "FR" + }, + { + "id": "816202d7-9e53-402c-94a2-fb21b0e37c0e", + "supplier": "White-Nash", + "city": "Larkana", + "country": "Pakistan", + "country_code": "PK" + }, + { + "id": "33da751a-1358-4530-b0e5-e3b9a509e952", + "supplier": "Brown, Jackson and Simpson", + "city": "Funafuti", + "country": "Tuvalu", + "country_code": "TV" + }, + { + "id": "2a51afd9-a3de-45ee-8ada-b74203fed37b", + "supplier": "Cooper and Sons", + "city": "Carouge", + "country": "Switzerland", + "country_code": "CH" + }, + { + "id": "4f66d217-8106-4b87-922b-fbe6e8d6d699", + "supplier": "Hardy, Bauer and Martinez", + "city": "Matanzas", + "country": "Cuba", + "country_code": "CU" + }, + { + "id": "518d3d05-716c-483f-9ed0-03c4e81e683c", + "supplier": "Martinez and Sons", + "city": "Gustavo Adolfo Madero", + "country": "Mexico", + "country_code": "MX" + }, + { + "id": "7d33e910-5889-4f75-bd2b-193ec2434d0f", + "supplier": "Williamson-Green", + "city": "Nova Granada", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "0817f6f5-8011-4c46-aeab-ba89def6df14", + "supplier": "Daniels Group", + "city": "Saint John’s", + "country": "Antigua and Barbuda", + "country_code": "AG" + }, + { + "id": "82869f9c-fa06-45cb-922a-00675cde9676", + "supplier": "Nguyen-Cruz", + "city": "Pinetown", + "country": "South Africa", + "country_code": "ZA" + }, + { + "id": "9a27c6be-84c6-4fe8-a671-d9d6a5ec7f6a", + "supplier": "Jackson, Chan and Rivera", + "city": "Broxburn", + "country": "United Kingdom", + "country_code": "GB" + }, + { + "id": "238c3f06-3708-4b59-8617-f94611d6f3a3", + "supplier": "Fuentes Inc", + "city": "North Bellmore", + "country": "United States", + "country_code": "US" + }, + { + "id": "fbfe40db-81e4-4b35-93d5-a996307a266e", + "supplier": "Church Inc", + "city": "Molodohvardiisk", + "country": "Ukraine", + "country_code": "UA" + }, + { + "id": "0c327a40-c6d8-44da-ba2d-e84f924c5208", + "supplier": "Hubbard Ltd", + "city": "Liufeng", + "country": "China", + "country_code": "CN" + }, + { + "id": "bf300186-9235-481d-be21-15c8e216dcf1", + "supplier": "Smith-Williamson", + "city": "Narva", + "country": "Estonia", + "country_code": "EE" + }, + { + "id": "cd18146d-c073-4d58-97b4-ac079baa9b65", + "supplier": "Moreno Group", + "city": "Back Mountain", + "country": "United States", + "country_code": "US" + }, + { + "id": "b508d6ec-f430-4496-9c08-bd54f1541023", + "supplier": "Page, Hernandez and Ayala", + "city": "Moorpark", + "country": "United States", + "country_code": "US" + }, + { + "id": "267680ea-eafe-4d40-a3c6-4807c0d195b1", + "supplier": "Anderson Ltd", + "city": "Taquara", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "e157b0e5-1085-4999-83a0-02a46d7a8994", + "supplier": "Garcia Ltd", + "city": "Ampang", + "country": "Malaysia", + "country_code": "MY" + }, + { + "id": "6268ab7c-e25c-44ff-8431-e631679623b5", + "supplier": "Allison PLC", + "city": "Perdões", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "13dabe70-36c5-4a87-bc13-15664eda25a9", + "supplier": "Collins-Hensley", + "city": "Marienberg", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "91be13e0-b467-48d9-8ff7-cbed652b49cb", + "supplier": "Lopez, Goodman and Miller", + "city": "Coxim", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "49554e41-9e26-4a38-9f96-871eda1dc50a", + "supplier": "Castillo Inc", + "city": "Manjīl", + "country": "Iran, Islamic Republic of", + "country_code": "IR" + }, + { + "id": "f1067c74-aa84-4a06-9fbd-16f914be2e65", + "supplier": "Zamora, Adams and Koch", + "city": "Wattrelos", + "country": "France", + "country_code": "FR" + }, + { + "id": "2731aa23-7ea4-4661-b79b-6f0d4d17d5b3", + "supplier": "Cantu-Ferguson", + "city": "Tomé Açu", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "feeda1ce-d6af-42b2-b6ff-7516ba39ad6c", + "supplier": "Calderon-Montgomery", + "city": "Gallarate", + "country": "Italy", + "country_code": "IT" + }, + { + "id": "e18d93fc-f1db-4ac7-b138-e158c6fb2e69", + "supplier": "Smith LLC", + "city": "Bielsko-Biala", + "country": "Poland", + "country_code": "PL" + }, + { + "id": "092bb1b2-b39f-4521-9c21-c853db9d9a09", + "supplier": "Hill-Jones", + "city": "Choisy-le-Roi", + "country": "France", + "country_code": "FR" + }, + { + "id": "dafc3247-7fb3-406b-976c-9e656e9a6b45", + "supplier": "Ibarra and Sons", + "city": "Somerset", + "country": "United States", + "country_code": "US" + }, + { + "id": "658f838d-0e84-4f36-978c-95602545977c", + "supplier": "Wilson-Callahan", + "city": "Le Camas", + "country": "France", + "country_code": "FR" + }, + { + "id": "07335cfb-9bbc-4be5-b546-bdd8af104e7e", + "supplier": "Guerrero, Sutton and Lucas", + "city": "Eustis", + "country": "United States", + "country_code": "US" + }, + { + "id": "3c198782-cb13-4253-aefc-f48aa8ded00a", + "supplier": "Stevens LLC", + "city": "Gyeongsan-si", + "country": "Korea, Republic of", + "country_code": "KR" + }, + { + "id": "c39c750f-2398-4f5a-a389-2c200e84c45b", + "supplier": "Wilson, Kim and Dorsey", + "city": "Barra do Piraí", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "2805bfc6-fe9f-49fc-90ba-d4c779a38af2", + "supplier": "Carroll, Nguyen and Martin", + "city": "Dolný Kubín", + "country": "Slovakia", + "country_code": "SK" + }, + { + "id": "de70a51b-3263-411b-9820-d7c21676e4d6", + "supplier": "Rich, Powell and Ward", + "city": "Armação de Búzios", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "4f22034e-f299-442a-a1e3-3d9dc974ed8f", + "supplier": "Boyd, Berg and Sampson", + "city": "Walvis Bay", + "country": "Namibia", + "country_code": "NA" + }, + { + "id": "0301f65d-2290-456b-a3f7-b2096a632198", + "supplier": "Maxwell Inc", + "city": "Naraini", + "country": "India", + "country_code": "IN" + }, + { + "id": "1e0eae5f-25ae-4ef9-807e-4ce162fa2934", + "supplier": "Jimenez PLC", + "city": "Indore", + "country": "India", + "country_code": "IN" + }, + { + "id": "7ce25e4c-5894-4e77-ada2-d2bb434fdae9", + "supplier": "Hubbard-Holmes", + "city": "Kawanishi", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "034022f5-5327-45c2-aaff-524b1be2fbd5", + "supplier": "Drake Ltd", + "city": "El Paraíso", + "country": "Honduras", + "country_code": "HN" + }, + { + "id": "d615c5f3-9db3-4bea-bbf3-0d42edf45c2d", + "supplier": "Nichols Inc", + "city": "Ferreñafe", + "country": "Peru", + "country_code": "PE" + }, + { + "id": "93e3958e-3e49-4cb3-8ab2-2c2bae697be5", + "supplier": "Parker-Lawrence", + "city": "Bhit Shah", + "country": "Pakistan", + "country_code": "PK" + }, + { + "id": "bdd38a8e-1976-4f90-ad0b-fb5e7932fd03", + "supplier": "Shaffer PLC", + "city": "Malingshan", + "country": "China", + "country_code": "CN" + }, + { + "id": "b9dfb874-fb5d-4d34-8a13-e4f1395f3c6e", + "supplier": "Bruce, Gutierrez and Thompson", + "city": "Shiyan", + "country": "China", + "country_code": "CN" + }, + { + "id": "ebbcad78-26fa-4d33-95ca-84decc4209a4", + "supplier": "Riley, Barrett and Mccullough", + "city": "Ghauspur", + "country": "Pakistan", + "country_code": "PK" + }, + { + "id": "7c4b3772-ee27-4915-8166-359d068db153", + "supplier": "Griffith-Stout", + "city": "East Grinstead", + "country": "United Kingdom", + "country_code": "GB" + }, + { + "id": "bd9aec71-4218-45ce-b6c6-d076ad07f8cd", + "supplier": "Peterson-Rose", + "city": "Battle Creek", + "country": "United States", + "country_code": "US" + }, + { + "id": "8943ee5e-5f73-4765-85cd-0c2c934f8877", + "supplier": "Smith-Cobb", + "city": "Sikeston", + "country": "United States", + "country_code": "US" + }, + { + "id": "2f7172a0-e935-4dfc-98a6-b48dcec0ad18", + "supplier": "Mendoza, Moore and Thomas", + "city": "António Enes", + "country": "Mozambique", + "country_code": "MZ" + }, + { + "id": "f494b5db-7627-4a97-809e-8e8f9d92fb51", + "supplier": "Mayo, Aguirre and Ryan", + "city": "Serrana", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "9c71665d-ca2e-44e3-b9ba-f1e47dec6dfe", + "supplier": "Wagner Group", + "city": "Avezzano", + "country": "Italy", + "country_code": "IT" + }, + { + "id": "29fa5aeb-0830-4490-abed-20aaed11e786", + "supplier": "Odonnell-Williams", + "city": "Uíge", + "country": "Angola", + "country_code": "AO" + }, + { + "id": "625a4b1a-07b2-4ed1-a197-cc5fd96d110e", + "supplier": "Washington-Villanueva", + "city": "Fuji", + "country": "China", + "country_code": "CN" + }, + { + "id": "534df54e-82c6-430e-ad50-d80a3a745e11", + "supplier": "Doyle, King and Thompson", + "city": "Dosquebradas", + "country": "Colombia", + "country_code": "CO" + }, + { + "id": "d396349e-7772-49c3-bcdf-0afbeae658fa", + "supplier": "Boyd, Turner and Byrd", + "city": "Kamoke", + "country": "Pakistan", + "country_code": "PK" + }, + { + "id": "7478aeec-1a1e-4d96-95ff-05d5b3a5522b", + "supplier": "White, Lewis and Evans", + "city": "Śrem", + "country": "Poland", + "country_code": "PL" + }, + { + "id": "6b879d25-7222-419e-8f1a-d9c9ceda2600", + "supplier": "Mccarthy-Galloway", + "city": "Boa Vista", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "2a78338a-084a-4595-88ec-98f141e653f7", + "supplier": "Jones PLC", + "city": "Aliaga", + "country": "Philippines", + "country_code": "PH" + }, + { + "id": "a28a6f2f-a549-4a38-98ac-6eaeff8472ce", + "supplier": "Rodriguez, Schmidt and Hodge", + "city": "Tutayev", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "dd4262b0-805f-49f8-94b0-12dcadea9e73", + "supplier": "Hall-Hodges", + "city": "Togitsu", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "1f275c2a-8e37-4032-a54e-86b99ec56351", + "supplier": "Perkins, Garza and Cochran", + "city": "Pangkalan Brandan", + "country": "Indonesia", + "country_code": "ID" + }, + { + "id": "42f054a5-0aba-4b02-b68a-851130c639fc", + "supplier": "Sanchez-Mcdonald", + "city": "Lādwa", + "country": "India", + "country_code": "IN" + }, + { + "id": "9e95d78d-7f95-4752-9e1f-d522e67e63d7", + "supplier": "Fletcher, Pierce and Navarro", + "city": "Saint-Michel-sur-Orge", + "country": "France", + "country_code": "FR" + }, + { + "id": "93760e27-ee36-44a9-960f-cb1ccdd336c7", + "supplier": "Mcdaniel, Dean and Delgado", + "city": "Mānvi", + "country": "India", + "country_code": "IN" + }, + { + "id": "6b6e148d-449f-4e88-808d-cdf9cdc9bba3", + "supplier": "King-Johnson", + "city": "Ajab Shīr", + "country": "Iran, Islamic Republic of", + "country_code": "IR" + }, + { + "id": "45d529da-5989-484a-a60d-acba0442a929", + "supplier": "Pollard LLC", + "city": "Xinyingpan", + "country": "China", + "country_code": "CN" + }, + { + "id": "89dbd72a-3118-4fdf-bdf4-671c351a4b66", + "supplier": "Newton Inc", + "city": "Steilshoop", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "7273d4f8-9c3a-4279-a18c-bb0f425bc8eb", + "supplier": "Scott, Frazier and Cooper", + "city": "Sankt Ingbert", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "a6367485-a91c-41dc-9e18-8939ef990b5b", + "supplier": "Schroeder and Sons", + "city": "Wolmaransstad", + "country": "South Africa", + "country_code": "ZA" + }, + { + "id": "0ca3c664-7fb2-446a-b5c6-73fe140c4f02", + "supplier": "Benitez and Sons", + "city": "South Euclid", + "country": "United States", + "country_code": "US" + }, + { + "id": "12417d4e-b119-46a1-8c47-a560c2d103dd", + "supplier": "Cochran-Delacruz", + "city": "Piedecuesta", + "country": "Colombia", + "country_code": "CO" + }, + { + "id": "3288e7a5-6b1b-482e-8c95-3265f948ae03", + "supplier": "Salinas-Kelly", + "city": "Yicheng", + "country": "China", + "country_code": "CN" + }, + { + "id": "d0f56bf6-b7f2-4032-be8f-95269c626667", + "supplier": "Cook LLC", + "city": "Ahfir", + "country": "Morocco", + "country_code": "MA" + }, + { + "id": "a8d712db-e0d5-45ab-a8cc-c752ad53f8e6", + "supplier": "Rodriguez, Estrada and Kim", + "city": "Embi", + "country": "Kazakhstan", + "country_code": "KZ" + }, + { + "id": "35f7b6ea-9412-41f4-9652-8e419db45ce8", + "supplier": "Morris, Cain and Boone", + "city": "Elche", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "2fd79a0c-24b5-4361-8b5b-df720d2c7eac", + "supplier": "Mcpherson Ltd", + "city": "Starokostyantyniv", + "country": "Ukraine", + "country_code": "UA" + }, + { + "id": "2617dc37-a7c6-4c6c-b89d-4e4f367f3d78", + "supplier": "Harper PLC", + "city": "Tirupparangunram", + "country": "India", + "country_code": "IN" + }, + { + "id": "d7ca1d2e-6b21-4c0c-821a-c4e8d5a3c65c", + "supplier": "Phillips, Love and Smith", + "city": "Punta de Mata", + "country": "Venezuela, Bolivarian Republic of", + "country_code": "VE" + }, + { + "id": "f8337d39-2d97-423a-9f94-35a45ee9ade6", + "supplier": "May, Ruiz and Butler", + "city": "Patnos", + "country": "Turkey", + "country_code": "TR" + }, + { + "id": "a10b61e6-8288-499d-bd8c-d89b9625fb1f", + "supplier": "Lucas and Sons", + "city": "Mount Vernon", + "country": "United States", + "country_code": "US" + }, + { + "id": "d7f501f6-e595-473c-90fc-89933505411e", + "supplier": "Marshall PLC", + "city": "Uccle", + "country": "Belgium", + "country_code": "BE" + }, + { + "id": "db1a07bc-c946-4ddd-8f47-b836c2f35281", + "supplier": "Peterson Ltd", + "city": "Schwalbach", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "266084c2-dcbc-406b-8371-9adcbc81521a", + "supplier": "Gentry-Gross", + "city": "Sucre", + "country": "Bolivia, Plurinational State of", + "country_code": "BO" + }, + { + "id": "fbc53ab7-1c1e-41c8-afe2-44b405858cda", + "supplier": "Harris, Wright and Morales", + "city": "Nikkō", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "49231eda-bbab-475b-aa59-47e6c8c81166", + "supplier": "Hines-Allen", + "city": "Bloemfontein", + "country": "South Africa", + "country_code": "ZA" + }, + { + "id": "fab306a0-9ab2-4834-949a-58804bddc9a4", + "supplier": "Singh Inc", + "city": "Lesosibirsk", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "b5028bba-a927-45d7-9032-ee90825311c5", + "supplier": "Ford, Martinez and Gutierrez", + "city": "Bhudgaon", + "country": "India", + "country_code": "IN" + }, + { + "id": "5011ad6d-cebe-4f4b-bc58-2147ea820d49", + "supplier": "Williams-Sweeney", + "city": "Lunéville", + "country": "France", + "country_code": "FR" + }, + { + "id": "3ad032a1-2e9f-4629-93c7-0ee0b5bb0e25", + "supplier": "Richardson Inc", + "city": "Minamirinkan", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "cd24daf1-7f42-48a1-a2f2-74127303eaee", + "supplier": "Mclaughlin-Hawkins", + "city": "Manolo Fortich", + "country": "Philippines", + "country_code": "PH" + }, + { + "id": "3c5797ed-e2f6-47c2-a7b6-6e4b0feaf5e3", + "supplier": "Woods Ltd", + "city": "Azusa", + "country": "United States", + "country_code": "US" + }, + { + "id": "0d183bba-b1df-4c41-be10-c0896378b406", + "supplier": "Larsen-Martinez", + "city": "Ebersbach an der Fils", + "country": "Germany", + "country_code": "DE" + }, + { + "id": "fcdf3268-b0f0-4e2b-8fbd-6008cb4a6d0e", + "supplier": "Carlson Inc", + "city": "Canguçu", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "2318f317-967e-4282-aceb-c17a6349f86e", + "supplier": "Santana LLC", + "city": "Ceerigaabo", + "country": "Somalia", + "country_code": "SO" + }, + { + "id": "183cf105-b1a6-42ee-b8a9-002709f1b582", + "supplier": "Evans, Park and James", + "city": "Kaiyuan", + "country": "China", + "country_code": "CN" + }, + { + "id": "ba01e204-e74e-4f87-bc55-1a43c099f199", + "supplier": "Turner and Sons", + "city": "Umuahia", + "country": "Nigeria", + "country_code": "NG" + }, + { + "id": "169db3fc-b253-465a-ba91-33f3617a9313", + "supplier": "Bryan-James", + "city": "Palmi", + "country": "Italy", + "country_code": "IT" + }, + { + "id": "ab8fb795-35cd-42c4-827d-6fd907d6b81d", + "supplier": "Vincent LLC", + "city": "Cypress", + "country": "United States", + "country_code": "US" + }, + { + "id": "114d6a02-02d8-4038-97a3-fd39a9701f79", + "supplier": "Nguyen-Peters", + "city": "Huangshan", + "country": "China", + "country_code": "CN" + }, + { + "id": "6259c66a-0eec-4f7f-b4a4-a0c2be80461e", + "supplier": "Brown, Estrada and Riggs", + "city": "Chernivtsi", + "country": "Ukraine", + "country_code": "UA" + }, + { + "id": "47528cbf-c41b-4897-b917-6f4c1394fe1f", + "supplier": "Moran, Martin and Freeman", + "city": "Murrieta", + "country": "United States", + "country_code": "US" + }, + { + "id": "66558286-cf29-4320-80a9-de2c12aa2f3c", + "supplier": "Bryant-Stark", + "city": "Linda-a-Velha", + "country": "Portugal", + "country_code": "PT" + }, + { + "id": "06d152e4-f062-46da-b6be-750b192a5a4b", + "supplier": "Barnes LLC", + "city": "Sambrial", + "country": "Pakistan", + "country_code": "PK" + }, + { + "id": "cccd3023-1267-4fe6-9fbe-2441662cbb46", + "supplier": "Douglas Inc", + "city": "Bellshill", + "country": "United Kingdom", + "country_code": "GB" + }, + { + "id": "854314d4-9505-4765-b22a-a2ff53549b0b", + "supplier": "Turner, Hall and Jimenez", + "city": "Empangeni", + "country": "South Africa", + "country_code": "ZA" + }, + { + "id": "12566cfa-500d-4e07-8117-e0bf16d7fb8c", + "supplier": "Aguilar, Matthews and Martinez", + "city": "Morogoro", + "country": "Tanzania, United Republic of", + "country_code": "TZ" + }, + { + "id": "47c86e10-e667-4725-bbe3-ac372da0b472", + "supplier": "Lee, Pearson and Gates", + "city": "Hannō", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "1b032f32-5734-44da-8758-554ad059b03e", + "supplier": "Bryan-Jones", + "city": "Bir el Djir", + "country": "Algeria", + "country_code": "DZ" + }, + { + "id": "8518fe84-b0e0-40c5-9a86-351b91eb3828", + "supplier": "Barry PLC", + "city": "Erie", + "country": "United States", + "country_code": "US" + }, + { + "id": "36060220-55ab-4726-9b30-30de76c56344", + "supplier": "Cooper, Walker and Perez", + "city": "Surrey", + "country": "Canada", + "country_code": "CA" + }, + { + "id": "f7c5fad9-9f0c-4206-a338-e162bfe54de1", + "supplier": "Nichols-Davis", + "city": "Ivano-Frankivsk", + "country": "Ukraine", + "country_code": "UA" + }, + { + "id": "a6f1f4bd-bdd5-4a35-b683-2aee89aa8ed3", + "supplier": "Cook Group", + "city": "Seondha", + "country": "India", + "country_code": "IN" + }, + { + "id": "8a148e6d-972c-4135-930a-c6d9ea6957fd", + "supplier": "Huerta, Clark and Johnson", + "city": "El Masnou", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "92524340-7cee-4873-8d5a-1b3e607d0da7", + "supplier": "Romero-Nguyen", + "city": "Orihuela", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "fdd83431-425f-4291-b8e4-f08805b6b89d", + "supplier": "Thomas-Jenkins", + "city": "Muktāgācha", + "country": "Bangladesh", + "country_code": "BD" + }, + { + "id": "297508c6-6074-4625-8dec-7bab342010a1", + "supplier": "Gibson-Jackson", + "city": "Kičevo", + "country": "North Macedonia", + "country_code": "MK" + }, + { + "id": "06034b22-8e1b-435f-902e-88739f77d86a", + "supplier": "Lee and Sons", + "city": "Bandeirantes", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "ee3143c4-d3eb-4457-b884-651cac99ee9d", + "supplier": "Lynch-Ramirez", + "city": "Nakhon Si Thammarat", + "country": "Thailand", + "country_code": "TH" + }, + { + "id": "5f36c064-46dd-4351-b0e8-9cb2c76bfbab", + "supplier": "Reyes, Taylor and Ramirez", + "city": "Holt", + "country": "United States", + "country_code": "US" + }, + { + "id": "8d98799f-d657-4acf-9ca6-9b90420ff681", + "supplier": "Arnold-Knight", + "city": "Paracho de Verduzco", + "country": "Mexico", + "country_code": "MX" + }, + { + "id": "f3de43d3-4bd7-4641-be54-2db60238aa14", + "supplier": "Carr, Smith and Mayo", + "city": "Nanmen", + "country": "China", + "country_code": "CN" + }, + { + "id": "a04a193e-3025-4ae3-aec0-4a464ccd95a9", + "supplier": "Harrison PLC", + "city": "Mercedes", + "country": "Argentina", + "country_code": "AR" + }, + { + "id": "b9ed885f-282e-4836-bede-f1dc9f9f5c41", + "supplier": "Duran, Mueller and Payne", + "city": "Yushan", + "country": "China", + "country_code": "CN" + }, + { + "id": "1b447fbd-a0fe-4385-8141-ab5aa43fbedb", + "supplier": "Jones Group", + "city": "Mallawī", + "country": "Egypt", + "country_code": "EG" + }, + { + "id": "30dc6bac-5604-4e78-a48d-eed66f4d4dc8", + "supplier": "Garcia-Roberts", + "city": "Oisterwijk", + "country": "Netherlands", + "country_code": "NL" + }, + { + "id": "15bdf688-23a7-4f52-be5c-fe82bba7add7", + "supplier": "Taylor, Obrien and Delacruz", + "city": "Olecko", + "country": "Poland", + "country_code": "PL" + }, + { + "id": "8486f6f9-18fe-440e-b3ed-9be6cc7dbaeb", + "supplier": "Howell-Meyer", + "city": "Seosan", + "country": "Korea, Republic of", + "country_code": "KR" + }, + { + "id": "7608b763-1e52-4ad9-94b0-d574af19612c", + "supplier": "Anderson-Young", + "city": "Bundibugyo", + "country": "Uganda", + "country_code": "UG" + }, + { + "id": "34056316-50e7-46e4-bfef-fa579fe2c5c8", + "supplier": "Villegas-Cummings", + "city": "Klimovsk", + "country": "Russian Federation", + "country_code": "RU" + }, + { + "id": "d66c8d06-9bac-4663-94a5-ef971423f2ce", + "supplier": "Huang, Guerrero and Hurst", + "city": "Honchō", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "248fa1c7-dd1e-41fe-931a-9f00777ee0fe", + "supplier": "Carr, Smith and Webb", + "city": "Macia", + "country": "Mozambique", + "country_code": "MZ" + }, + { + "id": "e39aa402-6c12-4c0e-a638-c572784d0e78", + "supplier": "Ross-Brooks", + "city": "Okunoya", + "country": "Japan", + "country_code": "JP" + }, + { + "id": "23be71fa-4280-4114-9750-025c224be098", + "supplier": "White and Sons", + "city": "Strumica", + "country": "North Macedonia", + "country_code": "MK" + }, + { + "id": "63ab664f-80d7-46e1-97cb-39a4f713f937", + "supplier": "Barr-Melendez", + "city": "South El Monte", + "country": "United States", + "country_code": "US" + }, + { + "id": "f78ea3cf-fe86-4b17-ba41-96dd934e043e", + "supplier": "Powell-Nguyen", + "city": "Keynsham", + "country": "United Kingdom", + "country_code": "GB" + }, + { + "id": "65131e0d-addc-41f9-a33f-e9f3b7f00566", + "supplier": "Rodriguez LLC", + "city": "Breda", + "country": "Netherlands", + "country_code": "NL" + }, + { + "id": "cfe8ae59-a7a8-4772-8bd5-bbd6991af811", + "supplier": "Fox-Delacruz", + "city": "Chamberí", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "b8b7794e-329e-4bdc-9fcb-5ddfe9b71248", + "supplier": "Davis Ltd", + "city": "Pinsk", + "country": "Belarus", + "country_code": "BY" + }, + { + "id": "57f3326a-e53b-4cb6-9b32-658df4cc11a4", + "supplier": "Kerr LLC", + "city": "Monzón", + "country": "Spain", + "country_code": "ES" + }, + { + "id": "888698ef-ad70-4022-9624-4dc111f56c01", + "supplier": "Wagner-Ramirez", + "city": "Greystones", + "country": "Ireland", + "country_code": "IE" + }, + { + "id": "a29b2c3f-4db3-4f4d-a947-5f512d615a1d", + "supplier": "Thompson Ltd", + "city": "Yufengshan", + "country": "China", + "country_code": "CN" + }, + { + "id": "f76eb805-4d84-4b4b-9aa3-95c287be41d0", + "supplier": "Bennett, Best and Jacobson", + "city": "Chākia", + "country": "India", + "country_code": "IN" + }, + { + "id": "784f7f15-1a8c-43f5-923c-de0beb82f32f", + "supplier": "Goodman-Chapman", + "city": "Johnston", + "country": "United States", + "country_code": "US" + }, + { + "id": "caeb974d-5803-4419-b316-2245f15f73d4", + "supplier": "Davidson, Rosales and Stewart", + "city": "Piombino", + "country": "Italy", + "country_code": "IT" + }, + { + "id": "da35429e-b1b6-4780-9fcc-f1b17b40d4e3", + "supplier": "Williams, Bailey and Martinez", + "city": "Carigara", + "country": "Philippines", + "country_code": "PH" + }, + { + "id": "67db6571-5c2f-4c52-9d0b-1584a74bb116", + "supplier": "Martinez and Sons", + "city": "Jandaia do Sul", + "country": "Brazil", + "country_code": "BR" + }, + { + "id": "dc1364ba-300b-4fcb-949a-4cd90afee69b", + "supplier": "Williamson-Young", + "city": "Bānka", + "country": "India", + "country_code": "IN" + } +] \ No newline at end of file diff --git a/docs/getting-started/with-your-sandbox/material/vocabs/pv.ttl b/docs/getting-started/with-your-sandbox/material/vocabs/pv.ttl new file mode 100644 index 00000000..914df662 --- /dev/null +++ b/docs/getting-started/with-your-sandbox/material/vocabs/pv.ttl @@ -0,0 +1,308 @@ +@prefix : . +@prefix cc: . +@prefix void: . +@prefix ecc: . +@prefix owl: . +@prefix xsd: . +@prefix voaf: . +@prefix rdfs: . +@prefix dbo: . +@prefix dct: . +@prefix doap: . +@prefix rdf: . +@prefix xml: . +@prefix vann: . +@prefix foaf: . + +:height_mm a owl:DatatypeProperty ; + rdfs:comment "The height of an item measured in millimeter."@en ; + rdfs:domain :Hardware ; + rdfs:isDefinedBy : ; + rdfs:label "height (mm)"@en ; + rdfs:range xsd:decimal . + +cc:license a owl:AnnotationProperty ; + rdfs:isDefinedBy . + +:phone a owl:DatatypeProperty ; + rdfs:comment "A phone number."@en ; + rdfs:domain :Agent ; + rdfs:isDefinedBy : ; + rdfs:label "phone number"@en ; + rdfs:range xsd:string . + +:Department a owl:Class ; + rdfs:comment "A department in an organization."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Department"@en . + +:Hardware a owl:Class ; + rdfs:comment "The hardware products produced."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Hardware"@en ; + rdfs:subClassOf :Product . + +:hasCategory a owl:ObjectProperty ; + rdfs:comment "The category name of a product."@en ; + rdfs:domain :Product ; + rdfs:isDefinedBy : ; + rdfs:label "has category"@en ; + rdfs:range :ProductCategory . + +:addressCountryCode a owl:DatatypeProperty ; + rdfs:comment "The address country code."@en ; + rdfs:isDefinedBy : ; + rdfs:label "address country code"@en ; + rdfs:range xsd:string . + +:email a owl:DatatypeProperty ; + rdfs:comment "The e-mail of an agent."@en ; + rdfs:domain :Agent ; + rdfs:isDefinedBy : ; + rdfs:label "email"@en ; + rdfs:range xsd:string . + +vann:preferredNamespaceUri + a owl:AnnotationProperty ; + rdfs:isDefinedBy vann: . + +:memberOf a owl:ObjectProperty ; + rdfs:comment "The department to which an agents belongs."@en ; + rdfs:domain :Agent ; + rdfs:isDefinedBy : ; + rdfs:label "member of"@en ; + rdfs:range :Department . + +:Manager a owl:Class ; + rdfs:comment "An employee with some direct reports and management duties."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Manager"@en ; + rdfs:subClassOf :Employee . + +:Supplier a owl:Class ; + rdfs:comment "The Supplier of some item(s)."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Supplier"@en . + +:compatibleProduct a owl:ObjectProperty ; + rdfs:comment "A compatible product."@en ; + rdfs:domain :Product ; + rdfs:isDefinedBy : ; + rdfs:label "compatible product"@en ; + rdfs:range :Product . + +:managesProduct a owl:ObjectProperty ; + rdfs:comment "The product managed by the product manager."@en ; + rdfs:domain :Employee ; + rdfs:isDefinedBy : ; + rdfs:label "manages product"@en ; + rdfs:range :Product . + +:Product a owl:Class ; + rdfs:comment "Anything that we make and/or sell."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Product"@en . + +dct:creator a owl:AnnotationProperty ; + rdfs:isDefinedBy dct: . + + + rdfs:label "Creative Commons Attribution 4.0 International" . + +:id a owl:DatatypeProperty ; + rdfs:comment "The ID of a thing."@en ; + rdfs:isDefinedBy : ; + rdfs:label "ID" ; + rdfs:range xsd:string . + +:Price a owl:Class ; + rdfs:comment "A price object to deal with multiple prices and/or currencies."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Price"@en . + +:weight_g a owl:DatatypeProperty ; + rdfs:comment "The weight of an item measured in grams."@en ; + rdfs:domain :Hardware ; + rdfs:isDefinedBy : ; + rdfs:label "weight (g)"@en ; + rdfs:range xsd:decimal . + +:price a owl:ObjectProperty ; + rdfs:comment "The price specification of a product."@en ; + rdfs:domain :Product ; + rdfs:isDefinedBy : ; + rdfs:label "price"@en ; + rdfs:range :Price . + +dct:publisher a owl:AnnotationProperty ; + rdfs:isDefinedBy dct: . + +:hasDirectReport a owl:ObjectProperty ; + rdfs:comment "The employees manager she is reporting to."@en ; + rdfs:domain :Manager ; + rdfs:isDefinedBy : ; + rdfs:label "has direct report"@en ; + rdfs:range :Employee . + +:Employee a owl:Class ; + rdfs:comment "An employee in my company."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Employee"@en ; + rdfs:subClassOf :Agent . + +:areaOfExpertise a owl:DatatypeProperty ; + rdfs:comment "The area of expertise."@en ; + rdfs:domain :Agent ; + rdfs:isDefinedBy : ; + rdfs:label "area of expertise"@en ; + rdfs:range xsd:string . + +:country a owl:ObjectProperty ; + rdfs:comment "The country where the supplier is located."@en ; + rdfs:domain :Supplier ; + rdfs:isDefinedBy : ; + rdfs:label "country"@en ; + rdfs:range dbo:Country . + +:responsibleFor a owl:ObjectProperty ; + rdfs:comment "The product for which a department is responsible."@en ; + rdfs:domain :Department ; + rdfs:isDefinedBy : ; + rdfs:label "responsible for"@en ; + rdfs:range :Product . + +:expertFor a owl:ObjectProperty ; + rdfs:comment "The product category she is expert for."@en ; + rdfs:domain :Agent ; + rdfs:isDefinedBy : ; + rdfs:label "expert for"@en ; + rdfs:range :ProductCategory . + +:addressCountry a owl:DatatypeProperty ; + rdfs:comment "The address country."@en ; + rdfs:isDefinedBy : ; + rdfs:label "address country"@en ; + rdfs:range xsd:string . + +:addressLocality a owl:DatatypeProperty ; + rdfs:comment "The address locality (city)."@en ; + rdfs:isDefinedBy : ; + rdfs:label "address locality"@en ; + rdfs:range xsd:string . + +:name a owl:DatatypeProperty ; + rdfs:comment "The name of something."@en ; + rdfs:isDefinedBy : ; + rdfs:label "name"@en ; + rdfs:range xsd:string . + +:addressText a owl:DatatypeProperty ; + rdfs:comment "The address text."@en ; + rdfs:isDefinedBy : ; + rdfs:label "address text"@en ; + rdfs:range xsd:string . + +:currency a owl:DatatypeProperty ; + rdfs:comment "The currency."@en ; + rdfs:domain :Price ; + rdfs:isDefinedBy : ; + rdfs:label "currency"@en ; + rdfs:range xsd:string . + +:amount a owl:DatatypeProperty ; + rdfs:comment "The amount."@en ; + rdfs:domain :Price ; + rdfs:isDefinedBy : ; + rdfs:label "amount"@en ; + rdfs:range xsd:decimal . + +ecc:rpietzsch a dct:Agent , foaf:Person ; + foaf:name "René Pietzsch" . + +dct:rights a owl:AnnotationProperty ; + rdfs:isDefinedBy dct: . + +:Service a owl:Class ; + rdfs:comment "Some value added service realized based on other product(s)."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Service"@en ; + rdfs:subClassOf :Product . + +:eligibleFor a owl:ObjectProperty ; + rdfs:comment "Valid product service combinations (bundles, accessories)."@en ; + rdfs:domain :Service ; + rdfs:isDefinedBy : ; + rdfs:label "eligible for"@en ; + rdfs:range :Product . + +dct:modified a owl:AnnotationProperty ; + rdfs:isDefinedBy dct: . + +: a owl:Ontology ; + rdfs:comment "Example vocabulary modeled from a simple sentence about products and services."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Products - Vocab"@en ; + cc:license ; + dct:created "2018-08-29"^^xsd:date ; + dct:creator ecc:rpietzsch ; + dct:modified "2018-08-29"^^xsd:date ; + dct:publisher ecc:eccenca-GmbH ; + vann:preferredNamespacePrefix "pv" ; + vann:preferredNamespaceUri "http://ld.company.org/prod-vocab/" ; + void:vocabulary vann: , foaf: ; + owl:versionInfo "v0.0.1-22-gcb08ad0-dirty" . + +:hasManager a owl:ObjectProperty ; + rdfs:comment "The manager of the employee."@en ; + rdfs:domain :Employee ; + rdfs:isDefinedBy : ; + rdfs:label "has manager"@en ; + rdfs:range :Manager . + +vann:preferredNamespacePrefix + a owl:AnnotationProperty ; + rdfs:isDefinedBy vann: . + +:depth_mm a owl:DatatypeProperty ; + rdfs:comment "The depth of an item measured in millimeter."@en ; + rdfs:domain :Hardware ; + rdfs:isDefinedBy : ; + rdfs:label "depth (mm)"@en ; + rdfs:range xsd:decimal . + +dct:issued a owl:AnnotationProperty ; + rdfs:isDefinedBy dct: . + +:hasProductManager a owl:ObjectProperty ; + rdfs:comment "The employee acting as the product manager of the product."@en ; + rdfs:domain :Product ; + rdfs:isDefinedBy : ; + rdfs:label "has product manager"@en ; + rdfs:range :Employee . + +:ProductCategory a owl:Class ; + rdfs:comment "The category of a product."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Product Category"@en . + +:hasSupplier a owl:ObjectProperty ; + rdfs:comment "The supplier of a product."@en ; + rdfs:domain :Product ; + rdfs:isDefinedBy : ; + rdfs:label "supplier"@en ; + rdfs:range :Supplier . + +:width_mm a owl:DatatypeProperty ; + rdfs:comment "The width of an item measured in millimeter."@en ; + rdfs:domain :Hardware ; + rdfs:isDefinedBy : ; + rdfs:label "width (mm)"@en ; + rdfs:range xsd:decimal . + +ecc:eccenca-GmbH a dct:Agent , foaf:Organization ; + foaf:name "eccenca GmbH" . + +:Agent a owl:Class ; + rdfs:comment "Abstract base class for people, robots or other things that can act."@en ; + rdfs:isDefinedBy : ; + rdfs:label "Agent"@en . diff --git a/docs/getting-started/with-your-sandbox/overview-cmem.drawio.png b/docs/getting-started/with-your-sandbox/overview-cmem.drawio.png new file mode 100644 index 00000000..77e67161 Binary files /dev/null and b/docs/getting-started/with-your-sandbox/overview-cmem.drawio.png differ diff --git a/docs/getting-started/with-your-sandbox/overview-cmem.drawio.svg b/docs/getting-started/with-your-sandbox/overview-cmem.drawio.svg new file mode 100644 index 00000000..81d7735e --- /dev/null +++ b/docs/getting-started/with-your-sandbox/overview-cmem.drawio.svg @@ -0,0 +1,645 @@ + + + + + + + +
+
+
+ + Raw Data + +
+
+
+
+ + Raw Data + +
+
+ + + + +
+
+
+ + Knowledge Graph + +
+
+
+
+ + Knowledge Graph + +
+
+ + + + +
+
+
+
+
+
+
+
+
+
+ +
+
+ + + + +
+
+
+ Data Ingestion +
+
+
+
+ + Data Ingestion + +
+
+ + + + +
+
+
+ Mapping Editor +
+
+
+
+ + Mapping Editor + +
+
+ + + + +
+
+
+ File & DB connectors +
+
+
+
+ + File & DB connectors + +
+
+ + + + +
+
+
+ Linking Editor +
+
+
+
+ + Linking Editor + +
+
+ + + +
+
+
+
+ + Build + +
+
+
+
+
+ + Build + +
+
+ + + + +
+
+
+ Workspace Interface +
+
+
+
+ + Workspace Interface + +
+
+ + + + +
+
+
+ Dataset Management +
+
+
+
+ + Dataset Management + +
+
+ + + + +
+
+
+ Workflow Editor +
+
+
+
+ + Workflow Editor + +
+
+ + + + +
+
+
+
+
+
+
+
+
+
+ +
+
+ + + + +
+
+
+ OWL Visualization +
+
+
+
+
+ + OWL Visualization + +
+
+ + + +
+
+
+ Explore +
+
+
+
+ + Explore + +
+
+ + + + +
+
+
+ Taxonomy Management +
+
+
+
+
+ + Taxonomy Management + +
+
+ + + + +
+
+
+ Data Shape Editor +
+
+
+
+
+ + Data Shape Editor + +
+
+ + + + +
+
+
+ Vocabulary Catalog +
+
+
+
+
+ + Vocabulary Catalog + +
+
+ + + + +
+
+
+ Graph Exploration +
+
+
+
+
+ + Graph Exploration + +
+
+ + + + +
+
+
+ Query Catalog +
+
+
+
+
+ + Query Catalog + +
+
+ + + + +
+
+
+ Graph Visualization +
+
+
+
+ + Graph Visualization + +
+
+ + + +
+
+
+ + Data Shopping + +
+
+
+
+ + Data Shopping + +
+
+ + + + +
+
+
+ Data Files +
+
+
+
+ + Data Files + +
+
+ + + + + +
+
+
+ + Data-bases + +
+
+
+
+ + Data-bases + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Integrated Data + +
+
+
+
+ + Integrated Data + +
+
+ + + + +
+
+
+
+
+
+
+ Vocab- +
+
+ ularies +
+
+
+
+
+ + Vocab-... + +
+
+ + + + + + +
+
+
+
+
+
+
+
+
+
+ +
+
+ + + + +
+
+
+ JSON-LD Frame API +
+
+
+
+ + JSON-LD Frame API + +
+
+ + + + +
+
+
+ RDF Resource API (CBD) +
+
+
+
+ + RDF Resource API (CBD) + +
+
+ + + + +
+
+
+ Graph Store API +
+
+
+
+ + Graph Store API + +
+
+ + + +
+
+
+ Consume +
+
+
+
+ + Consume + +
+
+ + + + +
+
+
+ SPARQL Endpoint +
+
+
+
+ + SPARQL Endpoint + +
+
+ + + + +
+
+
+ Target File Types +
+
+
+
+ + Target File Types + +
+
+ + + + +
+
+
+ SQL Endpoint +
+
+
+
+ + SQL Endpoint + +
+
+ + + + +
+
+
+ Custom Endpoints (Template based) +
+
+
+
+ + Custom Endpoints (Template based) + +
+
+ + + + +
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/release-notes/.pages b/docs/release-notes/.pages index 97055b79..be5aa4f0 100644 --- a/docs/release-notes/.pages +++ b/docs/release-notes/.pages @@ -1,4 +1,6 @@ nav: + - Corporate Memory 23.2: corporate-memory-23-2 + - Corporate Memory 23.1.3: corporate-memory-23-1 - Corporate Memory 22.2.3: corporate-memory-22-2 - Corporate Memory 22.1: corporate-memory-22-1 - Corporate Memory 21.11: corporate-memory-21-11 @@ -10,4 +12,3 @@ nav: - Corporate Memory 20.06: corporate-memory-20-06 - Corporate Memory 20.03: corporate-memory-20-03 - Corporate Memory 19.10: corporate-memory-19-10 - diff --git a/docs/release-notes/corporate-memory-22-2/index.md b/docs/release-notes/corporate-memory-22-2/index.md index f21db525..42695240 100644 --- a/docs/release-notes/corporate-memory-22-2/index.md +++ b/docs/release-notes/corporate-memory-22-2/index.md @@ -1,5 +1,4 @@ --- -status: new tags: - ReleaseNote --- diff --git a/docs/release-notes/corporate-memory-23-1/23-1-easynav-edit.png b/docs/release-notes/corporate-memory-23-1/23-1-easynav-edit.png new file mode 100644 index 00000000..12935d4e Binary files /dev/null and b/docs/release-notes/corporate-memory-23-1/23-1-easynav-edit.png differ diff --git a/docs/release-notes/corporate-memory-23-1/23-1-global-variables.png b/docs/release-notes/corporate-memory-23-1/23-1-global-variables.png new file mode 100644 index 00000000..9a4e5f2e Binary files /dev/null and b/docs/release-notes/corporate-memory-23-1/23-1-global-variables.png differ diff --git a/docs/release-notes/corporate-memory-23-1/23-1-workspace-switch.png b/docs/release-notes/corporate-memory-23-1/23-1-workspace-switch.png new file mode 100644 index 00000000..7dd30463 Binary files /dev/null and b/docs/release-notes/corporate-memory-23-1/23-1-workspace-switch.png differ diff --git a/docs/release-notes/corporate-memory-23-1/index.md b/docs/release-notes/corporate-memory-23-1/index.md new file mode 100644 index 00000000..8eab0076 --- /dev/null +++ b/docs/release-notes/corporate-memory-23-1/index.md @@ -0,0 +1,344 @@ +--- +tags: + - ReleaseNote +--- +# Corporate Memory 23.1.3 + +Corporate Memory 23.1.3 is the second patch release in the 23.1 release line. + +![23.1: Explore - EasyNav Graph Editing](23-1-easynav-edit.png "23.1: Explore - EasyNav Graph Editing"){ class="bordered" } +![23.1: Build - Global Variables](23-1-global-variables.png "23.1: Build - Global Variables"){ class="bordered" } +![23.1: Explore - Workspace Selector](23-1-workspace-switch.png "23.1: Explore - Workspace Selector"){ class="bordered" } + +The highlights of this release are: + +- Build: + - Support for **global variables** in dataset and task parameters. + - Extensions to the Python Plugin API, including **autocompleted parameter** type and **password parameter** type. +- Explore: + - Workspaces are now **selectable at runtime**. + - Enhanced **editing capabilities** in the EasyNav editor. +- Automate: + - New **`admin user` command group** for managing user accounts in the Keycloak CMEM realm. + +!!! warning + + With this release of Corporate Memory the DataManager configuration has changed and needs to be adapted according to the [migration notes below](#eccenca-datamanager). + +This release delivers the following component versions: + +- eccenca DataPlatform v23.1.3 +- eccenca DataIntegration v23.1.2 +- eccenca DataIntegration Python Plugins v3.0.0 +- eccenca DataManager v23.1.5 +- eccenca Corporate Memory Control (cmemc) v23.1.3 + +More detailed release notes for these versions are listed below. + +## eccenca DataIntegration v23.1.2 + +We're excited to bring you the latest update to DataIntegration v23.1, featuring numerous enhancements, bug fixes, and deprecations. This release introduces global variables support, Python Plugin API extensions, improved handling of replaceable datasets, and much more. + +v23.1.2 of eccenca DataIntegration ships following fixes: + +- Saving a transform or linking rule with an operator that references a project resource fails. +- Cannot read large Excel files from S3. + +v23.1.1 of eccenca DataIntegration ships following fixes: + +- Fixed various vulnerabilities by upgrading affected libraries. +- Workflows using the "SPARQL Update query" operator fail with "Need non-empty resource manager" errors. +- use cmem-plugin-base 3.1.0 instead of RC1 +- remove some unused base image packages + +v23.1 of eccenca DataIntegration adds the following new features: + +- Support for global variables: + - Dataset and task parameters can be set to Jinja templates. + - Templates may access configured global variables. User-defined variables will be added later. + - Global variable resolution is supported by the 'Evaluate template' transform operator. + - Disabled by default. +- Extensions to the Python Plugin API: + - Autocompleted parameter types may declare dependent parameters. + - Password plugin parameter type. + - Custom parameter types can be registered + - For details, see changelog of the cmem-plugin-base module. +- REST endpoint to search for properties in the global vocabulary cache: + - GET /api/workspace/vocabularies/property/search + - Warn of invisible characters in input fields and offer action to remove them from the input string. +- Autocompletion of graph parameters. +- Auto-completion support to linking rule 'link type' parameter. +- Improve handling of replaceable datasets: + - Datasets that can be replaced/configured in a workflow at API request time can be set in the workflow editor. + - This allows for the execution of workflows with mock data, which has not been possible with 'Variable dataset' tasks. +- Allow to config datasets as read-only to prevent accidentally writing into them. +- New resource endpoints to replace the deprecated resource endpoints. See deprecation section for more details. +- Allow to force start activity. +- Rewritten linking evaluation view. + +v23.1 of eccenca DataIntegration introduces the following changes: + +- Check token expiration (> 5s left) before sending a request to prevent unnecessary request retries. +- 'Concatenate' and 'Concatenate multiple values' transformer: + - In 'glue' parameter value support `\t`, `\n` and `\\` as escaped characters. +- Indexing of levenshtein comparisons can be configured now. +- Rename 'Constant' comparison operator to 'Constant similarity value'. +- Neo4j improvements: + - Support for paths when reading entities (forward and backward operators). + - Using a relation at the end of a path will return the URI of the node. + - The `#id` special path will return the internal node id. +- CSV dataset auto-configuration now supports detecting more encodings for the Charset parameter. +- Changed search behavior in most places to search after typing stops instead of needing to hit the ENTER key: + - In the 'Create new item' dialog hitting the Enter key now has the same effect as clicking the 'Add' button. +- Show value type label primarily instead of ID. +- Show default URI pattern example in a object rule mapping form when the source path is non-empty. +- Response body of a failed REST operator request is also added to the workflow report in addition to being logged. +- Linking execution report has a warning message when the link limit was reduced because of the config of `linking.execution.linkLimit.max`. +- Disable streaming in 'Parse JSON' operator, so backward paths can be used against it. +- Improved online documentation of many rule operators: + - Distance measures: Added information if a measure is either boolean, normalized or unbounded. + - Distance measures: Clarified what happens with multiple values for single value measures. + - Transformers, Distance measures and Aggregators: Added examples + +v23.1 of eccenca DataIntegration ships following fixes: + +- Layout breaks on small screens on detail pages of the workspace. +- Mapping suggestion list is empty when there is no matching response even though source paths exist. +- Active Learning shows incorrect entity values. +- Add notes dialog keeps focus when workflow is executed and running. +- Race condition in project/task tag selection. +- Dataset auto-configure parameter changes not set for parameters that support auto-completion. +- Label and description of existing root/object rules cannot be changed. +- DI writes invalid XML, if the last segment of a URI starts with a number. +- Optimize peak endpoint if only one path is requested. +- Python Plugin Environment: package dependencies can not update the base requirements anymore. +- Spinner is being shown eternally when no comparison pairs have been found in the link learning. +- Value path auto-completion can suggest wrong paths if backward paths exist in the paths cache. +- Show spinner while transform examples are requested from the backend. +- Abort a not fully consumed S3 input stream instead of closing it which leads to warnings. +- Date parser fails when no input/output pattern is selected even though an alternative input/output pattern is given. +- Dependent parameter auto-completion using default values of other parameters. +- Support replaceable/variable datasets in nested workflows. +- Display info message when a parameter is disabled because it depends on other parameters to be set. +- 'Fix URI' operator trims the URI before fixing it and tries better to maintain the original URI with only the invalid characters encoded. +- Task completion message is shown without executing the transformation. +- Evaluation in mapping rule editor does not work when inside object mappings. +- Show error message when project import fails because of errors detected in the backend instead of closing the project import modal. +- Linking editor evaluation toolbar component issues. +- Levensthein indexing slow if combined conjunctively. +- Transform execution tab layout issues. + +v23.1 of eccenca DataIntegration introduced the following deprecations: + +- Resource endpoints: + - All resources endpoints that have the _file path_ (`workspace/projects/:project/resources/:name`) encoded in the URL path are now deprecated. The files endpoints using a _query parameter_ for the path should be used now. + +## eccenca DataIntegration Python Plugins v3.0.0 + +Corporate Memory v23.1 includes the DataIntegration Python Plugins support in version 3.0.0. + +v3.0.0 of eccenca DataIntegration Python Plugins adds the following new features: + +- Autocompleted parameter types may declare dependent parameters. For instance, a parameter `city` may declare that its completed values depend on another parameter 'country': + + ```py + class CityParameterType(StringParameterType): + autocompletion_depends_on_parameters: list[str] = ["country"] + def autocomplete(self, + query_terms: list[str], + depend_on_parameter_values: list[Any], + context: PluginContext) -> list[Autocompletion]: + # 'depend_on_parameter_values' contains the value of the country parameter + return ... + ``` + +- Password plugin parameter type. Passwords will be encrypted in the backend and not shown to users: + + ```py + @Plugin(label="My Plugin") + class MyTestPlugin(TransformPlugin): + def __init__(self, password: Password): + self.password = password + + # The decrypted password can be accessed using: + self.password.decrypt() + ``` + +- Custom parameter types can be registered. See implementation of `PasswordParameterType` for an example. + +## eccenca DataManager v23.1.5 + +We are excited to announce the latest update to DataManager v23.1, which introduces new features, improvements and bug fixes. This release brings enhancements to workspaces, editing capabilities in the EasyNav editor, and updates to the authentication system. + +v23.1.5 of eccenca DataManager ships following fixes: + +- Fixed download of query result in query editor. +- Setting the defaultGraph of a explore workspace configuration no longer prevents the Navigation box from loading. +- Fixes in the LinkRules modules: Result-Details, Rule-Deletions, Property-Search + +v23.1.4 of eccenca DataManager ships following changes: + +- Switch from iframe to redirect based login view. + - Known issues: Interactions after the timeout do not always trigger a reload and simply shows error messages or empty results. Using the navigation bar triggers a reload. + +v23.1.3 of eccenca DataManager ships following fixes: + +- use latest debian:bullseye-20230411-slim base image +- use wget instead of curl + +v23.1.2 of eccenca DataManager was a redacted build due to incomplete merge. + +v23.1.1 of eccenca DataManager ships following fixes: + +- Fixes link rules creation dialogue setting a target property. + +v23.1 of eccenca DataManager adds the following new features: + +- Workspaces are selectable at runtime. +- Routes can include a workspace selection. +- Added Editing capabilities to the EasyNav editor. + +v23.1 of eccenca DataManager introduces the following changes: + +- Configuration is now fully retrieved from DataPlatform, the included Spring Boot based backend is solely delivering the javascript frontend. +- The configuration can be changed at runtime using a frontend in the `/admin` Module. Changes are visible with the next full browser reload. +- Authentication is now based on the OAuth2 Code Flow. + +v23.1 of eccenca DataManager ships following fixes: + +- Removed session token from URL. + +## eccenca DataPlatform v23.1.3 + +We're excited to announce the latest update to DataPlatform v23.1, featuring significant improvements in caching, user rights management, and workspace configuration. This update also includes various bug fixes and the removal of deprecated properties. Here's an overview of the changes: + +v23.1.3 of eccenca DataPlatform ships following fixes: + +- Fix wrong calculation of write graph access under certain conditions. + +v23.1.2 of eccenca DataPlatform ships following changes: + +- DP/Infinispan: session timeout increased to 10h +- Login: switch from iframe to redirect based flow + +v23.1.1 of eccenca DataPlatform ships following fixes: + +- docker image: use latest debian:bullseye-20230411-slim base image +- docker image: wget instead of curl + +v23.1 of eccenca DataPlatform adds the following new features: + +- Added ability to use dynamic access conditions +- Added graph for infos about logged in users (iri, login): + - Can be (de)activated using property `authorization.userInfoGraph.active` (default: true) +- Workspace Selection and Configuration: + - Activate OAuth 2.0 client role permanently + - Redirect login page to (exactly) one configured resource provider + - REST endpoints for workspace configuration + +v23.1 of eccenca DataPlatform introduces the following changes: + +- Integrate infinispan as sole cache provider: + - Enables clustering of DataPlatform instances + - clustering can be activated by `spring.cache.infinispan.mode=CLUSTER` + - Removed property `files.maintenanceCron` (housekeeping done by infinispan) + - Added property `files.storageDirectory` for configuring shared directory between multiple DataPlatform instances + - Replaced property `proxy.cacheInvalidationCron` with `proxy.cacheExpiration` (no scheduled flush anymore but cache expiration as default) +- Changed logic of resolving user rights through access conditions - performance optimized + +v23.1 of eccenca DataPlatform ships following fixes: + +- Prevent injection of formulas in Excel/CSV exports +- Diagnostic store operations / query rewrite log on logging topic `com.eccenca.elds.backend.sparql.query.diagnostic` - must be set to TRACE: + - Activated update result statistics in existing query result logger +- Missing access condition action resource for EasyNav added + +v23.1 of eccenca DataPlatform removed the following features and configurations: + +- Deprecated properties under authorization.accessConditions + - `authorization.accessConditions.graph`: used graph is always the default graph from bootstrap + - `authorization.accessConditions.url`: url as source for access condition not supported anymore + +## eccenca Corporate Memory Control (cmemc) v23.1.3 + +We are excited to announce the latest updates to eccenca Corporate Memory Control v23.1, which brings new features and improvements. +This release introduces new command functionalities, configuration options, and a change in the project structure. + +v23.1.3 of eccenca Corporate Memory Control introduces the following security updates: + +- upgrade base image to python:3.11.4-slim-bullseye +- upgrade dependencies (esp. certifi) + +v23.1.2 of eccenca Corporate Memory Control introduces the following fixes: + +- broken installation due to `urllib3` dependency + - `urllib3>=2` was released 2023-04-26 but is broken with this error: `ImportError: cannot import name 'appengine' from 'urllib3.contrib'` + - cmemc requested any version and not `^1.26.15` of this library, which resulted in broken installations with pip beginning from 2023-04-26 + - quick fix to solve this without updating cmemc: `pip install urllib3==1.26.15` in the cmemc virtual env + +v23.1.1 of eccenca Corporate Memory Control introduces the following changes: + +- remove some unneeded packages from docker image +- switch to python 3.11.3 base image and tests + +v23.1 of eccenca Corporate Memory Control adds the following new features: + +- `admin status` command: + - option `--exit-1` to specify, when to return non-zero exit code + - currently set to `never`, this will be changed to `always` in the future +- `admin user` command group: + - `create` command - add a user account to the keycloak CMEM realm + - `delete` command - remove a user account from the keycloak CMEM realm + - `list` command - list user accounts in the keycloak CMEM realm + - `password` command - change the accounts password + - `update` command - change a user account in the keycloak CMEM realm +- optional `KEYCLOAK_BASE_URI` config environment +- optional `KEYCLOAK_REALM_ID` config environment + +v23.1 of eccenca Corporate Memory Control introduced the following deprecations: + +- `admin status` command `--exit-1` option default + - currently set to `never`, this will be changed to `always` in a future release + +## Migration Notes + +!!! warning + + We do not guarantee forward compatibility for configuration, data or projects. + I.e. importing a project created with DataIntegration v23.1 into DataIntegration v22.2 (or older) might not work. + + Backward compatibility will be ensured or migration paths explained. + I.e. projects created with DataIntegration v22.2 can be imported into DataIntegration v23.1. + +### eccenca DataIntegration + +- Resource endpoints: + - All resources endpoints that have the _file path_ (`workspace/projects/:project/resources/:name`) encoded in the URL path are now deprecated. + - Use corresponding endpoints starting with `workspace/projects/:project/files` instead, using a _query parameter_ for the file path. + +### eccenca DataIntegration Python Plugins + +The signature of the autocomplete function has been changed. +All autocomplete implementations need to be updated to the following signature: + +```py +def autocomplete(self, query_terms: list[str], depend_on_parameter_values: list[Any], context: PluginContext) -> list[Autocompletion] +``` + +Parameters using the old signature will continue to work for one release, but a warning will be printed in the log. + +The same applies to the label function that has been updated to the following signature: + +```py +def label(self, value: str, depend_on_parameter_values: list[Any], context: PluginContext) -> Optional[str] +``` + +### eccenca DataManager + +- A manual migration for the graph based configuration of the EasyNav configuration and the graph list configuration of the explore module is necessary. +- A manual migration for the `.yml` based DataManager configuration is necessary. +- The new web based configuration tool can be used to migrate, create and manage your DataManager (workspace) configuration + +### eccenca DataPlatform + +- Deprecated properties under `authorization.accessConditions` have been removed. The used graph is always the default graph from bootstrap, and URL as a source for access conditions is not supported anymore. diff --git a/docs/release-notes/corporate-memory-23-2/index.md b/docs/release-notes/corporate-memory-23-2/index.md new file mode 100644 index 00000000..b0aea701 --- /dev/null +++ b/docs/release-notes/corporate-memory-23-2/index.md @@ -0,0 +1,81 @@ +--- +status: new +tags: + - ReleaseNote +--- +# Corporate Memory 23.2 + +Corporate Memory 23.2 is the second major release in 2023. + +... images ... + +The highlights of this release are: + +- Build: + - Support for user managed **project variables** in dataset and task parameters. +- Explore: + - ... +- Automate: + - New **`admin client` command group** for managing client accounts in the Keycloak CMEM realm. + +This release delivers the following component versions: + +- eccenca DataPlatform v23.2 +- eccenca DataIntegration v23.2 +- eccenca DataIntegration Python Plugins v4.1.0 +- eccenca DataManager v23.2 +- eccenca Corporate Memory Control (cmemc) v23.2 + +More detailed release notes for these versions are listed below. + +## eccenca DataIntegration v23.2 + +... + +## eccenca DataIntegration Python Plugins v4.1.0 + +Corporate Memory v23.2 includes the DataIntegration Python Plugins support in version 4.1.0. + +v4.1.0 of eccenca DataIntegration Python Plugins adds the following new features: + +- use `post_resource` api in `write_to_dataset` function to update dataset file resource +- use cmempy 23.2 +- upgrade dependencies +- enforce usage of Python 3.11 + +## eccenca DataManager v23.2 + +... + +## eccenca DataPlatform v23.2 + +... + +## eccenca Corporate Memory Control (cmemc) v23.2 + +v23.2 of eccenca Corporate Memory Control adds the following new features: + +- `admin user password` command + - option `--request-change` added, to send a email to user to reset the password +- `dataset create` command + - add `readOnly` and `uriProperty` keys for the `-p/--parameter` option +- `admin client` command group + - `list` command - list client accounts + - `open` command - Open clients in the browser + - `secret` command - Get or generate a new secret for a client account +- `project create` command + - new option `--from-transformation` to create a mapping suggestion project + +### Changed + +- `dataset upload` command + - use new endpoint which is aware of read-only datasets +- `workflow io` command + - use of extended io endpoint + - allows for uploading bigger files + - allows for more input and output mimetypes + - change default output to JSON + +## Migration Notes + +... diff --git a/mkdocs.yml b/mkdocs.yml index 8ecac004..7c20f894 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -55,6 +55,7 @@ extra: AdvancedTutorial: advanced ExpertTutorial: expert Project: project + Keycloak: keycloak # https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/ version: provider: mike @@ -73,6 +74,7 @@ extra_javascript: # https://squidfunk.github.io/mkdocs-material/reference/data-tables/#sortable-tables - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js - assets/tablesort.js + - assets/extra.js # }}} # {{{ Theme configuration @@ -173,6 +175,7 @@ theme: advanced: material/list-status expert: material/list-status project: eccenca/artefact-project + keycloak: material/openid # https://squidfunk.github.io/mkdocs-material/reference/annotations/ admonition: note: fontawesome/solid/note-sticky diff --git a/overrides/.icons/eccenca/README.md b/overrides/.icons/eccenca/README.md index e3148391..d65dfd68 100644 --- a/overrides/.icons/eccenca/README.md +++ b/overrides/.icons/eccenca/README.md @@ -1,4 +1,3 @@ # eccenca icon set Based on [@eccenca/gui-elements](https://github.com/eccenca/gui-elements/), this directory holds all icons used in eccenca Corporate Memory. - diff --git a/overrides/.icons/eccenca/application-config.svg b/overrides/.icons/eccenca/application-config.svg new file mode 100644 index 00000000..1abd1c73 --- /dev/null +++ b/overrides/.icons/eccenca/application-config.svg @@ -0,0 +1 @@ + diff --git a/overrides/partials/header.html b/overrides/partials/header.html index b4b37351..6da137b0 100644 --- a/overrides/partials/header.html +++ b/overrides/partials/header.html @@ -151,7 +151,7 @@ diff --git a/poetry.lock b/poetry.lock index 88c5aadb..5928a862 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,100 +1,99 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.8.5" description = "Async http client/server framework (asyncio)" -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, ] [package.dependencies] @@ -113,7 +112,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +126,6 @@ frozenlist = ">=1.1.0" name = "async-timeout" version = "4.0.2" description = "Timeout context manager for asyncio programs" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -138,28 +135,26 @@ files = [ [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -172,14 +167,13 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "beautifulsoup4" -version = "4.12.0" +version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, - {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, ] [package.dependencies] @@ -193,7 +187,6 @@ lxml = ["lxml"] name = "bracex" version = "2.3.post1" description = "Bash style brace expander." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -203,13 +196,13 @@ files = [ [[package]] name = "cairocffi" -version = "1.5.0" +version = "1.6.1" description = "cffi-based cairo bindings for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cairocffi-1.5.0.tar.gz", hash = "sha256:d105b49009d9b4970a459e38ff030cb5dfc8c8ee231e867d28f77ee9df44495e"}, + {file = "cairocffi-1.6.1-py3-none-any.whl", hash = "sha256:aa78ee52b9069d7475eeac457389b6275aa92111895d78fbaa2202a52dac112e"}, + {file = "cairocffi-1.6.1.tar.gz", hash = "sha256:78e6bbe47357640c453d0be929fa49cd05cce2e1286f3d2a1ca9cbda7efdb8b7"}, ] [package.dependencies] @@ -218,13 +211,12 @@ cffi = ">=1.1.0" [package.extras] doc = ["sphinx", "sphinx_rtd_theme"] test = ["flake8", "isort", "numpy", "pikepdf", "pytest"] -xcb = ["xcffib (>=0.3.2)"] +xcb = ["xcffib (>=1.4.0)"] [[package]] name = "cairosvg" version = "2.7.0" description = "A Simple SVG Converter based on Cairo" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -245,21 +237,19 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -334,99 +324,97 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] [[package]] name = "click" -version = "8.1.3" +version = "8.1.6" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, ] [package.dependencies] @@ -436,7 +424,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -448,7 +435,6 @@ files = [ name = "cssselect" version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -460,7 +446,6 @@ files = [ name = "cssselect2" version = "0.7.0" description = "CSS selectors for Python ElementTree" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -480,7 +465,6 @@ test = ["flake8", "isort", "pytest"] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -490,93 +474,78 @@ files = [ [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, ] [[package]] name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "main" optional = false python-versions = "*" files = [ @@ -594,7 +563,6 @@ dev = ["flake8", "markdown", "twine", "wheel"] name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -607,14 +575,13 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.31" +version = "3.1.32" description = "GitPython is a Python library used to interact with Git repositories" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, - {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, + {file = "GitPython-3.1.32-py3-none-any.whl", hash = "sha256:e3d59b1c2c6ebb9dfa7a184daf3b6dd4914237e7488a1730a6d8f6f5d0b4187f"}, + {file = "GitPython-3.1.32.tar.gz", hash = "sha256:8d9b8cb1e80b9735e8717c9362079d3ce4c6e5ddeebedd0361b228c3a67a62f6"}, ] [package.dependencies] @@ -624,7 +591,6 @@ gitdb = ">=4.0.1,<5" name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -634,14 +600,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.1.0" +version = "6.8.0" description = "Read metadata from Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, - {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] @@ -650,13 +615,12 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -674,7 +638,6 @@ i18n = ["Babel (>=2.7)"] name = "linkcheckmd" version = "1.4.0" description = "Check links for Markdown-based site" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -691,102 +654,115 @@ tests = ["pytest"] [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] +source = ["Cython (>=0.29.35)"] [[package]] name = "markdown" version = "3.3.7" description = "Python implementation of Markdown." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -802,14 +778,13 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markdown2" -version = "2.4.8" +version = "2.4.10" description = "A fast and complete Python implementation of Markdown" -category = "main" optional = false python-versions = ">=3.5, <4" files = [ - {file = "markdown2-2.4.8-py2.py3-none-any.whl", hash = "sha256:7d49ca871d3e0e412c65d7d21fcbc13ae897f7876f3e5f14dd4db3b7fbf27f10"}, - {file = "markdown2-2.4.8.tar.gz", hash = "sha256:90475aca3d9c8e7df6d70c51de5bbbe9edf7fcf6a380bd1044d321500f5445da"}, + {file = "markdown2-2.4.10-py2.py3-none-any.whl", hash = "sha256:e6105800483783831f5dc54f827aa5b44eb137ecef5a70293d8ecfbb4109ecc6"}, + {file = "markdown2-2.4.10.tar.gz", hash = "sha256:cdba126d90dc3aef6f4070ac342f974d63f415678959329cc7909f96cc235d72"}, ] [package.extras] @@ -819,69 +794,67 @@ wavedrom = ["wavedrom"] [[package]] name = "markupsafe" -version = "2.1.2" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -893,7 +866,6 @@ files = [ name = "mike" version = "1.1.2" description = "Manage multiple versions of your MkDocs-powered documentation" -category = "main" optional = false python-versions = "*" files = [ @@ -915,7 +887,6 @@ test = ["coverage", "flake8 (>=3.0)", "shtab"] name = "mkdocs" version = "1.4.2" description = "Project documentation with Markdown." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -944,7 +915,6 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp name = "mkdocs-autolinks-plugin" version = "0.7.0" description = "An MkDocs plugin" -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -957,14 +927,13 @@ mkdocs = ">=1.2.3" [[package]] name = "mkdocs-awesome-pages-plugin" -version = "2.8.0" +version = "2.9.1" description = "An MkDocs plugin that simplifies configuring page titles and their order" -category = "main" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" files = [ - {file = "mkdocs-awesome-pages-plugin-2.8.0.tar.gz", hash = "sha256:af7e327e14b2eea3b2735c37428e33a528ecd2d9ae2296dc0f1632f0f3bc28f7"}, - {file = "mkdocs_awesome_pages_plugin-2.8.0-py3-none-any.whl", hash = "sha256:6b21ad4f41aecbe89e3a9a51f8837892cc7ce8ca0f9f4e0a355d56159ace3d68"}, + {file = "mkdocs_awesome_pages_plugin-2.9.1-py3-none-any.whl", hash = "sha256:be65e36444f5d991f87a90dae37de64e932562f99e362078724c27124834b90a"}, + {file = "mkdocs_awesome_pages_plugin-2.9.1.tar.gz", hash = "sha256:faf5241365f94c1f65ef3cad7ea9d6f0e7a436be7f06013c79c4045db0b2eafc"}, ] [package.dependencies] @@ -976,7 +945,6 @@ wcmatch = ">=7" name = "mkdocs-git-revision-date-localized-plugin" version = "1.2.0" description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -992,24 +960,19 @@ pytz = "*" [[package]] name = "mkdocs-glightbox" -version = "0.3.2" +version = "0.3.4" description = "MkDocs plugin supports image lightbox with GLightbox." -category = "main" optional = false python-versions = "*" files = [ - {file = "mkdocs-glightbox-0.3.2.tar.gz", hash = "sha256:aec32193fa367f83a5159a10ef0a0e501e595860f4399fb860ca1c5d95fd099d"}, - {file = "mkdocs_glightbox-0.3.2-py3-none-any.whl", hash = "sha256:ef168717e0d6f5e3b33afa8a62837e9ea3b8754fbf073760db169650edbcb866"}, + {file = "mkdocs-glightbox-0.3.4.tar.gz", hash = "sha256:96aaf98216f83c0d0fad2e42a8d805cfa6329d6ab25b54265012ccb2154010d8"}, + {file = "mkdocs_glightbox-0.3.4-py3-none-any.whl", hash = "sha256:8f894435b4f75231164e5d9fb023c01e922e6769e74a121e822c4914f310a41d"}, ] -[package.dependencies] -beautifulsoup4 = ">=4.11.1" - [[package]] name = "mkdocs-macros-plugin" version = "0.7.0" description = "Unleash the power of MkDocs with macros and variables" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1031,7 +994,6 @@ test = ["mkdocs-include-markdown-plugin", "mkdocs-macros-test", "mkdocs-material name = "mkdocs-material" version = "9.1.4+insiders.4.32.4" description = "Documentation that simply works" -category = "main" optional = false python-versions = ">=3.7" files = [] @@ -1063,7 +1025,6 @@ resolved_reference = "3eaad51615c380ba2333ffbb60d4206f99ae7afb" name = "mkdocs-material-extensions" version = "1.1.1" description = "Extension pack for Python Markdown and MkDocs Material." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1073,13 +1034,12 @@ files = [ [[package]] name = "mkdocs-redirects" -version = "1.2.0" +version = "1.2.1" description = "A MkDocs plugin for dynamic page redirects to prevent broken links." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "mkdocs-redirects-1.2.0.tar.gz", hash = "sha256:ddd38267d49fdfa19fb2f25b4aed2fb53f0496c818bf3018009c8eaf6676a327"}, + {file = "mkdocs-redirects-1.2.1.tar.gz", hash = "sha256:9420066d70e2a6bb357adf86e67023dcdca1857f97f07c7fe450f8f1fb42f861"}, ] [package.dependencies] @@ -1092,14 +1052,13 @@ test = ["autoflake", "black", "isort", "pytest"] [[package]] name = "mkdocs-swagger-ui-tag" -version = "0.6.1" +version = "0.6.3" description = "A MkDocs plugin supports for add Swagger UI in page." -category = "main" optional = false python-versions = "*" files = [ - {file = "mkdocs-swagger-ui-tag-0.6.1.tar.gz", hash = "sha256:141ac067d3213c63f0261557b25bb99af54827b80f0e208aff712e3c0aba44dc"}, - {file = "mkdocs_swagger_ui_tag-0.6.1-py3-none-any.whl", hash = "sha256:07584dfb09d0784edf6442bd151857803ebee86c5b84821f4a8f4a583905b964"}, + {file = "mkdocs-swagger-ui-tag-0.6.3.tar.gz", hash = "sha256:0a2ef6ebcdd9b14f6c83ddbe856998b8deece5434868183ce67d5c040f250449"}, + {file = "mkdocs_swagger_ui_tag-0.6.3-py3-none-any.whl", hash = "sha256:4d5aeb2e95325a375bcd745b2d05b5c985f12dcfd79b2230858e600688a628ef"}, ] [package.dependencies] @@ -1109,7 +1068,6 @@ beautifulsoup4 = ">=4.11.1" name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1191,14 +1149,13 @@ files = [ [[package]] name = "natsort" -version = "8.3.1" +version = "8.4.0" description = "Simple yet flexible natural sorting in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "natsort-8.3.1-py3-none-any.whl", hash = "sha256:d583bc9050dd10538de36297c960b93f873f0cd01671a3c50df5bd86dd391dcb"}, - {file = "natsort-8.3.1.tar.gz", hash = "sha256:517595492dde570a4fd6b6a76f644440c1ba51e2338c8a671d7f0475fda8f9fd"}, + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, ] [package.extras] @@ -1207,21 +1164,19 @@ icu = ["PyICU (>=1.0.0)"] [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] name = "paginate" version = "0.5.6" description = "Divides large result sets into pages for easier browsing" -category = "main" optional = false python-versions = "*" files = [ @@ -1230,102 +1185,102 @@ files = [ [[package]] name = "pillow" -version = "9.4.0" +version = "9.5.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "pipdeptree" -version = "2.7.0" +version = "2.12.0" description = "Command line utility to show dependency tree of packages." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pipdeptree-2.7.0-py3-none-any.whl", hash = "sha256:f1ed934abb3f5e561ae22118d93d45132d174b94a3664396a4a3f99494f79028"}, - {file = "pipdeptree-2.7.0.tar.gz", hash = "sha256:1c79e28267ddf90ea2293f982db4f5df7a76befca483c68da6c83c4370989e8d"}, + {file = "pipdeptree-2.12.0-py3-none-any.whl", hash = "sha256:9b1f82b2a7b9755e0f8d97bdc461161dcfaf20844fd9b34df55d1cffa933925c"}, + {file = "pipdeptree-2.12.0.tar.gz", hash = "sha256:d58b34eca0092d56cba92961cee6edebef2beba56c88dcc11e411c753c155b86"}, ] [package.extras] graphviz = ["graphviz (>=0.20.1)"] -test = ["covdefaults (>=2.3)", "diff-cover (>=7.5)", "pip (>=23.0.1)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "virtualenv (>=20.21,<21)"] +test = ["covdefaults (>=2.3)", "diff-cover (>=7.7)", "pip (>=23.2)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "virtualenv (>=20.24,<21)"] [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1335,14 +1290,13 @@ files = [ [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] @@ -1350,14 +1304,13 @@ plugins = ["importlib-metadata"] [[package]] name = "pymdown-extensions" -version = "9.10" +version = "10.1" description = "Extension pack for Python Markdown." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pymdown_extensions-9.10-py3-none-any.whl", hash = "sha256:31eaa76ce6f96aabfcea98787c2fff2c5c0611b20a53a94213970cfbf05f02b8"}, - {file = "pymdown_extensions-9.10.tar.gz", hash = "sha256:562c38eee4ce3f101ce631b804bfc2177a8a76c7e4dc908871fb6741a90257a7"}, + {file = "pymdown_extensions-10.1-py3-none-any.whl", hash = "sha256:ef25dbbae530e8f67575d222b75ff0649b1e841e22c2ae9a20bad9472c2207dc"}, + {file = "pymdown_extensions-10.1.tar.gz", hash = "sha256:508009b211373058debb8247e168de4cbcb91b1bff7b5e961b2c3e864e00b195"}, ] [package.dependencies] @@ -1368,7 +1321,6 @@ pyyaml = "*" name = "pyquery" version = "2.0.0" description = "A jquery-like library for python" -category = "main" optional = false python-versions = "*" files = [ @@ -1387,7 +1339,6 @@ test = ["pytest", "pytest-cov", "requests", "webob", "webtest"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1402,7 +1353,6 @@ six = ">=1.5" name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -1412,52 +1362,57 @@ files = [ [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1470,14 +1425,12 @@ pyyaml = "*" [[package]] name = "readtime" -version = "2.0.0" +version = "3.0.0" description = "Calculates the time some text takes the average human to read, based on Medium's read time forumula" -category = "main" optional = false python-versions = "*" files = [ - {file = "readtime-2.0.0-py3-none-any.whl", hash = "sha256:ddf221ed5b004c97ee350bc782dda1139ea6dfb817a404cdcc251ac33c11aa28"}, - {file = "readtime-2.0.0.tar.gz", hash = "sha256:0a67e29adfcfb25488b1edd6f08e158de5f832e84fe8e35cf83e639208ce0b97"}, + {file = "readtime-3.0.0.tar.gz", hash = "sha256:76c5a0d773ad49858c53b42ba3a942f62fbe20cc8c6f07875797ac7dc30963a9"}, ] [package.dependencies] @@ -1487,91 +1440,117 @@ pyquery = ">=1.2" [[package]] name = "regex" -version = "2023.3.23" +version = "2023.6.3" description = "Alternative regular expression module, to replace re." -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8"}, - {file = "regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0"}, - {file = "regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d"}, - {file = "regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98"}, - {file = "regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b"}, - {file = "regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d"}, - {file = "regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858"}, - {file = "regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53"}, - {file = "regex-2023.3.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6572ff287176c0fb96568adb292674b421fa762153ed074d94b1d939ed92c253"}, - {file = "regex-2023.3.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a610e0adfcb0fc84ea25f6ea685e39e74cbcd9245a72a9a7aab85ff755a5ed27"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086afe222d58b88b62847bdbd92079b4699350b4acab892f88a935db5707c790"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79e29fd62fa2f597a6754b247356bda14b866131a22444d67f907d6d341e10f3"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c07ce8e9eee878a48ebeb32ee661b49504b85e164b05bebf25420705709fdd31"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b036f401895e854de9fefe061518e78d506d8a919cc250dc3416bca03f6f9a"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78ac8dd8e18800bb1f97aad0d73f68916592dddf233b99d2b5cabc562088503a"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:539dd010dc35af935b32f248099e38447bbffc10b59c2b542bceead2bed5c325"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9bf4a5626f2a0ea006bf81e8963f498a57a47d58907eaa58f4b3e13be68759d8"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf86b4328c204c3f315074a61bc1c06f8a75a8e102359f18ce99fbcbbf1951f0"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2848bf76673c83314068241c8d5b7fa9ad9bed866c979875a0e84039349e8fa7"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c125a02d22c555e68f7433bac8449992fa1cead525399f14e47c2d98f2f0e467"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cd1671e9d5ac05ce6aa86874dd8dfa048824d1dbe73060851b310c6c1a201a96"}, - {file = "regex-2023.3.23-cp38-cp38-win32.whl", hash = "sha256:fffe57312a358be6ec6baeb43d253c36e5790e436b7bf5b7a38df360363e88e9"}, - {file = "regex-2023.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:dbb3f87e15d3dd76996d604af8678316ad2d7d20faa394e92d9394dfd621fd0c"}, - {file = "regex-2023.3.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c88e8c226473b5549fe9616980ea7ca09289246cfbdf469241edf4741a620004"}, - {file = "regex-2023.3.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6560776ec19c83f3645bbc5db64a7a5816c9d8fb7ed7201c5bcd269323d88072"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b1fc2632c01f42e06173d8dd9bb2e74ab9b0afa1d698058c867288d2c7a31f3"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdf7ad455f1916b8ea5cdbc482d379f6daf93f3867b4232d14699867a5a13af7"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fc33b27b1d800fc5b78d7f7d0f287e35079ecabe68e83d46930cf45690e1c8c"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c49552dc938e3588f63f8a78c86f3c9c75301e813bca0bef13bdb4b87ccf364"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e152461e9a0aedec7d37fc66ec0fa635eca984777d3d3c3e36f53bf3d3ceb16e"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db034255e72d2995cf581b14bb3fc9c00bdbe6822b49fcd4eef79e1d5f232618"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:55ae114da21b7a790b90255ea52d2aa3a0d121a646deb2d3c6a3194e722fc762"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ef3f528fe1cc3d139508fe1b22523745aa77b9d6cb5b0bf277f48788ee0b993f"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:a81c9ec59ca2303acd1ccd7b9ac409f1e478e40e96f8f79b943be476c5fdb8bb"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cde09c4fdd070772aa2596d97e942eb775a478b32459e042e1be71b739d08b77"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3cd9f5dd7b821f141d3a6ca0d5d9359b9221e4f051ca3139320adea9f1679691"}, - {file = "regex-2023.3.23-cp39-cp39-win32.whl", hash = "sha256:7304863f3a652dab5e68e6fb1725d05ebab36ec0390676d1736e0571ebb713ef"}, - {file = "regex-2023.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:54c3fa855a3f7438149de3211738dd9b5f0c733f48b54ae05aa7fce83d48d858"}, - {file = "regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7"}, + {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, + {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, + {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, + {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, + {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, + {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, + {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, + {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, + {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, + {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, + {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, + {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, + {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, + {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, + {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, + {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, + {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, ] [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -1581,7 +1560,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1593,7 +1571,6 @@ files = [ name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1603,26 +1580,24 @@ files = [ [[package]] name = "soupsieve" -version = "2.4" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, - {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] [[package]] name = "termcolor" -version = "2.2.0" +version = "2.3.0" description = "ANSI color formatting for output in terminal" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7"}, - {file = "termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a"}, + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, ] [package.extras] @@ -1632,7 +1607,6 @@ tests = ["pytest", "pytest-cov"] name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1649,26 +1623,25 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.4" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "verspec" version = "0.1.0" description = "Flexible version handling" -category = "main" optional = false python-versions = "*" files = [ @@ -1683,7 +1656,6 @@ test = ["coverage", "flake8 (>=3.7)", "mypy", "pretend", "pytest"] name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1723,7 +1695,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcmatch" version = "8.4.1" description = "Wildcard/glob file name matcher." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1738,7 +1709,6 @@ bracex = ">=2.1.1" name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" optional = false python-versions = "*" files = [ @@ -1748,86 +1718,85 @@ files = [ [[package]] name = "yarl" -version = "1.8.2" +version = "1.9.2" description = "Yet another URL library" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, - {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, - {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, - {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, - {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, - {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, - {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, - {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, - {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, - {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, - {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, - {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, - {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, ] [package.dependencies] @@ -1836,21 +1805,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "371c0e774784988166279b1b174b42cbad27d5f6301c31204c5163c7677891ab" +content-hash = "f20fdcceb8b06db839b54092c3e1130a89b57724893d3a10f3d96928cc406d6b" diff --git a/pyproject.toml b/pyproject.toml index d36990a6..5f52b72d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,9 @@ dec-tool = 'tools:cli' python = "^3.8" Pillow = "^9.4.0" CairoSVG = "^2.7.0" -mkdocs = "^1.4.2" +# Using exact requirement of mkdocs to resolve attribute error +# https://github.com/squidfunk/mkdocs-material/issues/5772 +mkdocs = "==1.4.2" mike = "^1.1.2" mkdocs-git-revision-date-localized-plugin = "^1.2.0" mkdocs-awesome-pages-plugin = "^2.8.0" @@ -28,7 +30,6 @@ mkdocs-redirects = "^1.2.0" mkdocs-swagger-ui-tag = "^0.6.1" mkdocs-material = {git = "git@github.com:eccenca/mkdocs-material-insiders.git", rev = "9.1.4-insiders-4.32.4"} - [tool.poetry.group.dev.dependencies] linkcheckmd = "^1.4.0"